diff -Nru xen-4.2.2/.gitignore xen-4.3.0/.gitignore --- xen-4.2.2/.gitignore 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/.gitignore 2013-07-09 10:46:56.000000000 +0000 @@ -2,6 +2,7 @@ *.orig *.rej *~ +*.swp *.o *.d *.opic @@ -13,7 +14,14 @@ *.tmp *.spot *.spit +*.gcno +*.gcda TAGS +GTAGS +GRTAGS +GPATH +GSYMS +tags cscope.files cscope.in.out cscope.out @@ -23,8 +31,17 @@ dist stubdom/*.tar.gz +autom4te.cache/ +config.log +config.status +config.cache +config/Toplevel.mk + build-* dist/* +docs/autom4te.cache/ +docs/config.log +docs/config.status docs/*.aux docs/*.dvi docs/*.log @@ -64,10 +81,7 @@ docs/xen-api/xenapi.pdf docs/xen-api/xenapi.ps docs/xen-api/xenapi.toc -extras/mini-os/arch/ia64/gen_off.s extras/mini-os/include/mini-os -extras/mini-os/include/ia64/mini-os -extras/mini-os/include/ia64/offsets.h extras/mini-os/include/x86/mini-os extras/mini-os/include/xen extras/mini-os/include/list.h @@ -91,7 +105,11 @@ pristine-* ref-* tmp-* +stubdom/autom4te.cache/ stubdom/binutils-* +stubdom/config.log +stubdom/config.status +stubdom/config.cache stubdom/cross-root-* stubdom/gcc-* stubdom/include @@ -107,16 +125,22 @@ stubdom/zlib-* stubdom/grub-* stubdom/ocaml-* +stubdom/polarssl-* +stubdom/gmp-* +stubdom/tpm_emulator-* stubdom/lwip/ stubdom/ioemu/ stubdom/stubdompath.sh +stubdom/vtpm/vtpm_manager.h tools/*/build/lib*/*.py -tools/autom4te.cache +tools/autom4te.cache/ tools/config.h tools/config.log tools/config.status tools/config.cache config/Tools.mk +config/Stubdom.mk +config/Docs.mk tools/blktap2/daemon/blktapctrl tools/blktap2/drivers/img2qcow tools/blktap2/drivers/lock-util @@ -152,7 +176,7 @@ tools/firmware/extboot/signrom tools/firmware/hvmloader/acpi/mk_dsdt tools/firmware/hvmloader/acpi/dsdt*.c -tools/firmware/hvmloader/acpi/dsdt*.asl +tools/firmware/hvmloader/acpi/dsdt_*.asl tools/firmware/hvmloader/acpi/ssdt_*.h tools/firmware/hvmloader/hvmloader tools/firmware/hvmloader/roms.h @@ -174,13 +198,6 @@ tools/include/xen/* tools/include/xen-foreign/*.(c|h|size) tools/include/xen-foreign/checker -tools/libxc/ia64/asm/*.h -tools/libxc/ia64/acpi/*.h -tools/libxc/ia64/acpi/platform/*.h -tools/libxc/ia64/dom_fw_asm.S -tools/libxc/ia64/dom_fw_common.c -tools/libxc/ia64/dom_fw_domu.c -tools/libxc/ia64/xen/*.h tools/libxen/libxenapi- tools/libxen/test/test_bindings tools/libxen/test/test_event_handling @@ -213,6 +230,7 @@ tools/misc/gtracestat tools/misc/xenlockprof tools/misc/lowmemd +tools/misc/xencov tools/pygrub/build/* tools/python/build/* tools/python/xen/util/path.py @@ -309,9 +327,6 @@ xen/include/headers.chk xen/include/asm xen/include/asm-*/asm-offsets.h -xen/include/asm-ia64/asm-xsi-offsets.h -xen/include/asm-ia64/.offsets.h.stamp -xen/include/asm-ia64/xen xen/include/compat/* xen/include/hypervisor-ifs/arch xen/include/linux @@ -322,13 +337,16 @@ xen/include/xen/compile.h xen/tools/figlet/figlet xen/tools/symbols +xen/xsm/flask/include/av_perm_to_string.h +xen/xsm/flask/include/av_permissions.h +xen/xsm/flask/include/class_to_string.h +xen/xsm/flask/include/flask.h +xen/xsm/flask/include/initial_sid_to_string.h +tools/flask/policy/policy.conf +tools/flask/policy/xenpolicy.24 xen/xen xen/xen-syms xen/xen.* -xen/arch/ia64/asm-offsets.s -xen/arch/ia64/asm-xsi-offsets.s -xen/arch/ia64/map.out -xen/arch/ia64/xen.lds.s unmodified_drivers/linux-2.6/.tmp_versions unmodified_drivers/linux-2.6/*.cmd unmodified_drivers/linux-2.6/*.ko @@ -348,10 +366,11 @@ tools/firmware/rombios/rombios.s tools/firmware/rombios/rombios.sym tools/include/xen-foreign/checker.c -tools/include/xen-foreign/ia64.h tools/include/xen-foreign/structs.pyc tools/include/xen-foreign/x86_32.h tools/include/xen-foreign/x86_64.h +tools/include/xen-foreign/arm32.h +tools/include/xen-foreign/arm64.h .git tools/misc/xen-hptool @@ -392,3 +411,4 @@ docs/txt/misc/*.txt docs/txt/man/*.txt +docs/figs/*.png diff -Nru xen-4.2.2/.hgignore xen-4.3.0/.hgignore --- xen-4.2.2/.hgignore 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/.hgignore 2013-07-09 10:46:56.000000000 +0000 @@ -11,12 +11,15 @@ .*\.tar\.bz2$ .*\.tar\.gz$ .*~$ +.*\.swp$ .*\.tmp$ .*\.flc$ .*\.orig$ .*\.rej$ .*\.spot$ .*\.spit$ +.*\.gcno$ +.*\.gcda$ .*/a\.out$ .*/Modules\.symvers$ .*/cscope\..*$ @@ -26,8 +29,17 @@ ^\.pc (^|/)(tags|TAGS)$ (^|/)(GTAGS|GPATH|GSYMS|GRTAGS)$ +^autom4te\.cache$ +^config\.log$ +^config\.status$ +^config\.cache$ +^config/Toplevel\.mk$ ^build-.*$ ^dist/.*$ +^docs/autom4te\.cache$ +^docs/config\.log$ +^docs/config\.status +^docs/config/Toplevel\.mk ^docs/.*\.aux$ ^docs/.*\.dvi$ ^docs/.*\.log$ @@ -45,6 +57,7 @@ ^docs/interface/interface\.css$ ^docs/interface/interface\.html$ ^docs/interface/labels\.pl$ +^docs/figs/.*\.png ^docs/man1/ ^docs/man5/ ^docs/pdf/.*$ @@ -64,11 +77,8 @@ ^docs/xen-api/vm_lifecycle.eps$ ^docs/xen-api/xenapi-datamodel-graph.eps$ ^docs/xen-api/xenapi.out$ -^extras/mini-os/arch/ia64/gen_off.s$ ^extras/mini-os/include/list\.h$ ^extras/mini-os/include/mini-os$ -^extras/mini-os/include/ia64/mini-os$ -^extras/mini-os/include/ia64/offsets.h$ ^extras/mini-os/include/x86/mini-os$ ^extras/mini-os/include/xen$ ^extras/mini-os/mini-os.*$ @@ -91,7 +101,11 @@ ^pristine-.*$ ^ref-.*$ ^tmp-.*$ +^stubdom/autom4te\.cache$ ^stubdom/binutils-.*$ +^stubdom/config\.log$ +^stubdom/config\.status$ +^stubdom/config\.cache$ ^stubdom/cross-root-.*$ ^stubdom/gcc-.*$ ^stubdom/include$ @@ -105,10 +119,14 @@ ^stubdom/pciutils-.*$ ^stubdom/zlib-.*$ ^stubdom/grub-.*$ +^stubdom/polarssl-.*$ +^stubdom/gmp-.*$ +^stubdom/tpm_emulator-.*$ ^stubdom/ocaml-.*$ ^stubdom/lwip/ ^stubdom/ioemu/ ^stubdom/stubdompath\.sh$ +^stubdom/vtpm/vtpm_manager\.h$ ^tools/.*/build/lib.*/.*\.py$ ^tools/blktap2/control/tap-ctl$ ^tools/blktap2/drivers/img2qcow$ @@ -168,13 +186,6 @@ ^tools/include/xen/.*$ ^tools/include/xen-foreign/.*\.(c|h|size)$ ^tools/include/xen-foreign/checker$ -^tools/libxc/ia64/asm/.*\.h$ -^tools/libxc/ia64/acpi/.*\.h$ -^tools/libxc/ia64/acpi/platform/.*\.h$ -^tools/libxc/ia64/dom_fw_asm.S$ -^tools/libxc/ia64/dom_fw_common\.c$ -^tools/libxc/ia64/dom_fw_domu\.c$ -^tools/libxc/ia64/xen/.*\.h$ ^tools/libxen/libxenapi- ^tools/libxen/test/test_bindings$ ^tools/libxen/test/test_event_handling$ @@ -214,6 +225,7 @@ ^tools/misc/gtraceview$ ^tools/misc/gtracestat$ ^tools/misc/xenlockprof$ +^tools/misc/xencov$ ^tools/pygrub/build/.*$ ^tools/python/build/.*$ ^tools/python/xen/util/path\.py$ @@ -320,6 +332,8 @@ ^tools/config\.status$ ^tools/config\.cache$ ^config/Tools\.mk$ +^config/Stubdom\.mk$ +^config/Docs\.mk$ ^xen/\.banner.*$ ^xen/BLOG$ ^xen/System.map$ @@ -338,9 +352,6 @@ ^xen/include/headers\.chk$ ^xen/include/asm$ ^xen/include/asm-.*/asm-offsets\.h$ -^xen/include/asm-ia64/asm-xsi-offsets\.h$ -^xen/include/asm-ia64/.offsets.h.stamp$ -^xen/include/asm-ia64/xen$ ^xen/include/compat/.*$ ^xen/include/hypervisor-ifs/arch$ ^xen/include/linux$ @@ -351,13 +362,14 @@ ^xen/include/xen/compile\.h$ ^xen/tools/figlet/figlet$ ^xen/tools/symbols$ +^xen/xsm/flask/include/av_perm_to_string\.h$ +^xen/xsm/flask/include/av_permissions\.h$ +^xen/xsm/flask/include/class_to_string\.h$ +^xen/xsm/flask/include/flask\.h$ +^xen/xsm/flask/include/initial_sid_to_string\.h$ ^xen/xen$ ^xen/xen-syms$ ^xen/xen\..*$ -^xen/arch/ia64/asm-offsets\.s$ -^xen/arch/ia64/asm-xsi-offsets\.s$ -^xen/arch/ia64/map\.out$ -^xen/arch/ia64/xen\.lds\.s$ ^unmodified_drivers/linux-2.6/\.tmp_versions ^unmodified_drivers/linux-2.6/.*\.cmd$ ^unmodified_drivers/linux-2.6/.*\.ko$ diff -Nru xen-4.2.2/.hgsigs xen-4.3.0/.hgsigs --- xen-4.2.2/.hgsigs 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/.hgsigs 2013-07-09 10:46:56.000000000 +0000 @@ -9,8 +9,3 @@ f4c47bcc01e13cb2e3b4b71fd588d86278875442 0 iQEcBAABAgAGBQJQIpupAAoJEIP+FMlX6CvZnBwH/3qlibrquTmD2p3rcdVi/JkWixaKK3KH4Ows/76sAJYCdx9YkmtkgC4zyz5aph4Rfy7dYnQIUhbwNNdZNBDd0XOVkjQm0ZX1wQjv3yA3Eq9NOUDmfFWldF+oosOG3h/+MLm/36CkB7gFku1ENQ8kagytXe4rN3QdOiJ9Rz84BAv6nJoT/1OX+m+MlBs948orC23aNEfWxrsrv2s92v5fJcAfSLW/AtER2JnASIxWECJ/TOkuHtrO2QPoBymSnifM2R624L+ySwRxSxo+Owfpooje5eekk0ekifvdYtaJ3pOfoOCv8yGEtb7mXv62WowVkasUZa/q+rGdVpHuK0UlBjI= d44f290e81df5f78f0e3545742e3c4ff5415b0a7 0 iQEcBAABAgAGBQJQNji7AAoJEIP+FMlX6CvZvBcIAJPiA6ydvolYCvZsfGgafqCpcpG3f+PbUOwQRWfUcaKHPWFKnwRkmx9MAP9tEjXFNZcbimktDrofmee6XfLb8NLnCcHWZT8trRXYTNw2lM6DpK+AROUpAcShF3gCHQEtCJC6+NArD75aUkUji3awbGlhplHbyWvgvSSULhga+2xfYszRC7eI/g+7/f4JNkvqeWllAtd9fwftXaGhQi2V4LT5IimpJI7PivlDi0wi+BtqXHcmZhlnw3zpR51NRujsMVTNZMqe733kGdt8Y8j3vvsfXBye4+YAkEKFrzW3jTYlA9ws71oNVvWmwmOjOHpx6ASfquP3hhAoiHvb2c6Wims= 68640a3c99cefa86ae70fc49871025864e5671f2 0 iQEcBAABAgAGBQJQSdgUAAoJEIP+FMlX6CvZeWUH/1SeYnKXtkt7n+WuMyF2LvCzZQApmOo+hqVB7m0Pe4Yh9bEq1PAE+sJOAoQIBklCpY3WFsNGQN8yIbYyWRzbIM7oavknwoUoSn50zMk12HczqHigXvhL/eOghRKNsK9BrQnRV+byNHRjzSHPReNxpzueKBOTrCMlXtYMDb94swc+hatEDItT4TwZcaNPri3kiWND0DPmOk58Ke96ml9rpomS1ff976hYAZl+N1Q3Pt998SXiaglZ9EeL0Y8cY759XqZII4D4o6/oQW8MzWrQZr4woHHU7MfK3OWslelzP486esHyyjotEWeelhgl/RjIl0crNBbmCWU15BOAw7wSZh4= -14164c5f22c88a9dc1cfd7178f84a7fab2b82aa8 0 iQEcBAABAgAGBQJQUcGjAAoJEIP+FMlX6CvZvX4H/1QV1VSW//dsv8IVCHPnHO4njlqYNUgIRycS4EuCJ8SrFLgfR77y3DwJg1D+JrYIT80QfzNeU3g/bcqz+0koD/P7joV4ONFkrB7pHSfACmMY7nfQ1Z2qHePAfBQ+cVdx6rXEYkFAbPjOz6kAP3LmpRLPasU46H+oG1zKHRgc0uhNN3Vit7eIhx/hDvY2YZDjuIWCQpmJylRlJsvMbpk2CjLiy4nXMNTKd1nlTNPTuRISsVBLx/ToquWtiO2a2EVRE4E+JhRGHNdFwXBRfV1XDDVNNRj+SvDvyWs29WKEOfVyGpgAKd29j/5YPzuHqmCcCfNxuN6lDHL6NxtwjZdDJao= -af176624c3ae86141a4ad8617b5ec2a834a6c626 0 iQEcBAABAgAGBQJQVt5zAAoJEIP+FMlX6CvZ2q4H/2eEMxgwzflIPj88Y/jE1z8dTJ8E2l2FTBziMlmFYkmsiqx+BlGz9kk610DQo4mJoHrRSZOcZX0/NNUuCZntRizEorBQUcBEOBJQgTLzaxatPR49W5N7gOgqwNuWplKV0Aor7X0qX+wFZ4kZdBuqOimV7Mw43L1LsskcuDmqi8Ipvbf+JjnRPXpeTlxBOD+52ZhAirxvpA+LZfLIIYV9lx3SB7z7okxlBS+rlyL+h9cuwthWO3545QPlwXcSBY9r9m9/5ZtAiID5935JDdZGd7Dt/ZmikVs9xE6QHrHmWZFDfqgGPOmYFmVhJxk1xwwUbor3qaiUjTwfjM+zAIqtNv4= -b6f071324f5ed076bfd28c71b51521cdd38639ab 0 iQEcBAABAgAGBQJQpLjpAAoJEIP+FMlX6CvZs2EIAM1HO25BnOPvo3fVjDErNnLo6miyentoLWJpXiDrJb+QRwuNVNGAQN0vlfd2iHcuvC9ipR1iFUizFcO1TI/wYoIOYOxs/r9Yk9cnBRThC7+yoBhCZY/LAbbd6SazEzI/86ZrMPbT4kfL8BD652UP1o9HCHgbFYDLzRMZTtep4+mA1OXCUWto4QjAJn+/SCQKI5kJXdLaj6JDS40kQoDXMlcTKu0NlftFT3zSA+U/SnOrRFwxW7uTxM09yyRLs/a/LbRcmYjeCnKUlvh8uapi5878Gxf5Bpo3XINKFsxC6p7nKF0wHzAqm63sB+o7C4fIvNY0nnWi5e7FDir+CO2yIKE= -bfa4df1dbe1dac55428437184f811d174d806755 0 iQEcBAABAgAGBQJQyFDqAAoJEIP+FMlX6CvZcUMIAMOChtmvuIBpWhuIJofsMp4C8TDQoI2idc3s6K1OvL5YgWrcaRoqLW4C4ItyEvx0xe19GUAoqdXUkj9tQ9fwT/p6dzLIGPRnACjKs8uTopiGulFdXu6b80IK3xwG3rAjC/yz7nU6ohQpWZJQCL1CyaIPr7MEYI905luiKC18WSc+hJADKGBdTIvLgKAD7GtQkAjPq8GrrGUtEE6rwawhl9R+jQLWkRf2ucbqgtDEzNCmSICkgjK2Sudc6h+mcKX7r0s3eEEiSh0SmhR+6K3mCYicaWCxn4A/La8CKabU3jdP/+EKjnk8x/6DFqXATf3ijr1kP/ZlHnbnxpPp7UwAhho= -25b021aa35ebdb08b53fd7acf36dfed184989933 0 iQEcBAABAgAGBQJQzzM9AAoJEIP+FMlX6CvZBNgH/iIXrpTnXRgSFMMQvlNZ2Ci7EirOdq6wmAFkNA9Fun/g2EgY2EUhtmcPPwVj273Q+I0XcaJX41Iost45ROQpaix46yAb+Oz+pEgMoqtPJmi1srdvBJJgkrsl7erbWdkcj1AmkvffBmhDG4IFvODgQTWo+lp1uASW+nPaJdmHx1sCJCiioOGkNaGRA5N9vLSuiRzuSZFePJP2BmrvjzC5A+bIyAfnCdD9izp1I5IIKB3I2/MfM+Hq2MR1XZwWJMExkQ63yuDTyP1TcpSIgqNzScu7XJbQVE1aUdPuO7GQjHn92UiSA9DEuhtfuizxafHhqr0cKfEeUF8KaMD9lV2uczw= diff -Nru xen-4.2.2/.hgtags xen-4.3.0/.hgtags --- xen-4.2.2/.hgtags 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/.hgtags 2013-07-09 10:46:56.000000000 +0000 @@ -57,8 +57,3 @@ d44f290e81df5f78f0e3545742e3c4ff5415b0a7 4.2.0-rc3 68640a3c99cefa86ae70fc49871025864e5671f2 4.2.0-rc4 528f0708b6db392e10303b7ed2ab529bb8b512b7 4.2.0-branched -14164c5f22c88a9dc1cfd7178f84a7fab2b82aa8 4.2.0-rc5 -af176624c3ae86141a4ad8617b5ec2a834a6c626 RELEASE-4.2.0 -b6f071324f5ed076bfd28c71b51521cdd38639ab 4.2.1-rc1 -bfa4df1dbe1dac55428437184f811d174d806755 4.2.1-rc2 -25b021aa35ebdb08b53fd7acf36dfed184989933 RELEASE-4.2.1 diff -Nru xen-4.2.2/CREDITS xen-4.3.0/CREDITS --- xen-4.2.2/CREDITS 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/CREDITS 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,16 @@ + This is at least a partial credits-file of people that have + contributed to the Xen project. It is sorted by name and + formatted to allow easy grepping and beautification by + scripts. The fields are: name (N), email (E), web-address + (W), PGP key ID and fingerprint (P), description (D), and + snail-mail address (S). + Thanks, + + Xen team +---------- + +N: Jeremy Fitzhardinge +E: jeremy@goop.org +W: http://www.goop.org/~jeremy +P: 1B40B6D0 +D: Linux pvops diff -Nru xen-4.2.2/Config.mk xen-4.3.0/Config.mk --- xen-4.2.2/Config.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/Config.mk 2013-07-09 10:46:56.000000000 +0000 @@ -13,8 +13,13 @@ debug ?= n debug_symbols ?= $(debug) +# Test coverage support +coverage ?= n + XEN_COMPILE_ARCH ?= $(shell uname -m | sed -e s/i.86/x86_32/ \ - -e s/i86pc/x86_32/ -e s/amd64/x86_64/ -e s/arm.*/arm/) + -e s/i86pc/x86_32/ -e s/amd64/x86_64/ \ + -e s/armv7.*/arm32/ -e s/armv8.*/arm64/) + XEN_TARGET_ARCH ?= $(XEN_COMPILE_ARCH) XEN_OS ?= $(shell uname -s) @@ -119,6 +124,10 @@ endif endef +# Require GCC v4.1+ +check-$(gcc) = $(call cc-ver-check,CC,0x040100,"Xen requires at least gcc-4.1") +$(eval $(check-y)) + define buildmakevars2shellvars export PREFIX="$(PREFIX)"; \ export XEN_SCRIPT_DIR="$(XEN_SCRIPT_DIR)"; \ @@ -188,25 +197,25 @@ # near the place in the Xen Makefiles where the file is used. ifeq ($(GIT_HTTP),y) -QEMU_REMOTE=http://xenbits.xen.org/git-http/qemu-xen-4.2-testing.git +QEMU_REMOTE=http://xenbits.xen.org/git-http/qemu-xen-4.3-testing.git else -QEMU_REMOTE=git://xenbits.xen.org/qemu-xen-4.2-testing.git +QEMU_REMOTE=git://xenbits.xen.org/qemu-xen-4.3-testing.git endif ifeq ($(GIT_HTTP),y) OVMF_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/ovmf.git -QEMU_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/qemu-upstream-4.2-testing.git +QEMU_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/qemu-upstream-4.3-testing.git SEABIOS_UPSTREAM_URL ?= http://xenbits.xen.org/git-http/seabios.git else OVMF_UPSTREAM_URL ?= git://xenbits.xen.org/ovmf.git -QEMU_UPSTREAM_URL ?= git://xenbits.xen.org/qemu-upstream-4.2-testing.git +QEMU_UPSTREAM_URL ?= git://xenbits.xen.org/qemu-upstream-4.3-testing.git SEABIOS_UPSTREAM_URL ?= git://xenbits.xen.org/seabios.git endif OVMF_UPSTREAM_REVISION ?= b0855f925c6e2e0b21fbb03fab4b5fb5b6876871 -QEMU_UPSTREAM_REVISION ?= qemu-xen-4.2.2 -SEABIOS_UPSTREAM_TAG ?= rel-1.6.3.2 -# Sun Mar 11 09:27:07 2012 -0400 -# Update version to 1.6.3.2 +QEMU_UPSTREAM_REVISION ?= qemu-xen-4.3.0 +SEABIOS_UPSTREAM_TAG ?= 3a28511b46f0c2af5fae1b6ed2b0c19d7913cee3 +# Wed Jun 26 16:30:45 2013 +0100 +# xen: Don't perform SMP setup. ETHERBOOT_NICS ?= rtl8139 8086100e @@ -215,9 +224,9 @@ # CONFIG_QEMU ?= `pwd`/$(XEN_ROOT)/../qemu-xen.git CONFIG_QEMU ?= $(QEMU_REMOTE) -QEMU_TAG ?= xen-4.2.2 -# Thu Jan 17 15:52:16 2013 +0000 -# e1000: fix compile warning introduced by security fix, and debugging +QEMU_TAG ?= xen-4.3.0 +# Mon Jun 17 17:39:51 2013 +0100 +# qemu-xen-traditional: disable docs # Short answer -- do not enable this unless you know what you are # doing and are prepared for some pain. diff -Nru xen-4.2.2/MAINTAINERS xen-4.3.0/MAINTAINERS --- xen-4.2.2/MAINTAINERS 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/MAINTAINERS 2013-07-09 10:46:56.000000000 +0000 @@ -49,14 +49,9 @@ Please see http://wiki.xen.org/wiki/Xen_Maintenance_Releases for more information. -Remember to copy the stable branch maintainer. The maintainer for this -branch is: - - Jan Beulich - -Tools backport requests should also be copied to: - - Ian Jackson +Remember to copy the appropriate stable branch maintainer who will be +listed in this section of the MAINTAINERS file in the appropriate +branch. Unstable Subsystem Maintainers ============================== @@ -102,25 +97,23 @@ ----------------------------------- -ACPI & POWER MANAGEMENT -M: Winston Wang -M: Gang Wei -M: Mark Langsdorf +ACPI M: Jan Beulich S: Supported F: xen/arch/x86/acpi/ F: xen/drivers/acpi/ -F: xen/drivers/cpufreq/ +F: xen/include/acpi/ AMD IOMMU -M: Wei Wang -S: Supported +M: Suravee Suthikulpanit +M: Jacob Shin +S: Maintained F: xen/drivers/passthrough/amd/ AMD SVM -M: Andre Przywara -M: Christoph Egger -M: Wei Huang +M: Boris Ostrovsky +M: Suravee Suthikulpanit +M: Jacob Shin S: Supported F: xen/arch/x86/hvm/svm/ @@ -139,7 +132,9 @@ F: xen/common/cpupool.c DEVICE TREE -M: David Vrabel +M: Ian Campbell +M: Stefano Stabellini +M: Tim Deegan S: Supported F: xen/common/libfdt/ F: xen/common/device_tree.c @@ -186,10 +181,19 @@ F: xen/arch/x86/mm/hap/p2m-ept.c F: xen/include/asm-x86/hvm/vmx/ +IOMMU VENDOR INDEPENDENT CODE +M: Xiantao Zhang +M: Jan Beulich +S: Supported +F: xen/drivers/passthrough/ +X: xen/drivers/passthrough/amd/ +X: xen/drivers/passthrough/vtd/ +F: xen/include/xen/iommu.h + LINUX (PV_OPS) -M: Jeremy Fitzhardinge +M: Konrad Rzeszutek Wilk S: Supported -T: git git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git +T: git git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git LINUX (XCP) M: Ian Campbell @@ -197,16 +201,32 @@ T: hg http://xenbits.xen.org/XCP/linux-2.6.*.pq.hg MACHINE CHECK (MCA) & RAS -M: Christoph Egger -M: Yunhong Jiang +M: Christoph Egger +M: Liu Jinsong S: Supported F: xen/arch/x86/cpu/mcheck/ MINI-OS M: Stefano Stabellini +M: Samuel Thibault S: Supported F: extras/mini-os/ +OCAML TOOLS +M: David Scott +S: Supported +F: tools/ocaml/ + +POWER MANAGEMENT +M: Jan Beulich +M: Liu Jinsong +S: Supported +F: xen/arch/x86/acpi/ +X: xen/arch/x86/acpi/boot.c +X: xen/arch/x86/acpi/lib.c +F: xen/drivers/cpufreq/ +F: xen/include/acpi/cpufreq/ + QEMU-DM M: Ian Jackson S: Supported @@ -238,6 +258,7 @@ STUB DOMAINS M: Stefano Stabellini +M: Samuel Thibault S: Supported F: stubdom/ @@ -249,7 +270,7 @@ F: tools/ TRANSCENDENT MEMORY (TMEM) -M: Dan Magenheimer +M: Konrad Rzeszutek Wilk W: http://oss.oracle.com/projects/tmem S: Supported F: xen/common/tmem* @@ -269,6 +290,15 @@ T: hg http://xenbits.xen.org/linux-2.6.18-xen.hg F: drivers/xen/usb*/ +VTPM +M: Daniel De Graaf +S: Supported +F: extras/mini-os/tpm* +F: extras/mini-os/include/tpm* +F: stubdom/vtpm/ +F: stubdom/vtpmmgr/ +F: docs/misc/vtpm.txt + X86 ARCHITECTURE M: Keir Fraser M: Jan Beulich @@ -288,6 +318,14 @@ F: tools/xentrace/ F: xen/common/trace.c +XSM/FLASK +M: Daniel De Graaf +S: Supported +F: tools/flask/ +F: xen/include/xsm/ +F: xen/xsm/ +F: docs/misc/xsm-flask.txt + THE REST M: Keir Fraser L: xen-devel@lists.xen.org diff -Nru xen-4.2.2/Makefile xen-4.3.0/Makefile --- xen-4.2.2/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -6,6 +6,11 @@ .PHONY: all all: dist +-include config/Toplevel.mk +SUBSYSTEMS?=xen kernels tools stubdom docs +TARGS_DIST=$(patsubst %, dist-%, $(SUBSYSTEMS)) +TARGS_INSTALL=$(patsubst %, install-%, $(SUBSYSTEMS)) + export XEN_ROOT=$(CURDIR) include Config.mk @@ -15,7 +20,7 @@ # build and install everything into the standard system directories .PHONY: install -install: install-xen install-kernels install-tools install-stubdom install-docs +install: $(TARGS_INSTALL) .PHONY: build build: kernels @@ -37,7 +42,7 @@ # build and install everything into local dist directory .PHONY: dist dist: DESTDIR=$(DISTDIR)/install -dist: dist-xen dist-kernels dist-tools dist-stubdom dist-docs dist-misc +dist: $(TARGS_DIST) dist-misc dist-misc: $(INSTALL_DIR) $(DISTDIR)/ @@ -132,9 +137,11 @@ $(MAKE) kdelete $(MAKE) dist -# Package a build in a .deb file -.PHONY: deb -deb: dist +# Package a build in a debball file, that is inside a .deb format +# container to allow for easy and clean removal. This is not intended +# to be a full featured policy compliant .deb package. +.PHONY: debball +debball: dist fakeroot sh ./tools/misc/mkdeb $(XEN_ROOT) $$($(MAKE) -C xen xenversion | grep -v :) # clean doesn't do a kclean @@ -151,6 +158,7 @@ # clean, but blow away kernel build tree plus tarballs .PHONY: distclean distclean: + rm -f config/Toplevel.mk $(MAKE) -C xen distclean $(MAKE) -C tools distclean $(MAKE) -C stubdom distclean @@ -161,6 +169,7 @@ rm -rf dist patches/tmp for i in $(ALLKERNELS) ; do $(MAKE) $$i-delete ; done rm -rf patches/*/.makedep + rm -rf config.log config.status config.cache autom4te.cache # Linux name for GNU distclean .PHONY: mrproper @@ -223,7 +232,6 @@ $(MAKE) -C xen uninstall rm -rf $(D)$(CONFIG_DIR)/init.d/xendomains $(D)$(CONFIG_DIR)/init.d/xend rm -rf $(D)$(CONFIG_DIR)/init.d/xencommons $(D)$(CONFIG_DIR)/init.d/xen-watchdog - rm -rf $(D)$(CONFIG_DIR)/hotplug/xen-backend.agent rm -f $(D)$(CONFIG_DIR)/udev/rules.d/xen-backend.rules rm -f $(D)$(CONFIG_DIR)/udev/rules.d/xend.rules rm -f $(D)$(SYSCONFIG_DIR)/xendomains diff -Nru xen-4.2.2/README xen-4.3.0/README --- xen-4.2.2/README 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/README 2013-07-09 10:46:56.000000000 +0000 @@ -1,9 +1,9 @@ ################################# - __ __ _ _ ____ - \ \/ /___ _ __ | || | |___ \ - \ // _ \ '_ \ | || |_ __) | - / \ __/ | | | |__ _| / __/ - /_/\_\___|_| |_| |_|(_)_____| +__ __ _ _ _____ +\ \/ /___ _ __ | || | |___ / + \ // _ \ '_ \ | || |_ |_ \ + / \ __/ | | | |__ _| ___) | +/_/\_\___|_| |_| |_|(_)____/ ################################# @@ -19,17 +19,19 @@ GPL. Since its initial public release, Xen has grown a large development community, spearheaded by xen.org (http://www.xen.org). -The 4.2 release offers excellent performance, hardware support and -enterprise-grade features such as x86_32-PAE, x86_64, SMP guests and -live relocation of VMs. Ports to Linux, NetBSD, FreeBSD and Solaris -are available from the community. +The 4.3 release offers a number of improvements, including NUMA +scheduling affinity, openvswitch integration, and defaulting to +qemu-xen rather than qemu-traditional for non-stubdom guests. +(qemu-xen is kept very close to the upstream project.) We also have a +number of updates to vTPM, and improvements to XSM and Flask to allow +greater disaggregation. Additionally, 4.3 contains a basic version of +Xen for the new ARM server architecture, both 32- and 64-bit. And as +always, there are a number of performance, stability, and security +improvements under-the hood. This file contains some quick-start instructions to install Xen on -your system. For full documentation, see the Xen User Manual. If this -is a pre-built release then you can find the manual at: - dist/install/usr/share/doc/xen/pdf/user.pdf -If you have a source release, then 'make -C docs' will build the -manual at docs/pdf/user.pdf. +your system. For more information see http:/www.xen.org/ and +http://wiki.xen.org/ Quick-Start Guide ================= @@ -38,7 +40,7 @@ release. Make sure you have all the following installed, either by visiting the project webpage or installing a pre-built package provided by your OS distributor: - * GCC v3.4 or later + * GCC v4.1 or later * GNU Make * GNU Binutils * Development install of zlib (e.g., zlib-dev) @@ -51,15 +53,15 @@ * Development install of libaio (e.g. libaio-dev) version 0.3.107 or greater. Set CONFIG_SYSTEM_LIBAIO in .config if this is not available. * Development install of GLib v2.0 (e.g. libglib2.0-dev) + * Development install of Pixman (e.g. libpixman-1-dev) * pkg-config * bridge-utils package (/sbin/brctl) * iproute package (/sbin/ip) - * hotplug or udev + * udev * GNU bison and GNU flex * GNU gettext * 16-bit x86 assembler, loader and compiler (dev86 rpm or bin86 & bcc debs) * ACPI ASL compiler (iasl) - * markdown In addition to the above there are a number of optional build prerequisites. Omitting these will cause the related features to be @@ -67,6 +69,8 @@ * Development install of Ocaml (e.g. ocaml-nox and ocaml-findlib). Required to build ocaml components which includes the alternative ocaml xenstored. + * cmake (if building vtpm stub domains) + * markdown Second, you need to acquire a suitable kernel for use in domain 0. If possible you should use a kernel provided by your OS distributor. If @@ -120,9 +124,9 @@ make install and make dist differ in that make install does the right things for your local machine (installing the appropriate - version of hotplug or udev scripts, for example), but make dist - includes all versions of those scripts, so that you can copy the dist - directory to another machine and install from that distribution. + version of udev scripts, for example), but make dist includes all + versions of those scripts, so that you can copy the dist directory + to another machine and install from that distribution. Python Runtime Libraries ======================== diff -Nru xen-4.2.2/autogen.sh xen-4.3.0/autogen.sh --- xen-4.2.2/autogen.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/autogen.sh 2013-07-09 10:46:56.000000000 +0000 @@ -1,4 +1,12 @@ #!/bin/sh -e -cd tools autoconf -autoheader +( cd tools + autoconf + autoheader +) +( cd stubdom + autoconf +) +( cd docs + autoconf +) diff -Nru xen-4.2.2/buildconfigs/mk.linux-2.6-common xen-4.3.0/buildconfigs/mk.linux-2.6-common --- xen-4.2.2/buildconfigs/mk.linux-2.6-common 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/buildconfigs/mk.linux-2.6-common 2013-07-09 10:46:56.000000000 +0000 @@ -29,7 +29,7 @@ .PHONY: _build _build: build -include buildconfigs/src.$(XEN_LINUX_SOURCE) +-include buildconfigs/src.$(XEN_LINUX_SOURCE) LINUX_ARCH = $$(sh buildconfigs/select-linux-arch $(LINUX_SRCDIR)) IMAGE_PATH = $$(sh buildconfigs/select-linux-image $(LINUX_DIR) $(LINUX_ARCH) $(IMAGE_TARGET)) diff -Nru xen-4.2.2/config/Docs.mk.in xen-4.3.0/config/Docs.mk.in --- xen-4.2.2/config/Docs.mk.in 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/config/Docs.mk.in 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,14 @@ +# Prefix and install folder +prefix := @prefix@ +PREFIX := $(prefix) +exec_prefix := @exec_prefix@ +libdir := @libdir@ +LIBDIR := $(libdir) + +# Tools +FIG2DEV := @FIG2DEV@ +POD2MAN := @POD2MAN@ +POD2HTML := @POD2HTML@ +POD2TEXT := @POD2TEXT@ +MARKDOWN := @MARKDOWN@ +PERL := @PERL@ diff -Nru xen-4.2.2/config/NetBSD.mk xen-4.3.0/config/NetBSD.mk --- xen-4.2.2/config/NetBSD.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/config/NetBSD.mk 2013-07-09 10:46:56.000000000 +0000 @@ -6,10 +6,6 @@ DLOPEN_LIBS = -ifeq ($(PREFIX),/usr) XEN_LOCK_DIR = /var/lib -else -XEN_LOCK_DIR = $(PREFIX)/var/lib -endif WGET = ftp diff -Nru xen-4.2.2/config/StdGNU.mk xen-4.3.0/config/StdGNU.mk --- xen-4.2.2/config/StdGNU.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/config/StdGNU.mk 2013-07-09 10:46:56.000000000 +0000 @@ -22,8 +22,6 @@ # Allow git to be wrappered in the environment GIT ?= git -WGET ?= wget -c - INSTALL = install INSTALL_DIR = $(INSTALL) -d -m0755 -p INSTALL_DATA = $(INSTALL) -m0644 -p @@ -43,17 +41,10 @@ PRIVATE_PREFIX = $(LIBDIR)/xen PRIVATE_BINDIR = $(PRIVATE_PREFIX)/bin -ifeq ($(PREFIX),/usr) CONFIG_DIR = /etc XEN_LOCK_DIR = /var/lock XEN_RUN_DIR = /var/run/xen XEN_PAGING_DIR = /var/lib/xen/xenpaging -else -CONFIG_DIR = $(PREFIX)/etc -XEN_LOCK_DIR = $(PREFIX)/var/lock -XEN_RUN_DIR = $(PREFIX)/var/run/xen -XEN_PAGING_DIR = $(PREFIX)/var/lib/xen/xenpaging -endif SYSCONFIG_DIR = $(CONFIG_DIR)/$(CONFIG_LEAF_DIR) diff -Nru xen-4.2.2/config/Stubdom.mk.in xen-4.3.0/config/Stubdom.mk.in --- xen-4.2.2/config/Stubdom.mk.in 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/config/Stubdom.mk.in 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,45 @@ +# Prefix and install folder +prefix := @prefix@ +PREFIX := $(prefix) +exec_prefix := @exec_prefix@ +libdir := @libdir@ +LIBDIR := $(libdir) + +# Path Programs +CMAKE := @CMAKE@ +FETCHER := @FETCHER@ + +# A debug build of stubdom? //FIXME: Someone make this do something +debug := @debug@ +vtpm = @vtpm@ + +STUBDOM_TARGETS := @STUBDOM_TARGETS@ +STUBDOM_BUILD := @STUBDOM_BUILD@ +STUBDOM_INSTALL := @STUBDOM_INSTALL@ + +ZLIB_VERSION := @ZLIB_VERSION@ +ZLIB_URL := @ZLIB_URL@ + +LIBPCI_VERSION := @LIBPCI_VERSION@ +LIBPCI_URL := @LIBPCI_URL@ + +NEWLIB_VERSION := @NEWLIB_VERSION@ +NEWLIB_URL := @NEWLIB_URL@ + +LWIP_VERSION := @LWIP_VERSION@ +LWIP_URL := @LWIP_URL@ + +GRUB_VERSION := @GRUB_VERSION@ +GRUB_URL := @GRUB_URL@ + +OCAML_VERSION := @OCAML_VERSION@ +OCAML_URL := @OCAML_URL@ + +GMP_VERSION := @GMP_VERSION@ +GMP_URL := @GMP_URL@ + +POLARSSL_VERSION := @POLARSSL_VERSION@ +POLARSSL_URL := @POLARSSL_URL@ + +TPMEMU_VERSION := @TPMEMU_VERSION@ +TPMEMU_URL := @TPMEMU_URL@ diff -Nru xen-4.2.2/config/Tools.mk.in xen-4.3.0/config/Tools.mk.in --- xen-4.2.2/config/Tools.mk.in 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/config/Tools.mk.in 2013-07-09 10:46:56.000000000 +0000 @@ -22,6 +22,7 @@ LD86 := @LD86@ BCC := @BCC@ IASL := @IASL@ +FETCHER := @FETCHER@ # Extra folder for libs/includes PREPEND_INCLUDES := @PREPEND_INCLUDES@ @@ -43,9 +44,9 @@ # Optional components XENSTAT_XENTOP := @monitors@ -VTPM_TOOLS := @vtpm@ LIBXENAPI_BINDINGS := @xenapi@ OCAML_TOOLS := @ocamltools@ +FLASK_POLICY := @xsmpolicy@ CONFIG_MINITERM := @miniterm@ CONFIG_LOMOUNT := @lomount@ CONFIG_OVMF := @ovmf@ @@ -59,3 +60,5 @@ CONFIG_GCRYPT := @libgcrypt@ EXTFS_LIBS := @EXTFS_LIBS@ CURSES_LIBS := @CURSES_LIBS@ + +FILE_OFFSET_BITS := @FILE_OFFSET_BITS@ diff -Nru xen-4.2.2/config/Toplevel.mk.in xen-4.3.0/config/Toplevel.mk.in --- xen-4.2.2/config/Toplevel.mk.in 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/config/Toplevel.mk.in 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1 @@ +SUBSYSTEMS := @SUBSYSTEMS@ diff -Nru xen-4.2.2/config/arm.mk xen-4.3.0/config/arm.mk --- xen-4.2.2/config/arm.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/config/arm.mk 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -CONFIG_ARM := y -CONFIG_ARM_32 := y -CONFIG_ARM_$(XEN_OS) := y - -# -march= -mcpu= - -# Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb: -CFLAGS += -marm - -HAS_PL011 := y - -# Use only if calling $(LD) directly. -#LDFLAGS_DIRECT_OpenBSD = _obsd -#LDFLAGS_DIRECT_FreeBSD = _fbsd -LDFLAGS_DIRECT_Linux = _linux -LDFLAGS_DIRECT += -marmelf$(LDFLAGS_DIRECT_$(XEN_OS))_eabi - -CONFIG_LOAD_ADDRESS ?= 0x80000000 diff -Nru xen-4.2.2/config/arm32.mk xen-4.3.0/config/arm32.mk --- xen-4.2.2/config/arm32.mk 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/config/arm32.mk 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,19 @@ +CONFIG_ARM := y +CONFIG_ARM_32 := y +CONFIG_ARM_$(XEN_OS) := y + +# -march= -mcpu= + +# Explicitly specifiy 32-bit ARM ISA since toolchain default can be -mthumb: +CFLAGS += -marm + +HAS_PL011 := y +HAS_EXYNOS4210 := y + +# Use only if calling $(LD) directly. +#LDFLAGS_DIRECT_OpenBSD = _obsd +#LDFLAGS_DIRECT_FreeBSD = _fbsd +LDFLAGS_DIRECT_Linux = _linux +LDFLAGS_DIRECT += -marmelf$(LDFLAGS_DIRECT_$(XEN_OS))_eabi + +CONFIG_LOAD_ADDRESS ?= 0x80000000 diff -Nru xen-4.2.2/config/arm64.mk xen-4.3.0/config/arm64.mk --- xen-4.2.2/config/arm64.mk 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/config/arm64.mk 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,12 @@ +CONFIG_ARM := y +CONFIG_ARM_64 := y +CONFIG_ARM_$(XEN_OS) := y + +CFLAGS += #-marm -march= -mcpu= etc + +HAS_PL011 := y + +# Use only if calling $(LD) directly. +LDFLAGS_DIRECT += -maarch64elf + +CONFIG_LOAD_ADDRESS ?= 0x80000000 diff -Nru xen-4.2.2/config.guess xen-4.3.0/config.guess --- xen-4.2.2/config.guess 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/config.guess 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,1502 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. + +timestamp='2009-12-30' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that 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., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff -Nru xen-4.2.2/config.sub xen-4.3.0/config.sub --- xen-4.2.2/config.sub 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/config.sub 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,1714 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. + +timestamp='2010-01-22' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that 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., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile-* | tilegx-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + # This must be matched before tile*. + tilegx*) + basic_machine=tilegx-unknown + os=-linux-gnu + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff -Nru xen-4.2.2/configure xen-4.3.0/configure --- xen-4.2.2/configure 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/configure 2013-07-09 10:46:56.000000000 +0000 @@ -1,2 +1,3367 @@ -#!/bin/sh -e -cd tools && ./configure $@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.67 for Xen Hypervisor 4.3. +# +# Report bugs to . +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: xen-devel@lists.xen.org about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='Xen Hypervisor' +PACKAGE_TARNAME='xen' +PACKAGE_VERSION='4.3' +PACKAGE_STRING='Xen Hypervisor 4.3' +PACKAGE_BUGREPORT='xen-devel@lists.xen.org' +PACKAGE_URL='http://www.xen.org/' + +ac_unique_file="./xen/common/kernel.c" +enable_option_checking=no +ac_subst_vars='LTLIBOBJS +LIBOBJS +SUBSYSTEMS +docs +stubdom +tools +kernels +xen +subdirs +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_xen +enable_kernels +enable_tools +enable_stubdom +enable_docs +' + ac_precious_vars='build_alias +host_alias +target_alias' +ac_subdirs_all='xen +kernels +tools +stubdom +docs' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures Xen Hypervisor 4.3 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/xen] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of Xen Hypervisor 4.3:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-xen Disable build and install of xen + --disable-kernels Disable build and install of kernels + --disable-tools Disable build and install of tools + --enable-stubdom Enable build and install of stubdom + --disable-docs Disable build and install of docs + +Report bugs to . +Xen Hypervisor home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +Xen Hypervisor configure 4.3 +generated by GNU Autoconf 2.67 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by Xen Hypervisor $as_me 4.3, which was +generated by GNU Autoconf 2.67. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5 ; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_config_files="$ac_config_files ./config/Toplevel.mk" + + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + + + + + + + + + + + + + + + + + + + + + + + + +case "$host_cpu" in + i[3456]86|x86_64) + arch_enable_stubdom=y + ;; + *) + arch_enable_stubdom=n + ;; +esac + + + + +# Check whether --enable-xen was given. +if test "${enable_xen+set}" = set; then : + enableval=$enable_xen; + +if test "x$enableval" = "xyes"; then : + + +xen=y +SUBSYSTEMS="$SUBSYSTEMS xen" + + +else + +if test "x$enableval" = "xno"; then : + + +xen=n + + +fi + +fi + + +else + + +xen=y +SUBSYSTEMS="$SUBSYSTEMS xen" + + +fi + + +if test -e "xen/configure"; then : + +if test "x$xen" = "xy" || test "x$xen" = "x" ; then + subdirs="$subdirs xen" + +fi + +fi + + + + +# Check whether --enable-kernels was given. +if test "${enable_kernels+set}" = set; then : + enableval=$enable_kernels; + +if test "x$enableval" = "xyes"; then : + + +kernels=y +SUBSYSTEMS="$SUBSYSTEMS kernels" + + +else + +if test "x$enableval" = "xno"; then : + + +kernels=n + + +fi + +fi + + +else + + +kernels=y +SUBSYSTEMS="$SUBSYSTEMS kernels" + + +fi + + +if test -e "kernels/configure"; then : + +if test "x$kernels" = "xy" || test "x$kernels" = "x" ; then + subdirs="$subdirs kernels" + +fi + +fi + + + + +# Check whether --enable-tools was given. +if test "${enable_tools+set}" = set; then : + enableval=$enable_tools; + +if test "x$enableval" = "xyes"; then : + + +tools=y +SUBSYSTEMS="$SUBSYSTEMS tools" + + +else + +if test "x$enableval" = "xno"; then : + + +tools=n + + +fi + +fi + + +else + + +tools=y +SUBSYSTEMS="$SUBSYSTEMS tools" + + +fi + + +if test -e "tools/configure"; then : + +if test "x$tools" = "xy" || test "x$tools" = "x" ; then + subdirs="$subdirs tools" + +fi + +fi + + + + +# Check whether --enable-stubdom was given. +if test "${enable_stubdom+set}" = set; then : + enableval=$enable_stubdom; + +if test "x$enableval" = "xyes"; then : + + +stubdom=y +SUBSYSTEMS="$SUBSYSTEMS stubdom" + + +else + +if test "x$enableval" = "xno"; then : + + +stubdom=n + + +fi + +fi + + +else + +if test "x$arch_enable_stubdom" = "xy"; then : + + +stubdom=y +SUBSYSTEMS="$SUBSYSTEMS stubdom" + + +else + + +stubdom=n + + +fi + +fi + + +if test -e "stubdom/configure"; then : + +if test "x$stubdom" = "xy" || test "x$stubdom" = "x" ; then + subdirs="$subdirs stubdom" + +fi + +fi + + + + +# Check whether --enable-docs was given. +if test "${enable_docs+set}" = set; then : + enableval=$enable_docs; + +if test "x$enableval" = "xyes"; then : + + +docs=y +SUBSYSTEMS="$SUBSYSTEMS docs" + + +else + +if test "x$enableval" = "xno"; then : + + +docs=n + + +fi + +fi + + +else + + +docs=y +SUBSYSTEMS="$SUBSYSTEMS docs" + + +fi + + +if test -e "docs/configure"; then : + +if test "x$docs" = "xy" || test "x$docs" = "x" ; then + subdirs="$subdirs docs" + +fi + +fi + + + + + + +echo "Will build the following subsystems:" +for x in $SUBSYSTEMS; do + echo " $x" +done + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by Xen Hypervisor $as_me 4.3, which was +generated by GNU Autoconf 2.67. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to . +Xen Hypervisor home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +Xen Hypervisor config.status 4.3 +configured by $0, generated by GNU Autoconf 2.67, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "./config/Toplevel.mk") CONFIG_FILES="$CONFIG_FILES ./config/Toplevel.mk" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi + +# +# CONFIG_SUBDIRS section. +# +if test "$no_recursion" != yes; then + + # Remove --cache-file, --srcdir, and --disable-option-checking arguments + # so they do not pile up. + ac_sub_configure_args= + ac_prev= + eval "set x $ac_configure_args" + shift + for ac_arg + do + if test -n "$ac_prev"; then + ac_prev= + continue + fi + case $ac_arg in + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ + | --c=*) + ;; + --config-cache | -C) + ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + ;; + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + ;; + --disable-option-checking) + ;; + *) + case $ac_arg in + *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_sub_configure_args " '$ac_arg'" ;; + esac + done + + # Always prepend --prefix to ensure using the same prefix + # in subdir configurations. + ac_arg="--prefix=$prefix" + case $ac_arg in + *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" + + # Pass --silent + if test "$silent" = yes; then + ac_sub_configure_args="--silent $ac_sub_configure_args" + fi + + # Always prepend --disable-option-checking to silence warnings, since + # different subdirs can have different --enable and --with options. + ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" + + ac_popdir=`pwd` + for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue + + # Do not complain, so a configure script can configure whichever + # parts of a large source tree are present. + test -d "$srcdir/$ac_dir" || continue + + ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" + $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 + $as_echo "$ac_msg" >&6 + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + cd "$ac_dir" + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f "$ac_srcdir/configure.gnu"; then + ac_sub_configure=$ac_srcdir/configure.gnu + elif test -f "$ac_srcdir/configure"; then + ac_sub_configure=$ac_srcdir/configure + elif test -f "$ac_srcdir/configure.in"; then + # This should be Cygnus configure. + ac_sub_configure=$ac_aux_dir/configure + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 +$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} + ac_sub_configure= + fi + + # The recursion is here. + if test -n "$ac_sub_configure"; then + # Make the cache file name correct relative to the subdirectory. + case $cache_file in + [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; + *) # Relative name. + ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 +$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} + # The eval makes quoting arguments work. + eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ + --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || + as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 + fi + + cd "$ac_popdir" + done +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff -Nru xen-4.2.2/configure.ac xen-4.3.0/configure.ac --- xen-4.2.2/configure.ac 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/configure.ac 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,33 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.67]) +AC_INIT([Xen Hypervisor], m4_esyscmd([./version.sh ./xen/Makefile]), + [xen-devel@lists.xen.org], [xen], [http://www.xen.org/]) +AC_CONFIG_SRCDIR([./xen/common/kernel.c]) +AC_CONFIG_FILES([./config/Toplevel.mk]) + +AC_CANONICAL_HOST + +m4_include([m4/features.m4]) +m4_include([m4/subsystem.m4]) + +dnl mini-os is only ported to certain platforms +case "$host_cpu" in + i[[3456]]86|x86_64) + arch_enable_stubdom=y + ;; + *) + arch_enable_stubdom=n + ;; +esac + +AX_SUBSYSTEM_DEFAULT_ENABLE([xen]) +AX_SUBSYSTEM_DEFAULT_ENABLE([kernels]) +AX_SUBSYSTEM_DEFAULT_ENABLE([tools]) +AX_SUBSYSTEM_CONDITIONAL([stubdom], $arch_enable_stubdom) +AX_SUBSYSTEM_DEFAULT_ENABLE([docs]) + +AX_SUBSYSTEM_FINISH + +AC_OUTPUT() diff -Nru xen-4.2.2/debian/arch/i386/defines xen-4.3.0/debian/arch/i386/defines --- xen-4.2.2/debian/arch/i386/defines 2010-02-24 14:13:50.000000000 +0000 +++ xen-4.3.0/debian/arch/i386/defines 2013-09-27 15:21:35.000000000 +0000 @@ -1,14 +1,3 @@ [base] flavours: - amd64 - i386 xen-arch: x86_32 - -[amd64_description] -hardware: AMD64 - -[amd64_base] -xen-arch: x86_64 - -[i386_description] -hardware: i386 diff -Nru xen-4.2.2/debian/changelog xen-4.3.0/debian/changelog --- xen-4.2.2/debian/changelog 2013-07-24 16:58:40.000000000 +0000 +++ xen-4.3.0/debian/changelog 2013-10-09 13:04:20.000000000 +0000 @@ -1,14 +1,151 @@ -xen (4.2.2-1ubuntu1~cloud1) precise-havana; urgency=low +xen (4.3.0-1ubuntu1~cloud2) precise-havana; urgency=low - * New upstream release for the Ubuntu Cloud Archive. + * Fix FTBFS for LDFLAGS subsitution. - -- Chuck Short Wed, 24 Jul 2013 12:58:13 -0400 + -- Chuck Short Wed, 09 Oct 2013 08:58:39 -0400 -xen (4.2.2-1ubuntu1~cloud0) precise-havana; urgency=low +xen (4.3.0-1ubuntu1~cloud1) precise-havana; urgency=low - * New upstream release for the Ubuntu Cloud Archive. + * Fixes FTBFS for xen-utils. - -- Chuck Short Tue, 23 Jul 2013 08:30:11 -0400 + -- Chuck Short Fri, 04 Oct 2013 12:02:05 -0400 + +xen (4.3.0-1ubuntu1~cloud0) precise-havana; urgency=low + + * New update for the Ubuntu Cloud Archive. + + -- Chuck Short Fri, 04 Oct 2013 11:20:15 -0400 + +xen (4.3.0-1ubuntu1) saucy; urgency=low + + * Merge from Debian unstable. Remaining changes: + - Add armhf to packages (except ocaml related) and create hypervisor + and system-meta package. Modify build environment to produce Arm + packages. + * debian/control + * debian/rules.gen + * debian/rules.real + * debian/patches/ubuntu-tools-armhf-without-ocaml.patch + Ocaml source fail to build on Arm. + - Re-introduce xen-hypervisor-amd64 for i386 builds. Otherwise i386 + would be rendered uninstallable. + * debian/arch/i386/defines + * debian/control + - Keep qemu-dm for now (upstream qemu would not support + migration, yet). Forward-port some patches from the old Debian + package which still included qemu-dm: + * debian/patches/qemu-prefix.diff + Modify LDFLAGS to point to lib dir for qemu-dm. + * debian/patches/qemu-disable-blktap.diff + Blktap never went upstream. + * debian/patches/ubuntu-qemu-disable-qemu-upstream.diff + We want to use the binary from qemu-system-x86. + * debian/patches/ubuntu-qemu-upstream-location.patch + Modify tools to look for qemu-system-i386 in public path. + - Fixup hvmloader build to find the correct PXE boot roms. + * ubuntu-tools-firmware-etherboot-kvm-ipxe.diff + - Add packaging dependency on libxenstore to libxen (otherwise + libtool fails to find references for libxenlight). + * debian/rules.real + - Add migration helper that removes private paths from xend domain + configs. + * debian/scripts/Makefile + * debian/scripts/xend-domain-config-path-strip + * debian/xen-utils-common.postinst + - Fix for using ulong instead of unsigned long in gdbsx. + * debian/patches/toolchain.diff + * First test for suitable toolstack in xendomains before using the list + command as that causes the xapi daemon to hang. + - debian/xen-utils-common.xendomains.init + + -- Stefan Bader Fri, 27 Sep 2013 15:12:17 +0200 + +xen (4.3.0-1) unstable; urgency=low + + * New upstream release. + - Fix HVM PCI passthrough. (closes: #706543) + * Call configure with proper arguments. + * Remove now empty xen-docs package. + * Disable external code retrieval. + * Drop all i386 hypervisor packages. + * Drop complete blktap support. + * Create /run/xen. + * Make xen-utils recommend qemu-system-x86. (closes: #688311) + - This version comes with audio support. (closes: #635166) + * Make libxenlight and libxlutil public. (closes: #644390) + - Set versioned ABI name. + - Install headers. + - Move libs into normal library path. + * Use build flags in the tools build. + - Fix fallout from harderning flags. + * Update Standards-Version to 3.9.4. No changes. + + -- Bastian Blank Thu, 05 Sep 2013 13:54:03 +0200 + +xen (4.3.0-0ubuntu4) saucy; urgency=low + + * Re-introduce xen-hypervisor-amd64 for i386 builds. Otherwise i386 + would be rendered uninstallable. + + -- Stefan Bader Thu, 19 Sep 2013 15:28:06 -0500 + +xen (4.3.0-0ubuntu3) saucy; urgency=low + + * Avoid building libxenlight with blktap support (at least for now). + - ubuntu-tools-force-build-without-blktap2.patch + - debian/rules.real: Do not install libblktapctl + - debian/libxen-dev.install: Do not package libblktapctl + + -- Stefan Bader Thu, 15 Aug 2013 10:07:46 +0200 + +xen (4.3.0-0ubuntu2) saucy; urgency=low + + * debian/rules.real: Avoid ocaml install and trying to strip hvmload + which does not exist on Arm. + * debian/rules.gen: Remove i386 related rules for arch-flavour which + would try to build the hypervisor (not supported anymore). + * debian/rules.gen: Add rules for armhf builds. + * debian/control: Add armhf to packages (except ocaml related) and + create hypervisor and system-meta package. + + -- Stefan Bader Sat, 03 Aug 2013 10:23:42 +0100 + +xen (4.3.0-0ubuntu1) saucy; urgency=low + + * debian/rules.real: Drop installing pdf for docs. Upstream dropped + the xen-abi documentation. + * debian/rules.real: Add --prefix=/usr to configure calls. + (Default prefix is now /usr/local) + * debian/rules -> debian/rules.real: Move modification of LDFLAGS as + the latter does the compile and since 4.2.2 includes default.mk + which would set the values back (either to the gcc version or + to nothing). + * debian/rules.real: Hack around checks for wget which the Debian build + does not allow to use. + * debian/control: Drop i386 versions of xen-hypervisor and xen-system. + Upstream dropped i386 support for those. + * debian/control: Add recommends for qemu-system-x86 to xen-utils-4.3. + Utils (xl stack) will use the generic qemu-system-i386 when being + told to use qemu-xen and qemu-dm for qemu-xen-traditional. + * xen-utils-common.xen.init: Create /var/run/xen if not present on + startup (this directory is used by libxl for qmp sockets). + * Add support to allow libvirt to build the libxl driver: + - tools/libxl: Create versioned variants of libxenlight.so and + libblktapctl.so + - debian/rules.real: Add packaging dependency on libxenstore to + libxen (otherwise libtool fails to find references). + - debian/libxen-dev.install: Package headers and library files + of libxenlight. + * Carried over from previous versions: + - Keep qemu-dm for now (upstream qemu would not support + migration, yet). Forward-port some patches from the old Debian + package which still included qemu-dm: + - qemu-prefix (modify LDFLAGS to point to lib dir for qemu-dm) + - qemu-disable-blktap (this is not present in upstream) + - ubuntu-qemu-disable-qemu-upstream (breaks build and also should + be provided by qemu/kvm package) + + -- Stefan Bader Tue, 25 Jun 2013 16:39:42 +0200 xen (4.2.2-1ubuntu1) saucy; urgency=low diff -Nru xen-4.2.2/debian/control xen-4.3.0/debian/control --- xen-4.2.2/debian/control 2013-07-24 16:56:18.000000000 +0000 +++ xen-4.3.0/debian/control 2013-10-04 16:01:47.000000000 +0000 @@ -4,43 +4,33 @@ Maintainer: Ubuntu Developers XSBC-Original-Maintainer: Debian Xen Team Uploaders: Guido Trotter , Bastian Blank -Standards-Version: 3.9.2 +Standards-Version: 3.9.4 Build-Depends: debhelper (>> 7), dpkg-dev (>= 1.16.0~), lsb-release, python-dev, bcc, gcc-multilib, e2fslibs-dev, iasl, ipxe-qemu, seabios, libaio-dev, libglib2.0-dev, libgnutls-dev, liblzma-dev, libncurses5-dev, libpci-dev, libyajl-dev, libssl-dev, pkg-config, uuid-dev, zlib1g-dev, ocaml-nox, dh-ocaml, ocaml-findlib -Build-Depends-Indep: graphviz, ghostscript, texlive-fonts-recommended, texlive-font-utils, texlive-latex-recommended XS-Python-Version: current -Package: xen-docs-4.2 -Architecture: all -Section: doc -Depends: ${misc:Depends} -Description: Documentation for Xen - This package contains all the large documentation files for Xen. This - includes a description interface (both the API, and a nice explanation of - how XEN works). - -Package: libxen-4.2 -Architecture: amd64 i386 +Package: libxen-4.3 +Architecture: amd64 i386 armhf Section: libs Depends: ${shlibs:Depends}, ${misc:Depends} Description: Public libs for Xen This package contains the shared libraries for Xen. Package: libxenstore3.0 -Architecture: amd64 i386 +Architecture: amd64 i386 armhf Section: libs Depends: ${shlibs:Depends}, ${misc:Depends} Description: Xenstore communications library for Xen This package contains the public libxenstore. Package: libxen-dev -Architecture: amd64 i386 +Architecture: amd64 i386 armhf Section: libdevel -Depends: libxen-4.2 (= ${binary:Version}), libxenstore3.0 (= ${binary:Version}), ${misc:Depends} +Depends: libxen-4.3 (= ${binary:Version}), libxenstore3.0 (= ${binary:Version}), ${misc:Depends} Description: Public headers and libs for Xen This package contains the public headers and static libraries for Xen. Package: xenstore-utils -Architecture: amd64 i386 +Architecture: amd64 i386 armhf Section: admin Depends: ${shlibs:Depends}, ${misc:Depends} Replaces: xen-utils-common (<= 3.1.0-1) @@ -73,23 +63,20 @@ The userspace tools to manage a system virtualized through the Xen virtual machine monitor. -Package: xen-utils-4.2 -Architecture: amd64 i386 +Package: xen-utils-4.3 +Architecture: amd64 i386 armhf Provides: xen-utils Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, xen-utils-common (>= ${source:Version}) -Recommends: bridge-utils, libc6-xen [i386], xen-hypervisor-4.2, qemu-keymaps, qemu-utils -Suggests: xen-docs-4.2 +Recommends: bridge-utils, libc6-xen [i386], xen-hypervisor-4.3, qemu-system-x86 Description: XEN administrative tools The userspace tools to manage a system virtualized through the XEN virtual machine monitor. -#Built-Using: ${misc:Built-Using} -Package: xen-hypervisor-4.2-amd64 +Package: xen-hypervisor-4.3-amd64 Architecture: amd64 i386 -Provides: xen-hypervisor, xen-hypervisor-4.2, xen-hypervisor-amd64 +Provides: xen-hypervisor, xen-hypervisor-4.3, xen-hypervisor-amd64 Depends: ${misc:Depends} -Recommends: xen-utils-4.2 -Suggests: xen-docs-4.2 +Recommends: xen-utils-4.3 Description: Xen Hypervisor on AMD64 The hypervisor is the "core" for XEN itself. It gets booted by the boot loader and controls cpu and memory, sharing them between your @@ -102,18 +89,17 @@ Package: xen-system-amd64 Architecture: amd64 i386 Provides: xen-system -Depends: xen-hypervisor-4.2-amd64, xen-utils-4.2, ${misc:Depends} +Depends: xen-hypervisor-4.3-amd64, xen-utils-4.3, ${misc:Depends} Description: Xen System on AMD64 (meta-package) This package depends on the latest Xen hypervisor for use on AMD64 and the Xen utils. -Package: xen-hypervisor-4.2-i386 -Architecture: i386 -Provides: xen-hypervisor, xen-hypervisor-4.2, xen-hypervisor-i386 +Package: xen-hypervisor-4.3-armhf +Architecture: armhf +Provides: xen-hypervisor, xen-hypervisor-4.3, xen-hypervisor-armhf Depends: ${misc:Depends} -Recommends: xen-utils-4.2 -Suggests: xen-docs-4.2 -Description: Xen Hypervisor on i386 +Recommends: xen-utils-4.3 +Description: Xen Hypervisor on Arm v7/v8 The hypervisor is the "core" for XEN itself. It gets booted by the boot loader and controls cpu and memory, sharing them between your administrative domain (Domain 0) and the virtual guest systems. @@ -122,11 +108,10 @@ kernel specifically crafted to work as the Domain 0, mediating hardware access for XEN itself. -Package: xen-system-i386 -Architecture: i386 +Package: xen-system-armhf +Architecture: armhf Provides: xen-system -Depends: xen-hypervisor-4.2-i386, xen-utils-4.2, ${misc:Depends} -Description: Xen System on i386 (meta-package) - This package depends on the latest Xen hypervisor for use on i386 and the +Depends: xen-hypervisor-4.3-armhf, xen-utils-4.3, ${misc:Depends} +Description: Xen System on Arm v7/v8 (meta-package) + This package depends on the latest Xen hypervisor for use on armhf and the Xen utils. - diff -Nru xen-4.2.2/debian/control.md5sum xen-4.3.0/debian/control.md5sum --- xen-4.2.2/debian/control.md5sum 2013-07-10 22:33:17.000000000 +0000 +++ xen-4.3.0/debian/control.md5sum 2013-09-27 15:21:53.000000000 +0000 @@ -1,10 +1,10 @@ -5c6113ae5c9f098e6d3afb6f17580ef6 debian/changelog +ac0eaaff8a41be34286540b920471a29 debian/changelog c379f09bde66561f34d361dd9f89e345 debian/bin/gencontrol.py -667edd28bcda9cd243bb69c78e452aad debian/templates/control.hypervisor.in -4106f2621fc4dad25c0d6569b51cbce3 debian/templates/control.main.in -11147464711eedca0cd3908109a4a3f4 debian/templates/control.source.in +a4fad0ec66d977759a362165bf8aa31d debian/templates/control.hypervisor.in +e9166b8a1e6e9ac9e2fba6050a59fbdb debian/templates/control.main.in +d9d85cc5f2ddd8c23cc860bb4b1b3fe5 debian/templates/control.source.in fe9f3e8a9c9b716f7b4c5b7d7aec3128 debian/templates/control.system.latest.in -d8a4fc67d96fd893d002d956dcf8c220 debian/templates/control.utils.in +7f13b99c446eb6cf64d21a2de26b9460 debian/templates/control.utils.in a15fa64ce6deead28d33c1581b14dba7 debian/templates/xen-hypervisor.postinst.in 22492e0565a4754b5e008ca7cac871da debian/templates/xen-hypervisor.postrm.in dcabf82578122540e0534f72750698d5 debian/templates/xen-utils.lintian-overrides.in @@ -12,4 +12,4 @@ b6acd21c3924e6ec6f9c547afbbc7d9e debian/templates/xen-utils.prerm.in 2f0cc6973a228e4002e5b89f756e3d58 debian/arch/defines 7eec83f6c765a660ebaeb80dc4b433ad debian/arch/amd64/defines -5441af74c3b47034f0efb0226b9c3723 debian/arch/i386/defines +ea4d950fe2490d8a019d069852c8ffd3 debian/arch/i386/defines diff -Nru xen-4.2.2/debian/libxen-dev.install xen-4.3.0/debian/libxen-dev.install --- xen-4.2.2/debian/libxen-dev.install 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/libxen-dev.install 2013-07-30 15:50:25.000000000 +0000 @@ -2,8 +2,14 @@ usr/lib/libxenctrl.so usr/lib/libxenguest.a usr/lib/libxenguest.so +usr/lib/libxenlight.a +usr/lib/libxenlight.so usr/lib/libxenstore.a usr/lib/libxenstore.so +usr/lib/libxlutil.a +usr/lib/libxlutil.so +usr/include/_libxl*.h +usr/include/libxl*.h usr/include/xenctrl.h usr/include/xenguest.h usr/include/xenstore*.h diff -Nru xen-4.2.2/debian/patches/0001-xen-enable-APIC-Register-Virtualization.patch xen-4.3.0/debian/patches/0001-xen-enable-APIC-Register-Virtualization.patch --- xen-4.2.2/debian/patches/0001-xen-enable-APIC-Register-Virtualization.patch 2013-07-17 07:13:08.000000000 +0000 +++ xen-4.3.0/debian/patches/0001-xen-enable-APIC-Register-Virtualization.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,147 +0,0 @@ -From f62b02e177cd03da2b8397b9bdf1a53b541df3f3 Mon Sep 17 00:00:00 2001 -From: Jiongxi Li -Date: Mon, 17 Sep 2012 21:04:08 +0100 -Subject: [PATCH 1/3] xen: enable APIC-Register Virtualization - -Add APIC register virtualization support - - APIC read doesn't cause VM-Exit - - APIC write becomes trap-like - -Signed-off-by: Gang Wei -Signed-off-by: Yang Zhang -Signed-off-by: Jiongxi Li -Signed-off-by: Stefan Bader ---- - xen/arch/x86/hvm/vlapic.c | 8 ++++++++ - xen/arch/x86/hvm/vmx/vmcs.c | 9 +++++++++ - xen/arch/x86/hvm/vmx/vmx.c | 15 +++++++++++++++ - xen/include/asm-x86/hvm/vlapic.h | 2 ++ - xen/include/asm-x86/hvm/vmx/vmcs.h | 3 +++ - xen/include/asm-x86/hvm/vmx/vmx.h | 1 + - 6 files changed, 38 insertions(+) - -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vlapic.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vlapic.c 2013-03-12 16:20:11.315514782 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vlapic.c 2013-03-12 16:21:29.995899436 +0100 -@@ -823,6 +823,14 @@ static int vlapic_write(struct vcpu *v, - return rc; - } - -+int vlapic_apicv_write(struct vcpu *v, unsigned int offset) -+{ -+ uint32_t val = vlapic_get_reg(vcpu_vlapic(v), offset); -+ -+ vlapic_reg_write(v, offset, val); -+ return 0; -+} -+ - int hvm_x2apic_msr_write(struct vcpu *v, unsigned int msr, uint64_t msr_content) - { - struct vlapic *vlapic = vcpu_vlapic(v); -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmcs.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vmx/vmcs.c 2013-03-12 16:20:13.571525803 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmcs.c 2013-03-12 16:21:29.999899449 +0100 -@@ -89,6 +89,7 @@ static void __init vmx_display_features( - P(cpu_has_vmx_vnmi, "Virtual NMI"); - P(cpu_has_vmx_msr_bitmap, "MSR direct-access bitmap"); - P(cpu_has_vmx_unrestricted_guest, "Unrestricted Guest"); -+ P(cpu_has_vmx_apic_reg_virt, "APIC Register Virtualization"); - #undef P - - if ( !printed ) -@@ -186,6 +187,14 @@ static int vmx_init_vmcs_config(void) - if ( opt_unrestricted_guest_enabled ) - opt |= SECONDARY_EXEC_UNRESTRICTED_GUEST; - -+ /* -+ * "APIC Register Virtualization" -+ * can be set only when "use TPR shadow" is set -+ */ -+ if ( _vmx_cpu_based_exec_control & CPU_BASED_TPR_SHADOW ) -+ opt |= SECONDARY_EXEC_APIC_REGISTER_VIRT; -+ -+ - _vmx_secondary_exec_control = adjust_vmx_controls( - "Secondary Exec Control", min, opt, - MSR_IA32_VMX_PROCBASED_CTLS2, &mismatch); -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmx.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vmx/vmx.c 2013-03-12 16:20:13.595525927 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmx.c 2013-03-12 16:21:30.003899465 +0100 -@@ -2274,6 +2274,16 @@ static void vmx_idtv_reinject(unsigned l - } - } - -+static int vmx_handle_apic_write(void) -+{ -+ unsigned long exit_qualification = __vmread(EXIT_QUALIFICATION); -+ unsigned int offset = exit_qualification & 0xfff; -+ -+ ASSERT(cpu_has_vmx_apic_reg_virt); -+ -+ return vlapic_apicv_write(current, offset); -+} -+ - void vmx_vmexit_handler(struct cpu_user_regs *regs) - { - unsigned int exit_reason, idtv_info, intr_info = 0, vector = 0; -@@ -2729,6 +2739,11 @@ void vmx_vmexit_handler(struct cpu_user_ - break; - } - -+ case EXIT_REASON_APIC_WRITE: -+ if ( vmx_handle_apic_write() ) -+ hvm_inject_hw_exception(TRAP_gp_fault, 0); -+ break; -+ - case EXIT_REASON_ACCESS_GDTR_OR_IDTR: - case EXIT_REASON_ACCESS_LDTR_OR_TR: - case EXIT_REASON_VMX_PREEMPTION_TIMER_EXPIRED: -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/vlapic.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/vlapic.h 2013-03-12 16:20:11.203514229 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/vlapic.h 2013-03-12 16:21:30.003899465 +0100 -@@ -103,6 +103,8 @@ void vlapic_EOI_set(struct vlapic *vlapi - - int vlapic_ipi(struct vlapic *vlapic, uint32_t icr_low, uint32_t icr_high); - -+int vlapic_apicv_write(struct vcpu *v, unsigned int offset); -+ - struct vlapic *vlapic_lowest_prio( - struct domain *d, struct vlapic *source, - int short_hand, uint8_t dest, uint8_t dest_mode); -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmcs.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/vmx/vmcs.h 2013-03-12 16:20:13.559525759 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmcs.h 2013-03-12 16:21:30.003899465 +0100 -@@ -182,6 +182,7 @@ extern u32 vmx_vmentry_control; - #define SECONDARY_EXEC_ENABLE_VPID 0x00000020 - #define SECONDARY_EXEC_WBINVD_EXITING 0x00000040 - #define SECONDARY_EXEC_UNRESTRICTED_GUEST 0x00000080 -+#define SECONDARY_EXEC_APIC_REGISTER_VIRT 0x00000100 - #define SECONDARY_EXEC_PAUSE_LOOP_EXITING 0x00000400 - #define SECONDARY_EXEC_ENABLE_INVPCID 0x00001000 - extern u32 vmx_secondary_exec_control; -@@ -230,6 +231,8 @@ extern bool_t cpu_has_vmx_ins_outs_instr - SECONDARY_EXEC_UNRESTRICTED_GUEST) - #define cpu_has_vmx_ple \ - (vmx_secondary_exec_control & SECONDARY_EXEC_PAUSE_LOOP_EXITING) -+#define cpu_has_vmx_apic_reg_virt \ -+ (vmx_secondary_exec_control & SECONDARY_EXEC_APIC_REGISTER_VIRT) - - /* GUEST_INTERRUPTIBILITY_INFO flags. */ - #define VMX_INTR_SHADOW_STI 0x00000001 -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmx.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/vmx/vmx.h 2013-03-12 16:20:11.231514370 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmx.h 2013-03-12 16:21:30.003899465 +0100 -@@ -129,6 +129,7 @@ void vmx_update_cpu_exec_control(struct - #define EXIT_REASON_INVVPID 53 - #define EXIT_REASON_WBINVD 54 - #define EXIT_REASON_XSETBV 55 -+#define EXIT_REASON_APIC_WRITE 56 - #define EXIT_REASON_INVPCID 58 - - /* diff -Nru xen-4.2.2/debian/patches/0002-xen-enable-Virtual-interrupt-delivery.patch xen-4.3.0/debian/patches/0002-xen-enable-Virtual-interrupt-delivery.patch --- xen-4.2.2/debian/patches/0002-xen-enable-Virtual-interrupt-delivery.patch 2013-07-17 07:13:09.000000000 +0000 +++ xen-4.3.0/debian/patches/0002-xen-enable-Virtual-interrupt-delivery.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,534 +0,0 @@ -From 25b81a7941d71fabd4c8c56e9d3d76801d061842 Mon Sep 17 00:00:00 2001 -From: Jiongxi Li -Date: Mon, 17 Sep 2012 21:05:11 +0100 -Subject: [PATCH 2/3] xen: enable Virtual-interrupt delivery - -Virtual interrupt delivery avoids Xen to inject vAPIC interrupts -manually, which is fully taken care of by the hardware. This needs -some special awareness into existing interrupr injection path: -For pending interrupt from vLAPIC, instead of direct injection, we may -need update architecture specific indicators before resuming to guest. -Before returning to guest, RVI should be updated if any pending IRRs -EOI exit bitmap controls whether an EOI write should cause VM-Exit. If -set, a trap-like induced EOI VM-Exit is triggered. The approach here -is to manipulate EOI exit bitmap based on value of TMR. Level -triggered irq requires a hook in vLAPIC EOI write, so that vIOAPIC EOI -is triggered and emulated - -Signed-off-by: Gang Wei -Signed-off-by: Yang Zhang -Signed-off-by: Jiongxi Li -Committed-by: Keir Fraser -Signed-off-by: Stefan Bader ---- - xen/arch/x86/hvm/vlapic.c | 25 +++++++++++ - xen/arch/x86/hvm/vmx/intr.c | 80 ++++++++++++++++++++++++++++++++---- - xen/arch/x86/hvm/vmx/vmcs.c | 46 ++++++++++++++++++++- - xen/arch/x86/hvm/vmx/vmx.c | 41 +++++++++++++++++- - xen/arch/x86/hvm/vpt.c | 15 ++++++- - xen/include/asm-x86/hvm/hvm.h | 4 ++ - xen/include/asm-x86/hvm/vlapic.h | 1 + - xen/include/asm-x86/hvm/vmx/vmcs.h | 17 ++++++++ - xen/include/asm-x86/hvm/vmx/vmx.h | 1 + - xen/include/asm-x86/hvm/vpt.h | 2 +- - 10 files changed, 217 insertions(+), 15 deletions(-) - -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vlapic.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vlapic.c 2013-03-12 16:21:29.995899436 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vlapic.c 2013-03-12 16:21:37.651936864 +0100 -@@ -145,6 +145,9 @@ int vlapic_set_irq(struct vlapic *vlapic - if ( trig ) - vlapic_set_vector(vec, &vlapic->regs->data[APIC_TMR]); - -+ if ( hvm_funcs.update_eoi_exit_bitmap ) -+ hvm_funcs.update_eoi_exit_bitmap(vlapic_vcpu(vlapic), vec ,trig); -+ - /* We may need to wake up target vcpu, besides set pending bit here */ - return !vlapic_test_and_set_irr(vec, vlapic); - } -@@ -410,6 +413,14 @@ void vlapic_EOI_set(struct vlapic *vlapi - hvm_dpci_msi_eoi(current->domain, vector); - } - -+void vlapic_handle_EOI_induced_exit(struct vlapic *vlapic, int vector) -+{ -+ if ( vlapic_test_and_clear_vector(vector, &vlapic->regs->data[APIC_TMR]) ) -+ vioapic_update_EOI(vlapic_domain(vlapic), vector); -+ -+ hvm_dpci_msi_eoi(current->domain, vector); -+} -+ - int vlapic_ipi( - struct vlapic *vlapic, uint32_t icr_low, uint32_t icr_high) - { -@@ -1000,6 +1011,14 @@ void vlapic_adjust_i8259_target(struct d - pt_adjust_global_vcpu_target(v); - } - -+int vlapic_virtual_intr_delivery_enabled(void) -+{ -+ if ( hvm_funcs.virtual_intr_delivery_enabled ) -+ return hvm_funcs.virtual_intr_delivery_enabled(); -+ else -+ return 0; -+} -+ - int vlapic_has_pending_irq(struct vcpu *v) - { - struct vlapic *vlapic = vcpu_vlapic(v); -@@ -1012,6 +1031,9 @@ int vlapic_has_pending_irq(struct vcpu * - if ( irr == -1 ) - return -1; - -+ if ( vlapic_virtual_intr_delivery_enabled() ) -+ return irr; -+ - isr = vlapic_find_highest_isr(vlapic); - isr = (isr != -1) ? isr : 0; - if ( (isr & 0xf0) >= (irr & 0xf0) ) -@@ -1024,6 +1046,9 @@ int vlapic_ack_pending_irq(struct vcpu * - { - struct vlapic *vlapic = vcpu_vlapic(v); - -+ if ( vlapic_virtual_intr_delivery_enabled() ) -+ return 1; -+ - vlapic_set_vector(vector, &vlapic->regs->data[APIC_ISR]); - vlapic_clear_irr(vector, vlapic); - -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vmx/intr.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vmx/intr.c 2013-03-12 16:20:11.303514715 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vmx/intr.c 2013-03-12 16:21:37.651936864 +0100 -@@ -206,6 +206,7 @@ void vmx_intr_assist(void) - struct vcpu *v = current; - unsigned int tpr_threshold = 0; - enum hvm_intblk intblk; -+ int pt_vector = -1; - - /* Block event injection when single step with MTF. */ - if ( unlikely(v->arch.hvm_vcpu.single_step) ) -@@ -216,7 +217,7 @@ void vmx_intr_assist(void) - } - - /* Crank the handle on interrupt state. */ -- pt_update_irq(v); -+ pt_vector = pt_update_irq(v); - - do { - intack = hvm_vcpu_has_pending_irq(v); -@@ -227,16 +228,34 @@ void vmx_intr_assist(void) - goto out; - - intblk = hvm_interrupt_blocked(v, intack); -- if ( intblk == hvm_intblk_tpr ) -+ if ( cpu_has_vmx_virtual_intr_delivery ) -+ { -+ /* Set "Interrupt-window exiting" for ExtINT */ -+ if ( (intblk != hvm_intblk_none) && -+ ( (intack.source == hvm_intsrc_pic) || -+ ( intack.source == hvm_intsrc_vector) ) ) -+ { -+ enable_intr_window(v, intack); -+ goto out; -+ } -+ -+ if ( __vmread(VM_ENTRY_INTR_INFO) & INTR_INFO_VALID_MASK ) -+ { -+ if ( (intack.source == hvm_intsrc_pic) || -+ (intack.source == hvm_intsrc_nmi) || -+ (intack.source == hvm_intsrc_mce) ) -+ enable_intr_window(v, intack); -+ -+ goto out; -+ } -+ } else if ( intblk == hvm_intblk_tpr ) - { - ASSERT(vlapic_enabled(vcpu_vlapic(v))); - ASSERT(intack.source == hvm_intsrc_lapic); - tpr_threshold = intack.vector >> 4; - goto out; -- } -- -- if ( (intblk != hvm_intblk_none) || -- (__vmread(VM_ENTRY_INTR_INFO) & INTR_INFO_VALID_MASK) ) -+ } else if ( (intblk != hvm_intblk_none) || -+ (__vmread(VM_ENTRY_INTR_INFO) & INTR_INFO_VALID_MASK) ) - { - enable_intr_window(v, intack); - goto out; -@@ -253,6 +272,44 @@ void vmx_intr_assist(void) - { - hvm_inject_hw_exception(TRAP_machine_check, HVM_DELIVER_NO_ERROR_CODE); - } -+ else if ( cpu_has_vmx_virtual_intr_delivery && -+ intack.source != hvm_intsrc_pic && -+ intack.source != hvm_intsrc_vector ) -+ { -+ unsigned long status = __vmread(GUEST_INTR_STATUS); -+ -+ /* -+ * Set eoi_exit_bitmap for periodic timer interrup to cause EOI-induced VM -+ * exit, then pending periodic time interrups have the chance to be injected -+ * for compensation -+ */ -+ if (pt_vector != -1) -+ vmx_set_eoi_exit_bitmap(v, pt_vector); -+ -+ /* we need update the RVI field */ -+ status &= ~(unsigned long)0x0FF; -+ status |= (unsigned long)0x0FF & -+ intack.vector; -+ __vmwrite(GUEST_INTR_STATUS, status); -+ if (v->arch.hvm_vmx.eoi_exitmap_changed) { -+#ifdef __i386__ -+#define UPDATE_EOI_EXITMAP(v, e) { \ -+ if (test_and_clear_bit(e, &v->arch.hvm_vmx.eoi_exitmap_changed)) { \ -+ __vmwrite(EOI_EXIT_BITMAP##e, v->arch.hvm_vmx.eoi_exit_bitmap[e]); \ -+ __vmwrite(EOI_EXIT_BITMAP##e##_HIGH, v.arch.hvm_vmx.eoi_exit_bitmap[e] >> 32);}} -+#else -+#define UPDATE_EOI_EXITMAP(v, e) { \ -+ if (test_and_clear_bit(e, &v->arch.hvm_vmx.eoi_exitmap_changed)) { \ -+ __vmwrite(EOI_EXIT_BITMAP##e, v->arch.hvm_vmx.eoi_exit_bitmap[e]);}} -+#endif -+ UPDATE_EOI_EXITMAP(v, 0); -+ UPDATE_EOI_EXITMAP(v, 1); -+ UPDATE_EOI_EXITMAP(v, 2); -+ UPDATE_EOI_EXITMAP(v, 3); -+ } -+ -+ pt_intr_post(v, intack); -+ } - else - { - HVMTRACE_2D(INJ_VIRQ, intack.vector, /*fake=*/ 0); -@@ -262,11 +319,16 @@ void vmx_intr_assist(void) - - /* Is there another IRQ to queue up behind this one? */ - intack = hvm_vcpu_has_pending_irq(v); -- if ( unlikely(intack.source != hvm_intsrc_none) ) -- enable_intr_window(v, intack); -+ if ( !cpu_has_vmx_virtual_intr_delivery || -+ intack.source == hvm_intsrc_pic || -+ intack.source == hvm_intsrc_vector ) -+ { -+ if ( unlikely(intack.source != hvm_intsrc_none) ) -+ enable_intr_window(v, intack); -+ } - - out: -- if ( cpu_has_vmx_tpr_shadow ) -+ if ( !cpu_has_vmx_virtual_intr_delivery && cpu_has_vmx_tpr_shadow ) - __vmwrite(TPR_THRESHOLD, tpr_threshold); - } - -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmcs.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vmx/vmcs.c 2013-03-12 16:21:29.999899449 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmcs.c 2013-03-12 16:21:37.655936876 +0100 -@@ -90,6 +90,7 @@ static void __init vmx_display_features( - P(cpu_has_vmx_msr_bitmap, "MSR direct-access bitmap"); - P(cpu_has_vmx_unrestricted_guest, "Unrestricted Guest"); - P(cpu_has_vmx_apic_reg_virt, "APIC Register Virtualization"); -+ P(cpu_has_vmx_virtual_intr_delivery, "Virtual Interrupt Delivery"); - #undef P - - if ( !printed ) -@@ -188,11 +189,12 @@ static int vmx_init_vmcs_config(void) - opt |= SECONDARY_EXEC_UNRESTRICTED_GUEST; - - /* -- * "APIC Register Virtualization" -+ * "APIC Register Virtualization" and "Virtual Interrupt Delivery" - * can be set only when "use TPR shadow" is set - */ - if ( _vmx_cpu_based_exec_control & CPU_BASED_TPR_SHADOW ) -- opt |= SECONDARY_EXEC_APIC_REGISTER_VIRT; -+ opt |= SECONDARY_EXEC_APIC_REGISTER_VIRT | -+ SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY; - - - _vmx_secondary_exec_control = adjust_vmx_controls( -@@ -787,6 +789,22 @@ static int construct_vmcs(struct vcpu *v - __vmwrite(IO_BITMAP_A, virt_to_maddr((char *)hvm_io_bitmap + 0)); - __vmwrite(IO_BITMAP_B, virt_to_maddr((char *)hvm_io_bitmap + PAGE_SIZE)); - -+ if ( cpu_has_vmx_virtual_intr_delivery ) -+ { -+ /* EOI-exit bitmap */ -+ v->arch.hvm_vmx.eoi_exit_bitmap[0] = (uint64_t)0; -+ __vmwrite(EOI_EXIT_BITMAP0, v->arch.hvm_vmx.eoi_exit_bitmap[0]); -+ v->arch.hvm_vmx.eoi_exit_bitmap[1] = (uint64_t)0; -+ __vmwrite(EOI_EXIT_BITMAP1, v->arch.hvm_vmx.eoi_exit_bitmap[1]); -+ v->arch.hvm_vmx.eoi_exit_bitmap[2] = (uint64_t)0; -+ __vmwrite(EOI_EXIT_BITMAP2, v->arch.hvm_vmx.eoi_exit_bitmap[2]); -+ v->arch.hvm_vmx.eoi_exit_bitmap[3] = (uint64_t)0; -+ __vmwrite(EOI_EXIT_BITMAP3, v->arch.hvm_vmx.eoi_exit_bitmap[3]); -+ -+ /* Initialise Guest Interrupt Status (RVI and SVI) to 0 */ -+ __vmwrite(GUEST_INTR_STATUS, 0); -+ } -+ - /* Host data selectors. */ - __vmwrite(HOST_SS_SELECTOR, __HYPERVISOR_DS); - __vmwrite(HOST_DS_SELECTOR, __HYPERVISOR_DS); -@@ -1028,6 +1046,30 @@ int vmx_add_host_load_msr(u32 msr) - return 0; - } - -+void vmx_set_eoi_exit_bitmap(struct vcpu *v, u8 vector) -+{ -+ int index, offset, changed; -+ -+ index = vector >> 6; -+ offset = vector & 63; -+ changed = !test_and_set_bit(offset, -+ (uint64_t *)&v->arch.hvm_vmx.eoi_exit_bitmap[index]); -+ if (changed) -+ set_bit(index, &v->arch.hvm_vmx.eoi_exitmap_changed); -+} -+ -+void vmx_clear_eoi_exit_bitmap(struct vcpu *v, u8 vector) -+{ -+ int index, offset, changed; -+ -+ index = vector >> 6; -+ offset = vector & 63; -+ changed = test_and_clear_bit(offset, -+ (uint64_t *)&v->arch.hvm_vmx.eoi_exit_bitmap[index]); -+ if (changed) -+ set_bit(index, &v->arch.hvm_vmx.eoi_exitmap_changed); -+} -+ - int vmx_create_vmcs(struct vcpu *v) - { - struct arch_vmx_struct *arch_vmx = &v->arch.hvm_vmx; -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmx.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vmx/vmx.c 2013-03-12 16:21:30.003899465 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmx.c 2013-03-12 16:21:37.655936876 +0100 -@@ -1502,6 +1502,22 @@ static void vmx_set_info_guest(struct vc - vmx_vmcs_exit(v); - } - -+static void vmx_update_eoi_exit_bitmap(struct vcpu *v, u8 vector, u8 trig) -+{ -+ if ( cpu_has_vmx_virtual_intr_delivery ) -+ { -+ if (trig) -+ vmx_set_eoi_exit_bitmap(v, vector); -+ else -+ vmx_clear_eoi_exit_bitmap(v, vector); -+ } -+} -+ -+static int vmx_virtual_intr_delivery_enabled(void) -+{ -+ return cpu_has_vmx_virtual_intr_delivery; -+} -+ - static struct hvm_function_table __read_mostly vmx_function_table = { - .name = "VMX", - .cpu_up_prepare = vmx_cpu_up_prepare, -@@ -1548,7 +1564,9 @@ static struct hvm_function_table __read_ - .nhvm_vmcx_guest_intercepts_trap = nvmx_intercepts_exception, - .nhvm_vcpu_vmexit_trap = nvmx_vmexit_trap, - .nhvm_intr_blocked = nvmx_intr_blocked, -- .nhvm_domain_relinquish_resources = nvmx_domain_relinquish_resources -+ .nhvm_domain_relinquish_resources = nvmx_domain_relinquish_resources, -+ .update_eoi_exit_bitmap = vmx_update_eoi_exit_bitmap, -+ .virtual_intr_delivery_enabled = vmx_virtual_intr_delivery_enabled - }; - - struct hvm_function_table * __init start_vmx(void) -@@ -2284,6 +2302,17 @@ static int vmx_handle_apic_write(void) - return vlapic_apicv_write(current, offset); - } - -+/* -+ * When "Virtual Interrupt Delivery" is enabled, this function is used -+ * to handle EOI-induced VM exit -+ */ -+void vmx_handle_EOI_induced_exit(struct vlapic *vlapic, int vector) -+{ -+ ASSERT(cpu_has_vmx_virtual_intr_delivery); -+ -+ vlapic_handle_EOI_induced_exit(vlapic, vector); -+} -+ - void vmx_vmexit_handler(struct cpu_user_regs *regs) - { - unsigned int exit_reason, idtv_info, intr_info = 0, vector = 0; -@@ -2677,6 +2706,16 @@ void vmx_vmexit_handler(struct cpu_user_ - hvm_inject_hw_exception(TRAP_gp_fault, 0); - break; - -+ case EXIT_REASON_EOI_INDUCED: -+ { -+ int vector; -+ exit_qualification = __vmread(EXIT_QUALIFICATION); -+ vector = exit_qualification & 0xff; -+ -+ vmx_handle_EOI_induced_exit(vcpu_vlapic(current), vector); -+ break; -+ } -+ - case EXIT_REASON_IO_INSTRUCTION: - exit_qualification = __vmread(EXIT_QUALIFICATION); - if ( exit_qualification & 0x10 ) -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vpt.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vpt.c 2013-03-12 16:20:11.335514874 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vpt.c 2013-03-12 16:21:37.659936892 +0100 -@@ -212,7 +212,7 @@ static void pt_timer_fn(void *data) - pt_unlock(pt); - } - --void pt_update_irq(struct vcpu *v) -+int pt_update_irq(struct vcpu *v) - { - struct list_head *head = &v->arch.hvm_vcpu.tm_list; - struct periodic_time *pt, *temp, *earliest_pt = NULL; -@@ -245,7 +245,7 @@ void pt_update_irq(struct vcpu *v) - if ( earliest_pt == NULL ) - { - spin_unlock(&v->arch.hvm_vcpu.tm_lock); -- return; -+ return -1; - } - - earliest_pt->irq_issued = 1; -@@ -263,6 +263,17 @@ void pt_update_irq(struct vcpu *v) - hvm_isa_irq_deassert(v->domain, irq); - hvm_isa_irq_assert(v->domain, irq); - } -+ -+ /* -+ * If periodic timer interrut is handled by lapic, its vector in -+ * IRR is returned and used to set eoi_exit_bitmap for virtual -+ * interrupt delivery case. Otherwise return -1 to do nothing. -+ */ -+ if ( vlapic_accept_pic_intr(v) && -+ (&v->domain->arch.hvm_domain)->vpic[0].int_output ) -+ return -1; -+ else -+ return pt_irq_vector(earliest_pt, hvm_intsrc_lapic); - } - - static struct periodic_time *is_pt_irq( -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/hvm.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/hvm.h 2013-03-12 16:20:11.263514536 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/hvm.h 2013-03-12 16:21:37.659936892 +0100 -@@ -180,6 +180,10 @@ struct hvm_function_table { - - enum hvm_intblk (*nhvm_intr_blocked)(struct vcpu *v); - void (*nhvm_domain_relinquish_resources)(struct domain *d); -+ -+ /* Virtual interrupt delivery */ -+ void (*update_eoi_exit_bitmap)(struct vcpu *v, u8 vector, u8 trig); -+ int (*virtual_intr_delivery_enabled)(void); - }; - - extern struct hvm_function_table hvm_funcs; -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/vlapic.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/vlapic.h 2013-03-12 16:21:30.003899465 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/vlapic.h 2013-03-12 16:21:37.659936892 +0100 -@@ -100,6 +100,7 @@ int vlapic_accept_pic_intr(struct vcpu * - void vlapic_adjust_i8259_target(struct domain *d); - - void vlapic_EOI_set(struct vlapic *vlapic); -+void vlapic_handle_EOI_induced_exit(struct vlapic *vlapic, int vector); - - int vlapic_ipi(struct vlapic *vlapic, uint32_t icr_low, uint32_t icr_high); - -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmcs.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/vmx/vmcs.h 2013-03-12 16:21:30.003899465 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmcs.h 2013-03-12 16:21:37.659936892 +0100 -@@ -110,6 +110,9 @@ struct arch_vmx_struct { - unsigned int host_msr_count; - struct vmx_msr_entry *host_msr_area; - -+ uint32_t eoi_exitmap_changed; -+ uint64_t eoi_exit_bitmap[4]; -+ - unsigned long host_cr0; - - /* Is the guest in real mode? */ -@@ -183,6 +186,7 @@ extern u32 vmx_vmentry_control; - #define SECONDARY_EXEC_WBINVD_EXITING 0x00000040 - #define SECONDARY_EXEC_UNRESTRICTED_GUEST 0x00000080 - #define SECONDARY_EXEC_APIC_REGISTER_VIRT 0x00000100 -+#define SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY 0x00000200 - #define SECONDARY_EXEC_PAUSE_LOOP_EXITING 0x00000400 - #define SECONDARY_EXEC_ENABLE_INVPCID 0x00001000 - extern u32 vmx_secondary_exec_control; -@@ -233,6 +237,8 @@ extern bool_t cpu_has_vmx_ins_outs_instr - (vmx_secondary_exec_control & SECONDARY_EXEC_PAUSE_LOOP_EXITING) - #define cpu_has_vmx_apic_reg_virt \ - (vmx_secondary_exec_control & SECONDARY_EXEC_APIC_REGISTER_VIRT) -+#define cpu_has_vmx_virtual_intr_delivery \ -+ (vmx_secondary_exec_control & SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY) - - /* GUEST_INTERRUPTIBILITY_INFO flags. */ - #define VMX_INTR_SHADOW_STI 0x00000001 -@@ -251,6 +257,7 @@ enum vmcs_field { - GUEST_GS_SELECTOR = 0x0000080a, - GUEST_LDTR_SELECTOR = 0x0000080c, - GUEST_TR_SELECTOR = 0x0000080e, -+ GUEST_INTR_STATUS = 0x00000810, - HOST_ES_SELECTOR = 0x00000c00, - HOST_CS_SELECTOR = 0x00000c02, - HOST_SS_SELECTOR = 0x00000c04, -@@ -278,6 +285,14 @@ enum vmcs_field { - APIC_ACCESS_ADDR_HIGH = 0x00002015, - EPT_POINTER = 0x0000201a, - EPT_POINTER_HIGH = 0x0000201b, -+ EOI_EXIT_BITMAP0 = 0x0000201c, -+ EOI_EXIT_BITMAP0_HIGH = 0x0000201d, -+ EOI_EXIT_BITMAP1 = 0x0000201e, -+ EOI_EXIT_BITMAP1_HIGH = 0x0000201f, -+ EOI_EXIT_BITMAP2 = 0x00002020, -+ EOI_EXIT_BITMAP2_HIGH = 0x00002021, -+ EOI_EXIT_BITMAP3 = 0x00002022, -+ EOI_EXIT_BITMAP3_HIGH = 0x00002023, - GUEST_PHYSICAL_ADDRESS = 0x00002400, - GUEST_PHYSICAL_ADDRESS_HIGH = 0x00002401, - VMCS_LINK_POINTER = 0x00002800, -@@ -398,6 +413,8 @@ int vmx_write_guest_msr(u32 msr, u64 val - int vmx_add_guest_msr(u32 msr); - int vmx_add_host_load_msr(u32 msr); - void vmx_vmcs_switch(struct vmcs_struct *from, struct vmcs_struct *to); -+void vmx_set_eoi_exit_bitmap(struct vcpu *v, u8 vector); -+void vmx_clear_eoi_exit_bitmap(struct vcpu *v, u8 vector); - - #endif /* ASM_X86_HVM_VMX_VMCS_H__ */ - -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmx.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/vmx/vmx.h 2013-03-12 16:21:30.003899465 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmx.h 2013-03-12 16:21:37.663936913 +0100 -@@ -119,6 +119,7 @@ void vmx_update_cpu_exec_control(struct - #define EXIT_REASON_MCE_DURING_VMENTRY 41 - #define EXIT_REASON_TPR_BELOW_THRESHOLD 43 - #define EXIT_REASON_APIC_ACCESS 44 -+#define EXIT_REASON_EOI_INDUCED 45 - #define EXIT_REASON_ACCESS_GDTR_OR_IDTR 46 - #define EXIT_REASON_ACCESS_LDTR_OR_TR 47 - #define EXIT_REASON_EPT_VIOLATION 48 -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/vpt.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/vpt.h 2013-03-12 16:20:11.243514435 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/vpt.h 2013-03-12 16:21:37.663936913 +0100 -@@ -141,7 +141,7 @@ struct pl_time { /* platform time */ - - void pt_save_timer(struct vcpu *v); - void pt_restore_timer(struct vcpu *v); --void pt_update_irq(struct vcpu *v); -+int pt_update_irq(struct vcpu *v); - void pt_intr_post(struct vcpu *v, struct hvm_intack intack); - void pt_migrate(struct vcpu *v); - diff -Nru xen-4.2.2/debian/patches/0003-xen-add-virtual-x2apic-support-for-apicv.patch xen-4.3.0/debian/patches/0003-xen-add-virtual-x2apic-support-for-apicv.patch --- xen-4.2.2/debian/patches/0003-xen-add-virtual-x2apic-support-for-apicv.patch 2013-07-17 07:13:09.000000000 +0000 +++ xen-4.3.0/debian/patches/0003-xen-add-virtual-x2apic-support-for-apicv.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,131 +0,0 @@ -From c892426ce32dc68487613a95c1bf6441e8b15e43 Mon Sep 17 00:00:00 2001 -From: Jiongxi Li -Date: Mon, 17 Sep 2012 21:06:02 +0100 -Subject: [PATCH 3/3] xen: add virtual x2apic support for apicv - -basically to benefit from apicv, we need clear MSR bitmap for -corresponding x2apic MSRs: - 0x800 - 0x8ff: no read intercept for apicv register virtualization - TPR,EOI,SELF-IPI: no write intercept for virtual interrupt - delivery - -Signed-off-by: Jiongxi Li -Committed-by: Keir Fraser -Signed-off-by: Stefan Bader ---- - xen/arch/x86/hvm/vmx/vmcs.c | 38 +++++++++++++++++++++++++----------- - xen/arch/x86/hvm/vmx/vmx.c | 2 +- - xen/include/asm-x86/hvm/vmx/vmcs.h | 4 +++- - xen/include/asm-x86/msr-index.h | 3 +++ - 4 files changed, 34 insertions(+), 13 deletions(-) - -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmcs.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vmx/vmcs.c 2013-03-12 16:21:37.655936876 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmcs.c 2013-03-12 16:21:45.127973405 +0100 -@@ -658,7 +658,7 @@ static void vmx_set_host_env(struct vcpu - (unsigned long)&get_cpu_info()->guest_cpu_user_regs.error_code); - } - --void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr) -+void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr, int type) - { - unsigned long *msr_bitmap = v->arch.hvm_vmx.msr_bitmap; - -@@ -673,14 +673,18 @@ void vmx_disable_intercept_for_msr(struc - */ - if ( msr <= 0x1fff ) - { -- __clear_bit(msr, msr_bitmap + 0x000/BYTES_PER_LONG); /* read-low */ -- __clear_bit(msr, msr_bitmap + 0x800/BYTES_PER_LONG); /* write-low */ -+ if (type & MSR_TYPE_R) -+ __clear_bit(msr, msr_bitmap + 0x000/BYTES_PER_LONG); /* read-low */ -+ if (type & MSR_TYPE_W) -+ __clear_bit(msr, msr_bitmap + 0x800/BYTES_PER_LONG); /* write-low */ - } - else if ( (msr >= 0xc0000000) && (msr <= 0xc0001fff) ) - { - msr &= 0x1fff; -- __clear_bit(msr, msr_bitmap + 0x400/BYTES_PER_LONG); /* read-high */ -- __clear_bit(msr, msr_bitmap + 0xc00/BYTES_PER_LONG); /* write-high */ -+ if (type & MSR_TYPE_R) -+ __clear_bit(msr, msr_bitmap + 0x400/BYTES_PER_LONG); /* read-high */ -+ if (type & MSR_TYPE_W) -+ __clear_bit(msr, msr_bitmap + 0xc00/BYTES_PER_LONG); /* write-high */ - } - } - -@@ -776,13 +780,25 @@ static int construct_vmcs(struct vcpu *v - v->arch.hvm_vmx.msr_bitmap = msr_bitmap; - __vmwrite(MSR_BITMAP, virt_to_maddr(msr_bitmap)); - -- vmx_disable_intercept_for_msr(v, MSR_FS_BASE); -- vmx_disable_intercept_for_msr(v, MSR_GS_BASE); -- vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_CS); -- vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_ESP); -- vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_EIP); -+ vmx_disable_intercept_for_msr(v, MSR_FS_BASE, MSR_TYPE_R | MSR_TYPE_W); -+ vmx_disable_intercept_for_msr(v, MSR_GS_BASE, MSR_TYPE_R | MSR_TYPE_W); -+ vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_CS, MSR_TYPE_R | MSR_TYPE_W); -+ vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_ESP, MSR_TYPE_R | MSR_TYPE_W); -+ vmx_disable_intercept_for_msr(v, MSR_IA32_SYSENTER_EIP, MSR_TYPE_R | MSR_TYPE_W); - if ( cpu_has_vmx_pat && paging_mode_hap(d) ) -- vmx_disable_intercept_for_msr(v, MSR_IA32_CR_PAT); -+ vmx_disable_intercept_for_msr(v, MSR_IA32_CR_PAT, MSR_TYPE_R | MSR_TYPE_W); -+ if ( cpu_has_vmx_apic_reg_virt ) -+ { -+ int msr; -+ for (msr = MSR_IA32_APICBASE_MSR; msr <= MSR_IA32_APICBASE_MSR + 0xff; msr++) -+ vmx_disable_intercept_for_msr(v, msr, MSR_TYPE_R); -+ } -+ if ( cpu_has_vmx_virtual_intr_delivery ) -+ { -+ vmx_disable_intercept_for_msr(v, MSR_IA32_APICTPR_MSR, MSR_TYPE_W); -+ vmx_disable_intercept_for_msr(v, MSR_IA32_APICEOI_MSR, MSR_TYPE_W); -+ vmx_disable_intercept_for_msr(v, MSR_IA32_APICSELF_MSR, MSR_TYPE_W); -+ } - } - - /* I/O access bitmap. */ -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmx.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vmx/vmx.c 2013-03-12 16:21:37.655936876 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vmx/vmx.c 2013-03-12 16:21:45.127973405 +0100 -@@ -2036,7 +2036,7 @@ static int vmx_msr_write_intercept(unsig - for ( ; (rc == 0) && lbr->count; lbr++ ) - for ( i = 0; (rc == 0) && (i < lbr->count); i++ ) - if ( (rc = vmx_add_guest_msr(lbr->base + i)) == 0 ) -- vmx_disable_intercept_for_msr(v, lbr->base + i); -+ vmx_disable_intercept_for_msr(v, lbr->base + i, MSR_TYPE_R | MSR_TYPE_W); - } - - if ( (rc < 0) || -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmcs.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/vmx/vmcs.h 2013-03-12 16:21:37.659936892 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/vmx/vmcs.h 2013-03-12 16:21:45.131973424 +0100 -@@ -407,7 +407,9 @@ enum vmcs_field { - - #define VMCS_VPID_WIDTH 16 - --void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr); -+#define MSR_TYPE_R 1 -+#define MSR_TYPE_W 2 -+void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr, int type); - int vmx_read_guest_msr(u32 msr, u64 *val); - int vmx_write_guest_msr(u32 msr, u64 val); - int vmx_add_guest_msr(u32 msr); -Index: xen-4.2.1-intel/xen/include/asm-x86/msr-index.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/msr-index.h 2013-03-12 16:20:13.527525603 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/msr-index.h 2013-03-12 16:21:45.131973424 +0100 -@@ -291,6 +291,9 @@ - #define MSR_IA32_APICBASE_ENABLE (1<<11) - #define MSR_IA32_APICBASE_BASE (0xfffff<<12) - #define MSR_IA32_APICBASE_MSR 0x800 -+#define MSR_IA32_APICTPR_MSR 0x808 -+#define MSR_IA32_APICEOI_MSR 0x80b -+#define MSR_IA32_APICSELF_MSR 0x83f - - #define MSR_IA32_UCODE_WRITE 0x00000079 - #define MSR_IA32_UCODE_REV 0x0000008b diff -Nru xen-4.2.2/debian/patches/0004-x86-Implement-TSC-adjust-feature-for-HVM-guest.patch xen-4.3.0/debian/patches/0004-x86-Implement-TSC-adjust-feature-for-HVM-guest.patch --- xen-4.2.2/debian/patches/0004-x86-Implement-TSC-adjust-feature-for-HVM-guest.patch 2013-07-17 07:13:09.000000000 +0000 +++ xen-4.3.0/debian/patches/0004-x86-Implement-TSC-adjust-feature-for-HVM-guest.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,130 +0,0 @@ -From 6e0336351ed95e2f72e396b3e1d055a8f5663542 Mon Sep 17 00:00:00 2001 -From: "Liu, Jinsong" -Date: Wed, 26 Sep 2012 12:12:42 +0200 -Subject: [PATCH 4/6] x86: Implement TSC adjust feature for HVM guest - -IA32_TSC_ADJUST MSR is maintained separately for each logical -processor. A logical processor maintains and uses the IA32_TSC_ADJUST -MSR as follows: -1). On RESET, the value of the IA32_TSC_ADJUST MSR is 0; -2). If an execution of WRMSR to the IA32_TIME_STAMP_COUNTER MSR adds - (or subtracts) value X from the TSC, the logical processor also - adds (or subtracts) value X from the IA32_TSC_ADJUST MSR; -3). If an execution of WRMSR to the IA32_TSC_ADJUST MSR adds (or - subtracts) value X from that MSR, the logical processor also adds - (or subtracts) value X from the TSC. - -This patch provides tsc adjust support for hvm guest, with it guest OS -would be happy when sync tsc. - -Signed-off-by: Liu, Jinsong -Committed-by: Jan Beulich ---- - xen/arch/x86/hvm/hvm.c | 30 +++++++++++++++++++++++++++++- - xen/include/asm-x86/hvm/vcpu.h | 1 + - xen/include/asm-x86/msr-index.h | 1 + - 3 files changed, 31 insertions(+), 1 deletion(-) - -Index: xen-4.2.1-intel/xen/arch/x86/hvm/hvm.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/hvm.c 2013-03-12 16:16:17.222370353 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/hvm.c 2013-03-12 16:21:53.484014255 +0100 -@@ -244,6 +244,7 @@ int hvm_set_guest_pat(struct vcpu *v, u6 - void hvm_set_guest_tsc(struct vcpu *v, u64 guest_tsc) - { - uint64_t tsc; -+ uint64_t delta_tsc; - - if ( v->domain->arch.vtsc ) - { -@@ -255,10 +256,22 @@ void hvm_set_guest_tsc(struct vcpu *v, u - rdtscll(tsc); - } - -- v->arch.hvm_vcpu.cache_tsc_offset = guest_tsc - tsc; -+ delta_tsc = guest_tsc - tsc; -+ v->arch.hvm_vcpu.msr_tsc_adjust += delta_tsc -+ - v->arch.hvm_vcpu.cache_tsc_offset; -+ v->arch.hvm_vcpu.cache_tsc_offset = delta_tsc; -+ - hvm_funcs.set_tsc_offset(v, v->arch.hvm_vcpu.cache_tsc_offset); - } - -+void hvm_set_guest_tsc_adjust(struct vcpu *v, u64 tsc_adjust) -+{ -+ v->arch.hvm_vcpu.cache_tsc_offset += tsc_adjust -+ - v->arch.hvm_vcpu.msr_tsc_adjust; -+ hvm_funcs.set_tsc_offset(v, v->arch.hvm_vcpu.cache_tsc_offset); -+ v->arch.hvm_vcpu.msr_tsc_adjust = tsc_adjust; -+} -+ - u64 hvm_get_guest_tsc(struct vcpu *v) - { - uint64_t tsc; -@@ -277,6 +290,11 @@ u64 hvm_get_guest_tsc(struct vcpu *v) - return tsc + v->arch.hvm_vcpu.cache_tsc_offset; - } - -+u64 hvm_get_guest_tsc_adjust(struct vcpu *v) -+{ -+ return v->arch.hvm_vcpu.msr_tsc_adjust; -+} -+ - void hvm_migrate_timers(struct vcpu *v) - { - rtc_migrate_timers(v); -@@ -2798,6 +2816,10 @@ int hvm_msr_read_intercept(unsigned int - *msr_content = hvm_get_guest_tsc(v); - break; - -+ case MSR_IA32_TSC_ADJUST: -+ *msr_content = hvm_get_guest_tsc_adjust(v); -+ break; -+ - case MSR_TSC_AUX: - *msr_content = hvm_msr_tsc_aux(v); - break; -@@ -2911,6 +2933,10 @@ int hvm_msr_write_intercept(unsigned int - hvm_set_guest_tsc(v, msr_content); - break; - -+ case MSR_IA32_TSC_ADJUST: -+ hvm_set_guest_tsc_adjust(v, msr_content); -+ break; -+ - case MSR_TSC_AUX: - v->arch.hvm_vcpu.msr_tsc_aux = (uint32_t)msr_content; - if ( cpu_has_rdtscp -@@ -3482,6 +3508,8 @@ void hvm_vcpu_reset_state(struct vcpu *v - 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.hvm_vcpu.msr_tsc_adjust = 0; -+ - paging_update_paging_modes(v); - - v->arch.flags |= TF_kernel_mode; -Index: xen-4.2.1-intel/xen/include/asm-x86/hvm/vcpu.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/hvm/vcpu.h 2013-03-12 16:16:17.166370080 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/hvm/vcpu.h 2013-03-12 16:21:53.484014255 +0100 -@@ -137,6 +137,7 @@ struct hvm_vcpu { - struct hvm_vcpu_asid n1asid; - - u32 msr_tsc_aux; -+ u64 msr_tsc_adjust; - - /* VPMU */ - struct vpmu_struct vpmu; -Index: xen-4.2.1-intel/xen/include/asm-x86/msr-index.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/asm-x86/msr-index.h 2013-03-12 16:21:45.131973424 +0100 -+++ xen-4.2.1-intel/xen/include/asm-x86/msr-index.h 2013-03-12 16:21:53.484014255 +0100 -@@ -284,6 +284,7 @@ - #define MSR_IA32_PLATFORM_ID 0x00000017 - #define MSR_IA32_EBL_CR_POWERON 0x0000002a - #define MSR_IA32_EBC_FREQUENCY_ID 0x0000002c -+#define MSR_IA32_TSC_ADJUST 0x0000003b - - #define MSR_IA32_APICBASE 0x0000001b - #define MSR_IA32_APICBASE_BSP (1<<8) diff -Nru xen-4.2.2/debian/patches/0005-x86-Save-restore-TSC-adjust-during-HVM-guest-migrati.patch xen-4.3.0/debian/patches/0005-x86-Save-restore-TSC-adjust-during-HVM-guest-migrati.patch --- xen-4.2.2/debian/patches/0005-x86-Save-restore-TSC-adjust-during-HVM-guest-migrati.patch 2013-07-17 07:13:09.000000000 +0000 +++ xen-4.3.0/debian/patches/0005-x86-Save-restore-TSC-adjust-during-HVM-guest-migrati.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -From e35cd2cce4fe119ef63913f3eb7443b7f5b57d75 Mon Sep 17 00:00:00 2001 -From: "Liu, Jinsong" -Date: Wed, 26 Sep 2012 12:13:38 +0200 -Subject: [PATCH 5/6] x86: Save/restore TSC adjust during HVM guest migration - -Signed-off-by: Liu, Jinsong -Committed-by: Jan Beulich ---- - tools/misc/xen-hvmctx.c | 8 +++++++ - xen/arch/x86/hvm/hvm.c | 40 ++++++++++++++++++++++++++++++++ - xen/include/public/arch-x86/hvm/save.h | 8 ++++++- - 3 files changed, 55 insertions(+), 1 deletion(-) - -Index: xen-4.2.1-intel/tools/misc/xen-hvmctx.c -=================================================================== ---- xen-4.2.1-intel.orig/tools/misc/xen-hvmctx.c 2013-03-08 11:38:51.000000000 +0100 -+++ xen-4.2.1-intel/tools/misc/xen-hvmctx.c 2013-03-12 16:21:58.184037231 +0100 -@@ -390,6 +390,13 @@ static void dump_vmce_vcpu(void) - printf(" VMCE_VCPU: caps %" PRIx64 "\n", p.caps); - } - -+static void dump_tsc_adjust(void) -+{ -+ HVM_SAVE_TYPE(TSC_ADJUST) p; -+ READ(p); -+ printf(" TSC_ADJUST: tsc_adjust %" PRIx64 "\n", p.tsc_adjust); -+} -+ - int main(int argc, char **argv) - { - int entry, domid; -@@ -457,6 +464,7 @@ int main(int argc, char **argv) - case HVM_SAVE_CODE(VIRIDIAN_DOMAIN): dump_viridian_domain(); break; - case HVM_SAVE_CODE(VIRIDIAN_VCPU): dump_viridian_vcpu(); break; - case HVM_SAVE_CODE(VMCE_VCPU): dump_vmce_vcpu(); break; -+ case HVM_SAVE_CODE(TSC_ADJUST): dump_tsc_adjust(); break; - case HVM_SAVE_CODE(END): break; - default: - printf(" ** Don't understand type %u: skipping\n", -Index: xen-4.2.1-intel/xen/arch/x86/hvm/hvm.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/hvm.c 2013-03-12 16:21:53.484014255 +0100 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/hvm.c 2013-03-12 16:21:58.188037253 +0100 -@@ -610,6 +610,46 @@ void hvm_domain_destroy(struct domain *d - hvm_destroy_cacheattr_region_list(d); - } - -+static int hvm_save_tsc_adjust(struct domain *d, hvm_domain_context_t *h) -+{ -+ struct vcpu *v; -+ struct hvm_tsc_adjust ctxt; -+ int err = 0; -+ -+ for_each_vcpu ( d, v ) -+ { -+ ctxt.tsc_adjust = v->arch.hvm_vcpu.msr_tsc_adjust; -+ err = hvm_save_entry(TSC_ADJUST, v->vcpu_id, h, &ctxt); -+ if ( err ) -+ break; -+ } -+ -+ return err; -+} -+ -+static int hvm_load_tsc_adjust(struct domain *d, hvm_domain_context_t *h) -+{ -+ unsigned int vcpuid = hvm_load_instance(h); -+ struct vcpu *v; -+ struct hvm_tsc_adjust ctxt; -+ -+ if ( vcpuid >= d->max_vcpus || (v = d->vcpu[vcpuid]) == NULL ) -+ { -+ dprintk(XENLOG_G_ERR, "HVM restore: dom%d has no vcpu%u\n", -+ d->domain_id, vcpuid); -+ return -EINVAL; -+ } -+ -+ if ( hvm_load_entry(TSC_ADJUST, h, &ctxt) != 0 ) -+ return -EINVAL; -+ -+ v->arch.hvm_vcpu.msr_tsc_adjust = ctxt.tsc_adjust; -+ return 0; -+} -+ -+HVM_REGISTER_SAVE_RESTORE(TSC_ADJUST, hvm_save_tsc_adjust, -+ hvm_load_tsc_adjust, 1, HVMSR_PER_VCPU); -+ - static int hvm_save_cpu_ctxt(struct domain *d, hvm_domain_context_t *h) - { - struct vcpu *v; -Index: xen-4.2.1-intel/xen/include/public/arch-x86/hvm/save.h -=================================================================== ---- xen-4.2.1-intel.orig/xen/include/public/arch-x86/hvm/save.h 2013-03-08 11:38:51.000000000 +0100 -+++ xen-4.2.1-intel/xen/include/public/arch-x86/hvm/save.h 2013-03-12 16:21:58.188037253 +0100 -@@ -581,9 +581,15 @@ struct hvm_vmce_vcpu { - - DECLARE_HVM_SAVE_TYPE(VMCE_VCPU, 18, struct hvm_vmce_vcpu); - -+struct hvm_tsc_adjust { -+ uint64_t tsc_adjust; -+}; -+ -+DECLARE_HVM_SAVE_TYPE(TSC_ADJUST, 19, struct hvm_tsc_adjust); -+ - /* - * Largest type-code in use - */ --#define HVM_SAVE_CODE_MAX 18 -+#define HVM_SAVE_CODE_MAX 19 - - #endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */ diff -Nru xen-4.2.2/debian/patches/0006-x86-Expose-TSC-adjust-to-HVM-guest.patch xen-4.3.0/debian/patches/0006-x86-Expose-TSC-adjust-to-HVM-guest.patch --- xen-4.2.2/debian/patches/0006-x86-Expose-TSC-adjust-to-HVM-guest.patch 2013-07-17 07:13:09.000000000 +0000 +++ xen-4.3.0/debian/patches/0006-x86-Expose-TSC-adjust-to-HVM-guest.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -From 6fd5f43ad974e8759a9c7bb6c61987fc214f27cc Mon Sep 17 00:00:00 2001 -From: "Liu, Jinsong" -Date: Wed, 26 Sep 2012 12:14:30 +0200 -Subject: [PATCH 6/6] x86: Expose TSC adjust to HVM guest - -Intel latest SDM (17.13.3) release a new MSR CPUID.7.0.EBX[1]=1 -indicates TSC_ADJUST MSR 0x3b is supported. - -This patch expose it to hvm guest. - -Signed-off-by: Liu, Jinsong -Committed-by: Jan Beulich ---- - tools/libxc/xc_cpufeature.h | 1 + - tools/libxc/xc_cpuid_x86.c | 3 ++- - 2 files changed, 3 insertions(+), 1 deletion(-) - -Index: xen-4.2.1-intel/tools/libxc/xc_cpufeature.h -=================================================================== ---- xen-4.2.1-intel.orig/tools/libxc/xc_cpufeature.h 2013-03-08 11:38:51.000000000 +0100 -+++ xen-4.2.1-intel/tools/libxc/xc_cpufeature.h 2013-03-12 16:22:02.532058495 +0100 -@@ -128,6 +128,7 @@ - - /* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx) */ - #define X86_FEATURE_FSGSBASE 0 /* {RD,WR}{FS,GS}BASE instructions */ -+#define X86_FEATURE_TSC_ADJUST 1 /* Tsc thread offset */ - #define X86_FEATURE_BMI1 3 /* 1st group bit manipulation extensions */ - #define X86_FEATURE_HLE 4 /* Hardware Lock Elision */ - #define X86_FEATURE_AVX2 5 /* AVX2 instructions */ -Index: xen-4.2.1-intel/tools/libxc/xc_cpuid_x86.c -=================================================================== ---- xen-4.2.1-intel.orig/tools/libxc/xc_cpuid_x86.c 2013-03-08 11:38:51.000000000 +0100 -+++ xen-4.2.1-intel/tools/libxc/xc_cpuid_x86.c 2013-03-12 16:22:02.536058508 +0100 -@@ -362,7 +362,8 @@ static void xc_cpuid_hvm_policy( - - case 0x00000007: /* Intel-defined CPU features */ - if ( input[1] == 0 ) { -- regs[1] &= (bitmaskof(X86_FEATURE_BMI1) | -+ regs[1] &= (bitmaskof(X86_FEATURE_TSC_ADJUST) | -+ bitmaskof(X86_FEATURE_BMI1) | - bitmaskof(X86_FEATURE_HLE) | - bitmaskof(X86_FEATURE_AVX2) | - bitmaskof(X86_FEATURE_SMEP) | diff -Nru xen-4.2.2/debian/patches/0007-x86-Fix-i386-virtual-apic.patch xen-4.3.0/debian/patches/0007-x86-Fix-i386-virtual-apic.patch --- xen-4.2.2/debian/patches/0007-x86-Fix-i386-virtual-apic.patch 2013-07-17 07:13:09.000000000 +0000 +++ xen-4.3.0/debian/patches/0007-x86-Fix-i386-virtual-apic.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -Description: Fix FTBS on i385 caused by virtual APIC support patches - This corrects the build failure on i386. Upstream that code got removed - completely because the i386 architecture is not supported anymore (for - the hypervisor at least). -Forwarded: not-needed -Origin: vendor -Author: Stefan Bader - -Index: xen-4.2.1-intel/xen/arch/x86/hvm/vmx/intr.c -=================================================================== ---- xen-4.2.1-intel.orig/xen/arch/x86/hvm/vmx/intr.c 2013-04-05 17:12:21.726906784 +0200 -+++ xen-4.2.1-intel/xen/arch/x86/hvm/vmx/intr.c 2013-04-05 17:12:29.126942960 +0200 -@@ -296,7 +296,7 @@ - #define UPDATE_EOI_EXITMAP(v, e) { \ - if (test_and_clear_bit(e, &v->arch.hvm_vmx.eoi_exitmap_changed)) { \ - __vmwrite(EOI_EXIT_BITMAP##e, v->arch.hvm_vmx.eoi_exit_bitmap[e]); \ -- __vmwrite(EOI_EXIT_BITMAP##e##_HIGH, v.arch.hvm_vmx.eoi_exit_bitmap[e] >> 32);}} -+ __vmwrite(EOI_EXIT_BITMAP##e##_HIGH, v->arch.hvm_vmx.eoi_exit_bitmap[e] >> 32);}} - #else - #define UPDATE_EOI_EXITMAP(v, e) { \ - if (test_and_clear_bit(e, &v->arch.hvm_vmx.eoi_exitmap_changed)) { \ diff -Nru xen-4.2.2/debian/patches/CVE-2013-1918-1 xen-4.3.0/debian/patches/CVE-2013-1918-1 --- xen-4.2.2/debian/patches/CVE-2013-1918-1 2013-06-15 15:40:00.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-1918-1 1970-01-01 00:00:00.000000000 +0000 @@ -1,249 +0,0 @@ -Description: x86: make vcpu_destroy_pagetables() preemptible - ... as it may take significant amounts of time. - . - The function, being moved to mm.c as the better home for it anyway, and - to avoid having to make a new helper function there non-static, is - given a "preemptible" parameter temporarily (until, in a subsequent - patch, its other caller is also being made capable of dealing with - preemption). -From: Jan Beulich -Origin: upstream -Id: CVE-2013-1918 XSA-45 ---- ---- a/xen/arch/x86/domain.c -+++ b/xen/arch/x86/domain.c -@@ -73,8 +73,6 @@ void (*dead_idle) (void) __read_mostly = default_dead_idle; - static void paravirt_ctxt_switch_from(struct vcpu *v); - static void paravirt_ctxt_switch_to(struct vcpu *v); - --static void vcpu_destroy_pagetables(struct vcpu *v); -- - static void default_idle(void) - { - local_irq_disable(); -@@ -1058,7 +1056,7 @@ void arch_vcpu_reset(struct vcpu *v) - if ( !is_hvm_vcpu(v) ) - { - destroy_gdt(v); -- vcpu_destroy_pagetables(v); -+ vcpu_destroy_pagetables(v, 0); - } - else - { -@@ -2069,63 +2067,6 @@ static int relinquish_memory( - return ret; - } - --static void vcpu_destroy_pagetables(struct vcpu *v) --{ -- struct domain *d = v->domain; -- unsigned long pfn; -- --#ifdef __x86_64__ -- if ( is_pv_32on64_vcpu(v) ) -- { -- pfn = l4e_get_pfn(*(l4_pgentry_t *) -- __va(pagetable_get_paddr(v->arch.guest_table))); -- -- if ( pfn != 0 ) -- { -- if ( paging_mode_refcounts(d) ) -- put_page(mfn_to_page(pfn)); -- else -- put_page_and_type(mfn_to_page(pfn)); -- } -- -- l4e_write( -- (l4_pgentry_t *)__va(pagetable_get_paddr(v->arch.guest_table)), -- l4e_empty()); -- -- v->arch.cr3 = 0; -- return; -- } --#endif -- -- pfn = pagetable_get_pfn(v->arch.guest_table); -- if ( pfn != 0 ) -- { -- if ( paging_mode_refcounts(d) ) -- put_page(mfn_to_page(pfn)); -- else -- put_page_and_type(mfn_to_page(pfn)); -- v->arch.guest_table = pagetable_null(); -- } -- --#ifdef __x86_64__ -- /* Drop ref to guest_table_user (from MMUEXT_NEW_USER_BASEPTR) */ -- pfn = pagetable_get_pfn(v->arch.guest_table_user); -- if ( pfn != 0 ) -- { -- if ( !is_pv_32bit_vcpu(v) ) -- { -- if ( paging_mode_refcounts(d) ) -- put_page(mfn_to_page(pfn)); -- else -- put_page_and_type(mfn_to_page(pfn)); -- } -- v->arch.guest_table_user = pagetable_null(); -- } --#endif -- -- v->arch.cr3 = 0; --} -- - int domain_relinquish_resources(struct domain *d) - { - int ret; -@@ -2143,7 +2084,11 @@ int domain_relinquish_resources(struct domain *d) - - /* Drop the in-use references to page-table bases. */ - for_each_vcpu ( d, v ) -- vcpu_destroy_pagetables(v); -+ { -+ ret = vcpu_destroy_pagetables(v, 1); -+ if ( ret ) -+ return ret; -+ } - - if ( !is_hvm_domain(d) ) - { ---- a/xen/arch/x86/mm.c -+++ b/xen/arch/x86/mm.c -@@ -2808,6 +2808,82 @@ static void put_superpage(unsigned long mfn) - - #endif - -+static int put_old_guest_table(struct vcpu *v) -+{ -+ int rc; -+ -+ if ( !v->arch.old_guest_table ) -+ return 0; -+ -+ switch ( rc = put_page_and_type_preemptible(v->arch.old_guest_table, 1) ) -+ { -+ case -EINTR: -+ case -EAGAIN: -+ return -EAGAIN; -+ } -+ -+ v->arch.old_guest_table = NULL; -+ -+ return rc; -+} -+ -+int vcpu_destroy_pagetables(struct vcpu *v, bool_t preemptible) -+{ -+ unsigned long mfn = pagetable_get_pfn(v->arch.guest_table); -+ struct page_info *page; -+ int rc = put_old_guest_table(v); -+ -+ if ( rc ) -+ return rc; -+ -+#ifdef __x86_64__ -+ if ( is_pv_32on64_vcpu(v) ) -+ mfn = l4e_get_pfn(*(l4_pgentry_t *)mfn_to_virt(mfn)); -+#endif -+ -+ if ( mfn ) -+ { -+ page = mfn_to_page(mfn); -+ if ( paging_mode_refcounts(v->domain) ) -+ put_page(page); -+ else -+ rc = put_page_and_type_preemptible(page, preemptible); -+ } -+ -+#ifdef __x86_64__ -+ if ( is_pv_32on64_vcpu(v) ) -+ { -+ if ( !rc ) -+ l4e_write( -+ (l4_pgentry_t *)__va(pagetable_get_paddr(v->arch.guest_table)), -+ l4e_empty()); -+ } -+ else -+#endif -+ if ( !rc ) -+ { -+ v->arch.guest_table = pagetable_null(); -+ -+#ifdef __x86_64__ -+ /* Drop ref to guest_table_user (from MMUEXT_NEW_USER_BASEPTR) */ -+ mfn = pagetable_get_pfn(v->arch.guest_table_user); -+ if ( mfn ) -+ { -+ page = mfn_to_page(mfn); -+ if ( paging_mode_refcounts(v->domain) ) -+ put_page(page); -+ else -+ rc = put_page_and_type_preemptible(page, preemptible); -+ } -+ if ( !rc ) -+ v->arch.guest_table_user = pagetable_null(); -+#endif -+ } -+ -+ v->arch.cr3 = 0; -+ -+ return rc; -+} - - int new_guest_cr3(unsigned long mfn) - { -@@ -2994,12 +3070,21 @@ long do_mmuext_op( - unsigned int foreigndom) - { - struct mmuext_op op; -- int rc = 0, i = 0, okay; - unsigned long type; -- unsigned int done = 0; -+ unsigned int i = 0, done = 0; - struct vcpu *curr = current; - struct domain *d = curr->domain; - struct domain *pg_owner; -+ int okay, rc = put_old_guest_table(curr); -+ -+ if ( unlikely(rc) ) -+ { -+ if ( likely(rc == -EAGAIN) ) -+ rc = hypercall_create_continuation( -+ __HYPERVISOR_mmuext_op, "hihi", uops, count, pdone, -+ foreigndom); -+ return rc; -+ } - - if ( unlikely(count & MMU_UPDATE_PREEMPTED) ) - { ---- a/xen/arch/x86/x86_64/compat/mm.c -+++ b/xen/arch/x86/x86_64/compat/mm.c -@@ -365,7 +365,7 @@ int compat_mmuext_op(XEN_GUEST_HANDLE(mmuext_op_compat_t) cmp_uops, - : mcs->call.args[1]; - unsigned int left = arg1 & ~MMU_UPDATE_PREEMPTED; - -- BUG_ON(left == arg1); -+ BUG_ON(left == arg1 && left != i); - BUG_ON(left > count); - guest_handle_add_offset(nat_ops, i - left); - guest_handle_subtract_offset(cmp_uops, left); ---- a/xen/include/asm-x86/domain.h -+++ b/xen/include/asm-x86/domain.h -@@ -464,6 +464,7 @@ struct arch_vcpu - pagetable_t guest_table_user; /* (MFN) x86/64 user-space pagetable */ - #endif - pagetable_t guest_table; /* (MFN) guest notion of cr3 */ -+ struct page_info *old_guest_table; /* partially destructed pagetable */ - /* guest_table holds a ref to the page, and also a type-count unless - * shadow refcounts are in use */ - pagetable_t shadow_table[4]; /* (MFN) shadow(s) of guest */ ---- a/xen/include/asm-x86/mm.h -+++ b/xen/include/asm-x86/mm.h -@@ -605,6 +605,7 @@ void audit_domains(void); - int new_guest_cr3(unsigned long pfn); - void make_cr3(struct vcpu *v, unsigned long mfn); - void update_cr3(struct vcpu *v); -+int vcpu_destroy_pagetables(struct vcpu *, bool_t preemptible); - void propagate_page_fault(unsigned long addr, u16 error_code); - void *do_page_walk(struct vcpu *v, unsigned long addr); - diff -Nru xen-4.2.2/debian/patches/CVE-2013-1918-2 xen-4.3.0/debian/patches/CVE-2013-1918-2 --- xen-4.2.2/debian/patches/CVE-2013-1918-2 2013-06-15 15:40:00.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-1918-2 1970-01-01 00:00:00.000000000 +0000 @@ -1,168 +0,0 @@ -Description: x86: make new_guest_cr3() preemptible - ... as it may take significant amounts of time. -From: Jan Beulich -Origin: upstream -Id: CVE-2013-1918 XSA-45 ---- ---- a/xen/arch/x86/mm.c -+++ b/xen/arch/x86/mm.c -@@ -2889,44 +2889,69 @@ int new_guest_cr3(unsigned long mfn) - { - struct vcpu *curr = current; - struct domain *d = curr->domain; -- int okay; -+ int rc; - unsigned long old_base_mfn; - - #ifdef __x86_64__ - if ( is_pv_32on64_domain(d) ) - { -- okay = paging_mode_refcounts(d) -- ? 0 /* Old code was broken, but what should it be? */ -- : mod_l4_entry( -+ rc = paging_mode_refcounts(d) -+ ? -EINVAL /* Old code was broken, but what should it be? */ -+ : mod_l4_entry( - __va(pagetable_get_paddr(curr->arch.guest_table)), - l4e_from_pfn( - mfn, - (_PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED)), -- pagetable_get_pfn(curr->arch.guest_table), 0, 0, curr) == 0; -- if ( unlikely(!okay) ) -+ pagetable_get_pfn(curr->arch.guest_table), 0, 1, curr); -+ switch ( rc ) - { -+ case 0: -+ break; -+ case -EINTR: -+ case -EAGAIN: -+ return -EAGAIN; -+ default: - MEM_LOG("Error while installing new compat baseptr %lx", mfn); -- return 0; -+ return rc; - } - - invalidate_shadow_ldt(curr, 0); - write_ptbase(curr); - -- return 1; -+ return 0; - } - #endif -- okay = paging_mode_refcounts(d) -- ? get_page_from_pagenr(mfn, d) -- : !get_page_and_type_from_pagenr(mfn, PGT_root_page_table, d, 0, 0); -- if ( unlikely(!okay) ) -+ rc = put_old_guest_table(curr); -+ if ( unlikely(rc) ) -+ return rc; -+ -+ old_base_mfn = pagetable_get_pfn(curr->arch.guest_table); -+ /* -+ * This is particularly important when getting restarted after the -+ * previous attempt got preempted in the put-old-MFN phase. -+ */ -+ if ( old_base_mfn == mfn ) - { -- MEM_LOG("Error while installing new baseptr %lx", mfn); -+ write_ptbase(curr); - return 0; - } - -- invalidate_shadow_ldt(curr, 0); -+ rc = paging_mode_refcounts(d) -+ ? (get_page_from_pagenr(mfn, d) ? 0 : -EINVAL) -+ : get_page_and_type_from_pagenr(mfn, PGT_root_page_table, d, 0, 1); -+ switch ( rc ) -+ { -+ case 0: -+ break; -+ case -EINTR: -+ case -EAGAIN: -+ return -EAGAIN; -+ default: -+ MEM_LOG("Error while installing new baseptr %lx", mfn); -+ return rc; -+ } - -- old_base_mfn = pagetable_get_pfn(curr->arch.guest_table); -+ invalidate_shadow_ldt(curr, 0); - - curr->arch.guest_table = pagetable_from_pfn(mfn); - update_cr3(curr); -@@ -2935,13 +2960,25 @@ int new_guest_cr3(unsigned long mfn) - - if ( likely(old_base_mfn != 0) ) - { -+ struct page_info *page = mfn_to_page(old_base_mfn); -+ - if ( paging_mode_refcounts(d) ) -- put_page(mfn_to_page(old_base_mfn)); -+ put_page(page); - else -- put_page_and_type(mfn_to_page(old_base_mfn)); -+ switch ( rc = put_page_and_type_preemptible(page, 1) ) -+ { -+ case -EINTR: -+ rc = -EAGAIN; -+ case -EAGAIN: -+ curr->arch.old_guest_table = page; -+ break; -+ default: -+ BUG_ON(rc); -+ break; -+ } - } - -- return 1; -+ return rc; - } - - static struct domain *get_pg_owner(domid_t domid) -@@ -3239,8 +3276,13 @@ long do_mmuext_op( - } - - case MMUEXT_NEW_BASEPTR: -- okay = (!paging_mode_translate(d) -- && new_guest_cr3(op.arg1.mfn)); -+ if ( paging_mode_translate(d) ) -+ okay = 0; -+ else -+ { -+ rc = new_guest_cr3(op.arg1.mfn); -+ okay = !rc; -+ } - break; - - -diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c -index 692281a..eada470 100644 ---- a/xen/arch/x86/traps.c -+++ b/xen/arch/x86/traps.c -@@ -2407,12 +2407,23 @@ static int emulate_privileged_op(struct cpu_user_regs *regs) - #endif - } - page = get_page_from_gfn(v->domain, gfn, NULL, P2M_ALLOC); -- rc = page ? new_guest_cr3(page_to_mfn(page)) : 0; - if ( page ) -+ { -+ rc = new_guest_cr3(page_to_mfn(page)); - put_page(page); -+ } -+ else -+ rc = -EINVAL; - domain_unlock(v->domain); -- if ( rc == 0 ) /* not okay */ -+ switch ( rc ) -+ { -+ case 0: -+ break; -+ case -EAGAIN: /* retry after preemption */ -+ goto skip; -+ default: /* not okay */ - goto fail; -+ } - break; - } - diff -Nru xen-4.2.2/debian/patches/CVE-2013-1918-3 xen-4.3.0/debian/patches/CVE-2013-1918-3 --- xen-4.2.2/debian/patches/CVE-2013-1918-3 2013-06-15 15:40:00.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-1918-3 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -Description: x86: make MMUEXT_NEW_USER_BASEPTR preemptible - ... as it may take significant amounts of time. -From: Jan Beulich -Origin: upstream -Id: CVE-2013-1918 XSA-45 ---- ---- a/xen/arch/x86/mm.c -+++ b/xen/arch/x86/mm.c -@@ -3296,29 +3296,56 @@ long do_mmuext_op( - break; - } - -+ old_mfn = pagetable_get_pfn(curr->arch.guest_table_user); -+ /* -+ * This is particularly important when getting restarted after the -+ * previous attempt got preempted in the put-old-MFN phase. -+ */ -+ if ( old_mfn == op.arg1.mfn ) -+ break; -+ - if ( op.arg1.mfn != 0 ) - { - if ( paging_mode_refcounts(d) ) - okay = get_page_from_pagenr(op.arg1.mfn, d); - else -- okay = !get_page_and_type_from_pagenr( -- op.arg1.mfn, PGT_root_page_table, d, 0, 0); -+ { -+ rc = get_page_and_type_from_pagenr( -+ op.arg1.mfn, PGT_root_page_table, d, 0, 1); -+ okay = !rc; -+ } - if ( unlikely(!okay) ) - { -- MEM_LOG("Error while installing new mfn %lx", op.arg1.mfn); -+ if ( rc == -EINTR ) -+ rc = -EAGAIN; -+ else if ( rc != -EAGAIN ) -+ MEM_LOG("Error while installing new mfn %lx", -+ op.arg1.mfn); - break; - } - } - -- old_mfn = pagetable_get_pfn(curr->arch.guest_table_user); - curr->arch.guest_table_user = pagetable_from_pfn(op.arg1.mfn); - - if ( old_mfn != 0 ) - { -+ struct page_info *page = mfn_to_page(old_mfn); -+ - if ( paging_mode_refcounts(d) ) -- put_page(mfn_to_page(old_mfn)); -+ put_page(page); - else -- put_page_and_type(mfn_to_page(old_mfn)); -+ switch ( rc = put_page_and_type_preemptible(page, 1) ) -+ { -+ case -EINTR: -+ rc = -EAGAIN; -+ case -EAGAIN: -+ curr->arch.old_guest_table = page; -+ okay = 0; -+ break; -+ default: -+ BUG_ON(rc); -+ break; -+ } - } - - break; diff -Nru xen-4.2.2/debian/patches/CVE-2013-1918-4 xen-4.3.0/debian/patches/CVE-2013-1918-4 --- xen-4.2.2/debian/patches/CVE-2013-1918-4 2013-06-15 15:40:00.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-1918-4 1970-01-01 00:00:00.000000000 +0000 @@ -1,197 +0,0 @@ -Description: x86: make vcpu_reset() preemptible - ... as dropping the old page tables may take significant amounts of - time. -From: Jan Beulich -Origin: upstream -Id: CVE-2013-1918 XSA-45 ---- ---- a/xen/arch/x86/domain.c -+++ b/xen/arch/x86/domain.c -@@ -1051,17 +1051,16 @@ int arch_set_info_guest( - #undef c - } - --void arch_vcpu_reset(struct vcpu *v) -+int arch_vcpu_reset(struct vcpu *v) - { - if ( !is_hvm_vcpu(v) ) - { - destroy_gdt(v); -- vcpu_destroy_pagetables(v, 0); -- } -- else -- { -- vcpu_end_shutdown_deferral(v); -+ return vcpu_destroy_pagetables(v); - } -+ -+ vcpu_end_shutdown_deferral(v); -+ return 0; - } - - /* -@@ -2085,7 +2084,7 @@ int domain_relinquish_resources(struct domain *d) - /* Drop the in-use references to page-table bases. */ - for_each_vcpu ( d, v ) - { -- ret = vcpu_destroy_pagetables(v, 1); -+ ret = vcpu_destroy_pagetables(v); - if ( ret ) - return ret; - } ---- a/xen/arch/x86/hvm/hvm.c -+++ b/xen/arch/x86/hvm/hvm.c -@@ -3509,8 +3509,11 @@ static void hvm_s3_suspend(struct domain *d) - - for_each_vcpu ( d, v ) - { -+ int rc; -+ - vlapic_reset(vcpu_vlapic(v)); -- vcpu_reset(v); -+ rc = vcpu_reset(v); -+ ASSERT(!rc); - } - - vpic_reset(d); ---- a/xen/arch/x86/hvm/vlapic.c -+++ b/xen/arch/x86/hvm/vlapic.c -@@ -252,10 +252,13 @@ static void vlapic_init_sipi_action(unsigned long _vcpu) - { - case APIC_DM_INIT: { - bool_t fpu_initialised; -+ int rc; -+ - domain_lock(target->domain); - /* Reset necessary VCPU state. This does not include FPU state. */ - fpu_initialised = target->fpu_initialised; -- vcpu_reset(target); -+ rc = vcpu_reset(target); -+ ASSERT(!rc); - target->fpu_initialised = fpu_initialised; - vlapic_reset(vcpu_vlapic(target)); - domain_unlock(target->domain); ---- a/xen/arch/x86/mm.c -+++ b/xen/arch/x86/mm.c -@@ -2827,7 +2827,7 @@ static int put_old_guest_table(struct vcpu *v) - return rc; - } - --int vcpu_destroy_pagetables(struct vcpu *v, bool_t preemptible) -+int vcpu_destroy_pagetables(struct vcpu *v) - { - unsigned long mfn = pagetable_get_pfn(v->arch.guest_table); - struct page_info *page; -@@ -2847,7 +2847,7 @@ int vcpu_destroy_pagetables(struct vcpu *v, bool_t preemptible) - if ( paging_mode_refcounts(v->domain) ) - put_page(page); - else -- rc = put_page_and_type_preemptible(page, preemptible); -+ rc = put_page_and_type_preemptible(page, 1); - } - - #ifdef __x86_64__ -@@ -2873,7 +2873,7 @@ int vcpu_destroy_pagetables(struct vcpu *v, bool_t preemptible) - if ( paging_mode_refcounts(v->domain) ) - put_page(page); - else -- rc = put_page_and_type_preemptible(page, preemptible); -+ rc = put_page_and_type_preemptible(page, 1); - } - if ( !rc ) - v->arch.guest_table_user = pagetable_null(); ---- a/xen/common/domain.c -+++ b/xen/common/domain.c -@@ -779,14 +779,18 @@ void domain_unpause_by_systemcontroller(struct domain *d) - domain_unpause(d); - } - --void vcpu_reset(struct vcpu *v) -+int vcpu_reset(struct vcpu *v) - { - struct domain *d = v->domain; -+ int rc; - - vcpu_pause(v); - domain_lock(d); - -- arch_vcpu_reset(v); -+ set_bit(_VPF_in_reset, &v->pause_flags); -+ rc = arch_vcpu_reset(v); -+ if ( rc ) -+ goto out_unlock; - - set_bit(_VPF_down, &v->pause_flags); - -@@ -802,9 +806,13 @@ void vcpu_reset(struct vcpu *v) - #endif - cpumask_clear(v->cpu_affinity_tmp); - clear_bit(_VPF_blocked, &v->pause_flags); -+ clear_bit(_VPF_in_reset, &v->pause_flags); - -+ out_unlock: - domain_unlock(v->domain); - vcpu_unpause(v); -+ -+ return rc; - } - - ---- a/xen/common/domctl.c -+++ b/xen/common/domctl.c -@@ -307,8 +307,10 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domctl_t) u_domctl) - - if ( guest_handle_is_null(op->u.vcpucontext.ctxt) ) - { -- vcpu_reset(v); -- ret = 0; -+ ret = vcpu_reset(v); -+ if ( ret == -EAGAIN ) -+ ret = hypercall_create_continuation( -+ __HYPERVISOR_domctl, "h", u_domctl); - goto svc_out; - } - ---- a/xen/include/asm-x86/mm.h -+++ b/xen/include/asm-x86/mm.h -@@ -605,7 +605,7 @@ void audit_domains(void); - int new_guest_cr3(unsigned long pfn); - void make_cr3(struct vcpu *v, unsigned long mfn); - void update_cr3(struct vcpu *v); --int vcpu_destroy_pagetables(struct vcpu *, bool_t preemptible); -+int vcpu_destroy_pagetables(struct vcpu *); - void propagate_page_fault(unsigned long addr, u16 error_code); - void *do_page_walk(struct vcpu *v, unsigned long addr); - ---- a/xen/include/xen/domain.h -+++ b/xen/include/xen/domain.h -@@ -13,7 +13,7 @@ typedef union { - struct vcpu *alloc_vcpu( - struct domain *d, unsigned int vcpu_id, unsigned int cpu_id); - struct vcpu *alloc_dom0_vcpu0(void); --void vcpu_reset(struct vcpu *v); -+int vcpu_reset(struct vcpu *); - - struct xen_domctl_getdomaininfo; - void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info); -@@ -67,7 +67,7 @@ void arch_dump_vcpu_info(struct vcpu *v); - - void arch_dump_domain_info(struct domain *d); - --void arch_vcpu_reset(struct vcpu *v); -+int arch_vcpu_reset(struct vcpu *); - - extern spinlock_t vcpu_alloc_lock; - bool_t domctl_lock_acquire(void); ---- a/xen/include/xen/sched.h -+++ b/xen/include/xen/sched.h -@@ -644,6 +644,9 @@ static inline struct domain *next_domain_in_cpupool( - /* VCPU is blocked due to missing mem_sharing ring. */ - #define _VPF_mem_sharing 6 - #define VPF_mem_sharing (1UL<<_VPF_mem_sharing) -+ /* VCPU is being reset. */ -+#define _VPF_in_reset 7 -+#define VPF_in_reset (1UL<<_VPF_in_reset) - - static inline int vcpu_runnable(struct vcpu *v) - { diff -Nru xen-4.2.2/debian/patches/CVE-2013-1918-5 xen-4.3.0/debian/patches/CVE-2013-1918-5 --- xen-4.2.2/debian/patches/CVE-2013-1918-5 2013-06-15 15:40:00.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-1918-5 1970-01-01 00:00:00.000000000 +0000 @@ -1,201 +0,0 @@ -Description: x86: make arch_set_info_guest() preemptible - .. as the root page table validation (and the dropping of an eventual - old one) can require meaningful amounts of time. -From: Jan Beulich -Origin: upstream -Id: CVE-2013-1918 XSA-45 ---- ---- a/xen/arch/x86/domain.c -+++ b/xen/arch/x86/domain.c -@@ -858,6 +858,9 @@ int arch_set_info_guest( - - if ( !v->is_initialised ) - { -+ if ( !compat && !(flags & VGCF_in_kernel) && !c.nat->ctrlreg[1] ) -+ return -EINVAL; -+ - v->arch.pv_vcpu.ldt_base = c(ldt_base); - v->arch.pv_vcpu.ldt_ents = c(ldt_ents); - } -@@ -955,24 +958,44 @@ int arch_set_info_guest( - if ( rc != 0 ) - return rc; - -+ set_bit(_VPF_in_reset, &v->pause_flags); -+ - if ( !compat ) -- { - cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[3]); -- cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC); -- -- if ( !cr3_page ) -- { -- destroy_gdt(v); -- return -EINVAL; -- } -- if ( !paging_mode_refcounts(d) -- && !get_page_type(cr3_page, PGT_base_page_table) ) -- { -- put_page(cr3_page); -- destroy_gdt(v); -- return -EINVAL; -- } -+#ifdef CONFIG_COMPAT -+ else -+ cr3_gfn = compat_cr3_to_pfn(c.cmp->ctrlreg[3]); -+#endif -+ cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC); - -+ if ( !cr3_page ) -+ rc = -EINVAL; -+ else if ( paging_mode_refcounts(d) ) -+ /* nothing */; -+ else if ( cr3_page == v->arch.old_guest_table ) -+ { -+ v->arch.old_guest_table = NULL; -+ put_page(cr3_page); -+ } -+ else -+ { -+ /* -+ * Since v->arch.guest_table{,_user} are both NULL, this effectively -+ * is just a call to put_old_guest_table(). -+ */ -+ if ( !compat ) -+ rc = vcpu_destroy_pagetables(v); -+ if ( !rc ) -+ rc = get_page_type_preemptible(cr3_page, -+ !compat ? PGT_root_page_table -+ : PGT_l3_page_table); -+ if ( rc == -EINTR ) -+ rc = -EAGAIN; -+ } -+ if ( rc ) -+ /* handled below */; -+ else if ( !compat ) -+ { - v->arch.guest_table = pagetable_from_page(cr3_page); - #ifdef __x86_64__ - if ( c.nat->ctrlreg[1] ) -@@ -980,56 +1003,44 @@ int arch_set_info_guest( - cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[1]); - cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC); - -- if ( !cr3_page || -- (!paging_mode_refcounts(d) -- && !get_page_type(cr3_page, PGT_base_page_table)) ) -+ if ( !cr3_page ) -+ rc = -EINVAL; -+ else if ( !paging_mode_refcounts(d) ) - { -- if (cr3_page) -- put_page(cr3_page); -- cr3_page = pagetable_get_page(v->arch.guest_table); -- v->arch.guest_table = pagetable_null(); -- if ( paging_mode_refcounts(d) ) -- put_page(cr3_page); -- else -- put_page_and_type(cr3_page); -- destroy_gdt(v); -- return -EINVAL; -+ rc = get_page_type_preemptible(cr3_page, PGT_root_page_table); -+ switch ( rc ) -+ { -+ case -EINTR: -+ rc = -EAGAIN; -+ case -EAGAIN: -+ v->arch.old_guest_table = -+ pagetable_get_page(v->arch.guest_table); -+ v->arch.guest_table = pagetable_null(); -+ break; -+ } - } -- -- v->arch.guest_table_user = pagetable_from_page(cr3_page); -- } -- else if ( !(flags & VGCF_in_kernel) ) -- { -- destroy_gdt(v); -- return -EINVAL; -+ if ( !rc ) -+ v->arch.guest_table_user = pagetable_from_page(cr3_page); - } - } - else - { - l4_pgentry_t *l4tab; - -- cr3_gfn = compat_cr3_to_pfn(c.cmp->ctrlreg[3]); -- cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC); -- -- if ( !cr3_page) -- { -- destroy_gdt(v); -- return -EINVAL; -- } -- -- if (!paging_mode_refcounts(d) -- && !get_page_type(cr3_page, PGT_l3_page_table) ) -- { -- put_page(cr3_page); -- destroy_gdt(v); -- return -EINVAL; -- } -- - l4tab = __va(pagetable_get_paddr(v->arch.guest_table)); - *l4tab = l4e_from_pfn(page_to_mfn(cr3_page), - _PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED); - #endif - } -+ if ( rc ) -+ { -+ if ( cr3_page ) -+ put_page(cr3_page); -+ destroy_gdt(v); -+ return rc; -+ } -+ -+ clear_bit(_VPF_in_reset, &v->pause_flags); - - if ( v->vcpu_id == 0 ) - update_domain_wallclock_time(d); ---- a/xen/common/compat/domain.c -+++ b/xen/common/compat/domain.c -@@ -50,6 +50,10 @@ int compat_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) - rc = v->is_initialised ? -EEXIST : arch_set_info_guest(v, cmp_ctxt); - domain_unlock(d); - -+ if ( rc == -EAGAIN ) -+ rc = hypercall_create_continuation(__HYPERVISOR_vcpu_op, "iih", -+ cmd, vcpuid, arg); -+ - xfree(cmp_ctxt); - break; - } ---- a/xen/common/domain.c -+++ b/xen/common/domain.c -@@ -849,6 +849,11 @@ long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) - domain_unlock(d); - - free_vcpu_guest_context(ctxt); -+ -+ if ( rc == -EAGAIN ) -+ rc = hypercall_create_continuation(__HYPERVISOR_vcpu_op, "iih", -+ cmd, vcpuid, arg); -+ - break; - - case VCPUOP_up: { ---- a/xen/common/domctl.c -+++ b/xen/common/domctl.c -@@ -339,6 +339,10 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domctl_t) u_domctl) - domain_pause(d); - ret = arch_set_info_guest(v, c); - domain_unpause(d); -+ -+ if ( ret == -EAGAIN ) -+ ret = hypercall_create_continuation( -+ __HYPERVISOR_domctl, "h", u_domctl); - } - - svc_out: diff -Nru xen-4.2.2/debian/patches/CVE-2013-1918-6 xen-4.3.0/debian/patches/CVE-2013-1918-6 --- xen-4.2.2/debian/patches/CVE-2013-1918-6 2013-06-15 15:40:00.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-1918-6 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ -Description: x86: make page table unpinning preemptible - ... as it may take significant amounts of time. - . - Since we can't re-invoke the operation in a second attempt, the - continuation logic must be slightly tweaked so that we make sure - do_mmuext_op() gets run one more time even when the preempted unpin - operation was the last one in a batch. -From: Jan Beulich -Origin: upstream -Id: CVE-2013-1918 XSA-45 ---- ---- a/xen/arch/x86/mm.c -+++ b/xen/arch/x86/mm.c -@@ -3123,6 +3123,14 @@ long do_mmuext_op( - return rc; - } - -+ if ( unlikely(count == MMU_UPDATE_PREEMPTED) && -+ likely(guest_handle_is_null(uops)) ) -+ { -+ /* See the curr->arch.old_guest_table related -+ * hypercall_create_continuation() below. */ -+ return (int)foreigndom; -+ } -+ - if ( unlikely(count & MMU_UPDATE_PREEMPTED) ) - { - count &= ~MMU_UPDATE_PREEMPTED; -@@ -3146,7 +3154,7 @@ long do_mmuext_op( - - for ( i = 0; i < count; i++ ) - { -- if ( hypercall_preempt_check() ) -+ if ( curr->arch.old_guest_table || hypercall_preempt_check() ) - { - rc = -EAGAIN; - break; -@@ -3266,7 +3274,17 @@ long do_mmuext_op( - break; - } - -- put_page_and_type(page); -+ switch ( rc = put_page_and_type_preemptible(page, 1) ) -+ { -+ case -EINTR: -+ case -EAGAIN: -+ curr->arch.old_guest_table = page; -+ rc = 0; -+ break; -+ default: -+ BUG_ON(rc); -+ break; -+ } - put_page(page); - - /* A page is dirtied when its pin status is cleared. */ -@@ -3587,9 +3605,27 @@ long do_mmuext_op( - } - - if ( rc == -EAGAIN ) -+ { -+ ASSERT(i < count); - rc = hypercall_create_continuation( - __HYPERVISOR_mmuext_op, "hihi", - uops, (count - i) | MMU_UPDATE_PREEMPTED, pdone, foreigndom); -+ } -+ else if ( curr->arch.old_guest_table ) -+ { -+ XEN_GUEST_HANDLE(void) null; -+ -+ ASSERT(rc || i == count); -+ set_xen_guest_handle(null, NULL); -+ /* -+ * In order to have a way to communicate the final return value to -+ * our continuation, we pass this in place of "foreigndom", building -+ * on the fact that this argument isn't needed anymore. -+ */ -+ rc = hypercall_create_continuation( -+ __HYPERVISOR_mmuext_op, "hihi", null, -+ MMU_UPDATE_PREEMPTED, null, rc); -+ } - - put_pg_owner(pg_owner); - ---- a/xen/arch/x86/x86_64/compat/mm.c -+++ b/xen/arch/x86/x86_64/compat/mm.c -@@ -268,6 +268,13 @@ int compat_mmuext_op(XEN_GUEST_HANDLE(mmuext_op_compat_t) cmp_uops, - int rc = 0; - XEN_GUEST_HANDLE(mmuext_op_t) nat_ops; - -+ if ( unlikely(count == MMU_UPDATE_PREEMPTED) && -+ likely(guest_handle_is_null(cmp_uops)) ) -+ { -+ set_xen_guest_handle(nat_ops, NULL); -+ return do_mmuext_op(nat_ops, count, pdone, foreigndom); -+ } -+ - preempt_mask = count & MMU_UPDATE_PREEMPTED; - count ^= preempt_mask; - -@@ -370,12 +377,18 @@ int compat_mmuext_op(XEN_GUEST_HANDLE(mmuext_op_compat_t) cmp_uops, - guest_handle_add_offset(nat_ops, i - left); - guest_handle_subtract_offset(cmp_uops, left); - left = 1; -- BUG_ON(!hypercall_xlat_continuation(&left, 0x01, nat_ops, cmp_uops)); -- BUG_ON(left != arg1); -- if (!test_bit(_MCSF_in_multicall, &mcs->flags)) -- regs->_ecx += count - i; -+ if ( arg1 != MMU_UPDATE_PREEMPTED ) -+ { -+ BUG_ON(!hypercall_xlat_continuation(&left, 0x01, nat_ops, -+ cmp_uops)); -+ if ( !test_bit(_MCSF_in_multicall, &mcs->flags) ) -+ regs->_ecx += count - i; -+ else -+ mcs->compat_call.args[1] += count - i; -+ } - else -- mcs->compat_call.args[1] += count - i; -+ BUG_ON(hypercall_xlat_continuation(&left, 0)); -+ BUG_ON(left != arg1); - } - else - BUG_ON(err > 0); diff -Nru xen-4.2.2/debian/patches/CVE-2013-1918-7 xen-4.3.0/debian/patches/CVE-2013-1918-7 --- xen-4.2.2/debian/patches/CVE-2013-1918-7 2013-06-15 15:40:00.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-1918-7 1970-01-01 00:00:00.000000000 +0000 @@ -1,252 +0,0 @@ -Description: x86: make page table handling error paths preemptible - ... as they may take significant amounts of time. - . - This requires cloning the tweaked continuation logic from - do_mmuext_op() to do_mmu_update(). - . - Note that in mod_l[34]_entry() a negative "preemptible" value gets - passed to put_page_from_l[34]e() now, telling the callee to store the - respective page in current->arch.old_guest_table (for a hypercall - continuation to pick up), rather than carrying out the put right away. - This is going to be made a little more explicit by a subsequent cleanup - patch. -From: Jan Beulich -Origin: upstream -Id: CVE-2013-1918 XSA-45 ---- ---- a/xen/arch/x86/mm.c -+++ b/xen/arch/x86/mm.c -@@ -1241,7 +1241,16 @@ static int put_page_from_l3e(l3_pgentry_t l3e, unsigned long pfn, - #endif - - if ( unlikely(partial > 0) ) -+ { -+ ASSERT(preemptible >= 0); - return __put_page_type(l3e_get_page(l3e), preemptible); -+ } -+ -+ if ( preemptible < 0 ) -+ { -+ current->arch.old_guest_table = l3e_get_page(l3e); -+ return 0; -+ } - - return put_page_and_type_preemptible(l3e_get_page(l3e), preemptible); - } -@@ -1254,7 +1263,17 @@ static int put_page_from_l4e(l4_pgentry_t l4e, unsigned long pfn, - (l4e_get_pfn(l4e) != pfn) ) - { - if ( unlikely(partial > 0) ) -+ { -+ ASSERT(preemptible >= 0); - return __put_page_type(l4e_get_page(l4e), preemptible); -+ } -+ -+ if ( preemptible < 0 ) -+ { -+ current->arch.old_guest_table = l4e_get_page(l4e); -+ return 0; -+ } -+ - return put_page_and_type_preemptible(l4e_get_page(l4e), preemptible); - } - return 1; -@@ -1549,12 +1568,17 @@ static int alloc_l3_table(struct page_info *page, int preemptible) - if ( rc < 0 && rc != -EAGAIN && rc != -EINTR ) - { - MEM_LOG("Failure in alloc_l3_table: entry %d", i); -+ if ( i ) -+ { -+ page->nr_validated_ptes = i; -+ page->partial_pte = 0; -+ current->arch.old_guest_table = page; -+ } - while ( i-- > 0 ) - { - if ( !is_guest_l3_slot(i) ) - continue; - unadjust_guest_l3e(pl3e[i], d); -- put_page_from_l3e(pl3e[i], pfn, 0, 0); - } - } - -@@ -1584,22 +1608,24 @@ static int alloc_l4_table(struct page_info *page, int preemptible) - page->nr_validated_ptes = i; - page->partial_pte = partial ?: 1; - } -- else if ( rc == -EINTR ) -+ else if ( rc < 0 ) - { -+ if ( rc != -EINTR ) -+ MEM_LOG("Failure in alloc_l4_table: entry %d", i); - if ( i ) - { - page->nr_validated_ptes = i; - page->partial_pte = 0; -- rc = -EAGAIN; -+ if ( rc == -EINTR ) -+ rc = -EAGAIN; -+ else -+ { -+ if ( current->arch.old_guest_table ) -+ page->nr_validated_ptes++; -+ current->arch.old_guest_table = page; -+ } - } - } -- else if ( rc < 0 ) -- { -- MEM_LOG("Failure in alloc_l4_table: entry %d", i); -- while ( i-- > 0 ) -- if ( is_guest_l4_slot(d, i) ) -- put_page_from_l4e(pl4e[i], pfn, 0, 0); -- } - if ( rc < 0 ) - return rc; - -@@ -2047,7 +2073,7 @@ static int mod_l3_entry(l3_pgentry_t *pl3e, - pae_flush_pgd(pfn, pgentry_ptr_to_slot(pl3e), nl3e); - } - -- put_page_from_l3e(ol3e, pfn, 0, 0); -+ put_page_from_l3e(ol3e, pfn, 0, -preemptible); - return rc; - } - -@@ -2110,7 +2136,7 @@ static int mod_l4_entry(l4_pgentry_t *pl4e, - return -EFAULT; - } - -- put_page_from_l4e(ol4e, pfn, 0, 0); -+ put_page_from_l4e(ol4e, pfn, 0, -preemptible); - return rc; - } - -@@ -2268,7 +2294,15 @@ static int alloc_page_type(struct page_info *page, unsigned long type, - PRtype_info ": caf=%08lx taf=%" PRtype_info, - page_to_mfn(page), get_gpfn_from_mfn(page_to_mfn(page)), - type, page->count_info, page->u.inuse.type_info); -- page->u.inuse.type_info = 0; -+ if ( page != current->arch.old_guest_table ) -+ page->u.inuse.type_info = 0; -+ else -+ { -+ ASSERT((page->u.inuse.type_info & -+ (PGT_count_mask | PGT_validated)) == 1); -+ get_page_light(page); -+ page->u.inuse.type_info |= PGT_partial; -+ } - } - else - { -@@ -3218,21 +3252,17 @@ long do_mmuext_op( - } - - if ( (rc = xsm_memory_pin_page(d, pg_owner, page)) != 0 ) -- { -- put_page_and_type(page); - okay = 0; -- break; -- } -- -- if ( unlikely(test_and_set_bit(_PGT_pinned, -- &page->u.inuse.type_info)) ) -+ else if ( unlikely(test_and_set_bit(_PGT_pinned, -+ &page->u.inuse.type_info)) ) - { - MEM_LOG("Mfn %lx already pinned", page_to_mfn(page)); -- put_page_and_type(page); - okay = 0; -- break; - } - -+ if ( unlikely(!okay) ) -+ goto pin_drop; -+ - /* A page is dirtied when its pin status is set. */ - paging_mark_dirty(pg_owner, page_to_mfn(page)); - -@@ -3246,7 +3276,13 @@ long do_mmuext_op( - &page->u.inuse.type_info)); - spin_unlock(&pg_owner->page_alloc_lock); - if ( drop_ref ) -- put_page_and_type(page); -+ { -+ pin_drop: -+ if ( type == PGT_l1_page_table ) -+ put_page_and_type(page); -+ else -+ curr->arch.old_guest_table = page; -+ } - } - - break; -@@ -3652,11 +3688,28 @@ long do_mmu_update( - void *va; - unsigned long gpfn, gmfn, mfn; - struct page_info *page; -- int rc = 0, i = 0; -- unsigned int cmd, done = 0, pt_dom; -- struct vcpu *v = current; -+ unsigned int cmd, i = 0, done = 0, pt_dom; -+ struct vcpu *curr = current, *v = curr; - struct domain *d = v->domain, *pt_owner = d, *pg_owner; - struct domain_mmap_cache mapcache; -+ int rc = put_old_guest_table(curr); -+ -+ if ( unlikely(rc) ) -+ { -+ if ( likely(rc == -EAGAIN) ) -+ rc = hypercall_create_continuation( -+ __HYPERVISOR_mmu_update, "hihi", ureqs, count, pdone, -+ foreigndom); -+ return rc; -+ } -+ -+ if ( unlikely(count == MMU_UPDATE_PREEMPTED) && -+ likely(guest_handle_is_null(ureqs)) ) -+ { -+ /* See the curr->arch.old_guest_table related -+ * hypercall_create_continuation() below. */ -+ return (int)foreigndom; -+ } - - if ( unlikely(count & MMU_UPDATE_PREEMPTED) ) - { -@@ -3705,7 +3758,7 @@ long do_mmu_update( - - for ( i = 0; i < count; i++ ) - { -- if ( hypercall_preempt_check() ) -+ if ( curr->arch.old_guest_table || hypercall_preempt_check() ) - { - rc = -EAGAIN; - break; -@@ -3886,9 +3939,27 @@ long do_mmu_update( - } - - if ( rc == -EAGAIN ) -+ { -+ ASSERT(i < count); - rc = hypercall_create_continuation( - __HYPERVISOR_mmu_update, "hihi", - ureqs, (count - i) | MMU_UPDATE_PREEMPTED, pdone, foreigndom); -+ } -+ else if ( curr->arch.old_guest_table ) -+ { -+ XEN_GUEST_HANDLE(void) null; -+ -+ ASSERT(rc || i == count); -+ set_xen_guest_handle(null, NULL); -+ /* -+ * In order to have a way to communicate the final return value to -+ * our continuation, we pass this in place of "foreigndom", building -+ * on the fact that this argument isn't needed anymore. -+ */ -+ rc = hypercall_create_continuation( -+ __HYPERVISOR_mmu_update, "hihi", null, -+ MMU_UPDATE_PREEMPTED, null, rc); -+ } - - put_pg_owner(pg_owner); - diff -Nru xen-4.2.2/debian/patches/CVE-2013-1952 xen-4.3.0/debian/patches/CVE-2013-1952 --- xen-4.2.2/debian/patches/CVE-2013-1952 2013-06-15 15:40:00.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-1952 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -Description: VT-d: don't permit SVT_NO_VERIFY entries for known device types - Only in cases where we don't know what to do we should leave the IRTE - blank (suppressing all validation), but we should always log a warning - in those cases (as being insecure). -From: Jan Beulich -Id: CVE-2013-1952 XSA-49 ---- ---- a/xen/drivers/passthrough/vtd/intremap.c -+++ b/xen/drivers/passthrough/vtd/intremap.c -@@ -440,16 +440,15 @@ static void set_msi_source_id(struct pci_dev *pdev, struct iremap_entry *ire) - type = pdev_type(seg, bus, devfn); - switch ( type ) - { -+ case DEV_TYPE_PCIe_ENDPOINT: - case DEV_TYPE_PCIe_BRIDGE: - case DEV_TYPE_PCIe2PCI_BRIDGE: -- case DEV_TYPE_LEGACY_PCI_BRIDGE: -- break; -- -- case DEV_TYPE_PCIe_ENDPOINT: - set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16, PCI_BDF2(bus, devfn)); - break; - - case DEV_TYPE_PCI: -+ case DEV_TYPE_LEGACY_PCI_BRIDGE: -+ /* case DEV_TYPE_PCI2PCIe_BRIDGE: */ - ret = find_upstream_bridge(seg, &bus, &devfn, &secbus); - if ( ret == 0 ) /* integrated PCI device */ - { -@@ -461,10 +460,15 @@ static void set_msi_source_id(struct pci_dev *pdev, struct iremap_entry *ire) - if ( pdev_type(seg, bus, devfn) == DEV_TYPE_PCIe2PCI_BRIDGE ) - set_ire_sid(ire, SVT_VERIFY_BUS, SQ_ALL_16, - (bus << 8) | pdev->bus); -- else if ( pdev_type(seg, bus, devfn) == DEV_TYPE_LEGACY_PCI_BRIDGE ) -+ else - set_ire_sid(ire, SVT_VERIFY_SID_SQ, SQ_ALL_16, - PCI_BDF2(bus, devfn)); - } -+ else -+ dprintk(XENLOG_WARNING VTDPREFIX, -+ "d%d: no upstream bridge for %04x:%02x:%02x.%u\n", -+ pdev->domain->domain_id, -+ seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); - break; - - default: diff -Nru xen-4.2.2/debian/patches/CVE-2013-2072 xen-4.3.0/debian/patches/CVE-2013-2072 --- xen-4.2.2/debian/patches/CVE-2013-2072 2013-06-15 15:47:48.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-2072 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -Description: libxc: limit cpu values when setting vcpu affinity - When support for pinning more than 64 cpus was added, check for cpu - out-of-range values was removed. This can lead to subsequent - out-of-bounds cpumap array accesses in case the cpu number is higher - than the actual count. - . - This patch returns the check. -From: Petr Matousek -Origin: upstream -Id: CVE-2013-2072 XSA-56 ---- ---- a/tools/python/xen/lowlevel/xc/xc.c -+++ b/tools/python/xen/lowlevel/xc/xc.c -@@ -228,6 +228,7 @@ static PyObject *pyxc_vcpu_setaffinity(XcObject *self, - int vcpu = 0, i; - xc_cpumap_t cpumap; - PyObject *cpulist = NULL; -+ int nr_cpus; - - static char *kwd_list[] = { "domid", "vcpu", "cpumap", NULL }; - -@@ -235,6 +236,10 @@ static PyObject *pyxc_vcpu_setaffinity(XcObject *self, - &dom, &vcpu, &cpulist) ) - return NULL; - -+ nr_cpus = xc_get_max_cpus(self->xc_handle); -+ if ( nr_cpus == 0 ) -+ return pyxc_error_to_exception(self->xc_handle); -+ - cpumap = xc_cpumap_alloc(self->xc_handle); - if(cpumap == NULL) - return pyxc_error_to_exception(self->xc_handle); -@@ -244,6 +249,13 @@ static PyObject *pyxc_vcpu_setaffinity(XcObject *self, - for ( i = 0; i < PyList_Size(cpulist); i++ ) - { - long cpu = PyInt_AsLong(PyList_GetItem(cpulist, i)); -+ if ( cpu < 0 || cpu >= nr_cpus ) -+ { -+ free(cpumap); -+ errno = EINVAL; -+ PyErr_SetFromErrno(xc_error_obj); -+ return NULL; -+ } - cpumap[cpu / 8] |= 1 << (cpu % 8); - } - } diff -Nru xen-4.2.2/debian/patches/CVE-2013-2076 xen-4.3.0/debian/patches/CVE-2013-2076 --- xen-4.2.2/debian/patches/CVE-2013-2076 2013-06-15 15:47:48.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-2076 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -Description: x86/xsave: fix information leak on AMD CPUs - Just like for FXSAVE/FXRSTOR, XSAVE/XRSTOR also don't save/restore the - last instruction and operand pointers as well as the last opcode if - there's no pending unmasked exception (see CVE-2006-1056 and commit - 9747:4d667a139318). - . - While the FXSR solution sits in the save path, I prefer to have this in - the restore path because there the handling is simpler (namely in the - context of the pending changes to properly save the selector values for - 32-bit guest code). - . - Also this is using FFREE instead of EMMS, as it doesn't seem unlikely - that in the future we may see CPUs with x87 and SSE/AVX but no MMX - support. The goal here anyway is just to avoid an FPU stack overflow. - I would have preferred to use FFREEP instead of FFREE (freeing two - stack slots at once), but AMD doesn't document that instruction. -From: Jan Beulich -Origin: upstream -Id: CVE-2013-2076 XSA-52. ---- ---- a/xen/arch/x86/xstate.c -+++ b/xen/arch/x86/xstate.c -@@ -78,6 +78,21 @@ void xrstor(struct vcpu *v, uint64_t mask) - - struct xsave_struct *ptr = v->arch.xsave_area; - -+ /* -+ * AMD CPUs don't save/restore FDP/FIP/FOP unless an exception -+ * is pending. Clear the x87 state here by setting it to fixed -+ * values. The hypervisor data segment can be sometimes 0 and -+ * sometimes new user value. Both should be ok. Use the FPU saved -+ * data block as a safe address because it should be in L1. -+ */ -+ if ( (mask & ptr->xsave_hdr.xstate_bv & XSTATE_FP) && -+ !(ptr->fpu_sse.fsw & 0x0080) && -+ boot_cpu_data.x86_vendor == X86_VENDOR_AMD ) -+ asm volatile ( "fnclex\n\t" /* clear exceptions */ -+ "ffree %%st(7)\n\t" /* clear stack tag */ -+ "fildl %0" /* load to clear state */ -+ : : "m" (ptr->fpu_sse) ); -+ - asm volatile ( - ".byte " REX_PREFIX "0x0f,0xae,0x2f" - : diff -Nru xen-4.2.2/debian/patches/CVE-2013-2077 xen-4.3.0/debian/patches/CVE-2013-2077 --- xen-4.2.2/debian/patches/CVE-2013-2077 2013-06-15 15:47:48.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-2077 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -Description: x86/xsave: recover from faults on XRSTOR - Just like FXRSTOR, XRSTOR can raise #GP if bad content is being passed - to it in the memory block (i.e. aspects not under the control of the - hypervisor, other than e.g. proper alignment of the block). - . - Also correct the comment explaining why FXRSTOR needs exception - recovery code to not wrongly state that this can only be a result of - the control tools passing a bad image. -From: Jan Beulich -Id: CVE-2013-2077 XSA-53 ---- ---- a/xen/arch/x86/i387.c -+++ b/xen/arch/x86/i387.c -@@ -53,7 +53,7 @@ static inline void fpu_fxrstor(struct vcpu *v) - /* - * FXRSTOR can fault if passed a corrupted data block. We handle this - * possibility, which may occur if the block was passed to us by control -- * tools, by silently clearing the block. -+ * tools or through VCPUOP_initialise, by silently clearing the block. - */ - asm volatile ( - #ifdef __i386__ ---- a/xen/arch/x86/xstate.c -+++ b/xen/arch/x86/xstate.c -@@ -93,10 +93,25 @@ void xrstor(struct vcpu *v, uint64_t mask) - "fildl %0" /* load to clear state */ - : : "m" (ptr->fpu_sse) ); - -- asm volatile ( -- ".byte " REX_PREFIX "0x0f,0xae,0x2f" -- : -- : "m" (*ptr), "a" (lmask), "d" (hmask), "D"(ptr) ); -+ /* -+ * XRSTOR can fault if passed a corrupted data block. We handle this -+ * possibility, which may occur if the block was passed to us by control -+ * tools or through VCPUOP_initialise, by silently clearing the block. -+ */ -+ asm volatile ( "1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n" -+ ".section .fixup,\"ax\"\n" -+ "2: mov %5,%%ecx \n" -+ " xor %1,%1 \n" -+ " rep stosb \n" -+ " lea %2,%0 \n" -+ " mov %3,%1 \n" -+ " jmp 1b \n" -+ ".previous \n" -+ _ASM_EXTABLE(1b, 2b) -+ : "+&D" (ptr), "+&a" (lmask) -+ : "m" (*ptr), "g" (lmask), "d" (hmask), -+ "m" (xsave_cntxt_size) -+ : "ecx" ); - } - - bool_t xsave_enabled(const struct vcpu *v) diff -Nru xen-4.2.2/debian/patches/CVE-2013-2078 xen-4.3.0/debian/patches/CVE-2013-2078 --- xen-4.2.2/debian/patches/CVE-2013-2078 2013-06-15 15:47:48.000000000 +0000 +++ xen-4.3.0/debian/patches/CVE-2013-2078 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -Description: x86/xsave: properly check guest input to XSETBV - Other than the HVM emulation path, the PV case so far failed to check - that YMM state requires SSE state to be enabled, allowing for a #GP to - occur upon passing the inputs to XSETBV inside the hypervisor. -From: Jan Beulich -Id: CVE-2013-2078 XSA-54. ---- ---- a/xen/arch/x86/traps.c -+++ b/xen/arch/x86/traps.c -@@ -2286,6 +2286,11 @@ static int emulate_privileged_op(struct cpu_user_regs *regs) - if ( !(new_xfeature & XSTATE_FP) || (new_xfeature & ~xfeature_mask) ) - goto fail; - -+ /* YMM state takes SSE state as prerequisite. */ -+ if ( (xfeature_mask & new_xfeature & XSTATE_YMM) && -+ !(new_xfeature & XSTATE_SSE) ) -+ goto fail; -+ - v->arch.xcr0 = new_xfeature; - v->arch.xcr0_accum |= new_xfeature; - set_xcr0(new_xfeature); diff -Nru xen-4.2.2/debian/patches/config-etherboot.diff xen-4.3.0/debian/patches/config-etherboot.diff --- xen-4.2.2/debian/patches/config-etherboot.diff 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/patches/config-etherboot.diff 2013-07-23 12:51:13.000000000 +0000 @@ -1,8 +1,8 @@ --- a/Config.mk +++ b/Config.mk -@@ -206,7 +206,7 @@ - # Sun Mar 11 09:27:07 2012 -0400 - # Update version to 1.6.3.2 +@@ -217,7 +217,7 @@ + # Wed Jun 26 16:30:45 2013 +0100 + # xen: Don't perform SMP setup. -ETHERBOOT_NICS ?= rtl8139 8086100e +ETHERBOOT_NICS ?= rtl8139 e1000_82540 diff -Nru xen-4.2.2/debian/patches/config-prefix.diff xen-4.3.0/debian/patches/config-prefix.diff --- xen-4.2.2/debian/patches/config-prefix.diff 2012-08-13 20:01:17.000000000 +0000 +++ xen-4.3.0/debian/patches/config-prefix.diff 2013-07-23 12:51:13.000000000 +0000 @@ -1,6 +1,6 @@ --- a/config/StdGNU.mk +++ b/config/StdGNU.mk -@@ -32,16 +32,19 @@ +@@ -30,16 +30,19 @@ PREFIX ?= /usr BINDIR = $(PREFIX)/bin INCLUDEDIR = $(PREFIX)/include @@ -21,11 +21,11 @@ +LIBEXEC = $(PRIVATE_BINDIR) +XENFIRMWAREDIR = $(PRIVATE_PREFIX)/boot - ifeq ($(PREFIX),/usr) CONFIG_DIR = /etc + XEN_LOCK_DIR = /var/lock --- a/Config.mk +++ b/Config.mk -@@ -71,7 +71,7 @@ +@@ -77,7 +77,7 @@ endif PYTHON ?= python diff -Nru xen-4.2.2/debian/patches/docs-pdflatex.patch xen-4.3.0/debian/patches/docs-pdflatex.patch --- xen-4.2.2/debian/patches/docs-pdflatex.patch 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/patches/docs-pdflatex.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ ---- a/docs/Docs.mk -+++ b/docs/Docs.mk -@@ -1,7 +1,5 @@ --PS2PDF := ps2pdf --DVIPS := dvips --LATEX := latex --FIG2DEV := fig2dev -+PDFLATEX := pdflatex -+EPSTOPDF := epstopdf - LATEX2HTML := latex2html - DOXYGEN := doxygen - POD2MAN := pod2man ---- a/docs/xen-api/Makefile -+++ b/docs/xen-api/Makefile -@@ -6,35 +6,30 @@ - - - TEX := $(wildcard *.tex) --EPS := $(wildcard *.eps) --EPSDOT := $(patsubst %.dot,%.eps,$(wildcard *.dot)) -+PDFEPS := $(patsubst %.eps,%.pdf,$(wildcard *.eps)) -+PDFDOT := $(patsubst %.dot,%.pdf,$(wildcard *.dot)) - - .PHONY: all - all: build - - .PHONY: build --build: xenapi.pdf xenapi.ps -+build: xenapi.pdf - - install: -- $(INSTALL_DIR) $(DESTDIR)$(DOCDIR)/ps -- $(INSTALL_DIR) $(DESTDIR)$(DOCDIR)/pdf -+ $(INSTALL_DIR) $(DESTDIR)$(DOCDIR) - -- [ -e xenapi.ps ] && cp xenapi.ps $(DESTDIR)$(DOCDIR)/ps || true -- [ -e xenapi.pdf ] && cp xenapi.pdf $(DESTDIR)$(DOCDIR)/pdf || true -+ [ -e xenapi.pdf ] && cp xenapi.pdf $(DESTDIR)$(DOCDIR) || true - --xenapi.dvi: $(TEX) $(EPS) $(EPSDOT) -- $(LATEX) xenapi.tex -- $(LATEX) xenapi.tex -+xenapi.pdf: $(TEX) $(PDFEPS) $(PDFDOT) -+ $(PDFLATEX) xenapi.tex -+ $(PDFLATEX) xenapi.tex - rm -f *.aux *.log - --%.pdf: %.ps -- $(PS2PDF) $< $@ -+%.pdf: %.eps -+ $(EPSTOPDF) $< - --%.ps: %.dvi -- $(DVIPS) $< -o $@ -- --%.eps: %.dot -- $(DOT) -Tps $< >$@ -+%.pdf: %.dot -+ $(DOT) -Tpdf $< >$@ - - xenapi-datamodel-graph.eps: xenapi-datamodel-graph.dot - $(NEATO) -Goverlap=false -Tps $< >$@ ---- a/docs/xen-api/xenapi-coversheet.tex -+++ b/docs/xen-api/xenapi-coversheet.tex -@@ -14,7 +14,7 @@ - %% Document title - \newcommand{\doctitle}{Xen Management API} - --\newcommand{\coversheetlogo}{xen.eps} -+\newcommand{\coversheetlogo}{xen} - - %% Document date - \newcommand{\datestring}{10th January 2010} diff -Nru xen-4.2.2/debian/patches/qemu-fix-librt-test.patch xen-4.3.0/debian/patches/qemu-fix-librt-test.patch --- xen-4.2.2/debian/patches/qemu-fix-librt-test.patch 2013-07-17 07:15:53.000000000 +0000 +++ xen-4.3.0/debian/patches/qemu-fix-librt-test.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -From: Roger Pau Monne -Subject: build: replace librt check function - -Replace clock_gettime with timer_gettime, since at least under -uclibc 0.9.33 the clock_getttime function can be used without linking -against librt (although the manual page states the opposite). - -Signed-off-by: Roger Pau Monne - -Note: man clock_gettime in Raring says: - Link with -lrt (only for glibc versions before 2.17) -Index: xen-4.2.0/qemu/configure -=================================================================== ---- xen-4.2.0.orig/qemu/configure 2013-01-29 18:17:52.000000000 +0100 -+++ xen-4.2.0/qemu/configure 2013-01-29 18:19:43.567679176 +0100 -@@ -1098,7 +1098,8 @@ - cat > $TMPC < - #include --int main(void) { clockid_t id; return clock_gettime(id, NULL); } -+int main(void) { timer_t tid; struct itimerspec it; \ -+ return timer_gettime(tid, &it); } - EOF - - rt=no diff -Nru xen-4.2.2/debian/patches/series xen-4.3.0/debian/patches/series --- xen-4.2.2/debian/patches/series 2013-07-17 10:59:31.000000000 +0000 +++ xen-4.3.0/debian/patches/series 2013-10-01 09:32:18.000000000 +0000 @@ -1,20 +1,5 @@ -CVE-2013-1918-1 -CVE-2013-1918-2 -CVE-2013-1918-3 -CVE-2013-1918-4 -CVE-2013-1918-5 -CVE-2013-1918-6 -CVE-2013-1918-7 -CVE-2013-1952 -CVE-2013-2072 -CVE-2013-2076 -CVE-2013-2077 -CVE-2013-2078 - version.patch -docs-pdflatex.patch - config-etherboot.diff config-prefix.diff @@ -45,6 +30,9 @@ tools-xentrace-prefix.diff tools-xentrace-rpath.diff +tools-flags.diff +tools-tests-hardening-fallout.patch + tools-python-xen-relative-path.diff tools-misc-xend-startup.diff tools-libxl-nopidfile.diff @@ -57,7 +45,6 @@ tools-pygrub-remove-static-solaris-support.patch -tools-hotplug-install.diff tools-include-install.diff tools-xenmon-install.diff @@ -67,52 +54,31 @@ tools-ocaml-fix-build.diff tools-xenstore-compatibility.diff + +# +# Dropped in debian but ulong usage in gdbsx would still break the build. +# toolchain.diff +# # PXE boot fix for e1000 and ROM paths (likely only Ubuntu) +# ubuntu-tools-firmware-etherboot-kvm-ipxe.diff +# # Only for Ubuntu: stick with qemu-dm +# qemu-prefix.diff qemu-disable-blktap.diff ubuntu-qemu-disable-qemu-upstream.diff -qemu-fix-librt-test.patch +ubuntu-qemu-upstream-location.patch + +# +# Enable Arm builds +# +ubuntu-tools-armhf-without-ocaml.patch + +# +# Security fixes not in Debian, yet +# -# Some failures with recent toolchain -silence-gcc-warnings.patch -tools-gdbsx-fix-build-failure-with-glibc-2.17.patch - -# Backported from Xen 4.3 to support APIC virtualization and TSC adjust -0001-xen-enable-APIC-Register-Virtualization.patch -0002-xen-enable-Virtual-interrupt-delivery.patch -0003-xen-add-virtual-x2apic-support-for-apicv.patch -0004-x86-Implement-TSC-adjust-feature-for-HVM-guest.patch -0005-x86-Save-restore-TSC-adjust-during-HVM-guest-migrati.patch -0006-x86-Expose-TSC-adjust-to-HVM-guest.patch -0007-x86-Fix-i386-virtual-apic.patch - -# Additional security updates -xsa55-4.2-0001-libelf-abolish-libelf-relocate.c.patch -xsa55-4.2-0002-libxc-introduce-xc_dom_seg_to_ptr_pages.patch -xsa55-4.2-0003-libxc-Fix-range-checking-in-xc_dom_pfn_to_ptr-etc.patch -xsa55-4.2-0004-libelf-add-struct-elf_binary-parameter-to-elf_load_i.patch -xsa55-4.2-0005-libelf-abolish-elf_sval-and-elf_access_signed.patch -xsa55-4.2-0006-libelf-move-include-of-asm-guest_access.h-to-top-of-.patch -xsa55-4.2-0007-libelf-xc_dom_load_elf_symtab-Do-not-use-syms-uninit.patch -xsa55-4.2-0008-libelf-introduce-macros-for-memory-access-and-pointe.patch -xsa55-4.2-0009-tools-xcutils-readnotes-adjust-print_l1_mfn_valid_no.patch -xsa55-4.2-0010-libelf-check-nul-terminated-strings-properly.patch -xsa55-4.2-0011-libelf-check-all-pointer-accesses.patch -xsa55-4.2-0012-libelf-Check-pointer-references-in-elf_is_elfbinary.patch -xsa55-4.2-0013-libelf-Make-all-callers-call-elf_check_broken.patch -xsa55-4.2-0014-libelf-use-C99-bool-for-booleans.patch -xsa55-4.2-0015-libelf-use-only-unsigned-integers.patch -xsa55-4.2-0016-libelf-check-loops-for-running-away.patch -xsa55-4.2-0017-libelf-abolish-obsolete-macros.patch -xsa55-4.2-0018-libxc-Add-range-checking-to-xc_dom_binloader.patch -xsa55-4.2-0019-libxc-check-failure-of-xc_dom_-_to_ptr-xc_map_foreig.patch -xsa55-4.2-0020-libxc-check-return-values-from-malloc.patch -xsa55-4.2-0021-libxc-range-checks-in-xc_dom_p2m_host-and-_guest.patch -xsa55-4.2-0022-libxc-check-blob-size-before-proceeding-in-xc_dom_ch.patch -xsa55-4.2-0023-libxc-Better-range-check-in-xc_dom_alloc_segment.patch -xsa57-4.2.patch diff -Nru xen-4.2.2/debian/patches/silence-gcc-warnings.patch xen-4.3.0/debian/patches/silence-gcc-warnings.patch --- xen-4.2.2/debian/patches/silence-gcc-warnings.patch 2013-07-17 07:18:53.000000000 +0000 +++ xen-4.3.0/debian/patches/silence-gcc-warnings.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -diff -Naurp xen-4.2.0.orig/tools/tests/mce-test/tools/xen-mceinj.c xen-4.2.0/tools/tests/mce-test/tools/xen-mceinj.c ---- xen-4.2.0.orig/tools/tests/mce-test/tools/xen-mceinj.c 2012-09-18 02:34:54.000000000 -0500 -+++ xen-4.2.0/tools/tests/mce-test/tools/xen-mceinj.c 2012-11-10 14:14:11.266255396 -0600 -@@ -90,9 +90,10 @@ static void Lprintf(const char *fmt, ... - { - char *buf; - va_list args; -+ int result; - - va_start(args, fmt); -- vasprintf(&buf, fmt, args); -+ result = vasprintf(&buf, fmt, args); - fprintf(LOGFILE, "%s", buf); - va_end(args); - free(buf); -@@ -102,9 +103,10 @@ static void err(xc_interface *xc_handle, - { - char *buf; - va_list args; -+ int result; - - va_start(args, fmt); -- vasprintf(&buf, fmt, args); -+ result = vasprintf(&buf, fmt, args); - perror(buf); - va_end(args); - free(buf); diff -Nru xen-4.2.2/debian/patches/toolchain.diff xen-4.3.0/debian/patches/toolchain.diff --- xen-4.2.2/debian/patches/toolchain.diff 2013-05-11 21:22:17.000000000 +0000 +++ xen-4.3.0/debian/patches/toolchain.diff 2013-09-27 13:42:44.000000000 +0000 @@ -1,6 +1,8 @@ ---- a/tools/debugger/gdbsx/xg/xg_main.c -+++ b/tools/debugger/gdbsx/xg/xg_main.c -@@ -178,7 +178,7 @@ +Index: xen-4.3.0~rc4+38+gb03165b/tools/debugger/gdbsx/xg/xg_main.c +=================================================================== +--- xen-4.3.0~rc4+38+gb03165b.orig/tools/debugger/gdbsx/xg/xg_main.c 2013-06-16 21:22:09.000000000 +0200 ++++ xen-4.3.0~rc4+38+gb03165b/tools/debugger/gdbsx/xg/xg_main.c 2013-06-25 16:15:05.097364124 +0200 +@@ -179,7 +179,7 @@ _domctl_hcall(uint32_t cmd, / hypercall.op = __HYPERVISOR_domctl; hypercall.arg[0] = (unsigned long)&domctl; @@ -9,7 +11,7 @@ if (domctlarg && sz) munlock(domctlarg, sz); return rc; -@@ -218,7 +218,7 @@ +@@ -219,7 +219,7 @@ _check_hyp(int guest_bitness) hypercall.arg[0] = (unsigned long)XENVER_capabilities; hypercall.arg[1] = (unsigned long)&xen_caps; diff -Nru xen-4.2.2/debian/patches/tools-blktap2-prefix.diff xen-4.3.0/debian/patches/tools-blktap2-prefix.diff --- xen-4.2.2/debian/patches/tools-blktap2-prefix.diff 2012-08-13 20:01:17.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-blktap2-prefix.diff 2013-07-23 12:51:13.000000000 +0000 @@ -39,7 +39,7 @@ ifeq ($(CONFIG_LIBICONV),y) LIBS += -liconv -@@ -51,27 +45,24 @@ +@@ -51,27 +45,22 @@ LIB-PICOBJS = $(patsubst %.o,%.opic,$(LIB-OBJS)) @@ -60,19 +60,17 @@ - ln -sf libvhd.so.$(LIBVHD-MAJOR).$(LIBVHD-MINOR) libvhd.so.$(LIBVHD-MAJOR) - ln -sf libvhd.so.$(LIBVHD-MAJOR) libvhd.so +libvhd.so: $(LIB-PICOBJS) -+ $(CC) -Wl,$(SONAME_LDFLAG),$@ $(SHLIB_LDFLAGS) \ -+ $(LDFLAGS) -o $@ $^ $(LIBS) ++ $(CC) $(SHLIB_LDFLAGS) $(LDFLAGS) -o libvhd.so $^ $(LIBS) install: all - $(INSTALL_DIR) -p $(DESTDIR)$(INST-DIR) -- $(INSTALL_PROG) libvhd.a $(DESTDIR)$(INST-DIR) +- $(INSTALL_DATA) libvhd.a $(DESTDIR)$(INST-DIR) - $(INSTALL_PROG) libvhd.so.$(LIBVHD-MAJOR).$(LIBVHD-MINOR) $(DESTDIR)$(INST-DIR) - ln -sf libvhd.so.$(LIBVHD-MAJOR).$(LIBVHD-MINOR) $(DESTDIR)$(INST-DIR)/libvhd.so.$(LIBVHD-MAJOR) - ln -sf libvhd.so.$(LIBVHD-MAJOR) $(DESTDIR)$(INST-DIR)/libvhd.so + $(INSTALL_DIR) -p $(DESTDIR)$(LIBDIR) -+ $(INSTALL_DIR) -p $(DESTDIR)$(PRIVATE_LIBDIR) -+ $(INSTALL_PROG) libvhd.a $(DESTDIR)$(LIBDIR) -+ $(INSTALL_PROG) libvhd.so $(DESTDIR)$(PRIVATE_LIBDIR) ++ $(INSTALL_DATA) libvhd.a $(DESTDIR)$(LIBDIR) ++ $(INSTALL_PROG) libvhd.so $(DESTDIR)$(LIBDIR) clean: rm -rf *.a *.so* *.o *.opic *~ $(DEPS) $(LIBVHD) diff -Nru xen-4.2.2/debian/patches/tools-disable.diff xen-4.3.0/debian/patches/tools-disable.diff --- xen-4.2.2/debian/patches/tools-disable.diff 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-disable.diff 2013-07-28 11:24:02.000000000 +0000 @@ -11,15 +11,22 @@ SUBDIRS-y := SUBDIRS-y += include SUBDIRS-y += libxc -@@ -23,7 +19,6 @@ +@@ -19,14 +15,7 @@ + SUBDIRS-y += console + SUBDIRS-y += xenmon SUBDIRS-y += xenstat - SUBDIRS-$(CONFIG_Linux) += $(SUBDIRS-libaio) +-SUBDIRS-$(CONFIG_Linux) += $(SUBDIRS-libaio) SUBDIRS-$(CONFIG_Linux) += memshr +-ifeq ($(CONFIG_X86),y) -SUBDIRS-$(CONFIG_Linux) += blktap - SUBDIRS-$(CONFIG_Linux) += blktap2 - SUBDIRS-$(CONFIG_NetBSD) += $(SUBDIRS-libaio) - SUBDIRS-$(CONFIG_NetBSD) += blktap2 -@@ -34,9 +29,12 @@ +-endif +-SUBDIRS-$(CONFIG_Linux) += blktap2 +-SUBDIRS-$(CONFIG_NetBSD) += $(SUBDIRS-libaio) +-SUBDIRS-$(CONFIG_NetBSD) += blktap2 + SUBDIRS-$(CONFIG_NetBSD) += xenbackendd + SUBDIRS-y += libfsimage + SUBDIRS-$(LIBXENAPI_BINDINGS) += libxen +@@ -34,9 +23,12 @@ # do not recurse in to a dir we are about to delete ifneq "$(MAKECMDGOALS)" "distclean" @@ -32,3 +39,17 @@ SUBDIRS-y += xenpmd SUBDIRS-y += libxl +--- a/tools/Rules.mk ++++ b/tools/Rules.mk +@@ -41,11 +41,7 @@ + LDLIBS_libxenvchan = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -L$(XEN_LIBVCHAN) -lxenvchan + SHLIB_libxenvchan = -Wl,-rpath-link=$(XEN_LIBVCHAN) + +-ifeq ($(CONFIG_Linux),y) +-LIBXL_BLKTAP ?= y +-else + LIBXL_BLKTAP ?= n +-endif + + ifeq ($(LIBXL_BLKTAP),y) + CFLAGS_libblktapctl = -I$(XEN_BLKTAP2)/control -I$(XEN_BLKTAP2)/include $(CFLAGS_xeninclude) diff -Nru xen-4.2.2/debian/patches/tools-flags.diff xen-4.3.0/debian/patches/tools-flags.diff --- xen-4.2.2/debian/patches/tools-flags.diff 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-flags.diff 2013-08-11 20:19:40.000000000 +0000 @@ -0,0 +1,16 @@ +Description: Export flags from configure +Author: Bastian Blank +Origin: vendor +Forwarded: not-needed +--- a/config/Tools.mk.in ++++ b/config/Tools.mk.in +@@ -24,6 +24,9 @@ + IASL := @IASL@ + FETCHER := @FETCHER@ + ++CFLAGS += @CFLAGS@ ++CPPFLAGS += @CPPFLAGS@ ++ + # Extra folder for libs/includes + PREPEND_INCLUDES := @PREPEND_INCLUDES@ + PREPEND_LIB := @PREPEND_LIB@ diff -Nru xen-4.2.2/debian/patches/tools-gdbsx-fix-build-failure-with-glibc-2.17.patch xen-4.3.0/debian/patches/tools-gdbsx-fix-build-failure-with-glibc-2.17.patch --- xen-4.2.2/debian/patches/tools-gdbsx-fix-build-failure-with-glibc-2.17.patch 2013-07-17 07:21:58.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-gdbsx-fix-build-failure-with-glibc-2.17.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -From 5d98adc3e5e859ba23f62ca63450f6a60a9c5e2f Mon Sep 17 00:00:00 2001 -From: Olaf Hering -Date: Thu, 6 Dec 2012 16:50:48 +0000 -Subject: [PATCH] tools/gdbsx: fix build failure with glibc-2.17 - -Signed-off-by: Olaf Hering -Committed-by: Keir Fraser - -(cherry-picked from 5d98adc3e5e859ba23f62ca63450f6a60a9c5e2f xen/master) -Signed-off-by: Stefan Bader ---- - tools/debugger/gdbsx/xg/xg_main.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/tools/debugger/gdbsx/xg/xg_main.c b/tools/debugger/gdbsx/xg/xg_main.c -index d2eec0b..64c7484 100644 ---- a/tools/debugger/gdbsx/xg/xg_main.c -+++ b/tools/debugger/gdbsx/xg/xg_main.c -@@ -34,6 +34,7 @@ - * XGTRC(): generic trace utility - */ - -+#include - #include - #include - #include --- -1.7.9.5 - diff -Nru xen-4.2.2/debian/patches/tools-hotplug-install.diff xen-4.3.0/debian/patches/tools-hotplug-install.diff --- xen-4.2.2/debian/patches/tools-hotplug-install.diff 2012-01-31 13:45:53.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-hotplug-install.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ ---- a/tools/hotplug/common/Makefile -+++ b/tools/hotplug/common/Makefile -@@ -6,8 +6,8 @@ - # OS-independent hotplug scripts go in this directory - - # Xen scripts to go there. --XEN_SCRIPTS = $(HOTPLUGPATH) --XEN_SCRIPT_DATA = -+XEN_SCRIPTS = -+XEN_SCRIPT_DATA = $(HOTPLUGPATH) - - genpath-target = $(call buildmakevars2file,$(HOTPLUGPATH)) - $(eval $(genpath-target)) ---- a/tools/hotplug/Linux/vtpm-impl -+++ b/tools/hotplug/Linux/vtpm-impl -@@ -1,4 +1,3 @@ --#!/bin/bash - # =================================================================== - # - # Copyright (c) 2005, Intel Corp. diff -Nru xen-4.2.2/debian/patches/tools-hotplug-udevrules.diff xen-4.3.0/debian/patches/tools-hotplug-udevrules.diff --- xen-4.2.2/debian/patches/tools-hotplug-udevrules.diff 2012-08-13 20:01:17.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-hotplug-udevrules.diff 2013-07-23 12:51:13.000000000 +0000 @@ -1,6 +1,6 @@ --- a/tools/hotplug/Linux/xen-backend.rules +++ b/tools/hotplug/Linux/xen-backend.rules -@@ -6,11 +6,4 @@ +@@ -5,11 +5,4 @@ SUBSYSTEM=="xen-backend", KERNEL=="vif-*", ENV{UDEV_CALL}="1", ACTION=="offline", RUN+="/etc/xen/scripts/vif-setup offline type_if=vif" SUBSYSTEM=="xen-backend", KERNEL=="vscsi*", RUN+="/etc/xen/scripts/vscsi $env{ACTION}" SUBSYSTEM=="xen-backend", ACTION=="remove", ENV{UDEV_CALL}="1", RUN+="/etc/xen/scripts/xen-hotplug-cleanup" diff -Nru xen-4.2.2/debian/patches/tools-include-install.diff xen-4.3.0/debian/patches/tools-include-install.diff --- xen-4.2.2/debian/patches/tools-include-install.diff 2011-10-26 13:27:37.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-include-install.diff 2013-07-23 12:51:13.000000000 +0000 @@ -6,13 +6,13 @@ mkdir -p xen/libelf - ln -sf $(XEN_ROOT)/xen/include/public/COPYING xen ln -sf $(wildcard $(XEN_ROOT)/xen/include/public/*.h) xen - ln -sf $(addprefix $(XEN_ROOT)/xen/include/public/,arch-ia64 arch-x86 hvm io xsm) xen + ln -sf $(addprefix $(XEN_ROOT)/xen/include/public/,arch-x86 hvm io xsm) xen ln -sf ../xen-sys/$(XEN_OS) xen/sys -@@ -30,7 +29,6 @@ +@@ -28,7 +27,6 @@ $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xen/io $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xen/sys $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xen/xsm - $(INSTALL_DATA) xen/COPYING $(DESTDIR)$(INCLUDEDIR)/xen $(INSTALL_DATA) xen/*.h $(DESTDIR)$(INCLUDEDIR)/xen - $(INSTALL_DATA) xen/arch-ia64/*.h $(DESTDIR)$(INCLUDEDIR)/xen/arch-ia64 - $(INSTALL_DATA) xen/arch-ia64/hvm/*.h $(DESTDIR)$(INCLUDEDIR)/xen/arch-ia64/hvm + $(INSTALL_DATA) xen/arch-x86/*.h $(DESTDIR)$(INCLUDEDIR)/xen/arch-x86 + $(INSTALL_DATA) xen/arch-x86/hvm/*.h $(DESTDIR)$(INCLUDEDIR)/xen/arch-x86/hvm diff -Nru xen-4.2.2/debian/patches/tools-libfsimage-abiname.diff xen-4.3.0/debian/patches/tools-libfsimage-abiname.diff --- xen-4.2.2/debian/patches/tools-libfsimage-abiname.diff 2012-08-13 20:01:17.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-libfsimage-abiname.diff 2013-07-23 12:51:13.000000000 +0000 @@ -31,8 +31,8 @@ $(INSTALL_DATA) fsimage_plugin.h $(DESTDIR)$(INCLUDEDIR) $(INSTALL_DATA) fsimage_grub.h $(DESTDIR)$(INCLUDEDIR) @@ -34,13 +29,8 @@ - clean distclean: - rm -f $(PIC_OBJS) $(LIB) $(DEPS) + clean distclean:: + rm -f $(LIB) -libfsimage.so: libfsimage.so.$(MAJOR) - ln -sf $< $@ diff -Nru xen-4.2.2/debian/patches/tools-libxc-abiname.diff xen-4.3.0/debian/patches/tools-libxc-abiname.diff --- xen-4.2.2/debian/patches/tools-libxc-abiname.diff 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-libxc-abiname.diff 2013-07-23 12:51:13.000000000 +0000 @@ -4,13 +4,13 @@ XEN_ROOT = $(CURDIR)/../.. include $(XEN_ROOT)/tools/Rules.mk --MAJOR = 4.2 +-MAJOR = 4.3 -MINOR = 0 - CTRL_SRCS-y := CTRL_SRCS-y += xc_core.c CTRL_SRCS-$(CONFIG_X86) += xc_core_x86.c -@@ -96,12 +93,12 @@ +@@ -108,12 +105,12 @@ LIB := libxenctrl.a ifneq ($(stubdom),y) @@ -25,7 +25,7 @@ endif ifneq ($(stubdom),y) -@@ -122,15 +119,13 @@ +@@ -134,15 +131,13 @@ install: build $(INSTALL_DIR) $(DESTDIR)$(LIBDIR) $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR) @@ -45,7 +45,7 @@ $(INSTALL_DATA) xenguest.h $(DESTDIR)$(INCLUDEDIR) .PHONY: TAGS -@@ -159,22 +154,18 @@ +@@ -171,22 +166,18 @@ libxenctrl.a: $(CTRL_LIB_OBJS) $(AR) rc $@ $^ @@ -72,7 +72,7 @@ ln -sf $< $@ ifeq ($(CONFIG_MiniOS),y) -@@ -186,9 +177,9 @@ +@@ -198,9 +189,9 @@ xc_dom_bzimageloader.o: CFLAGS += $(call zlib-options,D) xc_dom_bzimageloader.opic: CFLAGS += $(call zlib-options,D) diff -Nru xen-4.2.2/debian/patches/tools-libxl-abiname.diff xen-4.3.0/debian/patches/tools-libxl-abiname.diff --- xen-4.2.2/debian/patches/tools-libxl-abiname.diff 2013-04-24 12:58:35.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-libxl-abiname.diff 2013-07-30 15:50:25.000000000 +0000 @@ -4,16 +4,16 @@ XEN_ROOT = $(CURDIR)/../.. include $(XEN_ROOT)/tools/Rules.mk --MAJOR = 2.0 +-MAJOR = 4.3 -MINOR = 0 - --XLUMAJOR = 1.0 --XLUMINOR = 1 +-XLUMAJOR = 4.3 +-XLUMINOR = 0 - CFLAGS += -Werror -Wno-format-zero-length -Wmissing-declarations \ -Wno-declaration-after-statement -Wformat-nonliteral CFLAGS += -I. -fPIC -@@ -155,26 +149,14 @@ +@@ -164,26 +158,20 @@ $(call move-if-changed,__libxl_type$*_json.h,_libxl_type$*_json.h) $(call move-if-changed,__libxl_type$*.c,_libxl_type$*.c) @@ -21,11 +21,12 @@ - ln -sf $< $@ - -libxenlight.so.$(MAJOR): libxenlight.so.$(MAJOR).$(MINOR) -- ln -sf $< $@ -- ++libxenlight.so: libxenlight-$(XEN_VERSION).so + ln -sf $< $@ + -libxenlight.so.$(MAJOR).$(MINOR): $(LIBXL_OBJS) - $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenlight.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXL_LIBS) $(APPEND_LDFLAGS) -+libxenlight.so: $(LIBXL_OBJS) ++libxenlight-$(XEN_VERSION).so: $(LIBXL_OBJS) + $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG),$@ $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXL_LIBS) $(APPEND_LDFLAGS) libxenlight.a: $(LIBXL_OBJS) @@ -35,28 +36,31 @@ - ln -sf $< $@ - -libxlutil.so.$(XLUMAJOR): libxlutil.so.$(XLUMAJOR).$(XLUMINOR) -- ln -sf $< $@ -- ++libxlutil.so: libxlutil-$(XEN_VERSION).so + ln -sf $< $@ + -libxlutil.so.$(XLUMAJOR).$(XLUMINOR): $(LIBXLU_OBJS) - $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxlutil.so.$(XLUMAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXLU_LIBS) $(APPEND_LDFLAGS) -+libxlutil.so: $(LIBXLU_OBJS) ++libxlutil-$(XEN_VERSION).so: $(LIBXLU_OBJS) + $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG),$@ $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXLU_LIBS) $(APPEND_LDFLAGS) libxlutil.a: $(LIBXLU_OBJS) $(AR) rcs libxlutil.a $^ -@@ -198,13 +180,9 @@ +@@ -207,13 +195,11 @@ $(INSTALL_DIR) $(DESTDIR)$(PRIVATE_BINDIR) $(INSTALL_PROG) xl $(DESTDIR)$(SBINDIR) $(INSTALL_PROG) libxl-save-helper $(DESTDIR)$(PRIVATE_BINDIR) - $(INSTALL_PROG) libxenlight.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR) - ln -sf libxenlight.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libxenlight.so.$(MAJOR) - ln -sf libxenlight.so.$(MAJOR) $(DESTDIR)$(LIBDIR)/libxenlight.so -+ $(INSTALL_PROG) libxenlight.so $(DESTDIR)$(LIBDIR) ++ $(INSTALL_PROG) libxenlight-$(XEN_VERSION).so $(DESTDIR)$(LIBDIR) ++ ln -sf libxenlight-$(XEN_VERSION).so $(DESTDIR)$(LIBDIR)/libxenlight.so $(INSTALL_DATA) libxenlight.a $(DESTDIR)$(LIBDIR) - $(INSTALL_PROG) libxlutil.so.$(XLUMAJOR).$(XLUMINOR) $(DESTDIR)$(LIBDIR) - ln -sf libxlutil.so.$(XLUMAJOR).$(XLUMINOR) $(DESTDIR)$(LIBDIR)/libxlutil.so.$(XLUMAJOR) - ln -sf libxlutil.so.$(XLUMAJOR) $(DESTDIR)$(LIBDIR)/libxlutil.so -+ $(INSTALL_PROG) libxlutil.so $(DESTDIR)$(LIBDIR) ++ $(INSTALL_PROG) libxlutil-$(XEN_VERSION).so $(DESTDIR)$(LIBDIR) ++ ln -sf libxlutil-$(XEN_VERSION).so $(DESTDIR)$(LIBDIR)/libxlutil.so $(INSTALL_DATA) libxlutil.a $(DESTDIR)$(LIBDIR) $(INSTALL_DATA) libxl.h libxl_event.h libxl_json.h _libxl_types.h _libxl_types_json.h _libxl_list.h libxl_utils.h libxl_uuid.h $(DESTDIR)$(INCLUDEDIR) $(INSTALL_DATA) bash-completion $(DESTDIR)$(BASH_COMPLETION_DIR)/xl.sh diff -Nru xen-4.2.2/debian/patches/tools-libxl-nopidfile.diff xen-4.3.0/debian/patches/tools-libxl-nopidfile.diff --- xen-4.2.2/debian/patches/tools-libxl-nopidfile.diff 2012-08-13 20:01:17.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-libxl-nopidfile.diff 2013-07-23 12:51:13.000000000 +0000 @@ -23,10 +23,10 @@ LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, errno, --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h -@@ -373,7 +373,6 @@ +@@ -377,7 +377,6 @@ + #define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f) + #define PCI_FUNC(devfn) ((devfn) & 0x07) #define AUTO_PHP_SLOT 0x100 - #define SYSFS_PCI_DEV "/sys/bus/pci/devices" - #define SYSFS_PCIBACK_DRIVER "/sys/bus/pci/drivers/pciback" -#define XENSTORE_PID_FILE "/var/run/xenstored.pid" #define PROC_PCI_NUM_RESOURCES 7 diff -Nru xen-4.2.2/debian/patches/tools-libxl-prefix.diff xen-4.3.0/debian/patches/tools-libxl-prefix.diff --- xen-4.2.2/debian/patches/tools-libxl-prefix.diff 2012-08-13 20:01:17.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-libxl-prefix.diff 2013-07-30 15:50:25.000000000 +0000 @@ -9,16 +9,16 @@ LIBXL_LIBS = LIBXL_LIBS = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS) -@@ -148,7 +150,7 @@ - $(call move-if-changed,__libxl_type$*.c,_libxl_type$*.c) +@@ -162,7 +164,7 @@ + ln -sf $< $@ - libxenlight.so: $(LIBXL_OBJS) + libxenlight-$(XEN_VERSION).so: $(LIBXL_OBJS) - $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG),$@ $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXL_LIBS) $(APPEND_LDFLAGS) + $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG),$@ $(LDFLAGS_LIBXL) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXL_LIBS) $(APPEND_LDFLAGS) libxenlight.a: $(LIBXL_OBJS) $(AR) rcs libxenlight.a $^ -@@ -160,7 +162,7 @@ +@@ -177,7 +179,7 @@ $(AR) rcs libxlutil.a $^ xl: $(XL_OBJS) libxlutil.so libxenlight.so @@ -27,13 +27,11 @@ libxl-save-helper: $(SAVE_HELPER_OBJS) libxenlight.so $(CC) $(LDFLAGS) -o $@ $(SAVE_HELPER_OBJS) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(APPEND_LDFLAGS) -@@ -170,17 +172,18 @@ +@@ -187,13 +189,12 @@ .PHONY: install install: all - $(INSTALL_DIR) $(DESTDIR)$(SBINDIR) -+ $(INSTALL_DIR) $(DESTDIR)$(PRIVATE_BINDIR) -+ $(INSTALL_DIR) $(DESTDIR)$(PRIVATE_LIBDIR) $(INSTALL_DIR) $(DESTDIR)$(LIBDIR) $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR) $(INSTALL_DIR) $(DESTDIR)$(BASH_COMPLETION_DIR) @@ -42,14 +40,8 @@ - $(INSTALL_PROG) xl $(DESTDIR)$(SBINDIR) + $(INSTALL_PROG) xl $(DESTDIR)$(PRIVATE_BINDIR) $(INSTALL_PROG) libxl-save-helper $(DESTDIR)$(PRIVATE_BINDIR) -- $(INSTALL_PROG) libxenlight.so $(DESTDIR)$(LIBDIR) -+ $(INSTALL_PROG) libxenlight.so $(DESTDIR)$(PRIVATE_LIBDIR) - $(INSTALL_DATA) libxenlight.a $(DESTDIR)$(LIBDIR) -- $(INSTALL_PROG) libxlutil.so $(DESTDIR)$(LIBDIR) -+ $(INSTALL_PROG) libxlutil.so $(DESTDIR)$(PRIVATE_LIBDIR) - $(INSTALL_DATA) libxlutil.a $(DESTDIR)$(LIBDIR) - $(INSTALL_DATA) libxl.h libxl_event.h libxl_json.h _libxl_types.h _libxl_types_json.h _libxl_list.h libxl_utils.h libxl_uuid.h $(DESTDIR)$(INCLUDEDIR) - $(INSTALL_DATA) bash-completion $(DESTDIR)$(BASH_COMPLETION_DIR)/xl.sh + $(INSTALL_PROG) libxenlight-$(XEN_VERSION).so $(DESTDIR)$(LIBDIR) + ln -sf libxenlight-$(XEN_VERSION).so $(DESTDIR)$(LIBDIR)/libxenlight.so --- a/tools/xenstat/libxenstat/Makefile +++ b/tools/xenstat/libxenstat/Makefile @@ -53,7 +53,7 @@ diff -Nru xen-4.2.2/debian/patches/tools-misc-prefix.diff xen-4.3.0/debian/patches/tools-misc-prefix.diff --- xen-4.2.2/debian/patches/tools-misc-prefix.diff 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-misc-prefix.diff 2013-07-23 12:51:13.000000000 +0000 @@ -1,6 +1,6 @@ --- a/tools/misc/Makefile +++ b/tools/misc/Makefile -@@ -42,12 +42,8 @@ +@@ -43,12 +43,8 @@ .PHONY: install install: build diff -Nru xen-4.2.2/debian/patches/tools-misc-rpath.diff xen-4.3.0/debian/patches/tools-misc-rpath.diff --- xen-4.2.2/debian/patches/tools-misc-rpath.diff 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-misc-rpath.diff 2013-07-23 12:51:13.000000000 +0000 @@ -1,6 +1,6 @@ --- a/tools/misc/Makefile +++ b/tools/misc/Makefile -@@ -33,6 +33,8 @@ +@@ -34,6 +34,8 @@ # Include configure output (config.h) to headers search path CFLAGS += -I$(XEN_ROOT)/tools diff -Nru xen-4.2.2/debian/patches/tools-ocaml-fix-build.diff xen-4.3.0/debian/patches/tools-ocaml-fix-build.diff --- xen-4.2.2/debian/patches/tools-ocaml-fix-build.diff 2013-07-17 07:30:36.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-ocaml-fix-build.diff 2013-07-23 12:51:13.000000000 +0000 @@ -2,10 +2,7 @@ Date: Tue, 29 Nov 2011 11:45:27 +0000 Subject: tools-ocaml-fix-build.diff -Fix the build of the ocaml libraries such that the cmxa files contain -appropriately versioned linker references (-lxenctrl-4.2) rather than -relative path in the build directory, enabling xen-api and friends to -build correctly. +Fix the build of the ocaml libraries Signed-off-by: Jon Ludlam --- @@ -16,27 +13,23 @@ tools/ocaml/xenstored/Makefile | 4 +++- 5 files changed, 10 insertions(+), 10 deletions(-) -Index: xen-4.2.0/tools/Rules.mk -=================================================================== ---- xen-4.2.0.orig/tools/Rules.mk 2012-11-30 09:15:44.000000000 +0000 -+++ xen-4.2.0/tools/Rules.mk 2012-11-30 09:19:58.065089443 +0000 -@@ -24,10 +24,12 @@ +--- a/tools/Rules.mk ++++ b/tools/Rules.mk +@@ -23,10 +23,12 @@ + CFLAGS_libxenctrl = -I$(XEN_LIBXC) $(CFLAGS_xeninclude) LDLIBS_libxenctrl = $(XEN_LIBXC)/libxenctrl.so - SHLIB_libxenctrl = -Wl,-rpath-link=$(XEN_LIBXC) +LDLIBS_libxenctrl_SYSTEM = -lxenctrl-$(XEN_VERSION) + SHLIB_libxenctrl = -Wl,-rpath-link=$(XEN_LIBXC) CFLAGS_libxenguest = -I$(XEN_LIBXC) $(CFLAGS_xeninclude) LDLIBS_libxenguest = $(XEN_LIBXC)/libxenguest.so - SHLIB_libxenguest = -Wl,-rpath-link=L$(XEN_LIBXC) +LDLIBS_libxenguest_SYSTEM = -lxenguest-$(XEN_VERSION) + SHLIB_libxenguest = -Wl,-rpath-link=L$(XEN_LIBXC) CFLAGS_libxenstore = -I$(XEN_XENSTORE) $(CFLAGS_xeninclude) - LDLIBS_libxenstore = $(XEN_XENSTORE)/libxenstore.so -Index: xen-4.2.0/tools/ocaml/Makefile.rules -=================================================================== ---- xen-4.2.0.orig/tools/ocaml/Makefile.rules 2012-11-30 09:15:32.000000000 +0000 -+++ xen-4.2.0/tools/ocaml/Makefile.rules 2012-11-30 09:22:36.509875140 +0000 +--- a/tools/ocaml/Makefile.rules ++++ b/tools/ocaml/Makefile.rules @@ -58,14 +58,8 @@ # define a library target .cmxa and .cma @@ -54,10 +47,8 @@ endef define OCAML_NOC_LIBRARY_template -Index: xen-4.2.0/tools/ocaml/libs/eventchn/Makefile -=================================================================== ---- xen-4.2.0.orig/tools/ocaml/libs/eventchn/Makefile 2012-09-18 08:34:54.000000000 +0100 -+++ xen-4.2.0/tools/ocaml/libs/eventchn/Makefile 2012-11-30 09:18:14.148574145 +0000 +--- a/tools/ocaml/libs/eventchn/Makefile ++++ b/tools/ocaml/libs/eventchn/Makefile @@ -9,6 +9,7 @@ LIBS = xeneventchn.cma xeneventchn.cmxa @@ -66,10 +57,8 @@ all: $(INTF) $(LIBS) $(PROGRAMS) -Index: xen-4.2.0/tools/ocaml/libs/xc/Makefile -=================================================================== ---- xen-4.2.0.orig/tools/ocaml/libs/xc/Makefile 2012-09-18 08:34:54.000000000 +0100 -+++ xen-4.2.0/tools/ocaml/libs/xc/Makefile 2012-11-30 09:24:06.022319002 +0000 +--- a/tools/ocaml/libs/xc/Makefile ++++ b/tools/ocaml/libs/xc/Makefile @@ -10,6 +10,7 @@ LIBS = xenctrl.cma xenctrl.cmxa @@ -78,11 +67,9 @@ xenctrl_OBJS = $(OBJS) xenctrl_C_OBJS = xenctrl_stubs -Index: xen-4.2.0/tools/ocaml/xenstored/Makefile -=================================================================== ---- xen-4.2.0.orig/tools/ocaml/xenstored/Makefile 2012-09-18 08:34:54.000000000 +0100 -+++ xen-4.2.0/tools/ocaml/xenstored/Makefile 2012-11-30 09:18:14.148574145 +0000 -@@ -36,7 +36,9 @@ +--- a/tools/ocaml/xenstored/Makefile ++++ b/tools/ocaml/xenstored/Makefile +@@ -43,7 +43,9 @@ -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/xeneventchn.cmxa \ -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc $(OCAML_TOPLEVEL)/libs/xc/xenctrl.cmxa \ -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb $(OCAML_TOPLEVEL)/libs/xb/xenbus.cmxa \ diff -Nru xen-4.2.2/debian/patches/tools-pygrub-remove-static-solaris-support.patch xen-4.3.0/debian/patches/tools-pygrub-remove-static-solaris-support.patch --- xen-4.2.2/debian/patches/tools-pygrub-remove-static-solaris-support.patch 2012-08-13 20:01:17.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-pygrub-remove-static-solaris-support.patch 2013-07-23 12:51:13.000000000 +0000 @@ -8,7 +8,7 @@ import curses, _curses, curses.wrapper, curses.textpad, curses.ascii import getopt -@@ -627,51 +626,6 @@ +@@ -639,51 +638,6 @@ return grubcfg @@ -60,7 +60,7 @@ def sniff_netware(fs, cfg): if not fs.file_exists("/nwserver/xnloader.sys"): return cfg -@@ -833,10 +787,7 @@ +@@ -848,10 +802,7 @@ try: fs = fsimage.open(file, offset, bootfsoptions) diff -Nru xen-4.2.2/debian/patches/tools-python-xen-relative-path.diff xen-4.3.0/debian/patches/tools-python-xen-relative-path.diff --- xen-4.2.2/debian/patches/tools-python-xen-relative-path.diff 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-python-xen-relative-path.diff 2013-07-23 12:51:13.000000000 +0000 @@ -1,6 +1,6 @@ --- a/tools/python/xen/xm/create.py +++ b/tools/python/xen/xm/create.py -@@ -713,45 +713,39 @@ +@@ -695,45 +695,39 @@ return None config_image = [ vals.builder ] if vals.kernel: @@ -56,7 +56,7 @@ else: raise ValueError('Cannot find loader "%s"' % vals.loader) if vals.cmdline_ip: -@@ -1081,7 +1075,7 @@ +@@ -1032,7 +1026,7 @@ args = [ 'acpi', 'apic', 'boot', 'cpuid', 'cpuid_check', @@ -65,7 +65,7 @@ 'fda', 'fdb', 'gfx_passthru', 'guest_os_type', 'hap', 'hpet', -@@ -1103,6 +1097,8 @@ +@@ -1054,6 +1048,8 @@ for a in args: if a in vals.__dict__ and vals.__dict__[a] is not None: config_image.append([a, vals.__dict__[a]]) @@ -74,7 +74,7 @@ if vals.vncpasswd is not None: config_image.append(['vncpasswd', vals.vncpasswd]) -@@ -1171,10 +1167,9 @@ +@@ -1120,10 +1116,9 @@ config_image = configure_image(vals) if vals.bootloader: @@ -109,7 +109,7 @@ log.debug("[xc_restore]: %s", string.join(cmd)) --- a/tools/python/xen/xend/XendConfig.py +++ b/tools/python/xen/xend/XendConfig.py -@@ -494,11 +494,11 @@ +@@ -493,11 +493,11 @@ if self.is_hvm() or self.has_rfb(): if 'device_model' not in self['platform']: @@ -123,7 +123,7 @@ # If the device_model is not set the os.path.exists() would raise # an exception so we return our error message instead if applicable if not self['platform']['device_model']: -@@ -529,14 +529,14 @@ +@@ -528,14 +528,14 @@ # Old configs may have hvmloader set as PV_kernel param if self.has_key('PV_kernel') and self['PV_kernel'] != '': if self['PV_kernel'] == 'hvmloader': @@ -141,7 +141,7 @@ if not os.path.exists(self['platform']['loader']): raise VmError("kernel '%s' not found" % str(self['platform']['loader'])) -@@ -1663,7 +1663,7 @@ +@@ -1653,7 +1653,7 @@ # is invoked for pvfb services if 'device_model' not in target['platform']: target['platform']['device_model'] = \ diff -Nru xen-4.2.2/debian/patches/tools-tests-hardening-fallout.patch xen-4.3.0/debian/patches/tools-tests-hardening-fallout.patch --- xen-4.2.2/debian/patches/tools-tests-hardening-fallout.patch 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-tests-hardening-fallout.patch 2013-08-11 20:19:40.000000000 +0000 @@ -0,0 +1,27 @@ +Description: Add missing return value checks in tools/tests +Author: Bastian Blank +Origin: vendor +Forwarded: yes +--- +--- a/tools/tests/mce-test/tools/xen-mceinj.c ++++ b/tools/tests/mce-test/tools/xen-mceinj.c +@@ -92,7 +92,8 @@ + va_list args; + + va_start(args, fmt); +- vasprintf(&buf, fmt, args); ++ if (vasprintf(&buf, fmt, args) < 0) ++ abort(); + fprintf(LOGFILE, "%s", buf); + va_end(args); + free(buf); +@@ -104,7 +105,8 @@ + va_list args; + + va_start(args, fmt); +- vasprintf(&buf, fmt, args); ++ if (vasprintf(&buf, fmt, args) < 0) ++ abort(); + perror(buf); + va_end(args); + free(buf); diff -Nru xen-4.2.2/debian/patches/tools-xenstore-compatibility.diff xen-4.3.0/debian/patches/tools-xenstore-compatibility.diff --- xen-4.2.2/debian/patches/tools-xenstore-compatibility.diff 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-xenstore-compatibility.diff 2013-07-23 12:51:13.000000000 +0000 @@ -1,6 +1,6 @@ --- a/tools/xenstore/xenstore_client.c +++ b/tools/xenstore/xenstore_client.c -@@ -633,7 +633,7 @@ +@@ -629,7 +629,7 @@ max_width = ws.ws_col - 2; } @@ -11,7 +11,7 @@ again: --- a/tools/xenstore/xs.c +++ b/tools/xenstore/xs.c -@@ -264,17 +264,19 @@ +@@ -278,17 +278,19 @@ struct xs_handle *xs_domain_open(void) { @@ -40,5 +40,5 @@ #define XS_OPEN_SOCKETONLY 1UL<<1 +#define XS_OPEN_DOMAINONLY 1UL<<2 - struct xs_handle; - typedef uint32_t xs_transaction_t; + /* + * Setting XS_UNWATCH_FILTER arranges that after xs_unwatch, no diff -Nru xen-4.2.2/debian/patches/tools-xenstore-prefix.diff xen-4.3.0/debian/patches/tools-xenstore-prefix.diff --- xen-4.2.2/debian/patches/tools-xenstore-prefix.diff 2012-06-18 19:43:47.000000000 +0000 +++ xen-4.3.0/debian/patches/tools-xenstore-prefix.diff 2013-07-23 12:51:13.000000000 +0000 @@ -1,6 +1,6 @@ --- a/tools/xenstore/Makefile +++ b/tools/xenstore/Makefile -@@ -55,10 +55,10 @@ +@@ -58,10 +58,10 @@ init-xenstore-domain.o: CFLAGS += $(CFLAGS_libxenguest) init-xenstore-domain: init-xenstore-domain.o $(LIBXENSTORE) @@ -13,7 +13,7 @@ xenstored.a: $(XENSTORED_OBJS) $(AR) cr $@ $^ -@@ -106,17 +106,17 @@ +@@ -109,17 +109,17 @@ .PHONY: install install: all diff -Nru xen-4.2.2/debian/patches/ubuntu-qemu-disable-qemu-upstream.diff xen-4.3.0/debian/patches/ubuntu-qemu-disable-qemu-upstream.diff --- xen-4.2.2/debian/patches/ubuntu-qemu-disable-qemu-upstream.diff 2013-07-17 07:31:16.000000000 +0000 +++ xen-4.3.0/debian/patches/ubuntu-qemu-disable-qemu-upstream.diff 2013-09-27 13:48:07.000000000 +0000 @@ -8,12 +8,15 @@ Origin: vendor, created on merge Author: Stefan Bader -Index: xen-4.2.0/tools/Makefile +Index: xen-4.3.0/tools/Makefile =================================================================== ---- xen-4.2.0.orig/tools/Makefile 2012-11-13 09:45:45.153857773 +0100 -+++ xen-4.2.0/tools/Makefile 2012-11-13 11:31:07.156764487 +0100 -@@ -32,7 +32,7 @@ +--- xen-4.3.0.orig/tools/Makefile 2013-07-09 17:48:16.596976275 +0200 ++++ xen-4.3.0/tools/Makefile 2013-07-12 12:38:23.099489632 +0200 +@@ -28,9 +28,10 @@ SUBDIRS-$(CONFIG_Linux) += libvchan + # do not recurse in to a dir we are about to delete + ifneq "$(MAKECMDGOALS)" "distclean" CONFIG_QEMU = $(CURDIR)/../qemu ++#QEMU_UPSTREAM_URL = $(CURDIR)/../qemu-xen ifneq ($(wildcard $(CONFIG_QEMU)),) SUBDIRS-$(CONFIG_IOEMU) += qemu-xen-traditional-dir -SUBDIRS-$(CONFIG_IOEMU) += qemu-xen-dir diff -Nru xen-4.2.2/debian/patches/ubuntu-qemu-upstream-location.patch xen-4.3.0/debian/patches/ubuntu-qemu-upstream-location.patch --- xen-4.2.2/debian/patches/ubuntu-qemu-upstream-location.patch 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/patches/ubuntu-qemu-upstream-location.patch 2013-09-27 13:48:18.000000000 +0000 @@ -0,0 +1,29 @@ +From: Stefan Bader +Date: Mon, 15 Jul 2013 14:29:52 +0200 +Subject: Change qemu-system-i386 paths used to point to the default one + +Signed-off-by: Stefan Bader + +Index: xen-4.3.0/tools/hotplug/Linux/init.d/sysconfig.xencommons +=================================================================== +--- xen-4.3.0.orig/tools/hotplug/Linux/init.d/sysconfig.xencommons 2013-07-12 12:39:11.779727620 +0200 ++++ xen-4.3.0/tools/hotplug/Linux/init.d/sysconfig.xencommons 2013-07-12 12:39:36.603848983 +0200 +@@ -14,4 +14,4 @@ + #XENBACKENDD_DEBUG=[yes|on|1] + + # qemu path +-#QEMU_XEN=/usr/lib/xen/bin/qemu-system-i386 ++#QEMU_XEN=/usr/bin/qemu-system-i386 +Index: xen-4.3.0/tools/libxl/libxl_dm.c +=================================================================== +--- xen-4.3.0.orig/tools/libxl/libxl_dm.c 2013-07-12 12:39:11.803727739 +0200 ++++ xen-4.3.0/tools/libxl/libxl_dm.c 2013-07-12 12:39:36.603848983 +0200 +@@ -50,7 +50,7 @@ const char *libxl__domain_device_model(l + dm = libxl__abs_path(gc, "qemu-dm", libxl__libexec_path()); + break; + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: +- dm = libxl__abs_path(gc, "qemu-system-i386", libxl__libexec_path()); ++ dm = libxl__abs_path(gc, "qemu-system-i386", "/usr/bin"); + break; + default: + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, diff -Nru xen-4.2.2/debian/patches/ubuntu-tools-armhf-without-ocaml.patch xen-4.3.0/debian/patches/ubuntu-tools-armhf-without-ocaml.patch --- xen-4.2.2/debian/patches/ubuntu-tools-armhf-without-ocaml.patch 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/patches/ubuntu-tools-armhf-without-ocaml.patch 2013-09-27 13:48:38.000000000 +0000 @@ -0,0 +1,29 @@ +From: Stefan Bader +Date: Fri, 02 Aug 2013 16:47:22 +0100 +Subject: tools: Disable ocaml build on armhf + +Problem right now is that the ocaml library seems to have hard +dependencies on some cpuid related functions which only exist +on x86. +Until that is sorted out upstream (apparently when they build +for Arm they have had no ocaml package installed), prevent +the build. This also needs some modifications in debian/rules.real +but those won't show up in the patch. + +Signed-off-by: Stefan Bader + +Index: xen-4.3.0/tools/Makefile +=================================================================== +--- xen-4.3.0.orig/tools/Makefile 2013-07-25 08:16:33.000000000 +0100 ++++ xen-4.3.0/tools/Makefile 2013-08-02 16:46:28.670319328 +0100 +@@ -47,8 +47,10 @@ SUBDIRS-$(CONFIG_TESTS) += tests + ifeq ($(XEN_COMPILE_ARCH),$(XEN_TARGET_ARCH)) + SUBDIRS-y += python + SUBDIRS-y += pygrub ++ifeq ($(filter arm32 arm64,$(XEN_COMPILE_ARCH)),) + SUBDIRS-$(OCAML_TOOLS) += ocaml + endif ++endif + + # For the sake of linking, set the sys-root + ifneq ($(CROSS_COMPILE),) diff -Nru xen-4.2.2/debian/patches/ubuntu-tools-firmware-etherboot-kvm-ipxe.diff xen-4.3.0/debian/patches/ubuntu-tools-firmware-etherboot-kvm-ipxe.diff --- xen-4.2.2/debian/patches/ubuntu-tools-firmware-etherboot-kvm-ipxe.diff 2013-07-17 07:31:29.000000000 +0000 +++ xen-4.3.0/debian/patches/ubuntu-tools-firmware-etherboot-kvm-ipxe.diff 2013-09-27 13:49:37.000000000 +0000 @@ -9,24 +9,24 @@ Origin: vendor, created on merge Author: Stefan Bader -Index: xen-4.2.0/Config.mk +Index: xen-4.3.0/Config.mk =================================================================== ---- xen-4.2.0.orig/Config.mk 2012-11-13 08:53:17.000000000 +0100 -+++ xen-4.2.0/Config.mk 2012-11-13 09:39:35.356049931 +0100 -@@ -207,7 +207,7 @@ - # Sun Mar 11 09:27:07 2012 -0400 - # Update version to 1.6.3.2 +--- xen-4.3.0.orig/Config.mk 2013-07-09 17:47:54.252867040 +0200 ++++ xen-4.3.0/Config.mk 2013-07-09 17:48:28.585034881 +0200 +@@ -217,7 +217,7 @@ SEABIOS_UPSTREAM_TAG ?= 3a28511b46f0c2af + # Wed Jun 26 16:30:45 2013 +0100 + # xen: Don't perform SMP setup. -ETHERBOOT_NICS ?= rtl8139 e1000_82540 +ETHERBOOT_NICS ?= rtl8139 e1000 # Specify which qemu-dm to use. This may be `ioemu' to use the old # Mercurial in-tree version, or a local directory, or a git URL. -Index: xen-4.2.0/tools/firmware/hvmloader/Makefile +Index: xen-4.3.0/tools/firmware/hvmloader/Makefile =================================================================== ---- xen-4.2.0.orig/tools/firmware/hvmloader/Makefile 2012-11-13 08:53:17.000000000 +0100 -+++ xen-4.2.0/tools/firmware/hvmloader/Makefile 2012-11-13 09:39:08.739919820 +0100 -@@ -48,7 +48,7 @@ +--- xen-4.3.0.orig/tools/firmware/hvmloader/Makefile 2013-07-09 17:48:19.928992571 +0200 ++++ xen-4.3.0/tools/firmware/hvmloader/Makefile 2013-07-09 17:48:28.585034881 +0200 +@@ -48,7 +48,7 @@ CIRRUSVGA_ROM := ../vgabios/VGABIOS-lgpl else CIRRUSVGA_ROM := ../vgabios/VGABIOS-lgpl-latest.cirrus.bin endif diff -Nru xen-4.2.2/debian/patches/version.patch xen-4.3.0/debian/patches/version.patch --- xen-4.2.2/debian/patches/version.patch 2012-08-13 20:01:17.000000000 +0000 +++ xen-4.3.0/debian/patches/version.patch 2013-07-23 12:51:13.000000000 +0000 @@ -7,7 +7,7 @@ @DPATCH@ --- a/xen/Makefile +++ b/xen/Makefile -@@ -97,20 +97,19 @@ +@@ -116,20 +116,19 @@ @rm -f $@1 $@2 # compile.h contains dynamic build info. Rebuilt on every 'make' invocation. @@ -22,7 +22,7 @@ -e 's/@@version@@/$(XEN_VERSION)/g' \ -e 's/@@subversion@@/$(XEN_SUBVERSION)/g' \ -e 's/@@extraversion@@/$(XEN_EXTRAVERSION)/g' \ - -e 's!@@changeset@@!$(shell ((hg parents --template "{date|date} {rev}:{node|short}" >/dev/null && hg parents --template "{date|date} {rev}:{node|short}") || echo "unavailable") 2>/dev/null)!g' \ + -e 's!@@changeset@@!$(shell tools/scmversion $(XEN_ROOT) || echo "unavailable")!g' \ + -e 's/@@system_distribution@@/$(shell lsb_release -is)/g' \ + -e 's/@@system_maintainer_domain@@/$(shell cd ../../../..; dpkg-parsechangelog | sed -ne 's,^Maintainer: .[^<]*<[^@>]*@\([^>]*\)>,\1,p')/g' \ + -e 's/@@system_maintainer_local@@/$(shell cd ../../../..; dpkg-parsechangelog | sed -ne 's,^Maintainer: .[^<]*<\([^@>]*\)@.*>,\1,p')/g' \ @@ -89,20 +89,20 @@ -} --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c -@@ -566,14 +566,11 @@ +@@ -608,14 +608,11 @@ serial_set_rx_handler(sercon_handle, serial_rx); /* HELLO WORLD --- start-of-day banner text. */ - spin_lock(&console_lock); - __putstr(xen_banner()); - spin_unlock(&console_lock); -- printk("Xen version %d.%d%s (%s@%s) (%s) %s\n", -+ printk("Xen version %d.%d%s (%s %s) (%s@%s) (%s) %s\n", +- printk("Xen version %d.%d%s (%s@%s) (%s) debug=%c %s\n", ++ printk("Xen version %d.%d%s (%s %s) (%s@%s) (%s) debug=%c %s\n", xen_major_version(), xen_minor_version(), xen_extra_version(), - xen_compile_by(), xen_compile_domain(), + xen_compile_system_distribution(), xen_compile_system_version(), + xen_compile_system_maintainer_local(), xen_compile_system_maintainer_domain(), - xen_compiler(), xen_compile_date()); + xen_compiler(), debug_build() ? 'y' : 'n', xen_compile_date()); - printk("Latest ChangeSet: %s\n", xen_changeset()); if ( opt_sync_console ) diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0001-libelf-abolish-libelf-relocate.c.patch xen-4.3.0/debian/patches/xsa55-4.2-0001-libelf-abolish-libelf-relocate.c.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0001-libelf-abolish-libelf-relocate.c.patch 2013-07-17 11:00:02.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0001-libelf-abolish-libelf-relocate.c.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,413 +0,0 @@ -From 9737484becab4a25159f1e985700eaee89690d34 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:15 +0100 -Subject: [PATCH 01/23] libelf: abolish libelf-relocate.c - -This file is not actually used. It's not built in Xen's instance of -libelf; in libxc's it's built but nothing in it is called. Do not -compile it in libxc, and delete it. - -This reduces the amount of work we need to do in forthcoming patches -to libelf (particularly since as libelf-relocate.c is not used it is -probably full of bugs). - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell ---- - tools/libxc/Makefile | 2 +- - xen/common/libelf/libelf-relocate.c | 372 ----------------------------------- - 2 files changed, 1 insertions(+), 373 deletions(-) - delete mode 100644 xen/common/libelf/libelf-relocate.c - -Index: xen-4.2.2/tools/libxc/Makefile -=================================================================== ---- xen-4.2.2.orig/tools/libxc/Makefile 2013-07-15 14:39:56.000000000 +0200 -+++ xen-4.2.2/tools/libxc/Makefile 2013-07-17 12:59:56.125242866 +0200 -@@ -50,7 +50,7 @@ vpath %.c ../../xen/common/libelf - CFLAGS += -I../../xen/common/libelf - - GUEST_SRCS-y += libelf-tools.c libelf-loader.c --GUEST_SRCS-y += libelf-dominfo.c libelf-relocate.c -+GUEST_SRCS-y += libelf-dominfo.c - - # new domain builder - GUEST_SRCS-y += xc_dom_core.c xc_dom_boot.c -Index: xen-4.2.2/xen/common/libelf/libelf-relocate.c -=================================================================== ---- xen-4.2.2.orig/xen/common/libelf/libelf-relocate.c 2013-04-23 18:42:55.000000000 +0200 -+++ /dev/null 1970-01-01 00:00:00.000000000 +0000 -@@ -1,372 +0,0 @@ --/* -- * ELF relocation code (not used by xen kernel right now). -- * -- * This library is free software; you can redistribute it and/or -- * modify it under the terms of the GNU Lesser General Public -- * License as published by the Free Software Foundation; -- * version 2.1 of the License. -- * -- * This library is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -- * Lesser General Public License for more details. -- * -- * You should have received a copy of the GNU Lesser General Public -- * License along with this library; if not, write to the Free Software -- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -- */ -- --#include "libelf-private.h" -- --/* ------------------------------------------------------------------------ */ -- --static const char *rel_names_i386[] = { -- "R_386_NONE", -- "R_386_32", -- "R_386_PC32", -- "R_386_GOT32", -- "R_386_PLT32", -- "R_386_COPY", -- "R_386_GLOB_DAT", -- "R_386_JMP_SLOT", -- "R_386_RELATIVE", -- "R_386_GOTOFF", -- "R_386_GOTPC", -- "R_386_32PLT", -- "R_386_TLS_TPOFF", -- "R_386_TLS_IE", -- "R_386_TLS_GOTIE", -- "R_386_TLS_LE", -- "R_386_TLS_GD", -- "R_386_TLS_LDM", -- "R_386_16", -- "R_386_PC16", -- "R_386_8", -- "R_386_PC8", -- "R_386_TLS_GD_32", -- "R_386_TLS_GD_PUSH", -- "R_386_TLS_GD_CALL", -- "R_386_TLS_GD_POP", -- "R_386_TLS_LDM_32", -- "R_386_TLS_LDM_PUSH", -- "R_386_TLS_LDM_CALL", -- "R_386_TLS_LDM_POP", -- "R_386_TLS_LDO_32", -- "R_386_TLS_IE_32", -- "R_386_TLS_LE_32", -- "R_386_TLS_DTPMOD32", -- "R_386_TLS_DTPOFF32", -- "R_386_TLS_TPOFF32", --}; -- --static int elf_reloc_i386(struct elf_binary *elf, int type, -- uint64_t addr, uint64_t value) --{ -- void *ptr = elf_get_ptr(elf, addr); -- uint32_t *u32; -- -- switch ( type ) -- { -- case 1 /* R_386_32 */ : -- u32 = ptr; -- *u32 += elf->reloc_offset; -- break; -- case 2 /* R_386_PC32 */ : -- /* nothing */ -- break; -- default: -- return -1; -- } -- return 0; --} -- --/* ------------------------------------------------------------------------ */ -- --static const char *rel_names_x86_64[] = { -- "R_X86_64_NONE", -- "R_X86_64_64", -- "R_X86_64_PC32", -- "R_X86_64_GOT32", -- "R_X86_64_PLT32", -- "R_X86_64_COPY", -- "R_X86_64_GLOB_DAT", -- "R_X86_64_JUMP_SLOT", -- "R_X86_64_RELATIVE", -- "R_X86_64_GOTPCREL", -- "R_X86_64_32", -- "R_X86_64_32S", -- "R_X86_64_16", -- "R_X86_64_PC16", -- "R_X86_64_8", -- "R_X86_64_PC8", -- "R_X86_64_DTPMOD64", -- "R_X86_64_DTPOFF64", -- "R_X86_64_TPOFF64", -- "R_X86_64_TLSGD", -- "R_X86_64_TLSLD", -- "R_X86_64_DTPOFF32", -- "R_X86_64_GOTTPOFF", -- "R_X86_64_TPOFF32", --}; -- --static int elf_reloc_x86_64(struct elf_binary *elf, int type, -- uint64_t addr, uint64_t value) --{ -- void *ptr = elf_get_ptr(elf, addr); -- uint64_t *u64; -- uint32_t *u32; -- int32_t *s32; -- -- switch ( type ) -- { -- case 1 /* R_X86_64_64 */ : -- u64 = ptr; -- value += elf->reloc_offset; -- *u64 = value; -- break; -- case 2 /* R_X86_64_PC32 */ : -- u32 = ptr; -- *u32 = value - addr; -- if ( *u32 != (uint32_t)(value - addr) ) -- { -- elf_err(elf, "R_X86_64_PC32 overflow: 0x%" PRIx32 -- " != 0x%" PRIx32 "\n", -- *u32, (uint32_t) (value - addr)); -- return -1; -- } -- break; -- case 10 /* R_X86_64_32 */ : -- u32 = ptr; -- value += elf->reloc_offset; -- *u32 = value; -- if ( *u32 != value ) -- { -- elf_err(elf, "R_X86_64_32 overflow: 0x%" PRIx32 -- " != 0x%" PRIx64 "\n", -- *u32, value); -- return -1; -- } -- break; -- case 11 /* R_X86_64_32S */ : -- s32 = ptr; -- value += elf->reloc_offset; -- *s32 = value; -- if ( *s32 != (int64_t) value ) -- { -- elf_err(elf, "R_X86_64_32S overflow: 0x%" PRIx32 -- " != 0x%" PRIx64 "\n", -- *s32, (int64_t) value); -- return -1; -- } -- break; -- default: -- return -1; -- } -- return 0; --} -- --/* ------------------------------------------------------------------------ */ -- --static struct relocs { -- const char **names; -- int count; -- int (*func) (struct elf_binary * elf, int type, uint64_t addr, -- uint64_t value); --} relocs[] = --/* *INDENT-OFF* */ --{ -- [EM_386] = { -- .names = rel_names_i386, -- .count = sizeof(rel_names_i386) / sizeof(rel_names_i386[0]), -- .func = elf_reloc_i386, -- }, -- [EM_X86_64] = { -- .names = rel_names_x86_64, -- .count = sizeof(rel_names_x86_64) / sizeof(rel_names_x86_64[0]), -- .func = elf_reloc_x86_64, -- } --}; --/* *INDENT-ON* */ -- --/* ------------------------------------------------------------------------ */ -- --static const char *rela_name(int machine, int type) --{ -- if ( machine > sizeof(relocs) / sizeof(relocs[0]) ) -- return "unknown mach"; -- if ( !relocs[machine].names ) -- return "unknown mach"; -- if ( type > relocs[machine].count ) -- return "unknown rela"; -- return relocs[machine].names[type]; --} -- --static int elf_reloc_section(struct elf_binary *elf, -- const elf_shdr * rels, -- const elf_shdr * sect, const elf_shdr * syms) --{ -- const void *ptr, *end; -- const elf_shdr *shdr; -- const elf_rela *rela; -- const elf_rel *rel; -- const elf_sym *sym; -- uint64_t s_type; -- uint64_t r_offset; -- uint64_t r_info; -- uint64_t r_addend; -- int r_type, r_sym; -- size_t rsize; -- uint64_t shndx, sbase, addr, value; -- const char *sname; -- int machine; -- -- machine = elf_uval(elf, elf->ehdr, e_machine); -- if ( (machine >= (sizeof(relocs) / sizeof(relocs[0]))) || -- (relocs[machine].func == NULL) ) -- { -- elf_err(elf, "%s: can't handle machine %d\n", -- __FUNCTION__, machine); -- return -1; -- } -- if ( elf_swap(elf) ) -- { -- elf_err(elf, "%s: non-native byte order, relocation not supported\n", -- __FUNCTION__); -- return -1; -- } -- -- s_type = elf_uval(elf, rels, sh_type); -- rsize = (SHT_REL == s_type) ? elf_size(elf, rel) : elf_size(elf, rela); -- ptr = elf_section_start(elf, rels); -- end = elf_section_end(elf, rels); -- -- for ( ; ptr < end; ptr += rsize ) -- { -- switch ( s_type ) -- { -- case SHT_REL: -- rel = ptr; -- r_offset = elf_uval(elf, rel, r_offset); -- r_info = elf_uval(elf, rel, r_info); -- r_addend = 0; -- break; -- case SHT_RELA: -- rela = ptr; -- r_offset = elf_uval(elf, rela, r_offset); -- r_info = elf_uval(elf, rela, r_info); -- r_addend = elf_uval(elf, rela, r_addend); -- break; -- default: -- /* can't happen */ -- return -1; -- } -- if ( elf_64bit(elf) ) -- { -- r_type = ELF64_R_TYPE(r_info); -- r_sym = ELF64_R_SYM(r_info); -- } -- else -- { -- r_type = ELF32_R_TYPE(r_info); -- r_sym = ELF32_R_SYM(r_info); -- } -- -- sym = elf_sym_by_index(elf, r_sym); -- shndx = elf_uval(elf, sym, st_shndx); -- switch ( shndx ) -- { -- case SHN_UNDEF: -- sname = "*UNDEF*"; -- sbase = 0; -- break; -- case SHN_COMMON: -- elf_err(elf, "%s: invalid section: %" PRId64 "\n", -- __FUNCTION__, shndx); -- return -1; -- case SHN_ABS: -- sname = "*ABS*"; -- sbase = 0; -- break; -- default: -- shdr = elf_shdr_by_index(elf, shndx); -- if ( shdr == NULL ) -- { -- elf_err(elf, "%s: invalid section: %" PRId64 "\n", -- __FUNCTION__, shndx); -- return -1; -- } -- sname = elf_section_name(elf, shdr); -- sbase = elf_uval(elf, shdr, sh_addr); -- } -- -- addr = r_offset; -- value = elf_uval(elf, sym, st_value); -- value += r_addend; -- -- if ( elf->log_callback && (elf->verbose > 1) ) -- { -- uint64_t st_name = elf_uval(elf, sym, st_name); -- const char *name = st_name ? elf->sym_strtab + st_name : "*NONE*"; -- -- elf_msg(elf, -- "%s: type %s [%d], off 0x%" PRIx64 ", add 0x%" PRIx64 "," -- " sym %s [0x%" PRIx64 "], sec %s [0x%" PRIx64 "]" -- " -> addr 0x%" PRIx64 " value 0x%" PRIx64 "\n", -- __FUNCTION__, rela_name(machine, r_type), r_type, r_offset, -- r_addend, name, elf_uval(elf, sym, st_value), sname, sbase, -- addr, value); -- } -- -- if ( relocs[machine].func(elf, r_type, addr, value) == -1 ) -- { -- elf_err(elf, "%s: unknown/unsupported reloc type %s [%d]\n", -- __FUNCTION__, rela_name(machine, r_type), r_type); -- return -1; -- } -- } -- return 0; --} -- --int elf_reloc(struct elf_binary *elf) --{ -- const elf_shdr *rels, *sect, *syms; -- uint64_t i, count, type; -- -- count = elf_shdr_count(elf); -- for ( i = 0; i < count; i++ ) -- { -- rels = elf_shdr_by_index(elf, i); -- type = elf_uval(elf, rels, sh_type); -- if ( (type != SHT_REL) && (type != SHT_RELA) ) -- continue; -- -- sect = elf_shdr_by_index(elf, elf_uval(elf, rels, sh_info)); -- syms = elf_shdr_by_index(elf, elf_uval(elf, rels, sh_link)); -- if ( NULL == sect || NULL == syms ) -- continue; -- -- if ( !(elf_uval(elf, sect, sh_flags) & SHF_ALLOC) ) -- { -- elf_msg(elf, "%s: relocations for %s, skipping\n", -- __FUNCTION__, elf_section_name(elf, sect)); -- continue; -- } -- -- elf_msg(elf, "%s: relocations for %s @ 0x%" PRIx64 "\n", -- __FUNCTION__, elf_section_name(elf, sect), -- elf_uval(elf, sect, sh_addr)); -- if ( elf_reloc_section(elf, rels, sect, syms) != 0 ) -- return -1; -- } -- return 0; --} -- --/* -- * Local variables: -- * mode: C -- * c-set-style: "BSD" -- * c-basic-offset: 4 -- * tab-width: 4 -- * indent-tabs-mode: nil -- * End: -- */ diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0002-libxc-introduce-xc_dom_seg_to_ptr_pages.patch xen-4.3.0/debian/patches/xsa55-4.2-0002-libxc-introduce-xc_dom_seg_to_ptr_pages.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0002-libxc-introduce-xc_dom_seg_to_ptr_pages.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0002-libxc-introduce-xc_dom_seg_to_ptr_pages.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -From a672da4b2d58ef12be9d7407160e9fb43cac75d9 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:16 +0100 -Subject: [PATCH 02/23] libxc: introduce xc_dom_seg_to_ptr_pages - -Provide a version of xc_dom_seg_to_ptr which returns the number of -guest pages it has actually mapped. This is useful for callers who -want to do range checking; we will use this later in this series. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell -Reviewed-by: Konrad Rzeszutek Wilk ---- - tools/libxc/xc_dom.h | 19 ++++++++++++++++--- - 1 files changed, 16 insertions(+), 3 deletions(-) - -diff --git a/tools/libxc/xc_dom.h b/tools/libxc/xc_dom.h -index 6a72aa9..9af2195 100644 ---- a/tools/libxc/xc_dom.h -+++ b/tools/libxc/xc_dom.h -@@ -278,14 +278,27 @@ void *xc_dom_pfn_to_ptr(struct xc_dom_image *dom, xen_pfn_t first, - void xc_dom_unmap_one(struct xc_dom_image *dom, xen_pfn_t pfn); - void xc_dom_unmap_all(struct xc_dom_image *dom); - --static inline void *xc_dom_seg_to_ptr(struct xc_dom_image *dom, -- struct xc_dom_seg *seg) -+static inline void *xc_dom_seg_to_ptr_pages(struct xc_dom_image *dom, -+ struct xc_dom_seg *seg, -+ xen_pfn_t *pages_out) - { - xen_vaddr_t segsize = seg->vend - seg->vstart; - unsigned int page_size = XC_DOM_PAGE_SIZE(dom); - xen_pfn_t pages = (segsize + page_size - 1) / page_size; -+ void *retval; -+ -+ retval = xc_dom_pfn_to_ptr(dom, seg->pfn, pages); -+ -+ *pages_out = retval ? pages : 0; -+ return retval; -+} -+ -+static inline void *xc_dom_seg_to_ptr(struct xc_dom_image *dom, -+ struct xc_dom_seg *seg) -+{ -+ xen_pfn_t dummy; - -- return xc_dom_pfn_to_ptr(dom, seg->pfn, pages); -+ return xc_dom_seg_to_ptr_pages(dom, seg, &dummy); - } - - static inline void *xc_dom_vaddr_to_ptr(struct xc_dom_image *dom, --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0003-libxc-Fix-range-checking-in-xc_dom_pfn_to_ptr-etc.patch xen-4.3.0/debian/patches/xsa55-4.2-0003-libxc-Fix-range-checking-in-xc_dom_pfn_to_ptr-etc.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0003-libxc-Fix-range-checking-in-xc_dom_pfn_to_ptr-etc.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0003-libxc-Fix-range-checking-in-xc_dom_pfn_to_ptr-etc.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,156 +0,0 @@ -From 8c738fa5c1f3cfcd935b6191b3526f7ac8b2a5bd Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:16 +0100 -Subject: [PATCH 03/23] libxc: Fix range checking in xc_dom_pfn_to_ptr etc. - -* Ensure that xc_dom_pfn_to_ptr (when called with count==0) does not - return a previously-allocated block which is entirely before the - requested pfn (!) - -* Provide a version of xc_dom_pfn_to_ptr, xc_dom_pfn_to_ptr_retcount, - which provides the length of the mapped region via an out parameter. - -* Change xc_dom_vaddr_to_ptr to always provide the length of the - mapped region and change the call site in xc_dom_binloader.c to - check it. The call site in xc_dom_load_elf_symtab will be corrected - in a forthcoming patch, and for now ignores the returned length. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson ---- - tools/libxc/xc_dom.h | 16 +++++++++++++--- - tools/libxc/xc_dom_binloader.c | 11 ++++++++++- - tools/libxc/xc_dom_core.c | 13 +++++++++++++ - tools/libxc/xc_dom_elfloader.c | 3 ++- - 4 files changed, 38 insertions(+), 5 deletions(-) - -diff --git a/tools/libxc/xc_dom.h b/tools/libxc/xc_dom.h -index 9af2195..9f8037e 100644 ---- a/tools/libxc/xc_dom.h -+++ b/tools/libxc/xc_dom.h -@@ -275,6 +275,8 @@ int xc_dom_alloc_segment(struct xc_dom_image *dom, - - void *xc_dom_pfn_to_ptr(struct xc_dom_image *dom, xen_pfn_t first, - xen_pfn_t count); -+void *xc_dom_pfn_to_ptr_retcount(struct xc_dom_image *dom, xen_pfn_t first, -+ xen_pfn_t count, xen_pfn_t *count_out); - void xc_dom_unmap_one(struct xc_dom_image *dom, xen_pfn_t pfn); - void xc_dom_unmap_all(struct xc_dom_image *dom); - -@@ -302,13 +304,21 @@ static inline void *xc_dom_seg_to_ptr(struct xc_dom_image *dom, - } - - static inline void *xc_dom_vaddr_to_ptr(struct xc_dom_image *dom, -- xen_vaddr_t vaddr) -+ xen_vaddr_t vaddr, -+ size_t *safe_region_out) - { - unsigned int page_size = XC_DOM_PAGE_SIZE(dom); - xen_pfn_t page = (vaddr - dom->parms.virt_base) / page_size; - unsigned int offset = (vaddr - dom->parms.virt_base) % page_size; -- void *ptr = xc_dom_pfn_to_ptr(dom, page, 0); -- return (ptr ? (ptr + offset) : NULL); -+ xen_pfn_t safe_region_count; -+ void *ptr; -+ -+ *safe_region_out = 0; -+ ptr = xc_dom_pfn_to_ptr_retcount(dom, page, 0, &safe_region_count); -+ if ( ptr == NULL ) -+ return ptr; -+ *safe_region_out = (safe_region_count << XC_DOM_PAGE_SHIFT(dom)) - offset; -+ return ptr; - } - - static inline int xc_dom_feature_translated(struct xc_dom_image *dom) -diff --git a/tools/libxc/xc_dom_binloader.c b/tools/libxc/xc_dom_binloader.c -index 769e97d..bde93f7 100644 ---- a/tools/libxc/xc_dom_binloader.c -+++ b/tools/libxc/xc_dom_binloader.c -@@ -249,6 +249,7 @@ static int xc_dom_load_bin_kernel(struct xc_dom_image *dom) - char *image = dom->kernel_blob; - char *dest; - size_t image_size = dom->kernel_size; -+ size_t dest_size; - uint32_t start_addr; - uint32_t load_end_addr; - uint32_t bss_end_addr; -@@ -272,7 +273,15 @@ static int xc_dom_load_bin_kernel(struct xc_dom_image *dom) - DOMPRINTF(" text_size: 0x%" PRIx32 "", text_size); - DOMPRINTF(" bss_size: 0x%" PRIx32 "", bss_size); - -- dest = xc_dom_vaddr_to_ptr(dom, dom->kernel_seg.vstart); -+ dest = xc_dom_vaddr_to_ptr(dom, dom->kernel_seg.vstart, &dest_size); -+ -+ if ( dest_size < text_size || -+ dest_size - text_size < bss_size ) -+ { -+ DOMPRINTF("%s: mapped region is too small for image", __FUNCTION__); -+ return -EINVAL; -+ } -+ - memcpy(dest, image + skip, text_size); - memset(dest + text_size, 0, bss_size); - -diff --git a/tools/libxc/xc_dom_core.c b/tools/libxc/xc_dom_core.c -index 2a01d7c..8913e41 100644 ---- a/tools/libxc/xc_dom_core.c -+++ b/tools/libxc/xc_dom_core.c -@@ -351,10 +351,19 @@ int xc_dom_try_gunzip(struct xc_dom_image *dom, void **blob, size_t * size) - void *xc_dom_pfn_to_ptr(struct xc_dom_image *dom, xen_pfn_t pfn, - xen_pfn_t count) - { -+ xen_pfn_t count_out_dummy; -+ return xc_dom_pfn_to_ptr_retcount(dom, pfn, count, &count_out_dummy); -+} -+ -+void *xc_dom_pfn_to_ptr_retcount(struct xc_dom_image *dom, xen_pfn_t pfn, -+ xen_pfn_t count, xen_pfn_t *count_out) -+{ - struct xc_dom_phys *phys; - unsigned int page_shift = XC_DOM_PAGE_SHIFT(dom); - char *mode = "unset"; - -+ *count_out = 0; -+ - if ( pfn > dom->total_pages || /* multiple checks to avoid overflows */ - count > dom->total_pages || - pfn > dom->total_pages - count ) -@@ -384,6 +393,7 @@ void *xc_dom_pfn_to_ptr(struct xc_dom_image *dom, xen_pfn_t pfn, - phys->count); - return NULL; - } -+ *count_out = count; - } - else - { -@@ -391,6 +401,9 @@ void *xc_dom_pfn_to_ptr(struct xc_dom_image *dom, xen_pfn_t pfn, - just hand out a pointer to it */ - if ( pfn < phys->first ) - continue; -+ if ( pfn >= phys->first + phys->count ) -+ continue; -+ *count_out = phys->count - (pfn - phys->first); - } - return phys->ptr + ((pfn - phys->first) << page_shift); - } -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index 2e69559..031b5b6 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -130,10 +130,11 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - - if ( load ) - { -+ size_t allow_size; /* will be used in a forthcoming XSA-55 patch */ - if ( !dom->bsd_symtab_start ) - return 0; - size = dom->kernel_seg.vend - dom->bsd_symtab_start; -- hdr = xc_dom_vaddr_to_ptr(dom, dom->bsd_symtab_start); -+ hdr = xc_dom_vaddr_to_ptr(dom, dom->bsd_symtab_start, &allow_size); - *(int *)hdr = size - sizeof(int); - } - else --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0004-libelf-add-struct-elf_binary-parameter-to-elf_load_i.patch xen-4.3.0/debian/patches/xsa55-4.2-0004-libelf-add-struct-elf_binary-parameter-to-elf_load_i.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0004-libelf-add-struct-elf_binary-parameter-to-elf_load_i.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0004-libelf-add-struct-elf_binary-parameter-to-elf_load_i.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -From 035634047d10c678cbb8801c4263747bdaf4e5b1 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:16 +0100 -Subject: [PATCH 04/23] libelf: add `struct elf_binary*' parameter to elf_load_image - -The meat of this function is going to need a copy of the elf pointer, -in forthcoming patches. - -No functional change in this patch. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell -Reviewed-by: Konrad Rzeszutek Wilk ---- - xen/common/libelf/libelf-loader.c | 8 +++++--- - 1 files changed, 5 insertions(+), 3 deletions(-) - -diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c -index ab58b8b..0559d88 100644 ---- a/xen/common/libelf/libelf-loader.c -+++ b/xen/common/libelf/libelf-loader.c -@@ -108,7 +108,8 @@ void elf_set_log(struct elf_binary *elf, elf_log_callback *log_callback, - elf->verbose = verbose; - } - --static int elf_load_image(void *dst, const void *src, uint64_t filesz, uint64_t memsz) -+static int elf_load_image(struct elf_binary *elf, -+ void *dst, const void *src, uint64_t filesz, uint64_t memsz) - { - memcpy(dst, src, filesz); - memset(dst + filesz, 0, memsz - filesz); -@@ -122,7 +123,8 @@ void elf_set_verbose(struct elf_binary *elf) - elf->verbose = 1; - } - --static int elf_load_image(void *dst, const void *src, uint64_t filesz, uint64_t memsz) -+static int elf_load_image(struct elf_binary *elf, -+ void *dst, const void *src, uint64_t filesz, uint64_t memsz) - { - int rc; - if ( filesz > ULONG_MAX || memsz > ULONG_MAX ) -@@ -279,7 +281,7 @@ int elf_load_binary(struct elf_binary *elf) - dest = elf_get_ptr(elf, paddr); - elf_msg(elf, "%s: phdr %" PRIu64 " at 0x%p -> 0x%p\n", - __func__, i, dest, dest + filesz); -- if ( elf_load_image(dest, elf->image + offset, filesz, memsz) != 0 ) -+ if ( elf_load_image(elf, dest, elf->image + offset, filesz, memsz) != 0 ) - return -1; - } - --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0005-libelf-abolish-elf_sval-and-elf_access_signed.patch xen-4.3.0/debian/patches/xsa55-4.2-0005-libelf-abolish-elf_sval-and-elf_access_signed.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0005-libelf-abolish-elf_sval-and-elf_access_signed.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0005-libelf-abolish-elf_sval-and-elf_access_signed.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -From 83ec905922b496e1a5756e3a88405eb6c2c6ba88 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:16 +0100 -Subject: [PATCH 05/23] libelf: abolish elf_sval and elf_access_signed - -These are not used anywhere. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell ---- - xen/common/libelf/libelf-tools.c | 28 ---------------------------- - xen/include/xen/libelf.h | 11 ----------- - 2 files changed, 0 insertions(+), 39 deletions(-) - -diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c -index cb97908..2f54142 100644 ---- a/xen/common/libelf/libelf-tools.c -+++ b/xen/common/libelf/libelf-tools.c -@@ -48,34 +48,6 @@ uint64_t elf_access_unsigned(struct elf_binary * elf, const void *ptr, - } - } - --int64_t elf_access_signed(struct elf_binary *elf, const void *ptr, -- uint64_t offset, size_t size) --{ -- int need_swap = elf_swap(elf); -- const int8_t *s8; -- const int16_t *s16; -- const int32_t *s32; -- const int64_t *s64; -- -- switch ( size ) -- { -- case 1: -- s8 = ptr + offset; -- return *s8; -- case 2: -- s16 = ptr + offset; -- return need_swap ? bswap_16(*s16) : *s16; -- case 4: -- s32 = ptr + offset; -- return need_swap ? bswap_32(*s32) : *s32; -- case 8: -- s64 = ptr + offset; -- return need_swap ? bswap_64(*s64) : *s64; -- default: -- return 0; -- } --} -- - uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr) - { - int elf_round = (elf_64bit(elf) ? 8 : 4) - 1; -diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h -index e8f6508..38e490c 100644 ---- a/xen/include/xen/libelf.h -+++ b/xen/include/xen/libelf.h -@@ -136,23 +136,12 @@ struct elf_binary { - offsetof(typeof(*(str)),e32.elem), \ - sizeof((str)->e32.elem))) - --#define elf_sval(elf, str, elem) \ -- ((ELFCLASS64 == (elf)->class) \ -- ? elf_access_signed((elf), (str), \ -- offsetof(typeof(*(str)),e64.elem), \ -- sizeof((str)->e64.elem)) \ -- : elf_access_signed((elf), (str), \ -- offsetof(typeof(*(str)),e32.elem), \ -- sizeof((str)->e32.elem))) -- - #define elf_size(elf, str) \ - ((ELFCLASS64 == (elf)->class) \ - ? sizeof((str)->e64) : sizeof((str)->e32)) - - uint64_t elf_access_unsigned(struct elf_binary *elf, const void *ptr, - uint64_t offset, size_t size); --int64_t elf_access_signed(struct elf_binary *elf, const void *ptr, -- uint64_t offset, size_t size); - - uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr); - --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0006-libelf-move-include-of-asm-guest_access.h-to-top-of-.patch xen-4.3.0/debian/patches/xsa55-4.2-0006-libelf-move-include-of-asm-guest_access.h-to-top-of-.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0006-libelf-move-include-of-asm-guest_access.h-to-top-of-.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0006-libelf-move-include-of-asm-guest_access.h-to-top-of-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -From 682a04488e7b3bd6c3448ab60599566eb7c6177a Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:16 +0100 -Subject: [PATCH 06/23] libelf: move include of to top of file - -libelf-loader.c #includes , when being compiled -for Xen. Currently it does this in the middle of the file. - -Move this #include to the top of the file, before libelf-private.h. -This is necessary because in forthcoming patches we will introduce -private #defines of memcpy etc. which would interfere with definitions -in headers #included from guest_access.h. - -No semantic or functional change in this patch. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell -Reviewed-by: Konrad Rzeszutek Wilk ---- - xen/common/libelf/libelf-loader.c | 5 ++++- - 1 files changed, 4 insertions(+), 1 deletions(-) - -diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c -index 0559d88..ec0706b 100644 ---- a/xen/common/libelf/libelf-loader.c -+++ b/xen/common/libelf/libelf-loader.c -@@ -16,6 +16,10 @@ - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -+#ifdef __XEN__ -+#include -+#endif -+ - #include "libelf-private.h" - - /* ------------------------------------------------------------------------ */ -@@ -116,7 +120,6 @@ static int elf_load_image(struct elf_binary *elf, - return 0; - } - #else --#include - - void elf_set_verbose(struct elf_binary *elf) - { --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0007-libelf-xc_dom_load_elf_symtab-Do-not-use-syms-uninit.patch xen-4.3.0/debian/patches/xsa55-4.2-0007-libelf-xc_dom_load_elf_symtab-Do-not-use-syms-uninit.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0007-libelf-xc_dom_load_elf_symtab-Do-not-use-syms-uninit.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0007-libelf-xc_dom_load_elf_symtab-Do-not-use-syms-uninit.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -From de9089b449d2508b1ba05590905c7ebaee00c8c4 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:16 +0100 -Subject: [PATCH 07/23] libelf/xc_dom_load_elf_symtab: Do not use "syms" uninitialised - -xc_dom_load_elf_symtab (with load==0) calls elf_round_up, but it -mistakenly used the uninitialised variable "syms" when calculating -dom->bsd_symtab_start. This should be a reference to "elf". - -This change might have the effect of rounding the value differently. -Previously if the uninitialised value (a single byte on the stack) was -ELFCLASS64 (ie, 2), the alignment would be to 8 bytes, otherwise to 4. - -However, the value is calculated from dom->kernel_seg.vend so this -could only make a difference if that value wasn't already aligned to 8 -bytes. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell ---- - tools/libxc/xc_dom_elfloader.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index 031b5b6..e82f6e9 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -144,7 +144,7 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - hdr = xc_dom_malloc(dom, size); - if ( hdr == NULL ) - return 0; -- dom->bsd_symtab_start = elf_round_up(&syms, dom->kernel_seg.vend); -+ dom->bsd_symtab_start = elf_round_up(elf, dom->kernel_seg.vend); - } - - memcpy(hdr + sizeof(int), --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0008-libelf-introduce-macros-for-memory-access-and-pointe.patch xen-4.3.0/debian/patches/xsa55-4.2-0008-libelf-introduce-macros-for-memory-access-and-pointe.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0008-libelf-introduce-macros-for-memory-access-and-pointe.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0008-libelf-introduce-macros-for-memory-access-and-pointe.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,1196 +0,0 @@ -From 40020ab55a1e9a1674ddecdb70299fab4fe8579d Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:17 +0100 -Subject: [PATCH 08/23] libelf: introduce macros for memory access and pointer handling - -We introduce a collection of macros which abstract away all the -pointer arithmetic and dereferences used for accessing the input ELF -and the output area(s). We use the new macros everywhere. - -For now, these macros are semantically identical to the code they -replace, so this patch has no functional change. - -elf_is_elfbinary is an exception: since it doesn't take an elf*, we -need to handle it differently. In a future patch we will change it to -take, and check, a length parameter. For now we just mark it with a -fixme. - -That this patch has no functional change can be verified as follows: - - 0. Copy the scripts "comparison-generate" and "function-filter" - out of this commit message. - 1. Check out the tree before this patch. - 2. Run the script ../comparison-generate .... ../before - 3. Check out the tree after this patch. - 4. Run the script ../comparison-generate .... ../after - 5. diff --exclude=\*.[soi] -ruN before/ after/ |less - -Expect these differences: - * stubdom/zlib-x86_64/ztest*.s2 - The filename of this test file apparently contains the pid. - * xen/common/version.s2 - The xen build timestamp appears in two diff hunks. - -Verification that this is all that's needed: - In a completely built xen.git, - find * -name .*.d -type f | xargs grep -l libelf\.h - Expect results in: - xen/arch/x86: Checked above. - tools/libxc: Checked above. - tools/xcutils/readnotes: Checked above. - tools/xenstore: Checked above. - xen/common/libelf: - This is the build for the hypervisor; checked in B above. - stubdom: - We have one stubdom which reads ELFs using our libelf, - pvgrub, which is checked above. - -I have not done this verification for ARM. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell -Reviewed-by: Konrad Rzeszutek Wilk - --8<- comparison-generate -8<- - #!/bin/bash - # usage: - # cd xen.git - # .../comparison-generate OUR-CONFIG BUILD-RUNE-PREFIX ../before|../after - # eg: - # .../comparison-generate ~/work/.config 'schroot -pc64 --' ../before - set -ex - - test $# = 3 || need-exactly-three-arguments - - our_config=$1 - build_rune_prefix=$2 - result_dir=$3 - - git clean -x -d -f - - cp "$our_config" . - - cat <>.config - debug_symbols=n - CFLAGS += -save-temps - END - - perl -i~ -pe 's/ -g / -g0 / if m/^CFLAGS/' xen/Rules.mk - - if [ -f ./configure ]; then - $build_rune_prefix ./configure - fi - - $build_rune_prefix make -C xen - $build_rune_prefix make -C tools/include - $build_rune_prefix make -C stubdom grub - $build_rune_prefix make -C tools/libxc - $build_rune_prefix make -C tools/xenstore - $build_rune_prefix make -C tools/xcutils - - rm -rf "$result_dir" - mkdir "$result_dir" - - set +x - for f in `find xen tools stubdom -name \*.[soi]`; do - mkdir -p "$result_dir"/`dirname $f` - cp $f "$result_dir"/${f} - case $f in - *.s) - ../function-filter <$f >"$result_dir"/${f}2 - ;; - esac - done - - echo ok. --8<- - --8<- function-filter -8<- - #!/usr/bin/perl -w - # function-filter - # script for massaging gcc-generated labels to be consistent - use strict; - our @lines; - my $sedderybody = "sub seddery () {\n"; - while (<>) { - push @lines, $_; - if (m/^(__FUNCTION__|__func__)\.(\d+)\:/) { - $sedderybody .= " s/\\b$1\\.$2\\b/__XSA55MANGLED__$1.$./g;\n"; - } - } - $sedderybody .= "}\n1;\n"; - eval $sedderybody or die $@; - foreach (@lines) { - seddery(); - print or die $!; - } --8<- ---- - tools/libxc/xc_dom_elfloader.c | 30 +++--- - tools/libxc/xc_hvm_build_x86.c | 2 +- - tools/xcutils/readnotes.c | 26 +++--- - xen/common/libelf/libelf-dominfo.c | 51 +++++----- - xen/common/libelf/libelf-loader.c | 84 +++++++++-------- - xen/common/libelf/libelf-tools.c | 94 +++++++++--------- - xen/include/xen/libelf.h | 188 +++++++++++++++++++++++++++++++----- - 7 files changed, 312 insertions(+), 163 deletions(-) - -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index e82f6e9..cc0f206 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -115,9 +115,9 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - struct elf_binary *elf, int load) - { - struct elf_binary syms; -- const elf_shdr *shdr, *shdr2; -+ ELF_HANDLE_DECL_NONCONST(elf_shdr) shdr; ELF_HANDLE_DECL(elf_shdr) shdr2; - xen_vaddr_t symtab, maxaddr; -- char *hdr; -+ ELF_PTRVAL_CHAR hdr; - size_t size; - int h, count, type, i, tables = 0; - -@@ -147,11 +147,11 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - dom->bsd_symtab_start = elf_round_up(elf, dom->kernel_seg.vend); - } - -- memcpy(hdr + sizeof(int), -- elf->image, -+ elf_memcpy_safe(elf, hdr + sizeof(int), -+ ELF_IMAGE_BASE(elf), - elf_size(elf, elf->ehdr)); -- memcpy(hdr + sizeof(int) + elf_size(elf, elf->ehdr), -- elf->image + elf_uval(elf, elf->ehdr, e_shoff), -+ elf_memcpy_safe(elf, hdr + sizeof(int) + elf_size(elf, elf->ehdr), -+ ELF_IMAGE_BASE(elf) + elf_uval(elf, elf->ehdr, e_shoff), - elf_shdr_count(elf) * elf_size(elf, shdr)); - if ( elf_64bit(elf) ) - { -@@ -189,7 +189,7 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - count = elf_shdr_count(&syms); - for ( h = 0; h < count; h++ ) - { -- shdr = elf_shdr_by_index(&syms, h); -+ shdr = ELF_OBSOLETE_VOIDP_CAST elf_shdr_by_index(&syms, h); - type = elf_uval(&syms, shdr, sh_type); - if ( type == SHT_STRTAB ) - { -@@ -205,9 +205,9 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - if ( i == count ) - { - if ( elf_64bit(&syms) ) -- *(Elf64_Off*)(&shdr->e64.sh_offset) = 0; -+ elf_store_field(elf, shdr, e64.sh_offset, 0); - else -- *(Elf32_Off*)(&shdr->e32.sh_offset) = 0; -+ elf_store_field(elf, shdr, e32.sh_offset, 0); - continue; - } - } -@@ -216,9 +216,9 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - { - /* Mangled to be based on ELF header location. */ - if ( elf_64bit(&syms) ) -- *(Elf64_Off*)(&shdr->e64.sh_offset) = maxaddr - symtab; -+ elf_store_field(elf, shdr, e64.sh_offset, maxaddr - symtab); - else -- *(Elf32_Off*)(&shdr->e32.sh_offset) = maxaddr - symtab; -+ elf_store_field(elf, shdr, e32.sh_offset, maxaddr - symtab); - size = elf_uval(&syms, shdr, sh_size); - maxaddr = elf_round_up(&syms, maxaddr + size); - tables++; -@@ -230,7 +230,7 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - if ( load ) - { - shdr2 = elf_shdr_by_index(elf, h); -- memcpy((void*)elf_section_start(&syms, shdr), -+ elf_memcpy_safe(elf, ELF_OBSOLETE_VOIDP_CAST elf_section_start(&syms, shdr), - elf_section_start(elf, shdr2), - size); - } -@@ -238,9 +238,9 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - - /* Name is NULL. */ - if ( elf_64bit(&syms) ) -- *(Elf64_Word*)(&shdr->e64.sh_name) = 0; -+ elf_store_field(elf, shdr, e64.sh_name, 0); - else -- *(Elf32_Word*)(&shdr->e32.sh_name) = 0; -+ elf_store_field(elf, shdr, e32.sh_name, 0); - } - - if ( tables == 0 ) -@@ -275,7 +275,7 @@ static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom) - } - - /* Find the section-header strings table. */ -- if ( elf->sec_strtab == NULL ) -+ if ( ELF_PTRVAL_INVALID(elf->sec_strtab) ) - { - xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: ELF image" - " has no shstrtab", __FUNCTION__); -diff --git a/tools/libxc/xc_hvm_build_x86.c b/tools/libxc/xc_hvm_build_x86.c -index cf5d7fb..15b603d 100644 ---- a/tools/libxc/xc_hvm_build_x86.c -+++ b/tools/libxc/xc_hvm_build_x86.c -@@ -110,7 +110,7 @@ static int loadelfimage( - if ( elf->dest == NULL ) - goto err; - -- elf->dest += elf->pstart & (PAGE_SIZE - 1); -+ ELF_ADVANCE_DEST(elf, elf->pstart & (PAGE_SIZE - 1)); - - /* Load the initial elf image. */ - rc = elf_load_binary(elf); -diff --git a/tools/xcutils/readnotes.c b/tools/xcutils/readnotes.c -index c926186..2af047d 100644 ---- a/tools/xcutils/readnotes.c -+++ b/tools/xcutils/readnotes.c -@@ -61,13 +61,13 @@ struct setup_header { - } __attribute__((packed)); - - static void print_string_note(const char *prefix, struct elf_binary *elf, -- const elf_note *note) -+ ELF_HANDLE_DECL(elf_note) note) - { - printf("%s: %s\n", prefix, (char*)elf_note_desc(elf, note)); - } - - static void print_numeric_note(const char *prefix, struct elf_binary *elf, -- const elf_note *note) -+ ELF_HANDLE_DECL(elf_note) note) - { - uint64_t value = elf_note_numeric(elf, note); - int descsz = elf_uval(elf, note, descsz); -@@ -98,12 +98,12 @@ static void print_l1_mfn_valid_note(const char *prefix, struct elf_binary *elf, - - } - --static int print_notes(struct elf_binary *elf, const elf_note *start, const elf_note *end) -+static int print_notes(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) start, ELF_HANDLE_DECL(elf_note) end) - { -- const elf_note *note; -+ ELF_HANDLE_DECL(elf_note) note; - int notes_found = 0; - -- for ( note = start; note < end; note = elf_note_next(elf, note) ) -+ for ( note = start; ELF_HANDLE_PTRVAL(note) < ELF_HANDLE_PTRVAL(end); note = elf_note_next(elf, note) ) - { - if (0 != strcmp(elf_note_name(elf, note), "Xen")) - continue; -@@ -170,7 +170,7 @@ int main(int argc, char **argv) - void *image,*tmp; - struct stat st; - struct elf_binary elf; -- const elf_shdr *shdr; -+ ELF_HANDLE_DECL(elf_shdr) shdr; - int notes_found = 0; - - struct setup_header *hdr; -@@ -257,7 +257,7 @@ int main(int argc, char **argv) - count = elf_phdr_count(&elf); - for ( h=0; h < count; h++) - { -- const elf_phdr *phdr; -+ ELF_HANDLE_DECL(elf_phdr) phdr; - phdr = elf_phdr_by_index(&elf, h); - if (elf_uval(&elf, phdr, p_type) != PT_NOTE) - continue; -@@ -269,8 +269,8 @@ int main(int argc, char **argv) - continue; - - notes_found = print_notes(&elf, -- elf_segment_start(&elf, phdr), -- elf_segment_end(&elf, phdr)); -+ ELF_MAKE_HANDLE(elf_note, elf_segment_start(&elf, phdr)), -+ ELF_MAKE_HANDLE(elf_note, elf_segment_end(&elf, phdr))); - } - - if ( notes_found == 0 ) -@@ -278,13 +278,13 @@ int main(int argc, char **argv) - count = elf_shdr_count(&elf); - for ( h=0; h < count; h++) - { -- const elf_shdr *shdr; -+ ELF_HANDLE_DECL(elf_shdr) shdr; - shdr = elf_shdr_by_index(&elf, h); - if (elf_uval(&elf, shdr, sh_type) != SHT_NOTE) - continue; - notes_found = print_notes(&elf, -- elf_section_start(&elf, shdr), -- elf_section_end(&elf, shdr)); -+ ELF_MAKE_HANDLE(elf_note, elf_section_start(&elf, shdr)), -+ ELF_MAKE_HANDLE(elf_note, elf_section_end(&elf, shdr))); - if ( notes_found ) - fprintf(stderr, "using notes from SHT_NOTE section\n"); - -@@ -292,7 +292,7 @@ int main(int argc, char **argv) - } - - shdr = elf_shdr_by_name(&elf, "__xen_guest"); -- if (shdr) -+ if (ELF_HANDLE_VALID(shdr)) - printf("__xen_guest: %s\n", (char*)elf_section_start(&elf, shdr)); - - return 0; -diff --git a/xen/common/libelf/libelf-dominfo.c b/xen/common/libelf/libelf-dominfo.c -index 523837f..7140d59 100644 ---- a/xen/common/libelf/libelf-dominfo.c -+++ b/xen/common/libelf/libelf-dominfo.c -@@ -44,7 +44,7 @@ int elf_xen_parse_features(const char *features, - - for ( pos = 0; features[pos] != '\0'; pos += len ) - { -- memset(feature, 0, sizeof(feature)); -+ elf_memset_unchecked(feature, 0, sizeof(feature)); - for ( len = 0;; len++ ) - { - if ( len >= sizeof(feature)-1 ) -@@ -96,7 +96,7 @@ int elf_xen_parse_features(const char *features, - - int elf_xen_parse_note(struct elf_binary *elf, - struct elf_dom_parms *parms, -- const elf_note *note) -+ ELF_HANDLE_DECL(elf_note) note) - { - /* *INDENT-OFF* */ - static const struct { -@@ -215,15 +215,16 @@ int elf_xen_parse_note(struct elf_binary *elf, - - static int elf_xen_parse_notes(struct elf_binary *elf, - struct elf_dom_parms *parms, -- const void *start, const void *end) -+ ELF_PTRVAL_CONST_VOID start, -+ ELF_PTRVAL_CONST_VOID end) - { - int xen_elfnotes = 0; -- const elf_note *note; -+ ELF_HANDLE_DECL(elf_note) note; - - parms->elf_note_start = start; - parms->elf_note_end = end; -- for ( note = parms->elf_note_start; -- (void *)note < parms->elf_note_end; -+ for ( note = ELF_MAKE_HANDLE(elf_note, parms->elf_note_start); -+ ELF_HANDLE_PTRVAL(note) < parms->elf_note_end; - note = elf_note_next(elf, note) ) - { - if ( strcmp(elf_note_name(elf, note), "Xen") ) -@@ -241,45 +242,46 @@ static int elf_xen_parse_notes(struct elf_binary *elf, - int elf_xen_parse_guest_info(struct elf_binary *elf, - struct elf_dom_parms *parms) - { -- const char *h; -+ ELF_PTRVAL_CONST_CHAR h; - char name[32], value[128]; - int len; - - h = parms->guest_info; -- while ( *h ) -+#define STAR(h) (*(h)) -+ while ( STAR(h) ) - { -- memset(name, 0, sizeof(name)); -- memset(value, 0, sizeof(value)); -+ elf_memset_unchecked(name, 0, sizeof(name)); -+ elf_memset_unchecked(value, 0, sizeof(value)); - for ( len = 0;; len++, h++ ) - { - if ( len >= sizeof(name)-1 ) - break; -- if ( *h == '\0' ) -+ if ( STAR(h) == '\0' ) - break; -- if ( *h == ',' ) -+ if ( STAR(h) == ',' ) - { - h++; - break; - } -- if ( *h == '=' ) -+ if ( STAR(h) == '=' ) - { - h++; - for ( len = 0;; len++, h++ ) - { - if ( len >= sizeof(value)-1 ) - break; -- if ( *h == '\0' ) -+ if ( STAR(h) == '\0' ) - break; -- if ( *h == ',' ) -+ if ( STAR(h) == ',' ) - { - h++; - break; - } -- value[len] = *h; -+ value[len] = STAR(h); - } - break; - } -- name[len] = *h; -+ name[len] = STAR(h); - } - elf_msg(elf, "%s: %s=\"%s\"\n", __FUNCTION__, name, value); - -@@ -328,7 +330,8 @@ int elf_xen_parse_guest_info(struct elf_binary *elf, - static int elf_xen_note_check(struct elf_binary *elf, - struct elf_dom_parms *parms) - { -- if ( (parms->elf_note_start == NULL) && (parms->guest_info == NULL) ) -+ if ( (ELF_PTRVAL_INVALID(parms->elf_note_start)) && -+ (ELF_PTRVAL_INVALID(parms->guest_info)) ) - { - int machine = elf_uval(elf, elf->ehdr, e_machine); - if ( (machine == EM_386) || (machine == EM_X86_64) ) -@@ -457,12 +460,12 @@ static int elf_xen_addr_calc_check(struct elf_binary *elf, - int elf_xen_parse(struct elf_binary *elf, - struct elf_dom_parms *parms) - { -- const elf_shdr *shdr; -- const elf_phdr *phdr; -+ ELF_HANDLE_DECL(elf_shdr) shdr; -+ ELF_HANDLE_DECL(elf_phdr) phdr; - int xen_elfnotes = 0; - int i, count, rc; - -- memset(parms, 0, sizeof(*parms)); -+ elf_memset_unchecked(parms, 0, sizeof(*parms)); - parms->virt_base = UNSET_ADDR; - parms->virt_entry = UNSET_ADDR; - parms->virt_hypercall = UNSET_ADDR; -@@ -532,11 +535,11 @@ int elf_xen_parse(struct elf_binary *elf, - for ( i = 0; i < count; i++ ) - { - shdr = elf_shdr_by_name(elf, "__xen_guest"); -- if ( shdr ) -+ if ( ELF_HANDLE_VALID(shdr) ) - { - parms->guest_info = elf_section_start(elf, shdr); -- parms->elf_note_start = NULL; -- parms->elf_note_end = NULL; -+ parms->elf_note_start = ELF_INVALID_PTRVAL; -+ parms->elf_note_end = ELF_INVALID_PTRVAL; - elf_msg(elf, "%s: __xen_guest: \"%s\"\n", __FUNCTION__, - parms->guest_info); - elf_xen_parse_guest_info(elf, parms); -diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c -index ec0706b..0fef84c 100644 ---- a/xen/common/libelf/libelf-loader.c -+++ b/xen/common/libelf/libelf-loader.c -@@ -26,7 +26,7 @@ - - int elf_init(struct elf_binary *elf, const char *image, size_t size) - { -- const elf_shdr *shdr; -+ ELF_HANDLE_DECL(elf_shdr) shdr; - uint64_t i, count, section, offset; - - if ( !elf_is_elfbinary(image) ) -@@ -35,7 +35,7 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size) - return -1; - } - -- memset(elf, 0, sizeof(*elf)); -+ elf_memset_unchecked(elf, 0, sizeof(*elf)); - elf->image = image; - elf->size = size; - elf->ehdr = (elf_ehdr *)image; -@@ -65,7 +65,7 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size) - /* Find section string table. */ - section = elf_uval(elf, elf->ehdr, e_shstrndx); - shdr = elf_shdr_by_index(elf, section); -- if ( shdr != NULL ) -+ if ( ELF_HANDLE_VALID(shdr) ) - elf->sec_strtab = elf_section_start(elf, shdr); - - /* Find symbol table and symbol string table. */ -@@ -77,9 +77,9 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size) - continue; - elf->sym_tab = shdr; - shdr = elf_shdr_by_index(elf, elf_uval(elf, shdr, sh_link)); -- if ( shdr == NULL ) -+ if ( !ELF_HANDLE_VALID(shdr) ) - { -- elf->sym_tab = NULL; -+ elf->sym_tab = ELF_INVALID_HANDLE(elf_shdr); - continue; - } - elf->sym_strtab = elf_section_start(elf, shdr); -@@ -113,10 +113,11 @@ void elf_set_log(struct elf_binary *elf, elf_log_callback *log_callback, - } - - static int elf_load_image(struct elf_binary *elf, -- void *dst, const void *src, uint64_t filesz, uint64_t memsz) -+ ELF_PTRVAL_VOID dst, ELF_PTRVAL_CONST_VOID src, -+ uint64_t filesz, uint64_t memsz) - { -- memcpy(dst, src, filesz); -- memset(dst + filesz, 0, memsz - filesz); -+ elf_memcpy_safe(elf, dst, src, filesz); -+ elf_memset_safe(elf, dst + filesz, 0, memsz - filesz); - return 0; - } - #else -@@ -126,16 +127,17 @@ void elf_set_verbose(struct elf_binary *elf) - elf->verbose = 1; - } - --static int elf_load_image(struct elf_binary *elf, -- void *dst, const void *src, uint64_t filesz, uint64_t memsz) -+static int elf_load_image(struct elf_binary *elf, ELF_PTRVAL_VOID dst, ELF_PTRVAL_CONST_VOID src, uint64_t filesz, uint64_t memsz) - { - int rc; - if ( filesz > ULONG_MAX || memsz > ULONG_MAX ) - return -1; -- rc = raw_copy_to_guest(dst, src, filesz); -+ /* We trust the dom0 kernel image completely, so we don't care -+ * about overruns etc. here. */ -+ rc = raw_copy_to_guest(ELF_UNSAFE_PTR(dst), ELF_UNSAFE_PTR(src), filesz); - if ( rc != 0 ) - return -1; -- rc = raw_clear_guest(dst + filesz, memsz - filesz); -+ rc = raw_clear_guest(ELF_UNSAFE_PTR(dst + filesz), memsz - filesz); - if ( rc != 0 ) - return -1; - return 0; -@@ -146,10 +148,10 @@ static int elf_load_image(struct elf_binary *elf, - void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart) - { - uint64_t sz; -- const elf_shdr *shdr; -+ ELF_HANDLE_DECL(elf_shdr) shdr; - int i, type; - -- if ( !elf->sym_tab ) -+ if ( !ELF_HANDLE_VALID(elf->sym_tab) ) - return; - - pstart = elf_round_up(elf, pstart); -@@ -166,7 +168,7 @@ void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart) - for ( i = 0; i < elf_shdr_count(elf); i++ ) - { - shdr = elf_shdr_by_index(elf, i); -- type = elf_uval(elf, (elf_shdr *)shdr, sh_type); -+ type = elf_uval(elf, shdr, sh_type); - if ( (type == SHT_STRTAB) || (type == SHT_SYMTAB) ) - sz = elf_round_up(elf, sz + elf_uval(elf, shdr, sh_size)); - } -@@ -177,10 +179,12 @@ void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart) - - static void elf_load_bsdsyms(struct elf_binary *elf) - { -- elf_ehdr *sym_ehdr; -+ ELF_HANDLE_DECL_NONCONST(elf_ehdr) sym_ehdr; - unsigned long sz; -- char *maxva, *symbase, *symtab_addr; -- elf_shdr *shdr; -+ ELF_PTRVAL_VOID maxva; -+ ELF_PTRVAL_VOID symbase; -+ ELF_PTRVAL_VOID symtab_addr; -+ ELF_HANDLE_DECL_NONCONST(elf_shdr) shdr; - int i, type; - - if ( !elf->bsd_symtab_pstart ) -@@ -189,18 +193,18 @@ static void elf_load_bsdsyms(struct elf_binary *elf) - #define elf_hdr_elm(_elf, _hdr, _elm, _val) \ - do { \ - if ( elf_64bit(_elf) ) \ -- (_hdr)->e64._elm = _val; \ -+ elf_store_field(_elf, _hdr, e64._elm, _val); \ - else \ -- (_hdr)->e32._elm = _val; \ -+ elf_store_field(_elf, _hdr, e32._elm, _val); \ - } while ( 0 ) - - symbase = elf_get_ptr(elf, elf->bsd_symtab_pstart); - symtab_addr = maxva = symbase + sizeof(uint32_t); - - /* Set up Elf header. */ -- sym_ehdr = (elf_ehdr *)symtab_addr; -+ sym_ehdr = ELF_MAKE_HANDLE(elf_ehdr, symtab_addr); - sz = elf_uval(elf, elf->ehdr, e_ehsize); -- memcpy(sym_ehdr, elf->ehdr, sz); -+ elf_memcpy_safe(elf, ELF_HANDLE_PTRVAL(sym_ehdr), ELF_HANDLE_PTRVAL(elf->ehdr), sz); - maxva += sz; /* no round up */ - - elf_hdr_elm(elf, sym_ehdr, e_phoff, 0); -@@ -209,37 +213,39 @@ do { \ - elf_hdr_elm(elf, sym_ehdr, e_phnum, 0); - - /* Copy Elf section headers. */ -- shdr = (elf_shdr *)maxva; -+ shdr = ELF_MAKE_HANDLE(elf_shdr, maxva); - sz = elf_shdr_count(elf) * elf_uval(elf, elf->ehdr, e_shentsize); -- memcpy(shdr, elf->image + elf_uval(elf, elf->ehdr, e_shoff), sz); -- maxva = (char *)(long)elf_round_up(elf, (long)maxva + sz); -+ elf_memcpy_safe(elf, ELF_HANDLE_PTRVAL(shdr), -+ ELF_IMAGE_BASE(elf) + elf_uval(elf, elf->ehdr, e_shoff), -+ sz); -+ maxva = ELF_OBSOLETE_VOIDP_CAST elf_round_up(elf, (long)maxva + sz); - - for ( i = 0; i < elf_shdr_count(elf); i++ ) - { - type = elf_uval(elf, shdr, sh_type); - if ( (type == SHT_STRTAB) || (type == SHT_SYMTAB) ) - { -- elf_msg(elf, "%s: shdr %i at 0x%p -> 0x%p\n", __func__, i, -+ elf_msg(elf, "%s: shdr %i at 0x%"ELF_PRPTRVAL" -> 0x%"ELF_PRPTRVAL"\n", __func__, i, - elf_section_start(elf, shdr), maxva); - sz = elf_uval(elf, shdr, sh_size); -- memcpy(maxva, elf_section_start(elf, shdr), sz); -+ elf_memcpy_safe(elf, maxva, elf_section_start(elf, shdr), sz); - /* Mangled to be based on ELF header location. */ - elf_hdr_elm(elf, shdr, sh_offset, maxva - symtab_addr); -- maxva = (char *)(long)elf_round_up(elf, (long)maxva + sz); -+ maxva = ELF_OBSOLETE_VOIDP_CAST elf_round_up(elf, (long)maxva + sz); - } -- shdr = (elf_shdr *)((long)shdr + -+ shdr = ELF_MAKE_HANDLE(elf_shdr, ELF_HANDLE_PTRVAL(shdr) + - (long)elf_uval(elf, elf->ehdr, e_shentsize)); - } - - /* Write down the actual sym size. */ -- *(uint32_t *)symbase = maxva - symtab_addr; -+ elf_store_val(elf, uint32_t, symbase, maxva - symtab_addr); - - #undef elf_ehdr_elm - } - - void elf_parse_binary(struct elf_binary *elf) - { -- const elf_phdr *phdr; -+ ELF_HANDLE_DECL(elf_phdr) phdr; - uint64_t low = -1; - uint64_t high = 0; - uint64_t i, count, paddr, memsz; -@@ -267,9 +273,9 @@ void elf_parse_binary(struct elf_binary *elf) - - int elf_load_binary(struct elf_binary *elf) - { -- const elf_phdr *phdr; -+ ELF_HANDLE_DECL(elf_phdr) phdr; - uint64_t i, count, paddr, offset, filesz, memsz; -- char *dest; -+ ELF_PTRVAL_VOID dest; - - count = elf_uval(elf, elf->ehdr, e_phnum); - for ( i = 0; i < count; i++ ) -@@ -282,9 +288,9 @@ int elf_load_binary(struct elf_binary *elf) - filesz = elf_uval(elf, phdr, p_filesz); - memsz = elf_uval(elf, phdr, p_memsz); - dest = elf_get_ptr(elf, paddr); -- elf_msg(elf, "%s: phdr %" PRIu64 " at 0x%p -> 0x%p\n", -- __func__, i, dest, dest + filesz); -- if ( elf_load_image(elf, dest, elf->image + offset, filesz, memsz) != 0 ) -+ elf_msg(elf, "%s: phdr %" PRIu64 " at 0x%"ELF_PRPTRVAL" -> 0x%"ELF_PRPTRVAL"\n", -+ __func__, i, dest, (ELF_PTRVAL_VOID)(dest + filesz)); -+ if ( elf_load_image(elf, dest, ELF_IMAGE_BASE(elf) + offset, filesz, memsz) != 0 ) - return -1; - } - -@@ -292,18 +298,18 @@ int elf_load_binary(struct elf_binary *elf) - return 0; - } - --void *elf_get_ptr(struct elf_binary *elf, unsigned long addr) -+ELF_PTRVAL_VOID elf_get_ptr(struct elf_binary *elf, unsigned long addr) - { - return elf->dest + addr - elf->pstart; - } - - uint64_t elf_lookup_addr(struct elf_binary * elf, const char *symbol) - { -- const elf_sym *sym; -+ ELF_HANDLE_DECL(elf_sym) sym; - uint64_t value; - - sym = elf_sym_by_name(elf, symbol); -- if ( sym == NULL ) -+ if ( !ELF_HANDLE_VALID(sym) ) - { - elf_err(elf, "%s: not found: %s\n", __FUNCTION__, symbol); - return -1; -diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c -index 2f54142..f1fd886 100644 ---- a/xen/common/libelf/libelf-tools.c -+++ b/xen/common/libelf/libelf-tools.c -@@ -67,10 +67,10 @@ int elf_phdr_count(struct elf_binary *elf) - return elf_uval(elf, elf->ehdr, e_phnum); - } - --const elf_shdr *elf_shdr_by_name(struct elf_binary *elf, const char *name) -+ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_name(struct elf_binary *elf, const char *name) - { - uint64_t count = elf_shdr_count(elf); -- const elf_shdr *shdr; -+ ELF_HANDLE_DECL(elf_shdr) shdr; - const char *sname; - int i; - -@@ -81,76 +81,80 @@ const elf_shdr *elf_shdr_by_name(struct elf_binary *elf, const char *name) - if ( sname && !strcmp(sname, name) ) - return shdr; - } -- return NULL; -+ return ELF_INVALID_HANDLE(elf_shdr); - } - --const elf_shdr *elf_shdr_by_index(struct elf_binary *elf, int index) -+ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, int index) - { - uint64_t count = elf_shdr_count(elf); -- const void *ptr; -+ ELF_PTRVAL_CONST_VOID ptr; - - if ( index >= count ) -- return NULL; -+ return ELF_INVALID_HANDLE(elf_shdr); - -- ptr = (elf->image -+ ptr = (ELF_IMAGE_BASE(elf) - + elf_uval(elf, elf->ehdr, e_shoff) - + elf_uval(elf, elf->ehdr, e_shentsize) * index); -- return ptr; -+ return ELF_MAKE_HANDLE(elf_shdr, ptr); - } - --const elf_phdr *elf_phdr_by_index(struct elf_binary *elf, int index) -+ELF_HANDLE_DECL(elf_phdr) elf_phdr_by_index(struct elf_binary *elf, int index) - { - uint64_t count = elf_uval(elf, elf->ehdr, e_phnum); -- const void *ptr; -+ ELF_PTRVAL_CONST_VOID ptr; - - if ( index >= count ) -- return NULL; -+ return ELF_INVALID_HANDLE(elf_phdr); - -- ptr = (elf->image -+ ptr = (ELF_IMAGE_BASE(elf) - + elf_uval(elf, elf->ehdr, e_phoff) - + elf_uval(elf, elf->ehdr, e_phentsize) * index); -- return ptr; -+ return ELF_MAKE_HANDLE(elf_phdr, ptr); - } - --const char *elf_section_name(struct elf_binary *elf, const elf_shdr * shdr) -+ -+const char *elf_section_name(struct elf_binary *elf, -+ ELF_HANDLE_DECL(elf_shdr) shdr) - { -- if ( elf->sec_strtab == NULL ) -+ if ( ELF_PTRVAL_INVALID(elf->sec_strtab) ) - return "unknown"; -+ - return elf->sec_strtab + elf_uval(elf, shdr, sh_name); - } - --const void *elf_section_start(struct elf_binary *elf, const elf_shdr * shdr) -+ELF_PTRVAL_CONST_VOID elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr) - { -- return elf->image + elf_uval(elf, shdr, sh_offset); -+ return ELF_IMAGE_BASE(elf) + elf_uval(elf, shdr, sh_offset); - } - --const void *elf_section_end(struct elf_binary *elf, const elf_shdr * shdr) -+ELF_PTRVAL_CONST_VOID elf_section_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr) - { -- return elf->image -+ return ELF_IMAGE_BASE(elf) - + elf_uval(elf, shdr, sh_offset) + elf_uval(elf, shdr, sh_size); - } - --const void *elf_segment_start(struct elf_binary *elf, const elf_phdr * phdr) -+ELF_PTRVAL_CONST_VOID elf_segment_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) - { -- return elf->image + elf_uval(elf, phdr, p_offset); -+ return ELF_IMAGE_BASE(elf) -+ + elf_uval(elf, phdr, p_offset); - } - --const void *elf_segment_end(struct elf_binary *elf, const elf_phdr * phdr) -+ELF_PTRVAL_CONST_VOID elf_segment_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) - { -- return elf->image -+ return ELF_IMAGE_BASE(elf) - + elf_uval(elf, phdr, p_offset) + elf_uval(elf, phdr, p_filesz); - } - --const elf_sym *elf_sym_by_name(struct elf_binary *elf, const char *symbol) -+ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *symbol) - { -- const void *ptr = elf_section_start(elf, elf->sym_tab); -- const void *end = elf_section_end(elf, elf->sym_tab); -- const elf_sym *sym; -+ ELF_PTRVAL_CONST_VOID ptr = elf_section_start(elf, elf->sym_tab); -+ ELF_PTRVAL_CONST_VOID end = elf_section_end(elf, elf->sym_tab); -+ ELF_HANDLE_DECL(elf_sym) sym; - uint64_t info, name; - - for ( ; ptr < end; ptr += elf_size(elf, sym) ) - { -- sym = ptr; -+ sym = ELF_MAKE_HANDLE(elf_sym, ptr); - info = elf_uval(elf, sym, st_info); - name = elf_uval(elf, sym, st_name); - if ( ELF32_ST_BIND(info) != STB_GLOBAL ) -@@ -159,33 +163,33 @@ const elf_sym *elf_sym_by_name(struct elf_binary *elf, const char *symbol) - continue; - return sym; - } -- return NULL; -+ return ELF_INVALID_HANDLE(elf_sym); - } - --const elf_sym *elf_sym_by_index(struct elf_binary *elf, int index) -+ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, int index) - { -- const void *ptr = elf_section_start(elf, elf->sym_tab); -- const elf_sym *sym; -+ ELF_PTRVAL_CONST_VOID ptr = elf_section_start(elf, elf->sym_tab); -+ ELF_HANDLE_DECL(elf_sym) sym; - -- sym = ptr + index * elf_size(elf, sym); -+ sym = ELF_MAKE_HANDLE(elf_sym, ptr + index * elf_size(elf, sym)); - return sym; - } - --const char *elf_note_name(struct elf_binary *elf, const elf_note * note) -+const char *elf_note_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { -- return (void *)note + elf_size(elf, note); -+ return ELF_HANDLE_PTRVAL(note) + elf_size(elf, note); - } - --const void *elf_note_desc(struct elf_binary *elf, const elf_note * note) -+ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { - int namesz = (elf_uval(elf, note, namesz) + 3) & ~3; - -- return (void *)note + elf_size(elf, note) + namesz; -+ return ELF_HANDLE_PTRVAL(note) + elf_size(elf, note) + namesz; - } - --uint64_t elf_note_numeric(struct elf_binary *elf, const elf_note * note) -+uint64_t elf_note_numeric(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { -- const void *desc = elf_note_desc(elf, note); -+ ELF_PTRVAL_CONST_VOID desc = elf_note_desc(elf, note); - int descsz = elf_uval(elf, note, descsz); - - switch (descsz) -@@ -200,10 +204,10 @@ uint64_t elf_note_numeric(struct elf_binary *elf, const elf_note * note) - } - } - --uint64_t elf_note_numeric_array(struct elf_binary *elf, const elf_note *note, -+uint64_t elf_note_numeric_array(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note, - unsigned int unitsz, unsigned int idx) - { -- const void *desc = elf_note_desc(elf, note); -+ ELF_PTRVAL_CONST_VOID desc = elf_note_desc(elf, note); - int descsz = elf_uval(elf, note, descsz); - - if ( descsz % unitsz || idx >= descsz / unitsz ) -@@ -220,12 +224,12 @@ uint64_t elf_note_numeric_array(struct elf_binary *elf, const elf_note *note, - } - } - --const elf_note *elf_note_next(struct elf_binary *elf, const elf_note * note) -+ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { - int namesz = (elf_uval(elf, note, namesz) + 3) & ~3; - int descsz = (elf_uval(elf, note, descsz) + 3) & ~3; - -- return (void *)note + elf_size(elf, note) + namesz + descsz; -+ return ELF_MAKE_HANDLE(elf_note, ELF_HANDLE_PTRVAL(note) + elf_size(elf, note) + namesz + descsz); - } - - /* ------------------------------------------------------------------------ */ -@@ -234,10 +238,10 @@ int elf_is_elfbinary(const void *image) - { - const Elf32_Ehdr *ehdr = image; - -- return IS_ELF(*ehdr); -+ return IS_ELF(*ehdr); /* fixme unchecked */ - } - --int elf_phdr_is_loadable(struct elf_binary *elf, const elf_phdr * phdr) -+int elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) - { - uint64_t p_type = elf_uval(elf, phdr, p_type); - uint64_t p_flags = elf_uval(elf, phdr, p_flags); -diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h -index 38e490c..cefd3d3 100644 ---- a/xen/include/xen/libelf.h -+++ b/xen/include/xen/libelf.h -@@ -48,6 +48,97 @@ typedef void elf_log_callback(struct elf_binary*, void *caller_data, - - /* ------------------------------------------------------------------------ */ - -+/* Macros for accessing the input image and output area. */ -+ -+/* -+ * We abstract away the pointerness of these pointers, replacing -+ * various void*, char* and struct* with the following: -+ * PTRVAL A pointer to a byte; one can do pointer arithmetic -+ * on this. -+ * This replaces variables which were char*,void* -+ * and their const versions, so we provide four -+ * different declaration macros: -+ * ELF_PTRVAL_{,CONST}{VOID,CHAR} -+ * HANDLE A pointer to a struct. There is one of these types -+ * for each pointer type - that is, for each "structname". -+ * In the arguments to the various HANDLE macros, structname -+ * must be a single identifier which is a typedef. -+ * It is not permitted to do arithmetic on these -+ * pointers. In the current code attempts to do so will -+ * compile, but in the next patch this will become a -+ * compile error. -+ * We provide two declaration macros for const and -+ * non-const pointers. -+ */ -+ -+#define ELF_REALPTR2PTRVAL(realpointer) (realpointer) -+ /* Converts an actual C pointer into a PTRVAL */ -+ -+#define ELF_HANDLE_DECL_NONCONST(structname) structname * -+#define ELF_HANDLE_DECL(structname) const structname * -+ /* Provides a type declaration for a HANDLE. */ -+ /* May only be used to declare ONE variable at a time */ -+ -+#define ELF_PTRVAL_VOID void * -+#define ELF_PTRVAL_CHAR char * -+#define ELF_PTRVAL_CONST_VOID const void * -+#define ELF_PTRVAL_CONST_CHAR const char * -+ /* Provides a type declaration for a PTRVAL. */ -+ /* May only be used to declare ONE variable at a time */ -+ -+#define ELF_DEFINE_HANDLE(structname) /* empty */ -+ /* -+ * This must be invoked for each HANDLE type to define -+ * the actual C type used for that kind of HANDLE. -+ */ -+ -+#define ELF_PRPTRVAL "p" -+ /* printf format a la PRId... for a PTRVAL */ -+ -+#define ELF_MAKE_HANDLE(structname, ptrval) (ptrval) -+ /* Converts a PTRVAL to a HANDLE */ -+ -+#define ELF_IMAGE_BASE(elf) ((elf)->image) -+ /* Returns the base of the image as a PTRVAL. */ -+ -+#define ELF_HANDLE_PTRVAL(handleval) ((void*)(handleval)) -+ /* Converts a HANDLE to a PTRVAL. */ -+ -+#define ELF_OBSOLETE_VOIDP_CAST (void*)(uintptr_t) -+ /* -+ * In some places the existing code needs to -+ * - cast away const (the existing code uses const a fair -+ * bit but actually sometimes wants to write to its input) -+ * from a PTRVAL. -+ * - convert an integer representing a pointer to a PTRVAL -+ * This macro provides a suitable cast. -+ */ -+ -+#define ELF_UNSAFE_PTR(ptrval) ((void*)(uintptr_t)(ptrval)) -+ /* -+ * Turns a PTRVAL into an actual C pointer. Before this is done -+ * the caller must have ensured that the PTRVAL does in fact point -+ * to a permissible location. -+ */ -+ -+/* PTRVALs can be INVALID (ie, NULL). */ -+#define ELF_INVALID_PTRVAL (NULL) /* returns NULL PTRVAL */ -+#define ELF_INVALID_HANDLE(structname) /* returns NULL handle */ \ -+ ELF_MAKE_HANDLE(structname, ELF_INVALID_PTRVAL) -+#define ELF_PTRVAL_VALID(ptrval) (ptrval) /* } */ -+#define ELF_HANDLE_VALID(handleval) (handleval) /* } predicates */ -+#define ELF_PTRVAL_INVALID(ptrval) ((ptrval) == NULL) /* } */ -+ -+/* For internal use by other macros here */ -+#define ELF__HANDLE_FIELD_TYPE(handleval, elm) \ -+ typeof((handleval)->elm) -+#define ELF__HANDLE_FIELD_OFFSET(handleval, elm) \ -+ offsetof(typeof(*(handleval)),elm) -+ -+ -+/* ------------------------------------------------------------------------ */ -+ -+ - typedef union { - Elf32_Ehdr e32; - Elf64_Ehdr e64; -@@ -83,6 +174,12 @@ typedef union { - Elf64_Note e64; - } elf_note; - -+ELF_DEFINE_HANDLE(elf_ehdr) -+ELF_DEFINE_HANDLE(elf_shdr) -+ELF_DEFINE_HANDLE(elf_phdr) -+ELF_DEFINE_HANDLE(elf_sym) -+ELF_DEFINE_HANDLE(elf_note) -+ - struct elf_binary { - /* elf binary */ - const char *image; -@@ -90,10 +187,10 @@ struct elf_binary { - char class; - char data; - -- const elf_ehdr *ehdr; -- const char *sec_strtab; -- const elf_shdr *sym_tab; -- const char *sym_strtab; -+ ELF_HANDLE_DECL(elf_ehdr) ehdr; -+ ELF_PTRVAL_CONST_CHAR sec_strtab; -+ ELF_HANDLE_DECL(elf_shdr) sym_tab; -+ ELF_PTRVAL_CONST_CHAR sym_strtab; - - /* loaded to */ - char *dest; -@@ -135,45 +232,72 @@ struct elf_binary { - : elf_access_unsigned((elf), (str), \ - offsetof(typeof(*(str)),e32.elem), \ - sizeof((str)->e32.elem))) -+ /* -+ * Reads an unsigned field in a header structure in the ELF. -+ * str is a HANDLE, and elem is the field name in it. -+ */ - - #define elf_size(elf, str) \ - ((ELFCLASS64 == (elf)->class) \ - ? sizeof((str)->e64) : sizeof((str)->e32)) -+ /* -+ * Returns the size of the substructure for the appropriate 32/64-bitness. -+ * str should be a HANDLE. -+ */ - --uint64_t elf_access_unsigned(struct elf_binary *elf, const void *ptr, -+uint64_t elf_access_unsigned(struct elf_binary *elf, ELF_PTRVAL_CONST_VOID ptr, - uint64_t offset, size_t size); -+ /* Reads a field at arbitrary offset and alignemnt */ - - uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr); - -+ -+#define elf_memcpy_safe(elf, dst, src, sz) memcpy((dst),(src),(sz)) -+#define elf_memset_safe(elf, dst, c, sz) memset((dst),(c),(sz)) -+ /* -+ * Versions of memcpy and memset which will (in the next patch) -+ * arrange never to write outside permitted areas. -+ */ -+ -+#define elf_store_val(elf, type, ptr, val) (*(type*)(ptr) = (val)) -+ /* Stores a value at a particular PTRVAL. */ -+ -+#define elf_store_field(elf, hdr, elm, val) \ -+ (elf_store_val((elf), ELF__HANDLE_FIELD_TYPE(hdr, elm), \ -+ &((hdr)->elm), \ -+ (val))) -+ /* Stores a 32/64-bit field. hdr is a HANDLE and elm is the field name. */ -+ -+ - /* ------------------------------------------------------------------------ */ - /* xc_libelf_tools.c */ - - int elf_shdr_count(struct elf_binary *elf); - int elf_phdr_count(struct elf_binary *elf); - --const elf_shdr *elf_shdr_by_name(struct elf_binary *elf, const char *name); --const elf_shdr *elf_shdr_by_index(struct elf_binary *elf, int index); --const elf_phdr *elf_phdr_by_index(struct elf_binary *elf, int index); -+ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_name(struct elf_binary *elf, const char *name); -+ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, int index); -+ELF_HANDLE_DECL(elf_phdr) elf_phdr_by_index(struct elf_binary *elf, int index); - --const char *elf_section_name(struct elf_binary *elf, const elf_shdr * shdr); --const void *elf_section_start(struct elf_binary *elf, const elf_shdr * shdr); --const void *elf_section_end(struct elf_binary *elf, const elf_shdr * shdr); -+const char *elf_section_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); -+ELF_PTRVAL_CONST_VOID elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); -+ELF_PTRVAL_CONST_VOID elf_section_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); - --const void *elf_segment_start(struct elf_binary *elf, const elf_phdr * phdr); --const void *elf_segment_end(struct elf_binary *elf, const elf_phdr * phdr); -+ELF_PTRVAL_CONST_VOID elf_segment_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); -+ELF_PTRVAL_CONST_VOID elf_segment_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); - --const elf_sym *elf_sym_by_name(struct elf_binary *elf, const char *symbol); --const elf_sym *elf_sym_by_index(struct elf_binary *elf, int index); -+ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *symbol); -+ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, int index); - --const char *elf_note_name(struct elf_binary *elf, const elf_note * note); --const void *elf_note_desc(struct elf_binary *elf, const elf_note * note); --uint64_t elf_note_numeric(struct elf_binary *elf, const elf_note * note); --uint64_t elf_note_numeric_array(struct elf_binary *, const elf_note *, -+const char *elf_note_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); -+ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); -+uint64_t elf_note_numeric(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); -+uint64_t elf_note_numeric_array(struct elf_binary *, ELF_HANDLE_DECL(elf_note), - unsigned int unitsz, unsigned int idx); --const elf_note *elf_note_next(struct elf_binary *elf, const elf_note * note); -+ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); - - int elf_is_elfbinary(const void *image); --int elf_phdr_is_loadable(struct elf_binary *elf, const elf_phdr * phdr); -+int elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); - - /* ------------------------------------------------------------------------ */ - /* xc_libelf_loader.c */ -@@ -189,7 +313,7 @@ void elf_set_log(struct elf_binary *elf, elf_log_callback*, - void elf_parse_binary(struct elf_binary *elf); - int elf_load_binary(struct elf_binary *elf); - --void *elf_get_ptr(struct elf_binary *elf, unsigned long addr); -+ELF_PTRVAL_VOID elf_get_ptr(struct elf_binary *elf, unsigned long addr); - uint64_t elf_lookup_addr(struct elf_binary *elf, const char *symbol); - - void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart); /* private */ -@@ -221,9 +345,9 @@ struct xen_elfnote { - - struct elf_dom_parms { - /* raw */ -- const char *guest_info; -- const void *elf_note_start; -- const void *elf_note_end; -+ ELF_PTRVAL_CONST_CHAR guest_info; -+ ELF_PTRVAL_CONST_VOID elf_note_start; -+ ELF_PTRVAL_CONST_VOID elf_note_end; - struct xen_elfnote elf_notes[XEN_ELFNOTE_MAX + 1]; - - /* parsed */ -@@ -262,10 +386,22 @@ int elf_xen_parse_features(const char *features, - uint32_t *required); - int elf_xen_parse_note(struct elf_binary *elf, - struct elf_dom_parms *parms, -- const elf_note *note); -+ ELF_HANDLE_DECL(elf_note) note); - int elf_xen_parse_guest_info(struct elf_binary *elf, - struct elf_dom_parms *parms); - int elf_xen_parse(struct elf_binary *elf, - struct elf_dom_parms *parms); - -+#define elf_memcpy_unchecked memcpy -+#define elf_memset_unchecked memset -+ /* -+ * Unsafe versions of memcpy and memset which take actual C -+ * pointers. These are just like real memcpy and memset. -+ */ -+ -+ -+#define ELF_ADVANCE_DEST(elf, amount) elf->dest += (amount) -+ /* Advances past amount bytes of the current destination area. */ -+ -+ - #endif /* __XEN_LIBELF_H__ */ --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0009-tools-xcutils-readnotes-adjust-print_l1_mfn_valid_no.patch xen-4.3.0/debian/patches/xsa55-4.2-0009-tools-xcutils-readnotes-adjust-print_l1_mfn_valid_no.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0009-tools-xcutils-readnotes-adjust-print_l1_mfn_valid_no.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0009-tools-xcutils-readnotes-adjust-print_l1_mfn_valid_no.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -From 59f66d58180832af6b99a9e4489031b5c2f627ab Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:17 +0100 -Subject: [PATCH 09/23] tools/xcutils/readnotes: adjust print_l1_mfn_valid_note - -Use the new PTRVAL macros and elf_access_unsigned in -print_l1_mfn_valid_note. - -No functional change unless the input is wrong, or we are reading a -file for a different endianness. - -Separated out from the previous patch because this change does produce -a difference in the generated code. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell ---- - tools/xcutils/readnotes.c | 11 ++++++----- - 1 files changed, 6 insertions(+), 5 deletions(-) - -diff --git a/tools/xcutils/readnotes.c b/tools/xcutils/readnotes.c -index 2af047d..7ff2530 100644 ---- a/tools/xcutils/readnotes.c -+++ b/tools/xcutils/readnotes.c -@@ -77,22 +77,23 @@ static void print_numeric_note(const char *prefix, struct elf_binary *elf, - } - - static void print_l1_mfn_valid_note(const char *prefix, struct elf_binary *elf, -- const elf_note *note) -+ ELF_HANDLE_DECL(elf_note) note) - { - int descsz = elf_uval(elf, note, descsz); -- const uint32_t *desc32 = elf_note_desc(elf, note); -- const uint64_t *desc64 = elf_note_desc(elf, note); -+ ELF_PTRVAL_CONST_VOID desc = elf_note_desc(elf, note); - - /* XXX should be able to cope with a list of values. */ - switch ( descsz / 2 ) - { - case 8: - printf("%s: mask=%#"PRIx64" value=%#"PRIx64"\n", prefix, -- desc64[0], desc64[1]); -+ elf_access_unsigned(elf, desc, 0, 8), -+ elf_access_unsigned(elf, desc, 8, 8)); - break; - case 4: - printf("%s: mask=%#"PRIx32" value=%#"PRIx32"\n", prefix, -- desc32[0],desc32[1]); -+ (uint32_t)elf_access_unsigned(elf, desc, 0, 4), -+ (uint32_t)elf_access_unsigned(elf, desc, 4, 4)); - break; - } - --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0010-libelf-check-nul-terminated-strings-properly.patch xen-4.3.0/debian/patches/xsa55-4.2-0010-libelf-check-nul-terminated-strings-properly.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0010-libelf-check-nul-terminated-strings-properly.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0010-libelf-check-nul-terminated-strings-properly.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,204 +0,0 @@ -From db14d5bd9b6508adfcd2b910f454fae12fa4ba00 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:17 +0100 -Subject: [PATCH 10/23] libelf: check nul-terminated strings properly - -It is not safe to simply take pointers into the ELF and use them as C -pointers. They might not be properly nul-terminated (and the pointers -might be wild). - -So we are going to introduce a new function elf_strval for safely -getting strings. This will check that the addresses are in range and -that there is a proper nul-terminated string. Of course it might -discover that there isn't. In that case, it will be made to fail. -This means that elf_note_name might fail, too. - -For the benefit of call sites which are just going to pass the value -to a printf-like function, we provide elf_strfmt which returns -"(invalid)" on failure rather than NULL. - -In this patch we introduce dummy definitions of these functions. We -introduce calls to elf_strval and elf_strfmt everywhere, and update -all the call sites with appropriate error checking. - -There is not yet any semantic change, since before this patch all the -places where we introduce elf_strval dereferenced the value anyway, so -it mustn't have been NULL. - -In future patches, when elf_strval is made able return NULL, when it -does so it will mark the elf "broken" so that an appropriate -diagnostic can be printed. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell -Reviewed-by: Konrad Rzeszutek Wilk ---- - tools/xcutils/readnotes.c | 11 ++++++++--- - xen/common/libelf/libelf-dominfo.c | 13 ++++++++++--- - xen/common/libelf/libelf-tools.c | 10 +++++++--- - xen/include/xen/libelf.h | 7 +++++-- - 4 files changed, 30 insertions(+), 11 deletions(-) - -diff --git a/tools/xcutils/readnotes.c b/tools/xcutils/readnotes.c -index 7ff2530..cfae994 100644 ---- a/tools/xcutils/readnotes.c -+++ b/tools/xcutils/readnotes.c -@@ -63,7 +63,7 @@ struct setup_header { - static void print_string_note(const char *prefix, struct elf_binary *elf, - ELF_HANDLE_DECL(elf_note) note) - { -- printf("%s: %s\n", prefix, (char*)elf_note_desc(elf, note)); -+ printf("%s: %s\n", prefix, elf_strfmt(elf, elf_note_desc(elf, note))); - } - - static void print_numeric_note(const char *prefix, struct elf_binary *elf, -@@ -103,10 +103,14 @@ static int print_notes(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) start, - { - ELF_HANDLE_DECL(elf_note) note; - int notes_found = 0; -+ const char *this_note_name; - - for ( note = start; ELF_HANDLE_PTRVAL(note) < ELF_HANDLE_PTRVAL(end); note = elf_note_next(elf, note) ) - { -- if (0 != strcmp(elf_note_name(elf, note), "Xen")) -+ this_note_name = elf_note_name(elf, note); -+ if (NULL == this_note_name) -+ continue; -+ if (0 != strcmp(this_note_name, "Xen")) - continue; - - notes_found++; -@@ -294,7 +298,8 @@ int main(int argc, char **argv) - - shdr = elf_shdr_by_name(&elf, "__xen_guest"); - if (ELF_HANDLE_VALID(shdr)) -- printf("__xen_guest: %s\n", (char*)elf_section_start(&elf, shdr)); -+ printf("__xen_guest: %s\n", -+ elf_strfmt(&elf, elf_section_start(&elf, shdr))); - - return 0; - } -diff --git a/xen/common/libelf/libelf-dominfo.c b/xen/common/libelf/libelf-dominfo.c -index 7140d59..b217f8f 100644 ---- a/xen/common/libelf/libelf-dominfo.c -+++ b/xen/common/libelf/libelf-dominfo.c -@@ -137,7 +137,10 @@ int elf_xen_parse_note(struct elf_binary *elf, - - if ( note_desc[type].str ) - { -- str = elf_note_desc(elf, note); -+ str = elf_strval(elf, elf_note_desc(elf, note)); -+ if (str == NULL) -+ /* elf_strval will mark elf broken if it fails so no need to log */ -+ return 0; - elf_msg(elf, "%s: %s = \"%s\"\n", __FUNCTION__, - note_desc[type].name, str); - parms->elf_notes[type].type = XEN_ENT_STR; -@@ -220,6 +223,7 @@ static int elf_xen_parse_notes(struct elf_binary *elf, - { - int xen_elfnotes = 0; - ELF_HANDLE_DECL(elf_note) note; -+ const char *note_name; - - parms->elf_note_start = start; - parms->elf_note_end = end; -@@ -227,7 +231,10 @@ static int elf_xen_parse_notes(struct elf_binary *elf, - ELF_HANDLE_PTRVAL(note) < parms->elf_note_end; - note = elf_note_next(elf, note) ) - { -- if ( strcmp(elf_note_name(elf, note), "Xen") ) -+ note_name = elf_note_name(elf, note); -+ if ( note_name == NULL ) -+ continue; -+ if ( strcmp(note_name, "Xen") ) - continue; - if ( elf_xen_parse_note(elf, parms, note) ) - return -1; -@@ -541,7 +548,7 @@ int elf_xen_parse(struct elf_binary *elf, - parms->elf_note_start = ELF_INVALID_PTRVAL; - parms->elf_note_end = ELF_INVALID_PTRVAL; - elf_msg(elf, "%s: __xen_guest: \"%s\"\n", __FUNCTION__, -- parms->guest_info); -+ elf_strfmt(elf, parms->guest_info)); - elf_xen_parse_guest_info(elf, parms); - break; - } -diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c -index f1fd886..3a0cde1 100644 ---- a/xen/common/libelf/libelf-tools.c -+++ b/xen/common/libelf/libelf-tools.c -@@ -119,7 +119,7 @@ const char *elf_section_name(struct elf_binary *elf, - if ( ELF_PTRVAL_INVALID(elf->sec_strtab) ) - return "unknown"; - -- return elf->sec_strtab + elf_uval(elf, shdr, sh_name); -+ return elf_strval(elf, elf->sec_strtab + elf_uval(elf, shdr, sh_name)); - } - - ELF_PTRVAL_CONST_VOID elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr) -@@ -151,6 +151,7 @@ ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *sym - ELF_PTRVAL_CONST_VOID end = elf_section_end(elf, elf->sym_tab); - ELF_HANDLE_DECL(elf_sym) sym; - uint64_t info, name; -+ const char *sym_name; - - for ( ; ptr < end; ptr += elf_size(elf, sym) ) - { -@@ -159,7 +160,10 @@ ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *sym - name = elf_uval(elf, sym, st_name); - if ( ELF32_ST_BIND(info) != STB_GLOBAL ) - continue; -- if ( strcmp(elf->sym_strtab + name, symbol) ) -+ sym_name = elf_strval(elf, elf->sym_strtab + name); -+ if ( sym_name == NULL ) /* out of range, oops */ -+ return ELF_INVALID_HANDLE(elf_sym); -+ if ( strcmp(sym_name, symbol) ) - continue; - return sym; - } -@@ -177,7 +181,7 @@ ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, int index) - - const char *elf_note_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { -- return ELF_HANDLE_PTRVAL(note) + elf_size(elf, note); -+ return elf_strval(elf, ELF_HANDLE_PTRVAL(note) + elf_size(elf, note)); - } - - ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) -diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h -index cefd3d3..af5b5c5 100644 ---- a/xen/include/xen/libelf.h -+++ b/xen/include/xen/libelf.h -@@ -252,6 +252,9 @@ uint64_t elf_access_unsigned(struct elf_binary *elf, ELF_PTRVAL_CONST_VOID ptr, - uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr); - - -+#define elf_strval(elf,x) ((const char*)(x)) /* may return NULL in the future */ -+#define elf_strfmt(elf,x) ((const char*)(x)) /* will return (invalid) instead */ -+ - #define elf_memcpy_safe(elf, dst, src, sz) memcpy((dst),(src),(sz)) - #define elf_memset_safe(elf, dst, c, sz) memset((dst),(c),(sz)) - /* -@@ -279,7 +282,7 @@ ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_name(struct elf_binary *elf, const char *n - ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, int index); - ELF_HANDLE_DECL(elf_phdr) elf_phdr_by_index(struct elf_binary *elf, int index); - --const char *elf_section_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); -+const char *elf_section_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); /* might return NULL if inputs are invalid */ - ELF_PTRVAL_CONST_VOID elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); - ELF_PTRVAL_CONST_VOID elf_section_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); - -@@ -289,7 +292,7 @@ ELF_PTRVAL_CONST_VOID elf_segment_end(struct elf_binary *elf, ELF_HANDLE_DECL(el - ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *symbol); - ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, int index); - --const char *elf_note_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); -+const char *elf_note_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); /* may return NULL */ - ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); - uint64_t elf_note_numeric(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); - uint64_t elf_note_numeric_array(struct elf_binary *, ELF_HANDLE_DECL(elf_note), --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0011-libelf-check-all-pointer-accesses.patch xen-4.3.0/debian/patches/xsa55-4.2-0011-libelf-check-all-pointer-accesses.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0011-libelf-check-all-pointer-accesses.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0011-libelf-check-all-pointer-accesses.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,788 +0,0 @@ -From cc8761371aac432318530c2ddfe2c8234bc0621f Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:17 +0100 -Subject: [PATCH 11/23] libelf: check all pointer accesses - -We change the ELF_PTRVAL and ELF_HANDLE types and associated macros: - - * PTRVAL becomes a uintptr_t, for which we provide a typedef - elf_ptrval. This means no arithmetic done on it can overflow so - the compiler cannot do any malicious invalid pointer arithmetic - "optimisations". It also means that any places where we - dereference one of these pointers without using the appropriate - macros or functions become a compilation error. - - So we can be sure that we won't miss any memory accesses. - - All the PTRVAL variables were previously void* or char*, so - the actual address calculations are unchanged. - - * ELF_HANDLE becomes a union, one half of which keeps the pointer - value and the other half of which is just there to record the - type. - - The new type is not a pointer type so there can be no address - calculations on it whose meaning would change. Every assignment or - access has to go through one of our macros. - - * The distinction between const and non-const pointers and char*s - and void*s in libelf goes away. This was not important (and - anyway libelf tended to cast away const in various places). - - * The fields elf->image and elf->dest are renamed. That proves - that we haven't missed any unchecked uses of these actual - pointer values. - - * The caller may fill in elf->caller_xdest_base and _size to - specify another range of memory which is safe for libelf to - access, besides the input and output images. - - * When accesses fail due to being out of range, we mark the elf - "broken". This will be checked and used for diagnostics in - a following patch. - - We do not check for write accesses to the input image. This is - because libelf actually does this in a number of places. So we - simply permit that. - - * Each caller of libelf which used to set dest now sets - dest_base and dest_size. - - * In xc_dom_load_elf_symtab we provide a new actual-pointer - value hdr_ptr which we get from mapping the guest's kernel - area and use (checking carefully) as the caller_xdest area. - - * The STAR(h) macro in libelf-dominfo.c now uses elf_access_unsigned. - - * elf-init uses the new elf_uval_3264 accessor to access the 32-bit - fields, rather than an unchecked field access (ie, unchecked - pointer access). - - * elf_uval has been reworked to use elf_uval_3264. Both of these - macros are essentially new in this patch (although they are derived - from the old elf_uval) and need careful review. - - * ELF_ADVANCE_DEST is now safe in the sense that you can use it to - chop parts off the front of the dest area but if you chop more than - is available, the dest area is simply set to be empty, preventing - future accesses. - - * We introduce some #defines for memcpy, memset, memmove and strcpy: - - We provide elf_memcpy_safe and elf_memset_safe which take - PTRVALs and do checking on the supplied pointers. - - Users inside libelf must all be changed to either - elf_mem*_unchecked (which are just like mem*), or - elf_mem*_safe (which take PTRVALs) and are checked. Any - unchanged call sites become compilation errors. - - * We do _not_ at this time fix elf_access_unsigned so that it doesn't - make unaligned accesses. We hope that unaligned accesses are OK on - every supported architecture. But it does check the supplied - pointer for validity. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson ---- - tools/libxc/xc_dom_elfloader.c | 49 ++++++++-- - tools/libxc/xc_hvm_build_x86.c | 10 +- - xen/arch/x86/domain_build.c | 3 +- - xen/common/libelf/libelf-dominfo.c | 2 +- - xen/common/libelf/libelf-loader.c | 16 ++-- - xen/common/libelf/libelf-private.h | 13 +++ - xen/common/libelf/libelf-tools.c | 106 ++++++++++++++++++- - xen/include/xen/libelf.h | 198 +++++++++++++++++++++++++----------- - 8 files changed, 312 insertions(+), 85 deletions(-) - -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index cc0f206..b82a08c 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -130,20 +130,30 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - - if ( load ) - { -- size_t allow_size; /* will be used in a forthcoming XSA-55 patch */ -+ char *hdr_ptr; -+ size_t allow_size; -+ - if ( !dom->bsd_symtab_start ) - return 0; - size = dom->kernel_seg.vend - dom->bsd_symtab_start; -- hdr = xc_dom_vaddr_to_ptr(dom, dom->bsd_symtab_start, &allow_size); -- *(int *)hdr = size - sizeof(int); -+ hdr_ptr = xc_dom_vaddr_to_ptr(dom, dom->bsd_symtab_start, &allow_size); -+ elf->caller_xdest_base = hdr_ptr; -+ elf->caller_xdest_size = allow_size; -+ hdr = ELF_REALPTR2PTRVAL(hdr_ptr); -+ elf_store_val(elf, int, hdr, size - sizeof(int)); - } - else - { -+ char *hdr_ptr; -+ - size = sizeof(int) + elf_size(elf, elf->ehdr) + - elf_shdr_count(elf) * elf_size(elf, shdr); -- hdr = xc_dom_malloc(dom, size); -- if ( hdr == NULL ) -+ hdr_ptr = xc_dom_malloc(dom, size); -+ if ( hdr_ptr == NULL ) - return 0; -+ elf->caller_xdest_base = hdr_ptr; -+ elf->caller_xdest_size = size; -+ hdr = ELF_REALPTR2PTRVAL(hdr_ptr); - dom->bsd_symtab_start = elf_round_up(elf, dom->kernel_seg.vend); - } - -@@ -171,9 +181,32 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - ehdr->e_shoff = elf_size(elf, elf->ehdr); - ehdr->e_shstrndx = SHN_UNDEF; - } -- if ( elf_init(&syms, hdr + sizeof(int), size - sizeof(int)) ) -+ if ( elf->caller_xdest_size < sizeof(int) ) -+ { -+ DOMPRINTF("%s/%s: header size %"PRIx64" too small", -+ __FUNCTION__, load ? "load" : "parse", -+ (uint64_t)elf->caller_xdest_size); -+ return -1; -+ } -+ if ( elf_init(&syms, elf->caller_xdest_base + sizeof(int), -+ elf->caller_xdest_size - sizeof(int)) ) - return -1; - -+ /* -+ * The caller_xdest_{base,size} and dest_{base,size} need to -+ * remain valid so long as each struct elf_image does. The -+ * principle we adopt is that these values are set when the -+ * memory is allocated or mapped, and cleared when (and if) -+ * they are unmapped. -+ * -+ * Mappings of the guest are normally undone by xc_dom_unmap_all -+ * (directly or via xc_dom_release). We do not explicitly clear -+ * these because in fact that happens only at the end of -+ * xc_dom_boot_image, at which time all of these ELF loading -+ * functions have returned. No relevant struct elf_binary* -+ * escapes this file. -+ */ -+ - xc_elf_set_logfile(dom->xch, &syms, 1); - - symtab = dom->bsd_symtab_start + sizeof(int); -@@ -312,8 +345,10 @@ static int xc_dom_load_elf_kernel(struct xc_dom_image *dom) - { - struct elf_binary *elf = dom->private_loader; - int rc; -+ xen_pfn_t pages; - -- elf->dest = xc_dom_seg_to_ptr(dom, &dom->kernel_seg); -+ elf->dest_base = xc_dom_seg_to_ptr_pages(dom, &dom->kernel_seg, &pages); -+ elf->dest_size = pages * XC_DOM_PAGE_SIZE(dom); - rc = elf_load_binary(elf); - if ( rc < 0 ) - { -diff --git a/tools/libxc/xc_hvm_build_x86.c b/tools/libxc/xc_hvm_build_x86.c -index 15b603d..ccfd8b5 100644 ---- a/tools/libxc/xc_hvm_build_x86.c -+++ b/tools/libxc/xc_hvm_build_x86.c -@@ -104,11 +104,12 @@ static int loadelfimage( - for ( i = 0; i < pages; i++ ) - entries[i].mfn = parray[(elf->pstart >> PAGE_SHIFT) + i]; - -- elf->dest = xc_map_foreign_ranges( -+ elf->dest_base = xc_map_foreign_ranges( - xch, dom, pages << PAGE_SHIFT, PROT_READ | PROT_WRITE, 1 << PAGE_SHIFT, - entries, pages); -- if ( elf->dest == NULL ) -+ if ( elf->dest_base == NULL ) - goto err; -+ elf->dest_size = pages * PAGE_SIZE; - - ELF_ADVANCE_DEST(elf, elf->pstart & (PAGE_SIZE - 1)); - -@@ -117,8 +118,9 @@ static int loadelfimage( - if ( rc < 0 ) - PERROR("Failed to load elf binary\n"); - -- munmap(elf->dest, pages << PAGE_SHIFT); -- elf->dest = NULL; -+ munmap(elf->dest_base, pages << PAGE_SHIFT); -+ elf->dest_base = NULL; -+ elf->dest_size = 0; - - err: - free(entries); -diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c -index 469d363..a655b21 100644 ---- a/xen/arch/x86/domain_build.c -+++ b/xen/arch/x86/domain_build.c -@@ -908,7 +908,8 @@ int __init construct_dom0( - write_ptbase(v); - - /* Copy the OS image and free temporary buffer. */ -- elf.dest = (void*)vkern_start; -+ elf.dest_base = (void*)vkern_start; -+ elf.dest_size = vkern_end - vkern_start; - rc = elf_load_binary(&elf); - if ( rc < 0 ) - { -diff --git a/xen/common/libelf/libelf-dominfo.c b/xen/common/libelf/libelf-dominfo.c -index b217f8f..98c80dc 100644 ---- a/xen/common/libelf/libelf-dominfo.c -+++ b/xen/common/libelf/libelf-dominfo.c -@@ -254,7 +254,7 @@ int elf_xen_parse_guest_info(struct elf_binary *elf, - int len; - - h = parms->guest_info; --#define STAR(h) (*(h)) -+#define STAR(h) (elf_access_unsigned(elf, (h), 0, 1)) - while ( STAR(h) ) - { - elf_memset_unchecked(name, 0, sizeof(name)); -diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c -index 0fef84c..a3310e7 100644 ---- a/xen/common/libelf/libelf-loader.c -+++ b/xen/common/libelf/libelf-loader.c -@@ -24,23 +24,25 @@ - - /* ------------------------------------------------------------------------ */ - --int elf_init(struct elf_binary *elf, const char *image, size_t size) -+int elf_init(struct elf_binary *elf, const char *image_input, size_t size) - { - ELF_HANDLE_DECL(elf_shdr) shdr; - uint64_t i, count, section, offset; - -- if ( !elf_is_elfbinary(image) ) -+ if ( !elf_is_elfbinary(image_input) ) - { - elf_err(elf, "%s: not an ELF binary\n", __FUNCTION__); - return -1; - } - - elf_memset_unchecked(elf, 0, sizeof(*elf)); -- elf->image = image; -+ elf->image_base = image_input; - elf->size = size; -- elf->ehdr = (elf_ehdr *)image; -- elf->class = elf->ehdr->e32.e_ident[EI_CLASS]; -- elf->data = elf->ehdr->e32.e_ident[EI_DATA]; -+ elf->ehdr = ELF_MAKE_HANDLE(elf_ehdr, (elf_ptrval)image_input); -+ elf->class = elf_uval_3264(elf, elf->ehdr, e32.e_ident[EI_CLASS]); -+ elf->data = elf_uval_3264(elf, elf->ehdr, e32.e_ident[EI_DATA]); -+ elf->caller_xdest_base = NULL; -+ elf->caller_xdest_size = 0; - - /* Sanity check phdr. */ - offset = elf_uval(elf, elf->ehdr, e_phoff) + -@@ -300,7 +302,7 @@ int elf_load_binary(struct elf_binary *elf) - - ELF_PTRVAL_VOID elf_get_ptr(struct elf_binary *elf, unsigned long addr) - { -- return elf->dest + addr - elf->pstart; -+ return ELF_REALPTR2PTRVAL(elf->dest_base) + addr - elf->pstart; - } - - uint64_t elf_lookup_addr(struct elf_binary * elf, const char *symbol) -diff --git a/xen/common/libelf/libelf-private.h b/xen/common/libelf/libelf-private.h -index 3ef753c..280dfd1 100644 ---- a/xen/common/libelf/libelf-private.h -+++ b/xen/common/libelf/libelf-private.h -@@ -86,6 +86,19 @@ do { strncpy((d),(s),sizeof((d))-1); \ - - #endif - -+#undef memcpy -+#undef memset -+#undef memmove -+#undef strcpy -+ -+#define memcpy MISTAKE_unspecified_memcpy -+#define memset MISTAKE_unspecified_memset -+#define memmove MISTAKE_unspecified_memmove -+#define strcpy MISTAKE_unspecified_strcpy -+ /* This prevents libelf from using these undecorated versions -+ * of memcpy, memset, memmove and strcpy. Every call site -+ * must either use elf_mem*_unchecked, or elf_mem*_safe. */ -+ - #endif /* __LIBELF_PRIVATE_H_ */ - - /* -diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c -index 3a0cde1..46ca553 100644 ---- a/xen/common/libelf/libelf-tools.c -+++ b/xen/common/libelf/libelf-tools.c -@@ -20,28 +20,100 @@ - - /* ------------------------------------------------------------------------ */ - --uint64_t elf_access_unsigned(struct elf_binary * elf, const void *ptr, -- uint64_t offset, size_t size) -+void elf_mark_broken(struct elf_binary *elf, const char *msg) - { -+ if ( elf->broken == NULL ) -+ elf->broken = msg; -+} -+ -+const char *elf_check_broken(const struct elf_binary *elf) -+{ -+ return elf->broken; -+} -+ -+static int elf_ptrval_in_range(elf_ptrval ptrval, uint64_t size, -+ const void *region, uint64_t regionsize) -+ /* -+ * Returns true if the putative memory area [ptrval,ptrval+size> -+ * is completely inside the region [region,region+regionsize>. -+ * -+ * ptrval and size are the untrusted inputs to be checked. -+ * region and regionsize are trusted and must be correct and valid, -+ * although it is OK for region to perhaps be maliciously NULL -+ * (but not some other malicious value). -+ */ -+{ -+ elf_ptrval regionp = (elf_ptrval)region; -+ -+ if ( (region == NULL) || -+ (ptrval < regionp) || /* start is before region */ -+ (ptrval > regionp + regionsize) || /* start is after region */ -+ (size > regionsize - (ptrval - regionp)) ) /* too big */ -+ return 0; -+ return 1; -+} -+ -+int elf_access_ok(struct elf_binary * elf, -+ uint64_t ptrval, size_t size) -+{ -+ if ( elf_ptrval_in_range(ptrval, size, elf->image_base, elf->size) ) -+ return 1; -+ if ( elf_ptrval_in_range(ptrval, size, elf->dest_base, elf->dest_size) ) -+ return 1; -+ if ( elf_ptrval_in_range(ptrval, size, -+ elf->caller_xdest_base, elf->caller_xdest_size) ) -+ return 1; -+ elf_mark_broken(elf, "out of range access"); -+ return 0; -+} -+ -+void elf_memcpy_safe(struct elf_binary *elf, elf_ptrval dst, -+ elf_ptrval src, size_t size) -+{ -+ if ( elf_access_ok(elf, dst, size) && -+ elf_access_ok(elf, src, size) ) -+ { -+ /* use memmove because these checks do not prove that the -+ * regions don't overlap and overlapping regions grant -+ * permission for compiler malice */ -+ elf_memmove_unchecked(ELF_UNSAFE_PTR(dst), ELF_UNSAFE_PTR(src), size); -+ } -+} -+ -+void elf_memset_safe(struct elf_binary *elf, elf_ptrval dst, int c, size_t size) -+{ -+ if ( elf_access_ok(elf, dst, size) ) -+ { -+ elf_memset_unchecked(ELF_UNSAFE_PTR(dst), c, size); -+ } -+} -+ -+uint64_t elf_access_unsigned(struct elf_binary * elf, elf_ptrval base, -+ uint64_t moreoffset, size_t size) -+{ -+ elf_ptrval ptrval = base + moreoffset; - int need_swap = elf_swap(elf); - const uint8_t *u8; - const uint16_t *u16; - const uint32_t *u32; - const uint64_t *u64; - -+ if ( !elf_access_ok(elf, ptrval, size) ) -+ return 0; -+ - switch ( size ) - { - case 1: -- u8 = ptr + offset; -+ u8 = (const void*)ptrval; - return *u8; - case 2: -- u16 = ptr + offset; -+ u16 = (const void*)ptrval; - return need_swap ? bswap_16(*u16) : *u16; - case 4: -- u32 = ptr + offset; -+ u32 = (const void*)ptrval; - return need_swap ? bswap_32(*u32) : *u32; - case 8: -- u64 = ptr + offset; -+ u64 = (const void*)ptrval; - return need_swap ? bswap_64(*u64) : *u64; - default: - return 0; -@@ -122,6 +194,28 @@ const char *elf_section_name(struct elf_binary *elf, - return elf_strval(elf, elf->sec_strtab + elf_uval(elf, shdr, sh_name)); - } - -+const char *elf_strval(struct elf_binary *elf, elf_ptrval start) -+{ -+ uint64_t length; -+ -+ for ( length = 0; ; length++ ) { -+ if ( !elf_access_ok(elf, start + length, 1) ) -+ return NULL; -+ if ( !elf_access_unsigned(elf, start, length, 1) ) -+ /* ok */ -+ return ELF_UNSAFE_PTR(start); -+ } -+} -+ -+const char *elf_strfmt(struct elf_binary *elf, elf_ptrval start) -+{ -+ const char *str = elf_strval(elf, start); -+ -+ if ( str == NULL ) -+ return "(invalid)"; -+ return str; -+} -+ - ELF_PTRVAL_CONST_VOID elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr) - { - return ELF_IMAGE_BASE(elf) + elf_uval(elf, shdr, sh_offset); -diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h -index af5b5c5..ddc3ed7 100644 ---- a/xen/include/xen/libelf.h -+++ b/xen/include/xen/libelf.h -@@ -57,8 +57,9 @@ typedef void elf_log_callback(struct elf_binary*, void *caller_data, - * on this. - * This replaces variables which were char*,void* - * and their const versions, so we provide four -- * different declaration macros: -+ * different obsolete declaration macros: - * ELF_PTRVAL_{,CONST}{VOID,CHAR} -+ * New code can simply use the elf_ptrval typedef. - * HANDLE A pointer to a struct. There is one of these types - * for each pointer type - that is, for each "structname". - * In the arguments to the various HANDLE macros, structname -@@ -67,54 +68,66 @@ typedef void elf_log_callback(struct elf_binary*, void *caller_data, - * pointers. In the current code attempts to do so will - * compile, but in the next patch this will become a - * compile error. -- * We provide two declaration macros for const and -- * non-const pointers. -+ * We also provide a second declaration macro for -+ * pointers which were to const; this is obsolete. - */ - --#define ELF_REALPTR2PTRVAL(realpointer) (realpointer) -+typedef uintptr_t elf_ptrval; -+ -+#define ELF_REALPTR2PTRVAL(realpointer) ((elf_ptrval)(realpointer)) - /* Converts an actual C pointer into a PTRVAL */ - --#define ELF_HANDLE_DECL_NONCONST(structname) structname * --#define ELF_HANDLE_DECL(structname) const structname * -+#define ELF_HANDLE_DECL_NONCONST(structname) structname##_handle /*obsolete*/ -+#define ELF_HANDLE_DECL(structname) structname##_handle - /* Provides a type declaration for a HANDLE. */ -- /* May only be used to declare ONE variable at a time */ - --#define ELF_PTRVAL_VOID void * --#define ELF_PTRVAL_CHAR char * --#define ELF_PTRVAL_CONST_VOID const void * --#define ELF_PTRVAL_CONST_CHAR const char * -- /* Provides a type declaration for a PTRVAL. */ -- /* May only be used to declare ONE variable at a time */ -+#define ELF_PTRVAL_VOID elf_ptrval /*obsolete*/ -+#define ELF_PTRVAL_CHAR elf_ptrval /*obsolete*/ -+#define ELF_PTRVAL_CONST_VOID elf_ptrval /*obsolete*/ -+#define ELF_PTRVAL_CONST_CHAR elf_ptrval /*obsolete*/ -+ -+#ifdef __XEN__ -+# define ELF_PRPTRVAL "lu" -+ /* -+ * PRIuPTR is misdefined in xen/include/xen/inttypes.h, on 32-bit, -+ * to "u", when in fact uintptr_t is an unsigned long. -+ */ -+#else -+# define ELF_PRPTRVAL PRIuPTR -+#endif -+ /* printf format a la PRId... for a PTRVAL */ - --#define ELF_DEFINE_HANDLE(structname) /* empty */ -+#define ELF_DEFINE_HANDLE(structname) \ -+ typedef union { \ -+ elf_ptrval ptrval; \ -+ const structname *typeonly; /* for sizeof, offsetof, &c only */ \ -+ } structname##_handle; - /* - * This must be invoked for each HANDLE type to define - * the actual C type used for that kind of HANDLE. - */ - --#define ELF_PRPTRVAL "p" -- /* printf format a la PRId... for a PTRVAL */ -- --#define ELF_MAKE_HANDLE(structname, ptrval) (ptrval) -+#define ELF_MAKE_HANDLE(structname, ptrval) ((structname##_handle){ ptrval }) - /* Converts a PTRVAL to a HANDLE */ - --#define ELF_IMAGE_BASE(elf) ((elf)->image) -+#define ELF_IMAGE_BASE(elf) ((elf_ptrval)(elf)->image_base) - /* Returns the base of the image as a PTRVAL. */ - --#define ELF_HANDLE_PTRVAL(handleval) ((void*)(handleval)) -+#define ELF_HANDLE_PTRVAL(handleval) ((handleval).ptrval) - /* Converts a HANDLE to a PTRVAL. */ - --#define ELF_OBSOLETE_VOIDP_CAST (void*)(uintptr_t) -+#define ELF_OBSOLETE_VOIDP_CAST /*empty*/ - /* -- * In some places the existing code needs to -+ * In some places the old code used to need to - * - cast away const (the existing code uses const a fair - * bit but actually sometimes wants to write to its input) - * from a PTRVAL. - * - convert an integer representing a pointer to a PTRVAL -- * This macro provides a suitable cast. -+ * Nowadays all of these re uintptr_ts so there is no const problem -+ * and no need for any casting. - */ - --#define ELF_UNSAFE_PTR(ptrval) ((void*)(uintptr_t)(ptrval)) -+#define ELF_UNSAFE_PTR(ptrval) ((void*)(elf_ptrval)(ptrval)) - /* - * Turns a PTRVAL into an actual C pointer. Before this is done - * the caller must have ensured that the PTRVAL does in fact point -@@ -122,18 +135,21 @@ typedef void elf_log_callback(struct elf_binary*, void *caller_data, - */ - - /* PTRVALs can be INVALID (ie, NULL). */ --#define ELF_INVALID_PTRVAL (NULL) /* returns NULL PTRVAL */ -+#define ELF_INVALID_PTRVAL ((elf_ptrval)0) /* returns NULL PTRVAL */ - #define ELF_INVALID_HANDLE(structname) /* returns NULL handle */ \ - ELF_MAKE_HANDLE(structname, ELF_INVALID_PTRVAL) --#define ELF_PTRVAL_VALID(ptrval) (ptrval) /* } */ --#define ELF_HANDLE_VALID(handleval) (handleval) /* } predicates */ --#define ELF_PTRVAL_INVALID(ptrval) ((ptrval) == NULL) /* } */ -+#define ELF_PTRVAL_VALID(ptrval) (!!(ptrval)) /* } */ -+#define ELF_HANDLE_VALID(handleval) (!!(handleval).ptrval) /* } predicates */ -+#define ELF_PTRVAL_INVALID(ptrval) (!ELF_PTRVAL_VALID((ptrval))) /* } */ -+ -+#define ELF_MAX_PTRVAL (~(elf_ptrval)0) -+ /* PTRVAL value guaranteed to compare > to any valid PTRVAL */ - - /* For internal use by other macros here */ - #define ELF__HANDLE_FIELD_TYPE(handleval, elm) \ -- typeof((handleval)->elm) -+ typeof((handleval).typeonly->elm) - #define ELF__HANDLE_FIELD_OFFSET(handleval, elm) \ -- offsetof(typeof(*(handleval)),elm) -+ offsetof(typeof(*(handleval).typeonly),elm) - - - /* ------------------------------------------------------------------------ */ -@@ -182,7 +198,7 @@ ELF_DEFINE_HANDLE(elf_note) - - struct elf_binary { - /* elf binary */ -- const char *image; -+ const void *image_base; - size_t size; - char class; - char data; -@@ -190,10 +206,16 @@ struct elf_binary { - ELF_HANDLE_DECL(elf_ehdr) ehdr; - ELF_PTRVAL_CONST_CHAR sec_strtab; - ELF_HANDLE_DECL(elf_shdr) sym_tab; -- ELF_PTRVAL_CONST_CHAR sym_strtab; -+ uint64_t sym_strtab; - - /* loaded to */ -- char *dest; -+ /* -+ * dest_base and dest_size are trusted and must be correct; -+ * whenever dest_size is not 0, both of these must be valid -+ * so long as the struct elf_binary is in use. -+ */ -+ char *dest_base; -+ size_t dest_size; - uint64_t pstart; - uint64_t pend; - uint64_t reloc_offset; -@@ -201,12 +223,22 @@ struct elf_binary { - uint64_t bsd_symtab_pstart; - uint64_t bsd_symtab_pend; - -+ /* -+ * caller's other acceptable destination -+ * -+ * Again, these are trusted and must be valid (or 0) so long -+ * as the struct elf_binary is in use. -+ */ -+ void *caller_xdest_base; -+ uint64_t caller_xdest_size; -+ - #ifndef __XEN__ - /* misc */ - elf_log_callback *log_callback; - void *log_caller_data; - #endif - int verbose; -+ const char *broken; - }; - - /* ------------------------------------------------------------------------ */ -@@ -224,22 +256,27 @@ struct elf_binary { - #define elf_lsb(elf) (ELFDATA2LSB == (elf)->data) - #define elf_swap(elf) (NATIVE_ELFDATA != (elf)->data) - --#define elf_uval(elf, str, elem) \ -- ((ELFCLASS64 == (elf)->class) \ -- ? elf_access_unsigned((elf), (str), \ -- offsetof(typeof(*(str)),e64.elem), \ -- sizeof((str)->e64.elem)) \ -- : elf_access_unsigned((elf), (str), \ -- offsetof(typeof(*(str)),e32.elem), \ -- sizeof((str)->e32.elem))) -+#define elf_uval_3264(elf, handle, elem) \ -+ elf_access_unsigned((elf), (handle).ptrval, \ -+ offsetof(typeof(*(handle).typeonly),elem), \ -+ sizeof((handle).typeonly->elem)) -+ -+#define elf_uval(elf, handle, elem) \ -+ ((ELFCLASS64 == (elf)->class) \ -+ ? elf_uval_3264(elf, handle, e64.elem) \ -+ : elf_uval_3264(elf, handle, e32.elem)) - /* - * Reads an unsigned field in a header structure in the ELF. - * str is a HANDLE, and elem is the field name in it. - */ - --#define elf_size(elf, str) \ -+ -+#define elf_size(elf, handle_or_handletype) ({ \ -+ typeof(handle_or_handletype) elf_size__dummy; \ - ((ELFCLASS64 == (elf)->class) \ -- ? sizeof((str)->e64) : sizeof((str)->e32)) -+ ? sizeof(elf_size__dummy.typeonly->e64) \ -+ : sizeof(elf_size__dummy.typeonly->e32)); \ -+}) - /* - * Returns the size of the substructure for the appropriate 32/64-bitness. - * str should be a HANDLE. -@@ -251,23 +288,37 @@ uint64_t elf_access_unsigned(struct elf_binary *elf, ELF_PTRVAL_CONST_VOID ptr, - - uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr); - -+const char *elf_strval(struct elf_binary *elf, elf_ptrval start); -+ /* may return NULL if the string is out of range etc. */ - --#define elf_strval(elf,x) ((const char*)(x)) /* may return NULL in the future */ --#define elf_strfmt(elf,x) ((const char*)(x)) /* will return (invalid) instead */ -+const char *elf_strfmt(struct elf_binary *elf, elf_ptrval start); -+ /* like elf_strval but returns "(invalid)" instead of NULL */ - --#define elf_memcpy_safe(elf, dst, src, sz) memcpy((dst),(src),(sz)) --#define elf_memset_safe(elf, dst, c, sz) memset((dst),(c),(sz)) -+void elf_memcpy_safe(struct elf_binary*, elf_ptrval dst, elf_ptrval src, size_t); -+void elf_memset_safe(struct elf_binary*, elf_ptrval dst, int c, size_t); - /* -- * Versions of memcpy and memset which will (in the next patch) -- * arrange never to write outside permitted areas. -+ * Versions of memcpy and memset which arrange never to write -+ * outside permitted areas. - */ - --#define elf_store_val(elf, type, ptr, val) (*(type*)(ptr) = (val)) -+int elf_access_ok(struct elf_binary * elf, -+ uint64_t ptrval, size_t size); -+ -+#define elf_store_val(elf, type, ptr, val) \ -+ ({ \ -+ typeof(type) elf_store__val = (val); \ -+ elf_ptrval elf_store__targ = ptr; \ -+ if (elf_access_ok((elf), elf_store__targ, \ -+ sizeof(elf_store__val))) { \ -+ elf_memcpy_unchecked((void*)elf_store__targ, &elf_store__val, \ -+ sizeof(elf_store__val)); \ -+ } \ -+ }) \ - /* Stores a value at a particular PTRVAL. */ - --#define elf_store_field(elf, hdr, elm, val) \ -- (elf_store_val((elf), ELF__HANDLE_FIELD_TYPE(hdr, elm), \ -- &((hdr)->elm), \ -+#define elf_store_field(elf, hdr, elm, val) \ -+ (elf_store_val((elf), ELF__HANDLE_FIELD_TYPE(hdr, elm), \ -+ ELF_HANDLE_PTRVAL(hdr) + ELF__HANDLE_FIELD_OFFSET(hdr, elm), \ - (val))) - /* Stores a 32/64-bit field. hdr is a HANDLE and elm is the field name. */ - -@@ -306,6 +357,10 @@ int elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) - /* xc_libelf_loader.c */ - - int elf_init(struct elf_binary *elf, const char *image, size_t size); -+ /* -+ * image and size must be correct. They will be recorded in -+ * *elf, and must remain valid while the elf is in use. -+ */ - #ifdef __XEN__ - void elf_set_verbose(struct elf_binary *elf); - #else -@@ -321,6 +376,9 @@ uint64_t elf_lookup_addr(struct elf_binary *elf, const char *symbol); - - void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart); /* private */ - -+void elf_mark_broken(struct elf_binary *elf, const char *msg); -+const char *elf_check_broken(const struct elf_binary *elf); /* NULL means OK */ -+ - /* ------------------------------------------------------------------------ */ - /* xc_libelf_relocate.c */ - -@@ -395,16 +453,38 @@ int elf_xen_parse_guest_info(struct elf_binary *elf, - int elf_xen_parse(struct elf_binary *elf, - struct elf_dom_parms *parms); - --#define elf_memcpy_unchecked memcpy --#define elf_memset_unchecked memset -+static inline void *elf_memcpy_unchecked(void *dest, const void *src, size_t n) -+ { return memcpy(dest, src, n); } -+static inline void *elf_memmove_unchecked(void *dest, const void *src, size_t n) -+ { return memmove(dest, src, n); } -+static inline void *elf_memset_unchecked(void *s, int c, size_t n) -+ { return memset(s, c, n); } - /* -- * Unsafe versions of memcpy and memset which take actual C -- * pointers. These are just like real memcpy and memset. -+ * Unsafe versions of memcpy, memmove memset which take actual C -+ * pointers. These are just like the real functions. -+ * We provide these so that in libelf-private.h we can #define -+ * memcpy, memset and memmove to undefined MISTAKE things. - */ - - --#define ELF_ADVANCE_DEST(elf, amount) elf->dest += (amount) -- /* Advances past amount bytes of the current destination area. */ -+/* Advances past amount bytes of the current destination area. */ -+static inline void ELF_ADVANCE_DEST(struct elf_binary *elf, uint64_t amount) -+{ -+ if ( elf->dest_base == NULL ) -+ { -+ elf_mark_broken(elf, "advancing in null image"); -+ } -+ else if ( elf->dest_size >= amount ) -+ { -+ elf->dest_base += amount; -+ elf->dest_size -= amount; -+ } -+ else -+ { -+ elf->dest_size = 0; -+ elf_mark_broken(elf, "advancing past end (image very short?)"); -+ } -+} - - - #endif /* __XEN_LIBELF_H__ */ --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0012-libelf-Check-pointer-references-in-elf_is_elfbinary.patch xen-4.3.0/debian/patches/xsa55-4.2-0012-libelf-Check-pointer-references-in-elf_is_elfbinary.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0012-libelf-Check-pointer-references-in-elf_is_elfbinary.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0012-libelf-Check-pointer-references-in-elf_is_elfbinary.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -From d0790bdad7496e720416b2d4a04563c4c27e7b95 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:17 +0100 -Subject: [PATCH 12/23] libelf: Check pointer references in elf_is_elfbinary - -elf_is_elfbinary didn't take a length parameter and could potentially -access out of range when provided with a very short image. - -We only need to check the size is enough for the actual dereference in -elf_is_elfbinary; callers are just using it to check the magic number -and do their own checks (usually via the new elf_ptrval system) before -dereferencing other parts of the header. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell -Reviewed-by: Konrad Rzeszutek Wilk ---- - tools/libxc/xc_dom_elfloader.c | 2 +- - xen/arch/x86/bzimage.c | 4 ++-- - xen/common/libelf/libelf-loader.c | 2 +- - xen/common/libelf/libelf-tools.c | 9 ++++++--- - xen/include/xen/libelf.h | 4 +++- - 5 files changed, 13 insertions(+), 8 deletions(-) - -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index b82a08c..ea45886 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -95,7 +95,7 @@ static int check_elf_kernel(struct xc_dom_image *dom, int verbose) - return -EINVAL; - } - -- if ( !elf_is_elfbinary(dom->kernel_blob) ) -+ if ( !elf_is_elfbinary(dom->kernel_blob, dom->kernel_size) ) - { - if ( verbose ) - xc_dom_panic(dom->xch, -diff --git a/xen/arch/x86/bzimage.c b/xen/arch/x86/bzimage.c -index 5adc223..3600dca 100644 ---- a/xen/arch/x86/bzimage.c -+++ b/xen/arch/x86/bzimage.c -@@ -220,7 +220,7 @@ unsigned long __init bzimage_headroom(char *image_start, - image_length = hdr->payload_length; - } - -- if ( elf_is_elfbinary(image_start) ) -+ if ( elf_is_elfbinary(image_start, image_length) ) - return 0; - - orig_image_len = image_length; -@@ -251,7 +251,7 @@ int __init bzimage_parse(char *image_base, char **image_start, unsigned long *im - *image_len = hdr->payload_length; - } - -- if ( elf_is_elfbinary(*image_start) ) -+ if ( elf_is_elfbinary(*image_start, *image_len) ) - return 0; - - BUG_ON(!(image_base < *image_start)); -diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c -index a3310e7..f8be635 100644 ---- a/xen/common/libelf/libelf-loader.c -+++ b/xen/common/libelf/libelf-loader.c -@@ -29,7 +29,7 @@ int elf_init(struct elf_binary *elf, const char *image_input, size_t size) - ELF_HANDLE_DECL(elf_shdr) shdr; - uint64_t i, count, section, offset; - -- if ( !elf_is_elfbinary(image_input) ) -+ if ( !elf_is_elfbinary(image_input, size) ) - { - elf_err(elf, "%s: not an ELF binary\n", __FUNCTION__); - return -1; -diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c -index 46ca553..744027e 100644 ---- a/xen/common/libelf/libelf-tools.c -+++ b/xen/common/libelf/libelf-tools.c -@@ -332,11 +332,14 @@ ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, ELF_HANDLE_DECL( - - /* ------------------------------------------------------------------------ */ - --int elf_is_elfbinary(const void *image) -+int elf_is_elfbinary(const void *image_start, size_t image_size) - { -- const Elf32_Ehdr *ehdr = image; -+ const Elf32_Ehdr *ehdr = image_start; - -- return IS_ELF(*ehdr); /* fixme unchecked */ -+ if ( image_size < sizeof(*ehdr) ) -+ return 0; -+ -+ return IS_ELF(*ehdr); - } - - int elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) -diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h -index ddc3ed7..ac93858 100644 ---- a/xen/include/xen/libelf.h -+++ b/xen/include/xen/libelf.h -@@ -350,7 +350,9 @@ uint64_t elf_note_numeric_array(struct elf_binary *, ELF_HANDLE_DECL(elf_note), - unsigned int unitsz, unsigned int idx); - ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); - --int elf_is_elfbinary(const void *image); -+/* (Only) checks that the image has the right magic number. */ -+int elf_is_elfbinary(const void *image_start, size_t image_size); -+ - int elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); - - /* ------------------------------------------------------------------------ */ --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0013-libelf-Make-all-callers-call-elf_check_broken.patch xen-4.3.0/debian/patches/xsa55-4.2-0013-libelf-Make-all-callers-call-elf_check_broken.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0013-libelf-Make-all-callers-call-elf_check_broken.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0013-libelf-Make-all-callers-call-elf_check_broken.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,257 +0,0 @@ -From a965b8f80388603d439ae2b8ee7b9b018a079f90 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:17 +0100 -Subject: [PATCH 13/23] libelf: Make all callers call elf_check_broken - -This arranges that if the new pointer reference error checking -tripped, we actually get a message about it. In this patch these -messages do not change the actual return values from the various -functions: so pointer reference errors do not prevent loading. This -is for fear that some existing kernels might cause the code to make -these wild references, which would then break, which is not a good -thing in a security patch. - -In xen/arch/x86/domain_build.c we have to introduce an "out" label and -change all of the "return rc" beyond the relevant point into "goto -out". - -Difference in the 4.2 series, compared to unstable: - -* tools/libxc/xc_hvm_build_x86.c:setup_guest and - xen/arch/arm/kernel.c:kernel_try_elf_prepare have different - error handling in 4.2 to unstable; patch adjusted accordingly. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson - -xen-unstable version Reviewed-by: George Dunlap ---- - tools/libxc/xc_dom_elfloader.c | 25 +++++++++++++++++++++---- - tools/libxc/xc_hvm_build_x86.c | 5 +++++ - tools/xcutils/readnotes.c | 3 +++ - xen/arch/arm/kernel.c | 15 ++++++++++++++- - xen/arch/x86/domain_build.c | 28 +++++++++++++++++++++------- - 5 files changed, 64 insertions(+), 12 deletions(-) - -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index ea45886..4fb4da2 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -276,6 +276,13 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - elf_store_field(elf, shdr, e32.sh_name, 0); - } - -+ if ( elf_check_broken(&syms) ) -+ DOMPRINTF("%s: symbols ELF broken: %s", __FUNCTION__, -+ elf_check_broken(&syms)); -+ if ( elf_check_broken(elf) ) -+ DOMPRINTF("%s: ELF broken: %s", __FUNCTION__, -+ elf_check_broken(elf)); -+ - if ( tables == 0 ) - { - DOMPRINTF("%s: no symbol table present", __FUNCTION__); -@@ -312,19 +319,23 @@ static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom) - { - xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: ELF image" - " has no shstrtab", __FUNCTION__); -- return -EINVAL; -+ rc = -EINVAL; -+ goto out; - } - - /* parse binary and get xen meta info */ - elf_parse_binary(elf); - if ( (rc = elf_xen_parse(elf, &dom->parms)) != 0 ) -- return rc; -+ { -+ goto out; -+ } - - if ( elf_xen_feature_get(XENFEAT_dom0, dom->parms.f_required) ) - { - xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: Kernel does not" - " support unprivileged (DomU) operation", __FUNCTION__); -- return -EINVAL; -+ rc = -EINVAL; -+ goto out; - } - - /* find kernel segment */ -@@ -338,7 +349,13 @@ static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom) - DOMPRINTF("%s: %s: 0x%" PRIx64 " -> 0x%" PRIx64 "", - __FUNCTION__, dom->guest_type, - dom->kernel_seg.vstart, dom->kernel_seg.vend); -- return 0; -+ rc = 0; -+out: -+ if ( elf_check_broken(elf) ) -+ DOMPRINTF("%s: ELF broken: %s", __FUNCTION__, -+ elf_check_broken(elf)); -+ -+ return rc; - } - - static int xc_dom_load_elf_kernel(struct xc_dom_image *dom) -diff --git a/tools/libxc/xc_hvm_build_x86.c b/tools/libxc/xc_hvm_build_x86.c -index ccfd8b5..8165287 100644 ---- a/tools/libxc/xc_hvm_build_x86.c -+++ b/tools/libxc/xc_hvm_build_x86.c -@@ -403,11 +403,16 @@ static int setup_guest(xc_interface *xch, - munmap(page0, PAGE_SIZE); - } - -+ if ( elf_check_broken(&elf) ) -+ ERROR("HVM ELF broken: %s", elf_check_broken(&elf)); -+ - free(page_array); - return 0; - - error_out: - free(page_array); -+ if ( elf_check_broken(&elf) ) -+ ERROR("HVM ELF broken, failing: %s", elf_check_broken(&elf)); - return -1; - } - -diff --git a/tools/xcutils/readnotes.c b/tools/xcutils/readnotes.c -index cfae994..d1f7a30 100644 ---- a/tools/xcutils/readnotes.c -+++ b/tools/xcutils/readnotes.c -@@ -301,6 +301,9 @@ int main(int argc, char **argv) - printf("__xen_guest: %s\n", - elf_strfmt(&elf, elf_section_start(&elf, shdr))); - -+ if (elf_check_broken(&elf)) -+ printf("warning: broken ELF: %s\n", elf_check_broken(&elf)); -+ - return 0; - } - -diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c -index 2d56130..dec0519 100644 ---- a/xen/arch/arm/kernel.c -+++ b/xen/arch/arm/kernel.c -@@ -146,6 +146,8 @@ static int kernel_try_elf_prepare(struct kernel_info *info) - { - int rc; - -+ memset(&info->elf.elf, 0, sizeof(info->elf.elf)); -+ - info->kernel_order = get_order_from_bytes(KERNEL_FLASH_SIZE); - info->kernel_img = alloc_xenheap_pages(info->kernel_order, 0); - if ( info->kernel_img == NULL ) -@@ -160,7 +162,7 @@ static int kernel_try_elf_prepare(struct kernel_info *info) - #endif - elf_parse_binary(&info->elf.elf); - if ( (rc = elf_xen_parse(&info->elf.elf, &info->elf.parms)) != 0 ) -- return rc; -+ goto err; - - /* - * TODO: can the ELF header be used to find the physical address -@@ -169,7 +171,18 @@ static int kernel_try_elf_prepare(struct kernel_info *info) - info->entry = info->elf.parms.virt_entry; - info->load = kernel_elf_load; - -+ if ( elf_check_broken(&info->elf.elf) ) -+ printk("Xen: warning: ELF kernel broken: %s\n", -+ elf_check_broken(&info->elf.elf)); -+ - return 0; -+ -+err: -+ if ( elf_check_broken(&info->elf.elf) ) -+ printk("Xen: ELF kernel broken: %s\n", -+ elf_check_broken(&info->elf.elf)); -+ -+ return rc; - } - - int kernel_prepare(struct kernel_info *info) -diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c -index a655b21..0dbec96 100644 ---- a/xen/arch/x86/domain_build.c -+++ b/xen/arch/x86/domain_build.c -@@ -374,7 +374,7 @@ int __init construct_dom0( - #endif - elf_parse_binary(&elf); - if ( (rc = elf_xen_parse(&elf, &parms)) != 0 ) -- return rc; -+ goto out; - - /* compatibility check */ - compatible = 0; -@@ -413,14 +413,16 @@ int __init construct_dom0( - if ( !compatible ) - { - printk("Mismatch between Xen and DOM0 kernel\n"); -- return -EINVAL; -+ rc = -EINVAL; -+ goto out; - } - - if ( parms.elf_notes[XEN_ELFNOTE_SUPPORTED_FEATURES].type != XEN_ENT_NONE && - !test_bit(XENFEAT_dom0, parms.f_supported) ) - { - printk("Kernel does not support Dom0 operation\n"); -- return -EINVAL; -+ rc = -EINVAL; -+ goto out; - } - - #if defined(__x86_64__) -@@ -734,7 +736,8 @@ int __init construct_dom0( - (v_end > HYPERVISOR_COMPAT_VIRT_START(d)) ) - { - printk("DOM0 image overlaps with Xen private area.\n"); -- return -EINVAL; -+ rc = -EINVAL; -+ goto out; - } - - if ( is_pv_32on64_domain(d) ) -@@ -914,7 +917,7 @@ int __init construct_dom0( - if ( rc < 0 ) - { - printk("Failed to load the kernel binary\n"); -- return rc; -+ goto out; - } - bootstrap_map(NULL); - -@@ -925,7 +928,8 @@ int __init construct_dom0( - { - write_ptbase(current); - printk("Invalid HYPERCALL_PAGE field in ELF notes.\n"); -- return -1; -+ rc = -1; -+ goto out; - } - hypercall_page_initialise( - d, (void *)(unsigned long)parms.virt_hypercall); -@@ -1272,9 +1276,19 @@ int __init construct_dom0( - - BUG_ON(rc != 0); - -- iommu_dom0_init(dom0); -+ if ( elf_check_broken(&elf) ) -+ printk(" Xen warning: dom0 kernel broken ELF: %s\n", -+ elf_check_broken(&elf)); - -+ iommu_dom0_init(dom0); - return 0; -+ -+out: -+ if ( elf_check_broken(&elf) ) -+ printk(" Xen dom0 kernel broken ELF: %s\n", -+ elf_check_broken(&elf)); -+ -+ return rc; - } - - /* --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0014-libelf-use-C99-bool-for-booleans.patch xen-4.3.0/debian/patches/xsa55-4.2-0014-libelf-use-C99-bool-for-booleans.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0014-libelf-use-C99-bool-for-booleans.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0014-libelf-use-C99-bool-for-booleans.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,252 +0,0 @@ -From 3fb6ccf2faccaf5e22e33a3155ccc72d732896d8 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:18 +0100 -Subject: [PATCH 14/23] libelf: use C99 bool for booleans - -We want to remove uses of "int" because signed integers have -undesirable undefined behaviours on overflow. Malicious compilers can -turn apparently-correct code into code with security vulnerabilities -etc. - -In this patch we change all the booleans in libelf to C99 bool, -from . - -For the one visible libelf boolean in libxc's public interface we -retain the use of int to avoid changing the ABI; libxc converts it to -a bool for consumption by libelf. - -It is OK to change all values only ever used as booleans to _Bool -(bool) because conversion from any scalar type to a _Bool works the -same as the boolean test in if() or ?: and is always defined (C99 -6.3.1.2). But we do need to check that all these variables really are -only ever used that way. (It is theoretically possible that the old -code truncated some 64-bit values to 32-bit ints which might become -zero depending on the value, which would mean a behavioural change in -this patch, but it seems implausible that treating 0x????????00000000 -as false could have been intended.) - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Acked-by: George Dunlap ---- - tools/libxc/xc_dom_elfloader.c | 8 ++++---- - xen/common/libelf/libelf-dominfo.c | 2 +- - xen/common/libelf/libelf-loader.c | 4 ++-- - xen/common/libelf/libelf-private.h | 2 +- - xen/common/libelf/libelf-tools.c | 10 +++++----- - xen/include/xen/libelf.h | 18 ++++++++++-------- - 6 files changed, 23 insertions(+), 21 deletions(-) - -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index 4fb4da2..9ba64ae 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -34,7 +34,7 @@ - /* ------------------------------------------------------------------------ */ - - static void log_callback(struct elf_binary *elf, void *caller_data, -- int iserr, const char *fmt, va_list al) { -+ bool iserr, const char *fmt, va_list al) { - xc_interface *xch = caller_data; - - xc_reportv(xch, -@@ -46,7 +46,7 @@ static void log_callback(struct elf_binary *elf, void *caller_data, - - void xc_elf_set_logfile(xc_interface *xch, struct elf_binary *elf, - int verbose) { -- elf_set_log(elf, log_callback, xch, verbose); -+ elf_set_log(elf, log_callback, xch, verbose /* convert to bool */); - } - - /* ------------------------------------------------------------------------ */ -@@ -84,7 +84,7 @@ static char *xc_dom_guest_type(struct xc_dom_image *dom, - /* ------------------------------------------------------------------------ */ - /* parse elf binary */ - --static int check_elf_kernel(struct xc_dom_image *dom, int verbose) -+static int check_elf_kernel(struct xc_dom_image *dom, bool verbose) - { - if ( dom->kernel_blob == NULL ) - { -@@ -112,7 +112,7 @@ static int xc_dom_probe_elf_kernel(struct xc_dom_image *dom) - } - - static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, -- struct elf_binary *elf, int load) -+ struct elf_binary *elf, bool load) - { - struct elf_binary syms; - ELF_HANDLE_DECL_NONCONST(elf_shdr) shdr; ELF_HANDLE_DECL(elf_shdr) shdr2; -diff --git a/xen/common/libelf/libelf-dominfo.c b/xen/common/libelf/libelf-dominfo.c -index 98c80dc..12b6c2a 100644 ---- a/xen/common/libelf/libelf-dominfo.c -+++ b/xen/common/libelf/libelf-dominfo.c -@@ -101,7 +101,7 @@ int elf_xen_parse_note(struct elf_binary *elf, - /* *INDENT-OFF* */ - static const struct { - char *name; -- int str; -+ bool str; - } note_desc[] = { - [XEN_ELFNOTE_ENTRY] = { "ENTRY", 0}, - [XEN_ELFNOTE_HYPERCALL_PAGE] = { "HYPERCALL_PAGE", 0}, -diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c -index f8be635..0dccd4d 100644 ---- a/xen/common/libelf/libelf-loader.c -+++ b/xen/common/libelf/libelf-loader.c -@@ -92,7 +92,7 @@ int elf_init(struct elf_binary *elf, const char *image_input, size_t size) - } - - #ifndef __XEN__ --void elf_call_log_callback(struct elf_binary *elf, int iserr, -+void elf_call_log_callback(struct elf_binary *elf, bool iserr, - const char *fmt,...) { - va_list al; - -@@ -107,7 +107,7 @@ void elf_call_log_callback(struct elf_binary *elf, int iserr, - } - - void elf_set_log(struct elf_binary *elf, elf_log_callback *log_callback, -- void *log_caller_data, int verbose) -+ void *log_caller_data, bool verbose) - { - elf->log_callback = log_callback; - elf->log_caller_data = log_caller_data; -diff --git a/xen/common/libelf/libelf-private.h b/xen/common/libelf/libelf-private.h -index 280dfd1..277be04 100644 ---- a/xen/common/libelf/libelf-private.h -+++ b/xen/common/libelf/libelf-private.h -@@ -77,7 +77,7 @@ - #define elf_err(elf, fmt, args ... ) \ - elf_call_log_callback(elf, 1, fmt , ## args ); - --void elf_call_log_callback(struct elf_binary*, int iserr, const char *fmt,...); -+void elf_call_log_callback(struct elf_binary*, bool iserr, const char *fmt,...); - - #define safe_strcpy(d,s) \ - do { strncpy((d),(s),sizeof((d))-1); \ -diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c -index 744027e..fa58f76 100644 ---- a/xen/common/libelf/libelf-tools.c -+++ b/xen/common/libelf/libelf-tools.c -@@ -31,7 +31,7 @@ const char *elf_check_broken(const struct elf_binary *elf) - return elf->broken; - } - --static int elf_ptrval_in_range(elf_ptrval ptrval, uint64_t size, -+static bool elf_ptrval_in_range(elf_ptrval ptrval, uint64_t size, - const void *region, uint64_t regionsize) - /* - * Returns true if the putative memory area [ptrval,ptrval+size> -@@ -53,7 +53,7 @@ static int elf_ptrval_in_range(elf_ptrval ptrval, uint64_t size, - return 1; - } - --int elf_access_ok(struct elf_binary * elf, -+bool elf_access_ok(struct elf_binary * elf, - uint64_t ptrval, size_t size) - { - if ( elf_ptrval_in_range(ptrval, size, elf->image_base, elf->size) ) -@@ -92,7 +92,7 @@ uint64_t elf_access_unsigned(struct elf_binary * elf, elf_ptrval base, - uint64_t moreoffset, size_t size) - { - elf_ptrval ptrval = base + moreoffset; -- int need_swap = elf_swap(elf); -+ bool need_swap = elf_swap(elf); - const uint8_t *u8; - const uint16_t *u16; - const uint32_t *u32; -@@ -332,7 +332,7 @@ ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, ELF_HANDLE_DECL( - - /* ------------------------------------------------------------------------ */ - --int elf_is_elfbinary(const void *image_start, size_t image_size) -+bool elf_is_elfbinary(const void *image_start, size_t image_size) - { - const Elf32_Ehdr *ehdr = image_start; - -@@ -342,7 +342,7 @@ int elf_is_elfbinary(const void *image_start, size_t image_size) - return IS_ELF(*ehdr); - } - --int elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) -+bool elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) - { - uint64_t p_type = elf_uval(elf, phdr, p_type); - uint64_t p_flags = elf_uval(elf, phdr, p_flags); -diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h -index ac93858..951430f 100644 ---- a/xen/include/xen/libelf.h -+++ b/xen/include/xen/libelf.h -@@ -29,6 +29,8 @@ - #error define architectural endianness - #endif - -+#include -+ - #undef ELFSIZE - #include "elfstructs.h" - #ifdef __XEN__ -@@ -42,7 +44,7 @@ - - struct elf_binary; - typedef void elf_log_callback(struct elf_binary*, void *caller_data, -- int iserr, const char *fmt, va_list al); -+ bool iserr, const char *fmt, va_list al); - - #endif - -@@ -237,7 +239,7 @@ struct elf_binary { - elf_log_callback *log_callback; - void *log_caller_data; - #endif -- int verbose; -+ bool verbose; - const char *broken; - }; - -@@ -301,8 +303,8 @@ void elf_memset_safe(struct elf_binary*, elf_ptrval dst, int c, size_t); - * outside permitted areas. - */ - --int elf_access_ok(struct elf_binary * elf, -- uint64_t ptrval, size_t size); -+bool elf_access_ok(struct elf_binary * elf, -+ uint64_t ptrval, size_t size); - - #define elf_store_val(elf, type, ptr, val) \ - ({ \ -@@ -351,9 +353,9 @@ uint64_t elf_note_numeric_array(struct elf_binary *, ELF_HANDLE_DECL(elf_note), - ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); - - /* (Only) checks that the image has the right magic number. */ --int elf_is_elfbinary(const void *image_start, size_t image_size); -+bool elf_is_elfbinary(const void *image_start, size_t image_size); - --int elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); -+bool elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); - - /* ------------------------------------------------------------------------ */ - /* xc_libelf_loader.c */ -@@ -367,7 +369,7 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size); - void elf_set_verbose(struct elf_binary *elf); - #else - void elf_set_log(struct elf_binary *elf, elf_log_callback*, -- void *log_caller_pointer, int verbose); -+ void *log_caller_pointer, bool verbose); - #endif - - void elf_parse_binary(struct elf_binary *elf); -@@ -419,7 +421,7 @@ struct elf_dom_parms { - char xen_ver[16]; - char loader[16]; - int pae; -- int bsd_symtab; -+ bool bsd_symtab; - uint64_t virt_base; - uint64_t virt_entry; - uint64_t virt_hypercall; --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0015-libelf-use-only-unsigned-integers.patch xen-4.3.0/debian/patches/xsa55-4.2-0015-libelf-use-only-unsigned-integers.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0015-libelf-use-only-unsigned-integers.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0015-libelf-use-only-unsigned-integers.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,759 +0,0 @@ -From e673ca50127b6c1263727aa31de0b8bb966ca7a2 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:18 +0100 -Subject: [PATCH 15/23] libelf: use only unsigned integers - -Signed integers have undesirable undefined behaviours on overflow. -Malicious compilers can turn apparently-correct code into code with -security vulnerabilities etc. - -So use only unsigned integers. Exceptions are booleans (which we have -already changed) and error codes. - -We _do_ change all the chars which aren't fixed constants from our own -text segment, but not the char*s. This is because it is safe to -access an arbitrary byte through a char*, but not necessarily safe to -convert an arbitrary value to a char. - -As a consequence we need to compile libelf with -Wno-pointer-sign. - -It is OK to change all the signed integers to unsigned because all the -inequalities in libelf are in contexts where we don't "expect" -negative numbers. - -In libelf-dominfo.c:elf_xen_parse we rename a variable "rc" to -"more_notes" as it actually contains a note count derived from the -input image. The "error" return value from elf_xen_parse_notes is -changed from -1 to ~0U. - -grepping shows only one occurrence of "PRId" or "%d" or "%ld" in -libelf and xc_dom_elfloader.c (a "%d" which becomes "%u"). - -This is part of the fix to a security issue, XSA-55. - -For those concerned about unintentional functional changes, the -following rune produces a version of the patch which is much smaller -and eliminates only non-functional changes: - - GIT_EXTERNAL_DIFF=.../unsigned-differ git-diff .. - -where and are git refs for the code before and after -this patch, and unsigned-differ is this shell script: - - #!/bin/bash - set -e - - seddery () { - perl -pe 's/\b(?:elf_errorstatus|elf_negerrnoval)\b/int/g' - } - - path="$1" - in="$2" - out="$5" - - set +e - diff -pu --label "$path~" <(seddery <"$in") --label "$path" <(seddery <"$out") - rc=$? - set -e - if [ $rc = 1 ]; then rc=0; fi - exit $rc - -Signed-off-by: Ian Jackson ---- - tools/libxc/Makefile | 9 +++++- - tools/libxc/xc_dom.h | 7 +++-- - tools/libxc/xc_dom_elfloader.c | 42 ++++++++++++++++------------- - tools/xcutils/readnotes.c | 15 +++++----- - xen/common/libelf/Makefile | 2 + - xen/common/libelf/libelf-dominfo.c | 52 ++++++++++++++++++----------------- - xen/common/libelf/libelf-loader.c | 20 +++++++------- - xen/common/libelf/libelf-tools.c | 24 ++++++++-------- - xen/include/xen/libelf.h | 21 ++++++++------ - 9 files changed, 105 insertions(+), 87 deletions(-) - -diff --git a/tools/libxc/Makefile b/tools/libxc/Makefile -index d8c6a60..a3fd90c 100644 ---- a/tools/libxc/Makefile -+++ b/tools/libxc/Makefile -@@ -52,8 +52,13 @@ endif - vpath %.c ../../xen/common/libelf - CFLAGS += -I../../xen/common/libelf - --GUEST_SRCS-y += libelf-tools.c libelf-loader.c --GUEST_SRCS-y += libelf-dominfo.c -+ELF_SRCS-y += libelf-tools.c libelf-loader.c -+ELF_SRCS-y += libelf-dominfo.c -+ -+GUEST_SRCS-y += $(ELF_SRCS-y) -+ -+$(patsubst %.c,%.o,$(ELF_SRCS-y)): CFLAGS += -Wno-pointer-sign -+$(patsubst %.c,%.opic,$(ELF_SRCS-y)): CFLAGS += -Wno-pointer-sign - - # new domain builder - GUEST_SRCS-y += xc_dom_core.c xc_dom_boot.c -diff --git a/tools/libxc/xc_dom.h b/tools/libxc/xc_dom.h -index 9f8037e..0161459 100644 ---- a/tools/libxc/xc_dom.h -+++ b/tools/libxc/xc_dom.h -@@ -140,9 +140,10 @@ struct xc_dom_image { - - struct xc_dom_loader { - char *name; -- int (*probe) (struct xc_dom_image * dom); -- int (*parser) (struct xc_dom_image * dom); -- int (*loader) (struct xc_dom_image * dom); -+ /* Sadly the error returns from these functions are not consistent: */ -+ elf_negerrnoval (*probe) (struct xc_dom_image * dom); -+ elf_negerrnoval (*parser) (struct xc_dom_image * dom); -+ elf_errorstatus (*loader) (struct xc_dom_image * dom); - - struct xc_dom_loader *next; - }; -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index 9ba64ae..62a0d3b 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -84,7 +84,7 @@ static char *xc_dom_guest_type(struct xc_dom_image *dom, - /* ------------------------------------------------------------------------ */ - /* parse elf binary */ - --static int check_elf_kernel(struct xc_dom_image *dom, bool verbose) -+static elf_negerrnoval check_elf_kernel(struct xc_dom_image *dom, bool verbose) - { - if ( dom->kernel_blob == NULL ) - { -@@ -106,12 +106,12 @@ static int check_elf_kernel(struct xc_dom_image *dom, bool verbose) - return 0; - } - --static int xc_dom_probe_elf_kernel(struct xc_dom_image *dom) -+static elf_negerrnoval xc_dom_probe_elf_kernel(struct xc_dom_image *dom) - { - return check_elf_kernel(dom, 0); - } - --static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, -+static elf_errorstatus xc_dom_load_elf_symtab(struct xc_dom_image *dom, - struct elf_binary *elf, bool load) - { - struct elf_binary syms; -@@ -119,7 +119,7 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - xen_vaddr_t symtab, maxaddr; - ELF_PTRVAL_CHAR hdr; - size_t size; -- int h, count, type, i, tables = 0; -+ unsigned h, count, type, i, tables = 0; - - if ( elf_swap(elf) ) - { -@@ -140,13 +140,13 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - elf->caller_xdest_base = hdr_ptr; - elf->caller_xdest_size = allow_size; - hdr = ELF_REALPTR2PTRVAL(hdr_ptr); -- elf_store_val(elf, int, hdr, size - sizeof(int)); -+ elf_store_val(elf, unsigned, hdr, size - sizeof(unsigned)); - } - else - { - char *hdr_ptr; - -- size = sizeof(int) + elf_size(elf, elf->ehdr) + -+ size = sizeof(unsigned) + elf_size(elf, elf->ehdr) + - elf_shdr_count(elf) * elf_size(elf, shdr); - hdr_ptr = xc_dom_malloc(dom, size); - if ( hdr_ptr == NULL ) -@@ -157,15 +157,15 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - dom->bsd_symtab_start = elf_round_up(elf, dom->kernel_seg.vend); - } - -- elf_memcpy_safe(elf, hdr + sizeof(int), -+ elf_memcpy_safe(elf, hdr + sizeof(unsigned), - ELF_IMAGE_BASE(elf), - elf_size(elf, elf->ehdr)); -- elf_memcpy_safe(elf, hdr + sizeof(int) + elf_size(elf, elf->ehdr), -+ elf_memcpy_safe(elf, hdr + sizeof(unsigned) + elf_size(elf, elf->ehdr), - ELF_IMAGE_BASE(elf) + elf_uval(elf, elf->ehdr, e_shoff), - elf_shdr_count(elf) * elf_size(elf, shdr)); - if ( elf_64bit(elf) ) - { -- Elf64_Ehdr *ehdr = (Elf64_Ehdr *)(hdr + sizeof(int)); -+ Elf64_Ehdr *ehdr = (Elf64_Ehdr *)(hdr + sizeof(unsigned)); - ehdr->e_phoff = 0; - ehdr->e_phentsize = 0; - ehdr->e_phnum = 0; -@@ -174,22 +174,22 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - } - else - { -- Elf32_Ehdr *ehdr = (Elf32_Ehdr *)(hdr + sizeof(int)); -+ Elf32_Ehdr *ehdr = (Elf32_Ehdr *)(hdr + sizeof(unsigned)); - ehdr->e_phoff = 0; - ehdr->e_phentsize = 0; - ehdr->e_phnum = 0; - ehdr->e_shoff = elf_size(elf, elf->ehdr); - ehdr->e_shstrndx = SHN_UNDEF; - } -- if ( elf->caller_xdest_size < sizeof(int) ) -+ if ( elf->caller_xdest_size < sizeof(unsigned) ) - { - DOMPRINTF("%s/%s: header size %"PRIx64" too small", - __FUNCTION__, load ? "load" : "parse", - (uint64_t)elf->caller_xdest_size); - return -1; - } -- if ( elf_init(&syms, elf->caller_xdest_base + sizeof(int), -- elf->caller_xdest_size - sizeof(int)) ) -+ if ( elf_init(&syms, elf->caller_xdest_base + sizeof(unsigned), -+ elf->caller_xdest_size - sizeof(unsigned)) ) - return -1; - - /* -@@ -209,7 +209,7 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - - xc_elf_set_logfile(dom->xch, &syms, 1); - -- symtab = dom->bsd_symtab_start + sizeof(int); -+ symtab = dom->bsd_symtab_start + sizeof(unsigned); - maxaddr = elf_round_up(&syms, symtab + elf_size(&syms, syms.ehdr) + - elf_shdr_count(&syms) * elf_size(&syms, shdr)); - -@@ -255,7 +255,7 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - size = elf_uval(&syms, shdr, sh_size); - maxaddr = elf_round_up(&syms, maxaddr + size); - tables++; -- DOMPRINTF("%s: h=%d %s, size=0x%zx, maxaddr=0x%" PRIx64 "", -+ DOMPRINTF("%s: h=%u %s, size=0x%zx, maxaddr=0x%" PRIx64 "", - __FUNCTION__, h, - type == SHT_SYMTAB ? "symtab" : "strtab", - size, maxaddr); -@@ -294,10 +294,14 @@ static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - return 0; - } - --static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom) -+static elf_errorstatus xc_dom_parse_elf_kernel(struct xc_dom_image *dom) -+ /* -+ * This function sometimes returns -1 for error and sometimes -+ * an errno value. ?!?! -+ */ - { - struct elf_binary *elf; -- int rc; -+ elf_errorstatus rc; - - rc = check_elf_kernel(dom, 1); - if ( rc != 0 ) -@@ -358,10 +362,10 @@ out: - return rc; - } - --static int xc_dom_load_elf_kernel(struct xc_dom_image *dom) -+static elf_errorstatus xc_dom_load_elf_kernel(struct xc_dom_image *dom) - { - struct elf_binary *elf = dom->private_loader; -- int rc; -+ elf_errorstatus rc; - xen_pfn_t pages; - - elf->dest_base = xc_dom_seg_to_ptr_pages(dom, &dom->kernel_seg, &pages); -diff --git a/tools/xcutils/readnotes.c b/tools/xcutils/readnotes.c -index d1f7a30..2ca7732 100644 ---- a/tools/xcutils/readnotes.c -+++ b/tools/xcutils/readnotes.c -@@ -70,7 +70,7 @@ static void print_numeric_note(const char *prefix, struct elf_binary *elf, - ELF_HANDLE_DECL(elf_note) note) - { - uint64_t value = elf_note_numeric(elf, note); -- int descsz = elf_uval(elf, note, descsz); -+ unsigned descsz = elf_uval(elf, note, descsz); - - printf("%s: %#*" PRIx64 " (%d bytes)\n", - prefix, 2+2*descsz, value, descsz); -@@ -79,7 +79,7 @@ static void print_numeric_note(const char *prefix, struct elf_binary *elf, - static void print_l1_mfn_valid_note(const char *prefix, struct elf_binary *elf, - ELF_HANDLE_DECL(elf_note) note) - { -- int descsz = elf_uval(elf, note, descsz); -+ unsigned descsz = elf_uval(elf, note, descsz); - ELF_PTRVAL_CONST_VOID desc = elf_note_desc(elf, note); - - /* XXX should be able to cope with a list of values. */ -@@ -99,10 +99,10 @@ static void print_l1_mfn_valid_note(const char *prefix, struct elf_binary *elf, - - } - --static int print_notes(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) start, ELF_HANDLE_DECL(elf_note) end) -+static unsigned print_notes(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) start, ELF_HANDLE_DECL(elf_note) end) - { - ELF_HANDLE_DECL(elf_note) note; -- int notes_found = 0; -+ unsigned notes_found = 0; - const char *this_note_name; - - for ( note = start; ELF_HANDLE_PTRVAL(note) < ELF_HANDLE_PTRVAL(end); note = elf_note_next(elf, note) ) -@@ -161,7 +161,7 @@ static int print_notes(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) start, - break; - default: - printf("unknown note type %#x\n", -- (int)elf_uval(elf, note, type)); -+ (unsigned)elf_uval(elf, note, type)); - break; - } - } -@@ -171,12 +171,13 @@ static int print_notes(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) start, - int main(int argc, char **argv) - { - const char *f; -- int fd,h,size,usize,count; -+ int fd; -+ unsigned h,size,usize,count; - void *image,*tmp; - struct stat st; - struct elf_binary elf; - ELF_HANDLE_DECL(elf_shdr) shdr; -- int notes_found = 0; -+ unsigned notes_found = 0; - - struct setup_header *hdr; - uint64_t payload_offset, payload_length; -diff --git a/xen/common/libelf/Makefile b/xen/common/libelf/Makefile -index 18dc8e2..5bf8f76 100644 ---- a/xen/common/libelf/Makefile -+++ b/xen/common/libelf/Makefile -@@ -2,6 +2,8 @@ obj-bin-y := libelf.o - - SECTIONS := text data $(SPECIAL_DATA_SECTIONS) - -+CFLAGS += -Wno-pointer-sign -+ - libelf.o: libelf-temp.o Makefile - $(OBJCOPY) $(foreach s,$(SECTIONS),--rename-section .$(s)=.init.$(s)) $< $@ - -diff --git a/xen/common/libelf/libelf-dominfo.c b/xen/common/libelf/libelf-dominfo.c -index 12b6c2a..cdd0d31 100644 ---- a/xen/common/libelf/libelf-dominfo.c -+++ b/xen/common/libelf/libelf-dominfo.c -@@ -29,15 +29,15 @@ static const char *const elf_xen_feature_names[] = { - [XENFEAT_pae_pgdir_above_4gb] = "pae_pgdir_above_4gb", - [XENFEAT_dom0] = "dom0" - }; --static const int elf_xen_features = -+static const unsigned elf_xen_features = - sizeof(elf_xen_feature_names) / sizeof(elf_xen_feature_names[0]); - --int elf_xen_parse_features(const char *features, -+elf_errorstatus elf_xen_parse_features(const char *features, - uint32_t *supported, - uint32_t *required) - { -- char feature[64]; -- int pos, len, i; -+ unsigned char feature[64]; -+ unsigned pos, len, i; - - if ( features == NULL ) - return 0; -@@ -94,7 +94,7 @@ int elf_xen_parse_features(const char *features, - /* ------------------------------------------------------------------------ */ - /* xen elf notes */ - --int elf_xen_parse_note(struct elf_binary *elf, -+elf_errorstatus elf_xen_parse_note(struct elf_binary *elf, - struct elf_dom_parms *parms, - ELF_HANDLE_DECL(elf_note) note) - { -@@ -125,7 +125,7 @@ int elf_xen_parse_note(struct elf_binary *elf, - const char *str = NULL; - uint64_t val = 0; - unsigned int i; -- int type = elf_uval(elf, note, type); -+ unsigned type = elf_uval(elf, note, type); - - if ( (type >= sizeof(note_desc) / sizeof(note_desc[0])) || - (note_desc[type].name == NULL) ) -@@ -216,12 +216,14 @@ int elf_xen_parse_note(struct elf_binary *elf, - return 0; - } - --static int elf_xen_parse_notes(struct elf_binary *elf, -+#define ELF_NOTE_INVALID (~0U) -+ -+static unsigned elf_xen_parse_notes(struct elf_binary *elf, - struct elf_dom_parms *parms, - ELF_PTRVAL_CONST_VOID start, - ELF_PTRVAL_CONST_VOID end) - { -- int xen_elfnotes = 0; -+ unsigned xen_elfnotes = 0; - ELF_HANDLE_DECL(elf_note) note; - const char *note_name; - -@@ -237,7 +239,7 @@ static int elf_xen_parse_notes(struct elf_binary *elf, - if ( strcmp(note_name, "Xen") ) - continue; - if ( elf_xen_parse_note(elf, parms, note) ) -- return -1; -+ return ELF_NOTE_INVALID; - xen_elfnotes++; - } - return xen_elfnotes; -@@ -246,12 +248,12 @@ static int elf_xen_parse_notes(struct elf_binary *elf, - /* ------------------------------------------------------------------------ */ - /* __xen_guest section */ - --int elf_xen_parse_guest_info(struct elf_binary *elf, -+elf_errorstatus elf_xen_parse_guest_info(struct elf_binary *elf, - struct elf_dom_parms *parms) - { - ELF_PTRVAL_CONST_CHAR h; -- char name[32], value[128]; -- int len; -+ unsigned char name[32], value[128]; -+ unsigned len; - - h = parms->guest_info; - #define STAR(h) (elf_access_unsigned(elf, (h), 0, 1)) -@@ -334,13 +336,13 @@ int elf_xen_parse_guest_info(struct elf_binary *elf, - /* ------------------------------------------------------------------------ */ - /* sanity checks */ - --static int elf_xen_note_check(struct elf_binary *elf, -+static elf_errorstatus elf_xen_note_check(struct elf_binary *elf, - struct elf_dom_parms *parms) - { - if ( (ELF_PTRVAL_INVALID(parms->elf_note_start)) && - (ELF_PTRVAL_INVALID(parms->guest_info)) ) - { -- int machine = elf_uval(elf, elf->ehdr, e_machine); -+ unsigned machine = elf_uval(elf, elf->ehdr, e_machine); - if ( (machine == EM_386) || (machine == EM_X86_64) ) - { - elf_err(elf, "%s: ERROR: Not a Xen-ELF image: " -@@ -378,7 +380,7 @@ static int elf_xen_note_check(struct elf_binary *elf, - return 0; - } - --static int elf_xen_addr_calc_check(struct elf_binary *elf, -+static elf_errorstatus elf_xen_addr_calc_check(struct elf_binary *elf, - struct elf_dom_parms *parms) - { - if ( (parms->elf_paddr_offset != UNSET_ADDR) && -@@ -464,13 +466,13 @@ static int elf_xen_addr_calc_check(struct elf_binary *elf, - /* ------------------------------------------------------------------------ */ - /* glue it all together ... */ - --int elf_xen_parse(struct elf_binary *elf, -+elf_errorstatus elf_xen_parse(struct elf_binary *elf, - struct elf_dom_parms *parms) - { - ELF_HANDLE_DECL(elf_shdr) shdr; - ELF_HANDLE_DECL(elf_phdr) phdr; -- int xen_elfnotes = 0; -- int i, count, rc; -+ unsigned xen_elfnotes = 0; -+ unsigned i, count, more_notes; - - elf_memset_unchecked(parms, 0, sizeof(*parms)); - parms->virt_base = UNSET_ADDR; -@@ -495,13 +497,13 @@ int elf_xen_parse(struct elf_binary *elf, - if (elf_uval(elf, phdr, p_offset) == 0) - continue; - -- rc = elf_xen_parse_notes(elf, parms, -+ more_notes = elf_xen_parse_notes(elf, parms, - elf_segment_start(elf, phdr), - elf_segment_end(elf, phdr)); -- if ( rc == -1 ) -+ if ( more_notes == ELF_NOTE_INVALID ) - return -1; - -- xen_elfnotes += rc; -+ xen_elfnotes += more_notes; - } - - /* -@@ -518,17 +520,17 @@ int elf_xen_parse(struct elf_binary *elf, - if ( elf_uval(elf, shdr, sh_type) != SHT_NOTE ) - continue; - -- rc = elf_xen_parse_notes(elf, parms, -+ more_notes = elf_xen_parse_notes(elf, parms, - elf_section_start(elf, shdr), - elf_section_end(elf, shdr)); - -- if ( rc == -1 ) -+ if ( more_notes == ELF_NOTE_INVALID ) - return -1; - -- if ( xen_elfnotes == 0 && rc > 0 ) -+ if ( xen_elfnotes == 0 && more_notes > 0 ) - elf_msg(elf, "%s: using notes from SHT_NOTE section\n", __FUNCTION__); - -- xen_elfnotes += rc; -+ xen_elfnotes += more_notes; - } - - } -diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c -index 0dccd4d..c3a9e51 100644 ---- a/xen/common/libelf/libelf-loader.c -+++ b/xen/common/libelf/libelf-loader.c -@@ -24,7 +24,7 @@ - - /* ------------------------------------------------------------------------ */ - --int elf_init(struct elf_binary *elf, const char *image_input, size_t size) -+elf_errorstatus elf_init(struct elf_binary *elf, const char *image_input, size_t size) - { - ELF_HANDLE_DECL(elf_shdr) shdr; - uint64_t i, count, section, offset; -@@ -114,7 +114,7 @@ void elf_set_log(struct elf_binary *elf, elf_log_callback *log_callback, - elf->verbose = verbose; - } - --static int elf_load_image(struct elf_binary *elf, -+static elf_errorstatus elf_load_image(struct elf_binary *elf, - ELF_PTRVAL_VOID dst, ELF_PTRVAL_CONST_VOID src, - uint64_t filesz, uint64_t memsz) - { -@@ -129,9 +129,9 @@ void elf_set_verbose(struct elf_binary *elf) - elf->verbose = 1; - } - --static int elf_load_image(struct elf_binary *elf, ELF_PTRVAL_VOID dst, ELF_PTRVAL_CONST_VOID src, uint64_t filesz, uint64_t memsz) -+static elf_errorstatus elf_load_image(struct elf_binary *elf, ELF_PTRVAL_VOID dst, ELF_PTRVAL_CONST_VOID src, uint64_t filesz, uint64_t memsz) - { -- int rc; -+ elf_errorstatus rc; - if ( filesz > ULONG_MAX || memsz > ULONG_MAX ) - return -1; - /* We trust the dom0 kernel image completely, so we don't care -@@ -151,7 +151,7 @@ void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart) - { - uint64_t sz; - ELF_HANDLE_DECL(elf_shdr) shdr; -- int i, type; -+ unsigned i, type; - - if ( !ELF_HANDLE_VALID(elf->sym_tab) ) - return; -@@ -187,7 +187,7 @@ static void elf_load_bsdsyms(struct elf_binary *elf) - ELF_PTRVAL_VOID symbase; - ELF_PTRVAL_VOID symtab_addr; - ELF_HANDLE_DECL_NONCONST(elf_shdr) shdr; -- int i, type; -+ unsigned i, type; - - if ( !elf->bsd_symtab_pstart ) - return; -@@ -220,7 +220,7 @@ do { \ - elf_memcpy_safe(elf, ELF_HANDLE_PTRVAL(shdr), - ELF_IMAGE_BASE(elf) + elf_uval(elf, elf->ehdr, e_shoff), - sz); -- maxva = ELF_OBSOLETE_VOIDP_CAST elf_round_up(elf, (long)maxva + sz); -+ maxva = ELF_OBSOLETE_VOIDP_CAST elf_round_up(elf, (unsigned long)maxva + sz); - - for ( i = 0; i < elf_shdr_count(elf); i++ ) - { -@@ -233,10 +233,10 @@ do { \ - elf_memcpy_safe(elf, maxva, elf_section_start(elf, shdr), sz); - /* Mangled to be based on ELF header location. */ - elf_hdr_elm(elf, shdr, sh_offset, maxva - symtab_addr); -- maxva = ELF_OBSOLETE_VOIDP_CAST elf_round_up(elf, (long)maxva + sz); -+ maxva = ELF_OBSOLETE_VOIDP_CAST elf_round_up(elf, (unsigned long)maxva + sz); - } - shdr = ELF_MAKE_HANDLE(elf_shdr, ELF_HANDLE_PTRVAL(shdr) + -- (long)elf_uval(elf, elf->ehdr, e_shentsize)); -+ (unsigned long)elf_uval(elf, elf->ehdr, e_shentsize)); - } - - /* Write down the actual sym size. */ -@@ -273,7 +273,7 @@ void elf_parse_binary(struct elf_binary *elf) - __FUNCTION__, elf->pstart, elf->pend); - } - --int elf_load_binary(struct elf_binary *elf) -+elf_errorstatus elf_load_binary(struct elf_binary *elf) - { - ELF_HANDLE_DECL(elf_phdr) phdr; - uint64_t i, count, paddr, offset, filesz, memsz; -diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c -index fa58f76..46d4ab1 100644 ---- a/xen/common/libelf/libelf-tools.c -+++ b/xen/common/libelf/libelf-tools.c -@@ -122,19 +122,19 @@ uint64_t elf_access_unsigned(struct elf_binary * elf, elf_ptrval base, - - uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr) - { -- int elf_round = (elf_64bit(elf) ? 8 : 4) - 1; -+ uint64_t elf_round = (elf_64bit(elf) ? 8 : 4) - 1; - - return (addr + elf_round) & ~elf_round; - } - - /* ------------------------------------------------------------------------ */ - --int elf_shdr_count(struct elf_binary *elf) -+unsigned elf_shdr_count(struct elf_binary *elf) - { - return elf_uval(elf, elf->ehdr, e_shnum); - } - --int elf_phdr_count(struct elf_binary *elf) -+unsigned elf_phdr_count(struct elf_binary *elf) - { - return elf_uval(elf, elf->ehdr, e_phnum); - } -@@ -144,7 +144,7 @@ ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_name(struct elf_binary *elf, const char *n - uint64_t count = elf_shdr_count(elf); - ELF_HANDLE_DECL(elf_shdr) shdr; - const char *sname; -- int i; -+ unsigned i; - - for ( i = 0; i < count; i++ ) - { -@@ -156,7 +156,7 @@ ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_name(struct elf_binary *elf, const char *n - return ELF_INVALID_HANDLE(elf_shdr); - } - --ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, int index) -+ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, unsigned index) - { - uint64_t count = elf_shdr_count(elf); - ELF_PTRVAL_CONST_VOID ptr; -@@ -170,7 +170,7 @@ ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, int index) - return ELF_MAKE_HANDLE(elf_shdr, ptr); - } - --ELF_HANDLE_DECL(elf_phdr) elf_phdr_by_index(struct elf_binary *elf, int index) -+ELF_HANDLE_DECL(elf_phdr) elf_phdr_by_index(struct elf_binary *elf, unsigned index) - { - uint64_t count = elf_uval(elf, elf->ehdr, e_phnum); - ELF_PTRVAL_CONST_VOID ptr; -@@ -264,7 +264,7 @@ ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *sym - return ELF_INVALID_HANDLE(elf_sym); - } - --ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, int index) -+ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, unsigned index) - { - ELF_PTRVAL_CONST_VOID ptr = elf_section_start(elf, elf->sym_tab); - ELF_HANDLE_DECL(elf_sym) sym; -@@ -280,7 +280,7 @@ const char *elf_note_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note - - ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { -- int namesz = (elf_uval(elf, note, namesz) + 3) & ~3; -+ unsigned namesz = (elf_uval(elf, note, namesz) + 3) & ~3; - - return ELF_HANDLE_PTRVAL(note) + elf_size(elf, note) + namesz; - } -@@ -288,7 +288,7 @@ ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_ - uint64_t elf_note_numeric(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { - ELF_PTRVAL_CONST_VOID desc = elf_note_desc(elf, note); -- int descsz = elf_uval(elf, note, descsz); -+ unsigned descsz = elf_uval(elf, note, descsz); - - switch (descsz) - { -@@ -306,7 +306,7 @@ uint64_t elf_note_numeric_array(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note - unsigned int unitsz, unsigned int idx) - { - ELF_PTRVAL_CONST_VOID desc = elf_note_desc(elf, note); -- int descsz = elf_uval(elf, note, descsz); -+ unsigned descsz = elf_uval(elf, note, descsz); - - if ( descsz % unitsz || idx >= descsz / unitsz ) - return 0; -@@ -324,8 +324,8 @@ uint64_t elf_note_numeric_array(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note - - ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { -- int namesz = (elf_uval(elf, note, namesz) + 3) & ~3; -- int descsz = (elf_uval(elf, note, descsz) + 3) & ~3; -+ unsigned namesz = (elf_uval(elf, note, namesz) + 3) & ~3; -+ unsigned descsz = (elf_uval(elf, note, descsz) + 3) & ~3; - - return ELF_MAKE_HANDLE(elf_note, ELF_HANDLE_PTRVAL(note) + elf_size(elf, note) + namesz + descsz); - } -diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h -index 951430f..87e126a 100644 ---- a/xen/include/xen/libelf.h -+++ b/xen/include/xen/libelf.h -@@ -31,6 +31,9 @@ - - #include - -+typedef int elf_errorstatus; /* 0: ok; -ve (normally -1): error */ -+typedef int elf_negerrnoval; /* 0: ok; -EFOO: error */ -+ - #undef ELFSIZE - #include "elfstructs.h" - #ifdef __XEN__ -@@ -328,12 +331,12 @@ bool elf_access_ok(struct elf_binary * elf, - /* ------------------------------------------------------------------------ */ - /* xc_libelf_tools.c */ - --int elf_shdr_count(struct elf_binary *elf); --int elf_phdr_count(struct elf_binary *elf); -+unsigned elf_shdr_count(struct elf_binary *elf); -+unsigned elf_phdr_count(struct elf_binary *elf); - - ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_name(struct elf_binary *elf, const char *name); --ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, int index); --ELF_HANDLE_DECL(elf_phdr) elf_phdr_by_index(struct elf_binary *elf, int index); -+ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, unsigned index); -+ELF_HANDLE_DECL(elf_phdr) elf_phdr_by_index(struct elf_binary *elf, unsigned index); - - const char *elf_section_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); /* might return NULL if inputs are invalid */ - ELF_PTRVAL_CONST_VOID elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); -@@ -343,7 +346,7 @@ ELF_PTRVAL_CONST_VOID elf_segment_start(struct elf_binary *elf, ELF_HANDLE_DECL( - ELF_PTRVAL_CONST_VOID elf_segment_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); - - ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *symbol); --ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, int index); -+ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, unsigned index); - - const char *elf_note_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); /* may return NULL */ - ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); -@@ -360,7 +363,7 @@ bool elf_phdr_is_loadable(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr - /* ------------------------------------------------------------------------ */ - /* xc_libelf_loader.c */ - --int elf_init(struct elf_binary *elf, const char *image, size_t size); -+elf_errorstatus elf_init(struct elf_binary *elf, const char *image, size_t size); - /* - * image and size must be correct. They will be recorded in - * *elf, and must remain valid while the elf is in use. -@@ -373,7 +376,7 @@ void elf_set_log(struct elf_binary *elf, elf_log_callback*, - #endif - - void elf_parse_binary(struct elf_binary *elf); --int elf_load_binary(struct elf_binary *elf); -+elf_errorstatus elf_load_binary(struct elf_binary *elf); - - ELF_PTRVAL_VOID elf_get_ptr(struct elf_binary *elf, unsigned long addr); - uint64_t elf_lookup_addr(struct elf_binary *elf, const char *symbol); -@@ -386,7 +389,7 @@ const char *elf_check_broken(const struct elf_binary *elf); /* NULL means OK */ - /* ------------------------------------------------------------------------ */ - /* xc_libelf_relocate.c */ - --int elf_reloc(struct elf_binary *elf); -+elf_errorstatus elf_reloc(struct elf_binary *elf); - - /* ------------------------------------------------------------------------ */ - /* xc_libelf_dominfo.c */ -@@ -420,7 +423,7 @@ struct elf_dom_parms { - char guest_ver[16]; - char xen_ver[16]; - char loader[16]; -- int pae; -+ int pae; /* some kind of enum apparently */ - bool bsd_symtab; - uint64_t virt_base; - uint64_t virt_entry; --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0016-libelf-check-loops-for-running-away.patch xen-4.3.0/debian/patches/xsa55-4.2-0016-libelf-check-loops-for-running-away.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0016-libelf-check-loops-for-running-away.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0016-libelf-check-loops-for-running-away.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,409 +0,0 @@ -From 52d8cc2dd3bb3e0f6d51e00280da934e8d91653a Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:18 +0100 -Subject: [PATCH 16/23] libelf: check loops for running away - -Ensure that libelf does not have any loops which can run away -indefinitely even if the input is bogus. (Grepped for \bfor, \bwhile -and \bgoto in libelf and xc_dom_*loader*.c.) - -Changes needed: - * elf_note_next uses the note's unchecked alleged length, which might - wrap round. If it does, return ELF_MAX_PTRVAL (0xfff..fff) instead, - which will be beyond the end of the section and so terminate the - caller's loop. Also check that the returned psuedopointer is sane. - * In various loops over section and program headers, check that the - calculated header pointer is still within the image, and quit the - loop if it isn't. - * Some fixed limits to avoid potentially O(image_size^2) loops: - - maximum length of strings: 4K (longer ones ignored totally) - - maximum total number of ELF notes: 65536 (any more are ignored) - * Check that the total program contents (text, data) we copy or - initialise doesn't exceed twice the output image area size. - * Remove an entirely useless loop from elf_xen_parse (!) - * Replace a nested search loop in in xc_dom_load_elf_symtab in - xc_dom_elfloader.c by a precomputation of a bitmap of referenced - symtabs. - -We have not changed loops which might, in principle, iterate over the -whole image - even if they might do so one byte at a time with a -nontrivial access check function in the middle. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson ---- - tools/libxc/xc_dom_elfloader.c | 33 ++++++++++++++++++------- - xen/common/libelf/libelf-dominfo.c | 43 ++++++++++++++++++++------------ - xen/common/libelf/libelf-loader.c | 47 ++++++++++++++++++++++++++++++++++- - xen/common/libelf/libelf-tools.c | 28 ++++++++++++++++++++- - xen/include/xen/libelf.h | 13 ++++++++++ - 5 files changed, 135 insertions(+), 29 deletions(-) - -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index 62a0d3b..c5014d2 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -28,6 +28,7 @@ - - #include "xg_private.h" - #include "xc_dom.h" -+#include "xc_bitops.h" - - #define XEN_VER "xen-3.0" - -@@ -120,6 +121,7 @@ static elf_errorstatus xc_dom_load_elf_symtab(struct xc_dom_image *dom, - ELF_PTRVAL_CHAR hdr; - size_t size; - unsigned h, count, type, i, tables = 0; -+ unsigned long *strtab_referenced = NULL; - - if ( elf_swap(elf) ) - { -@@ -220,22 +222,35 @@ static elf_errorstatus xc_dom_load_elf_symtab(struct xc_dom_image *dom, - symtab, maxaddr); - - count = elf_shdr_count(&syms); -+ /* elf_shdr_count guarantees that count is reasonable */ -+ -+ strtab_referenced = xc_dom_malloc(dom, bitmap_size(count)); -+ if ( strtab_referenced == NULL ) -+ return -1; -+ bitmap_clear(strtab_referenced, count); -+ /* Note the symtabs @h linked to by any strtab @i. */ -+ for ( i = 0; i < count; i++ ) -+ { -+ shdr2 = elf_shdr_by_index(&syms, i); -+ if ( elf_uval(&syms, shdr2, sh_type) == SHT_SYMTAB ) -+ { -+ h = elf_uval(&syms, shdr2, sh_link); -+ if (h < count) -+ set_bit(h, strtab_referenced); -+ } -+ } -+ - for ( h = 0; h < count; h++ ) - { - shdr = ELF_OBSOLETE_VOIDP_CAST elf_shdr_by_index(&syms, h); -+ if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(shdr), 1) ) -+ /* input has an insane section header count field */ -+ break; - type = elf_uval(&syms, shdr, sh_type); - if ( type == SHT_STRTAB ) - { -- /* Look for a strtab @i linked to symtab @h. */ -- for ( i = 0; i < count; i++ ) -- { -- shdr2 = elf_shdr_by_index(&syms, i); -- if ( (elf_uval(&syms, shdr2, sh_type) == SHT_SYMTAB) && -- (elf_uval(&syms, shdr2, sh_link) == h) ) -- break; -- } - /* Skip symtab @h if we found no corresponding strtab @i. */ -- if ( i == count ) -+ if ( !test_bit(h, strtab_referenced) ) - { - if ( elf_64bit(&syms) ) - elf_store_field(elf, shdr, e64.sh_offset, 0); -diff --git a/xen/common/libelf/libelf-dominfo.c b/xen/common/libelf/libelf-dominfo.c -index cdd0d31..25a10d7 100644 ---- a/xen/common/libelf/libelf-dominfo.c -+++ b/xen/common/libelf/libelf-dominfo.c -@@ -221,7 +221,8 @@ elf_errorstatus elf_xen_parse_note(struct elf_binary *elf, - static unsigned elf_xen_parse_notes(struct elf_binary *elf, - struct elf_dom_parms *parms, - ELF_PTRVAL_CONST_VOID start, -- ELF_PTRVAL_CONST_VOID end) -+ ELF_PTRVAL_CONST_VOID end, -+ unsigned *total_note_count) - { - unsigned xen_elfnotes = 0; - ELF_HANDLE_DECL(elf_note) note; -@@ -233,6 +234,12 @@ static unsigned elf_xen_parse_notes(struct elf_binary *elf, - ELF_HANDLE_PTRVAL(note) < parms->elf_note_end; - note = elf_note_next(elf, note) ) - { -+ if ( *total_note_count >= ELF_MAX_TOTAL_NOTE_COUNT ) -+ { -+ elf_mark_broken(elf, "too many ELF notes"); -+ break; -+ } -+ (*total_note_count)++; - note_name = elf_note_name(elf, note); - if ( note_name == NULL ) - continue; -@@ -473,6 +480,7 @@ elf_errorstatus elf_xen_parse(struct elf_binary *elf, - ELF_HANDLE_DECL(elf_phdr) phdr; - unsigned xen_elfnotes = 0; - unsigned i, count, more_notes; -+ unsigned total_note_count = 0; - - elf_memset_unchecked(parms, 0, sizeof(*parms)); - parms->virt_base = UNSET_ADDR; -@@ -487,6 +495,9 @@ elf_errorstatus elf_xen_parse(struct elf_binary *elf, - for ( i = 0; i < count; i++ ) - { - phdr = elf_phdr_by_index(elf, i); -+ if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(phdr), 1) ) -+ /* input has an insane program header count field */ -+ break; - if ( elf_uval(elf, phdr, p_type) != PT_NOTE ) - continue; - -@@ -499,7 +510,8 @@ elf_errorstatus elf_xen_parse(struct elf_binary *elf, - - more_notes = elf_xen_parse_notes(elf, parms, - elf_segment_start(elf, phdr), -- elf_segment_end(elf, phdr)); -+ elf_segment_end(elf, phdr), -+ &total_note_count); - if ( more_notes == ELF_NOTE_INVALID ) - return -1; - -@@ -516,13 +528,17 @@ elf_errorstatus elf_xen_parse(struct elf_binary *elf, - for ( i = 0; i < count; i++ ) - { - shdr = elf_shdr_by_index(elf, i); -+ if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(shdr), 1) ) -+ /* input has an insane section header count field */ -+ break; - - if ( elf_uval(elf, shdr, sh_type) != SHT_NOTE ) - continue; - - more_notes = elf_xen_parse_notes(elf, parms, - elf_section_start(elf, shdr), -- elf_section_end(elf, shdr)); -+ elf_section_end(elf, shdr), -+ &total_note_count); - - if ( more_notes == ELF_NOTE_INVALID ) - return -1; -@@ -540,20 +556,15 @@ elf_errorstatus elf_xen_parse(struct elf_binary *elf, - */ - if ( xen_elfnotes == 0 ) - { -- count = elf_shdr_count(elf); -- for ( i = 0; i < count; i++ ) -+ shdr = elf_shdr_by_name(elf, "__xen_guest"); -+ if ( ELF_HANDLE_VALID(shdr) ) - { -- shdr = elf_shdr_by_name(elf, "__xen_guest"); -- if ( ELF_HANDLE_VALID(shdr) ) -- { -- parms->guest_info = elf_section_start(elf, shdr); -- parms->elf_note_start = ELF_INVALID_PTRVAL; -- parms->elf_note_end = ELF_INVALID_PTRVAL; -- elf_msg(elf, "%s: __xen_guest: \"%s\"\n", __FUNCTION__, -- elf_strfmt(elf, parms->guest_info)); -- elf_xen_parse_guest_info(elf, parms); -- break; -- } -+ parms->guest_info = elf_section_start(elf, shdr); -+ parms->elf_note_start = ELF_INVALID_PTRVAL; -+ parms->elf_note_end = ELF_INVALID_PTRVAL; -+ elf_msg(elf, "%s: __xen_guest: \"%s\"\n", __FUNCTION__, -+ elf_strfmt(elf, parms->guest_info)); -+ elf_xen_parse_guest_info(elf, parms); - } - } - -diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c -index c3a9e51..06799af 100644 ---- a/xen/common/libelf/libelf-loader.c -+++ b/xen/common/libelf/libelf-loader.c -@@ -75,6 +75,9 @@ elf_errorstatus elf_init(struct elf_binary *elf, const char *image_input, size_t - for ( i = 0; i < count; i++ ) - { - shdr = elf_shdr_by_index(elf, i); -+ if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(shdr), 1) ) -+ /* input has an insane section header count field */ -+ break; - if ( elf_uval(elf, shdr, sh_type) != SHT_SYMTAB ) - continue; - elf->sym_tab = shdr; -@@ -170,6 +173,9 @@ void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart) - for ( i = 0; i < elf_shdr_count(elf); i++ ) - { - shdr = elf_shdr_by_index(elf, i); -+ if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(shdr), 1) ) -+ /* input has an insane section header count field */ -+ break; - type = elf_uval(elf, shdr, sh_type); - if ( (type == SHT_STRTAB) || (type == SHT_SYMTAB) ) - sz = elf_round_up(elf, sz + elf_uval(elf, shdr, sh_size)); -@@ -224,6 +230,9 @@ do { \ - - for ( i = 0; i < elf_shdr_count(elf); i++ ) - { -+ elf_ptrval old_shdr_p; -+ elf_ptrval new_shdr_p; -+ - type = elf_uval(elf, shdr, sh_type); - if ( (type == SHT_STRTAB) || (type == SHT_SYMTAB) ) - { -@@ -235,8 +244,16 @@ do { \ - elf_hdr_elm(elf, shdr, sh_offset, maxva - symtab_addr); - maxva = ELF_OBSOLETE_VOIDP_CAST elf_round_up(elf, (unsigned long)maxva + sz); - } -- shdr = ELF_MAKE_HANDLE(elf_shdr, ELF_HANDLE_PTRVAL(shdr) + -- (unsigned long)elf_uval(elf, elf->ehdr, e_shentsize)); -+ old_shdr_p = ELF_HANDLE_PTRVAL(shdr); -+ new_shdr_p = old_shdr_p + elf_uval(elf, elf->ehdr, e_shentsize); -+ if ( new_shdr_p <= old_shdr_p ) /* wrapped or stuck */ -+ { -+ elf_mark_broken(elf, "bad section header length"); -+ break; -+ } -+ if ( !elf_access_ok(elf, new_shdr_p, 1) ) /* outside image */ -+ break; -+ shdr = ELF_MAKE_HANDLE(elf_shdr, new_shdr_p); - } - - /* Write down the actual sym size. */ -@@ -256,6 +273,9 @@ void elf_parse_binary(struct elf_binary *elf) - for ( i = 0; i < count; i++ ) - { - phdr = elf_phdr_by_index(elf, i); -+ if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(phdr), 1) ) -+ /* input has an insane program header count field */ -+ break; - if ( !elf_phdr_is_loadable(elf, phdr) ) - continue; - paddr = elf_uval(elf, phdr, p_paddr); -@@ -278,11 +298,20 @@ elf_errorstatus elf_load_binary(struct elf_binary *elf) - ELF_HANDLE_DECL(elf_phdr) phdr; - uint64_t i, count, paddr, offset, filesz, memsz; - ELF_PTRVAL_VOID dest; -+ /* -+ * Let bizarre ELFs write the output image up to twice; this -+ * calculation is just to ensure our copying loop is no worse than -+ * O(domain_size). -+ */ -+ uint64_t remain_allow_copy = (uint64_t)elf->dest_size * 2; - - count = elf_uval(elf, elf->ehdr, e_phnum); - for ( i = 0; i < count; i++ ) - { - phdr = elf_phdr_by_index(elf, i); -+ if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(phdr), 1) ) -+ /* input has an insane program header count field */ -+ break; - if ( !elf_phdr_is_loadable(elf, phdr) ) - continue; - paddr = elf_uval(elf, phdr, p_paddr); -@@ -290,6 +319,20 @@ elf_errorstatus elf_load_binary(struct elf_binary *elf) - filesz = elf_uval(elf, phdr, p_filesz); - memsz = elf_uval(elf, phdr, p_memsz); - dest = elf_get_ptr(elf, paddr); -+ -+ /* -+ * We need to check that the input image doesn't have us copy -+ * the whole image zillions of times, as that could lead to -+ * O(n^2) time behaviour and possible DoS by a malicous ELF. -+ */ -+ if ( remain_allow_copy < memsz ) -+ { -+ elf_mark_broken(elf, "program segments total to more" -+ " than the input image size"); -+ break; -+ } -+ remain_allow_copy -= memsz; -+ - elf_msg(elf, "%s: phdr %" PRIu64 " at 0x%"ELF_PRPTRVAL" -> 0x%"ELF_PRPTRVAL"\n", - __func__, i, dest, (ELF_PTRVAL_VOID)(dest + filesz)); - if ( elf_load_image(elf, dest, ELF_IMAGE_BASE(elf) + offset, filesz, memsz) != 0 ) -diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c -index 46d4ab1..4a83133 100644 ---- a/xen/common/libelf/libelf-tools.c -+++ b/xen/common/libelf/libelf-tools.c -@@ -131,7 +131,16 @@ uint64_t elf_round_up(struct elf_binary *elf, uint64_t addr) - - unsigned elf_shdr_count(struct elf_binary *elf) - { -- return elf_uval(elf, elf->ehdr, e_shnum); -+ unsigned count = elf_uval(elf, elf->ehdr, e_shnum); -+ uint64_t max = elf->size / sizeof(Elf32_Shdr); -+ if (max > ~(unsigned)0) -+ max = ~(unsigned)0; /* Xen doesn't have limits.h :-/ */ -+ if (count > max) -+ { -+ elf_mark_broken(elf, "far too many section headers"); -+ count = max; -+ } -+ return count; - } - - unsigned elf_phdr_count(struct elf_binary *elf) -@@ -149,6 +158,9 @@ ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_name(struct elf_binary *elf, const char *n - for ( i = 0; i < count; i++ ) - { - shdr = elf_shdr_by_index(elf, i); -+ if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(shdr), 1) ) -+ /* input has an insane section header count field */ -+ break; - sname = elf_section_name(elf, shdr); - if ( sname && !strcmp(sname, name) ) - return shdr; -@@ -204,6 +216,11 @@ const char *elf_strval(struct elf_binary *elf, elf_ptrval start) - if ( !elf_access_unsigned(elf, start, length, 1) ) - /* ok */ - return ELF_UNSAFE_PTR(start); -+ if ( length >= ELF_MAX_STRING_LENGTH ) -+ { -+ elf_mark_broken(elf, "excessively long string"); -+ return NULL; -+ } - } - } - -@@ -327,7 +344,14 @@ ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, ELF_HANDLE_DECL( - unsigned namesz = (elf_uval(elf, note, namesz) + 3) & ~3; - unsigned descsz = (elf_uval(elf, note, descsz) + 3) & ~3; - -- return ELF_MAKE_HANDLE(elf_note, ELF_HANDLE_PTRVAL(note) + elf_size(elf, note) + namesz + descsz); -+ elf_ptrval ptrval = ELF_HANDLE_PTRVAL(note) -+ + elf_size(elf, note) + namesz + descsz; -+ -+ if ( ( ptrval <= ELF_HANDLE_PTRVAL(note) || /* wrapped or stuck */ -+ !elf_access_ok(elf, ELF_HANDLE_PTRVAL(note), 1) ) ) -+ ptrval = ELF_MAX_PTRVAL; /* terminate caller's loop */ -+ -+ return ELF_MAKE_HANDLE(elf_note, ptrval); - } - - /* ------------------------------------------------------------------------ */ -diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h -index 87e126a..f95fe88 100644 ---- a/xen/include/xen/libelf.h -+++ b/xen/include/xen/libelf.h -@@ -51,6 +51,9 @@ typedef void elf_log_callback(struct elf_binary*, void *caller_data, - - #endif - -+#define ELF_MAX_STRING_LENGTH 4096 -+#define ELF_MAX_TOTAL_NOTE_COUNT 65536 -+ - /* ------------------------------------------------------------------------ */ - - /* Macros for accessing the input image and output area. */ -@@ -353,6 +356,16 @@ ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_ - uint64_t elf_note_numeric(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); - uint64_t elf_note_numeric_array(struct elf_binary *, ELF_HANDLE_DECL(elf_note), - unsigned int unitsz, unsigned int idx); -+ -+/* -+ * If you use elf_note_next in a loop, you must put a nontrivial upper -+ * bound on the returned value as part of your loop condition. In -+ * some cases elf_note_next will substitute ELF_PTRVAL_MAX as return -+ * value to indicate that the iteration isn't going well (for example, -+ * the putative "next" value would be earlier in memory). In this -+ * case the caller's loop must terminate. Checking against the -+ * end of the notes segment with a strict inequality is sufficient. -+ */ - ELF_HANDLE_DECL(elf_note) elf_note_next(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); - - /* (Only) checks that the image has the right magic number. */ --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0017-libelf-abolish-obsolete-macros.patch xen-4.3.0/debian/patches/xsa55-4.2-0017-libelf-abolish-obsolete-macros.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0017-libelf-abolish-obsolete-macros.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0017-libelf-abolish-obsolete-macros.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,406 +0,0 @@ -From 3baaa4ffcd3e7dd6227f9bdf817f90e5b75aeda2 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:19 +0100 -Subject: [PATCH 17/23] libelf: abolish obsolete macros - -Abolish ELF_PTRVAL_[CONST_]{CHAR,VOID}; change uses to elf_ptrval. -Abolish ELF_HANDLE_DECL_NONCONST; change uses to ELF_HANDLE_DECL. -Abolish ELF_OBSOLETE_VOIDP_CAST; simply remove all uses. - -No functional change. (Verified by diffing assembler output.) - -Signed-off-by: Ian Jackson -Acked-by: Ian Campbell - -v2: New patch. ---- - tools/libxc/xc_dom_elfloader.c | 8 +++--- - tools/xcutils/readnotes.c | 2 +- - xen/common/libelf/libelf-dominfo.c | 6 ++-- - xen/common/libelf/libelf-loader.c | 24 +++++++++--------- - xen/common/libelf/libelf-tools.c | 24 +++++++++--------- - xen/include/xen/libelf.h | 48 +++++++++--------------------------- - 6 files changed, 44 insertions(+), 68 deletions(-) - -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index c5014d2..9fc4b94 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -116,9 +116,9 @@ static elf_errorstatus xc_dom_load_elf_symtab(struct xc_dom_image *dom, - struct elf_binary *elf, bool load) - { - struct elf_binary syms; -- ELF_HANDLE_DECL_NONCONST(elf_shdr) shdr; ELF_HANDLE_DECL(elf_shdr) shdr2; -+ ELF_HANDLE_DECL(elf_shdr) shdr; ELF_HANDLE_DECL(elf_shdr) shdr2; - xen_vaddr_t symtab, maxaddr; -- ELF_PTRVAL_CHAR hdr; -+ elf_ptrval hdr; - size_t size; - unsigned h, count, type, i, tables = 0; - unsigned long *strtab_referenced = NULL; -@@ -242,7 +242,7 @@ static elf_errorstatus xc_dom_load_elf_symtab(struct xc_dom_image *dom, - - for ( h = 0; h < count; h++ ) - { -- shdr = ELF_OBSOLETE_VOIDP_CAST elf_shdr_by_index(&syms, h); -+ shdr = elf_shdr_by_index(&syms, h); - if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(shdr), 1) ) - /* input has an insane section header count field */ - break; -@@ -278,7 +278,7 @@ static elf_errorstatus xc_dom_load_elf_symtab(struct xc_dom_image *dom, - if ( load ) - { - shdr2 = elf_shdr_by_index(elf, h); -- elf_memcpy_safe(elf, ELF_OBSOLETE_VOIDP_CAST elf_section_start(&syms, shdr), -+ elf_memcpy_safe(elf, elf_section_start(&syms, shdr), - elf_section_start(elf, shdr2), - size); - } -diff --git a/tools/xcutils/readnotes.c b/tools/xcutils/readnotes.c -index 2ca7732..5fa445e 100644 ---- a/tools/xcutils/readnotes.c -+++ b/tools/xcutils/readnotes.c -@@ -80,7 +80,7 @@ static void print_l1_mfn_valid_note(const char *prefix, struct elf_binary *elf, - ELF_HANDLE_DECL(elf_note) note) - { - unsigned descsz = elf_uval(elf, note, descsz); -- ELF_PTRVAL_CONST_VOID desc = elf_note_desc(elf, note); -+ elf_ptrval desc = elf_note_desc(elf, note); - - /* XXX should be able to cope with a list of values. */ - switch ( descsz / 2 ) -diff --git a/xen/common/libelf/libelf-dominfo.c b/xen/common/libelf/libelf-dominfo.c -index 25a10d7..412ea70 100644 ---- a/xen/common/libelf/libelf-dominfo.c -+++ b/xen/common/libelf/libelf-dominfo.c -@@ -220,8 +220,8 @@ elf_errorstatus elf_xen_parse_note(struct elf_binary *elf, - - static unsigned elf_xen_parse_notes(struct elf_binary *elf, - struct elf_dom_parms *parms, -- ELF_PTRVAL_CONST_VOID start, -- ELF_PTRVAL_CONST_VOID end, -+ elf_ptrval start, -+ elf_ptrval end, - unsigned *total_note_count) - { - unsigned xen_elfnotes = 0; -@@ -258,7 +258,7 @@ static unsigned elf_xen_parse_notes(struct elf_binary *elf, - elf_errorstatus elf_xen_parse_guest_info(struct elf_binary *elf, - struct elf_dom_parms *parms) - { -- ELF_PTRVAL_CONST_CHAR h; -+ elf_ptrval h; - unsigned char name[32], value[128]; - unsigned len; - -diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c -index 06799af..e2e75af 100644 ---- a/xen/common/libelf/libelf-loader.c -+++ b/xen/common/libelf/libelf-loader.c -@@ -118,7 +118,7 @@ void elf_set_log(struct elf_binary *elf, elf_log_callback *log_callback, - } - - static elf_errorstatus elf_load_image(struct elf_binary *elf, -- ELF_PTRVAL_VOID dst, ELF_PTRVAL_CONST_VOID src, -+ elf_ptrval dst, elf_ptrval src, - uint64_t filesz, uint64_t memsz) - { - elf_memcpy_safe(elf, dst, src, filesz); -@@ -132,7 +132,7 @@ void elf_set_verbose(struct elf_binary *elf) - elf->verbose = 1; - } - --static elf_errorstatus elf_load_image(struct elf_binary *elf, ELF_PTRVAL_VOID dst, ELF_PTRVAL_CONST_VOID src, uint64_t filesz, uint64_t memsz) -+static elf_errorstatus elf_load_image(struct elf_binary *elf, elf_ptrval dst, elf_ptrval src, uint64_t filesz, uint64_t memsz) - { - elf_errorstatus rc; - if ( filesz > ULONG_MAX || memsz > ULONG_MAX ) -@@ -187,12 +187,12 @@ void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart) - - static void elf_load_bsdsyms(struct elf_binary *elf) - { -- ELF_HANDLE_DECL_NONCONST(elf_ehdr) sym_ehdr; -+ ELF_HANDLE_DECL(elf_ehdr) sym_ehdr; - unsigned long sz; -- ELF_PTRVAL_VOID maxva; -- ELF_PTRVAL_VOID symbase; -- ELF_PTRVAL_VOID symtab_addr; -- ELF_HANDLE_DECL_NONCONST(elf_shdr) shdr; -+ elf_ptrval maxva; -+ elf_ptrval symbase; -+ elf_ptrval symtab_addr; -+ ELF_HANDLE_DECL(elf_shdr) shdr; - unsigned i, type; - - if ( !elf->bsd_symtab_pstart ) -@@ -226,7 +226,7 @@ do { \ - elf_memcpy_safe(elf, ELF_HANDLE_PTRVAL(shdr), - ELF_IMAGE_BASE(elf) + elf_uval(elf, elf->ehdr, e_shoff), - sz); -- maxva = ELF_OBSOLETE_VOIDP_CAST elf_round_up(elf, (unsigned long)maxva + sz); -+ maxva = elf_round_up(elf, (unsigned long)maxva + sz); - - for ( i = 0; i < elf_shdr_count(elf); i++ ) - { -@@ -242,7 +242,7 @@ do { \ - elf_memcpy_safe(elf, maxva, elf_section_start(elf, shdr), sz); - /* Mangled to be based on ELF header location. */ - elf_hdr_elm(elf, shdr, sh_offset, maxva - symtab_addr); -- maxva = ELF_OBSOLETE_VOIDP_CAST elf_round_up(elf, (unsigned long)maxva + sz); -+ maxva = elf_round_up(elf, (unsigned long)maxva + sz); - } - old_shdr_p = ELF_HANDLE_PTRVAL(shdr); - new_shdr_p = old_shdr_p + elf_uval(elf, elf->ehdr, e_shentsize); -@@ -297,7 +297,7 @@ elf_errorstatus elf_load_binary(struct elf_binary *elf) - { - ELF_HANDLE_DECL(elf_phdr) phdr; - uint64_t i, count, paddr, offset, filesz, memsz; -- ELF_PTRVAL_VOID dest; -+ elf_ptrval dest; - /* - * Let bizarre ELFs write the output image up to twice; this - * calculation is just to ensure our copying loop is no worse than -@@ -334,7 +334,7 @@ elf_errorstatus elf_load_binary(struct elf_binary *elf) - remain_allow_copy -= memsz; - - elf_msg(elf, "%s: phdr %" PRIu64 " at 0x%"ELF_PRPTRVAL" -> 0x%"ELF_PRPTRVAL"\n", -- __func__, i, dest, (ELF_PTRVAL_VOID)(dest + filesz)); -+ __func__, i, dest, (elf_ptrval)(dest + filesz)); - if ( elf_load_image(elf, dest, ELF_IMAGE_BASE(elf) + offset, filesz, memsz) != 0 ) - return -1; - } -@@ -343,7 +343,7 @@ elf_errorstatus elf_load_binary(struct elf_binary *elf) - return 0; - } - --ELF_PTRVAL_VOID elf_get_ptr(struct elf_binary *elf, unsigned long addr) -+elf_ptrval elf_get_ptr(struct elf_binary *elf, unsigned long addr) - { - return ELF_REALPTR2PTRVAL(elf->dest_base) + addr - elf->pstart; - } -diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c -index 4a83133..e202249 100644 ---- a/xen/common/libelf/libelf-tools.c -+++ b/xen/common/libelf/libelf-tools.c -@@ -171,7 +171,7 @@ ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_name(struct elf_binary *elf, const char *n - ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, unsigned index) - { - uint64_t count = elf_shdr_count(elf); -- ELF_PTRVAL_CONST_VOID ptr; -+ elf_ptrval ptr; - - if ( index >= count ) - return ELF_INVALID_HANDLE(elf_shdr); -@@ -185,7 +185,7 @@ ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, unsigned ind - ELF_HANDLE_DECL(elf_phdr) elf_phdr_by_index(struct elf_binary *elf, unsigned index) - { - uint64_t count = elf_uval(elf, elf->ehdr, e_phnum); -- ELF_PTRVAL_CONST_VOID ptr; -+ elf_ptrval ptr; - - if ( index >= count ) - return ELF_INVALID_HANDLE(elf_phdr); -@@ -233,24 +233,24 @@ const char *elf_strfmt(struct elf_binary *elf, elf_ptrval start) - return str; - } - --ELF_PTRVAL_CONST_VOID elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr) -+elf_ptrval elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr) - { - return ELF_IMAGE_BASE(elf) + elf_uval(elf, shdr, sh_offset); - } - --ELF_PTRVAL_CONST_VOID elf_section_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr) -+elf_ptrval elf_section_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr) - { - return ELF_IMAGE_BASE(elf) - + elf_uval(elf, shdr, sh_offset) + elf_uval(elf, shdr, sh_size); - } - --ELF_PTRVAL_CONST_VOID elf_segment_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) -+elf_ptrval elf_segment_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) - { - return ELF_IMAGE_BASE(elf) - + elf_uval(elf, phdr, p_offset); - } - --ELF_PTRVAL_CONST_VOID elf_segment_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) -+elf_ptrval elf_segment_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr) - { - return ELF_IMAGE_BASE(elf) - + elf_uval(elf, phdr, p_offset) + elf_uval(elf, phdr, p_filesz); -@@ -258,8 +258,8 @@ ELF_PTRVAL_CONST_VOID elf_segment_end(struct elf_binary *elf, ELF_HANDLE_DECL(el - - ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *symbol) - { -- ELF_PTRVAL_CONST_VOID ptr = elf_section_start(elf, elf->sym_tab); -- ELF_PTRVAL_CONST_VOID end = elf_section_end(elf, elf->sym_tab); -+ elf_ptrval ptr = elf_section_start(elf, elf->sym_tab); -+ elf_ptrval end = elf_section_end(elf, elf->sym_tab); - ELF_HANDLE_DECL(elf_sym) sym; - uint64_t info, name; - const char *sym_name; -@@ -283,7 +283,7 @@ ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *sym - - ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, unsigned index) - { -- ELF_PTRVAL_CONST_VOID ptr = elf_section_start(elf, elf->sym_tab); -+ elf_ptrval ptr = elf_section_start(elf, elf->sym_tab); - ELF_HANDLE_DECL(elf_sym) sym; - - sym = ELF_MAKE_HANDLE(elf_sym, ptr + index * elf_size(elf, sym)); -@@ -295,7 +295,7 @@ const char *elf_note_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note - return elf_strval(elf, ELF_HANDLE_PTRVAL(note) + elf_size(elf, note)); - } - --ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) -+elf_ptrval elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { - unsigned namesz = (elf_uval(elf, note, namesz) + 3) & ~3; - -@@ -304,7 +304,7 @@ ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_ - - uint64_t elf_note_numeric(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note) - { -- ELF_PTRVAL_CONST_VOID desc = elf_note_desc(elf, note); -+ elf_ptrval desc = elf_note_desc(elf, note); - unsigned descsz = elf_uval(elf, note, descsz); - - switch (descsz) -@@ -322,7 +322,7 @@ uint64_t elf_note_numeric(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note - uint64_t elf_note_numeric_array(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note, - unsigned int unitsz, unsigned int idx) - { -- ELF_PTRVAL_CONST_VOID desc = elf_note_desc(elf, note); -+ elf_ptrval desc = elf_note_desc(elf, note); - unsigned descsz = elf_uval(elf, note, descsz); - - if ( descsz % unitsz || idx >= descsz / unitsz ) -diff --git a/xen/include/xen/libelf.h b/xen/include/xen/libelf.h -index f95fe88..174f8da 100644 ---- a/xen/include/xen/libelf.h -+++ b/xen/include/xen/libelf.h -@@ -61,13 +61,8 @@ typedef void elf_log_callback(struct elf_binary*, void *caller_data, - /* - * We abstract away the pointerness of these pointers, replacing - * various void*, char* and struct* with the following: -- * PTRVAL A pointer to a byte; one can do pointer arithmetic -+ * elf_ptrval A pointer to a byte; one can do pointer arithmetic - * on this. -- * This replaces variables which were char*,void* -- * and their const versions, so we provide four -- * different obsolete declaration macros: -- * ELF_PTRVAL_{,CONST}{VOID,CHAR} -- * New code can simply use the elf_ptrval typedef. - * HANDLE A pointer to a struct. There is one of these types - * for each pointer type - that is, for each "structname". - * In the arguments to the various HANDLE macros, structname -@@ -76,8 +71,6 @@ typedef void elf_log_callback(struct elf_binary*, void *caller_data, - * pointers. In the current code attempts to do so will - * compile, but in the next patch this will become a - * compile error. -- * We also provide a second declaration macro for -- * pointers which were to const; this is obsolete. - */ - - typedef uintptr_t elf_ptrval; -@@ -85,15 +78,9 @@ typedef uintptr_t elf_ptrval; - #define ELF_REALPTR2PTRVAL(realpointer) ((elf_ptrval)(realpointer)) - /* Converts an actual C pointer into a PTRVAL */ - --#define ELF_HANDLE_DECL_NONCONST(structname) structname##_handle /*obsolete*/ - #define ELF_HANDLE_DECL(structname) structname##_handle - /* Provides a type declaration for a HANDLE. */ - --#define ELF_PTRVAL_VOID elf_ptrval /*obsolete*/ --#define ELF_PTRVAL_CHAR elf_ptrval /*obsolete*/ --#define ELF_PTRVAL_CONST_VOID elf_ptrval /*obsolete*/ --#define ELF_PTRVAL_CONST_CHAR elf_ptrval /*obsolete*/ -- - #ifdef __XEN__ - # define ELF_PRPTRVAL "lu" - /* -@@ -124,17 +111,6 @@ typedef uintptr_t elf_ptrval; - #define ELF_HANDLE_PTRVAL(handleval) ((handleval).ptrval) - /* Converts a HANDLE to a PTRVAL. */ - --#define ELF_OBSOLETE_VOIDP_CAST /*empty*/ -- /* -- * In some places the old code used to need to -- * - cast away const (the existing code uses const a fair -- * bit but actually sometimes wants to write to its input) -- * from a PTRVAL. -- * - convert an integer representing a pointer to a PTRVAL -- * Nowadays all of these re uintptr_ts so there is no const problem -- * and no need for any casting. -- */ -- - #define ELF_UNSAFE_PTR(ptrval) ((void*)(elf_ptrval)(ptrval)) - /* - * Turns a PTRVAL into an actual C pointer. Before this is done -@@ -212,7 +188,7 @@ struct elf_binary { - char data; - - ELF_HANDLE_DECL(elf_ehdr) ehdr; -- ELF_PTRVAL_CONST_CHAR sec_strtab; -+ elf_ptrval sec_strtab; - ELF_HANDLE_DECL(elf_shdr) sym_tab; - uint64_t sym_strtab; - -@@ -290,7 +266,7 @@ struct elf_binary { - * str should be a HANDLE. - */ - --uint64_t elf_access_unsigned(struct elf_binary *elf, ELF_PTRVAL_CONST_VOID ptr, -+uint64_t elf_access_unsigned(struct elf_binary *elf, elf_ptrval ptr, - uint64_t offset, size_t size); - /* Reads a field at arbitrary offset and alignemnt */ - -@@ -342,17 +318,17 @@ ELF_HANDLE_DECL(elf_shdr) elf_shdr_by_index(struct elf_binary *elf, unsigned ind - ELF_HANDLE_DECL(elf_phdr) elf_phdr_by_index(struct elf_binary *elf, unsigned index); - - const char *elf_section_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); /* might return NULL if inputs are invalid */ --ELF_PTRVAL_CONST_VOID elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); --ELF_PTRVAL_CONST_VOID elf_section_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); -+elf_ptrval elf_section_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); -+elf_ptrval elf_section_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_shdr) shdr); - --ELF_PTRVAL_CONST_VOID elf_segment_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); --ELF_PTRVAL_CONST_VOID elf_segment_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); -+elf_ptrval elf_segment_start(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); -+elf_ptrval elf_segment_end(struct elf_binary *elf, ELF_HANDLE_DECL(elf_phdr) phdr); - - ELF_HANDLE_DECL(elf_sym) elf_sym_by_name(struct elf_binary *elf, const char *symbol); - ELF_HANDLE_DECL(elf_sym) elf_sym_by_index(struct elf_binary *elf, unsigned index); - - const char *elf_note_name(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); /* may return NULL */ --ELF_PTRVAL_CONST_VOID elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); -+elf_ptrval elf_note_desc(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); - uint64_t elf_note_numeric(struct elf_binary *elf, ELF_HANDLE_DECL(elf_note) note); - uint64_t elf_note_numeric_array(struct elf_binary *, ELF_HANDLE_DECL(elf_note), - unsigned int unitsz, unsigned int idx); -@@ -391,7 +367,7 @@ void elf_set_log(struct elf_binary *elf, elf_log_callback*, - void elf_parse_binary(struct elf_binary *elf); - elf_errorstatus elf_load_binary(struct elf_binary *elf); - --ELF_PTRVAL_VOID elf_get_ptr(struct elf_binary *elf, unsigned long addr); -+elf_ptrval elf_get_ptr(struct elf_binary *elf, unsigned long addr); - uint64_t elf_lookup_addr(struct elf_binary *elf, const char *symbol); - - void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart); /* private */ -@@ -426,9 +402,9 @@ struct xen_elfnote { - - struct elf_dom_parms { - /* raw */ -- ELF_PTRVAL_CONST_CHAR guest_info; -- ELF_PTRVAL_CONST_VOID elf_note_start; -- ELF_PTRVAL_CONST_VOID elf_note_end; -+ elf_ptrval guest_info; -+ elf_ptrval elf_note_start; -+ elf_ptrval elf_note_end; - struct xen_elfnote elf_notes[XEN_ELFNOTE_MAX + 1]; - - /* parsed */ --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0018-libxc-Add-range-checking-to-xc_dom_binloader.patch xen-4.3.0/debian/patches/xsa55-4.2-0018-libxc-Add-range-checking-to-xc_dom_binloader.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0018-libxc-Add-range-checking-to-xc_dom_binloader.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0018-libxc-Add-range-checking-to-xc_dom_binloader.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -From b06e277b1fc08c7da3befeb3ac3950e1d941585d Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:19 +0100 -Subject: [PATCH 18/23] libxc: Add range checking to xc_dom_binloader - -This is a simple binary image loader with its own metadata format. -However, it is too careless with image-supplied values. - -Add the following checks: - - * That the image is bigger than the metadata table; otherwise the - pointer arithmetic to calculate the metadata table location may - yield undefined and dangerous values. - - * When clamping the end of the region to search, that we do not - calculate pointers beyond the end of the image. The C - specification does not permit this and compilers are becoming ever - more determined to miscompile code when they can "prove" various - falsehoods based on assertions from the C spec. - - * That the supplied image is big enough for the text we are allegedly - copying from it. Otherwise we might have a read overrun and copy - the results (perhaps a lot of secret data) into the guest. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson ---- - tools/libxc/xc_dom_binloader.c | 15 +++++++++++++-- - 1 files changed, 13 insertions(+), 2 deletions(-) - -diff --git a/tools/libxc/xc_dom_binloader.c b/tools/libxc/xc_dom_binloader.c -index bde93f7..8596a28 100644 ---- a/tools/libxc/xc_dom_binloader.c -+++ b/tools/libxc/xc_dom_binloader.c -@@ -123,10 +123,13 @@ static struct xen_bin_image_table *find_table(struct xc_dom_image *dom) - uint32_t *probe_ptr; - uint32_t *probe_end; - -+ if ( dom->kernel_size < sizeof(*table) ) -+ return NULL; - probe_ptr = dom->kernel_blob; -- probe_end = dom->kernel_blob + dom->kernel_size - sizeof(*table); -- if ( (void*)probe_end > (dom->kernel_blob + 8192) ) -+ if ( dom->kernel_size > (8192 + sizeof(*table)) ) - probe_end = dom->kernel_blob + 8192; -+ else -+ probe_end = dom->kernel_blob + dom->kernel_size - sizeof(*table); - - for ( table = NULL; probe_ptr < probe_end; probe_ptr++ ) - { -@@ -282,6 +285,14 @@ static int xc_dom_load_bin_kernel(struct xc_dom_image *dom) - return -EINVAL; - } - -+ if ( image_size < skip || -+ image_size - skip < text_size ) -+ { -+ DOMPRINTF("%s: image is too small for declared text size", -+ __FUNCTION__); -+ return -EINVAL; -+ } -+ - memcpy(dest, image + skip, text_size); - memset(dest + text_size, 0, bss_size); - --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0019-libxc-check-failure-of-xc_dom_-_to_ptr-xc_map_foreig.patch xen-4.3.0/debian/patches/xsa55-4.2-0019-libxc-check-failure-of-xc_dom_-_to_ptr-xc_map_foreig.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0019-libxc-check-failure-of-xc_dom_-_to_ptr-xc_map_foreig.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0019-libxc-check-failure-of-xc_dom_-_to_ptr-xc_map_foreig.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,382 +0,0 @@ -From 77c0829fa751f052f7b8ec08287aef6e7ba97bc5 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:19 +0100 -Subject: [PATCH 19/23] libxc: check failure of xc_dom_*_to_ptr, xc_map_foreign_range - -The return values from xc_dom_*_to_ptr and xc_map_foreign_range are -sometimes dereferenced, or subjected to pointer arithmetic, without -checking whether the relevant function failed and returned NULL. - -Add an appropriate error check at every call site. - -Changes in the 4.2 backport of this series: -* Fix tools/libxc/xc_dom_x86.c:setup_pgtables_x86_32. -* Fix tools/libxc/xc_dom_ia64.c:start_info_ia64. -* Fix tools/libxc/ia64/xc_ia64_dom_fwloader.c:xc_dom_load_fw_kernel. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson ---- - tools/libxc/ia64/xc_ia64_dom_fwloader.c | 2 + - tools/libxc/xc_dom_binloader.c | 6 +++ - tools/libxc/xc_dom_core.c | 6 +++ - tools/libxc/xc_dom_elfloader.c | 13 +++++++ - tools/libxc/xc_dom_ia64.c | 6 +++ - tools/libxc/xc_dom_x86.c | 55 +++++++++++++++++++++++++++++++ - tools/libxc/xc_domain_restore.c | 27 +++++++++++++++ - tools/libxc/xc_offline_page.c | 5 +++ - 8 files changed, 120 insertions(+), 0 deletions(-) - -diff --git a/tools/libxc/ia64/xc_ia64_dom_fwloader.c b/tools/libxc/ia64/xc_ia64_dom_fwloader.c -index cdf3333..dbd3349 100644 ---- a/tools/libxc/ia64/xc_ia64_dom_fwloader.c -+++ b/tools/libxc/ia64/xc_ia64_dom_fwloader.c -@@ -60,6 +60,8 @@ static int xc_dom_load_fw_kernel(struct xc_dom_image *dom) - unsigned long i; - - dest = xc_dom_vaddr_to_ptr(dom, dom->kernel_seg.vstart); -+ if ( dest == NULL ) -+ return -1; - memcpy(dest, dom->kernel_blob, FW_SIZE); - - /* Synchronize cache. */ -diff --git a/tools/libxc/xc_dom_binloader.c b/tools/libxc/xc_dom_binloader.c -index 8596a28..553b366 100644 ---- a/tools/libxc/xc_dom_binloader.c -+++ b/tools/libxc/xc_dom_binloader.c -@@ -277,6 +277,12 @@ static int xc_dom_load_bin_kernel(struct xc_dom_image *dom) - DOMPRINTF(" bss_size: 0x%" PRIx32 "", bss_size); - - dest = xc_dom_vaddr_to_ptr(dom, dom->kernel_seg.vstart, &dest_size); -+ if ( dest == NULL ) -+ { -+ DOMPRINTF("%s: xc_dom_vaddr_to_ptr(dom, dom->kernel_seg.vstart)" -+ " => NULL", __FUNCTION__); -+ return -EINVAL; -+ } - - if ( dest_size < text_size || - dest_size - text_size < bss_size ) -diff --git a/tools/libxc/xc_dom_core.c b/tools/libxc/xc_dom_core.c -index 8913e41..a54ddae 100644 ---- a/tools/libxc/xc_dom_core.c -+++ b/tools/libxc/xc_dom_core.c -@@ -868,6 +868,12 @@ int xc_dom_build_image(struct xc_dom_image *dom) - ramdisklen) != 0 ) - goto err; - ramdiskmap = xc_dom_seg_to_ptr(dom, &dom->ramdisk_seg); -+ if ( ramdiskmap == NULL ) -+ { -+ DOMPRINTF("%s: xc_dom_seg_to_ptr(dom, &dom->ramdisk_seg) => NULL", -+ __FUNCTION__); -+ goto err; -+ } - if ( unziplen ) - { - if ( xc_dom_do_gunzip(dom->xch, -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index 9fc4b94..61b5798 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -139,6 +139,12 @@ static elf_errorstatus xc_dom_load_elf_symtab(struct xc_dom_image *dom, - return 0; - size = dom->kernel_seg.vend - dom->bsd_symtab_start; - hdr_ptr = xc_dom_vaddr_to_ptr(dom, dom->bsd_symtab_start, &allow_size); -+ if ( hdr_ptr == NULL ) -+ { -+ DOMPRINTF("%s/load: xc_dom_vaddr_to_ptr(dom,dom->bsd_symtab_start" -+ " => NULL", __FUNCTION__); -+ return -1; -+ } - elf->caller_xdest_base = hdr_ptr; - elf->caller_xdest_size = allow_size; - hdr = ELF_REALPTR2PTRVAL(hdr_ptr); -@@ -384,7 +390,14 @@ static elf_errorstatus xc_dom_load_elf_kernel(struct xc_dom_image *dom) - xen_pfn_t pages; - - elf->dest_base = xc_dom_seg_to_ptr_pages(dom, &dom->kernel_seg, &pages); -+ if ( elf->dest_base == NULL ) -+ { -+ DOMPRINTF("%s: xc_dom_vaddr_to_ptr(dom,dom->kernel_seg)" -+ " => NULL", __FUNCTION__); -+ return -1; -+ } - elf->dest_size = pages * XC_DOM_PAGE_SIZE(dom); -+ - rc = elf_load_binary(elf); - if ( rc < 0 ) - { -diff --git a/tools/libxc/xc_dom_ia64.c b/tools/libxc/xc_dom_ia64.c -index dcd1523..7c0eff1 100644 ---- a/tools/libxc/xc_dom_ia64.c -+++ b/tools/libxc/xc_dom_ia64.c -@@ -60,6 +60,12 @@ int start_info_ia64(struct xc_dom_image *dom) - - DOMPRINTF_CALLED(dom->xch); - -+ if ( start_info == NULL ) -+ { -+ DOMPRINTF("%s: xc_dom_pfn_to_ptr failed on start_info", __FUNCTION__); -+ return -1; /* our caller throws away our return value :-/ */ -+ } -+ - memset(start_info, 0, sizeof(*start_info)); - sprintf(start_info->magic, dom->guest_type); - start_info->flags = dom->flags; -diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c -index 0cf1687..75d6b83 100644 ---- a/tools/libxc/xc_dom_x86.c -+++ b/tools/libxc/xc_dom_x86.c -@@ -144,6 +144,9 @@ static int setup_pgtables_x86_32(struct xc_dom_image *dom) - xen_vaddr_t addr; - xen_pfn_t pgpfn; - -+ if ( l2tab == NULL ) -+ goto pfn_error; -+ - for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end; - addr += PAGE_SIZE_X86 ) - { -@@ -151,6 +154,8 @@ static int setup_pgtables_x86_32(struct xc_dom_image *dom) - { - /* get L1 tab, make L2 entry */ - l1tab = xc_dom_pfn_to_ptr(dom, l1pfn, 1); -+ if ( l1tab == NULL ) -+ goto pfn_error; - l2off = l2_table_offset_i386(addr); - l2tab[l2off] = - pfn_to_paddr(xc_dom_p2m_guest(dom, l1pfn)) | L2_PROT; -@@ -169,6 +174,11 @@ static int setup_pgtables_x86_32(struct xc_dom_image *dom) - l1tab = NULL; - } - return 0; -+ -+pfn_error: -+ xc_dom_panic(dom->xch, XC_INTERNAL_ERROR, -+ "%s: xc_dom_pfn_to_ptr failed", __FUNCTION__); -+ return -EINVAL; - } - - /* -@@ -219,6 +229,12 @@ static xen_pfn_t move_l3_below_4G(struct xc_dom_image *dom, - goto out; - - l3tab = xc_dom_pfn_to_ptr(dom, l3pfn, 1); -+ if ( l3tab == NULL ) -+ { -+ DOMPRINTF("%s: xc_dom_pfn_to_ptr(dom, l3pfn, 1) => NULL", -+ __FUNCTION__); -+ return l3mfn; /* our one call site will call xc_dom_panic and fail */ -+ } - memset(l3tab, 0, XC_DOM_PAGE_SIZE(dom)); - - DOMPRINTF("%s: successfully relocated L3 below 4G. " -@@ -262,6 +278,8 @@ static int setup_pgtables_x86_32_pae(struct xc_dom_image *dom) - } - - l3tab = xc_dom_pfn_to_ptr(dom, l3pfn, 1); -+ if ( l3tab == NULL ) -+ goto pfn_error; - - for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end; - addr += PAGE_SIZE_X86 ) -@@ -270,6 +288,8 @@ static int setup_pgtables_x86_32_pae(struct xc_dom_image *dom) - { - /* get L2 tab, make L3 entry */ - l2tab = xc_dom_pfn_to_ptr(dom, l2pfn, 1); -+ if ( l2tab == NULL ) -+ goto pfn_error; - l3off = l3_table_offset_pae(addr); - l3tab[l3off] = - pfn_to_paddr(xc_dom_p2m_guest(dom, l2pfn)) | L3_PROT; -@@ -280,6 +300,8 @@ static int setup_pgtables_x86_32_pae(struct xc_dom_image *dom) - { - /* get L1 tab, make L2 entry */ - l1tab = xc_dom_pfn_to_ptr(dom, l1pfn, 1); -+ if ( l1tab == NULL ) -+ goto pfn_error; - l2off = l2_table_offset_pae(addr); - l2tab[l2off] = - pfn_to_paddr(xc_dom_p2m_guest(dom, l1pfn)) | L2_PROT; -@@ -306,6 +328,11 @@ static int setup_pgtables_x86_32_pae(struct xc_dom_image *dom) - l3tab[3] = pfn_to_paddr(xc_dom_p2m_guest(dom, l2pfn)) | L3_PROT; - } - return 0; -+ -+pfn_error: -+ xc_dom_panic(dom->xch, XC_INTERNAL_ERROR, -+ "%s: xc_dom_pfn_to_ptr failed", __FUNCTION__); -+ return -EINVAL; - } - - #undef L1_PROT -@@ -344,6 +371,9 @@ static int setup_pgtables_x86_64(struct xc_dom_image *dom) - uint64_t addr; - xen_pfn_t pgpfn; - -+ if ( l4tab == NULL ) -+ goto pfn_error; -+ - for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end; - addr += PAGE_SIZE_X86 ) - { -@@ -351,6 +381,8 @@ static int setup_pgtables_x86_64(struct xc_dom_image *dom) - { - /* get L3 tab, make L4 entry */ - l3tab = xc_dom_pfn_to_ptr(dom, l3pfn, 1); -+ if ( l3tab == NULL ) -+ goto pfn_error; - l4off = l4_table_offset_x86_64(addr); - l4tab[l4off] = - pfn_to_paddr(xc_dom_p2m_guest(dom, l3pfn)) | L4_PROT; -@@ -361,6 +393,8 @@ static int setup_pgtables_x86_64(struct xc_dom_image *dom) - { - /* get L2 tab, make L3 entry */ - l2tab = xc_dom_pfn_to_ptr(dom, l2pfn, 1); -+ if ( l2tab == NULL ) -+ goto pfn_error; - l3off = l3_table_offset_x86_64(addr); - l3tab[l3off] = - pfn_to_paddr(xc_dom_p2m_guest(dom, l2pfn)) | L3_PROT; -@@ -373,6 +407,8 @@ static int setup_pgtables_x86_64(struct xc_dom_image *dom) - { - /* get L1 tab, make L2 entry */ - l1tab = xc_dom_pfn_to_ptr(dom, l1pfn, 1); -+ if ( l1tab == NULL ) -+ goto pfn_error; - l2off = l2_table_offset_x86_64(addr); - l2tab[l2off] = - pfn_to_paddr(xc_dom_p2m_guest(dom, l1pfn)) | L2_PROT; -@@ -393,6 +429,11 @@ static int setup_pgtables_x86_64(struct xc_dom_image *dom) - l1tab = NULL; - } - return 0; -+ -+pfn_error: -+ xc_dom_panic(dom->xch, XC_INTERNAL_ERROR, -+ "%s: xc_dom_pfn_to_ptr failed", __FUNCTION__); -+ return -EINVAL; - } - - #undef L1_PROT -@@ -410,6 +451,8 @@ static int alloc_magic_pages(struct xc_dom_image *dom) - if ( xc_dom_alloc_segment(dom, &dom->p2m_seg, "phys2mach", 0, p2m_size) ) - return -1; - dom->p2m_guest = xc_dom_seg_to_ptr(dom, &dom->p2m_seg); -+ if ( dom->p2m_guest == NULL ) -+ return -1; - - /* allocate special pages */ - dom->start_info_pfn = xc_dom_alloc_page(dom, "start info"); -@@ -434,6 +477,12 @@ static int start_info_x86_32(struct xc_dom_image *dom) - - DOMPRINTF_CALLED(dom->xch); - -+ if ( start_info == NULL ) -+ { -+ DOMPRINTF("%s: xc_dom_pfn_to_ptr failed on start_info", __FUNCTION__); -+ return -1; /* our caller throws away our return value :-/ */ -+ } -+ - memset(start_info, 0, sizeof(*start_info)); - strncpy(start_info->magic, dom->guest_type, sizeof(start_info->magic)); - start_info->magic[sizeof(start_info->magic) - 1] = '\0'; -@@ -474,6 +523,12 @@ static int start_info_x86_64(struct xc_dom_image *dom) - - DOMPRINTF_CALLED(dom->xch); - -+ if ( start_info == NULL ) -+ { -+ DOMPRINTF("%s: xc_dom_pfn_to_ptr failed on start_info", __FUNCTION__); -+ return -1; /* our caller throws away our return value :-/ */ -+ } -+ - memset(start_info, 0, sizeof(*start_info)); - strncpy(start_info->magic, dom->guest_type, sizeof(start_info->magic)); - start_info->magic[sizeof(start_info->magic) - 1] = '\0'; -diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c -index b4c0b10..3994f8f 100644 ---- a/tools/libxc/xc_domain_restore.c -+++ b/tools/libxc/xc_domain_restore.c -@@ -1556,6 +1556,12 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom, - mfn = ctx->p2m[pfn]; - buf = xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ | PROT_WRITE, mfn); -+ if ( buf == NULL ) -+ { -+ ERROR("xc_map_foreign_range for generation id" -+ " buffer failed"); -+ goto out; -+ } - - generationid = *(unsigned long long *)(buf + offset); - *(unsigned long long *)(buf + offset) = generationid + 1; -@@ -1713,6 +1719,11 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom, - l3tab = (uint64_t *) - xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ, ctx->p2m[i]); -+ if ( l3tab == NULL ) -+ { -+ PERROR("xc_map_foreign_range failed (for l3tab)"); -+ goto out; -+ } - - for ( j = 0; j < 4; j++ ) - l3ptes[j] = l3tab[j]; -@@ -1739,6 +1750,11 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom, - l3tab = (uint64_t *) - xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ | PROT_WRITE, ctx->p2m[i]); -+ if ( l3tab == NULL ) -+ { -+ PERROR("xc_map_foreign_range failed (for l3tab, 2nd)"); -+ goto out; -+ } - - for ( j = 0; j < 4; j++ ) - l3tab[j] = l3ptes[j]; -@@ -1909,6 +1925,12 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom, - SET_FIELD(ctxt, user_regs.edx, mfn); - start_info = xc_map_foreign_range( - xch, dom, PAGE_SIZE, PROT_READ | PROT_WRITE, mfn); -+ if ( start_info == NULL ) -+ { -+ PERROR("xc_map_foreign_range failed (for start_info)"); -+ goto out; -+ } -+ - SET_FIELD(start_info, nr_pages, dinfo->p2m_size); - SET_FIELD(start_info, shared_info, shared_info_frame< -Date: Fri, 14 Jun 2013 16:43:19 +0100 -Subject: [PATCH 20/23] libxc: check return values from malloc - -A sufficiently malformed input to libxc (such as a malformed input ELF -or other guest-controlled data) might cause one of libxc's malloc() to -fail. In this case we need to make sure we don't dereference or do -pointer arithmetic on the result. - -Search for all occurrences of \b(m|c|re)alloc in libxc, and all -functions which call them, and add appropriate error checking where -missing. - -This includes the functions xc_dom_malloc*, which now print a message -when they fail so that callers don't have to do so. - -The function xc_cpuid_to_str wasn't provided with a sane return value -and has a pretty strange API, which now becomes a little stranger. -There are no in-tree callers. - -Changes in the Xen 4.2 version of this series: -* No need to fix code relating to ARM. -* No need to fix code relating to superpage support. -* Additionally fix `dom->p2m_host = xc_dom_malloc...' in xc_dom_ia64.c. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson ---- - tools/libxc/xc_cpuid_x86.c | 20 ++++++++++++++++++-- - tools/libxc/xc_dom_core.c | 13 +++++++++++++ - tools/libxc/xc_dom_elfloader.c | 2 ++ - tools/libxc/xc_dom_ia64.c | 6 ++++++ - tools/libxc/xc_dom_x86.c | 3 +++ - tools/libxc/xc_domain_restore.c | 5 +++++ - tools/libxc/xc_linux_osdep.c | 4 ++++ - tools/libxc/xc_private.c | 2 ++ - tools/libxc/xenctrl.h | 2 +- - 9 files changed, 54 insertions(+), 3 deletions(-) - -diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c -index 0882ce6..da435ce 100644 ---- a/tools/libxc/xc_cpuid_x86.c -+++ b/tools/libxc/xc_cpuid_x86.c -@@ -589,6 +589,8 @@ static int xc_cpuid_do_domctl( - static char *alloc_str(void) - { - char *s = malloc(33); -+ if ( s == NULL ) -+ return s; - memset(s, 0, 33); - return s; - } -@@ -600,6 +602,8 @@ void xc_cpuid_to_str(const unsigned int *regs, char **strs) - for ( i = 0; i < 4; i++ ) - { - strs[i] = alloc_str(); -+ if ( strs[i] == NULL ) -+ continue; - for ( j = 0; j < 32; j++ ) - strs[i][j] = !!((regs[i] & (1U << (31 - j)))) ? '1' : '0'; - } -@@ -680,7 +684,7 @@ int xc_cpuid_check( - const char **config, - char **config_transformed) - { -- int i, j; -+ int i, j, rc; - unsigned int regs[4]; - - memset(config_transformed, 0, 4 * sizeof(*config_transformed)); -@@ -692,6 +696,11 @@ int xc_cpuid_check( - if ( config[i] == NULL ) - continue; - config_transformed[i] = alloc_str(); -+ if ( config_transformed[i] == NULL ) -+ { -+ rc = -ENOMEM; -+ goto fail_rc; -+ } - for ( j = 0; j < 32; j++ ) - { - unsigned char val = !!((regs[i] & (1U << (31 - j)))); -@@ -708,12 +717,14 @@ int xc_cpuid_check( - return 0; - - fail: -+ rc = -EPERM; -+ fail_rc: - for ( i = 0; i < 4; i++ ) - { - free(config_transformed[i]); - config_transformed[i] = NULL; - } -- return -EPERM; -+ return rc; - } - - /* -@@ -758,6 +769,11 @@ int xc_cpuid_set( - } - - config_transformed[i] = alloc_str(); -+ if ( config_transformed[i] == NULL ) -+ { -+ rc = -ENOMEM; -+ goto fail; -+ } - - for ( j = 0; j < 32; j++ ) - { -diff --git a/tools/libxc/xc_dom_core.c b/tools/libxc/xc_dom_core.c -index a54ddae..3cbf9f7 100644 ---- a/tools/libxc/xc_dom_core.c -+++ b/tools/libxc/xc_dom_core.c -@@ -120,9 +120,17 @@ void *xc_dom_malloc(struct xc_dom_image *dom, size_t size) - { - struct xc_dom_mem *block; - -+ if ( size > SIZE_MAX - sizeof(*block) ) -+ { -+ DOMPRINTF("%s: unreasonable allocation size", __FUNCTION__); -+ return NULL; -+ } - block = malloc(sizeof(*block) + size); - if ( block == NULL ) -+ { -+ DOMPRINTF("%s: allocation failed", __FUNCTION__); - return NULL; -+ } - memset(block, 0, sizeof(*block) + size); - block->next = dom->memblocks; - dom->memblocks = block; -@@ -138,7 +146,10 @@ void *xc_dom_malloc_page_aligned(struct xc_dom_image *dom, size_t size) - - block = malloc(sizeof(*block)); - if ( block == NULL ) -+ { -+ DOMPRINTF("%s: allocation failed", __FUNCTION__); - return NULL; -+ } - memset(block, 0, sizeof(*block)); - block->mmap_len = size; - block->mmap_ptr = mmap(NULL, block->mmap_len, -@@ -146,6 +157,7 @@ void *xc_dom_malloc_page_aligned(struct xc_dom_image *dom, size_t size) - -1, 0); - if ( block->mmap_ptr == MAP_FAILED ) - { -+ DOMPRINTF("%s: mmap failed", __FUNCTION__); - free(block); - return NULL; - } -@@ -202,6 +214,7 @@ void *xc_dom_malloc_filemap(struct xc_dom_image *dom, - close(fd); - if ( block != NULL ) - free(block); -+ DOMPRINTF("%s: failed (on file `%s')", __FUNCTION__, filename); - return NULL; - } - -diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c -index 61b5798..be58276 100644 ---- a/tools/libxc/xc_dom_elfloader.c -+++ b/tools/libxc/xc_dom_elfloader.c -@@ -329,6 +329,8 @@ static elf_errorstatus xc_dom_parse_elf_kernel(struct xc_dom_image *dom) - return rc; - - elf = xc_dom_malloc(dom, sizeof(*elf)); -+ if ( elf == NULL ) -+ return -1; - dom->private_loader = elf; - rc = elf_init(elf, dom->kernel_blob, dom->kernel_size); - xc_elf_set_logfile(dom->xch, elf, 1); -diff --git a/tools/libxc/xc_dom_ia64.c b/tools/libxc/xc_dom_ia64.c -index 7c0eff1..076821c 100644 ---- a/tools/libxc/xc_dom_ia64.c -+++ b/tools/libxc/xc_dom_ia64.c -@@ -188,6 +188,12 @@ int arch_setup_meminit(struct xc_dom_image *dom) - - /* setup initial p2m */ - dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * nbr); -+ if ( dom->p2m_host == NULL ) -+ { -+ DOMPRINTF("%s: xc_dom_malloc failed for p2m_host", -+ __FUNCTION__); -+ return -1; -+ } - for ( pfn = 0; pfn < nbr; pfn++ ) - dom->p2m_host[pfn] = start + pfn; - -diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c -index 75d6b83..448d9a1 100644 ---- a/tools/libxc/xc_dom_x86.c -+++ b/tools/libxc/xc_dom_x86.c -@@ -780,6 +780,9 @@ int arch_setup_meminit(struct xc_dom_image *dom) - } - - dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom->total_pages); -+ if ( dom->p2m_host == NULL ) -+ return -EINVAL; -+ - if ( dom->superpages ) - { - int count = dom->total_pages >> SUPERPAGE_PFN_SHIFT; -diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c -index 3994f8f..f9ed6b2 100644 ---- a/tools/libxc/xc_domain_restore.c -+++ b/tools/libxc/xc_domain_restore.c -@@ -1180,6 +1180,11 @@ static int apply_batch(xc_interface *xch, uint32_t dom, struct restore_ctx *ctx, - - /* Map relevant mfns */ - pfn_err = calloc(j, sizeof(*pfn_err)); -+ if ( pfn_err == NULL ) -+ { -+ PERROR("allocation for pfn_err failed"); -+ return -1; -+ } - region_base = xc_map_foreign_bulk( - xch, dom, PROT_WRITE, region_mfn, pfn_err, j); - -diff --git a/tools/libxc/xc_linux_osdep.c b/tools/libxc/xc_linux_osdep.c -index 787e742..98e041c 100644 ---- a/tools/libxc/xc_linux_osdep.c -+++ b/tools/libxc/xc_linux_osdep.c -@@ -378,6 +378,8 @@ static void *linux_privcmd_map_foreign_range(xc_interface *xch, xc_osdep_handle - - num = (size + XC_PAGE_SIZE - 1) >> XC_PAGE_SHIFT; - arr = calloc(num, sizeof(xen_pfn_t)); -+ if ( arr == NULL ) -+ return NULL; - - for ( i = 0; i < num; i++ ) - arr[i] = mfn + i; -@@ -402,6 +404,8 @@ static void *linux_privcmd_map_foreign_ranges(xc_interface *xch, xc_osdep_handle - num_per_entry = chunksize >> XC_PAGE_SHIFT; - num = num_per_entry * nentries; - arr = calloc(num, sizeof(xen_pfn_t)); -+ if ( arr == NULL ) -+ return NULL; - - for ( i = 0; i < nentries; i++ ) - for ( j = 0; j < num_per_entry; j++ ) -diff --git a/tools/libxc/xc_private.c b/tools/libxc/xc_private.c -index 3e03a91..848ceed 100644 ---- a/tools/libxc/xc_private.c -+++ b/tools/libxc/xc_private.c -@@ -771,6 +771,8 @@ const char *xc_strerror(xc_interface *xch, int errcode) - errbuf = pthread_getspecific(errbuf_pkey); - if (errbuf == NULL) { - errbuf = malloc(XS_BUFSIZE); -+ if ( errbuf == NULL ) -+ return "(failed to allocate errbuf)"; - pthread_setspecific(errbuf_pkey, errbuf); - } - -diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h -index b7741ca..8952048 100644 ---- a/tools/libxc/xenctrl.h -+++ b/tools/libxc/xenctrl.h -@@ -1778,7 +1778,7 @@ int xc_cpuid_set(xc_interface *xch, - int xc_cpuid_apply_policy(xc_interface *xch, - domid_t domid); - void xc_cpuid_to_str(const unsigned int *regs, -- char **strs); -+ char **strs); /* some strs[] may be NULL if ENOMEM */ - int xc_mca_op(xc_interface *xch, struct xen_mc *mc); - #endif - --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0021-libxc-range-checks-in-xc_dom_p2m_host-and-_guest.patch xen-4.3.0/debian/patches/xsa55-4.2-0021-libxc-range-checks-in-xc_dom_p2m_host-and-_guest.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0021-libxc-range-checks-in-xc_dom_p2m_host-and-_guest.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0021-libxc-range-checks-in-xc_dom_p2m_host-and-_guest.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -From 052a689aa526ca51fd70528d4b0f83dfb2de99c1 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:19 +0100 -Subject: [PATCH 21/23] libxc: range checks in xc_dom_p2m_host and _guest - -These functions take guest pfns and look them up in the p2m. They did -no range checking. - -However, some callers, notably xc_dom_boot.c:setup_hypercall_page want -to pass untrusted guest-supplied value(s). It is most convenient to -detect this here and return INVALID_MFN. - -This is part of the fix to a security issue, XSA-55. - -Changes from Xen 4.2 version of this patch: -* 4.2 lacks dom->rambase_pfn, so don't add/subtract/check it. - -Signed-off-by: Ian Jackson ---- - tools/libxc/xc_dom.h | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - -diff --git a/tools/libxc/xc_dom.h b/tools/libxc/xc_dom.h -index 0161459..d801f66 100644 ---- a/tools/libxc/xc_dom.h -+++ b/tools/libxc/xc_dom.h -@@ -331,6 +331,8 @@ static inline xen_pfn_t xc_dom_p2m_host(struct xc_dom_image *dom, xen_pfn_t pfn) - { - if (dom->shadow_enabled) - return pfn; -+ if (pfn >= dom->total_pages) -+ return INVALID_MFN; - return dom->p2m_host[pfn]; - } - -@@ -339,6 +341,8 @@ static inline xen_pfn_t xc_dom_p2m_guest(struct xc_dom_image *dom, - { - if (xc_dom_feature_translated(dom)) - return pfn; -+ if (pfn >= dom->total_pages) -+ return INVALID_MFN; - return dom->p2m_host[pfn]; - } - --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0022-libxc-check-blob-size-before-proceeding-in-xc_dom_ch.patch xen-4.3.0/debian/patches/xsa55-4.2-0022-libxc-check-blob-size-before-proceeding-in-xc_dom_ch.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0022-libxc-check-blob-size-before-proceeding-in-xc_dom_ch.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0022-libxc-check-blob-size-before-proceeding-in-xc_dom_ch.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -From 2a548e22915535ac13694eb38222903bca7245e3 Mon Sep 17 00:00:00 2001 -From: Matthew Daley -Date: Fri, 14 Jun 2013 16:43:19 +0100 -Subject: [PATCH 22/23] libxc: check blob size before proceeding in xc_dom_check_gzip - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Matthew Daley ---- - tools/libxc/xc_dom_core.c | 5 +++++ - 1 files changed, 5 insertions(+), 0 deletions(-) - -diff --git a/tools/libxc/xc_dom_core.c b/tools/libxc/xc_dom_core.c -index 3cbf9f7..f8d1b08 100644 ---- a/tools/libxc/xc_dom_core.c -+++ b/tools/libxc/xc_dom_core.c -@@ -284,6 +284,11 @@ size_t xc_dom_check_gzip(xc_interface *xch, void *blob, size_t ziplen) - unsigned char *gzlen; - size_t unziplen; - -+ if ( ziplen < 6 ) -+ /* Too small. We need (i.e. the subsequent code relies on) -+ * 2 bytes for the magic number plus 4 bytes length. */ -+ return 0; -+ - if ( strncmp(blob, "\037\213", 2) ) - /* not gzipped */ - return 0; --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa55-4.2-0023-libxc-Better-range-check-in-xc_dom_alloc_segment.patch xen-4.3.0/debian/patches/xsa55-4.2-0023-libxc-Better-range-check-in-xc_dom_alloc_segment.patch --- xen-4.2.2/debian/patches/xsa55-4.2-0023-libxc-Better-range-check-in-xc_dom_alloc_segment.patch 2013-07-17 10:55:52.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa55-4.2-0023-libxc-Better-range-check-in-xc_dom_alloc_segment.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -From d21d36e84354c04638b60a739a5f7c3d9f8adaf8 Mon Sep 17 00:00:00 2001 -From: Ian Jackson -Date: Fri, 14 Jun 2013 16:43:19 +0100 -Subject: [PATCH 23/23] libxc: Better range check in xc_dom_alloc_segment - -If seg->pfn is too large, the arithmetic in the range check might -overflow, defeating the range check. - -This is part of the fix to a security issue, XSA-55. - -Signed-off-by: Ian Jackson -Reviewed-by: Andrew Cooper ---- - tools/libxc/xc_dom_core.c | 3 ++- - 1 files changed, 2 insertions(+), 1 deletions(-) - -diff --git a/tools/libxc/xc_dom_core.c b/tools/libxc/xc_dom_core.c -index f8d1b08..e79e38d 100644 ---- a/tools/libxc/xc_dom_core.c -+++ b/tools/libxc/xc_dom_core.c -@@ -509,7 +509,8 @@ int xc_dom_alloc_segment(struct xc_dom_image *dom, - seg->vstart = start; - seg->pfn = (seg->vstart - dom->parms.virt_base) / page_size; - -- if ( pages > dom->total_pages || /* double test avoids overflow probs */ -+ if ( pages > dom->total_pages || /* multiple test avoids overflow probs */ -+ seg->pfn > dom->total_pages || - pages > dom->total_pages - seg->pfn) - { - xc_dom_panic(dom->xch, XC_OUT_OF_MEMORY, --- -1.7.2.5 - diff -Nru xen-4.2.2/debian/patches/xsa57-4.2.patch xen-4.3.0/debian/patches/xsa57-4.2.patch --- xen-4.2.2/debian/patches/xsa57-4.2.patch 2013-07-17 11:06:38.000000000 +0000 +++ xen-4.3.0/debian/patches/xsa57-4.2.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,333 +0,0 @@ -libxl: Restrict permissions on PV console device xenstore nodes - -Matthew Daley has observed that the PV console protocol places sensitive host -state into a guest writeable xenstore locations, this includes: - - - The pty used to communicate between the console backend daemon and its - client, allowing the guest administrator to read and write arbitrary host - files. - - The output file, allowing the guest administrator to write arbitrary host - files or to target arbitrary qemu chardevs which include sockets, udp, ptr, - pipes etc (see -chardev in qemu(1) for a more complete list). - - The maximum buffer size, allowing the guest administrator to consume more - resources than the host administrator has configured. - - The backend to use (qemu vs xenconsoled), potentially allowing the guest - administrator to confuse host software. - -So we arrange to make the sensitive keys in the xenstore frontend directory -read only for the guest. This is safe since the xenstore permissions model, -unlike POSIX directory permissions, does not allow the guest to remove and -recreate a node if it has write access to the containing directory. - -There are a few associated wrinkles: - - - The primary PV console is "special". It's xenstore node is not under the - usual /devices/ subtree and it does not use the customary xenstore state - machine protocol. Unfortunately its directory is used for other things, - including the vnc-port node, which we do not want the guest to be able to - write to. Rather than trying to track down all the possible secondary uses - of this directory just make it r/o to the guest. All newly created - subdirectories inherit these permissions and so are now safe by default. - - - The other serial consoles do use the customary xenstore state machine and - therefore need write access to at least the "protocol" and "state" nodes, - however they may also want to use arbitrary "feature-foo" nodes (although - I'm not aware of any) and therefore we cannot simply lock down the entire - frontend directory. Instead we add support to libxl__device_generic_add for - frontend keys which are explicitly read only and use that to lock down the - sensitive keys. - - - Minios' console frontend wants to write the "type" node, which it has no - business doing since this is a host/toolstack level decision. This fails - now that the node has become read only to the PV guest. Since the toolstack - already writes this node just remove the attempt to set it. - -This is CVE-2013-2211/ XSA-57 - -Signed-off-by: Ian Campbell - -Conflicts: - tools/libxl/libxl.c (no vtpm, free front_ro on error in - libxl__device_console_add) - -Index: xen-4.2.2/extras/mini-os/console/xenbus.c -=================================================================== ---- xen-4.2.2.orig/extras/mini-os/console/xenbus.c 2013-04-23 18:42:55.000000000 +0200 -+++ xen-4.2.2/extras/mini-os/console/xenbus.c 2013-07-17 13:00:26.137389581 +0200 -@@ -122,12 +122,6 @@ again: - goto abort_transaction; - } - -- err = xenbus_printf(xbt, nodename, "type", "%s", "ioemu"); -- if (err) { -- message = "writing type"; -- goto abort_transaction; -- } -- - snprintf(path, sizeof(path), "%s/state", nodename); - err = xenbus_switch_state(xbt, path, XenbusStateConnected); - if (err) { -Index: xen-4.2.2/tools/libxl/libxl.c -=================================================================== ---- xen-4.2.2.orig/tools/libxl/libxl.c 2013-07-15 14:39:56.000000000 +0200 -+++ xen-4.2.2/tools/libxl/libxl.c 2013-07-17 13:00:26.141389621 +0200 -@@ -1913,8 +1913,9 @@ static void device_disk_add(libxl__egc * - flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk"); - - libxl__device_generic_add(gc, t, device, -- libxl__xs_kvs_of_flexarray(gc, back, back->count), -- libxl__xs_kvs_of_flexarray(gc, front, front->count)); -+ libxl__xs_kvs_of_flexarray(gc, back, back->count), -+ libxl__xs_kvs_of_flexarray(gc, front, front->count), -+ NULL); - - rc = libxl__xs_transaction_commit(gc, &t); - if (!rc) break; -@@ -2626,8 +2627,9 @@ void libxl__device_nic_add(libxl__egc *e - flexarray_append(front, libxl__sprintf(gc, - LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac))); - libxl__device_generic_add(gc, XBT_NULL, device, -- libxl__xs_kvs_of_flexarray(gc, back, back->count), -- libxl__xs_kvs_of_flexarray(gc, front, front->count)); -+ libxl__xs_kvs_of_flexarray(gc, back, back->count), -+ libxl__xs_kvs_of_flexarray(gc, front, front->count), -+ NULL); - - aodev->dev = device; - aodev->action = DEVICE_CONNECT; -@@ -2823,7 +2825,7 @@ int libxl__device_console_add(libxl__gc - libxl__device_console *console, - libxl__domain_build_state *state) - { -- flexarray_t *front; -+ flexarray_t *front, *ro_front; - flexarray_t *back; - libxl__device device; - int rc; -@@ -2838,6 +2840,11 @@ int libxl__device_console_add(libxl__gc - rc = ERROR_NOMEM; - goto out; - } -+ ro_front = flexarray_make(16, 1); -+ if (!ro_front) { -+ rc = ERROR_NOMEM; -+ goto out; -+ } - back = flexarray_make(16, 1); - if (!back) { - rc = ERROR_NOMEM; -@@ -2864,21 +2871,24 @@ int libxl__device_console_add(libxl__gc - - flexarray_append(front, "backend-id"); - flexarray_append(front, libxl__sprintf(gc, "%d", console->backend_domid)); -- flexarray_append(front, "limit"); -- flexarray_append(front, libxl__sprintf(gc, "%d", LIBXL_XENCONSOLE_LIMIT)); -- flexarray_append(front, "type"); -+ -+ flexarray_append(ro_front, "limit"); -+ flexarray_append(ro_front, libxl__sprintf(gc, "%d", LIBXL_XENCONSOLE_LIMIT)); -+ flexarray_append(ro_front, "type"); - if (console->consback == LIBXL__CONSOLE_BACKEND_XENCONSOLED) -- flexarray_append(front, "xenconsoled"); -+ flexarray_append(ro_front, "xenconsoled"); - else -- flexarray_append(front, "ioemu"); -- flexarray_append(front, "output"); -- flexarray_append(front, console->output); -+ flexarray_append(ro_front, "ioemu"); -+ flexarray_append(ro_front, "output"); -+ flexarray_append(ro_front, console->output); -+ flexarray_append(ro_front, "tty"); -+ flexarray_append(ro_front, ""); - - if (state) { -- flexarray_append(front, "port"); -- flexarray_append(front, libxl__sprintf(gc, "%"PRIu32, state->console_port)); -- flexarray_append(front, "ring-ref"); -- flexarray_append(front, libxl__sprintf(gc, "%lu", state->console_mfn)); -+ flexarray_append(ro_front, "port"); -+ flexarray_append(ro_front, libxl__sprintf(gc, "%"PRIu32, state->console_port)); -+ flexarray_append(ro_front, "ring-ref"); -+ flexarray_append(ro_front, libxl__sprintf(gc, "%lu", state->console_mfn)); - } else { - flexarray_append(front, "state"); - flexarray_append(front, libxl__sprintf(gc, "%d", 1)); -@@ -2887,11 +2897,13 @@ int libxl__device_console_add(libxl__gc - } - - libxl__device_generic_add(gc, XBT_NULL, &device, -- libxl__xs_kvs_of_flexarray(gc, back, back->count), -- libxl__xs_kvs_of_flexarray(gc, front, front->count)); -+ libxl__xs_kvs_of_flexarray(gc, back, back->count), -+ libxl__xs_kvs_of_flexarray(gc, front, front->count), -+ libxl__xs_kvs_of_flexarray(gc, ro_front, ro_front->count)); - rc = 0; - out_free: - flexarray_free(back); -+ flexarray_free(ro_front); - flexarray_free(front); - out: - return rc; -@@ -2975,8 +2987,9 @@ int libxl__device_vkb_add(libxl__gc *gc, - flexarray_append(front, libxl__sprintf(gc, "%d", 1)); - - libxl__device_generic_add(gc, XBT_NULL, &device, -- libxl__xs_kvs_of_flexarray(gc, back, back->count), -- libxl__xs_kvs_of_flexarray(gc, front, front->count)); -+ libxl__xs_kvs_of_flexarray(gc, back, back->count), -+ libxl__xs_kvs_of_flexarray(gc, front, front->count), -+ NULL); - rc = 0; - out_free: - flexarray_free(back); -@@ -3089,8 +3102,9 @@ int libxl__device_vfb_add(libxl__gc *gc, - flexarray_append_pair(front, "state", libxl__sprintf(gc, "%d", 1)); - - libxl__device_generic_add(gc, XBT_NULL, &device, -- libxl__xs_kvs_of_flexarray(gc, back, back->count), -- libxl__xs_kvs_of_flexarray(gc, front, front->count)); -+ libxl__xs_kvs_of_flexarray(gc, back, back->count), -+ libxl__xs_kvs_of_flexarray(gc, front, front->count), -+ NULL); - rc = 0; - out_free: - flexarray_free(front); -Index: xen-4.2.2/tools/libxl/libxl_device.c -=================================================================== ---- xen-4.2.2.orig/tools/libxl/libxl_device.c 2013-04-23 18:42:55.000000000 +0200 -+++ xen-4.2.2/tools/libxl/libxl_device.c 2013-07-17 13:00:26.141389621 +0200 -@@ -84,11 +84,12 @@ out: - } - - int libxl__device_generic_add(libxl__gc *gc, xs_transaction_t t, -- libxl__device *device, char **bents, char **fents) -+ libxl__device *device, char **bents, char **fents, char **ro_fents) - { - libxl_ctx *ctx = libxl__gc_owner(gc); - char *frontend_path, *backend_path; - struct xs_permissions frontend_perms[2]; -+ struct xs_permissions ro_frontend_perms[2]; - struct xs_permissions backend_perms[2]; - int create_transaction = t == XBT_NULL; - -@@ -100,22 +101,37 @@ int libxl__device_generic_add(libxl__gc - frontend_perms[1].id = device->backend_domid; - frontend_perms[1].perms = XS_PERM_READ; - -- backend_perms[0].id = device->backend_domid; -- backend_perms[0].perms = XS_PERM_NONE; -- backend_perms[1].id = device->domid; -- backend_perms[1].perms = XS_PERM_READ; -+ ro_frontend_perms[0].id = backend_perms[0].id = device->backend_domid; -+ ro_frontend_perms[0].perms = backend_perms[0].perms = XS_PERM_NONE; -+ ro_frontend_perms[1].id = backend_perms[1].id = device->domid; -+ ro_frontend_perms[1].perms = backend_perms[1].perms = XS_PERM_READ; - - retry_transaction: - if (create_transaction) - t = xs_transaction_start(ctx->xsh); - /* FIXME: read frontend_path and check state before removing stuff */ - -- if (fents) { -+ if (fents || ro_fents) { - xs_rm(ctx->xsh, t, frontend_path); - xs_mkdir(ctx->xsh, t, frontend_path); -- xs_set_permissions(ctx->xsh, t, frontend_path, frontend_perms, ARRAY_SIZE(frontend_perms)); -+ /* Console 0 is a special case. It doesn't use the regular PV -+ * state machine but also the frontend directory has -+ * historically contained other information, such as the -+ * vnc-port, which we don't want the guest fiddling with. -+ */ -+ if (device->kind == LIBXL__DEVICE_KIND_CONSOLE && device->devid == 0) -+ xs_set_permissions(ctx->xsh, t, frontend_path, -+ ro_frontend_perms, ARRAY_SIZE(ro_frontend_perms)); -+ else -+ xs_set_permissions(ctx->xsh, t, frontend_path, -+ frontend_perms, ARRAY_SIZE(frontend_perms)); - xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/backend", frontend_path), backend_path, strlen(backend_path)); -- libxl__xs_writev(gc, t, frontend_path, fents); -+ if (fents) -+ libxl__xs_writev_perms(gc, t, frontend_path, fents, -+ frontend_perms, ARRAY_SIZE(frontend_perms)); -+ if (ro_fents) -+ libxl__xs_writev_perms(gc, t, frontend_path, ro_fents, -+ ro_frontend_perms, ARRAY_SIZE(ro_frontend_perms)); - } - - if (bents) { -Index: xen-4.2.2/tools/libxl/libxl_internal.h -=================================================================== ---- xen-4.2.2.orig/tools/libxl/libxl_internal.h 2013-07-15 14:39:56.000000000 +0200 -+++ xen-4.2.2/tools/libxl/libxl_internal.h 2013-07-17 13:00:26.145389634 +0200 -@@ -515,6 +515,11 @@ _hidden char **libxl__xs_kvs_of_flexarra - /* treats kvs as pairs of keys and values and writes each to dir. */ - _hidden int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t, - const char *dir, char **kvs); -+/* as writev but also sets the permissions on each path */ -+_hidden int libxl__xs_writev_perms(libxl__gc *gc, xs_transaction_t t, -+ const char *dir, char *kvs[], -+ struct xs_permissions *perms, -+ unsigned int num_perms); - /* _atonce creates a transaction and writes all keys at once */ - _hidden int libxl__xs_writev_atonce(libxl__gc *gc, - const char *dir, char **kvs); -@@ -929,7 +934,7 @@ _hidden int libxl__device_console_add(li - libxl__domain_build_state *state); - - _hidden int libxl__device_generic_add(libxl__gc *gc, xs_transaction_t t, -- libxl__device *device, char **bents, char **fents); -+ libxl__device *device, char **bents, char **fents, char **ro_fents); - _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device); - _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device); - _hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path, -Index: xen-4.2.2/tools/libxl/libxl_pci.c -=================================================================== ---- xen-4.2.2.orig/tools/libxl/libxl_pci.c 2013-04-23 18:42:55.000000000 +0200 -+++ xen-4.2.2/tools/libxl/libxl_pci.c 2013-07-17 13:00:26.145389634 +0200 -@@ -106,7 +106,8 @@ int libxl__create_pci_backend(libxl__gc - - libxl__device_generic_add(gc, XBT_NULL, &device, - libxl__xs_kvs_of_flexarray(gc, back, back->count), -- libxl__xs_kvs_of_flexarray(gc, front, front->count)); -+ libxl__xs_kvs_of_flexarray(gc, front, front->count), -+ NULL); - - out: - if (back) -Index: xen-4.2.2/tools/libxl/libxl_xshelp.c -=================================================================== ---- xen-4.2.2.orig/tools/libxl/libxl_xshelp.c 2013-04-23 18:42:55.000000000 +0200 -+++ xen-4.2.2/tools/libxl/libxl_xshelp.c 2013-07-17 13:00:26.149389648 +0200 -@@ -41,8 +41,10 @@ char **libxl__xs_kvs_of_flexarray(libxl_ - return kvs; - } - --int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t, -- const char *dir, char *kvs[]) -+int libxl__xs_writev_perms(libxl__gc *gc, xs_transaction_t t, -+ const char *dir, char *kvs[], -+ struct xs_permissions *perms, -+ unsigned int num_perms) - { - libxl_ctx *ctx = libxl__gc_owner(gc); - char *path; -@@ -56,11 +58,19 @@ int libxl__xs_writev(libxl__gc *gc, xs_t - if (path && kvs[i + 1]) { - int length = strlen(kvs[i + 1]); - xs_write(ctx->xsh, t, path, kvs[i + 1], length); -+ if (perms) -+ xs_set_permissions(ctx->xsh, t, path, perms, num_perms); - } - } - return 0; - } - -+int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t, -+ const char *dir, char *kvs[]) -+{ -+ return libxl__xs_writev_perms(gc, t, dir, kvs, NULL, 0); -+} -+ - int libxl__xs_writev_atonce(libxl__gc *gc, - const char *dir, char *kvs[]) - { diff -Nru xen-4.2.2/debian/rules xen-4.3.0/debian/rules --- xen-4.2.2/debian/rules 2013-07-24 16:56:25.000000000 +0000 +++ xen-4.3.0/debian/rules 2013-07-23 12:42:16.000000000 +0000 @@ -5,34 +5,24 @@ include /usr/share/dpkg/default.mk -# Ubuntu passes LDFLAGS suitable for gcc by default (-Wl prefix) but -# Xen passes LDFLAGS directly to ld (not through gcc), so this fails. -# Strip the prefix from the LDFLAGS. -#LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS|sed -e 's/-Wl,//g') - SOURCE := $(shell dpkg-parsechangelog | sed -ne 's,^Source: *\(.*\)$$,\1,p') VERSION_BINNMU := $(shell echo "$(DEB_VERSION)" | sed -ne 's,.*\+b\(.*\)$$,\1,p') -stamp = [ -d $(dir $@) ] || mkdir $(dir $@); touch $@ - include debian/rules.defs setup: debian/control dh_testdir $(MAKE) -f debian/rules.gen setup_$(DEB_HOST_ARCH) - @$(stamp) build: build-arch build-indep build-arch: setup dh_testdir $(MAKE) -f debian/rules.gen build-arch_$(DEB_HOST_ARCH) - @$(stamp) build-indep: setup dh_testdir $(MAKE) -f debian/rules.gen build-indep - @$(stamp) maintainerclean: rm -f debian/control* debian/rules.gen debian/xen-hypervisor-* debian/xen-utils-[0-9]* diff -Nru xen-4.2.2/debian/rules.defs xen-4.3.0/debian/rules.defs --- xen-4.2.2/debian/rules.defs 2013-06-15 12:42:17.000000000 +0000 +++ xen-4.3.0/debian/rules.defs 2013-09-05 11:59:08.000000000 +0000 @@ -1,4 +1,4 @@ -KERNELVERSION := 3.9-1 +KERNELVERSION := 3.10-2 BUILD_DIR = debian/build STAMPS_DIR = debian/stamps TEMPLATES_DIR = debian/templates diff -Nru xen-4.2.2/debian/rules.gen xen-4.3.0/debian/rules.gen --- xen-4.2.2/debian/rules.gen 2013-07-10 22:33:17.000000000 +0000 +++ xen-4.3.0/debian/rules.gen 2013-10-01 12:53:31.000000000 +0000 @@ -1,77 +1,102 @@ .NOTPARALLEL: -binary-arch: binary-arch_amd64 binary-arch_i386 +binary-arch: binary-arch_amd64 binary-arch_i386 binary-arch_armhf binary-arch_amd64: binary-arch_amd64_none binary-arch_amd64_real binary-arch_amd64_none: binary-arch_amd64_none_amd64 binary-arch_amd64_none_real binary-arch_amd64_none_amd64:: binary-arch_amd64_none_amd64_real binary-arch_amd64_none_amd64:: - $(MAKE) -f debian/rules.real binary-arch-flavour ARCH='amd64' FEATURESET='none' FLAVOUR='amd64' VERSION='4.2' XEN_ARCH='x86_64' - $(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='-pxen-system-amd64' ARCH='amd64' FEATURESET='none' FLAVOUR='amd64' VERSION='4.2' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real binary-arch-flavour ARCH='amd64' FEATURESET='none' FLAVOUR='amd64' VERSION='4.3' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='-pxen-system-amd64' ARCH='amd64' FEATURESET='none' FLAVOUR='amd64' VERSION='4.3' XEN_ARCH='x86_64' binary-arch_amd64_none_amd64_real: binary-arch_amd64_none_real: binary-arch_amd64_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ARCH='amd64' VERSION='4.2' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real binary-arch-arch ARCH='amd64' VERSION='4.3' XEN_ARCH='x86_64' binary-arch_i386: binary-arch_i386_none binary-arch_i386_real binary-arch_i386_none: binary-arch_i386_none_amd64 binary-arch_i386_none_i386 binary-arch_i386_none_real binary-arch_i386_none_amd64:: binary-arch_i386_none_amd64_real binary-arch_i386_none_amd64:: - $(MAKE) -f debian/rules.real binary-arch-flavour ARCH='i386' FEATURESET='none' FLAVOUR='amd64' VERSION='4.2' XEN_ARCH='x86_64' - $(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='-pxen-system-amd64' ARCH='i386' FEATURESET='none' FLAVOUR='amd64' VERSION='4.2' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real binary-arch-flavour ARCH='i386' FEATURESET='none' FLAVOUR='amd64' VERSION='4.3' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='-pxen-system-amd64' ARCH='i386' FEATURESET='none' FLAVOUR='amd64' VERSION='4.3' XEN_ARCH='x86_64' binary-arch_i386_none_amd64_real: binary-arch_i386_none_i386:: binary-arch_i386_none_i386_real binary-arch_i386_none_i386:: - $(MAKE) -f debian/rules.real binary-arch-flavour ARCH='i386' FEATURESET='none' FLAVOUR='i386' VERSION='4.2' XEN_ARCH='x86_32' - $(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='-pxen-system-i386' ARCH='i386' FEATURESET='none' FLAVOUR='i386' VERSION='4.2' XEN_ARCH='x86_32' binary-arch_i386_none_i386_real: binary-arch_i386_none_real: binary-arch_i386_real:: - $(MAKE) -f debian/rules.real binary-arch-arch ARCH='i386' VERSION='4.2' XEN_ARCH='x86_32' + $(MAKE) -f debian/rules.real binary-arch-arch ARCH='i386' VERSION='4.3' XEN_ARCH='x86_32' binary-indep:: - $(MAKE) -f debian/rules.real binary-indep VERSION='4.2' -build-arch: build-arch_amd64 build-arch_i386 + $(MAKE) -f debian/rules.real binary-indep VERSION='4.3' +build-arch: build-arch_amd64 build-arch_i386 build-arch_armhf build-arch_amd64: build-arch_amd64_none build-arch_amd64_real build-arch_amd64_none: build-arch_amd64_none_amd64 build-arch_amd64_none_real build-arch_amd64_none_amd64:: build-arch_amd64_none_amd64_real build-arch_amd64_none_amd64:: - $(MAKE) -f debian/rules.real build-arch-flavour ARCH='amd64' FEATURESET='none' FLAVOUR='amd64' VERSION='4.2' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real build-arch-flavour ARCH='amd64' FEATURESET='none' FLAVOUR='amd64' VERSION='4.3' XEN_ARCH='x86_64' build-arch_amd64_none_amd64_real: build-arch_amd64_none_real: build-arch_amd64_real:: - $(MAKE) -f debian/rules.real build-arch-arch ARCH='amd64' VERSION='4.2' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real build-arch-arch ARCH='amd64' VERSION='4.3' XEN_ARCH='x86_64' build-arch_i386: build-arch_i386_none build-arch_i386_real build-arch_i386_none: build-arch_i386_none_amd64 build-arch_i386_none_i386 build-arch_i386_none_real build-arch_i386_none_amd64:: build-arch_i386_none_amd64_real build-arch_i386_none_amd64:: - $(MAKE) -f debian/rules.real build-arch-flavour ARCH='i386' FEATURESET='none' FLAVOUR='amd64' VERSION='4.2' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real build-arch-flavour ARCH='i386' FEATURESET='none' FLAVOUR='amd64' VERSION='4.3' XEN_ARCH='x86_64' build-arch_i386_none_amd64_real: build-arch_i386_none_i386:: build-arch_i386_none_i386_real build-arch_i386_none_i386:: - $(MAKE) -f debian/rules.real build-arch-flavour ARCH='i386' FEATURESET='none' FLAVOUR='i386' VERSION='4.2' XEN_ARCH='x86_32' build-arch_i386_none_i386_real: build-arch_i386_none_real: build-arch_i386_real:: - $(MAKE) -f debian/rules.real build-arch-arch ARCH='i386' VERSION='4.2' XEN_ARCH='x86_32' + $(MAKE) -f debian/rules.real build-arch-arch ARCH='i386' VERSION='4.3' XEN_ARCH='x86_32' build-indep:: - $(MAKE) -f debian/rules.real build-indep VERSION='4.2' -setup: setup_amd64 setup_i386 + $(MAKE) -f debian/rules.real build-indep VERSION='4.3' +setup: setup_amd64 setup_i386 setup_armhf setup_amd64: setup_amd64_none setup_amd64_real setup_amd64_none: setup_amd64_none_amd64 setup_amd64_none_real setup_amd64_none_amd64:: setup_amd64_none_amd64_real setup_amd64_none_amd64:: - $(MAKE) -f debian/rules.real setup-flavour ARCH='amd64' FEATURESET='none' FLAVOUR='amd64' VERSION='4.2' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real setup-flavour ARCH='amd64' FEATURESET='none' FLAVOUR='amd64' VERSION='4.3' XEN_ARCH='x86_64' setup_amd64_none_amd64_real: setup_amd64_none_real: setup_amd64_real:: - $(MAKE) -f debian/rules.real setup-arch ARCH='amd64' VERSION='4.2' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real setup-arch ARCH='amd64' VERSION='4.3' XEN_ARCH='x86_64' setup_i386: setup_i386_none setup_i386_real setup_i386_none: setup_i386_none_amd64 setup_i386_none_i386 setup_i386_none_real setup_i386_none_amd64:: setup_i386_none_amd64_real setup_i386_none_amd64:: - $(MAKE) -f debian/rules.real setup-flavour ARCH='i386' FEATURESET='none' FLAVOUR='amd64' VERSION='4.2' XEN_ARCH='x86_64' + $(MAKE) -f debian/rules.real setup-flavour ARCH='i386' FEATURESET='none' FLAVOUR='amd64' VERSION='4.3' XEN_ARCH='x86_64' setup_i386_none_amd64_real: setup_i386_none_i386:: setup_i386_none_i386_real setup_i386_none_i386:: - $(MAKE) -f debian/rules.real setup-flavour ARCH='i386' FEATURESET='none' FLAVOUR='i386' VERSION='4.2' XEN_ARCH='x86_32' setup_i386_none_i386_real: setup_i386_none_real: setup_i386_real:: - $(MAKE) -f debian/rules.real setup-arch ARCH='i386' VERSION='4.2' XEN_ARCH='x86_32' + $(MAKE) -f debian/rules.real setup-arch ARCH='i386' VERSION='4.3' XEN_ARCH='x86_32' + +binary-arch_armhf: binary-arch_armhf_none binary-arch_armhf_real +binary-arch_armhf_none: binary-arch_armhf_none_armhf binary-arch_armhf_none_real +binary-arch_armhf_none_armhf:: binary-arch_armhf_none_armhf_real +binary-arch_armhf_none_armhf:: + $(MAKE) -f debian/rules.real binary-arch-flavour ARCH='armhf' FEATURESET='none' FLAVOUR='armhf' VERSION='4.3' XEN_ARCH='arm32' + $(MAKE) -f debian/rules.real install-dummy DH_OPTIONS='-pxen-system-armhf' ARCH='armhf' FEATURESET='none' FLAVOUR='armhf' VERSION='4.3' XEN_ARCH='arm32' +binary-arch_armhf_none_armhf_real: +binary-arch_armhf_none_real: +binary-arch_armhf_real:: + $(MAKE) -f debian/rules.real binary-arch-arch ARCH='armhf' VERSION='4.3' XEN_ARCH='arm32' +build-arch_armhf: build-arch_armhf_none build-arch_armhf_real +build-arch_armhf_none: build-arch_armhf_none_armhf build-arch_armhf_none_real +build-arch_armhf_none_armhf:: build-arch_armhf_none_armhf_real +build-arch_armhf_none_armhf:: + $(MAKE) -f debian/rules.real build-arch-flavour ARCH='armhf' FEATURESET='none' FLAVOUR='armhf' VERSION='4.3' XEN_ARCH='arm32' +build-arch_armhf_none_armhf_real: +build-arch_armhf_none_real: +build-arch_armhf_real:: + $(MAKE) -f debian/rules.real build-arch-arch ARCH='armhf' VERSION='4.3' XEN_ARCH='arm32' +setup_armhf: setup_armhf_none setup_armhf_real +setup_armhf_none: setup_armhf_none_armhf setup_armhf_none_real +setup_armhf_none_armhf:: setup_armhf_none_armhf_real +setup_armhf_none_armhf:: + $(MAKE) -f debian/rules.real setup-flavour ARCH='armhf' FEATURESET='none' FLAVOUR='armhf' VERSION='4.3' XEN_ARCH='arm32' +setup_armhf_none_armhf_real: +setup_armhf_none_real: +setup_armhf_real:: + $(MAKE) -f debian/rules.real setup-arch ARCH='armhf' VERSION='4.3' XEN_ARCH='arm32' diff -Nru xen-4.2.2/debian/rules.real xen-4.3.0/debian/rules.real --- xen-4.2.2/debian/rules.real 2013-07-24 16:57:55.000000000 +0000 +++ xen-4.3.0/debian/rules.real 2013-10-09 12:58:34.000000000 +0000 @@ -20,11 +20,12 @@ binary-arch-arch: install-libxenstore_$(ARCH) binary-arch-arch: install-utils_$(ARCH) binary-arch-arch: install-xenstore-utils_$(ARCH) +ifneq ($(ARCH),armhf) binary-arch-arch: install-lib-ocaml-dev_$(ARCH) binary-arch-arch: install-lib-ocaml_$(ARCH) +endif binary-arch-flavour: install-hypervisor_$(ARCH)_$(FLAVOUR) -binary-indep: install-docs binary-indep: install-utils-common build-arch-arch: $(STAMPS_DIR)/build-utils_$(ARCH) @@ -41,7 +42,10 @@ @rm -rf $(DIR) mkdir -p $(DIR) cp -al $(SOURCE_FILES) $(DIR) - cd $(DIR)/tools; ./configure + cd $(DIR)/docs; ./configure --prefix=/usr + cd $(DIR)/tools; \ + WGET=/bin/false \ + ./configure --prefix=/usr @$(stamp) $(STAMPS_DIR)/setup-hypervisor_$(ARCH)_$(FLAVOUR): SOURCE_FILES = $(filter-out debian, $(wildcard *)) @@ -59,7 +63,16 @@ @rm -rf $(DIR) mkdir -p $(DIR) cp -al $(SOURCE_FILES) $(DIR) - cd $(DIR)/tools; CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" ./configure + cd $(DIR)/tools; \ + CFLAGS="$(CFLAGS)" CPPFLAGS="$(CPPFLAGS)" LDFLAGS="$(LDFLAGS)" \ + WGET=/bin/false \ + ./configure \ + --prefix=/usr \ + --includedir=$${prefix}/include \ + --mandir=$${prefix}/share/man \ + --infodir=$${prefix}/share/info \ + --sysconfdir=/etc \ + --localstatedir=/var @$(stamp) $(STAMPS_DIR)/build-docs: DIR=$(BUILD_DIR)/build-docs @@ -94,8 +107,10 @@ @rm -rf $(INSTALL_DIR) mkdir -p $(INSTALL_DIR)/$(OCAML_DLL_DIR) +$(MAKE_CLEAN) -C $(DIR)/tools install DESTDIR=$(CURDIR)/$(INSTALL_DIR) $(CONFIG) +ifneq ($(ARCH),armhf) # hvmloader strip --remove-section=.comment --remove-section=.note $(INSTALL_DIR)/usr/lib/xen*/boot/* +endif touch $@ $(STAMPS_DIR)/install-utils-common: DIR = $(BUILD_DIR)/build-docs @@ -127,18 +142,6 @@ dh_prep +$(MAKE_SELF) install-base -install-docs: SOURCE_DIR = $(BUILD_DIR)/build-docs -install-docs: DIR = $(BUILD_DIR)/install-docs -install-docs: PACKAGE_NAME = xen-docs-$(VERSION) -install-docs: DH_OPTIONS = -p$(PACKAGE_NAME) -install-docs: $(STAMPS_DIR)/build-docs - dh_testdir - dh_testroot - dh_prep - +$(MAKE_CLEAN) -C $(SOURCE_DIR)/docs install DESTDIR=$(CURDIR)/$(DIR) - dh_install --sourcedir=$(DIR) usr/share/doc/xen/\*.pdf usr/share/doc/$(PACKAGE_NAME) - +$(MAKE_SELF) install-base - install-hypervisor_$(ARCH)_$(FLAVOUR): DIR=$(BUILD_DIR)/build-hypervisor_$(ARCH)_$(FLAVOUR) install-hypervisor_$(ARCH)_$(FLAVOUR): PACKAGE_NAME = xen-hypervisor-$(VERSION)-$(FLAVOUR) install-hypervisor_$(ARCH)_$(FLAVOUR): DH_OPTIONS = -p$(PACKAGE_NAME) @@ -152,11 +155,11 @@ install-libxen_$(ARCH): DIR = $(BUILD_DIR)/install-utils_$(ARCH) install-libxen_$(ARCH): DH_OPTIONS = -plibxen-$(VERSION) -install-libxen_$(ARCH): $(STAMPS_DIR)/install-utils_$(ARCH) +install-libxen_$(ARCH): $(STAMPS_DIR)/install-utils_$(ARCH) install-libxenstore_$(ARCH) dh_testdir dh_testroot dh_prep - dh_install --sourcedir=$(DIR) usr/lib/libxen*-$(VERSION).so + dh_install --sourcedir=$(DIR) usr/lib/lib*-$(VERSION).so dh_strip dh_makeshlibs -V dh_shlibdeps diff -Nru xen-4.2.2/debian/scripts/Makefile xen-4.3.0/debian/scripts/Makefile --- xen-4.2.2/debian/scripts/Makefile 2012-04-22 19:21:25.000000000 +0000 +++ xen-4.3.0/debian/scripts/Makefile 2013-09-27 14:53:36.000000000 +0000 @@ -28,6 +28,7 @@ xen-init-list \ xen-toolstack \ xen-version \ + xend-domain-config-path-strip \ $(GLOBAL_TOOLSTACK_WRAPPER) \ $(GLOBAL_UTILS_WRAPPER) diff -Nru xen-4.2.2/debian/scripts/xend-domain-config-path-strip xen-4.3.0/debian/scripts/xend-domain-config-path-strip --- xen-4.2.2/debian/scripts/xend-domain-config-path-strip 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/scripts/xend-domain-config-path-strip 2013-09-27 14:53:55.000000000 +0000 @@ -0,0 +1,30 @@ +#!/bin/sh -e +CONFDIR=/var/lib/xend/domains + +if [ $(id -u) -ne 0 ]; then + echo "Must be called as root" >&2 + exit 1 +fi + +for CFG in $(find $CONFDIR -type f); do + awk ' + /\(loader/ && /\/usr\/lib\/xen-/{ + sub(/\/usr\/lib\/xen-.*\/boot\//, "") + print + next + } + /\(device_model/ && /\/usr\/lib\/xen-/{ + sub(/\/usr\/lib\/xen-.*\/bin\//, "") + print + next + } + { + print + } + ' $CFG >/tmp/xend-domain.$$ + if ! diff -q $CFG /tmp/xend-domain.$$ >/dev/null; then + echo "Updating $(basename $(dirname $CFG))" + cat /tmp/xend-domain.$$ >$CFG + fi + rm /tmp/xend-domain.$$ +done diff -Nru xen-4.2.2/debian/templates/control.hypervisor.in xen-4.3.0/debian/templates/control.hypervisor.in --- xen-4.2.2/debian/templates/control.hypervisor.in 2011-03-09 10:21:20.000000000 +0000 +++ xen-4.3.0/debian/templates/control.hypervisor.in 2013-07-23 12:50:26.000000000 +0000 @@ -2,7 +2,6 @@ Depends: ${misc:Depends} Provides: xen-hypervisor, xen-hypervisor-@version@, xen-hypervisor@localversion@ Recommends: xen-utils-@version@ -Suggests: xen-docs-@version@ Description: Xen Hypervisor on @class@ The hypervisor is the "core" for XEN itself. It gets booted by the boot loader and controls cpu and memory, sharing them between your administrative domain diff -Nru xen-4.2.2/debian/templates/control.main.in xen-4.3.0/debian/templates/control.main.in --- xen-4.2.2/debian/templates/control.main.in 2012-04-22 21:55:35.000000000 +0000 +++ xen-4.3.0/debian/templates/control.main.in 2013-07-23 12:50:26.000000000 +0000 @@ -1,12 +1,3 @@ -Package: xen-docs-@version@ -Depends: ${misc:Depends} -Section: doc -Architecture: all -Description: Documentation for Xen - This package contains all the large documentation files for Xen. This - includes a description interface (both the API, and a nice explanation of - how XEN works). - Package: libxen-@version@ Section: libs Depends: ${shlibs:Depends}, ${misc:Depends} diff -Nru xen-4.2.2/debian/templates/control.source.in xen-4.3.0/debian/templates/control.source.in --- xen-4.2.2/debian/templates/control.source.in 2013-06-15 12:53:09.000000000 +0000 +++ xen-4.3.0/debian/templates/control.source.in 2013-08-11 20:30:59.000000000 +0000 @@ -27,12 +27,6 @@ ocaml-nox, dh-ocaml, ocaml-findlib -Build-Depends-Indep: - graphviz, - ghostscript, - texlive-fonts-recommended, - texlive-font-utils, - texlive-latex-recommended -Standards-Version: 3.9.2 +Standards-Version: 3.9.4 XS-Python-Version: current diff -Nru xen-4.2.2/debian/templates/control.utils.in xen-4.3.0/debian/templates/control.utils.in --- xen-4.2.2/debian/templates/control.utils.in 2012-07-01 18:33:55.000000000 +0000 +++ xen-4.3.0/debian/templates/control.utils.in 2013-07-28 11:58:40.000000000 +0000 @@ -1,8 +1,7 @@ Package: xen-utils-@version@ Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, xen-utils-common (>= ${source:Version}) -Recommends: bridge-utils, libc6-xen [i386], xen-hypervisor-@version@, qemu-keymaps, qemu-utils +Recommends: bridge-utils, libc6-xen [i386], xen-hypervisor-@version@, qemu-system-x86 Provides: xen-utils -Suggests: xen-docs-@version@ Built-Using: ${misc:Built-Using} Description: XEN administrative tools The userspace tools to manage a system virtualized through the XEN virtual diff -Nru xen-4.2.2/debian/xen-hypervisor-4.2-amd64.postinst xen-4.3.0/debian/xen-hypervisor-4.2-amd64.postinst --- xen-4.2.2/debian/xen-hypervisor-4.2-amd64.postinst 2013-07-10 22:33:17.000000000 +0000 +++ xen-4.3.0/debian/xen-hypervisor-4.2-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -#!/bin/bash - -set -e - -case "$1" in - configure) - if command -v update-grub > /dev/null && [ -d /boot/grub ]; then - update-grub || : - fi - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -#DEBHELPER# - -exit 0 diff -Nru xen-4.2.2/debian/xen-hypervisor-4.2-amd64.postrm xen-4.3.0/debian/xen-hypervisor-4.2-amd64.postrm --- xen-4.2.2/debian/xen-hypervisor-4.2-amd64.postrm 2013-07-10 22:33:17.000000000 +0000 +++ xen-4.3.0/debian/xen-hypervisor-4.2-amd64.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -#!/bin/bash - -set -e - -case "$1" in - remove) - if command -v update-grub > /dev/null && [ -d /boot/grub ]; then - update-grub || : - fi - ;; - - purge|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) - ;; - - *) - echo "postrm called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -#DEBHELPER# - -exit 0 diff -Nru xen-4.2.2/debian/xen-hypervisor-4.2-i386.postinst xen-4.3.0/debian/xen-hypervisor-4.2-i386.postinst --- xen-4.2.2/debian/xen-hypervisor-4.2-i386.postinst 2013-07-10 22:33:17.000000000 +0000 +++ xen-4.3.0/debian/xen-hypervisor-4.2-i386.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -#!/bin/bash - -set -e - -case "$1" in - configure) - if command -v update-grub > /dev/null && [ -d /boot/grub ]; then - update-grub || : - fi - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -#DEBHELPER# - -exit 0 diff -Nru xen-4.2.2/debian/xen-hypervisor-4.2-i386.postrm xen-4.3.0/debian/xen-hypervisor-4.2-i386.postrm --- xen-4.2.2/debian/xen-hypervisor-4.2-i386.postrm 2013-07-10 22:33:17.000000000 +0000 +++ xen-4.3.0/debian/xen-hypervisor-4.2-i386.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -#!/bin/bash - -set -e - -case "$1" in - remove) - if command -v update-grub > /dev/null && [ -d /boot/grub ]; then - update-grub || : - fi - ;; - - purge|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) - ;; - - *) - echo "postrm called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -#DEBHELPER# - -exit 0 diff -Nru xen-4.2.2/debian/xen-hypervisor-4.3-amd64.postinst xen-4.3.0/debian/xen-hypervisor-4.3-amd64.postinst --- xen-4.2.2/debian/xen-hypervisor-4.3-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/xen-hypervisor-4.3-amd64.postinst 2013-09-05 12:00:55.000000000 +0000 @@ -0,0 +1,23 @@ +#!/bin/bash + +set -e + +case "$1" in + configure) + if command -v update-grub > /dev/null && [ -d /boot/grub ]; then + update-grub || : + fi + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +#DEBHELPER# + +exit 0 diff -Nru xen-4.2.2/debian/xen-hypervisor-4.3-amd64.postrm xen-4.3.0/debian/xen-hypervisor-4.3-amd64.postrm --- xen-4.2.2/debian/xen-hypervisor-4.3-amd64.postrm 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/xen-hypervisor-4.3-amd64.postrm 2013-09-05 12:00:55.000000000 +0000 @@ -0,0 +1,23 @@ +#!/bin/bash + +set -e + +case "$1" in + remove) + if command -v update-grub > /dev/null && [ -d /boot/grub ]; then + update-grub || : + fi + ;; + + purge|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +#DEBHELPER# + +exit 0 diff -Nru xen-4.2.2/debian/xen-utils-4.2.lintian-overrides xen-4.3.0/debian/xen-utils-4.2.lintian-overrides --- xen-4.2.2/debian/xen-utils-4.2.lintian-overrides 2013-07-10 22:33:17.000000000 +0000 +++ xen-4.3.0/debian/xen-utils-4.2.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -statically-linked-binary usr/lib/xen-4.2/boot/hvmloader diff -Nru xen-4.2.2/debian/xen-utils-4.2.postinst xen-4.3.0/debian/xen-utils-4.2.postinst --- xen-4.2.2/debian/xen-utils-4.2.postinst 2013-07-10 22:33:17.000000000 +0000 +++ xen-4.3.0/debian/xen-utils-4.2.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -#!/bin/sh - -set -e - -case "$1" in - configure) - update-alternatives --remove xen-default /usr/lib/xen-4.2 - if [ -x "/etc/init.d/xen" ]; then - invoke-rc.d xen start || exit $? - fi - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -#DEBHELPER# - -exit 0 diff -Nru xen-4.2.2/debian/xen-utils-4.2.prerm xen-4.3.0/debian/xen-utils-4.2.prerm --- xen-4.2.2/debian/xen-utils-4.2.prerm 2013-07-10 22:33:17.000000000 +0000 +++ xen-4.3.0/debian/xen-utils-4.2.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -#!/bin/bash - -set -e - -case "$1" in - remove|upgrade) - update-alternatives --remove xen-default /usr/lib/xen-4.2 - if [ -x "/etc/init.d/xen" ]; then - invoke-rc.d xen stop || exit $? - fi - ;; - - deconfigure|failed-upgrade) - ;; - - *) - echo "prerm called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -#DEBHELPER# - -exit 0 diff -Nru xen-4.2.2/debian/xen-utils-4.3.lintian-overrides xen-4.3.0/debian/xen-utils-4.3.lintian-overrides --- xen-4.2.2/debian/xen-utils-4.3.lintian-overrides 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/xen-utils-4.3.lintian-overrides 2013-09-05 12:00:55.000000000 +0000 @@ -0,0 +1 @@ +statically-linked-binary usr/lib/xen-4.3/boot/hvmloader diff -Nru xen-4.2.2/debian/xen-utils-4.3.postinst xen-4.3.0/debian/xen-utils-4.3.postinst --- xen-4.2.2/debian/xen-utils-4.3.postinst 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/xen-utils-4.3.postinst 2013-09-05 12:00:55.000000000 +0000 @@ -0,0 +1,24 @@ +#!/bin/sh + +set -e + +case "$1" in + configure) + update-alternatives --remove xen-default /usr/lib/xen-4.3 + if [ -x "/etc/init.d/xen" ]; then + invoke-rc.d xen start || exit $? + fi + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +#DEBHELPER# + +exit 0 diff -Nru xen-4.2.2/debian/xen-utils-4.3.prerm xen-4.3.0/debian/xen-utils-4.3.prerm --- xen-4.2.2/debian/xen-utils-4.3.prerm 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/debian/xen-utils-4.3.prerm 2013-09-05 12:00:55.000000000 +0000 @@ -0,0 +1,24 @@ +#!/bin/bash + +set -e + +case "$1" in + remove|upgrade) + update-alternatives --remove xen-default /usr/lib/xen-4.3 + if [ -x "/etc/init.d/xen" ]; then + invoke-rc.d xen stop || exit $? + fi + ;; + + deconfigure|failed-upgrade) + ;; + + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +#DEBHELPER# + +exit 0 diff -Nru xen-4.2.2/debian/xen-utils-common.postinst xen-4.3.0/debian/xen-utils-common.postinst --- xen-4.2.2/debian/xen-utils-common.postinst 2012-04-14 12:25:29.000000000 +0000 +++ xen-4.3.0/debian/xen-utils-common.postinst 2013-09-27 14:55:29.000000000 +0000 @@ -18,6 +18,11 @@ dpkg-maintscript-helper mv_conffile /etc/init.d/xend /etc/init.d/xen 4.1.2-4~ -- "$@" +# Somehow the private lib path which is versioned ends up in the xend +# domain configs. But the tools will automatically prefix the current +# tools path. +/usr/lib/xen-common/bin/xend-domain-config-path-strip + #DEBHELPER# exit 0 diff -Nru xen-4.2.2/debian/xen-utils-common.xen.init xen-4.3.0/debian/xen-utils-common.xen.init --- xen-4.2.2/debian/xen-utils-common.xen.init 2012-05-22 08:22:34.000000000 +0000 +++ xen-4.3.0/debian/xen-utils-common.xen.init 2013-07-28 11:54:52.000000000 +0000 @@ -61,6 +61,13 @@ return 0 } +env_setup() +{ + [ -d /run/xen ] && return 0 + + mkdir -m 700 /run/xen +} + xend_start() { if [ -z "$XEND" ] || [ "$(basename "$TOOLSTACK")" != xm ]; then @@ -203,6 +210,7 @@ 0) ;; *) log_end_msg 255; exit ;; esac + env_setup xenstored_start case "$?" in 0|1) ;; diff -Nru xen-4.2.2/debian/xen-utils-common.xendomains.init xen-4.3.0/debian/xen-utils-common.xendomains.init --- xen-4.2.2/debian/xen-utils-common.xendomains.init 2012-09-18 11:45:17.000000000 +0000 +++ xen-4.3.0/debian/xen-utils-common.xendomains.init 2013-10-01 09:28:17.000000000 +0000 @@ -17,12 +17,6 @@ . /lib/init/vars.sh . /lib/lsb/init-functions -xen list &> /dev/null -if test $? -ne 0 -then - exit 0; -fi - TOOLSTACK=$(/usr/lib/xen-common/bin/xen-toolstack 2>/dev/null) if [ $? -ne 0 ]; then log_warning_msg "No usable Xen toolstack selected" @@ -32,6 +26,12 @@ exit 0 fi +xen list &> /dev/null +if test $? -ne 0 +then + exit 0; +fi + if ! [ -e /proc/xen/privcmd ]; then exit 0 fi diff -Nru xen-4.2.2/docs/Docs.mk xen-4.3.0/docs/Docs.mk --- xen-4.2.2/docs/Docs.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/Docs.mk 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -PS2PDF := ps2pdf -DVIPS := dvips -LATEX := latex -FIG2DEV := fig2dev -LATEX2HTML := latex2html -DOXYGEN := doxygen -POD2MAN := pod2man -POD2HTML := pod2html -POD2TEXT := pod2text -DOT := dot -NEATO := neato -MARKDOWN := markdown diff -Nru xen-4.2.2/docs/Doxyfile xen-4.3.0/docs/Doxyfile --- xen-4.2.2/docs/Doxyfile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/Doxyfile 1970-01-01 00:00:00.000000000 +0000 @@ -1,1218 +0,0 @@ -# Doxyfile 1.4.2 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = Xen Python Tools - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = api/tools/python - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, -# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, -# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, -# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, -# Swedish, and Ukrainian. - -OUTPUT_LANGUAGE = English - -# This tag can be used to specify the encoding used in the generated output. -# The encoding is not always determined by the language that is chosen, -# but also whether or not the output is meant for Windows or non-Windows users. -# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES -# forces the Windows encoding (this is the default for the Windows binary), -# whereas setting the tag to NO uses a Unix-style encoding (the default for -# all platforms other than Windows). - -USE_WINDOWS_ENCODING = NO - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like the Qt-style comments (thus requiring an -# explicit @brief command for a brief description. - -JAVADOC_AUTOBRIEF = YES - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the DETAILS_AT_TOP tag is set to YES then Doxygen -# will output the detailed description near the top, like JavaDoc. -# If set to NO, the detailed description appears after the member -# documentation. - -DETAILS_AT_TOP = YES - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources -# only. Doxygen will then generate output that is more tailored for Java. -# For instance, namespaces will be presented as packages, qualified scopes -# will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = YES - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = YES - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. - -SHOW_DIRECTORIES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from the -# version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the progam writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = YES - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = ../tools/python/xen/ - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm - -FILE_PATTERNS = *.py *.c - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. - -EXCLUDE_PATTERNS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = "sh ./Doxyfilter ../tools/python" - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = YES - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES (the default) -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = YES - -# If the REFERENCES_RELATION tag is set to YES (the default) -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = YES - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = NO - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be -# generated containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, -# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are -# probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = YES - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4 - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_PREDEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = YES - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will -# generate a call dependency graph for every global function or class method. -# Note that enabling this option will significantly increase the time of a run. -# So in most cases it will be better to enable call graphs for selected -# functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_WIDTH = 1024 - -# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height -# (in pixels) of the graphs generated by dot. If a graph becomes larger than -# this value, doxygen will try to truncate the graph, so that it fits within -# the specified constraint. Beware that most browsers cannot cope with very -# large images. - -MAX_DOT_GRAPH_HEIGHT = 1024 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that a graph may be further truncated if the graph's -# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH -# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), -# the graph is not depth-constrained. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, which results in a white background. -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- - -# The SEARCHENGINE tag specifies whether or not a search engine should be -# used. If set to NO the values of all tags below this one will be ignored. - -SEARCHENGINE = NO diff -Nru xen-4.2.2/docs/Doxyfilter xen-4.3.0/docs/Doxyfilter --- xen-4.2.2/docs/Doxyfilter 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/Doxyfilter 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -#!/bin/sh - -# -# Doxyfilter -# - -dir=$(dirname "$0") - -PYFILTER="$dir/pythfilter.py" - -if [ "${2/.py/}" != "$2" ] -then - python "$PYFILTER" -r "$1" -f "$2" -else - cat "$2" -fi diff -Nru xen-4.2.2/docs/INDEX xen-4.3.0/docs/INDEX --- xen-4.2.2/docs/INDEX 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/INDEX 2013-07-09 10:46:56.000000000 +0000 @@ -12,6 +12,7 @@ misc/tscmode TSC Mode HOWTO misc/vbd-interface Xen Guest Disk (VBD) Interface misc/xenstore Xenstore protocol specification +misc/xenstore-paths Xenstore path documentation misc/xl-disk-configuration XL Disk Configuration misc/xl-network-configuration XL Network Configuration misc/distro_mapping Distro Directory Layouts diff -Nru xen-4.2.2/docs/Makefile xen-4.3.0/docs/Makefile --- xen-4.2.2/docs/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -1,10 +1,8 @@ -#!/usr/bin/make -f - XEN_ROOT=$(CURDIR)/.. include $(XEN_ROOT)/Config.mk -include $(XEN_ROOT)/docs/Docs.mk +-include $(XEN_ROOT)/config/Docs.mk -VERSION = xen-unstable +VERSION := $(shell $(MAKE) -C $(XEN_ROOT)/xen --no-print-directory xenversion) DOC_MAN5SRC := $(wildcard man/*.pod.5) DOC_MAN1SRC := $(wildcard man/*.pod.1) @@ -25,38 +23,34 @@ all: build .PHONY: build -build: html txt man-pages - @if which $(DOT) 1>/dev/null 2>/dev/null ; then \ - $(MAKE) -C xen-api build ; else \ - echo "Graphviz (dot) not installed; skipping xen-api." ; fi - rm -f *.aux *.dvi *.bbl *.blg *.glo *.idx *.ilg *.log *.ind *.toc - -.PHONY: dev-docs -dev-docs: python-dev-docs +build: html txt man-pages figs .PHONY: html html: $(DOC_HTML) html/index.html .PHONY: txt txt: - @if which $(POD2TEXT) 1>/dev/null 2>/dev/null; then \ - $(MAKE) $(DOC_TXT); else \ - echo "pod2text not installed; skipping text outputs."; fi - -.PHONY: python-dev-docs -python-dev-docs: - @mkdir -v -p api/tools/python - @set -e ; if which $(DOXYGEN) 1>/dev/null 2>/dev/null; then \ - echo "Running doxygen to generate Python tools APIs ... "; \ - $(DOXYGEN) Doxyfile; \ - $(MAKE) -C api/tools/python/latex ; else \ - echo "Doxygen not installed; skipping python-dev-docs."; fi +ifdef POD2TEXT + $(MAKE) $(DOC_TXT) +else + @echo "pod2text not installed; skipping text outputs." +endif + +.PHONY: figs +figs: +ifdef FIG2DEV + set -x; $(MAKE) -C figs +else + @echo "fig2dev (transfig) not installed; skipping figs." +endif .PHONY: man-pages man-pages: - @if which $(POD2MAN) 1>/dev/null 2>/dev/null; then \ - $(MAKE) $(DOC_MAN1) $(DOC_MAN5); else \ - echo "pod2man not installed; skipping man-pages."; fi +ifdef POD2MAN + $(MAKE) $(DOC_MAN1) $(DOC_MAN5) +else + @echo "pod2man not installed; skipping man-pages." +endif man1/%.1: man/%.pod.1 Makefile $(INSTALL_DIR) $(@D) @@ -70,61 +64,70 @@ .PHONY: clean clean: - $(MAKE) -C xen-api clean + $(MAKE) -C figs clean rm -rf .word_count *.aux *.dvi *.bbl *.blg *.glo *.idx *~ - rm -rf *.ilg *.log *.ind *.toc *.bak core + rm -rf *.ilg *.log *.ind *.toc *.bak *.tmp core rm -rf html txt - rm -rf api rm -rf man5 rm -rf man1 .PHONY: distclean distclean: clean + rm -rf $(XEN_ROOT)/config/Docs.mk config.log config.status config.cache \ + autom4te.cache .PHONY: install install: all rm -rf $(DESTDIR)$(DOCDIR) $(INSTALL_DIR) $(DESTDIR)$(DOCDIR) - $(MAKE) -C xen-api install - $(INSTALL_DIR) $(DESTDIR)$(MANDIR) - cp -dR man1 $(DESTDIR)$(MANDIR) - cp -dR man5 $(DESTDIR)$(MANDIR) - [ ! -d html ] || cp -dR html $(DESTDIR)$(DOCDIR) + cp -R man1 $(DESTDIR)$(MANDIR) + cp -R man5 $(DESTDIR)$(MANDIR) + [ ! -d html ] || cp -R html $(DESTDIR)$(DOCDIR) -html/index.html: $(DOC_HTML) ./gen-html-index INDEX - perl -w -- ./gen-html-index -i INDEX html $(DOC_HTML) +html/index.html: $(DOC_HTML) $(CURDIR)/gen-html-index INDEX + $(PERL) -w -- $(CURDIR)/gen-html-index -i INDEX html $(DOC_HTML) html/%.html: %.markdown - @$(INSTALL_DIR) $(@D) - @set -e ; if which $(MARKDOWN) 1>/dev/null 2>/dev/null; then \ - echo "Running markdown to generate $*.html ... "; \ + $(INSTALL_DIR) $(@D) +ifdef MARKDOWN + @echo "Running markdown to generate $*.html ... " $(MARKDOWN) $< > $@.tmp ; \ - $(call move-if-changed,$@.tmp,$@) ; else \ - echo "markdown not installed; skipping $*.html."; fi + $(call move-if-changed,$@.tmp,$@) +else + @echo "markdown not installed; skipping $*.html." +endif html/%.txt: %.txt - @$(INSTALL_DIR) $(@D) + $(INSTALL_DIR) $(@D) cp $< $@ html/man/%.1.html: man/%.pod.1 Makefile $(INSTALL_DIR) $(@D) +ifdef POD2HTML $(POD2HTML) --infile=$< --outfile=$@.tmp $(call move-if-changed,$@.tmp,$@) +else + @echo "pod2html not installed; skipping $<." +endif html/man/%.5.html: man/%.pod.5 Makefile $(INSTALL_DIR) $(@D) +ifdef POD2HTML $(POD2HTML) --infile=$< --outfile=$@.tmp $(call move-if-changed,$@.tmp,$@) +else + @echo "pod2html not installed; skipping $<." +endif -html/hypercall/index.html: ./xen-headers +html/hypercall/index.html: $(CURDIR)/xen-headers rm -rf $(@D) - @$(INSTALL_DIR) $(@D) - ./xen-headers -O $(@D) \ + $(INSTALL_DIR) $(@D) + $(PERL) -w $(CURDIR)/xen-headers -O $(@D) \ -T 'arch-x86_64 - Xen public headers' \ - -X arch-ia64 -X arch-x86_32 -X xen-x86_32 -X arch-arm \ - ../xen include/public include/xen/errno.h + -X arch-x86_32 -X xen-x86_32 -X arch-arm \ + $(XEN_ROOT)/xen include/public include/xen/errno.h -include html/hypercall/.deps @@ -140,11 +143,23 @@ txt/man/%.1.txt: man/%.pod.1 Makefile $(INSTALL_DIR) $(@D) +ifdef POD2TEXT $(POD2TEXT) $< $@.tmp $(call move-if-changed,$@.tmp,$@) +else + @echo "pod2text not installed; skipping $<." +endif txt/man/%.5.txt: man/%.pod.5 Makefile $(INSTALL_DIR) $(@D) +ifdef POD2TEXT $(POD2TEXT) $< $@.tmp $(call move-if-changed,$@.tmp,$@) - +else + @echo "pod2text not installed; skipping $<." +endif + +ifeq (,$(findstring clean,$(MAKECMDGOALS))) +$(XEN_ROOT)/config/Docs.mk: + $(error You have to run ./configure before building docs) +endif diff -Nru xen-4.2.2/docs/configure xen-4.3.0/docs/configure --- xen-4.2.2/docs/configure 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/configure 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,3157 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.67 for Xen Hypervisor Documentation 4.3. +# +# Report bugs to . +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: xen-devel@lists.xen.org about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='Xen Hypervisor Documentation' +PACKAGE_TARNAME='xen' +PACKAGE_VERSION='4.3' +PACKAGE_STRING='Xen Hypervisor Documentation 4.3' +PACKAGE_BUGREPORT='xen-devel@lists.xen.org' +PACKAGE_URL='http://www.xen.org/' + +ac_unique_file="misc/xen-command-line.markdown" +ac_subst_vars='LTLIBOBJS +LIBOBJS +PERL +MARKDOWN +POD2TEXT +POD2HTML +POD2MAN +FIG2DEV +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +' + ac_precious_vars='build_alias +host_alias +target_alias +FIG2DEV +POD2MAN +POD2HTML +POD2TEXT +MARKDOWN +PERL' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures Xen Hypervisor Documentation 4.3 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/xen] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of Xen Hypervisor Documentation 4.3:";; + esac + cat <<\_ACEOF + +Some influential environment variables: + FIG2DEV Path to fig2dev tool + POD2MAN Path to pod2man tool + POD2HTML Path to pod2html tool + POD2TEXT Path to pod2text tool + MARKDOWN Path to markdown tool + PERL Path to Perl parser + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +Xen Hypervisor Documentation home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +Xen Hypervisor Documentation configure 4.3 +generated by GNU Autoconf 2.67 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by Xen Hypervisor Documentation $as_me 4.3, which was +generated by GNU Autoconf 2.67. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5 ; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_config_files="$ac_config_files ../config/Docs.mk" + +ac_aux_dir= +for ac_dir in ../ "$srcdir"/../; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../ \"$srcdir\"/../" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +# M4 Macro includes + + + + + + + + + + # Extract the first word of "fig2dev", so it can be a program name with args. +set dummy fig2dev; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_FIG2DEV+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $FIG2DEV in + [\\/]* | ?:[\\/]*) + ac_cv_path_FIG2DEV="$FIG2DEV" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_FIG2DEV="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +FIG2DEV=$ac_cv_path_FIG2DEV +if test -n "$FIG2DEV"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIG2DEV" >&5 +$as_echo "$FIG2DEV" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if ! test -x "$ac_cv_path_FIG2DEV"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: fig2dev is not available so some documentation won't be built" >&5 +$as_echo "$as_me: WARNING: fig2dev is not available so some documentation won't be built" >&2;} + +fi + + + + # Extract the first word of "pod2man", so it can be a program name with args. +set dummy pod2man; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_POD2MAN+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $POD2MAN in + [\\/]* | ?:[\\/]*) + ac_cv_path_POD2MAN="$POD2MAN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_POD2MAN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +POD2MAN=$ac_cv_path_POD2MAN +if test -n "$POD2MAN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POD2MAN" >&5 +$as_echo "$POD2MAN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if ! test -x "$ac_cv_path_POD2MAN"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pod2man is not available so some documentation won't be built" >&5 +$as_echo "$as_me: WARNING: pod2man is not available so some documentation won't be built" >&2;} + +fi + + + + # Extract the first word of "pod2html", so it can be a program name with args. +set dummy pod2html; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_POD2HTML+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $POD2HTML in + [\\/]* | ?:[\\/]*) + ac_cv_path_POD2HTML="$POD2HTML" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_POD2HTML="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +POD2HTML=$ac_cv_path_POD2HTML +if test -n "$POD2HTML"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POD2HTML" >&5 +$as_echo "$POD2HTML" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if ! test -x "$ac_cv_path_POD2HTML"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pod2html is not available so some documentation won't be built" >&5 +$as_echo "$as_me: WARNING: pod2html is not available so some documentation won't be built" >&2;} + +fi + + + + # Extract the first word of "pod2text", so it can be a program name with args. +set dummy pod2text; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_POD2TEXT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $POD2TEXT in + [\\/]* | ?:[\\/]*) + ac_cv_path_POD2TEXT="$POD2TEXT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_POD2TEXT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +POD2TEXT=$ac_cv_path_POD2TEXT +if test -n "$POD2TEXT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POD2TEXT" >&5 +$as_echo "$POD2TEXT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if ! test -x "$ac_cv_path_POD2TEXT"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pod2text is not available so some documentation won't be built" >&5 +$as_echo "$as_me: WARNING: pod2text is not available so some documentation won't be built" >&2;} + +fi + + + + for ac_prog in markdown markdown_py +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_MARKDOWN+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $MARKDOWN in + [\\/]* | ?:[\\/]*) + ac_cv_path_MARKDOWN="$MARKDOWN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_MARKDOWN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +MARKDOWN=$ac_cv_path_MARKDOWN +if test -n "$MARKDOWN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MARKDOWN" >&5 +$as_echo "$MARKDOWN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$MARKDOWN" && break +done + + if ! test -x "$ac_cv_path_MARKDOWN"; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: markdown is not available so some documentation won't be built" >&5 +$as_echo "$as_me: WARNING: markdown is not available so some documentation won't be built" >&2;} + +fi + + + +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PERL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_PERL="$PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no" + ;; +esac +fi +PERL=$ac_cv_path_PERL +if test -n "$PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 +$as_echo "$PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test x"${PERL}" = x"no" +then + as_fn_error $? "Unable to find perl, please install perl" "$LINENO" 5 +fi + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by Xen Hypervisor Documentation $as_me 4.3, which was +generated by GNU Autoconf 2.67. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to . +Xen Hypervisor Documentation home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +Xen Hypervisor Documentation config.status 4.3 +configured by $0, generated by GNU Autoconf 2.67, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "../config/Docs.mk") CONFIG_FILES="$CONFIG_FILES ../config/Docs.mk" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff -Nru xen-4.2.2/docs/configure.ac xen-4.3.0/docs/configure.ac --- xen-4.2.2/docs/configure.ac 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/configure.ac 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,24 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.67]) +AC_INIT([Xen Hypervisor Documentation], m4_esyscmd([../version.sh ../xen/Makefile]), + [xen-devel@lists.xen.org], [xen], [http://www.xen.org/]) +AC_CONFIG_SRCDIR([misc/xen-command-line.markdown]) +AC_CONFIG_FILES([../config/Docs.mk]) +AC_CONFIG_AUX_DIR([../]) + +# M4 Macro includes +m4_include([../m4/docs_tool.m4]) +m4_include([../m4/path_or_fail.m4]) + +AX_DOCS_TOOL_PROG([FIG2DEV], [fig2dev]) +AX_DOCS_TOOL_PROG([POD2MAN], [pod2man]) +AX_DOCS_TOOL_PROG([POD2HTML], [pod2html]) +AX_DOCS_TOOL_PROG([POD2TEXT], [pod2text]) +AX_DOCS_TOOL_PROGS([MARKDOWN], [markdown], [markdown markdown_py]) + +AC_ARG_VAR([PERL], [Path to Perl parser]) +AX_PATH_PROG_OR_FAIL([PERL], [perl]) + +AC_OUTPUT() diff -Nru xen-4.2.2/docs/figs/Makefile xen-4.3.0/docs/figs/Makefile --- xen-4.2.2/docs/figs/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/figs/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,15 @@ + +XEN_ROOT=$(CURDIR)/../.. +include $(XEN_ROOT)/Config.mk +-include $(XEN_ROOT)/config/Docs.mk + +TARGETS= network-bridge.png network-basic.png + +all: $(TARGETS) + +%.png: %.fig + $(FIG2DEV) -L png $< >$@.tmp + mv -f $@.tmp $@ + +clean: + rm -f *~ *.png diff -Nru xen-4.2.2/docs/figs/network-basic.fig xen-4.3.0/docs/figs/network-basic.fig --- xen-4.2.2/docs/figs/network-basic.fig 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/figs/network-basic.fig 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,73 @@ +#FIG 3.2 Produced by xfig version 3.2.5b +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #c0c0c0 +6 4275 5160 6105 6315 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 6090 5175 4290 5175 4290 6075 6090 6075 6090 5175 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 4965 6075 5865 6075 5865 6300 4965 6300 4965 6075 +2 1 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 4 + 6090 5400 5865 5400 5865 5625 6090 5625 +-6 +6 7170 5145 9000 6300 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 7185 5160 8985 5160 8985 6060 7185 6060 7185 5160 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 8310 6060 7410 6060 7410 6285 8310 6285 8310 6060 +2 1 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 4 + 7185 5385 7410 5385 7410 5610 7185 5610 +-6 +6 900 4050 9225 4950 +4 0 0 50 -1 0 16 0.0000 4 195 1335 1170 4860 of the world\001 +4 0 0 50 -1 0 16 0.0000 4 240 1815 1080 4590 interface, to rest\001 +4 0 0 50 -1 0 16 0.0000 4 255 1890 990 4320 Physical network\001 +4 0 0 50 -1 0 16 0.0000 4 255 1485 4050 4860 guest's traffic\001 +4 0 0 50 -1 0 16 0.0000 4 195 1305 4050 4590 backend for\001 +4 0 0 50 -1 0 16 0.0000 4 195 1905 3960 4320 Virtual interface:\001 +4 0 0 50 -1 0 16 0.0000 4 195 1290 7515 4860 Xen drivers\001 +4 0 0 50 -1 0 16 0.0000 4 255 1290 7425 4590 provided by\001 +4 0 0 50 -1 0 16 0.0000 4 195 1905 7155 4320 Virtual interface:\001 +-6 +2 2 0 2 0 29 50 -1 20 0.000 0 0 7 0 0 5 + 660 5160 2460 5160 2460 6060 660 6060 660 5160 +2 2 0 2 0 29 50 -1 20 0.000 0 0 7 0 0 5 + 1785 6060 885 6060 885 6285 1785 6285 1785 6060 +2 1 0 2 0 29 50 -1 20 0.000 0 0 7 0 0 4 + 660 5385 885 5385 900 5625 675 5625 +2 1 0 2 0 29 50 -1 -1 0.000 0 0 7 0 0 3 + 675 6300 675 4950 450 4950 +2 1 0 3 1 29 50 -1 -1 0.000 0 0 7 0 0 2 + 6075 5490 7200 5490 +2 1 0 3 4 29 50 -1 -1 0.000 0 0 -1 0 0 2 + 675 5490 0 5490 +2 1 0 3 4 29 50 -1 -1 0.000 0 0 -1 0 0 2 + 0 2475 0 6525 +2 2 0 1 0 32 100 -1 20 0.000 0 0 7 0 0 5 + 675 2250 9675 2250 9675 6750 675 6750 675 2250 +2 2 0 1 0 7 70 -1 20 0.000 0 0 7 0 0 5 + 6300 2925 900 2925 900 6525 6300 6525 6300 2925 +2 2 0 1 0 7 70 -1 20 0.000 0 0 7 0 0 5 + 6975 6525 9450 6525 9450 2925 6975 2925 6975 6525 +2 2 0 1 7 7 125 -1 20 0.000 0 0 -1 0 0 5 + -225 2025 9900 2025 9900 6975 -225 6975 -225 2025 +4 0 0 50 -1 18 20 0.0000 4 240 735 1170 5490 ethN\001 +4 0 0 50 -1 18 20 0.0000 4 240 945 4500 5490 vifA.B\001 +4 0 0 50 -1 16 20 0.0000 4 315 1410 4500 5850 e.g. vif4.0\001 +4 0 0 50 -1 16 20 0.0000 4 315 1260 1125 5850 e.g. eth0\001 +4 0 0 50 -1 0 16 1.5708 4 255 1395 225 5400 physical link\001 +4 0 0 50 -1 18 20 0.0000 4 240 735 7875 5490 ethB\001 +4 0 0 50 -1 16 20 0.0000 4 315 1260 7650 5850 e.g. eth0\001 +4 0 0 50 -1 0 20 0.0000 4 300 1995 1530 3870 typically dom0\001 +4 0 0 50 -1 0 20 0.0000 4 285 3330 990 3420 Backend (driver) domain\001 +4 0 0 50 -1 0 20 0.0000 4 300 1785 7155 3420 guest domain\001 +4 0 0 50 -1 0 20 0.0000 4 300 1410 7155 3810 domU e.g.\001 +4 0 0 50 -1 16 20 0.0000 4 240 810 8550 3825 dom4\001 +4 0 0 50 -1 0 20 0.0000 4 300 1320 900 2700 Computer\001 +4 0 0 50 -1 0 16 1.5708 4 195 1350 6750 6210 virtual link\001 diff -Nru xen-4.2.2/docs/figs/network-bridge.fig xen-4.3.0/docs/figs/network-bridge.fig --- xen-4.2.2/docs/figs/network-bridge.fig 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/figs/network-bridge.fig 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,125 @@ +#FIG 3.2 Produced by xfig version 3.2.5b +Landscape +Center +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #ffc3ff +0 33 #c0c0c0 +6 -225 3825 2475 8325 +2 2 0 2 0 29 50 -1 20 0.000 0 0 7 0 0 5 + 660 6735 2460 6735 2460 7635 660 7635 660 6735 +2 2 0 2 0 29 50 -1 20 0.000 0 0 7 0 0 5 + 1785 7635 885 7635 885 7860 1785 7860 1785 7635 +2 1 0 2 0 29 50 -1 20 0.000 0 0 7 0 0 4 + 660 6960 885 6960 900 7200 675 7200 +2 1 0 2 0 29 50 -1 -1 0.000 0 0 7 0 0 3 + 675 7875 675 6525 450 6525 +2 1 0 3 4 29 50 -1 -1 0.000 0 0 -1 0 0 2 + 675 7065 0 7065 +2 1 0 3 4 29 50 -1 -1 0.000 0 0 -1 0 0 2 + 0 4050 0 8100 +4 0 0 50 -1 18 20 0.0000 4 240 675 1170 7065 eth0\001 +-6 +6 1936 4020 3149 5850 +2 2 0 2 0 32 50 -1 19 0.000 0 0 7 0 0 5 + 1951 5835 1951 4035 2898 4035 2898 5835 1951 5835 +2 2 0 2 0 32 50 -1 19 0.000 0 0 7 0 0 5 + 2898 4710 2898 5610 3134 5610 3134 4710 2898 4710 +2 1 0 2 0 32 50 -1 19 0.000 0 0 7 0 0 4 + 2187 5835 2187 5610 2424 5610 2424 5835 +-6 +6 4275 5160 6105 6315 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 6090 5175 4290 5175 4290 6075 6090 6075 6090 5175 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 4965 6075 5865 6075 5865 6300 4965 6300 4965 6075 +2 1 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 4 + 6090 5400 5865 5400 5865 5625 6090 5625 +-6 +6 7170 5145 9000 6300 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 7185 5160 8985 5160 8985 6060 7185 6060 7185 5160 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 8310 6060 7410 6060 7410 6285 8310 6285 8310 6060 +2 1 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 4 + 7185 5385 7410 5385 7410 5610 7185 5610 +-6 +6 4275 7815 6105 8970 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 6090 7830 4290 7830 4290 8730 6090 8730 6090 7830 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 4965 8730 5865 8730 5865 8955 4965 8955 4965 8730 +2 1 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 4 + 6090 8055 5865 8055 5865 8280 6090 8280 +-6 +6 7170 7800 9000 8955 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 7185 7815 8985 7815 8985 8715 7185 8715 7185 7815 +2 2 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 5 + 8310 8715 7410 8715 7410 8940 8310 8940 8310 8715 +2 1 0 2 0 11 50 -1 28 0.000 0 0 7 0 0 4 + 7185 8040 7410 8040 7410 8265 7185 8265 +-6 +6 6975 6750 9450 9225 +6 6975 6750 9450 9225 +2 2 0 1 0 7 70 -1 20 0.000 0 0 7 0 0 5 + 6975 9225 9450 9225 9450 6750 6975 6750 6975 9225 +4 0 0 50 -1 0 20 0.0000 4 270 705 7200 7200 guest\001 +4 0 0 50 -1 16 20 0.0000 4 240 810 8100 7200 dom7\001 +4 0 0 50 -1 16 20 0.0000 4 225 2070 7200 7650 198.51.100.32\001 +-6 +-6 +2 1 0 3 1 29 50 -1 -1 0.000 0 0 -1 0 0 2 + 4275 5625 3375 5625 +2 1 0 3 1 29 50 -1 -1 0.000 0 0 -1 0 0 2 + 4275 8325 3375 8325 +2 1 0 3 1 29 50 -1 -1 0.000 0 0 -1 0 0 2 + 3375 7200 2475 7200 +2 1 0 3 1 29 50 -1 -1 0.000 0 0 -1 0 0 2 + 3375 9000 3375 5220 +2 1 0 3 1 29 50 -1 -1 0.000 0 0 -1 0 0 3 + 2250 5850 2250 6300 3375 6300 +2 2 0 1 0 7 70 -1 20 0.000 0 0 7 0 0 5 + 6300 2925 900 2925 900 9450 6300 9450 6300 2925 +2 2 0 1 0 33 100 -1 20 0.000 0 0 7 0 0 5 + 675 2250 9675 2250 9675 9675 675 9675 675 2250 +2 2 0 1 7 7 125 -1 20 0.000 0 0 7 0 0 5 + -225 9900 9900 9900 9900 2025 -225 2025 -225 9900 +2 1 0 3 1 29 50 -1 -1 0.000 0 0 7 0 0 2 + 6075 5490 7200 5490 +2 2 0 1 0 7 70 -1 20 0.000 0 0 7 0 0 5 + 6975 6525 9450 6525 9450 2925 6975 2925 6975 6525 +2 1 0 3 1 29 50 -1 -1 0.000 0 0 7 0 0 2 + 6075 8145 7200 8145 +2 2 0 1 0 7 70 -1 20 0.000 0 0 7 0 0 5 + 6975 6525 9450 6525 9450 5580 6975 5580 6975 6525 +2 2 0 1 0 29 50 -1 -1 0.000 0 0 -1 0 0 5 + 1395 4230 5670 4230 5670 9180 1395 9180 1395 4230 +4 0 0 50 -1 0 16 1.5708 4 255 1395 225 5400 physical link\001 +4 0 0 50 -1 0 20 0.0000 4 300 1320 900 2700 Computer\001 +4 0 0 50 -1 0 20 0.0000 4 285 3330 990 3420 Backend (driver) domain\001 +4 0 0 50 -1 0 16 1.5708 4 195 1515 3690 7560 virtual switch\001 +4 0 0 50 -1 16 20 0.0000 4 225 1890 1440 3960 198.51.100.1\001 +4 0 0 50 -1 18 20 1.5708 4 240 1095 2250 5400 xenbr0\001 +4 0 0 50 -1 0 16 1.5708 4 255 1185 2520 5490 O/S bridge\001 +4 0 0 50 -1 0 16 1.5708 4 195 990 2790 5310 interface\001 +4 0 0 50 -1 0 20 0.0000 4 300 840 4680 4590 bridge\001 +4 0 0 50 -1 0 20 0.0000 4 225 1185 3330 4590 Software\001 +4 0 0 50 -1 0 20 0.0000 4 300 1785 7155 3420 guest domain\001 +4 0 0 50 -1 0 20 0.0000 4 300 1410 7155 3810 domU e.g.\001 +4 0 0 50 -1 16 20 0.0000 4 240 810 8550 3825 dom4\001 +4 0 0 50 -1 18 20 0.0000 4 240 825 4500 5490 vif4.0\001 +4 0 0 50 -1 18 20 0.0000 4 240 675 7875 5490 eth0\001 +4 0 0 50 -1 16 20 0.0000 4 225 2070 7200 4950 198.51.100.27\001 +4 0 0 50 -1 0 16 0.0000 4 255 1080 4500 5850 (netback)\001 +4 0 0 50 -1 0 16 0.0000 4 255 1140 7560 5850 (netfront)\001 +4 0 0 50 -1 0 16 1.5708 4 195 1350 6750 6210 virtual link\001 +4 0 0 50 -1 0 16 0.0000 4 255 1080 4500 8505 (netback)\001 +4 0 0 50 -1 0 16 0.0000 4 255 1140 7560 8505 (netfront)\001 +4 0 0 50 -1 0 16 1.5708 4 195 1350 6750 8865 virtual link\001 +4 0 0 50 -1 18 20 0.0000 4 240 825 4500 8190 vif7.0\001 +4 0 0 50 -1 18 20 0.0000 4 240 675 7830 8190 eth0\001 diff -Nru xen-4.2.2/docs/html.sty xen-4.3.0/docs/html.sty --- xen-4.2.2/docs/html.sty 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/html.sty 1970-01-01 00:00:00.000000000 +0000 @@ -1,887 +0,0 @@ -% -% $Id: html.sty,v 1.23 1998/02/26 10:32:24 latex2html Exp $ -% LaTeX2HTML Version 96.2 : html.sty -% -% This file contains definitions of LaTeX commands which are -% processed in a special way by the translator. -% For example, there are commands for embedding external hypertext links, -% for cross-references between documents or for including raw HTML. -% This file includes the comments.sty file v2.0 by Victor Eijkhout -% In most cases these commands do nothing when processed by LaTeX. -% -% Place this file in a directory accessible to LaTeX (i.e., somewhere -% in the TEXINPUTS path.) -% -% NOTE: This file works with LaTeX 2.09 or (the newer) LaTeX2e. -% If you only have LaTeX 2.09, some complex LaTeX2HTML features -% like support for segmented documents are not available. - -% Changes: -% See the change log at end of file. - - -% Exit if the style file is already loaded -% (suggested by Lee Shombert -\ifx \htmlstyloaded\relax \endinput\else\let\htmlstyloaded\relax\fi -\makeatletter - -\providecommand{\latextohtml}{\LaTeX2\texttt{HTML}} - - -%%% LINKS TO EXTERNAL DOCUMENTS -% -% This can be used to provide links to arbitrary documents. -% The first argumment should be the text that is going to be -% highlighted and the second argument a URL. -% The hyperlink will appear as a hyperlink in the HTML -% document and as a footnote in the dvi or ps files. -% -\newcommand{\htmladdnormallinkfoot}[2]{#1\footnote{#2}} - - -% This is an alternative definition of the command above which -% will ignore the URL in the dvi or ps files. -\newcommand{\htmladdnormallink}[2]{#1} - - -% This command takes as argument a URL pointing to an image. -% The image will be embedded in the HTML document but will -% be ignored in the dvi and ps files. -% -\newcommand{\htmladdimg}[1]{} - - -%%% CROSS-REFERENCES BETWEEN (LOCAL OR REMOTE) DOCUMENTS -% -% This can be used to refer to symbolic labels in other Latex -% documents that have already been processed by the translator. -% The arguments should be: -% #1 : the URL to the directory containing the external document -% #2 : the path to the labels.pl file of the external document. -% If the external document lives on a remote machine then labels.pl -% must be copied on the local machine. -% -%e.g. \externallabels{http://cbl.leeds.ac.uk/nikos/WWW/doc/tex2html/latex2html} -% {/usr/cblelca/nikos/tmp/labels.pl} -% The arguments are ignored in the dvi and ps files. -% -\newcommand{\externallabels}[2]{} - - -% This complements the \externallabels command above. The argument -% should be a label defined in another latex document and will be -% ignored in the dvi and ps files. -% -\newcommand{\externalref}[1]{} - - -% Suggested by Uffe Engberg (http://www.brics.dk/~engberg/) -% This allows the same effect for citations in external bibliographies. -% An \externallabels command must be given, locating a labels.pl file -% which defines the location and keys used in the external .html file. -% -\newcommand{\externalcite}{\nocite} - - -%%% HTMLRULE -% This command adds a horizontal rule and is valid even within -% a figure caption. -% Here we introduce a stub for compatibility. -\newcommand{\htmlrule}{\protect\HTMLrule} -\newcommand{\HTMLrule}{\@ifstar\htmlrulestar\htmlrulestar} -\newcommand{\htmlrulestar}[1]{} - -% This command adds information within the ... tag -% -\newcommand{\bodytext}[1]{} -\newcommand{\htmlbody}{} - - -%%% HYPERREF -% Suggested by Eric M. Carol -% Similar to \ref but accepts conditional text. -% The first argument is HTML text which will become ``hyperized'' -% (underlined). -% The second and third arguments are text which will appear only in the paper -% version (DVI file), enclosing the fourth argument which is a reference to a label. -% -%e.g. \hyperref{using the tracer}{using the tracer (see Section}{)}{trace} -% where there is a corresponding \label{trace} -% -\newcommand{\hyperref}{\hyperrefx[ref]} -\def\hyperrefx[#1]{{\def\next{#1}% - \def\tmp{ref}\ifx\next\tmp\aftergroup\hyperrefref - \else\def\tmp{pageref}\ifx\next\tmp\aftergroup\hyperpageref - \else\def\tmp{page}\ifx\next\tmp\aftergroup\hyperpageref - \else\def\tmp{noref}\ifx\next\tmp\aftergroup\hypernoref - \else\def\tmp{no}\ifx\next\tmp\aftergroup\hypernoref - \else\typeout{*** unknown option \next\space to hyperref ***}% - \fi\fi\fi\fi\fi}} -\newcommand{\hyperrefref}[4]{#2\ref{#4}#3} -\newcommand{\hyperpageref}[4]{#2\pageref{#4}#3} -\newcommand{\hypernoref}[3]{#2} - - -%%% HYPERCITE --- added by RRM -% Suggested by Stephen Simpson -% effects the same ideas as in \hyperref, but for citations. -% It does not allow an optional argument to the \cite, in LaTeX. -% -% \hypercite{}{}{}{} -% -% uses the pre/post-texts in LaTeX, with a \cite{} -% -% \hypercite[ext]{}{}{} -% -% uses the pre/post-texts in LaTeX, with a \nocite{} -% the actual reference comes from an \externallabels file. -% -\newcommand{\hypercite}{\hypercitex[int]} -\def\hypercitex[#1]{{\def\next{#1}% - \def\tmp{int}\ifx\next\tmp\aftergroup\hyperciteint - \else\def\tmp{cite}\ifx\next\tmp\aftergroup\hyperciteint - \else\def\tmp{ext}\ifx\next\tmp\aftergroup\hyperciteext - \else\def\tmp{nocite}\ifx\next\tmp\aftergroup\hyperciteext - \else\def\tmp{no}\ifx\next\tmp\aftergroup\hyperciteext - \else\typeout{*** unknown option \next\space to hypercite ***}% - \fi\fi\fi\fi\fi}} -\newcommand{\hyperciteint}[4]{#2{\def\tmp{#3}\def\emptyopt{}% - \ifx\tmp\emptyopt\cite{#4}\else\cite[#3]{#4}\fi}} -\newcommand{\hyperciteext}[3]{#2\nocite{#3}} - - - -%%% HTMLREF -% Reference in HTML version only. -% Mix between \htmladdnormallink and \hyperref. -% First arg is text for in both versions, second is label for use in HTML -% version. -\newcommand{\htmlref}[2]{#1} - -%%% HTMLCITE -% Reference in HTML version only. -% Mix between \htmladdnormallink and \hypercite. -% First arg is text for in both versions, second is citation for use in HTML -% version. -\newcommand{\htmlcite}[2]{#1} - - -%%% HTMLIMAGE -% This command can be used inside any environment that is converted -% into an inlined image (eg a "figure" environment) in order to change -% the way the image will be translated. The argument of \htmlimage -% is really a string of options separated by commas ie -% [scale=],[external],[thumbnail= -% The scale option allows control over the size of the final image. -% The ``external'' option will cause the image not to be inlined -% (images are inlined by default). External images will be accessible -% via a hypertext link. -% The ``thumbnail'' option will cause a small inlined image to be -% placed in the caption. The size of the thumbnail depends on the -% reduction factor. The use of the ``thumbnail'' option implies -% the ``external'' option. -% -% Example: -% \htmlimage{scale=1.5,external,thumbnail=0.2} -% will cause a small thumbnail image 1/5th of the original size to be -% placed in the final document, pointing to an external image 1.5 -% times bigger than the original. -% -\newcommand{\htmlimage}[1]{} - - -% \htmlborder causes a border to be placed around an image or table -% when the image is placed within a cell. -\newcommand{\htmlborder}[1]{} - -% Put \begin{makeimage}, \end{makeimage} around LaTeX to ensure its -% translation into an image. -% This shields sensitive text from being translated. -\newenvironment{makeimage}{}{} - - -% A dummy environment that can be useful to alter the order -% in which commands are processed, in LaTeX2HTML -\newenvironment{tex2html_deferred}{}{} - - -%%% HTMLADDTONAVIGATION -% This command appends its argument to the buttons in the navigation -% panel. It is ignored by LaTeX. -% -% Example: -% \htmladdtonavigation{\htmladdnormallink -% {\htmladdimg{http://server/path/to/gif}} -% {http://server/path}} -\newcommand{\htmladdtonavigation}[1]{} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Comment.sty version 2.0, 19 June 1992 -% selectively in/exclude pieces of text: the user can define new -% comment versions, and each is controlled separately. -% This style can be used with plain TeX or LaTeX, and probably -% most other packages too. -% -% Examples of use in LaTeX and TeX follow \endinput -% -% Author -% Victor Eijkhout -% Department of Computer Science -% University Tennessee at Knoxville -% 104 Ayres Hall -% Knoxville, TN 37996 -% USA -% -% eijkhout@cs.utk.edu -% -% Usage: all text included in between -% \comment ... \endcomment -% or \begin{comment} ... \end{comment} -% is discarded. The closing command should appear on a line -% of its own. No starting spaces, nothing after it. -% This environment should work with arbitrary amounts -% of comment. -% -% Other 'comment' environments are defined by -% and are selected/deselected with -% \includecomment{versiona} -% \excludecoment{versionb} -% -% These environments are used as -% \versiona ... \endversiona -% or \begin{versiona} ... \end{versiona} -% with the closing command again on a line of its own. -% -% Basic approach: -% to comment something out, scoop up every line in verbatim mode -% as macro argument, then throw it away. -% For inclusions, both the opening and closing comands -% are defined as noop -% -% Changed \next to \html@next to prevent clashes with other sty files -% (mike@emn.fr) -% Changed \html@next to \htmlnext so the \makeatletter and -% \makeatother commands could be removed (they were causing other -% style files - changebar.sty - to crash) (nikos@cbl.leeds.ac.uk) -% Changed \htmlnext back to \html@next... - -\def\makeinnocent#1{\catcode`#1=12 } -\def\csarg#1#2{\expandafter#1\csname#2\endcsname} - -\def\ThrowAwayComment#1{\begingroup - \def\CurrentComment{#1}% - \let\do\makeinnocent \dospecials - \makeinnocent\^^L% and whatever other special cases - \endlinechar`\^^M \catcode`\^^M=12 \xComment} -{\catcode`\^^M=12 \endlinechar=-1 % - \gdef\xComment#1^^M{\def\test{#1}\edef\test{\meaning\test} - \csarg\ifx{PlainEnd\CurrentComment Test}\test - \let\html@next\endgroup - \else \csarg\ifx{LaLaEnd\CurrentComment Test}\test - \edef\html@next{\endgroup\noexpand\end{\CurrentComment}} - \else \csarg\ifx{LaInnEnd\CurrentComment Test}\test - \edef\html@next{\endgroup\noexpand\end{\CurrentComment}} - \else \let\html@next\xComment - \fi \fi \fi \html@next} -} - -\def\includecomment - #1{\expandafter\def\csname#1\endcsname{}% - \expandafter\def\csname end#1\endcsname{}} -\def\excludecomment - #1{\expandafter\def\csname#1\endcsname{\ThrowAwayComment{#1}}% - {\escapechar=-1\relax - \edef\tmp{\string\\end#1}% - \csarg\xdef{PlainEnd#1Test}{\meaning\tmp}% - \edef\tmp{\string\\end\string\{#1\string\}}% - \csarg\xdef{LaLaEnd#1Test}{\meaning\tmp}% - \edef\tmp{\string\\end \string\{#1\string\}}% - \csarg\xdef{LaInnEnd#1Test}{\meaning\tmp}% - }} - -\excludecomment{comment} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% end Comment.sty -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% -% Alternative code by Robin Fairbairns, 22 September 1997 -% -\newcommand\@gobbleenv{\let\reserved@a\@currenvir\@gobble@nv} -\long\def\@gobble@nv#1\end#2{\def\reserved@b{#2}% - \ifx\reserved@a\reserved@b - \edef\reserved@a{\noexpand\end{\reserved@a}}% - \expandafter\reserved@a - \else - \expandafter\@gobble@nv - \fi} - -\renewcommand{\excludecomment}[1]{% - \csname newenvironment\endcsname{#1}{\@gobbleenv}{}} - -%%% RAW HTML -% -% Enclose raw HTML between a \begin{rawhtml} and \end{rawhtml}. -% The html environment ignores its body -% -\excludecomment{rawhtml} - - -%%% HTML ONLY -% -% Enclose LaTeX constructs which will only appear in the -% HTML output and will be ignored by LaTeX with -% \begin{htmlonly} and \end{htmlonly} -% -\excludecomment{htmlonly} -% Shorter version -\newcommand{\html}[1]{} - -% for images.tex only -\excludecomment{imagesonly} - -%%% LaTeX ONLY -% Enclose LaTeX constructs which will only appear in the -% DVI output and will be ignored by latex2html with -%\begin{latexonly} and \end{latexonly} -% -\newenvironment{latexonly}{}{} -% Shorter version -\newcommand{\latex}[1]{#1} - - -%%% LaTeX or HTML -% Combination of \latex and \html. -% Say \latexhtml{this should be latex text}{this html text} -% -%\newcommand{\latexhtml}[2]{#1} -\long\def\latexhtml#1#2{#1} - - -%%% tracing the HTML conversions -% This alters the tracing-level within the processing -% performed by latex2html by adjusting $VERBOSITY -% (see latex2html.config for the appropriate values) -% -\newcommand{\htmltracing}[1]{} -\newcommand{\htmltracenv}[1]{} - - -%%% \strikeout for HTML only -% uses ... tags on the argument -% LaTeX just gobbles it up. -\newcommand{\strikeout}[1]{} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% JCL - stop input here if LaTeX2e is not present -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\ifx\if@compatibility\undefined - %LaTeX209 - \makeatother\relax\expandafter\endinput -\fi -\if@compatibility - %LaTeX2e in LaTeX209 compatibility mode - \makeatother\relax\expandafter\endinput -\fi - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Start providing LaTeX2e extension: -% This is currently: -% - additional optional argument for \htmladdimg -% - support for segmented documents -% - -\ProvidesPackage{html} - [1996/12/22 v1.1 hypertext commands for latex2html (nd, hws, rrm)] -%%%%MG - -% This command takes as argument a URL pointing to an image. -% The image will be embedded in the HTML document but will -% be ignored in the dvi and ps files. The optional argument -% denotes additional HTML tags. -% -% Example: \htmladdimg[ALT="portrait" ALIGN=CENTER]{portrait.gif} -% -\renewcommand{\htmladdimg}[2][]{} - -%%% HTMLRULE for LaTeX2e -% This command adds a horizontal rule and is valid even within -% a figure caption. -% -% This command is best used with LaTeX2e and HTML 3.2 support. -% It is like \hrule, but allows for options via key--value pairs -% as follows: \htmlrule[key1=value1, key2=value2, ...] . -% Use \htmlrule* to suppress the
tag. -% Eg. \htmlrule[left, 15, 5pt, "none", NOSHADE] produces -%

. -% Renew the necessary part. -\renewcommand{\htmlrulestar}[1][all]{} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% renew some definitions to allow optional arguments -% -% The description of the options is missing, as yet. -% -\renewcommand{\latextohtml}{\textup{\LaTeX2\texttt{HTML}}} -\renewcommand{\htmladdnormallinkfoot}[3][]{#2\footnote{#3}} -\renewcommand{\htmladdnormallink}[3][]{#2} -\renewcommand{\htmlbody}[1][]{} -\renewcommand{\hyperref}[1][ref]{\hyperrefx[#1]} -\renewcommand{\hypercite}[1][int]{\hypercitex[#1]} -\renewcommand{\htmlref}[3][]{#2} -\renewcommand{\htmlcite}[1]{#1\htmlcitex} -\newcommand{\htmlcitex}[2][]{{\def\tmp{#1}\ifx\tmp\@empty\else~[#1]\fi}} -\renewcommand{\htmlimage}[2][]{} -\renewcommand{\htmlborder}[2][]{} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% HTML HTMLset HTMLsetenv -% -% These commands do nothing in LaTeX, but can be used to place -% HTML tags or set Perl variables during the LaTeX2HTML processing; -% They are intended for expert use only. - -\newcommand{\HTMLcode}[2][]{} -\ifx\undefined\HTML\newcommand{\HTML}[2][]{}\else -\typeout{*** Warning: \string\HTML\space had an incompatible definition ***}% -\typeout{*** instead use \string\HTMLcode\space for raw HTML code ***}% -\fi -\newcommand{\HTMLset}[3][]{} -\newcommand{\HTMLsetenv}[3][]{} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% The following commands pertain to document segmentation, and -% were added by Herbert Swan (with help from -% Michel Goossens ): -% -% -% This command inputs internal latex2html tables so that large -% documents can to partitioned into smaller (more manageable) -% segments. -% -\newcommand{\internal}[2][internals]{} - -% -% Define a dummy stub \htmlhead{}. This command causes latex2html -% to define the title of the start of a new segment. It is not -% normally placed in the user's document. Rather, it is passed to -% latex2html via a .ptr file written by \segment. -% -\newcommand{\htmlhead}[3][]{} - -% In the LaTeX2HTML version this will eliminate the title line -% generated by a \segment command, but retains the title string -% for use in other places. -% -\newcommand{\htmlnohead}{} - - -% In the LaTeX2HTML version this put a URL into a tag -% within the ... portion of a document. -% -\newcommand{\htmlbase}[1]{} -% - -% -% The dummy command \endpreamble is needed by latex2html to -% mark the end of the preamble in document segments that do -% not contain a \begin{document} -% -\newcommand{\startdocument}{} - - -% \tableofchildlinks, \htmlinfo -% by Ross Moore --- extensions dated 27 September 1997 -% -% These do nothing in LaTeX but for LaTeX2HTML they mark -% where the table of child-links and info-page should be placed, -% when the user wants other than the default. -% \tableofchildlinks % put mini-TOC at this location -% \tableofchildlinks[off] % not on current page -% \tableofchildlinks[none] % not on current and subsequent pages -% \tableofchildlinks[on] % selectively on current page -% \tableofchildlinks[all] % on current and all subsequent pages -% \htmlinfo % put info-page at this location -% \htmlinfo[off] % no info-page in current document -% \htmlinfo[none] % no info-page in current document -% *-versions omit the preceding
tag. -% -\newcommand{\tableofchildlinks}{% - \@ifstar\tableofchildlinksstar\tableofchildlinksstar} -\newcommand{\tableofchildlinksstar}[1][]{} - -\newcommand{\htmlinfo}{\@ifstar\htmlinfostar\htmlinfostar} -\newcommand{\htmlinfostar}[1][]{} - - -% This redefines \begin to allow for an optional argument -% which is used by LaTeX2HTML to specify `style-sheet' information - -\let\realLaTeX@begin=\begin -\renewcommand{\begin}[1][]{\realLaTeX@begin} - - -% -% Allocate a new set of section counters, which will get incremented -% for "*" forms of sectioning commands, and for a few miscellaneous -% commands. -% - -\newcounter{lpart} -\newcounter{lchapter}[part] -\@ifundefined{c@chapter}% - {\let\Hchapter\relax \newcounter{lsection}[part]}% - {\let\Hchapter=\chapter \newcounter{lsection}[chapter]} -\newcounter{lsubsection}[section] -\newcounter{lsubsubsection}[subsection] -\newcounter{lparagraph}[subsubsection] -\newcounter{lsubparagraph}[paragraph] -\newcounter{lequation} - -% -% Redefine "*" forms of sectioning commands to increment their -% respective counters. -% -\let\Hpart=\part -%\let\Hchapter=\chapter -\let\Hsection=\section -\let\Hsubsection=\subsection -\let\Hsubsubsection=\subsubsection -\let\Hparagraph=\paragraph -\let\Hsubparagraph=\subparagraph -\let\Hsubsubparagraph=\subsubparagraph - -\ifx\c@subparagraph\undefined - \newcounter{lsubsubparagraph}[lsubparagraph] -\else - \newcounter{lsubsubparagraph}[subparagraph] -\fi - -% -% The following definitions are specific to LaTeX2e: -% (They must be commented out for LaTeX 2.09) -% -\renewcommand{\part}{\@ifstar{\stepcounter{lpart}% - \bgroup\def\tmp{*}\H@part}{\bgroup\def\tmp{}\H@part}} -\newcommand{\H@part}[1][]{\def\tmp@a{#1}\check@align - \expandafter\egroup\expandafter\Hpart\tmp} - -\ifx\Hchapter\relax\else - \def\chapter{\resetsections \@ifstar{\stepcounter{lchapter}% - \bgroup\def\tmp{*}\H@chapter}{\bgroup\def\tmp{}\H@chapter}}\fi -\newcommand{\H@chapter}[1][]{\def\tmp@a{#1}\check@align - \expandafter\egroup\expandafter\Hchapter\tmp} - -\renewcommand{\section}{\resetsubsections - \@ifstar{\stepcounter{lsection}\bgroup\def\tmp{*}% - \H@section}{\bgroup\def\tmp{}\H@section}} -\newcommand{\H@section}[1][]{\def\tmp@a{#1}\check@align - \expandafter\egroup\expandafter\Hsection\tmp} - -\renewcommand{\subsection}{\resetsubsubsections - \@ifstar{\stepcounter{lsubsection}\bgroup\def\tmp{*}% - \H@subsection}{\bgroup\def\tmp{}\H@subsection}} -\newcommand{\H@subsection}[1][]{\def\tmp@a{#1}\check@align - \expandafter\egroup\expandafter\Hsubsection\tmp} - -\renewcommand{\subsubsection}{\resetparagraphs - \@ifstar{\stepcounter{lsubsubsection}\bgroup\def\tmp{*}% - \H@subsubsection}{\bgroup\def\tmp{}\H@subsubsection}} -\newcommand{\H@subsubsection}[1][]{\def\tmp@a{#1}\check@align - \expandafter\egroup\expandafter\Hsubsubsection\tmp} - -\renewcommand{\paragraph}{\resetsubparagraphs - \@ifstar{\stepcounter{lparagraph}\bgroup\def\tmp{*}% - \H@paragraph}{\bgroup\def\tmp{}\H@paragraph}} -\newcommand\H@paragraph[1][]{\def\tmp@a{#1}\check@align - \expandafter\egroup\expandafter\Hparagraph\tmp} - -\renewcommand{\subparagraph}{\resetsubsubparagraphs - \@ifstar{\stepcounter{lsubparagraph}\bgroup\def\tmp{*}% - \H@subparagraph}{\bgroup\def\tmp{}\H@subparagraph}} -\newcommand\H@subparagraph[1][]{\def\tmp@a{#1}\check@align - \expandafter\egroup\expandafter\Hsubparagraph\tmp} - -\ifx\Hsubsubparagraph\relax\else\@ifundefined{subsubparagraph}{}{% -\def\subsubparagraph{% - \@ifstar{\stepcounter{lsubsubparagraph}\bgroup\def\tmp{*}% - \H@subsubparagraph}{\bgroup\def\tmp{}\H@subsubparagraph}}}\fi -\newcommand\H@subsubparagraph[1][]{\def\tmp@a{#1}\check@align - \expandafter\egroup\expandafter\Hsubsubparagraph\tmp} - -\def\check@align{\def\empty{}\ifx\tmp@a\empty - \else\def\tmp@b{center}\ifx\tmp@a\tmp@b\let\tmp@a\empty - \else\def\tmp@b{left}\ifx\tmp@a\tmp@b\let\tmp@a\empty - \else\def\tmp@b{right}\ifx\tmp@a\tmp@b\let\tmp@a\empty - \else\expandafter\def\expandafter\tmp@a\expandafter{\expandafter[\tmp@a]}% - \fi\fi\fi \def\empty{}\ifx\tmp\empty\let\tmp=\tmp@a \else - \expandafter\def\expandafter\tmp\expandafter{\expandafter*\tmp@a}% - \fi\fi} -% -\def\resetsections{\setcounter{section}{0}\setcounter{lsection}{0}% - \reset@dependents{section}\resetsubsections } -\def\resetsubsections{\setcounter{subsection}{0}\setcounter{lsubsection}{0}% - \reset@dependents{subsection}\resetsubsubsections } -\def\resetsubsubsections{\setcounter{subsubsection}{0}\setcounter{lsubsubsection}{0}% - \reset@dependents{subsubsection}\resetparagraphs } -% -\def\resetparagraphs{\setcounter{lparagraph}{0}\setcounter{lparagraph}{0}% - \reset@dependents{paragraph}\resetsubparagraphs } -\def\resetsubparagraphs{\ifx\c@subparagraph\undefined\else - \setcounter{subparagraph}{0}\fi \setcounter{lsubparagraph}{0}% - \reset@dependents{subparagraph}\resetsubsubparagraphs } -\def\resetsubsubparagraphs{\ifx\c@subsubparagraph\undefined\else - \setcounter{subsubparagraph}{0}\fi \setcounter{lsubsubparagraph}{0}} -% -\def\reset@dependents#1{\begingroup\let \@elt \@stpelt - \csname cl@#1\endcsname\endgroup} -% -% -% Define a helper macro to dump a single \secounter command to a file. -% -\newcommand{\DumpPtr}[2]{% -\count255=\arabic{#1}\def\dummy{dummy}\def\tmp{#2}% -\ifx\tmp\dummy\else\advance\count255 by \arabic{#2}\fi -\immediate\write\ptrfile{% -\noexpand\setcounter{#1}{\number\count255}}} - -% -% Define a helper macro to dump all counters to the file. -% The value for each counter will be the sum of the l-counter -% actual LaTeX section counter. -% Also dump an \htmlhead{section-command}{section title} command -% to the file. -% -\newwrite\ptrfile -\def\DumpCounters#1#2#3#4{% -\begingroup\let\protect=\noexpand -\immediate\openout\ptrfile = #1.ptr -\DumpPtr{part}{lpart}% -\ifx\Hchapter\relax\else\DumpPtr{chapter}{lchapter}\fi -\DumpPtr{section}{lsection}% -\DumpPtr{subsection}{lsubsection}% -\DumpPtr{subsubsection}{lsubsubsection}% -\DumpPtr{paragraph}{lparagraph}% -\DumpPtr{subparagraph}{lsubparagraph}% -\DumpPtr{equation}{lequation}% -\DumpPtr{footnote}{dummy}% -\def\tmp{#4}\ifx\tmp\@empty -\immediate\write\ptrfile{\noexpand\htmlhead{#2}{#3}}\else -\immediate\write\ptrfile{\noexpand\htmlhead[#4]{#2}{#3}}\fi -\dumpcitestatus \dumpcurrentcolor -\immediate\closeout\ptrfile -\endgroup } - - -%% interface to natbib.sty - -\def\dumpcitestatus{} -\def\loadcitestatus{\def\dumpcitestatus{% - \ifciteindex\immediate\write\ptrfile{\noexpand\citeindextrue}% - \else\immediate\write\ptrfile{\noexpand\citeindexfalse}\fi }% -} -\@ifpackageloaded{natbib}{\loadcitestatus}{% - \AtBeginDocument{\@ifpackageloaded{natbib}{\loadcitestatus}{}}} - - -%% interface to color.sty - -\def\dumpcurrentcolor{} -\def\loadsegmentcolors{% - \let\real@pagecolor=\pagecolor - \let\pagecolor\segmentpagecolor - \let\segmentcolor\color - \ifx\current@page@color\undefined \def\current@page@color{{}}\fi - \def\dumpcurrentcolor{\bgroup\def\@empty@{{}}% - \expandafter\def\expandafter\tmp\space####1@{\def\thiscol{####1}}% - \ifx\current@color\@empty@\def\thiscol{}\else - \expandafter\tmp\current@color @\fi - \immediate\write\ptrfile{\noexpand\segmentcolor{\thiscol}}% - \ifx\current@page@color\@empty@\def\thiscol{}\else - \expandafter\tmp\current@page@color @\fi - \immediate\write\ptrfile{\noexpand\segmentpagecolor{\thiscol}}% - \egroup}% - \global\let\loadsegmentcolors=\relax -} - -% These macros are needed within images.tex since this inputs -% the .ptr files for a segment, so that counters are -% colors are synchronised. -% -\newcommand{\segmentpagecolor}[1][]{% - \@ifpackageloaded{color}{\loadsegmentcolors\bgroup - \def\tmp{#1}\ifx\@empty\tmp\def\next{[]}\else\def\next{[#1]}\fi - \expandafter\segmentpagecolor@\next}% - {\@gobble}} -\def\segmentpagecolor@[#1]#2{\def\tmp{#1}\def\tmpB{#2}% - \ifx\tmpB\@empty\let\next=\egroup - \else - \let\realendgroup=\endgroup - \def\endgroup{\edef\next{\noexpand\realendgroup - \def\noexpand\current@page@color{\current@color}}\next}% - \ifx\tmp\@empty\real@pagecolor{#2}\def\model{}% - \else\real@pagecolor[#1]{#2}\def\model{[#1]}% - \fi - \edef\next{\egroup\def\noexpand\current@page@color{\current@page@color}% - \noexpand\real@pagecolor\model{#2}}% - \fi\next} -% -\newcommand{\segmentcolor}[2][named]{\@ifpackageloaded{color}% - {\loadsegmentcolors\segmentcolor[#1]{#2}}{}} - -\@ifpackageloaded{color}{\loadsegmentcolors}{\let\real@pagecolor=\@gobble - \AtBeginDocument{\@ifpackageloaded{color}{\loadsegmentcolors}{}}} - - -% Define the \segment[align]{file}{section-command}{section-title} command, -% and its helper macros. This command does four things: -% 1) Begins a new LaTeX section; -% 2) Writes a list of section counters to file.ptr, each -% of which represents the sum of the LaTeX section -% counters, and the l-counters, defined above; -% 3) Write an \htmlhead{section-title} command to file.ptr; -% 4) Inputs file.tex. - -\def\segment{\@ifstar{\@@htmls}{\@@html}} -\def\endsegment{} -\newcommand{\@@htmls}[1][]{\@@htmlsx{#1}} -\newcommand{\@@html}[1][]{\@@htmlx{#1}} -\def\@@htmlsx#1#2#3#4{\csname #3\endcsname* {#4}% - \DumpCounters{#2}{#3*}{#4}{#1}\input{#2}} -\def\@@htmlx#1#2#3#4{\csname #3\endcsname {#4}% - \DumpCounters{#2}{#3}{#4}{#1}\input{#2}} - -\makeatother -\endinput - - -% Modifications: -% -% (The listing of Initiales see Changes) - -% $Log: html.sty,v $ -% Revision 1.23 1998/02/26 10:32:24 latex2html -% -- use \providecommand for \latextohtml -% -- implemented \HTMLcode to do what \HTML did previously -% \HTML still works, unless already defined by another package -% -- fixed problems remaining with undefined \chapter -% -- defined \endsegment -% -% Revision 1.22 1997/12/05 11:38:18 RRM -% -- implemented an optional argument to \begin for style-sheet info. -% -- modified use of an optional argument with sectioning-commands -% -% Revision 1.21 1997/11/05 10:28:56 RRM -% -- replaced redefinition of \@htmlrule with \htmlrulestar -% -% Revision 1.20 1997/10/28 02:15:58 RRM -% -- altered the way some special html-macros are defined, so that -% star-variants are explicitly defined for LaTeX -% -- it is possible for these to occur within images.tex -% e.g. \htmlinfostar \htmlrulestar \tableofchildlinksstar -% -% Revision 1.19 1997/10/11 05:47:48 RRM -% -- allow the dummy {tex2html_nowrap} environment in LaTeX -% use it to make its contents be evaluated in environment order -% -% Revision 1.18 1997/10/04 06:56:50 RRM -% -- uses Robin Fairbairns' code for ignored environments, -% replacing the previous comment.sty stuff. -% -- extensions to the \tableofchildlinks command -% -- extensions to the \htmlinfo command -% -% Revision 1.17 1997/07/08 11:23:39 RRM -% include value of footnote counter in .ptr files for segments -% -% Revision 1.16 1997/07/03 08:56:34 RRM -% use \textup within the \latextohtml macro -% -% Revision 1.15 1997/06/15 10:24:58 RRM -% new command \htmltracenv as environment-ordered \htmltracing -% -% Revision 1.14 1997/06/06 10:30:37 RRM -% - new command: \htmlborder puts environment into a
cell -% with a border of specified width, + other attributes. -% - new commands: \HTML for setting arbitrary HTML tags, with attributes -% \HTMLset for setting Perl variables, while processing -% \HTMLsetenv same as \HTMLset , but it gets processed -% as if it were an environment. -% - new command: \latextohtml --- to set the LaTeX2HTML name/logo -% - fixed some remaining problems with \segmentcolor & \segmentpagecolor -% -% Revision 1.13 1997/05/19 13:55:46 RRM -% alterations and extra options to \hypercite -% -% Revision 1.12 1997/05/09 12:28:39 RRM -% - Added the optional argument to \htmlhead, also in \DumpCounters -% - Implemented \HTMLset as a no-op in LaTeX. -% - Fixed a bug in accessing the page@color settings. -% -% Revision 1.11 1997/03/26 09:32:40 RRM -% - Implements LaTeX versions of \externalcite and \hypercite commands. -% Thanks to Uffe Engberg and Stephen Simpson for the suggestions. -% -% Revision 1.10 1997/03/06 07:37:58 RRM -% Added the \htmltracing command, for altering $VERBOSITY . -% -% Revision 1.9 1997/02/17 02:26:26 RRM -% - changes to counter handling (RRM) -% - shuffled around some definitions -% - changed \htmlrule of 209 mode -% -% Revision 1.8 1997/01/26 09:04:12 RRM -% RRM: added optional argument to sectioning commands -% \htmlbase sets the tag -% \htmlinfo and \htmlinfo* allow the document info to be positioned -% -% Revision 1.7 1997/01/03 12:15:44 L2HADMIN -% % - fixes to the color and natbib interfaces -% % - extended usage of \hyperref, via an optional argument. -% % - extended use comment environments to allow shifting expansions -% % e.g. within \multicolumn (`bug' reported by Luc De Coninck). -% % - allow optional argument to: \htmlimage, \htmlhead, -% % \htmladdimg, \htmladdnormallink, \htmladdnormallinkfoot -% % - added new commands: \htmlbody, \htmlnohead -% % - added new command: \tableofchildlinks -% -% Revision 1.6 1996/12/25 03:04:54 JCL -% added patches to segment feature from Martin Wilck -% -% Revision 1.5 1996/12/23 01:48:06 JCL -% o introduced the environment makeimage, which may be used to force -% LaTeX2HTML to generate an image from the contents. -% There's no magic, all what we have now is a defined empty environment -% which LaTeX2HTML will not recognize and thus pass it to images.tex. -% o provided \protect to the \htmlrule commands to allow for usage -% within captions. -% -% Revision 1.4 1996/12/21 19:59:22 JCL -% - shuffled some entries -% - added \latexhtml command -% -% Revision 1.3 1996/12/21 12:22:59 JCL -% removed duplicate \htmlrule, changed \htmlrule back not to create a \hrule -% to allow occurrence in caption -% -% Revision 1.2 1996/12/20 04:03:41 JCL -% changed occurrence of \makeatletter, \makeatother -% added new \htmlrule command both for the LaTeX2.09 and LaTeX2e -% sections -% -% -% jcl 30-SEP-96 -% - Stuck the commands commonly used by both LaTeX versions to the top, -% added a check which stops input or reads further if the document -% makes use of LaTeX2e. -% - Introduced rrm's \dumpcurrentcolor and \bodytext -% hws 31-JAN-96 - Added support for document segmentation -% hws 10-OCT-95 - Added \htmlrule command -% jz 22-APR-94 - Added support for htmlref -% nd - Created diff -Nru xen-4.2.2/docs/man/xl.cfg.pod.5 xen-4.3.0/docs/man/xl.cfg.pod.5 --- xen-4.2.2/docs/man/xl.cfg.pod.5 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/man/xl.cfg.pod.5 2013-07-09 10:46:56.000000000 +0000 @@ -17,7 +17,7 @@ A domain config file consists of a series of C pairs. -Some Cs are mandatory, others are global options which apply to +Some Cs are mandatory, others are general options which apply to any guest type while others relate only to specific guest types (e.g. PV or HVM guests). @@ -80,20 +80,13 @@ =back -=head2 Global Options +=head2 General Options The following options apply to guests of any type. -=over 4 - -=item B - -Specifies the UUID of the domain. If not specified, a fresh unique -UUID will be generated. - -=item B +=head3 CPU Allocation -Automatically spawn a vncviewer when creating/restoring a guest +=over 4 =item B @@ -138,6 +131,12 @@ utilized with the goals of maximizing performance for the domain and, at the same time, achieving efficient utilization of the host's CPUs and RAM. +=back + +=head3 CPU Scheduling + +=over 4 + =item B A domain with a weight of 512 will get twice as much CPU as a domain @@ -154,6 +153,19 @@ The default, 0, means there is no upper cap. Honoured by the credit and credit2 schedulers. +NB: Many systems have features that will scale down the computing +power of a cpu that is not 100% utilized. This can be in the +operating system, but can also sometimes be below the operating system +in the BIOS. If you set a cap such that individual cores are running +at less than 100%, this may have an impact on the performance of your +workload over and above the impact of the cap. For example, if your +processor runs at 2GHz, and you cap a vm at 50%, the power management +system may also reduce the clock speed to 1GHz; the effect will be +that your VM gets 25% of the available power (50% of 1GHz) rather than +50% (50% of 2GHz). If you are not getting the performance you expect, +look at performance and cpufreq options in your operating system and +your BIOS. + =item B The normal EDF scheduling usage in nanoseconds. This means every period @@ -176,6 +188,12 @@ Flag for allowing domain to run in extra time. Honoured by the sedf scheduler. +=back + +=head3 Memory Allocation + +=over 4 + =item B Start the guest with MBYTES megabytes of RAM. @@ -190,6 +208,12 @@ A "pre-ballooned" HVM guest needs a balloon driver, without a balloon driver it will crash. +=back + +=head3 Event Actions + +=over 4 + =item B Specifies what should be done with the domain if it shuts itself down. @@ -200,12 +224,12 @@ =item B destroy the domain - + =item B destroy the domain and immediately create a new domain with the same configuration - + =item B rename the domain which terminated, and then immediately create a new @@ -244,10 +268,37 @@ Action to take if the domain crashes. Default is C. +=back + +=head3 Other Options + +=over 4 + +=item B + +Specifies the UUID of the domain. If not specified, a fresh unique +UUID will be generated. + =item B Assign an XSM security label to this domain. +=item B + +Specify an XSM security label used for this domain temporarily during +its build. The domain's XSM label will be changed to the execution +seclabel (specified by "seclabel") once the build is complete, prior to +unpausing the domain. With a properly constructed security policy (such +as nomigrate_t in the example policy), this can be used to build a +domain whose memory is not accessible to the toolstack domain. + +=item B + +Disable migration of this domain. This enables certain other features +which are incompatible with migration. Currently this is limited to +enabling the invariant TSC feature flag in cpuid results when TSC is +not emulated. + =back =head2 Devices @@ -269,6 +320,35 @@ and Xen virtual interfaces) to provided to the guest. See F. +=item B + +Specifies the virtual trusted platform module to be +provided to the guest. Please see F +for more details. + +Each B is a comma-separated list of C +settings, from the following list: + +=over 4 + +=item C + +Specify the backend domain name of id. This value is required! +If this domain is a guest, the backend should be set to the +vtpm domain name. If this domain is a vtpm, the +backend should be set to the vtpm manager domain name. + +=item C + +Specify the uuid of this vtpm device. The uuid is used to uniquely +identify the vtpm device. You can create one using the uuidgen +program on unix systems. If left unspecified, a new uuid +will be randomly generated every time the domain boots. +If this is a vtpm domain, you should specify a value. The +value is optional if this is a guest domain. + +=back + =item B Specifies the paravirtual framebuffer devices which should be supplied @@ -292,11 +372,17 @@ Specifies the IP address, and optionally VNC display number, to use. +NB that if you specify the display number here, you should not use +vncdisplay. + =item C Specifies the VNC display number to use. The actual TCP port number will be DISPLAYNUM+5900. +NB that you should not use this option if you set the displaynum in the +vnclisten string. + =item C Requests that the VNC display setup search for a free TCP port to use. @@ -309,7 +395,20 @@ =item C Specifies that the display should be presented via an X window (using -Simple DirectMedia Layer). The default is to not enable this mode +Simple DirectMedia Layer). The default is to not enable this mode. + +=item C + +Specifies the X Window display that should be used when the sdl option +is used. Note: passing this value to the device-model is not currently +implemented, so providing this option will have no effect. + +=item C + +Specifies the path to the X authority file that should be used to +connect to the X server when the sdl option is used. Note: passing +this value to the device-model is not currently implemented, so +providing this option will have no effect. =item C @@ -324,19 +423,9 @@ (e.g. this is often the case when using VNC) then this allows us to correctly map the input keys into keycodes seen by the guest. The specific values which are accepted are defined by the version of the -device-model which you are using. See L below or consult the +device-model which you are using. See L below or consult the L manpage. The default is B. -=item C - -XXX written to xenstore backend for vfb but does not appear to be used -anywhere? - -=item C - -XXX written to xenstore backend for vfb but does not appear to be used -anywhere? - =back =item B @@ -348,7 +437,7 @@ =item B -identifies the PCI device from the host perspective in domain +Identifies the PCI device from the host perspective in domain (B), Bus (B), Device (B
) and Function (B) syntax. This is the same scheme as used in the output of C for the device in question. Note: By default C will omit the domain (B) if it @@ -357,9 +446,9 @@ =item B<@VSLOT> -specifies the virtual device where the guest will see this +Specifies the virtual device where the guest will see this device. This is equivalent to the B
which the guest sees. In a -guest B and B are C<0000:00>. XXX how does this really work? +guest B and B are C<0000:00>. =item B @@ -367,14 +456,6 @@ =over 4 -=item B - -XXX - -=item B - -XXX - =item B (PV only) By default pciback only allows PV guests to write "known @@ -386,6 +467,20 @@ may have security or stability implications. It is recommended to enable this option only for trusted VMs under administrator control. +=item B + +Specifies that MSI-INTx translation should be turned on for the PCI +device. When enabled, MSI-INTx translation will always enable MSI on +the PCI device regardless whether the guest uses INTx or MSI. Some +device drivers, such as NVIDIA's, detect an inconsistency and do not +function when this option is enabled. Therefore the default is false (0). + +=item B + +(HVM only) Specifies that the VM should be able to program the +D0-D3hot power management states for the PCI device. False (0) by +default. + =back =back @@ -393,18 +488,64 @@ =item B (PV only) Changes the default value of 'permissive' for all PCI -devices for this VM. This can still be overridden on a per-device -basis. This option should be enabled with caution: it gives the guest -much more control over the device, which may have security or -stability implications. It is recommended to enable this option only -for trusted VMs under administrator control. See the "pci=" section -for more information on the "permissive" flag. +devices passed through to this VM. See L +above. -=back +=item B -=item B +Changes the default value of 'msitranslate' for all PCI devices passed +through to this VM. See L above. -=over 4 +=item B + +(HVM only) Changes the default value of 'power_mgmt' for all PCI +devices passed through to this VM. See L +above. + +=item B + +Enable graphics device PCI passthrough. This option makes an assigned +PCI graphics card become primary graphics card in the VM. The QEMU +emulated graphics adapter is disabled and the VNC console for the VM +will not have any graphics output. All graphics output, including boot +time QEMU BIOS messages from the VM, will go to the physical outputs +of the passedthrough physical graphics card. + +The graphics card PCI device to passthrough is chosen with B +option, exactly in the same way as normal Xen PCI device +passthrough/assignment is done. Note that gfx_passthru does not do +any kind of sharing of the GPU, so you can only assign the GPU to one +single VM at a time. + +gfx_passthru also enables various legacy VGA memory ranges, BARs, MMIOs, +and ioports to be passed thru to the VM, since those are required +for correct operation of things like VGA BIOS, text mode, VBE, etc. + +Enabling gfx_passthru option also copies the physical graphics card +video BIOS to the guest memory, and executes the VBIOS in the guest +to initialize the graphics card. + +Most graphics adapters require vendor specific tweaks for properly +working graphics passthrough. See the XenVGAPassthroughTestedAdapters +L wiki page +for currently supported graphics cards for gfx_passthru. + +gfx_passthru is currently only supported with the qemu-xen-traditional +device-model. Upstream qemu-xen device-model currently does not have +support for gfx_passthru. + +Note that some graphics adapters (AMD/ATI cards, for example) do not +necessarily require gfx_passthru option, so you can use the normal Xen +PCI passthrough to assign the graphics card as a secondary graphics +card to the VM. The QEMU-emulated graphics card remains the primary +graphics card, and VNC output is available from the QEMU-emulated +primary adapter. + +More information about Xen gfx_passthru feature is available +on the XenVGAPassthrough L +wiki page. + +=item B Allow guest to access specific legacy I/O ports. Each B is given in hexadecimal and may either a span e.g. C<2f8-2ff> @@ -413,11 +554,18 @@ It is recommended to use this option only for trusted VMs under administrator control. -=back +=item B -=item B +Allow guest to access specific hardware I/O memory pages. B +is a physical page number. B is the number +of pages beginning with B to allow access. Both values +must be given in hexadecimal. -=over 4 +It is recommended to use this option only for trusted VMs under +administrator control. + + +=item B Allow a guest to access specific physical IRQs. @@ -466,20 +614,20 @@ =item B Selects whether to expose the host e820 (memory map) to the guest via -the virtual e820. When this option is false the guest pseudo-physical +the virtual e820. When this option is false (0) the guest pseudo-physical address space consists of a single contiguous RAM region. When this option is specified the virtual e820 instead reflects the host e820 and contains the same PCI holes. The total amount of RAM represented by the memory map is always the same, this option configures only how -it is layed out. +it is laid out. Exposing the host e820 to the guest gives the guest kernel the opportunity to set aside the required part of its pseudo-physical address space in order to provide address space to map passedthrough -PCI devices. It is guest Operating System dependant whether this +PCI devices. It is guest Operating System dependent whether this option is required, specifically it is required when using a mainline -Linux ("pvops") kernel. This option defaults to true if any PCI -passthrough devices are configured and false otherwise. If you do not +Linux ("pvops") kernel. This option defaults to true (1) if any PCI +passthrough devices are configured and false (0) otherwise. If you do not configure any passthrough devices at domain creation time but expect to hotplug devices later then you should set this option. Conversely if your particular guest kernel does not require this behaviour then @@ -600,6 +748,16 @@ default and usually you should omit it. However it may be necessary to disable ACPI for compatibility with some guest Operating Systems. +=item B + +Include the S3 (suspend-to-ram) power state in the virtual firmware +ACPI table. True (1) by default. + +=item B + +Include S4 (suspend-to-disk) power state in the virtual firmware ACPI +table. True (1) by default. + =item B Include information regarding APIC (Advanced Programmable Interrupt @@ -637,6 +795,73 @@ which uses hardware virtualisation extensions (e.g. Windows XP compatibility mode on more modern Windows OS). +=item B or B + +Configure the value returned when a guest executes CPUID instruction. +Two versions of config syntax are recognized: libxl and xend. + +The libxl syntax is a comma separated list of key=value pairs, preceded by the +word "host". A few keys take a numerical value, all others take a single +character which describes what to do with the feature bit. + +Possible values for a single feature bit: + '1' -> force the corresponding bit to 1 + '0' -> force to 0 + 'x' -> Get a safe value (pass through and mask with the default policy) + 'k' -> pass through the host bit value + 's' -> as 'k' but preserve across save/restore and migration (not implemented) + +List of keys taking a value: +apicidsize brandid clflush family localapicid maxleaf model nc proccount procpkg +stepping + +List of keys taking a character: +3dnow 3dnowext 3dnowprefetch abm acpi aes altmovcr8 apic avx clfsh cmov +cmplegacy cmpxchg16 cmpxchg8 cntxid dca de ds dscpl dtes64 est extapic f16c +ffxsr fma4 fpu fxsr htt hypervisor ia64 ibs lahfsahf lm lwp mca mce misalignsse +mmx mmxext monitor movbe msr mtrr nodeid nx osvw osxsave pae page1gb pat pbe +pclmulqdq pdcm pge popcnt pse pse36 psn rdtscp skinit smx ss sse sse2 sse3 +sse4_1 sse4_2 sse4a ssse3 svm svm_decode svm_lbrv svm_npt svm_nrips +svm_pausefilt svm_tscrate svm_vmcbclean syscall sysenter tbm tm tm2 topoext tsc +vme vmx wdt x2apic xop xsave xtpr + +The xend syntax is a list of values in the form of +'leafnum:register=bitstring,register=bitstring' + "leafnum" is the requested function, + "register" is the response register to modify + "bitstring" represents all bits in the register, its length must be 32 chars. + Each successive character represent a lesser-significant bit, possible values + are listed above in the libxl section. + +Example to hide two features from the guest: 'tm', which is bit #29 in EDX, and +'pni' (SSE3), which is bit #0 in ECX: + +xend: [ '1:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0,edx=xx0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ] + +libxl: 'host,tm=0,sse3=0' + +More info about the CPUID instruction can be found in the processor manuals, and +in Wikipedia: L + +=item B + +Specify a path to a file that contains extra ACPI firmware tables to pass in to +a guest. The file can contain several tables in their binary AML form +concatenated together. Each table self describes its length so no additional +information is needed. These tables will be added to the ACPI table set in the +guest. Note that existing tables cannot be overridden by this feature. For +example this cannot be used to override tables like DSDT, FADT, etc. + +=item B + +Specify a path to a file that contains extra SMBIOS firmware structures to pass +in to a guest. The file can contain a set DMTF predefined structures which will +override the internal defaults. Not all predefined structures can be overridden, +only the following types: 0, 1, 2, 3, 11, 22, 39. The file can also contain any +number of vendor defined SMBIOS structures (type 128 - 255). Since SMBIOS +structures do not present their overall size, each entry in the file must be +preceded by a 32b integer indicating the size of the next structure. + =back =head3 Guest Virtual Time Controls @@ -680,17 +905,60 @@ =back -=back - Please see F for more information on this option. =item B -Set the real time clock to local time or to UTC. 0 by default, i.e. set to UTC. +Set the real time clock to local time or to UTC. False (0) by default, +i.e. set to UTC. =item B -Set the real time clock offset in seconds. 0 by default. +Set the real time clock offset in seconds. False (0) by default. + + +=item B + +Specifies that periodic Virtual Platform Timers should be aligned to +reduce guest interrupts. Enabling this option can reduce power +consumption, especially when a guest uses a high timer interrupt +frequency (HZ) values. The default is true (1). + +=item B + +Specifies the mode for Virtual Timers. The valid values are as follows: + +=over 4 + +=item B<"delay_for_missed_ticks"> + +Delay for missed ticks. Do not advance a vcpu's time beyond the +correct delivery time for interrupts that have been missed due to +preemption. Deliver missed interrupts when the vcpu is rescheduled and +advance the vcpu's virtual time stepwise for each one. + +=item B<"no_delay_for_missed_ticks"> + +No delay for missed ticks. As above, missed interrupts are delivered, +but guest time always tracks wallclock (i.e., real) time while doing +so. + +=item B<"no_missed_ticks_pending"> + +No missed interrupts are held pending. Instead, to ensure ticks are +delivered at some non-zero rate, if we detect missed ticks then the +internal tick alarm is not disabled if the VCPU is preempted during +the next tick period. + +=item B<"one_missed_tick_pending"> + +One missed tick pending. Missed interrupts are collapsed +together and delivered as one 'late tick'. Guest time always tracks +wallclock (i.e., real) time. + +=back + +=back =head3 Support for Paravirtualisation of HVM Guests @@ -719,10 +987,11 @@ of Microsoft Windows guests from Windows Vista and Windows 2008 onwards and setting this option for such guests is strongly recommended. This option should be harmless for other versions of -Windows (although it won't give any benefit) and the majority of other -non-Windows OSes. However it is known to be incompatible with some -other Operating Systems and in some circumstance can prevent Xen's own -paravirtualisation interfaces for HVM guests from being used. +Windows (although it will not give any benefit) and the majority of +other non-Windows OSes. However it is known to be incompatible with +some other Operating Systems and in some circumstance can prevent +Xen's own paravirtualisation interfaces for HVM guests from being +used. =back @@ -744,7 +1013,7 @@ for e.g. 1600x1200 at 32bpp and videoram option is currently working only when using the qemu-xen-traditional device-model. -When using the emulated Cirrus graphics card (B) +When using the emulated Cirrus graphics card (B) the amount of video ram is fixed at 4MB which is sufficient for 1024x768 at 32 bpp and videoram option is currently working only when using the upstream qemu-xen device-model. @@ -752,16 +1021,26 @@ =item B Select a standard VGA card with VBE (VESA BIOS Extensions) as the -emulated graphics device. The default is false which means to emulate +emulated graphics device. The default is false (0) which means to emulate a Cirrus Logic GD5446 VGA card. If your guest supports VBE 2.0 or later (e.g. Windows XP onwards) then you should enable this. stdvga supports more video ram and bigger resolutions than Cirrus. +This option is deprecated, use vga="stdvga" instead. + +=item B + +Selects the emulated video card (stdvga|cirrus). +The default is cirrus. =item B Allow access to the display via the VNC protocol. This enables the other VNC-related settings. The default is to enable this. +=item B + +Automatically spawn a vncviewer when creating/restoring a guest. + =item B Specifies the IP address, and optionally VNC display number, to use. @@ -787,7 +1066,7 @@ (e.g. this is often the case when using VNC) then this allows us to correctly map the input keys into keycodes seen by the guest. The specific values which are accepted are defined by the version of the -device-model which you are using. See L below of consult the +device-model which you are using. See L below or consult the L manpage. The default is B. =item B @@ -799,7 +1078,7 @@ Enable OpenGL acceleration of the SDL display. Only effects machines using B and only if the -device-model was compiled with OpenGL support. Disabled by default. +device-model was compiled with OpenGL support. False (0) by default. =item B @@ -839,8 +1118,8 @@ =item B -Enable client connection without password. The default is false. If -it's false (set to 0), spicepasswd must be set. +Enable client connection without password. When disabled, spicepasswd +must be set. The default is false (0). =item B @@ -848,7 +1127,7 @@ =item B -Whether SPICE agent is used for client mouse mode. The default is true +Whether SPICE agent is used for client mouse mode. The default is true (1) (turn on) =back @@ -873,38 +1152,27 @@ =item B -Enables or disables a USB bus in the guest. - -=item B - -Adds B to the USB bus. The USB bus must also be enabled using -B. The most common use for this option is B -which adds pointer device using absolute coordinates. Such devices -function better than relative coordinate devices (such as a standard -mouse) since many methods of exporting guest graphics (such as VNC) -work better in this mode. Note that this is independent of the actual -pointer device you are using on the host/client side. XXX should/could -be a list of devices. - -=back - -=head3 Unclassified HVM Specific Options - -These HVM specific options have not yet been documented or -classified. They almost certainly belong in a more appropriate -section. +Enables or disables an emulated USB bus in the guest. -=over 4 - -=item B +=item B -Align the Virtual Platform Timer ??? XXX Reduces interrupts? +Adds Bs to the emulated USB bus. The USB bus must also be +enabled using B. The most common use for this option is +B which adds pointer device using absolute +coordinates. Such devices function better than relative coordinate +devices (such as a standard mouse) since many methods of exporting +guest graphics (such as VNC) work better in this mode. Note that this +is independent of the actual pointer device you are using on the +host/client side. + +Host devices can also be passed through in this way, by specifying +host:USBID, where USBID is of the form xxxx:yyyy. The USBID can +typically be found by using lsusb or usb-devices. -=item B +The form usbdevice=DEVICE is also accepted for backwards compatibility. -Set mode for Virtual Timers XXX ??? should be an enum of particular -values. See C in -F. +More valid options can be found in the "usbdevice" section of the qemu +documentation. =back @@ -925,15 +1193,15 @@ =over 4 -=item B +=item B -Use the device-model based upon the historical Xen fork of Qemu. This -device-model is currently the default. +Use the device-model merged into the upstream QEMU project. +This device-model is the default for Linux dom0. -=item B +=item B -use the device-model merged into the upstream Qemu project. This -device-model will become the default in a future version of Xen. +Use the device-model based upon the historical Xen fork of Qemu. +This device-model is still the default for NetBSD dom0. =back @@ -979,142 +1247,6 @@ =back -=head2 Unclassified General Options - -These have not yet been fully documented or classified. They almost -certainly belong in a more appropriate section. - -=over 4 - -=item B - -Enable graphics device PCI passthrough. This option makes the passthru -graphics card become primary graphics card in the VM, so the Qemu emulated -graphics adapter is disabled, and the VNC console for the VM won't have -any graphics output. All graphics output, including boot time Qemu BIOS -messages from the VM, will go to the physical outputs of the passed thru -physical graphics card. - -Graphics card PCI device to passthru is chosen with B option, -exactly in the same way as normal Xen PCI device passthru/assignment is done. -Note that gfx_passthru doesn't do any kind of sharing -of the GPU, so you can only assign the GPU to one single VM at a time. - -gfx_passthru also enables various legacy VGA memory ranges, BARs, MMIOs, -and ioports to be passed thru to the VM, since those are required -for correct operation of things like VGA BIOS, text mode, VBE, etc. - -Enabling gfx_passthru option also copies the physical graphics card -video BIOS to the guest memory, and executes the VBIOS in the guest -to get the graphics card initialized. - -Most graphics adapters require vendor specific tweaks for properly -working graphics passthru. See the XenVGAPassthroughTestedAdapters -L -wiki page for currently supported graphics cards for gfx_passthru. - -gfx_passthru is currently only supported with the qemu-xen-traditional -device-model. Upstream qemu-xen device-model currently doesn't have -support for gfx_passthru. - -Note that some graphics adapters (AMD/ATI cards, for example) don't -necessarily require gfx_passthru option, so you can use the normal -Xen PCI passthru to assign the graphics card as a secondary graphics card -to the VM. Qemu emulated graphics card stays as the primary graphics card, -and you get VNC output from the Qemu-emulated primary adapter. - -More information about Xen gfx_passthru feature is available -on the XenVGAPassthrough L -wiki page. - -=item B - -Disable migration of this domain. This enables certain other features -which are incompatible with migration (currently certain TSC modes XXX -?). - -=item B - -XXX - -=item B - -XXX - -=item B or B - -Configure the value returned when a guest executes CPUID instruction. -Two versions of config syntax are recognized: libxl and xend. - -The libxl syntax is a comma separated list of key=value pairs, preceded by the -word "host". A few keys take a numerical value, all others take a single -character which describes what to do with the feature bit. - -Possible values for a single feature bit: - '1' -> force the corresponding bit to 1 - '0' -> force to 0 - 'x' -> Get a safe value (pass through and mask with the default policy) - 'k' -> pass through the host bit value - 's' -> as 'k' but preserve across save/restore and migration (not implemented) - -List of keys taking a value: -apicidsize brandid clflush family localapicid maxleaf model nc proccount procpkg -stepping - -List of keys taking a character: -3dnow 3dnowext 3dnowprefetch abm acpi aes altmovcr8 apic avx clfsh cmov -cmplegacy cmpxchg16 cmpxchg8 cntxid dca de ds dscpl dtes64 est extapic f16c -ffxsr fma4 fpu fxsr htt hypervisor ia64 ibs lahfsahf lm lwp mca mce misalignsse -mmx mmxext monitor movbe msr mtrr nodeid nx osvw osxsave pae page1gb pat pbe -pclmulqdq pdcm pge popcnt pse pse36 psn rdtscp skinit smx ss sse sse2 sse3 -sse4.1 sse4.2 sse4a ssse3 svm svm_decode svm_lbrv svm_npt svm_nrips -svm_pausefilt svm_tscrate svm_vmcbclean syscall sysenter tbm tm tm2 topoext tsc -vme vmx wdt x2apic xop xsave xtpr - -The xend syntax is a list of values in the form of -'leafnum:register=bitstring,register=bitstring' - "leafnum" is the requested function, - "register" is the response register to modify - "bitstring" represents all bits in the register, its length must be 32 chars. - Each successive character represent a lesser-significant bit, possible values - are listed above in the libxl section. - -Example to hide two features from the guest: 'tm', which is bit #29 in EDX, and -'pni' (SSE3), which is bit #0 in ECX: - -xend: [ '1:ecx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0,edx=xx0xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ] - -libxl: 'host,tm=0,sse3=0' - -More info about the CPUID instruction can be found in the processor manuals, and -in Wikipedia: L - -=item B - -XXX - -=item B - -XXX - -=item B - -XXX - -=item B - -XXX - -=item B - -XXX deprecated - -=item B - -XXX deprecated - -=back - =head2 Keymaps The keymaps available are defined by the device-model which you are @@ -1134,27 +1266,26 @@ =item L +=item L + =item F =item F +=item F + =back =head1 FILES F F -F =head1 BUGS -This document is a work in progress and contains items which require -further documentation and which are generally incomplete (marked with -XXX). However all options are included here whether or not they are -fully documented. - -Patches to improve incomplete items (or any other item) would be -gratefully received on the xen-devel@lists.xen.org mailing +This document may contain items which require further +documentation. Patches to improve incomplete items (or any other item) +are gratefully received on the xen-devel@lists.xen.org mailing list. Please see L for information on how to submit a patch to Xen. diff -Nru xen-4.2.2/docs/man/xl.conf.pod.5 xen-4.3.0/docs/man/xl.conf.pod.5 --- xen-4.2.2/docs/man/xl.conf.pod.5 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/man/xl.conf.pod.5 2013-07-09 10:46:56.000000000 +0000 @@ -45,15 +45,22 @@ =over 4 -=item B +=item B -If disabled then C will not attempt to reduce the amount of memory -assigned to domain 0 in order to create free memory when starting a -new domain. You are strongly recommended to set this to C<0> -(C) if you use the C hypervisor command line to -reduce the amount of memory given to domain 0 by default. +If set to "on" then C will automatically reduce the amount of +memory assigned to domain 0 in order to free memory for new domains. -Default: C<1> +If set to "off" then C will not automatically reduce the amount of +domain 0 memory. + +If set to "auto" then auto-ballooning will be disabled if the +C option was provided on the Xen command line. + +You are strongly recommended to set this to C<"off"> (or C<"auto">) if +you use the C hypervisor command line to reduce the amount +of memory given to domain 0 by default. + +Default: C<"auto"> =item B @@ -70,18 +77,28 @@ Default: C -=item B +=item B Configures the default hotplug script used by virtual network devices. +The old B option is deprecated and should not be used. + Default: C -=item B +=item B Configures the default bridge to set for virtual network devices. +The old B option is deprecated and should not be used. + Default: C +=item B + +Configures the default gateway device to set for virtual network devices. + +Default: C + =item B Configures the default output format used by xl when printing "machine @@ -98,6 +115,49 @@ block device allocations by the toolstack. The default choice is "xvda". +=item B + +If this option is enabled then when a guest is created there will be an +guarantee that there is memory available for the guest. This is an +particularly acute problem on hosts with memory over-provisioned guests +that use tmem and have self-balloon enabled (which is the default +option). The self-balloon mechanism can deflate/inflate the balloon +quickly and the amount of free memory (which C can show) is +stale the moment it is printed. When claim is enabled a reservation for +the amount of memory (see 'memory' in xl.conf(5)) is set, which is then +reduced as the domain's memory is populated and eventually reaches zero. +The free memory in C is the combination of the hypervisor's +free heap memory minus the outstanding claims value. + +If the reservation cannot be meet the guest creation fails immediately +instead of taking seconds/minutes (depending on the size of the guest) +while the guest is populated. + +Note that to enable tmem type guests, one needs to provide C on the +Xen hypervisor argument and as well on the Linux kernel command line. + +Note that the claim call is not attempted if C option is +used in the guest config (see xl.cfg(5)). + +Default: C<0> + +=over 4 + +=item C<0> + +No claim is made. Memory population during guest creation will be +attempted as normal and may fail due to memory exhaustion. + +=item C<1> + +Normal memory and freeable pool of ephemeral pages (tmem) is used when +calculating whether there is enough memory free to launch a guest. +This guarantees immediate feedback whether the guest can be launched due +to memory exhaustion (which can take a long time to find out if launching +massively huge guests). + +=back + =back =head1 SEE ALSO diff -Nru xen-4.2.2/docs/man/xl.pod.1 xen-4.3.0/docs/man/xl.pod.1 --- xen-4.2.2/docs/man/xl.pod.1 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/man/xl.pod.1 2013-07-09 10:46:56.000000000 +0000 @@ -387,6 +387,10 @@ Send instead of config file from creation. +=item B<--debug> + +Print huge (!) amount of debug during the migration process. + =back =item B [I] I I @@ -527,7 +531,7 @@ =back -=item B [I] I +=item B [I] I<-a|domain-id> Gracefully shuts down a domain. This coordinates with the domain OS to perform graceful shutdown, so there is no guarantee that it will @@ -550,6 +554,11 @@ =over 4 +=item B<-a>, B<--all> + +Shutdown all guest domains. Often used when doing a complete shutdown +of a Xen system. + =item B<-w>, B<--wait> Wait for the domain to complete shutdown before returning. @@ -695,6 +704,7 @@ total_memory : 6141 free_memory : 4274 free_cpus : 0 + outstanding_claims : 0 xen_major : 4 xen_minor : 2 xen_extra : -unstable @@ -727,7 +737,20 @@ =item B -Available memory (in MB) not allocated to Xen, or any other domains. +Available memory (in MB) not allocated to Xen, or any other domains, or +claimed for domains. + +=item B + +When a claim call is done (see L) a reservation for a specific +amount of pages is set and also a global value is incremented. This +global value (outstanding_claims) is then reduced as the domain's memory +is populated and eventually reaches zero. Most of the time the value will +be zero, but if you are launching multiple guests, and B is +enabled, this value can increase/decrease. Note that the value also +affects the B - as it will reflect the free memory +in the hypervisor minus the outstanding pages claimed for guests. +See xl I B parameter for detailed listing. =item B @@ -761,6 +784,29 @@ Prints the current uptime of the domains running. +=item B + +Prints information about outstanding claims by the guests. This provides +the outstanding claims and currently populated memory count for the guests. +These values added up reflect the global outstanding claim value, which +is provided via the I argument, B value. +The B column has the cumulative value of outstanding claims and +the total amount of memory that has been right now allocated to the guest. + +B + +An example format for the list is as follows: + + Name ID Mem VCPUs State Time(s) Claimed + Domain-0 0 2047 4 r----- 19.7 0 + OL5 2 2048 1 --p--- 0.0 847 + OL6 3 1024 4 r----- 5.9 0 + Windows_XP 4 2047 1 --p--- 0.0 1989 + +In which it can be seen that the OL5 guest still has 847MB of claimed +memory (out of the total 2048MB where 1191MB has been allocated to +the guest). + =back =head1 SCHEDULER SUBCOMMANDS @@ -802,6 +848,19 @@ 50 is half a CPU, 400 is 4 CPUs, etc. The default, 0, means there is no upper cap. +NB: Many systems have features that will scale down the computing +power of a cpu that is not 100% utilized. This can be in the +operating system, but can also sometimes be below the operating system +in the BIOS. If you set a cap such that individual cores are running +at less than 100%, this may have an impact on the performance of your +workload over and above the impact of the cap. For example, if your +processor runs at 2GHz, and you cap a vm at 50%, the power management +system may also reduce the clock speed to 1GHz; the effect will be +that your VM gets 25% of the available power (50% of 1GHz) rather than +50% (50% of 2GHz). If you are not getting the performance you expect, +look at performance and cpufreq options in your operating system and +your BIOS. + =item B<-p CPUPOOL>, B<--cpupool=CPUPOOL> Restrict output to domains in the specified cpupool. @@ -851,8 +910,6 @@ =item B<-p [pool] -d>... : Illegal -=item - =back =item B [I] @@ -1101,6 +1158,31 @@ =back +=head2 VTPM DEVICES + +=over 4 + +=item B I I + +Creates a new vtpm device in the domain specified by I. +I describes the device to attach, using the same format as the +B string in the domain config file. See L for +more information. + +=item B I I + +Removes the vtpm device from the domain specified by I. +I is the numeric device id given to the virtual trusted +platform module device. You will need to run B to determine that number. +Alternatively the I of the vtpm can be used to +select the virtual device to detach. + +=item B I + +List virtual trusted platform modules for a domain. + +=back + =head1 PCI PASS-THROUGH =over 4 diff -Nru xen-4.2.2/docs/man/xm.pod.1 xen-4.3.0/docs/man/xm.pod.1 --- xen-4.2.2/docs/man/xm.pod.1 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/man/xm.pod.1 2013-07-09 10:46:56.000000000 +0000 @@ -767,6 +767,19 @@ 50 is half a CPU, 400 is 4 CPUs, etc. The default, 0, means there is no upper cap. +NB: Many systems have features that will scale down the computing +power of a cpu that is not 100% utilized. This can be in the +operating system, but can also sometimes be below the operating system +in the BIOS. If you set a cap such that individual cores are running +at less than 100%, this may have an impact on the performance of your +workload over and above the impact of the cap. For example, if your +processor runs at 2GHz, and you cap a vm at 50%, the power management +system may also reduce the clock speed to 1GHz; the effect will be +that your VM gets 25% of the available power (50% of 1GHz) rather than +50% (50% of 2GHz). If you are not getting the performance you expect, +look at performance and cpufreq options in your operating system and +your BIOS. + =back =item B I I I I I @@ -977,17 +990,6 @@ =back -=head2 VIRTUAL TPM DEVICES - -=over 4 - -=item B [B<-l>|B<--long>] I - -Show the virtual TPM device for a domain. The returned output is -formatted as a list or as an S-Expression if the B<--long> option was given. - -=back - =head1 SEE ALSO B(5), B(1) diff -Nru xen-4.2.2/docs/misc/arm/device-tree/booting.txt xen-4.3.0/docs/misc/arm/device-tree/booting.txt --- xen-4.2.2/docs/misc/arm/device-tree/booting.txt 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/misc/arm/device-tree/booting.txt 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,25 @@ +Xen is passed the dom0 kernel and initrd via a reference in the /chosen +node of the device tree. + +Each node has the form /chosen/modules/module@ and contains the following +properties: + +- compatible + + Must be: + + "xen,", "xen,multiboot-module" + + where must be one of: + + - "linux-zimage" -- the dom0 kernel + - "linux-initrd" -- the dom0 ramdisk + +- reg + + Specifies the physical address of the module in RAM and the + length of the module. + +- bootargs (optional) + + Command line associated with this module diff -Nru xen-4.2.2/docs/misc/arm/early-printk.txt xen-4.3.0/docs/misc/arm/early-printk.txt --- xen-4.2.2/docs/misc/arm/early-printk.txt 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/misc/arm/early-printk.txt 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,24 @@ +How to enable early printk + +Early printk can only be enabled if debug=y. You may want to enable it if +you are debbuging code that executes before the console is initialized. + +Note that selecting this option will limit Xen to a single UART definition. +Attempting to boot Xen image on a different platform *will not work*, so this +option should not be enable for Xens that are intended to be portable. + +CONFIG_EARLY_PRINTK=mach +where mach is the name of the machine: + - vexpress: printk with pl011 for versatile express + - exynos5250: printk with the second UART + - midway: printk with the pl011 on Calxeda Midway processors + - fastmodel: printk on ARM Fastmodel software emulators + +The base address and baud rate is hardcoded in xen/arch/arm/Rules.mk, +see there when adding support for new machines. +If not explicitly requested with "EARLY_PRINTK_INIT_UART := y" in Rules.mk, +the code will not try to initialize the UART, so that bootloader or +firmware settings can be used for maximum compatibility. The baud rate +parameter is ignored in this case. + +By default early printk is disabled. diff -Nru xen-4.2.2/docs/misc/coverage.markdown xen-4.3.0/docs/misc/coverage.markdown --- xen-4.2.2/docs/misc/coverage.markdown 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/misc/coverage.markdown 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,89 @@ +# Coverage support for Xen + +Coverare support allow you to get coverage information from Xen execution. +You can see how many times a line is executed. + +Some compilers have specific options that enable the collection of this +information. Every basic block in the code will be instrumented by the compiler +to compute these statistics. It should not be used in production as it slows +down your hypervisor. + +## Enable coverage + +Test coverage support can be turned on compiling Xen with the `coverage` option set +to `y`. + +Something like: + + cd xen + make coverage=y + +(or change your `.config` file). + +## Extract coverage data + +The way GCC and other tools deal with coverage information is to use some files +created during build phase (.gcno) and some files produced by executing the +*program* (.gcda). The program in this case is Xen but Xen cannot write files +so the way you can use coverage from Xen is extract coverage data from Xen and +then split these information into files. + +To extract data you use a simple utility called `xencov`. Mainly `xencore` +allows you to do 3 operations: + +* `xencov read` extract data +* `xencov reset` reset all coverage counters +* `xencov read-reset` extract data and reset counters at the same time. + +Another utility (`xencov_split`) is used to split extracted data file into files +needed by userspace tools. + +## Split coverage data + +Once you extracted data from Xen, it is time to create files which the coverage tools +can understand. To do it you need to run `xencov_split` utility. + +The utility just takes an input file and splits the blob into gcc .gcda files +in the same directory that you execute the script. As file names are generated +relative to the current directory, it could be a good idea to run the script +from `/` on your build machine. + +Code for splitting the blob is put in another utility for some reason: +* It is simpler to maintain a high level script than a C program; +* You don't need to execute on the Xen host so you just need to copy the file to + your development box (you usually need development files anyway). + +## Possible use + +**This section is just an example on how to use these tools!** + +This example assumes you compiled Xen from `~/xen-unstable` and installed into +the host. **Consider that if you even recompile Xen you are not able to use +blob extracted from xencov!** + +* Ensure the `lcov` package is installed +* From the Xen host machine extract the coverage blob + + cd /root + xencov read coverage.dat + +* Copy the extracted blob to your dev machine + + cd ~ + scp root@myhost:coverage.dat + +* Extract the coverage information + + (cd / && xencov_split ~/coverage.dat) + +* Produce coverage html output + + cd ~/xen-unstable + rm -rf cov.info cov + geninfo -o cov.info xen + mkdir cov + genhtml -o cov cov.info + +* See output in a browser + + firefox cov/index.html diff -Nru xen-4.2.2/docs/misc/efi.markdown xen-4.3.0/docs/misc/efi.markdown --- xen-4.2.2/docs/misc/efi.markdown 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/misc/efi.markdown 2013-07-09 10:46:56.000000000 +0000 @@ -75,6 +75,13 @@ Specifies a CPU microcode blob to load. +###`chain=` + +Specifies an alternate configuration file to use in case the specified section +(and in particular its `kernel=` setting) can't be found in the default (or +specified) configuration file. This is only meaningful in the [global] section +and really not meant to be used together with the `-cfg=` command line option. + Filenames must be specified relative to the location of the EFI binary. Extra options to be passed to Xen can also be specified on the command line, diff -Nru xen-4.2.2/docs/misc/hvm-emulated-unplug.markdown xen-4.3.0/docs/misc/hvm-emulated-unplug.markdown --- xen-4.2.2/docs/misc/hvm-emulated-unplug.markdown 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/misc/hvm-emulated-unplug.markdown 2013-07-09 10:46:56.000000000 +0000 @@ -65,4 +65,4 @@ product number in step 3. The master registry of product names and numbers is in -qemu-xen-unstable's xenstore.c. +xen/include/public/hvm/pvdrivers.h diff -Nru xen-4.2.2/docs/misc/libxl_memory.txt xen-4.3.0/docs/misc/libxl_memory.txt --- xen-4.2.2/docs/misc/libxl_memory.txt 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/misc/libxl_memory.txt 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,70 @@ +/* === Domain memory breakdown: HVM guests ================================== + + + +----------+ + + | | shadow | | + | +----------+ | + overhead | | extra | | + | | external | | + | +----------+ + | + | | extra | | | + | | internal | | | + + +----------+ + | | footprint + | | video | | | | + | +----------+ + + | | xen | + | | | | | | actual | maximum | + | | | | | | target | | + | | guest | | | build | | | + | | | | | start | | | + static | | | | | | | | + maximum | +----------+ | + + + + + | | | | + | | | | + | | balloon | | build + | | | | maximum + | | | | + + +----------+ + + + + extra internal = LIBXL_MAXMEM_CONSTANT + extra external = LIBXL_HVM_EXTRA_MEMORY + shadow = libxl_domain_build_info.shadow_memkb + static maximum = libxl_domain_build_info.max_memkb + video = libxl_domain_build_info.video_memkb + build start = libxl_domain_build_info.target_memkb + libxl_domain_setmaxmem -> xen maximum + libxl_set_memory_target -> actual target + + + === Domain memory breakdown: PV guests ================================== + + + + +----------+ + + overhead | | extra | | + | | external | | + | +----------+ + | + | | extra | | | + | | internal | | | + + +----------+ + + + | | footprint + | | | | | | | xen | + | | | | | | actual | maximum | + | | guest | | | build | target | | + | | | | | start | | | + static | | | | | | | | + maximum | +----------+ | + + + + + | | | | + | | | | + | | balloon | | build + | | | | maximum + | | | | + + +----------+ + + + + extra internal = LIBXL_MAXMEM_CONSTANT + extra external = LIBXL_PV_EXTRA_MEMORY + static maximum = libxl_domain_build_info.max_memkb + build start = libxl_domain_build_info.target_memkb + libxl_domain_setmaxmem -> xen maximum + libxl_set_memory_target -> actual target + + + ========================================================================= */ diff -Nru xen-4.2.2/docs/misc/vtpm.txt xen-4.3.0/docs/misc/vtpm.txt --- xen-4.2.2/docs/misc/vtpm.txt 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/misc/vtpm.txt 2013-07-09 10:46:56.000000000 +0000 @@ -1,152 +1,320 @@ -Copyright: IBM Corporation (C), Intel Corporation -29 June 2006 -Authors: Stefan Berger (IBM), - Employees of Intel Corp - -This document gives a short introduction to the virtual TPM support -in XEN and goes as far as connecting a user domain to a virtual TPM -instance and doing a short test to verify success. It is assumed -that the user is fairly familiar with compiling and installing XEN -and Linux on a machine. +Copyright (c) 2010-2012 United States Government, as represented by +the Secretary of Defense. All rights reserved. +November 12 2012 +Authors: Matthew Fioravante (JHUAPL), Daniel De Graaf (NSA) + +This document describes the virtual Trusted Platform Module (vTPM) subsystem +for Xen. The reader is assumed to have familiarity with building and installing +Xen, Linux, and a basic understanding of the TPM and vTPM concepts. + +------------------------------ +INTRODUCTION +------------------------------ +The goal of this work is to provide a TPM functionality to a virtual guest +operating system (a DomU). This allows programs to interact with a TPM in a +virtual system the same way they interact with a TPM on the physical system. +Each guest gets its own unique, emulated, software TPM. However, each of the +vTPM's secrets (Keys, NVRAM, etc) are managed by a vTPM Manager domain, which +seals the secrets to the Physical TPM. If the process of creating each of these +domains (manager, vTPM, and guest) is trusted, the vTPM subsystem extends the +chain of trust rooted in the hardware TPM to virtual machines in Xen. Each +major component of vTPM is implemented as a separate domain, providing secure +separation guaranteed by the hypervisor. The vTPM domains are implemented in +mini-os to reduce memory and processor overhead. -Production Prerequisites: An x86-based machine machine with a -Linux-supported TPM on the motherboard (NSC, Atmel, Infineon, TPM V1.2). -Development Prerequisites: An emulator for TESTING ONLY is provided - +This mini-os vTPM subsystem was built on top of the previous vTPM +work done by IBM and Intel corporation. + +------------------------------ +DESIGN OVERVIEW +------------------------------ + +The architecture of vTPM is described below: + ++------------------+ +| Linux DomU | ... +| | ^ | +| v | | +| xen-tpmfront | ++------------------+ + | ^ + v | ++------------------+ +| mini-os/tpmback | +| | ^ | +| v | | +| vtpm-stubdom | ... +| | ^ | +| v | | +| mini-os/tpmfront | ++------------------+ + | ^ + v | ++------------------+ +| mini-os/tpmback | +| | ^ | +| v | | +| vtpmmgr-stubdom | +| | ^ | +| v | | +| mini-os/tpm_tis | ++------------------+ + | ^ + v | ++------------------+ +| Hardware TPM | ++------------------+ + * Linux DomU: The Linux based guest that wants to use a vTPM. There many be + more than one of these. + + * xen-tpmfront.ko: Linux kernel virtual TPM frontend driver. This driver + provides vTPM access to a para-virtualized Linux based DomU. + + * mini-os/tpmback: Mini-os TPM backend driver. The Linux frontend driver + connects to this backend driver to facilitate + communications between the Linux DomU and its vTPM. This + driver is also used by vtpmmgr-stubdom to communicate with + vtpm-stubdom. + + * vtpm-stubdom: A mini-os stub domain that implements a vTPM. There is a + one to one mapping between running vtpm-stubdom instances and + logical vtpms on the system. The vTPM Platform Configuration + Registers (PCRs) are all initialized to zero. + + * mini-os/tpmfront: Mini-os TPM frontend driver. The vTPM mini-os domain + vtpm-stubdom uses this driver to communicate with + vtpmmgr-stubdom. This driver could also be used separately to + implement a mini-os domain that wishes to use a vTPM of + its own. + + * vtpmmgr-stubdom: A mini-os domain that implements the vTPM manager. + There is only one vTPM manager and it should be running during + the entire lifetime of the machine. This domain regulates + access to the physical TPM on the system and secures the + persistent state of each vTPM. + + * mini-os/tpm_tis: Mini-os TPM version 1.2 TPM Interface Specification (TIS) + driver. This driver used by vtpmmgr-stubdom to talk directly to + the hardware TPM. Communication is facilitated by mapping + hardware memory pages into vtpmmgr-stubdom. + + * Hardware TPM: The physical TPM that is soldered onto the motherboard. + +------------------------------ +INSTALLATION +------------------------------ + +Prerequisites: +-------------- +You must have an x86 machine with a TPM on the motherboard. +The only software requirement to compiling vTPM is cmake. +You must use libxl to manage domains with vTPMs. 'xm' is +deprecated and does not support vTPM. Compiling the XEN tree: ----------------------- -Compile the XEN tree as usual after the following lines set in the -linux-2.6.??-xen/.config file: - -CONFIG_XEN_TPMDEV_BACKEND=m +Compile and install the XEN tree as usual. Be sure to build and install +the stubdom tree. -CONFIG_TCG_TPM=m -CONFIG_TCG_TIS=m (supported after 2.6.17-rc4) -CONFIG_TCG_NSC=m -CONFIG_TCG_ATMEL=m -CONFIG_TCG_INFINEON=m -CONFIG_TCG_XEN=m - +Compiling the LINUX dom0 kernel: +-------------------------------- -If the frontend driver needs to be compiled into the user domain -kernel, then the following two lines should be changed. +The Linux dom0 kernel should not try accessing the TPM while the vTPM +Manager domain is accessing it; the simplest way to accomplish this is +to ensure the kernel is compiled without a driver for the TPM, or avoid +loading the driver by blacklisting the module. + +Compiling the LINUX domU kernel: +-------------------------------- + +The domU kernel used by domains with vtpms must include the xen-tpmfront.ko +driver. It can be built directly into the kernel or as a module; however, some +features such as IMA require the TPM to be built in to the kernel. CONFIG_TCG_TPM=y CONFIG_TCG_XEN=y +------------------------------ +VTPM MANAGER SETUP +------------------------------ + +Manager disk image setup: +------------------------- + +The vTPM Manager requires a disk image to store its +encrypted data. The image does not require a filesystem +and can live anywhere on the host disk. The image does not need +to be large. 8 to 16 Mb should be sufficient. + +# dd if=/dev/zero of=/var/vtpmmgr-stubdom.img bs=16M count=1 + +Manager config file: +-------------------- + +The vTPM Manager domain (vtpmmgr-stubdom) must be started like +any other Xen virtual machine and requires a config file. +The manager requires a disk image for storage and permission +to access the hardware memory pages for the TPM. An +example configuration looks like the following. + +kernel="/usr/lib/xen/boot/vtpmmgr-stubdom.gz" +memory=16 +disk=["file:/var/vtpmmgr-stubdom.img,hda,w"] +name="vtpmmgr" +iomem=["fed40,5"] + +The iomem line tells xl to allow access to all of the TPM IO memory +pages, which are 5 pages (one per locality) that start at 0xfed40000. By +default, the TPM manager uses locality 0 (so only the page at 0xfed40 is +needed); this can be changed on the domain's command line. + +Starting and stopping the manager: +---------------------------------- + +The vTPM manager should be started at boot, you may wish to +create an init script to do this. + +# xl create -c vtpmmgr-stubdom.cfg + +Once initialization is complete you should see the following: +INFO[VTPM]: Waiting for commands from vTPM's: + +To shutdown the manager you must destroy it. To avoid data corruption, +only destroy the manager when you see the above "Waiting for commands" +message. This ensures the disk is in a consistent state. + +# xl destroy vtpmmgr-stubdom + +------------------------------ +VTPM AND LINUX PVM SETUP +------------------------------ + +In the following examples we will assume we have Linux +guest named "domu" with its associated configuration +located at /home/user/domu. It's vtpm will be named +domu-vtpm. + +vTPM disk image setup: +---------------------- -You must also enable the virtual TPM to be built: +The vTPM requires a disk image to store its persistent +data. The image does not require a filesystem. The image +does not need to be large. 8 Mb should be sufficient. -In Config.mk in the Xen root directory set the line +# dd if=/dev/zero of=/home/user/domu/vtpm.img bs=8M count=1 -VTPM_TOOLS ?= y +vTPM config file: +----------------- -and in +The vTPM domain requires a configuration file like +any other domain. The vTPM requires a disk image for +storage and a TPM frontend driver to communicate +with the manager. An example configuration is given: -tools/vtpm/Rules.mk set the line +kernel="/usr/lib/xen/boot/vtpm-stubdom.gz" +memory=8 +disk=["file:/home/user/domu/vtpm.img,hda,w"] +name="domu-vtpm" +vtpm=["backend=vtpmmgr,uuid=ac0a5b9e-cbe2-4c07-b43b-1d69e46fb839"] -BUILD_EMULATOR = y +The vtpm= line sets up the tpm frontend driver. The backend must set +to vtpmmgr. You are required to generate a uuid for this vtpm. +You can use the uuidgen unix program or some other method to create a +uuid. The uuid uniquely identifies this vtpm to manager. -Now build the Xen sources from Xen's root directory: +If you wish to clear the vTPM data you can either recreate the +disk image or change the uuid. -make install +Linux Guest config file: +------------------------ +The Linux guest config file needs to be modified to include +the Linux tpmfront driver. Add the following line: -Also build the initial RAM disk if necessary. +vtpm=["backend=domu-vtpm"] -Reboot the machine with the created Xen kernel. +Currently only paravirtualized guests are supported. -Note: If you do not want any TPM-related code compiled into your -kernel or built as module then comment all the above lines like -this example: -# CONFIG_TCG_TPM is not set +Launching and shut down: +------------------------ +To launch a Linux guest with a vTPM we first have to start the vTPM domain. -Modifying VM Configuration files: ---------------------------------- +# xl create -c /home/user/domu/vtpm.cfg -VM configuration files need to be adapted to make a TPM instance -available to a user domain. The following VM configuration file is -an example of how a user domain can be configured to have a TPM -available. It works similar to making a network interface -available to a domain. +After initialization is complete, you should see the following: +Info: Waiting for frontend domain to connect.. -kernel = "/boot/vmlinuz-2.6.x" -ramdisk = "/xen/initrd_domU/U1_ramdisk.img" -memory = 32 -name = "TPMUserDomain0" -vtpm = ['instance=1,backend=0'] -root = "/dev/ram0 console=tty ro" -vif = ['backend=0'] +Next, launch the Linux guest -In the above configuration file the line 'vtpm = ...' provides -information about the domain where the virtual TPM is running and -where the TPM backend has been compiled into - this has to be -domain 0 at the moment - and which TPM instance the user domain -is supposed to talk to. Note that each running VM must use a -different instance and that using instance 0 is NOT allowed. The -instance parameter is taken as the desired instance number, but -the actual instance number that is assigned to the virtual machine -can be different. This is the case if for example that particular -instance is already used by another virtual machine. The association -of which TPM instance number is used by which virtual machine is -kept in the file /var/vtpm/vtpm.db. Associations are maintained by -a xend-internal vTPM UUID and vTPM instance number. +# xl create -c /home/user/domu/domu.cfg -Note: If you do not want TPM functionality for your user domain simply -leave out the 'vtpm' line in the configuration file. +If xen-tpmfront was compiled as a module, be sure to load it +in the guest. +# modprobe xen-tpmfront -Running the TPM: ----------------- +After the Linux domain boots and the xen-tpmfront driver is loaded, +you should see the following on the vtpm console: -To run the vTPM, the device /dev/vtpm must be available. -Verify that 'ls -l /dev/vtpm' shows the following output: +Info: VTPM attached to Frontend X/Y -crw------- 1 root root 10, 225 Aug 11 06:58 /dev/vtpm +If you have trousers and tpm_tools installed on the guest, you can test the +vtpm. -If it is not available, run the following command as 'root'. -mknod /dev/vtpm c 10 225 +On guest: +# tcsd (if tcsd is not running already) +# tpm_version -Make sure that the vTPM is running in domain 0. To do this run the -following: +The version command should return the following: + TPM 1.2 Version Info: + Chip Version: 1.2.0.7 + Spec Level: 2 + Errata Revision: 1 + TPM Vendor ID: ETHZ + TPM Version: 01010000 + Manufacturer Info: 4554485a -modprobe tpmbk +You should also see the command being sent to the vtpm console as well +as the vtpm saving its state. You should see the vtpm key being +encrypted and stored on the vtpmmgr console. -/usr/bin/vtpm_managerd +To shutdown the guest and its vtpm, you just have to shutdown the guest +normally. As soon as the guest vm disconnects, the vtpm will shut itself +down automatically. -Start a user domain using the 'xm create' command. Once you are in the -shell of the user domain, you should be able to do the following as -user 'root': +On guest: +# shutdown -h now -Insert the TPM frontend into the kernel if it has been compiled as a -kernel module. +You may wish to write a script to start your vtpm and guest together. -> modprobe tpm_xenu +------------------------------ +INTEGRATION WITH PV-GRUB +------------------------------ -Check the status of the TPM +The vTPM currently starts up with all PCRs set to their default values (all +zeros for the lower 16). This means that any decisions about the +trustworthiness of the created domain must be made based on the environment that +created the vTPM and the domU; for example, a system that only constructs images +using a trusted configuration and guest kernel be able to provide guarantees +about the guests and any measurements done that kernel (such as the IMA TCB +log). Guests wishing to use a custom kernel in such a secure environment are +often started using the pv-grub bootloader as the kernel, which then can load +the untrusted kernel without needing to parse an untrusted filesystem and kernel +in dom0. If the pv-grub stub domain succeeds in connecting to a vTPM, it will +extend the hash of the kernel that it boots into PCR #4, and will extend the +command line and initrd into PCR #5 before booting so that a domU booted in this +way can attest to its early boot state. -> cd /sys/devices/xen/vtpm-0 -> ls -[...] cancel caps pcrs pubek [...] -> cat pcrs -PCR-00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -PCR-01: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -PCR-02: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -PCR-03: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -PCR-04: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -PCR-05: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -PCR-06: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -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 -[...] +------------------------------ +MORE INFORMATION +------------------------------ -At this point the user domain has been successfully connected to its -virtual TPM instance. +See stubdom/vtpmmgr/README for more details about how +the manager domain works, how to use it, and its command line +parameters. -For further information please read the documentation in -tools/vtpm_manager/README and tools/vtpm/README +See stubdom/vtpm/README for more specifics about how vtpm-stubdom +operates and the command line options it accepts. -Stefan Berger and Employees of the Intel Corp diff -Nru xen-4.2.2/docs/misc/xen-command-line.markdown xen-4.3.0/docs/misc/xen-command-line.markdown --- xen-4.2.2/docs/misc/xen-command-line.markdown 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/misc/xen-command-line.markdown 2013-07-09 10:46:56.000000000 +0000 @@ -199,7 +199,7 @@ If set, override Xen's default choice for the platform timer. ### com1,com2 -> `= [/][,DPS[,[,[,[,]]]] | pci | amt ] ` +> `= [/][,[DPS][,[|pci|amt][,[][,[][,[]]]]]]` Both option `com1` and `com2` follow the same format. @@ -244,7 +244,7 @@ Specify the size of the console ring buffer. ### console -> `= List of [ vga | com1[H,L] | com2[H,L] | none ]` +> `= List of [ vga | com1[H,L] | com2[H,L] | dbgp | none ]` > Default: `console=com1,vga` @@ -260,6 +260,8 @@ cleared. This allows a single port to be shared by two subsystems (e.g. console and debugger). +`dbgp` indicates that Xen should use a USB debug port. + `none` indicates that Xen should not use a console. This option only makes sense on its own. @@ -352,6 +354,12 @@ ### credit2\_load\_window\_shift > `= ` +### dbgp +> `= ehci[ | @pci:. ]` + +Specify the USB controller to use, either by instance number (when going +over the PCI busses sequentially) or by PCI device (must be on segment 0). + ### debug\_stack\_lines > `= ` @@ -378,10 +386,33 @@ Specify a list of IO ports to be excluded from dom0 access. ### dom0\_max\_vcpus -> `= ` -Specify the maximum number of vcpus to give to dom0. This defaults -to the number of pcpus on the host. +Either: + +> `= `. + +The number of VCPUs to give to dom0. This number of VCPUs can be more +than the number of PCPUs on the host. The default is the number of +PCPUs. + +Or: + +> `= -` where `` and `` are integers. + +Gives dom0 a number of VCPUs equal to the number of PCPUs, but always +at least `` and no more than ``. Using `` may give +more VCPUs than PCPUs. `` or `` may be omitted and the +defaults of 1 and unlimited respectively are used instead. + +For example, with `dom0_max_vcpus=4-8`: + + Number of + PCPUs | Dom0 VCPUs + 2 | 4 + 4 | 4 + 6 | 6 + 8 | 8 + 10 | 8 ### dom0\_mem > `= List of ( min: | max: | )` @@ -490,6 +521,14 @@ The optional `` option instructs which severities should be rate limited. +### hap +> `= ` + +> Default: `true` + +Flag to globally enable or disable support for Hardware Assisted +Paging (HAP) + ### hap\_1gb > `= ` @@ -503,7 +542,7 @@ > Default: `true` -Flag to enable 1 GB host page table support for Hardware Assisted +Flag to enable 2 MB host page table support for Hardware Assisted Paging (HAP). ### hpetbroadcast @@ -515,6 +554,12 @@ ### hvm\_port80 > `= ` +### highmem-start +> `= ` + +Specify the memory boundary past which memory will be treated as highmem (x86 +debug hypervisor only). + ### idle\_latency\_factor > `= ` @@ -601,6 +646,14 @@ Force Xen to (not) use PCI-MSI, even if ACPI FADT says otherwise. +### mwait-idle +> `= ` + +> Default: `true` + +Use the MWAIT idle driver (with model specific C-state knowledge) instead +of the ACPI based one. + ### nmi > `= ignore | dom0 | fatal` @@ -671,6 +724,16 @@ Default: `on` +### pci-phantom +> `=[:]:,` + +Mark a group of PCI devices as using phantom functions without actually +advertising so, so the IOMMU can create translation contexts for them. + +All numbers specified must be hexadecimal ones. + +This option can be specified more than once (up to 8 times at present). + ### ple\_gap > `= ` @@ -707,9 +770,6 @@ ### sched\_credit2\_migrate\_resist > `= ` -### sched\_credit\_default\_yield -> `= ` - ### sched\_credit\_tslice\_ms > `= ` diff -Nru xen-4.2.2/docs/misc/xenstore-paths.markdown xen-4.3.0/docs/misc/xenstore-paths.markdown --- xen-4.2.2/docs/misc/xenstore-paths.markdown 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/docs/misc/xenstore-paths.markdown 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,367 @@ +# XenStore Paths + +This document attempts to defines all the paths which are in common +use by either guests, front-/back-end drivers, toolstacks etc. + +The XenStore wire protocol itself is described in +[xenstore.txt](xenstore.txt). + +## Notation + +This document is intended to be partially machine readable, such that +test system etc can use it to validate whether the xenstore paths used +by a test are allowable etc. + +Therefore the following notation conventions apply: + +A xenstore path is generically defined as: + + PATH = VALUES [TAGS] + + PATH/* [TAGS] + +The first syntax defines a simple path with a single value. The second +syntax defines an aggregated set of paths which are usually described +externally to this document. The text will give a pointer to the +appropriate external documentation. + +PATH can contain simple regex constructs following the Perl compatible +regexp syntax described in pcre(3) or perlre(1). In addition the +following additional wild card names are defined and are evaluated +before regexp expansion: + +* ~ -- expands to an arbitrary a domain's home path (described below). + Only valid at the begining of a path. +* $DEVID -- a per-device type device identifier. Typically an integer. +* $DOMID -- a domain identifier, an integer. Typically this refers to + the "other" domain. i.e. ~ refers to the domain providing a service + while $DOMID is the consumer of that service. +* $UUID -- a UUID in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + +VALUES are strings and can take the following forms: + +* PATH -- a XenStore path. +* STRING -- an arbitrary string. +* INTEGER -- An integer, in decimal representation unless otherwise + noted. + * MEMKB -- the decimal representation of a number of kilobytes. + * EVTCHN -- the decimal representation of an event channel. + * GNTREF -- the decimal representation of a grant reference. +* "a literal string" -- literal strings are contained within quotes. +* (VALUE | VALUE | ... ) -- a set of alternatives. Alternatives are + separated by a "|" and all the alternatives are enclosed in "(" and + ")". + +Additional TAGS may follow as a comma separated set of the following +tags enclosed in square brackets. + +* w -- Path is writable by the containing domain, that is the domain + whose home path ~ this key is under or which /vm/$UUID refers to. By + default paths under both of these locations are read only for the + domain. +* n -- Path is neither readable nor writeable for guest domains. +* HVM -- Path is valid for HVM domains only +* PV -- Path is valid for PV domains only +* BACKEND -- Path is valid for a backend domain (AKA driver domain) +* INTERNAL -- Although a path is visible to the domain its use is + reserved for the virtual firmware or Xen platform code. Guest + Operating Systems must not read this key or otherwise rely on its + presence or contents. +* DEPRECATED -- This path is deprecated and may be removed in its + current form in the future. Guests should not add new dependencies + on such paths. + +Owning domain means the domain whose home path this tag is found +under. + +Lack of either a __HVM__ or __PV__ tag indicates that the path is +valid for either type of domain (including PVonHVM and similar mixed +domain types). + +## Domain Home Path + +Every domain has a home path within the xenstore hierarchy. This is +the path where the majority of the domain-visible information about +each domain is stored. + +This path is: + + /local/domain/$DOMID + +All non-absolute paths are relative to this path. + +Although this path could be considered a "Home Directory" for the +domain it would not usually be writable by the domain. The tools will +create writable subdirectories as necessary. + +## Per Domain Paths + +## General Paths + +#### ~/vm = PATH [] + +A pointer back to the domain's /vm/$UUID path (described below). + +#### ~/name = STRING [] + +The guests name. + +#### ~/domid = INTEGER [] + +The domain's own ID. + +#### ~/image/device-model-pid = INTEGER [INTERNAL] + +The process ID of the device model associated with this domain, if it +has one. + +#### ~/cpu/[0-9]+/availability = ("online"|"offline") [PV] + +One node for each virtual CPU up to the guest's configured +maximum. Valid values are "online" and "offline". The guest is expected to react to changes in this path by bringing the appropriate VCPU on or offline using the VCPUOP interface described in [xen/include/public/vcpu.h][VCPU] + +This protocol is not currently well documented. + +#### ~/memory/static-max = MEMKB [] + +Specifies a static maximum amount memory which this domain should +expect to be given. In the absence of in-guest memory hotplug support +this set on domain boot and is usually the maximum amount of RAM which +a guest can make use of. See [docs/misc/libxl_memory.txt][LIBXLMEM] +for a description of how memory is accounted for in toolstacks using +the libxl library. + +#### ~/memory/target = MEMKB [] + +The current balloon target for the domain. The balloon driver within +the guest is expected to make every effort to every effort use no more +than this amount of RAM. + +#### ~/memory/videoram = MEMKB [HVM,INTERNAL] + +The size of the video RAM this domain is configured with. + +#### ~/device/suspend/event-channel = ""|EVTCHN [w] + +The domain's suspend event channel. The use of a suspend event channel +is optional at the domain's discretion. The toolstack will create this +path with an empty value which the guest may choose to overwrite. + +#### ~/hvmloader/generation-id-address = ADDRESS [r,HVM,INTERNAL] + +The hexadecimal representation of the address of the domain's +"generation id". + +#### ~/hvmloader/allow-memory-relocate = ("1"|"0") [HVM,INTERNAL] + +If the default low MMIO hole (below 4GiB) is not big enough for all +the devices, this indicates if hvmloader should relocate guest memory +into the high memory region (above 4GiB). If "1", hvmloader will +relocate memory as needed, until 2GiB is reached; if "0", hvmloader +will not relocate guest memory. + +#### ~/hvmloader/bios = ("rombios"|"seabios"|"OVMF") [HVM,INTERNAL] + +The BIOS used by this domain. + +#### ~/platform/* [HVM,INTERNAL] + +Various platform properties. + +* acpi -- is ACPI enabled for this domain +* acpi_s3 -- is ACPI S3 support enabled for this domain +* acpi_s4 -- is ACPI S4 support enabled for this domain + +#### ~/platform/generation-id = INTEGER ":" INTEGER [HVM,INTERNAL] + +Two 64 bit values that represent the Windows Generation ID. +Is used by the BIOS initializer to get this value. +If not present or "0:0" (all zeroes) device will not be present to the machine. + +### Frontend device paths + +Paravirtual device frontends are generally specified by their own +directory within the XenStore hierarchy. Usually this is under +~/device/$TYPE/$DEVID although there are exceptions, e.g. ~/console +for the first PV console. + +#### ~/device/vbd/$DEVID/* [] + +A virtual block device frontend. Described by +[xen/include/public/io/blkif.h][BLKIF] + +#### ~/device/vfb/$DEVID/* [] + +A virtual framebuffer frontend. Described by +[xen/include/public/io/fbif.h][FBIF] + +#### ~/device/vkbd/$DEVID/* [] + +A virtual keyboard device frontend. Described by +[xen/include/public/io/kbdif.h][KBDIF] + +#### ~/device/vif/$DEVID/* [] + +A virtual network device frontend. Described by +[xen/include/public/io/netif.h][NETIF] + +#### ~/console/* [] + +The primary PV console device. Described in [console.txt](console.txt) + +#### ~/device/console/$DEVID/* [] + +A secondary PV console device. Described in [console.txt](console.txt) + +#### ~/device/serial/$DEVID/* [HVM] + +An emulated serial device. Described in [console.txt](console.txt) + +#### ~/store/port = EVTCHN [DEPRECATED] + +The event channel used by the domain's connection to XenStore. + +This path is deprecated since the same information is provided via the +[start_info][SI] for PV guests and as an [HVM param][HVMPARAMS] for +HVM guests. There is an obvious chicken and egg problem with +extracting this value from xenstore in order to setup the xenstore +communication ring. + +#### ~/store/ring-ref = GNTREF [DEPRECATED] + +The grant reference of the domain's XenStore ring. + +As with ~/store/port this path is deprecated. + +### Backend Device Paths + +Paravirtual device backends are generally specified by their own +directory within the XenStore hierarchy. Usually this is under +~/backend/$TYPE/$DOMID/$DEVID. + +#### ~/backend/vbd/$DOMID/$DEVID/* [] + +A virtual block device backend. Described by +[xen/include/public/io/blkif.h][BLKIF] + +Uses the in-kernel blkback driver. + +#### ~/backend/qdisk/$DOMID/$DEVID/* [] + +A virtual block device backend. Described by +[xen/include/public/io/blkif.h][BLKIF] + +Uses the qemu based disk backend. + +#### ~/backend/tap/$DOMID/$DEVID/* [] + +A virtual block device backend. Described by +[xen/include/public/io/blkif.h][BLKIF] + +Uses the in-kernel blktap (v1) disk backend (deprecated). + +#### ~/backend/vfb/$DOMID/$DEVID/* [] + +A virtual framebuffer backend. Described by +[xen/include/public/io/fbif.h][FBIF] + +#### ~/backend/vkbd/$DOMID/$DEVID/* [] + +A virtual keyboard device backend. Described by +[xen/include/public/io/kbdif.h][KBDIF] + +#### ~/backend/vif/$DOMID/$DEVID/* [] + +A virtual network device backend. Described by +[xen/include/public/io/netif.h][NETIF] + +#### ~/backend/console/$DOMID/$DEVID/* [] + +A PV console backend. Described in [console.txt](console.txt) + +#### ~/device-model/$DOMID/* [INTERNAL] + +Information relating to device models running in the domain. $DOMID is +the target domain of the device model. + +#### ~/libxl/disable_udev = ("1"|"0") [] + +Indicates whether device hotplug scripts in this domain should be run +by udev ("0") or will be run by the toolstack directly ("1"). + +### Platform Feature and Control Paths + +#### ~/control/shutdown = (""|COMMAND) [w] + +This is the PV shutdown control node. A toolstack can write various +commands here to cause various guest shutdown, reboot or suspend +activities. The guest acknowledges a request by writing the empty +string back to the command node. + +The precise protocol is not yet documented. + +#### ~/control/platform-feature-multiprocessor-suspend = (0|1) [] + +Indicates to the guest that this platform supports the multiprocessor +suspend feature. + +#### ~/control/platform-feature-xs\_reset\_watches = (0|1) [] + +Indicates to the guest that this platform supports the +XS_RESET_WATCHES xenstore message. See +[xen/include/public/io/xs\_wire.h][XSWIRE] for the XenStore wire +protocol definition. + +### Domain Controlled Paths + +#### ~/data/* [w] + +A domain writable path. Available for arbitrary domain use. + +## Virtual Machine Paths + +The /vm/$UUID namespace is used by toolstacks to store various +information relating to the domain which is not intended to be guest +visible (hence they are all tagged [n,INTERNAL]). + +Several of the keys here are not well defined and/or not well located +and are liable to be replaced with more fully defined paths in the +future. + +### /vm/$UUID/uuid = UUID [n,INTERNAL] + +Value is the same UUID as the path. + +### /vm/$UUID/name = STRING [n,INTERNAL] + +The domain's name. + +### /vm/$UUID/image/* [n,INTERNAL] + +Various information relating to the domain builder used for this guest. + +### /vm/$UUID/start_time = INTEGER "." INTEGER [n,INTERNAL] + +The time which the guest was started in SECONDS.MICROSECONDS format + +### /vm/$UUID/rtc/timeoffset = ""|INTEGER [n,HVM,INTERNAL] + +The guest's virtual time offset from UTC in seconds. + +## Platform-Level paths + +### libxl Specific Paths + +#### /libxl/$DOMID/dm-version ("qemu\_xen"|"qemu\_xen\_traditional") = [n,INTERNAL] + +The device model version for a domain. + +[BLKIF]: http://xenbits.xen.org/docs/unstable/hypercall/include,public,io,blkif.h.html +[FBIF]: http://xenbits.xen.org/docs/unstable/hypercall/include,public,io,fbif.h.html +[HVMPARAMS]: http://xenbits.xen.org/docs/unstable/hypercall/include,public,hvm,params.h.html +[KBDIF]: http://xenbits.xen.org/docs/unstable/hypercall/include,public,io,kbdif.h.html +[LIBXLMEM]: http://xenbits.xen.org/docs/unstable/misc/libxl_memory.txt +[NETIF]: http://xenbits.xen.org/docs/unstable/hypercall/include,public,io,netif.h.html +[SI]: http://xenbits.xen.org/docs/unstable/hypercall/include,public,xen.h.html#Struct_start_info +[VCPU]: http://xenbits.xen.org/docs/unstable/hypercall/include,public,vcpu.h.html +[XSWIRE]: http://xenbits.xen.org/docs/unstable/hypercall/include,public,io,xs_wire.h.html diff -Nru xen-4.2.2/docs/misc/xl-disk-configuration.txt xen-4.3.0/docs/misc/xl-disk-configuration.txt --- xen-4.2.2/docs/misc/xl-disk-configuration.txt 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/misc/xl-disk-configuration.txt 2013-07-09 10:46:56.000000000 +0000 @@ -139,6 +139,18 @@ Convenience alias for "devtype=cdrom". +backend= +--------------------- + +Description: Designates a backend domain for the device +Supported values: Valid domain names +Mandatory: No + +Specifies the backend domain which this device should attach to. This +defaults to domain 0. Specifying another domain requires setting up a +driver domain which is outside the scope of this document. + + backendtype= -------------------------- diff -Nru xen-4.2.2/docs/misc/xl-network-configuration.markdown xen-4.3.0/docs/misc/xl-network-configuration.markdown --- xen-4.2.2/docs/misc/xl-network-configuration.markdown 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/misc/xl-network-configuration.markdown 2013-07-09 10:46:56.000000000 +0000 @@ -67,6 +67,15 @@ your distribution's network configuration tools. See the [wiki][net] for guidance and examples. +### gatewaydev + +Specifies the name of the network interface which has an IP and which +is in the network the VIF should communicate with. This is used in the host +by the vif-route hotplug script. See [wiki][vifroute] for guidance and +examples. + +NOTE: netdev is a deprecated alias of this option. + ### type This keyword is valid for HVM guests only. @@ -158,3 +167,4 @@ [oui]: http://en.wikipedia.org/wiki/Organizationally_Unique_Identifier [net]: http://wiki.xen.org/wiki/HostConfiguration/Networking +[vifroute]: http://wiki.xen.org/wiki/Vif-route diff -Nru xen-4.2.2/docs/misc/xl-numa-placement.markdown xen-4.3.0/docs/misc/xl-numa-placement.markdown --- xen-4.2.2/docs/misc/xl-numa-placement.markdown 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/misc/xl-numa-placement.markdown 2013-07-09 10:46:56.000000000 +0000 @@ -14,22 +14,67 @@ The Xen hypervisor deals with NUMA machines by assigning to each domain a "node affinity", i.e., a set of NUMA nodes of the host from which they -get their memory allocated. +get their memory allocated. Also, even if the node affinity of a domain +is allowed to change on-line, it is very important to "place" the domain +correctly when it is fist created, as the most of its memory is allocated +at that time and can not (for now) be moved easily. NUMA awareness becomes very important as soon as many domains start running memory-intensive workloads on a shared host. In fact, the cost of accessing non node-local memory locations is very high, and the performance degradation is likely to be noticeable. -## Guest Placement in xl ## +For more information, have a look at the [Xen NUMA Introduction][numa_intro] +page on the Wiki. + +### Placing via pinning and cpupools ### + +The simplest way of placing a domain on a NUMA node is statically pinning +the domain's vCPUs to the pCPUs of the node. This goes under the name of +CPU affinity and can be set through the "cpus=" option in the config file +(more about this below). Another option is to pool together the pCPUs +spanning the node and put the domain in such a cpupool with the "pool=" +config option (as documented in our [Wiki][cpupools_howto]). + +In both the above cases, the domain will not be able to execute outside +the specified set of pCPUs for any reasons, even if all those pCPUs are +busy doing something else while there are others, idle, pCPUs. + +So, when doing this, local memory accesses are 100% guaranteed, but that +may come at he cost of some load imbalances. + +### NUMA aware scheduling ### + +If the credit scheduler is in use, the concept of node affinity defined +above does not only apply to memory. In fact, starting from Xen 4.3, the +scheduler always tries to run the domain's vCPUs on one of the nodes in +its node affinity. Only if that turns out to be impossible, it will just +pick any free pCPU. + +This is, therefore, something more flexible than CPU affinity, as a domain +can still run everywhere, it just prefers some nodes rather than others. +Locality of access is less guaranteed than in the pinning case, but that +comes along with better chances to exploit all the host resources (e.g., +the pCPUs). + +In fact, if all the pCPUs in a domain's node affinity are busy, it is +possible for the domain to run outside of there, but it is very likely that +slower execution (due to remote memory accesses) is still better than no +execution at all, as it would happen with pinning. For this reason, NUMA +aware scheduling has the potential of bringing substantial performances +benefits, although this will depend on the workload. + +## Guest placement in xl ## If using xl for creating and managing guests, it is very easy to ask for both manual or automatic placement of them across the host's NUMA nodes. -Note that xm/xend does the very same thing, the only differences residing -in the details of the heuristics adopted for the placement (see below). +Note that xm/xend does a very similar thing, the only differences being +the details of the heuristics adopted for automatic placement (see below), +and the lack of support (in both xm/xend and the Xen versions where that\ +was the default toolstack) for NUMA aware scheduling. -### Manual Guest Placement with xl ### +### Placing the guest manually ### Thanks to the "cpus=" option, it is possible to specify where a domain should be created and scheduled on, directly in its config file. This @@ -41,14 +86,19 @@ administrator to explicitly specify affinities for each and every domain, or Xen won't be able to guarantee the locality for their memory accesses. -It is also possible to deal with NUMA by partitioning the system using -cpupools. Again, this could be "The Right Answer" for many needs and -occasions, but has to be carefully considered and setup by hand. +Notice that this also pins the domain's vCPUs to the specified set of +pCPUs, so it not only sets the domain's node affinity (its memory will +come from the nodes to which the pCPUs belong), but at the same time +forces the vCPUs of the domain to be scheduled on those same pCPUs. -### Automatic Guest Placement with xl ### +### Placing the guest automatically ### If no "cpus=" option is specified in the config file, libxl tries to figure out on its own on which node(s) the domain could fit best. +If it finds one (some), the domain's node affinity get set to there, +and both memory allocations and NUMA aware scheduling (for the credit +scheduler and starting from Xen 4.3) will comply with it. + It is worthwhile noting that optimally fitting a set of VMs on the NUMA nodes of an host is an incarnation of the Bin Packing Problem. In fact, the various VMs with different memory sizes are the items to be packed, @@ -81,7 +131,7 @@ small, and maximizes the probability of being able to put more domains there. -## Guest Placement within libxl ## +## Guest placement in libxl ## xl achieves automatic NUMA placement because that is what libxl does by default. No API is provided (yet) for modifying the behaviour of @@ -93,15 +143,34 @@ libxl_defbool_set(&domain_build_info->numa_placement, false); Also, if `numa_placement` is set to `true`, the domain must not -have any cpu affinity (i.e., `domain_build_info->cpumap` must +have any CPU affinity (i.e., `domain_build_info->cpumap` must have all its bits set, as it is by default), or domain creation will fail returning `ERROR_INVAL`. +Starting from Xen 4.3, in case automatic placement happens (and is +successful), it will affect the domain's node affinity and _not_ its +CPU affinity. Namely, the domain's vCPUs will not be pinned to any +pCPU on the host, but the memory from the domain will come from the +selected node(s) and the NUMA aware scheduling (if the credit scheduler +is in use) will try to keep the domain there as much as possible. + Besides than that, looking and/or tweaking the placement algorithm search "Automatic NUMA placement" in libxl\_internal.h. Note this may change in future versions of Xen/libxl. +## Xen < 4.3 ## + +As NUMA aware scheduling is a new feature of Xen 4.3, things are a little +bit different for earlier version of Xen. If no "cpus=" option is specified +and Xen 4.2 is in use, the automatic placement algorithm still runs, but +the results is used to _pin_ the vCPUs of the domain to the output node(s). +This is consistent with what was happening with xm/xend, which were also +affecting the domain's CPU affinity. + +On a version of Xen earlier than 4.2, there is not automatic placement at +all in xl or libxl, and hence no node or CPU affinity being affected. + ## Limitations ## Analyzing various possible placement solutions is what makes the @@ -109,3 +178,6 @@ it won't scale well to systems with arbitrary number of nodes. For this reason, automatic placement is disabled (with a warning) if it is requested on a host with more than 16 NUMA nodes. + +[numa_intro]: http://wiki.xen.org/wiki/Xen_NUMA_Introduction +[cpupools_howto]: http://wiki.xen.org/wiki/Cpupools_Howto diff -Nru xen-4.2.2/docs/misc/xsm-flask.txt xen-4.3.0/docs/misc/xsm-flask.txt --- xen-4.2.2/docs/misc/xsm-flask.txt 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/misc/xsm-flask.txt 2013-07-09 10:46:56.000000000 +0000 @@ -60,15 +60,51 @@ - domU_t is a domain that can communicate with any other domU_t - isolated_domU_t can only communicate with dom0 - prot_domU_t is a domain type whose creation can be disabled with a boolean + - nomigrate_t is a domain that must be created via the nomigrate_t_building + type, and whose memory cannot be read by dom0 once created HVM domains with stubdomain device models use two types (one per domain): - domHVM_t is an HVM domain that uses a stubdomain device model - dm_dom_t is the device model for a domain with type domHVM_t One disadvantage of using type enforcement to enforce isolation is that a new -type is needed for each group of domains. In addition, it is not possible to -allow isolated_domU_t cannot to create loopback event channels without allowing -two domains of type isolated_domU_t to communicate with one another. +type is needed for each group of domains. The user field can be used to address +this for the most common case of groups that can communicate internally but not +externally; see "Users and roles" below. + +Type transitions +---------------- + +Xen defines a number of operations such as memory mapping that are necessary for +a domain to perform on itself, but are also undesirable to allow a domain to +perform on every other domain of the same label. While it is possible to address +this by only creating one domain per type, this solution significantly limits +the flexibility of the type system. Another method to address this issue is to +duplicate the permission names for every operation that can be performed on the +current domain or on other domains; however, this significantly increases the +necessary number of permissions and complicates the XSM hooks. Instead, this is +addressed by allowing a distinct type to be used for a domain's access to +itself. The same applies for a device model domain's access to its designated +target, allowing the IS_PRIV_FOR checks used in Xen's DAC model to be +implemented in FLASK. + +Upon domain creation (or relabel), a type transition is computed using the +domain's label as the source and target. The result of this computation is used +as the target when the domain accesses itself. In the example policy, this +computed type is the result of appending _self to a domain's type: domU_t_self +for domU_t. If no type transition rule exists, the domain will continue to use +its own label for both the source and target. An AVC message will look like: + + scontext=system_u:system_r:domU_t tcontext=system_u:system_r:domU_t_self + +A similar type transition is done when a device model domain is associated with +its target using the set_target operation. The transition is computed with the +target domain as the source and the device model domain as the target: this +ordering was chosen in order to preserve the original label for the target when +no type transition rule exists. In the example policy, these computed types are +the result of appending _target to the domain. + +Type transitions are also used to compute the labels of event channels. Users and roles --------------- @@ -82,7 +118,8 @@ Access control rules involving users and roles are defined in the policy constraints file (tools/flask/policy/policy/constraints). The example policy provides constraints that prevent different users from communicating using -grants or event channels, while still allowing communication with dom0. +grants or event channels, while still allowing communication with the system_u +user where dom0 resides. Resource Policy --------------- diff -Nru xen-4.2.2/docs/pythfilter.py xen-4.3.0/docs/pythfilter.py --- xen-4.2.2/docs/pythfilter.py 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/pythfilter.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,658 +0,0 @@ -#!/usr/bin/env python - -# pythfilter.py v1.5.5, written by Matthias Baas (baas@ira.uka.de) - -# Doxygen filter which can be used to document Python source code. -# Classes (incl. methods) and functions can be documented. -# Every comment that begins with ## is literally turned into an -# Doxygen comment. Consecutive comment lines are turned into -# comment blocks (-> /** ... */). -# All the stuff is put inside a namespace with the same name as -# the source file. - -# Conversions: -# ============ -# ##-blocks -> /** ... */ -# "class name(base): ..." -> "class name : public base {...}" -# "def name(params): ..." -> "name(params) {...}" - -# Changelog: -# 21.01.2003: Raw (r"") or unicode (u"") doc string will now be properly -# handled. (thanks to Richard Laager for the patch) -# 22.12.2003: Fixed a bug where no function names would be output for "def" -# blocks that were not in a class. -# (thanks to Richard Laager for the patch) -# 12.12.2003: Implemented code to handle static and class methods with -# this logic: Methods with "self" as the first argument are -# non-static. Methods with "cls" are Python class methods, -# which translate into static methods for Doxygen. Other -# methods are assumed to be static methods. As should be -# obvious, this logic doesn't take into account if the method -# is actually setup as a classmethod() or a staticmethod(), -# just if it follows the normal conventions. -# (thanks to Richard Laager for the patch) -# 11.12.2003: Corrected #includes to use os.path.sep instead of ".". Corrected -# namespace code to use "::" instead of ".". -# (thanks to Richard Laager for the patch) -# 11.12.2003: Methods beginning with two underscores that end with -# something other than two underscores are considered private -# and are handled accordingly. -# (thanks to Richard Laager for the patch) -# 03.12.2003: The first parameter of class methods (self) is removed from -# the documentation. -# 03.11.2003: The module docstring will be used as namespace documentation -# (thanks to Joe Bronkema for the patch) -# 08.07.2003: Namespaces get a default documentation so that the namespace -# and its contents will show up in the generated documentation. -# 05.02.2003: Directories will be delted during synchronization. -# 31.01.2003: -f option & filtering entire directory trees. -# 10.08.2002: In base classes the '.' will be replaced by '::' -# 18.07.2002: * and ** will be translated into arguments -# 18.07.2002: Argument lists may contain default values using constructors. -# 18.06.2002: Support for ## public: -# 21.01.2002: from ... import will be translated to "using namespace ...;" -# TODO: "from ... import *" vs "from ... import names" -# TODO: Using normal imports: name.name -> name::name -# 20.01.2002: #includes will be placed in front of the namespace - -###################################################################### - -# The program is written as a state machine with the following states: -# -# - OUTSIDE The current position is outside any comment, -# class definition or function. -# -# - BUILD_COMMENT Begins with first "##". -# Ends with the first token that is no "##" -# at the same column as before. -# -# - BUILD_CLASS_DECL Begins with "class". -# Ends with ":" -# - BUILD_CLASS_BODY Begins just after BUILD_CLASS_DECL. -# The first following token (which is no comment) -# determines indentation depth. -# Ends with a token that has a smaller indendation. -# -# - BUILD_DEF_DECL Begins with "def". -# Ends with ":". -# - BUILD_DEF_BODY Begins just after BUILD_DEF_DECL. -# The first following token (which is no comment) -# determines indentation depth. -# Ends with a token that has a smaller indendation. - -import getopt -import glob -import os.path -import re -import shutil -import string -import sys -import token -import tokenize - -from stat import * - -OUTSIDE = 0 -BUILD_COMMENT = 1 -BUILD_CLASS_DECL = 2 -BUILD_CLASS_BODY = 3 -BUILD_DEF_DECL = 4 -BUILD_DEF_BODY = 5 -IMPORT = 6 -IMPORT_OP = 7 -IMPORT_APPEND = 8 - -# Output file stream -outfile = sys.stdout - -# Output buffer -outbuffer = [] - -out_row = 1 -out_col = 0 - -# Variables used by rec_name_n_param() -name = "" -param = "" -doc_string = "" -record_state = 0 -bracket_counter = 0 - -# Tuple: (row,column) -class_spos = (0,0) -def_spos = (0,0) -import_spos = (0,0) - -# Which import was used? ("import" or "from") -import_token = "" - -# Comment block buffer -comment_block = [] -comment_finished = 0 - -# Imported modules -modules = [] - -# Program state -stateStack = [OUTSIDE] - -# Keep track of whether module has a docstring -module_has_docstring = False - -# Keep track of member protection -protection_level = "public" -private_member = False - -# Keep track of the module namespace -namespace = "" - -###################################################################### -# Output string s. '\n' may only be at the end of the string (not -# somewhere in the middle). -# -# In: s - String -# spos - Startpos -###################################################################### -def output(s,spos, immediate=0): - global outbuffer, out_row, out_col, outfile - - os = string.rjust(s,spos[1]-out_col+len(s)) - - if immediate: - outfile.write(os) - else: - outbuffer.append(os) - - assert -1 == string.find(s[0:-2], "\n"), s - - if (s[-1:]=="\n"): - out_row = out_row+1 - out_col = 0 - else: - out_col = spos[1]+len(s) - - -###################################################################### -# Records a name and parameters. The name is either a class name or -# a function name. Then the parameter is either the base class or -# the function parameters. -# The name is stored in the global variable "name", the parameters -# in "param". -# The variable "record_state" holds the current state of this internal -# state machine. -# The recording is started by calling start_recording(). -# -# In: type, tok -###################################################################### -def rec_name_n_param(type, tok): - global record_state,name,param,doc_string,bracket_counter - s = record_state - # State 0: Do nothing. - if (s==0): - return - # State 1: Remember name. - elif (s==1): - name = tok - record_state = 2 - # State 2: Wait for opening bracket or colon - elif (s==2): - if (tok=='('): - bracket_counter = 1 - record_state=3 - if (tok==':'): record_state=4 - # State 3: Store parameter (or base class) and wait for an ending bracket - elif (s==3): - if (tok=='*' or tok=='**'): - tok='' - if (tok=='('): - bracket_counter = bracket_counter+1 - if (tok==')'): - bracket_counter = bracket_counter-1 - if bracket_counter==0: - record_state=4 - else: - param=param+tok - # State 4: Look for doc string - elif (s==4): - if (type==token.NEWLINE or type==token.INDENT or type==token.SLASHEQUAL): - return - elif (tok==":"): - return - elif (type==token.STRING): - while tok[:1]=='r' or tok[:1]=='u': - tok=tok[1:] - while tok[:1]=='"': - tok=tok[1:] - while tok[-1:]=='"': - tok=tok[:-1] - doc_string=tok - record_state=0 - -###################################################################### -# Starts the recording of a name & param part. -# The function rec_name_n_param() has to be fed with tokens. After -# the necessary tokens are fed the name and parameters can be found -# in the global variables "name" und "param". -###################################################################### -def start_recording(): - global record_state,param,name, doc_string - record_state=1 - name="" - param="" - doc_string="" - -###################################################################### -# Test if recording is finished -###################################################################### -def is_recording_finished(): - global record_state - return record_state==0 - -###################################################################### -## Gather comment block -###################################################################### -def gather_comment(type,tok,spos): - global comment_block,comment_finished - if (type!=tokenize.COMMENT): - comment_finished = 1 - else: - # Output old comment block if a new one is started. - if (comment_finished): - print_comment(spos) - comment_finished=0 - if (tok[0:2]=="##" and tok[0:3]!="###"): - append_comment_lines(tok[2:]) - -###################################################################### -## Output comment block and empty buffer. -###################################################################### -def print_comment(spos): - global comment_block,comment_finished - if (comment_block!=[]): - output("/** ",spos) - for c in comment_block: - output(c,spos) - output("*/\n",spos) - comment_block = [] - comment_finished = 0 - -###################################################################### -def set_state(s): - global stateStack - stateStack[len(stateStack)-1]=s - -###################################################################### -def get_state(): - global stateStack - return stateStack[len(stateStack)-1] - -###################################################################### -def push_state(s): - global stateStack - stateStack.append(s) - -###################################################################### -def pop_state(): - global stateStack - stateStack.pop() - - -###################################################################### -def tok_eater(type, tok, spos, epos, line): - global stateStack,name,param,class_spos,def_spos,import_spos - global doc_string, modules, import_token, module_has_docstring - global protection_level, private_member - global out_row - - while out_row + 1 < spos[0]: - output("\n", (0, 0)) - - rec_name_n_param(type,tok) - if (string.replace(string.strip(tok)," ","")=="##private:"): - protection_level = "private" - output("private:\n",spos) - elif (string.replace(string.strip(tok)," ","")=="##protected:"): - protection_level = "protected" - output("protected:\n",spos) - elif (string.replace(string.strip(tok)," ","")=="##public:"): - protection_level = "public" - output("public:\n",spos) - else: - gather_comment(type,tok,spos) - - state = get_state() - -# sys.stderr.write("%d: %s\n"%(state, tok)) - - # OUTSIDE - if (state==OUTSIDE): - if (tok=="class"): - start_recording() - class_spos = spos - push_state(BUILD_CLASS_DECL) - elif (tok=="def"): - start_recording() - def_spos = spos - push_state(BUILD_DEF_DECL) - elif (tok=="import") or (tok=="from"): - import_token = tok - import_spos = spos - modules = [] - push_state(IMPORT) - elif (spos[1] == 0 and tok[:3] == '"""'): - # Capture module docstring as namespace documentation - module_has_docstring = True - append_comment_lines("\\namespace %s\n" % namespace) - append_comment_lines(tok[3:-3]) - print_comment(spos) - - # IMPORT - elif (state==IMPORT): - if (type==token.NAME): - modules.append(tok) - set_state(IMPORT_OP) - # IMPORT_OP - elif (state==IMPORT_OP): - if (tok=="."): - set_state(IMPORT_APPEND) - elif (tok==","): - set_state(IMPORT) - else: - for m in modules: - output('#include "'+m.replace('.',os.path.sep)+'.py"\n', import_spos, immediate=1) - if import_token=="from": - output('using namespace '+m.replace('.', '::')+';\n', import_spos) - pop_state() - # IMPORT_APPEND - elif (state==IMPORT_APPEND): - if (type==token.NAME): - modules[len(modules)-1]+="."+tok - set_state(IMPORT_OP) - # BUILD_CLASS_DECL - elif (state==BUILD_CLASS_DECL): - if (is_recording_finished()): - s = "class "+name - if (param!=""): s = s+" : public "+param.replace('.','::') - if (doc_string!=""): - append_comment_lines(doc_string) - print_comment(class_spos) - output(s+"\n",class_spos) - output("{\n",(class_spos[0]+1,class_spos[1])) - protection_level = "public" - output(" public:\n",(class_spos[0]+2,class_spos[1])) - set_state(BUILD_CLASS_BODY) - # BUILD_CLASS_BODY - elif (state==BUILD_CLASS_BODY): - if (type!=token.INDENT and type!=token.NEWLINE and type!=40 and - type!=tokenize.NL and type!=tokenize.COMMENT and - (spos[1]<=class_spos[1])): - output("}; // end of class\n",(out_row+1,class_spos[1])) - pop_state() - elif (tok=="def"): - start_recording() - def_spos = spos - push_state(BUILD_DEF_DECL) - # BUILD_DEF_DECL - elif (state==BUILD_DEF_DECL): - if (is_recording_finished()): - param = param.replace("\n", " ") - param = param.replace("=", " = ") - params = param.split(",") - if BUILD_CLASS_BODY in stateStack: - if len(name) > 1 \ - and name[0:2] == '__' \ - and name[len(name)-2:len(name)] != '__' \ - and protection_level != 'private': - private_member = True - output(" private:\n",(def_spos[0]+2,def_spos[1])) - - if (doc_string != ""): - append_comment_lines(doc_string) - - print_comment(def_spos) - - output_function_decl(name, params) -# output("{\n",(def_spos[0]+1,def_spos[1])) - set_state(BUILD_DEF_BODY) - # BUILD_DEF_BODY - elif (state==BUILD_DEF_BODY): - if (type!=token.INDENT and type!=token.NEWLINE \ - and type!=40 and type!=tokenize.NL \ - and (spos[1]<=def_spos[1])): -# output("} // end of method/function\n",(out_row+1,def_spos[1])) - if private_member and protection_level != 'private': - private_member = False - output(" " + protection_level + ":\n",(def_spos[0]+2,def_spos[1])) - pop_state() -# else: -# output(tok,spos) - - -def output_function_decl(name, params): - global def_spos - - # Do we document a class method? then remove the 'self' parameter - if params[0] == 'self': - preamble = '' - params = params[1:] - else: - preamble = 'static ' - if params[0] == 'cls': - params = params[1:] - - param_string = string.join(params, ", Type ") - - if param_string == '': - param_string = '(' + param_string + ');\n' - else: - param_string = '(Type ' + param_string + ');\n' - - output(preamble, def_spos) - output(name, def_spos) - output(param_string, def_spos) - - -def append_comment_lines(lines): - map(append_comment_line, doc_string.split('\n')) - -paramRE = re.compile(r'(@param \w+):') - -def append_comment_line(line): - global paramRE - - comment_block.append(paramRE.sub(r'\1', line) + '\n') - -def dump(filename): - f = open(filename) - r = f.readlines() - for s in r: - sys.stdout.write(s) - -def filter(filename): - global name, module_has_docstring, source_root - - path,name = os.path.split(filename) - root,ext = os.path.splitext(name) - - if source_root and path.find(source_root) == 0: - path = path[len(source_root):] - - if path[0] == os.sep: - path = path[1:] - - ns = path.split(os.sep) - else: - ns = [] - - ns.append(root) - - for n in ns: - output("namespace " + n + " {\n",(0,0)) - - # set module name for tok_eater to use if there's a module doc string - name = root - -# sys.stderr.write('Filtering "'+filename+'"...') - f = open(filename) - tokenize.tokenize(f.readline, tok_eater) - f.close() - print_comment((0,0)) - - output("\n",(0,0)) - - for n in ns: - output("} // end of namespace\n",(0,0)) - - if not module_has_docstring: - # Put in default namespace documentation - output('/** \\namespace '+root+' \n',(0,0)) - output(' \\brief Module "%s" */\n'%(root),(0,0)) - - for s in outbuffer: - outfile.write(s) - - -def filterFile(filename, out=sys.stdout): - global outfile - - outfile = out - - try: - root,ext = os.path.splitext(filename) - - if ext==".py": - filter(filename) - else: - dump(filename) - -# sys.stderr.write("OK\n") - except IOError,e: - sys.stderr.write(e[1]+"\n") - - -###################################################################### - -# preparePath -def preparePath(path): - """Prepare a path. - - Checks if the path exists and creates it if it does not exist. - """ - if not os.path.exists(path): - parent = os.path.dirname(path) - if parent!="": - preparePath(parent) - os.mkdir(path) - -# isNewer -def isNewer(file1,file2): - """Check if file1 is newer than file2. - - file1 must be an existing file. - """ - if not os.path.exists(file2): - return True - return os.stat(file1)[ST_MTIME]>os.stat(file2)[ST_MTIME] - -# convert -def convert(srcpath, destpath): - """Convert a Python source tree into a C+ stub tree. - - All *.py files in srcpath (including sub-directories) are filtered - and written to destpath. If destpath exists, only the files - that have been modified are filtered again. Files that were deleted - from srcpath are also deleted in destpath if they are still present. - The function returns the number of processed *.py files. - """ - count=0 - sp = os.path.join(srcpath,"*") - sfiles = glob.glob(sp) - dp = os.path.join(destpath,"*") - dfiles = glob.glob(dp) - leftovers={} - for df in dfiles: - leftovers[os.path.basename(df)]=1 - - for srcfile in sfiles: - basename = os.path.basename(srcfile) - if basename in leftovers: - del leftovers[basename] - - # Is it a subdirectory? - if os.path.isdir(srcfile): - sdir = os.path.join(srcpath,basename) - ddir = os.path.join(destpath,basename) - count+=convert(sdir, ddir) - continue - # Check the extension (only *.py will be converted) - root, ext = os.path.splitext(srcfile) - if ext.lower()!=".py": - continue - - destfile = os.path.join(destpath,basename) - if destfile==srcfile: - print "WARNING: Input and output names are identical!" - sys.exit(1) - - count+=1 -# sys.stdout.write("%s\015"%(srcfile)) - - if isNewer(srcfile, destfile): - preparePath(os.path.dirname(destfile)) -# out=open(destfile,"w") -# filterFile(srcfile, out) -# out.close() - os.system("python %s -f %s>%s"%(sys.argv[0],srcfile,destfile)) - - # Delete obsolete files in destpath - for df in leftovers: - dname=os.path.join(destpath,df) - if os.path.isdir(dname): - try: - shutil.rmtree(dname) - except: - print "Can't remove obsolete directory '%s'"%dname - else: - try: - os.remove(dname) - except: - print "Can't remove obsolete file '%s'"%dname - - return count - - -###################################################################### -###################################################################### -###################################################################### - -filter_file = False -source_root = None - -try: - opts, args = getopt.getopt(sys.argv[1:], "hfr:", ["help"]) -except getopt.GetoptError,e: - print e - sys.exit(1) - -for o,a in opts: - if o=="-f": - filter_file = True - - if o=="-r": - source_root = os.path.abspath(a) - -if filter_file: - # Filter the specified file and print the result to stdout - filename = string.join(args) - filterFile(os.path.abspath(filename)) -else: - - if len(args)!=2: - sys.stderr.write("%s options input output\n"%(os.path.basename(sys.argv[0]))) - sys.exit(1) - - # Filter an entire Python source tree - print '"%s" -> "%s"\n'%(args[0],args[1]) - c=convert(args[0],args[1]) - print "%d files"%(c) - diff -Nru xen-4.2.2/docs/xen-api/Makefile xen-4.3.0/docs/xen-api/Makefile --- xen-4.2.2/docs/xen-api/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -#!/usr/bin/make -f - -XEN_ROOT=$(CURDIR)/../.. -include $(XEN_ROOT)/Config.mk -include $(XEN_ROOT)/docs/Docs.mk - - -TEX := $(wildcard *.tex) -EPS := $(wildcard *.eps) -EPSDOT := $(patsubst %.dot,%.eps,$(wildcard *.dot)) - -.PHONY: all -all: build - -.PHONY: build -build: xenapi.pdf xenapi.ps - -install: - $(INSTALL_DIR) $(DESTDIR)$(DOCDIR)/ps - $(INSTALL_DIR) $(DESTDIR)$(DOCDIR)/pdf - - [ -e xenapi.ps ] && cp xenapi.ps $(DESTDIR)$(DOCDIR)/ps || true - [ -e xenapi.pdf ] && cp xenapi.pdf $(DESTDIR)$(DOCDIR)/pdf || true - -xenapi.dvi: $(TEX) $(EPS) $(EPSDOT) - $(LATEX) xenapi.tex - $(LATEX) xenapi.tex - rm -f *.aux *.log - -%.pdf: %.ps - $(PS2PDF) $< $@ - -%.ps: %.dvi - $(DVIPS) $< -o $@ - -%.eps: %.dot - $(DOT) -Tps $< >$@ - -xenapi-datamodel-graph.eps: xenapi-datamodel-graph.dot - $(NEATO) -Goverlap=false -Tps $< >$@ - -.PHONY: clean -clean: - rm -f *.pdf *.ps *.dvi *.aux *.log *.out $(EPSDOT) diff -Nru xen-4.2.2/docs/xen-api/bibliography.tex xen-4.3.0/docs/xen-api/bibliography.tex --- xen-4.2.2/docs/xen-api/bibliography.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/bibliography.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -\begin{thebibliography}{9} -\bibitem[RFC2397]{RFC2397} -Masinter L., \textbf{The "data" URL scheme}, RFC 2397, August 1998, -Network Working Group, http://www.ietf.org/rfc/rfc2397.txt -\end{thebibliography} diff -Nru xen-4.2.2/docs/xen-api/coversheet.tex xen-4.3.0/docs/xen-api/coversheet.tex --- xen-4.2.2/docs/xen-api/coversheet.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/coversheet.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -% -% Copyright (c) 2006-2007 XenSource, Inc. -% -% Permission is granted to copy, distribute and/or modify this document under -% the terms of the GNU Free Documentation License, Version 1.2 or any later -% version published by the Free Software Foundation; with no Invariant -% Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the -% license is included in the section entitled -% "GNU Free Documentation License" or the file fdl.tex. -% -% Authors: Ewan Mellor, Richard Sharp, Dave Scott, Jon Harrop. -% - -\pagestyle{empty} - -\doctitle{} \hfill \revstring{} - -\vspace{1cm} - -\begin{center} -\resizebox{8cm}{!}{\includegraphics{\coversheetlogo}} - -\vspace{2cm} - -\begin{Huge} - \doctitle{} -\end{Huge} - -\vspace{1cm} -\begin{Large} -Version: \revstring{}\\ -Date: \datestring{} -\\ -\releasestatement{} - -\vspace{1cm} -\begin{tabular}{rl} -\docauthors{} -\end{tabular} -\end{Large} -\end{center} -\vspace{.5cm} -\begin{large} -\textbf{Contributors:} \\ -\\ -\begin{tabular}{p{0.5\textwidth}l} -Stefan Berger, IBM & Vincent Hanquez, XenSource \\ -Daniel Berrang\'e, Red Hat & John Levon, Sun Microsystems \\ -Gareth Bestor, IBM & Jon Ludlam, XenSource \\ -Hollis Blanchard, IBM & Alastair Tse, XenSource \\ -Mike Day, IBM & Daniel Veillard, Red Hat \\ -Jim Fehlig, Novell & Tom Wilkie, University of Cambridge \\ -Jon Harrop, XenSource & Yosuke Iwamatsu, NEC \\ -Masaki Kanno, FUJITSU \\ -Lutz Dube, FUJITSU TECHNOLOGY SOLUTIONS \\ -\end{tabular} -\end{large} - -\vfill - -\noindent -\legalnotice{} - -\newpage -\pagestyle{fancy} diff -Nru xen-4.2.2/docs/xen-api/fdl.tex xen-4.3.0/docs/xen-api/fdl.tex --- xen-4.2.2/docs/xen-api/fdl.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/fdl.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,488 +0,0 @@ -\chapter{GNU Free Documentation License} -%\label{label_fdl} - - \begin{center} - - Version 1.2, November 2002 - - - Copyright \copyright 2000,2001,2002 Free Software Foundation, Inc. - - \bigskip - - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - \bigskip - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. -\end{center} - - -\begin{center} -{\bf\large Preamble} -\end{center} - -The purpose of this License is to make a manual, textbook, or other -functional and useful document "free" in the sense of freedom: to -assure everyone the effective freedom to copy and redistribute it, -with or without modifying it, either commercially or noncommercially. -Secondarily, this License preserves for the author and publisher a way -to get credit for their work, while not being considered responsible -for modifications made by others. - -This License is a kind of "copyleft", which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. - - -\begin{center} -{\Large\bf 1. APPLICABILITY AND DEFINITIONS} -\addcontentsline{toc}{section}{1. APPLICABILITY AND DEFINITIONS} -\end{center} - -This License applies to any manual or other work, in any medium, that -contains a notice placed by the copyright holder saying it can be -distributed under the terms of this License. Such a notice grants a -world-wide, royalty-free license, unlimited in duration, to use that -work under the conditions stated herein. The \textbf{"Document"}, below, -refers to any such manual or work. Any member of the public is a -licensee, and is addressed as \textbf{"you"}. You accept the license if you -copy, modify or distribute the work in a way requiring permission -under copyright law. - -A \textbf{"Modified Version"} of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. - -A \textbf{"Secondary Section"} is a named appendix or a front-matter section of -the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall subject -(or to related matters) and contains nothing that could fall directly -within that overall subject. (Thus, if the Document is in part a -textbook of mathematics, a Secondary Section may not explain any -mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. - -The \textbf{"Invariant Sections"} are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. If a -section does not fit the above definition of Secondary then it is not -allowed to be designated as Invariant. The Document may contain zero -Invariant Sections. If the Document does not identify any Invariant -Sections then there are none. - -The \textbf{"Cover Texts"} are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. A Front-Cover Text may -be at most 5 words, and a Back-Cover Text may be at most 25 words. - -A \textbf{"Transparent"} copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, that is suitable for revising the document -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup, or absence of markup, has been arranged to thwart -or discourage subsequent modification by readers is not Transparent. -An image format is not Transparent if used for any substantial amount -of text. A copy that is not "Transparent" is called \textbf{"Opaque"}. - -Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input format, SGML -or XML using a publicly available DTD, and standard-conforming simple -HTML, PostScript or PDF designed for human modification. Examples of -transparent image formats include PNG, XCF and JPG. Opaque formats -include proprietary formats that can be read and edited only by -proprietary word processors, SGML or XML for which the DTD and/or -processing tools are not generally available, and the -machine-generated HTML, PostScript or PDF produced by some word -processors for output purposes only. - -The \textbf{"Title Page"} means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, "Title Page" means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. - -A section \textbf{"Entitled XYZ"} means a named subunit of the Document whose -title either is precisely XYZ or contains XYZ in parentheses following -text that translates XYZ in another language. (Here XYZ stands for a -specific section name mentioned below, such as \textbf{"Acknowledgements"}, -\textbf{"Dedications"}, \textbf{"Endorsements"}, or \textbf{"History"}.) -To \textbf{"Preserve the Title"} -of such a section when you modify the Document means that it remains a -section "Entitled XYZ" according to this definition. - -The Document may include Warranty Disclaimers next to the notice which -states that this License applies to the Document. These Warranty -Disclaimers are considered to be included by reference in this -License, but only as regards disclaiming warranties: any other -implication that these Warranty Disclaimers may have is void and has -no effect on the meaning of this License. - - -\begin{center} -{\Large\bf 2. VERBATIM COPYING} -\addcontentsline{toc}{section}{2. VERBATIM COPYING} -\end{center} - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. - - -\begin{center} -{\Large\bf 3. COPYING IN QUANTITY} -\addcontentsline{toc}{section}{3. COPYING IN QUANTITY} -\end{center} - - -If you publish printed copies (or copies in media that commonly have -printed covers) of the Document, numbering more than 100, and the -Document's license notice requires Cover Texts, you must enclose the -copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a computer-network location from which the general network-using -public has access to download using public-standard network protocols -a complete Transparent copy of the Document, free of added material. -If you use the latter option, you must take reasonably prudent steps, -when you begin distribution of Opaque copies in quantity, to ensure -that this Transparent copy will remain thus accessible at the stated -location until at least one year after the last time you distribute an -Opaque copy (directly or through your agents or retailers) of that -edition to the public. - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. - - -\begin{center} -{\Large\bf 4. MODIFICATIONS} -\addcontentsline{toc}{section}{4. MODIFICATIONS} -\end{center} - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: - -\begin{itemize} -\item[A.] - Use in the Title Page (and on the covers, if any) a title distinct - from that of the Document, and from those of previous versions - (which should, if there were any, be listed in the History section - of the Document). You may use the same title as a previous version - if the original publisher of that version gives permission. - -\item[B.] - List on the Title Page, as authors, one or more persons or entities - responsible for authorship of the modifications in the Modified - Version, together with at least five of the principal authors of the - Document (all of its principal authors, if it has fewer than five), - unless they release you from this requirement. - -\item[C.] - State on the Title page the name of the publisher of the - Modified Version, as the publisher. - -\item[D.] - Preserve all the copyright notices of the Document. - -\item[E.] - Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices. - -\item[F.] - Include, immediately after the copyright notices, a license notice - giving the public permission to use the Modified Version under the - terms of this License, in the form shown in the Addendum below. - -\item[G.] - Preserve in that license notice the full lists of Invariant Sections - and required Cover Texts given in the Document's license notice. - -\item[H.] - Include an unaltered copy of this License. - -\item[I.] - Preserve the section Entitled "History", Preserve its Title, and add - to it an item stating at least the title, year, new authors, and - publisher of the Modified Version as given on the Title Page. If - there is no section Entitled "History" in the Document, create one - stating the title, year, authors, and publisher of the Document as - given on its Title Page, then add an item describing the Modified - Version as stated in the previous sentence. - -\item[J.] - Preserve the network location, if any, given in the Document for - public access to a Transparent copy of the Document, and likewise - the network locations given in the Document for previous versions - it was based on. These may be placed in the "History" section. - You may omit a network location for a work that was published at - least four years before the Document itself, or if the original - publisher of the version it refers to gives permission. - -\item[K.] - For any section Entitled "Acknowledgements" or "Dedications", - Preserve the Title of the section, and preserve in the section all - the substance and tone of each of the contributor acknowledgements - and/or dedications given therein. - -\item[L.] - Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section titles. - -\item[M.] - Delete any section Entitled "Endorsements". Such a section - may not be included in the Modified Version. - -\item[N.] - Do not retitle any existing section to be Entitled "Endorsements" - or to conflict in title with any Invariant Section. - -\item[O.] - Preserve any Warranty Disclaimers. -\end{itemize} - -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. - -You may add a section Entitled "Endorsements", provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. - - -\begin{center} -{\Large\bf 5. COMBINING DOCUMENTS} -\addcontentsline{toc}{section}{5. COMBINING DOCUMENTS} -\end{center} - - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice, and that you preserve all their Warranty Disclaimers. - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. - -In the combination, you must combine any sections Entitled "History" -in the various original documents, forming one section Entitled -"History"; likewise combine any sections Entitled "Acknowledgements", -and any sections Entitled "Dedications". You must delete all sections -Entitled "Endorsements". - -\begin{center} -{\Large\bf 6. COLLECTIONS OF DOCUMENTS} -\addcontentsline{toc}{section}{6. COLLECTIONS OF DOCUMENTS} -\end{center} - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. - - -\begin{center} -{\Large\bf 7. AGGREGATION WITH INDEPENDENT WORKS} -\addcontentsline{toc}{section}{7. AGGREGATION WITH INDEPENDENT WORKS} -\end{center} - - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, is called an "aggregate" if the copyright -resulting from the compilation is not used to limit the legal rights -of the compilation's users beyond what the individual works permit. -When the Document is included in an aggregate, this License does not -apply to the other works in the aggregate which are not themselves -derivative works of the Document. - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one half of -the entire aggregate, the Document's Cover Texts may be placed on -covers that bracket the Document within the aggregate, or the -electronic equivalent of covers if the Document is in electronic form. -Otherwise they must appear on printed covers that bracket the whole -aggregate. - - -\begin{center} -{\Large\bf 8. TRANSLATION} -\addcontentsline{toc}{section}{8. TRANSLATION} -\end{center} - - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License, and all the license notices in the -Document, and any Warranty Disclaimers, provided that you also include -the original English version of this License and the original versions -of those notices and disclaimers. In case of a disagreement between -the translation and the original version of this License or a notice -or disclaimer, the original version will prevail. - -If a section in the Document is Entitled "Acknowledgements", -"Dedications", or "History", the requirement (section 4) to Preserve -its Title (section 1) will typically require changing the actual -title. - - -\begin{center} -{\Large\bf 9. TERMINATION} -\addcontentsline{toc}{section}{9. TERMINATION} -\end{center} - - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. - - -\begin{center} -{\Large\bf 10. FUTURE REVISIONS OF THIS LICENSE} -\addcontentsline{toc}{section}{10. FUTURE REVISIONS OF THIS LICENSE} -\end{center} - - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -http://www.gnu.org/copyleft/. - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License "or any later version" applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. - - -\begin{center} -{\Large\bf ADDENDUM: How to use this License for your documents} -\addcontentsline{toc}{section}{ADDENDUM: How to use this License for your documents} -\end{center} - -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: - -\bigskip -\begin{quote} - Copyright \copyright YEAR YOUR NAME. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.2 - or any later version published by the Free Software Foundation; - with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. - A copy of the license is included in the section entitled "GNU - Free Documentation License". -\end{quote} -\bigskip - -If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, -replace the "with...Texts." line with this: - -\bigskip -\begin{quote} - with the Invariant Sections being LIST THEIR TITLES, with the - Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. -\end{quote} -\bigskip - -If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. - -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. diff -Nru xen-4.2.2/docs/xen-api/presentation.tex xen-4.3.0/docs/xen-api/presentation.tex --- xen-4.2.2/docs/xen-api/presentation.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/presentation.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,146 +0,0 @@ -% -% Copyright (c) 2006-2007 XenSource, Inc. -% -% Permission is granted to copy, distribute and/or modify this document under -% the terms of the GNU Free Documentation License, Version 1.2 or any later -% version published by the Free Software Foundation; with no Invariant -% Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the -% license is included in the section entitled -% "GNU Free Documentation License" or the file fdl.tex. -% -% Authors: Ewan Mellor, Richard Sharp, Dave Scott, Jon Harrop. -% - -The API is presented here as a set of Remote Procedure Calls, with a wire -format based upon XML-RPC. No specific language bindings are prescribed, -although examples will be given in the python programming language. - -Although we adopt some terminology from object-oriented programming, -future client language bindings may or may not be object oriented. -The API reference uses the terminology {\em classes\/} and {\em objects\/}. -For our purposes a {\em class\/} is simply a hierarchical namespace; -an {\em object\/} is an instance of a class with its fields set to -specific values. Objects are persistent and exist on the server-side. -Clients may obtain opaque references to these server-side objects and then -access their fields via get/set RPCs. - -%In each class there is a $\mathit{uid}$ field that assigns an indentifier -%to each object. This $\mathit{uid}$ serves as an object reference -%on both client- and server-side, and is often included as an argument in -%RPC messages. - -For each class we specify a list of -fields along with their {\em types\/} and {\em qualifiers\/}. A -qualifier is one of: -\begin{itemize} - \item $\mathit{RO}_\mathit{run}$: the field is Read -Only. Furthermore, its value is automatically computed at runtime. -For example: current CPU load and disk IO throughput. - \item $\mathit{RO}_\mathit{ins}$: the field must be manually set -when a new object is created, but is then Read Only for -the duration of the object's life. -For example, the maximum memory addressable by a guest is set -before the guest boots. - \item $\mathit{RW}$: the field is Read/Write. For example, the name -of a VM. -\end{itemize} - -A full list of types is given in Chapter~\ref{api-reference}. However, -there are three types that require explicit mention: -\begin{itemize} - \item $t~\mathit{Ref}$: signifies a reference to an object -of type $t$. - \item $t~\mathit{Set}$: signifies a set containing -values of type $t$. - \item $(t_1, t_2)~\mathit{Map}$: signifies a mapping from values of -type $t_1$ to values of type $t_2$. -\end{itemize} - -Note that there are a number of cases where {\em Ref}s are {\em doubly -linked\/}---e.g.\ a VM has a field called {\tt VIFs} of type -$(\mathit{VIF}~\mathit{Ref})~\mathit{Set}$; this field lists -the network interfaces attached to a particular VM. Similarly, the VIF -class has a field called {\tt VM} of type $(\mathit{VM}~{\mathit -Ref})$ which references the VM to which the interface is connected. -These two fields are {\em bound together\/}, in the sense that -creating a new VIF causes the {\tt VIFs} field of the corresponding -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 -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). - -\section{RPCs associated with fields} - -Each field, {\tt f}, has an RPC accessor associated with it -that returns {\tt f}'s value: -\begin{itemize} -\item ``{\tt get\_f(Ref x)}'': takes a -{\tt Ref} that refers to an object and returns the value of {\tt f}. -\end{itemize} - -Each field, {\tt f}, with attribute -{\em RW} and whose outermost type is {\em Set\/} has the following -additional RPCs associated with it: -\begin{itemize} -\item an ``{\tt add\_to\_f(Ref x, v)}'' RPC adds a new element v to the set\footnote{ -% -Since sets cannot contain duplicate values this operation has no action in the case -that {\tt v} was already in the set. -% -}; -\item a ``{\tt remove\_from\_f(Ref x, v)}'' RPC removes element {\tt v} from the set; -\end{itemize} - -Each field, {\tt f}, with attribute -{\em RW} and whose outermost type is {\em Map\/} has the following -additional RPCs associated with it: -\begin{itemize} -\item an ``{\tt add\_to\_f(Ref x, k, v)}'' RPC adds new pair {\tt (k, v)} -to the mapping stored in {\tt f} in object {\tt x}. Adding a new pair for duplicate -key, {\tt k}, overwrites any previous mapping for {\tt k}. -\item a ``{\tt remove\_from\_f(Ref x, k)}'' RPC removes the pair with key {\tt k} -from the mapping stored in {\tt f} in object {\tt x}. -\end{itemize} - -Each field whose outermost type is neither {\em Set\/} nor {\em Map\/}, -but whose attribute is {\em RW} has an RPC acessor associated with it -that sets its value: -\begin{itemize} -\item For {\em RW\/} ({\em R\/}ead/{\em -W\/}rite), a ``{\tt set\_f(Ref x, v)}'' RPC function is also provided. -This sets field {\tt f} on object {\tt x} to value {\tt v}. -\end{itemize} - -\section{RPCs associated with classes} - -\begin{itemize} -\item Each class has a {\em constructor\/} RPC named ``{\tt create}'' that -takes as parameters all fields marked {\em RW\/} and -$\mathit{RO}_\mathit{ins}$. The result of this RPC is that a new {\em -persistent\/} object is created on the server-side with the specified field -values. - -\item Each class has a {\tt get\_by\_uuid(uuid)} RPC that returns the object -of that class that has the specified {\tt uuid}. - -\item Each class that has a {\tt name\_label} field has a -``{\tt get\_by\_name\_label(name)}'' RPC that returns a set of objects of that -class that have the specified {\tt label}. - -\item Each class has a ``{\tt destroy(Ref x)}'' RPC that explicitly deletes -the persistent object specified by {\tt x} from the system. This is a -non-cascading delete -- if the object being removed is referenced by another -object then the {\tt destroy} call will fail. - -\end{itemize} - -\subsection{Additional RPCs} - -As well as the RPCs enumerated above, some classes have additional RPCs -associated with them. For example, the {\tt VM} class has RPCs for cloning, -suspending, starting etc. Such additional RPCs are described explicitly -in the API reference. diff -Nru xen-4.2.2/docs/xen-api/revision-history.tex xen-4.3.0/docs/xen-api/revision-history.tex --- xen-4.2.2/docs/xen-api/revision-history.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/revision-history.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -{ \bf Revision History} - -% Please do not use minipages in a tabular environment; this results -% in bad vertical alignment. - -\begin{flushleft} -\begin{center} - \begin{tabular}{|l|l|l|>{\raggedright}p{7cm}|} - \hline - 1.0.0 & 27th April 07 & Xensource et al. & - Initial Revision\tabularnewline - \hline - 1.0.1 & 10th Dec. 07 & S. Berger & - Added XSPolicy.reset\_xspolicy, VTPM.get\_other\_config, - VTPM.set\_otherconfig. ACMPolicy.get\_enforced\_binary methods.\tabularnewline - \hline - 1.0.2 & 25th Jan. 08 & J. Fehlig & - Added Crashed VM power state.\tabularnewline - \hline - 1.0.3 & 11th Feb. 08 & S. Berger & - Added table of contents and hyperlink cross reference.\tabularnewline - \hline - 1.0.4 & 23rd March 08 & S. Berger & - Added XSPolicy.can\_run\tabularnewline - \hline - 1.0.5 & 17th Apr. 08 & S. Berger & - Added undocumented fields and methods for default\_netmask and - default\_gateway to the Network class. Removed an unimplemented - method from the XSPolicy class and removed the 'optional' from - 'oldlabel' parameters.\tabularnewline - \hline - 1.0.6 & 24th Jul. 08 & Y. Iwamatsu & - Added definitions of new classes DPCI and PPCI. Updated the table - and the diagram representing relationships between classes. - Added host.PPCIs and VM.DPCIs fields.\tabularnewline - \hline - 1.0.7 & 20th Oct. 08 & M. Kanno & - Added definitions of new classes DSCSI and PSCSI. Updated the table - and the diagram representing relationships between classes. - Added host.PSCSIs and VM.DSCSIs fields.\tabularnewline - \hline - 1.0.8 & 17th Jun. 09 & A. Florath & - Updated interactive session example. - Added description for \texttt{PV/kernel} and \texttt{PV/ramdisk} - parameters using URIs.\tabularnewline - \hline - 1.0.9 & 20th Nov. 09 & M. Kanno & - Added definitions of new classes DSCSI\_HBA and PSCSI\_HBA. - Updated the table and the diagram representing relationships - between classes. Added host.PSCSI\_HBAs and VM.DSCSI\_HBAs - fields.\tabularnewline - \hline - 1.0.10 & 10th Jan. 10 & L. Dube & - Added definitions of new classes cpu\_pool. Updated the table - and the diagram representing relationships between classes. - Added fields host.resident\_cpu\_pools, VM.cpu\_pool and - host\_cpu.cpu\_pool.\tabularnewline - \hline - \end{tabular} -\end{center} -\end{flushleft} diff -Nru xen-4.2.2/docs/xen-api/todo.tex xen-4.3.0/docs/xen-api/todo.tex --- xen-4.2.2/docs/xen-api/todo.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/todo.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -% -% Copyright (c) 2006 XenSource, Inc. -% -% Permission is granted to copy, distribute and/or modify this document under -% the terms of the GNU Free Documentation License, Version 1.2 or any later -% version published by the Free Software Foundation; with no Invariant -% Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the -% license is included in the section entitled -% "GNU Free Documentation License" or the file fdl.tex. -% -% Authors: Ewan Mellor, Richard Sharp, Dave Scott, Jon Harrop. -% - -\section{To-Do} - -Lots and lots! Including: - -\subsection{Clarity} - -\begin{itemize} - -\item Roll constructors and get\_by\_uuid etc (section 1.2) into section 2 so -that it is clearer that each class has these. - -\item Emphasise that enums are strings on the wire, and so are not restricted -to a certain number of bits. - -\item Clarify return values, in particular that void means return a status -code, potential error description, but otherwise no value. - -\item Talk about UUID generation. - -\item Clarify session behaviour wrt timeouts and disconnects. - -\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) - -\end{itemize} - -\subsection{Content} - -\subsubsection{Model} - -\begin{itemize} - -\item Improve the set of available power\_states and corresponding lifecycle -semantics. Rename power\_state, maybe. - -\item Specify the CPU scheduler configuration properly, inc CPU affinity, -weights, etc. - -\item Add Vm.architecture and Host.compatible\_architecture fields. - -\item Add migration calls, including the ability to test whether a migration -will succeed, and authentication token exchange. - -\item Improve asynchronous task handling, with a registration call, a -``blocking poll'' call, and an explicit notification destination. Registration -for ``power\_state'' is useful. - -\item Specify that session keys outlive the HTTP session, and add a timeout -for them (configurable in the tools). - -\item Add places for people to store extra data (``otherConfig'' perhaps) - -\item Specify how hardware UUIDs are used / accessed. - -\item Marking VDIs as exclusive / shareable (locking?) - -\item Consider how to represent CDROMs (as VDIs?) - -\item Define lists of exceptions which may be thrown by each RPC, including -error codes and parameters. - -\item Host characteristics: minimum amount of memory, TPM, network bandwidth, -amount of host memory, amount consumed by VMs, max amount available for new -VMs? - -\item Cooked resource monitoring interface. - -\item Network needs additional attributes that provide media characteristics -of the NIC: - -\begin{itemize} - -\item RO bandwidth integer Bandwidth in mbps -\item RO latency integer time in ms for an icmp roundtrip to a host on the -same subnet. - -\end{itemize} - -\item ACM -\begin{itemize} - -\item A Xen system can be running an access control policy where each -VM's run-time access to resources is restricted by the label it has been given -compared to those of the resources. Currently a VM's configuration file may -contain a line like access\_control[policy='$<$name of the system's -policy$>$',label='$<$label given to VM$>$']. I think the identifiers 'policy' -and 'label' should also be part of the VM class either directly in the form -'access\_control/policy' or indirectly in an access\_control class. - -\end{itemize} - -\item Mike Day's Vm.profile field? - -\item Clone customisation? - -\item NIC teaming? The NIC field of the Network class should be a list (Set) -so that we can signify NIC teaming. (Combining physical NICs in a single host -interface to achieve greater bandwidth). - -\end{itemize} - -\subsubsection{Transport} - -\begin{itemize} - -\item Allow non-HTTP transports. Explicitly allow stdio transport, for SSH. - -\end{itemize} - -\subsubsection{Authentication} - -\begin{itemize} - -\item Delegation to the transport layer. - -\item Extend PAM exchange across the wire. - -\item Fine-grained access control. - -\end{itemize} diff -Nru xen-4.2.2/docs/xen-api/vm-lifecycle.tex xen-4.3.0/docs/xen-api/vm-lifecycle.tex --- xen-4.2.2/docs/xen-api/vm-lifecycle.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/vm-lifecycle.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -% -% Copyright (c) 2006-2007 XenSource, Inc. -% -% Permission is granted to copy, distribute and/or modify this document under -% the terms of the GNU Free Documentation License, Version 1.2 or any later -% version published by the Free Software Foundation; with no Invariant -% Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the -% license is included in the section entitled -% "GNU Free Documentation License" or the file fdl.tex. -% -% Authors: Ewan Mellor, Richard Sharp, Dave Scott, Jon Harrop. -% - -\section{VM Lifecycle} - -\begin{figure} -\centering -\resizebox{0.9\textwidth}{!}{\includegraphics{vm_lifecycle}} -\caption{VM Lifecycle} -\label{fig-vm-lifecycle} -\end{figure} - -Figure~\ref{fig-vm-lifecycle} shows the states that a VM can be in -and the API calls that can be used to move the VM between these states. The crashed -state indicates that the guest OS running within the VM has crashed. There is no -API to explicitly move to the crashed state, however a hardShutdown will move the -VM to the powered down state. - -\section{VM boot parameters} - -The VM class contains a number of fields that control the way in which the VM is booted. -With reference to the fields defined in the VM class (see later in this document), -this section outlines the boot options available and the mechanisms provided for controlling them. - -VM booting is controlled by setting one of the two mutually exclusive groups: ``PV'', and ``HVM''. If HVM.boot\_policy is the empty string, then paravirtual domain building and booting will be used; otherwise the VM will be loaded as an HVM domain, and booted using an emulated BIOS. - -When paravirtual booting is in use, the PV/bootloader field indicates the bootloader to use. It may be ``pygrub'', in which case the platform's default installation of pygrub will be used, or a full path within the control domain to some other bootloader. The other fields, PV/kernel, PV/ramdisk, PV/args and PV/bootloader\_args will be passed to the bootloader unmodified, and interpretation of those fields is then specific to the bootloader itself, including the possibility that the bootloader will ignore some or all of those given values. Finally the paths of all bootable disks are added to the bootloader commandline (a disk is bootable if its VBD has the bootable flag set). There may be zero, one or many bootable disks; the bootloader decides which disk (if any) to boot from. - -If the bootloader is pygrub, then the menu.lst is parsed if present in the guest's filesystem, otherwise the specified kernel and ramdisk are used, or an autodetected kernel is used if nothing is specified and autodetection is possible. PV/args is appended to the kernel command line, no matter which mechanism is used for finding the kernel. - -If PV/bootloader is empty but PV/kernel is specified, then the kernel and ramdisk values will be treated as paths within the control domain. If both PV/bootloader and PV/kernel are empty, then the behaviour is as if PV/bootloader was specified as ``pygrub''. - -When using HVM booting, HVM/boot\_policy and HVM/boot\_params specify the boot handling. Only one policy is currently defined: ``BIOS order''. In this case, HVM/boot\_params should contain one key-value pair ``order'' = ``N'' where N is the string that will be passed to QEMU. \ No newline at end of file diff -Nru xen-4.2.2/docs/xen-api/vm_lifecycle.dot xen-4.3.0/docs/xen-api/vm_lifecycle.dot --- xen-4.2.2/docs/xen-api/vm_lifecycle.dot 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/vm_lifecycle.dot 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -digraph g{ - -node [shape=box]; "powered down" paused running suspended crashed; - -"powered down" -> paused [label="start(paused=true)"]; -"powered down" -> running [label="start(paused=false)"]; -running -> suspended [label="suspend"]; -suspended -> running [label="resume(paused=false)"]; -suspended -> paused [label="resume(paused=true)"]; -paused -> suspended [label="suspend"]; -paused -> running [label="resume"]; -running -> "powered down" [label="cleanShutdown /\nhardShutdown"]; -running -> paused [label="pause"]; -running -> crashed [label="guest OS crash"] -crashed -> "powered down" [label="hardShutdown"] - -} \ No newline at end of file diff -Nru xen-4.2.2/docs/xen-api/wire-protocol.tex xen-4.3.0/docs/xen-api/wire-protocol.tex --- xen-4.2.2/docs/xen-api/wire-protocol.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/wire-protocol.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,383 +0,0 @@ -% -% Copyright (c) 2006-2007 XenSource, Inc. -% Copyright (c) 2009 flonatel GmbH & Co. KG -% -% Permission is granted to copy, distribute and/or modify this document under -% the terms of the GNU Free Documentation License, Version 1.2 or any later -% version published by the Free Software Foundation; with no Invariant -% Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the -% license is included in the section entitled -% "GNU Free Documentation License" or the file fdl.tex. -% -% Authors: Ewan Mellor, Richard Sharp, Dave Scott, Jon Harrop. -% Contributor: Andreas Florath -% - -\section{Wire Protocol for Remote API Calls} - -API calls are sent over a network to a Xen-enabled host using -the XML-RPC protocol. In this Section we describe how the -higher-level types used in our API Reference are mapped to -primitive XML-RPC types. - -In our API Reference we specify the signatures of API functions in the following -style: -\begin{verbatim} - (ref_vm Set) VM.get_all() -\end{verbatim} -This specifies that the function with name {\tt VM.get\_all} takes -no parameters and returns a Set of {\tt ref\_vm}s. -These types are mapped onto XML-RPC types in a straight-forward manner: -\begin{itemize} - \item Floats, Bools, DateTimes and Strings map directly to the XML-RPC {\tt - double}, {\tt boolean}, {\tt dateTime.iso8601}, and {\tt string} elements. - - \item all ``{\tt ref\_}'' types are opaque references, encoded as the - XML-RPC's {\tt String} type. Users of the API should not make assumptions - about the concrete form of these strings and should not expect them to - remain valid after the client's session with the server has terminated. - - \item fields named ``{\tt uuid}'' of type ``{\tt String}'' are mapped to - the XML-RPC {\tt String} type. The string itself is the OSF - DCE UUID presentation format (as output by {\tt uuidgen}, etc). - - \item ints are all assumed to be 64-bit in our API and are encoded as a - string of decimal digits (rather than using XML-RPC's built-in 32-bit {\tt - i4} type). - - \item values of enum types are encoded as strings. For example, a value of - {\tt destroy} of type {\tt on\_normal\_exit}, would be conveyed as: - \begin{verbatim} - destroy - \end{verbatim} - - \item for all our types, {\tt t}, our type {\tt t Set} simply maps to - XML-RPC's {\tt Array} type, so for example a value of type {\tt cpu\_feature - Set} would be transmitted like this: - - \begin{verbatim} - - - CX8 - PSE36 - FPU - - - \end{verbatim} - - \item for types {\tt k} and {\tt v}, our type {\tt (k, v) Map} maps onto an - XML-RPC struct, with the key as the name of the struct. Note that the {\tt - (k, v) Map} type is only valid when {\tt k} is a {\tt String}, {\tt Ref}, or - {\tt Int}, and in each case the keys of the maps are stringified as - above. For example, the {\tt (String, double) Map} containing a the mappings - Mike $\rightarrow$ 2.3 and John $\rightarrow$ 1.2 would be represented as: - - \begin{verbatim} - - - - Mike - 2.3 - - - John - 1.2 - - - - \end{verbatim} - - \item our {\tt Void} type is transmitted as an empty string. - -\end{itemize} - -\subsection{Note on References vs UUIDs} - -References are opaque types --- encoded as XML-RPC strings on the wire --- understood -only by the particular server which generated them. Servers are free to choose -any concrete representation they find convenient; clients should not make any -assumptions or attempt to parse the string contents. References are not guaranteed -to be permanent identifiers for objects; clients should not assume that references -generated during one session are valid for any future session. References do not -allow objects to be compared for equality. Two references to the same object are -not guaranteed to be textually identical. - -UUIDs are intended to be permanent names for objects. They are -guaranteed to be in the OSF DCE UUID presentation format (as output by {\tt uuidgen}. -Clients may store UUIDs on disk and use them to lookup objects in subsequent sessions -with the server. Clients may also test equality on objects by comparing UUID strings. - -The API provides mechanisms -for translating between UUIDs and opaque references. Each class that contains a UUID -field provides: -\begin{itemize} -\item A ``{\tt get\_by\_uuid}'' method that takes a UUID, $u$, and returns an opaque reference -to the server-side object that has UUID=$u$; -\item A {\tt get\_uuid} function (a regular ``field getter'' RPC) that takes an opaque reference, -$r$, and returns the UUID of the server-side object that is referenced by $r$. -\end{itemize} - -\subsection{Return Values/Status Codes} -\label{synchronous-result} - -The return value of an RPC call is an XML-RPC {\tt Struct}. - -\begin{itemize} -\item The first element of the struct is named {\tt Status}; it -contains a string value indicating whether the result of the call was -a ``{\tt Success}'' or a ``{\tt Failure}''. -\end{itemize} - -If {\tt Status} was set to {\tt Success} then the Struct contains a second -element named {\tt Value}: -\begin{itemize} -\item The element of the struct named {\tt Value} contains the function's return value. -\end{itemize} - -In the case where {\tt Status} is set to {\tt Failure} then -the struct contains a second element named {\tt ErrorDescription}: -\begin{itemize} -\item The element of the struct named {\tt ErrorDescription} contains -an array of string values. The first element of the array is an error code; -the remainder of the array are strings representing error parameters relating -to that code. -\end{itemize} - -For example, an XML-RPC return value from the {\tt host.get\_resident\_VMs} -function above -may look like this: -\begin{verbatim} - - - Status - Success - - - Value - - - - 81547a35-205c-a551-c577-00b982c5fe00 - 61c85a22-05da-b8a2-2e55-06b0847da503 - 1d401ec4-3c17-35a6-fc79-cee6bd9811fe - - - - - -\end{verbatim} - -\section{Making XML-RPC Calls} - -\subsection{Transport Layer} - -The following transport layers are currently supported: -\begin{itemize} -\item HTTP/S for remote administration -\item HTTP over Unix domain sockets for local administration -\end{itemize} - -\subsection{Session Layer} - -The XML-RPC interface is session-based; before you can make arbitrary RPC calls -you must login and initiate a session. For example: -\begin{verbatim} - session_id session.login_with_password(string uname, string pwd) -\end{verbatim} -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 subsequent RPC calls as an authentication token. - -A session can be terminated with the {\tt session.logout} function: -\begin{verbatim} - void session.logout(session_id session) -\end{verbatim} - -\subsection{Synchronous and Asynchronous invocation} - -Each method call (apart from methods on ``Session'' and ``Task'' objects -and ``getters'' and ``setters'' derived from fields) -can be made either synchronously or asynchronously. -A synchronous RPC call blocks until the -return value is received; the return value of a synchronous RPC call is -exactly as specified in Section~\ref{synchronous-result}. - -Only synchronous API calls are listed explicitly in this document. -All asynchronous versions are in the special {\tt Async} namespace. -For example, synchronous call {\tt VM.clone(...)} -(described in Chapter~\ref{api-reference}) -has an asynchronous counterpart, {\tt -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 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 -{\tt Value} fields, exactly as specified in Section~\ref{synchronous-result}. - -The {\tt task-id} is provided in the {\tt Value} field if {\tt Status} is set to -{\tt Success}. - -The RPC call -\begin{verbatim} - (ref_task Set) Task.get_all(session_id s) -\end{verbatim} -returns a set of all task IDs known to the system. The status (including any -returned result and error codes) of these tasks -can then be queried by accessing the fields of the Task object in the usual way. -Note that, in order to get a consistent snapshot of a task's state, it is advisable to call the ``get\_record'' function. - -\section{Example interactive session} -This section describes how an interactive session might look, using -the python API. All python versions starting from 2.4 should work. - -The examples in this section use a remote Xen host with the ip address -of \texttt{192.168.7.20} and the xmlrpc port \texttt{9363}. No -authentication is used. - -Note that the remote server must be configured in the way, that it -accepts remote connections. Some lines must be added to the -xend-config.sxp configuration file: -\begin{verbatim} -(xen-api-server ((9363 none) - (unix none))) -(xend-tcp-xmlrpc-server yes) -\end{verbatim} -The xend must be restarted after changing the configuration. - -Before starting python, the \texttt{PYTHONPATH} must be set that the -\texttt{XenAPI.py} can be found. Typically the \texttt{XenAPI.py} is -installed with one of the Xen helper packages which the last part of -the path is \texttt{xen/xm/XenAPI.py}. - -Example: Under Debian 5.0 the package which contains the -\texttt{XenAPI.py} is \texttt{xen-utils-3.2-1}. \texttt{XenAPI.py} is -located in \texttt{/usr/lib/xen-3.2-1/lib/python/xen/xm}. The -following command will set the \texttt{PYTHONPATH} environment -variable in a bash: - -\begin{verbatim} -$ export PYTHONPATH=/usr/lib/xen-3.2-1/lib/python -\end{verbatim} - -Then python can be started and the XenAPI must be imported: - -\begin{verbatim} -$ python -... ->>> import xen.xm.XenAPI -\end{verbatim} - -To create a session to the remote server, the -\texttt{xen.xm.XenAPI.Session} constructor is used: -\begin{verbatim} ->>> session = xen.xm.XenAPI.Session("http://192.168.7.20:9363") -\end{verbatim} - -For authentication with a username and password the -\texttt{login\_with\_password} is used: -\begin{verbatim} ->>> session.login_with_password("", "") -\end{verbatim} - -When serialised, this call looks like: -\begin{verbatim} -POST /RPC2 HTTP/1.0 -Host: 192.168.7.20:9363 -User-Agent: xmlrpclib.py/1.0.1 (by www.pythonware.com) -Content-Type: text/xml -Content-Length: 221 - - - -session.login_with_password - - - - - - - - - -\end{verbatim} - -And the response: -\begin{verbatim} -HTTP/1.1 200 OK -Server: BaseHTTP/0.3 Python/2.5.2 -Date: Fri, 10 Jul 2009 09:01:27 GMT -Content-Type: text/xml -Content-Length: 313 - - - - - - - -Status -Success - - -Value -68e3a009-0249-725b-246b-7fc43cf4f154 - - - - - -\end{verbatim} - -Next, the user may acquire a list of all the VMs known to the host: - -\begin{verbatim} ->>> vms = session.xenapi.VM.get_all() ->>> vms -['00000000-0000-0000-0000-000000000000', 'b28e4ee3-216f-fa85-9cae-615e954dbbe7'] -\end{verbatim} - -The VM references here have the form of an uuid, though they may -change in the future, and they should be treated as opaque strings. - -Some examples of using accessors for object fields: -\begin{verbatim} ->>> session.xenapi.VM.get_name_label(vms[1]) -'guest002' ->>> session.xenapi.VM.get_actions_after_reboot(vms[1]) -'restart' -\end{verbatim} - -Grab the actual memory and cpu utilisation of one vm: -\begin{verbatim} ->>> m = session.xenapi.VM.get_metrics(vms[1]) ->>> session.xenapi.VM_metrics.get_memory_actual(m) -'268435456' ->>> session.xenapi.VM_metrics.get_VCPUs_utilisation(m) -{'0': 0.00041759955632935362} -\end{verbatim} -(The virtual machine has about 256 MByte RAM and is idle.) - -Pausing and unpausing a vm: -\begin{verbatim} ->>> session.xenapi.VM.pause(vms[1]) -'' ->>> session.xenapi.VM.unpause(vms[1]) -'' -\end{verbatim} - -Trying to start an vm: -\begin{verbatim} ->>> session.xenapi.VM.start(vms[1], False) -... -: Xen-API failure: ['VM_BAD_POWER_STATE', \ - 'b28e4ee3-216f-fa85-9cae-615e954dbbe7', 'Halted', 'Running'] -\end{verbatim} - -In this case the {\tt start} message has been rejected, because the VM is -already running, and so an error response has been returned. These high-level -errors are returned as structured data (rather than as XML-RPC faults), -allowing them to be internationalised. diff -Nru xen-4.2.2/docs/xen-api/xen.eps xen-4.3.0/docs/xen-api/xen.eps --- xen-4.2.2/docs/xen-api/xen.eps 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/xen.eps 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -%!PS-Adobe-3.1 EPSF-3.0 %%Title: xen3-1.0.eps %%Creator: Adobe Illustrator(R) 11 %%AI8_CreatorVersion: 11.0.0 %AI9_PrintingDataBegin %%For: Rich Quarles %%CreationDate: 6/26/06 %%BoundingBox: 0 0 215 94 %%HiResBoundingBox: 0 0 214.1646 93.5196 %%CropBox: 0 0 214.1646 93.5196 %%LanguageLevel: 2 %%DocumentData: Clean7Bit %%Pages: 1 %%DocumentNeededResources: %%DocumentSuppliedResources: procset Adobe_AGM_Image (1.0 0) %%+ procset Adobe_CoolType_Utility_T42 (1.0 0) %%+ procset Adobe_CoolType_Utility_MAKEOCF (1.19 0) %%+ procset Adobe_CoolType_Core (2.23 0) %%+ procset Adobe_AGM_Core (2.0 0) %%+ procset Adobe_AGM_Utils (1.0 0) %%DocumentFonts: %%DocumentNeededFonts: %%DocumentNeededFeatures: %%DocumentSuppliedFeatures: %%DocumentProcessColors: Black %%DocumentCustomColors: %%CMYKCustomColor: %%RGBCustomColor: %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 128 56 8 %%BeginData: 6266 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD19FFA8A87DA8FD077DA8A8FD70FF7D7D527D527D527D7D7D527D %527D52FD047DFD6AFFA87D527D7D7D52FD0B7D52FD047DA8A8FD65FFA87D %7D527D52FD047DFD09A87D7D527D527D527D7DFD63FFA8FD057DA8A8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD057DA8FD5FFFA87D527D527D7DA8 %A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A87D7D527D527DA8FD5CFF %A87D527D7DA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8A87D7D527DA8FD5AFF7D7D527D7DFD04A8FFA8A8A8FFA8A8A8FFA8A8A8 %FFA8A8A8FFA8A8A8FFFD04A8527D527DA8FD58FFFD057DFFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD047DA8FD56 %FF7D7D527D7DA8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFA8 %A8A8FFA8A8A8FFA8A8FD047DA8FD54FFA8FD047DFFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFD047DA8FD %52FFA87D527D7DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8A8FFA8A8A8FF %A8A8A8FFFD05A8FFA8FFA8FFFD047DA8FD51FF7D7D7D27FD0E527DA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFFFA827FD0552272727FD09527DFD47FFA8 %527D7D52FD0FF852A8A8A8FFA8A8A8FFA8A8A8FFA8FFA87DFD12F852FD48 %FF7D7D7DA8A827FD0FF87DFFFFA8FFA8FFA8FFA8FFA8FFFF7DFD11F8277D %FD48FF7D7D527DA8FFA827FD0FF8FD04A8FFA8A8A8FFA8FFA852FD11F827 %A8FD49FF7D7D7DA8FFA8FF7DFD0FF827FFA8FFA8FFA8FFA8FFA827FD11F8 %52FD4AFFA8527D7DFFA8A8A8FF52FD0FF852FFA8FFA8A8A8FF7DFD12F87D %FD4BFF7D7D7DA8A8FFA8FFA8FF52FD0FF87DFFA8FFA8FF7DFD12F852A8FD %4AFFA87D527DA8A8A8FFA8A8A8FF27FD0EF827A8FFA8FF52FD11F8277D7D %7DA8FD07FFA8FFA8FFA8FD23FFA8FFA8FD17FFA8527D7DFFA8FFA8FFA8FF %FFFFFD0FF852FFFF27FD11F852FF7D7D7DFFA87D52522727F827F827F827 %27527DFD0BFFFD04A87DA8A8A87DFD04A8FFFFFFA87D5227F827F8272752 %7DFD14FF7D7D52FD04A8FFA8A8A8FFA8A8FD0FF85227FD10F8277DFFA8A8 %5227FD11F82752FD07FFA8FD0CF8FFFFA827FD0CF87DFFFFFFA8F8F8F87D %27F8527DF8F8FD04FF7D7D7DA8FFA8FFA8FFA8FFA8FFFF7DFD1FF827A8FF %FF7D27FD16F8A8FD05FFA8FD0BF827FF7DFD0FF87DFFFFFFA8F87DFF27F8 %2727F8F8FFFFFFA8527D7DA8A8FFA8A8A8FFA8A8A8FFA852FD1DF852A8FF %A852FD19F87DFD04FF52FD0BF82727FD11F8A8FFFFA8F852FFF827F8F852 %F8FFFFFFA87D7DA8A8FFA8FFA8FFA8FFA8FFA8FFA852FD1BF8A8FFFFA827 %FD0BF87DA8FF7D52FD0BF8FD04FF52FD1EF852FFFFFF52A8FFFD047DA852 %FFFFFFA8527D7DFFA8FFA8A8A8FFA8A8A8FFA8FFA827FD18F827A8A8FFA8 %27FD0AF827FD06FF27FD0AF827FFFFFFFD0FF82727FD0EF852FD0FFFA87D %52A8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA827FD16F852FFFFFFA852FD0BF8 %FD07FF52FD0AF827FFFFA8FD0DF827A8FFFFFF52FD0CF852FD0FFFA8527D %7DFFA8A8A8FFA8A8A8FFA8A8A8FFA8FF7DFD15F852FFA8A8A87DFD0BF852 %FD04FFA8FFFF52FD0BF8A8FF7DFD0CF827FD05FFA8FD0CF852FD0FFFA87D %7DA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF52FD12F827A8FFA8FFA8FF27 %FD0CF8FD0727FD0CF8A8FF52FD0CF8FD07FFFD0CF87DFD0FFFA8527D7DFF %A8A8A8FFA8A8A8FFA8A8A8FFA8FF52FD12F852A8FFA8A8A8FF7DFD20F8FF %FF27FD0BF852FD06FF7DFD0CF8A8FD0FFFA87D7DA8A8FFA8FFA8FFA8FFA8 %FFA8FFFFA827FD12F827A8FFA8FFA8FFA87DFD1FF827FFFFFD0CF87DFD06 %FF7DFD0BF827FD10FFA8527D7DA8A8FFA8A8A8FFA8A8A8FFA87DFD15F852 %A8A8A8FFA8FF52FD0CF827F827F827F827F827F827F827F827F827F82752 %FF7DFD0CF8A8FD06FF27FD0BF827FD10FFA87D7D7DA8FFA8FFA8FFA8FFA8 %FFFF7DFD17F87DFFFFA8FFA852FD0BF8A8FD15FF7DFD0BF827FD07FF27FD %0BF87DFD11FF7D7D7DA8A8FFA8A8A8FFA8FFA852FD19F87DA8FFA8FF52FD %0BF87DFD15FF27FD0BF827FD06FFA8FD0CF8A8FD11FFA8527DA8FFA8FFA8 %FFA8FFA827FD1BF8A8A8FFFF7DFD0BF87DFD06FF7D272752275227522752 %27277DFFFF27FD0BF87DFD06FF7DFD0CF8FD12FF7D7D52FD06A8FF52FD1D %F827FFA8FFA8FD0CF8A8FD04FF52FD0CF8A8FFA8FD0CF87DFD06FF52FD0B %F852FD13FF7D7D7DFFA8FFFFFF52FD1FF852FFA8FF7DFD0CF8525252FD0D %F8A8FFFF7DFD0CF8FD07FF27FD0BF852FD13FF7D527DA8FFA8A827FD11F8 %2727FD0EF852FFA8FF52FD19F827A8FFFFFF52FD0BF852FD06FFA8FD0CF8 %A8FD13FFA87D52A8FF7DFD12F852FF52FD0FF87DFFA8FF7D27FD15F8277D %FD05FFFD0CF852FD06FF7DFD0CF8FD15FF527D7D52FD12F87DFFA8FF27FD %0EF827A8FFA8FFA87D2727FD0FF85252A8FD06FFA8522727275227272752 %272727A8FD06FF52FD04275227272752272752FD15FFA85227FD11F827A8 %FFA8FFA8A8FD0FF852FFFFA8FF7D7D7DA8A8A87D7D527D52FD047DA8A8FD %40FF7DFD12F852A8FFA8FFA8A8A87DFD0FF87DFFFF7D7D527DFD4DFF7DFD %12F87DA8FFA8FFA8FFA8FFA852FD0FF8A8A87D7D7DA8FD4CFF52FD12F8FD %04A8FFA8A8A8FFA8FF7DFD10F8FD047DFD4CFF27FD11F827FFFFFFA8FFA8 %FFA8FFA8FFA8FF7DFD0FF8277D7DFD4BFFA8FD12F852FFA8FFA8A8A8FFA8 %A8A8FFA8A8A8FF27FD0FF827FD4BFF7DFD0FF827F8277DFFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8A8FD10F87DFD4AFF7DFD0AA87D5252527D7DA8A8FF %A8FFA8A8A8FFA8A8A8FFA8A8A8FFFD04A87DA87DA87DA87DA87DFD0452A8 %A8A8FD56FFA87D7D7DA8A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FD05FFA8FD047DFD5BFFA8527D527D7DA8A8FFA8A8A8FFA8A8A8FF %A8A8A8FFA8A8A8FFA8A8A8FFA8A8FD047D52FD5EFFFD057DA8A8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8FD057DFD60FF7D7D527D527D7D %FD04A8FFA8A8A8FFA8A8A8FFFD04A87D7D527D527D7DFD62FFA8A8FD077D %FD04A8FFFD06A8FD077DA8FD67FF7D7D527D527D527D527D527D7D7D527D %527D527D527D7DFD6BFFA8FD047D527D7D7D527D7D7D52FD047DFD70FFFD %04A8FD077DA8A8FFA8FD58FFFF %%EndData %%EndComments %%BeginDefaults %%ViewingOrientation: 1 0 0 1 %%EndDefaults %%BeginProlog %%BeginResource: procset Adobe_AGM_Utils 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Utils 68 dict dup begin put /bdf { bind def } bind def /nd{ null def }bdf /xdf { exch def }bdf /ldf { load def }bdf /ddf { put }bdf /xddf { 3 -1 roll put }bdf /xpt { exch put }bdf /ndf { exch dup where{ pop pop pop }{ xdf }ifelse }def /cdndf { exch dup currentdict exch known{ pop pop }{ exch def }ifelse }def /bdict { mark }bdf /edict { counttomark 2 idiv dup dict begin {def} repeat pop currentdict end }def /ps_level /languagelevel where{ pop systemdict /languagelevel get exec }{ 1 }ifelse def /level2 ps_level 2 ge def /level3 ps_level 3 ge def /ps_version {version cvr} stopped { -1 }if def /makereadonlyarray { /packedarray where{ pop packedarray }{ array astore readonly }ifelse }bdf /map_reserved_ink_name { dup type /stringtype eq{ dup /Red eq{ pop (_Red_) }{ dup /Green eq{ pop (_Green_) }{ dup /Blue eq{ pop (_Blue_) }{ dup () cvn eq{ pop (Process) }if }ifelse }ifelse }ifelse }if }bdf /AGMUTIL_GSTATE 22 dict def /get_gstate { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_clr_spc currentcolorspace def /AGMUTIL_GSTATE_clr_indx 0 def /AGMUTIL_GSTATE_clr_comps 12 array def mark currentcolor counttomark {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def} repeat pop /AGMUTIL_GSTATE_fnt rootfont def /AGMUTIL_GSTATE_lw currentlinewidth def /AGMUTIL_GSTATE_lc currentlinecap def /AGMUTIL_GSTATE_lj currentlinejoin def /AGMUTIL_GSTATE_ml currentmiterlimit def currentdash /AGMUTIL_GSTATE_do xdf /AGMUTIL_GSTATE_da xdf /AGMUTIL_GSTATE_sa currentstrokeadjust def /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def /AGMUTIL_GSTATE_op currentoverprint def /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def currentcolortransfer cvlit /AGMUTIL_GSTATE_gy_xfer xdf cvlit /AGMUTIL_GSTATE_b_xfer xdf cvlit /AGMUTIL_GSTATE_g_xfer xdf cvlit /AGMUTIL_GSTATE_r_xfer xdf /AGMUTIL_GSTATE_ht currenthalftone def /AGMUTIL_GSTATE_flt currentflat def end }def /set_gstate { AGMUTIL_GSTATE begin AGMUTIL_GSTATE_clr_spc setcolorspace AGMUTIL_GSTATE_clr_indx {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def} repeat setcolor AGMUTIL_GSTATE_fnt setfont AGMUTIL_GSTATE_lw setlinewidth AGMUTIL_GSTATE_lc setlinecap AGMUTIL_GSTATE_lj setlinejoin AGMUTIL_GSTATE_ml setmiterlimit AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash AGMUTIL_GSTATE_sa setstrokeadjust AGMUTIL_GSTATE_clr_rnd setcolorrendering AGMUTIL_GSTATE_op setoverprint AGMUTIL_GSTATE_bg cvx setblackgeneration AGMUTIL_GSTATE_ucr cvx setundercolorremoval AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer AGMUTIL_GSTATE_ht /HalftoneType get dup 9 eq exch 100 eq or { currenthalftone /HalftoneType get AGMUTIL_GSTATE_ht /HalftoneType get ne { mark AGMUTIL_GSTATE_ht {sethalftone} stopped cleartomark } if }{ AGMUTIL_GSTATE_ht sethalftone } ifelse AGMUTIL_GSTATE_flt setflat end }def /get_gstate_and_matrix { AGMUTIL_GSTATE begin /AGMUTIL_GSTATE_ctm matrix currentmatrix def end get_gstate }def /set_gstate_and_matrix { set_gstate AGMUTIL_GSTATE begin AGMUTIL_GSTATE_ctm setmatrix end }def /AGMUTIL_str256 256 string def /AGMUTIL_src256 256 string def /AGMUTIL_dst64 64 string def /AGMUTIL_srcLen nd /AGMUTIL_ndx nd /agm_sethalftone { dup begin /_Data load /Thresholds xdf end level3 { sethalftone }{ dup /HalftoneType get 3 eq { sethalftone } {pop} ifelse }ifelse } def /rdcmntline { currentfile AGMUTIL_str256 readline pop (%) anchorsearch {pop} if } bdf /filter_cmyk { dup type /filetype ne{ exch () /SubFileDecode filter } { exch pop } ifelse [ exch { AGMUTIL_src256 readstring pop dup length /AGMUTIL_srcLen exch def /AGMUTIL_ndx 0 def AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ 1 index exch get AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put /AGMUTIL_ndx AGMUTIL_ndx 1 add def }for pop AGMUTIL_dst64 0 AGMUTIL_ndx getinterval } bind /exec cvx ] cvx } bdf /filter_indexed_devn { cvi Names length mul names_index add Lookup exch get } bdf /filter_devn { 4 dict begin /srcStr xdf /dstStr xdf dup type /filetype ne{ 0 () /SubFileDecode filter }if [ exch [ /devicen_colorspace_dict /AGMCORE_gget cvx /begin cvx currentdict /srcStr get /readstring cvx /pop cvx /dup cvx /length cvx 0 /gt cvx [ Adobe_AGM_Utils /AGMUTIL_ndx 0 /ddf cvx names_index Names length currentdict /srcStr get length 1 sub { 1 /index cvx /exch cvx /get cvx currentdict /dstStr get /AGMUTIL_ndx /load cvx 3 -1 /roll cvx /put cvx Adobe_AGM_Utils /AGMUTIL_ndx /AGMUTIL_ndx /load cvx 1 /add cvx /ddf cvx } for currentdict /dstStr get 0 /AGMUTIL_ndx /load cvx /getinterval cvx ] cvx /if cvx /end cvx ] cvx bind /exec cvx ] cvx end } bdf /AGMUTIL_imagefile nd /read_image_file { AGMUTIL_imagefile 0 setfileposition 10 dict begin /imageDict xdf /imbufLen Width BitsPerComponent mul 7 add 8 idiv def /imbufIdx 0 def /origDataSource imageDict /DataSource get def /origMultipleDataSources imageDict /MultipleDataSources get def /origDecode imageDict /Decode get def /dstDataStr imageDict /Width get colorSpaceElemCnt mul string def /srcDataStrs [ imageDict begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def imageDict /MultipleDataSources known {MultipleDataSources}{false} ifelse { /imbufCnt imageDict /DataSource get length def /imbufs imbufCnt array def 0 1 imbufCnt 1 sub { /imbufIdx xdf imbufs imbufIdx imbufLen string put imageDict /DataSource get imbufIdx [ AGMUTIL_imagefile imbufs imbufIdx get /readstring cvx /pop cvx ] cvx put } for DeviceN_PS2 { imageDict begin /DataSource [ DataSource /devn_sep_datasource cvx ] cvx def /MultipleDataSources false def /Decode [0 1] def end } if }{ /imbuf imbufLen string def Indexed_DeviceN level3 not and DeviceN_NoneName or { imageDict begin /DataSource [AGMUTIL_imagefile Decode BitsPerComponent false 1 /filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource /exec cvx] cvx def /Decode [0 1] def end }{ imageDict /DataSource {AGMUTIL_imagefile imbuf readstring pop} put } ifelse } ifelse imageDict exch load exec imageDict /DataSource origDataSource put imageDict /MultipleDataSources origMultipleDataSources put imageDict /Decode origDecode put end } bdf /write_image_file { begin { (AGMUTIL_imagefile) (w+) file } stopped{ false }{ Adobe_AGM_Utils/AGMUTIL_imagefile xddf 2 dict begin /imbufLen Width BitsPerComponent mul 7 add 8 idiv def MultipleDataSources {DataSource 0 get}{DataSource}ifelse type /filetype eq { /imbuf imbufLen string def }if 1 1 Height { pop MultipleDataSources { 0 1 DataSource length 1 sub { DataSource type dup /arraytype eq { pop DataSource exch get exec }{ /filetype eq { DataSource exch get imbuf readstring pop }{ DataSource exch get } ifelse } ifelse AGMUTIL_imagefile exch writestring } for }{ DataSource type dup /arraytype eq { pop DataSource exec }{ /filetype eq { DataSource imbuf readstring pop }{ DataSource } ifelse } ifelse AGMUTIL_imagefile exch writestring } ifelse }for end true }ifelse end } bdf /close_image_file { AGMUTIL_imagefile closefile (AGMUTIL_imagefile) deletefile }def statusdict /product known userdict /AGMP_current_show known not and{ /pstr statusdict /product get def pstr (HP LaserJet 2200) eq pstr (HP LaserJet 4000 Series) eq or pstr (HP LaserJet 4050 Series ) eq or pstr (HP LaserJet 8000 Series) eq or pstr (HP LaserJet 8100 Series) eq or pstr (HP LaserJet 8150 Series) eq or pstr (HP LaserJet 5000 Series) eq or pstr (HP LaserJet 5100 Series) eq or pstr (HP Color LaserJet 4500) eq or pstr (HP Color LaserJet 4600) eq or pstr (HP LaserJet 5Si) eq or pstr (HP LaserJet 1200 Series) eq or pstr (HP LaserJet 1300 Series) eq or pstr (HP LaserJet 4100 Series) eq or { userdict /AGMP_current_show /show load put userdict /show { currentcolorspace 0 get /Pattern eq {false charpath f} {AGMP_current_show} ifelse } put }if currentdict /pstr undef } if /consumeimagedata { begin currentdict /MultipleDataSources known not {/MultipleDataSources false def} if MultipleDataSources { 1 dict begin /flushbuffer Width cvi string def 1 1 Height cvi { pop 0 1 DataSource length 1 sub { DataSource exch get dup type dup /filetype eq { exch flushbuffer readstring pop pop }if /arraytype eq { exec pop }if }for }for end } { /DataSource load type dup /filetype eq { 1 dict begin /flushbuffer Width Decode length 2 div mul cvi string def 1 1 Height { pop DataSource flushbuffer readstring pop pop} for end }if /arraytype eq { 1 1 Height { pop DataSource pop } for }if }ifelse end }bdf /addprocs { 2{/exec load}repeat 3 1 roll [ 5 1 roll ] bind cvx }def /modify_halftone_xfer { currenthalftone dup length dict copy begin currentdict 2 index known{ 1 index load dup length dict copy begin currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end def currentdict end sethalftone }{ currentdict/TransferFunction known{ /TransferFunction load }{ currenttransfer }ifelse addprocs /TransferFunction xdf currentdict end sethalftone pop }ifelse }def /clonearray { dup xcheck exch dup length array exch Adobe_AGM_Core/AGMCORE_tmp -1 ddf { Adobe_AGM_Core/AGMCORE_tmp AGMCORE_tmp 1 add ddf dup type /dicttype eq { AGMCORE_tmp exch clonedict Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if dup type /arraytype eq { AGMCORE_tmp exch clonearray Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf } if exch dup AGMCORE_tmp 4 -1 roll put }forall exch {cvx} if }bdf /clonedict { dup length dict begin { dup type /dicttype eq { clonedict } if dup type /arraytype eq { clonearray } if def }forall currentdict end }bdf /DeviceN_PS2 { /currentcolorspace AGMCORE_gget 0 get /DeviceN eq level3 not and } bdf /Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget dup null ne { /CSD known }{ pop false } ifelse } bdf /DeviceN_NoneName { /Names where { pop false Names { (None) eq or } forall }{ false }ifelse } bdf /DeviceN_PS2_inRip_seps { /AGMCORE_in_rip_sep where { pop dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /DeviceN eq level3 not and AGMCORE_in_rip_sep and { /currentcolorspace exch AGMCORE_gput false } { true }ifelse } { true } ifelse } { true } ifelse } bdf /base_colorspace_type { dup type /arraytype eq {0 get} if } bdf /doc_setup{ Adobe_AGM_Utils begin }bdf /doc_trailer{ currentdict Adobe_AGM_Utils eq{ end }if }bdf systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_AGM_Core 2.0 0 %%Version: 2.0 0 %%Copyright: Copyright (C) 1997-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Core 216 dict dup begin put /nd{ null def }bind def /Adobe_AGM_Core_Id /Adobe_AGM_Core_2.0_0 def /AGMCORE_str256 256 string def /AGMCORE_save nd /AGMCORE_graphicsave nd /AGMCORE_c 0 def /AGMCORE_m 0 def /AGMCORE_y 0 def /AGMCORE_k 0 def /AGMCORE_cmykbuf 4 array def /AGMCORE_screen [currentscreen] cvx def /AGMCORE_tmp 0 def /AGMCORE_&setgray nd /AGMCORE_&setcolor nd /AGMCORE_&setcolorspace nd /AGMCORE_&setcmykcolor nd /AGMCORE_cyan_plate nd /AGMCORE_magenta_plate nd /AGMCORE_yellow_plate nd /AGMCORE_black_plate nd /AGMCORE_plate_ndx nd /AGMCORE_get_ink_data nd /AGMCORE_is_cmyk_sep nd /AGMCORE_host_sep nd /AGMCORE_avoid_L2_sep_space nd /AGMCORE_distilling nd /AGMCORE_composite_job nd /AGMCORE_producing_seps nd /AGMCORE_ps_level -1 def /AGMCORE_ps_version -1 def /AGMCORE_environ_ok nd /AGMCORE_CSA_cache 0 dict def /AGMCORE_CSD_cache 0 dict def /AGMCORE_pattern_cache 0 dict def /AGMCORE_currentoverprint false def /AGMCORE_deltaX nd /AGMCORE_deltaY nd /AGMCORE_name nd /AGMCORE_sep_special nd /AGMCORE_err_strings 4 dict def /AGMCORE_cur_err nd /AGMCORE_ovp nd /AGMCORE_current_spot_alias false def /AGMCORE_inverting false def /AGMCORE_feature_dictCount nd /AGMCORE_feature_opCount nd /AGMCORE_feature_ctm nd /AGMCORE_ConvertToProcess false def /AGMCORE_Default_CTM matrix def /AGMCORE_Default_PageSize nd /AGMCORE_currentbg nd /AGMCORE_currentucr nd /AGMCORE_gradientcache 32 dict def /AGMCORE_in_pattern false def /knockout_unitsq nd /AGMCORE_CRD_cache where{ pop }{ /AGMCORE_CRD_cache 0 dict def }ifelse /AGMCORE_key_known { where{ /Adobe_AGM_Core_Id known }{ false }ifelse }ndf /flushinput { save 2 dict begin /CompareBuffer 3 -1 roll def /readbuffer 256 string def mark { currentfile readbuffer {readline} stopped {cleartomark mark} { not {pop exit} if CompareBuffer eq {exit} if }ifelse }loop cleartomark end restore }bdf /getspotfunction { AGMCORE_screen exch pop exch pop dup type /dicttype eq{ dup /HalftoneType get 1 eq{ /SpotFunction get }{ dup /HalftoneType get 2 eq{ /GraySpotFunction get }{ pop { abs exch abs 2 copy add 1 gt{ 1 sub dup mul exch 1 sub dup mul add 1 sub }{ dup mul exch dup mul add 1 exch sub }ifelse }bind }ifelse }ifelse }if } def /clp_npth { clip newpath } def /eoclp_npth { eoclip newpath } def /npth_clp { newpath clip } def /add_grad { AGMCORE_gradientcache 3 1 roll put }bdf /exec_grad { AGMCORE_gradientcache exch get exec }bdf /graphic_setup { /AGMCORE_graphicsave save def concat 0 setgray 0 setlinecap 0 setlinejoin 1 setlinewidth [] 0 setdash 10 setmiterlimit newpath false setoverprint false setstrokeadjust Adobe_AGM_Core/spot_alias get exec /Adobe_AGM_Image where { pop Adobe_AGM_Image/spot_alias 2 copy known{ get exec }{ pop pop }ifelse } if 100 dict begin /dictstackcount countdictstack def /showpage {} def mark } def /graphic_cleanup { cleartomark dictstackcount 1 countdictstack 1 sub {end}for end AGMCORE_graphicsave restore } def /compose_error_msg { grestoreall initgraphics /Helvetica findfont 10 scalefont setfont /AGMCORE_deltaY 100 def /AGMCORE_deltaX 310 def clippath pathbbox newpath pop pop 36 add exch 36 add exch moveto 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath 0 AGMCORE_&setgray gsave 1 AGMCORE_&setgray fill grestore 1 setlinewidth gsave stroke grestore currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto /AGMCORE_deltaY 12 def /AGMCORE_tmp 0 def AGMCORE_err_strings exch get { dup 32 eq { pop AGMCORE_str256 0 AGMCORE_tmp getinterval stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt { currentpoint AGMCORE_deltaY sub exch pop clippath pathbbox pop pop pop 44 add exch moveto } if AGMCORE_str256 0 AGMCORE_tmp getinterval show ( ) show 0 1 AGMCORE_str256 length 1 sub { AGMCORE_str256 exch 0 put }for /AGMCORE_tmp 0 def } { AGMCORE_str256 exch AGMCORE_tmp xpt /AGMCORE_tmp AGMCORE_tmp 1 add def } ifelse } forall } bdf /doc_setup{ Adobe_AGM_Core begin /AGMCORE_ps_version xdf /AGMCORE_ps_level xdf errordict /AGM_handleerror known not{ errordict /AGM_handleerror errordict /handleerror get put errordict /handleerror { Adobe_AGM_Core begin $error /newerror get AGMCORE_cur_err null ne and{ $error /newerror false put AGMCORE_cur_err compose_error_msg }if $error /newerror true put end errordict /AGM_handleerror get exec } bind put }if /AGMCORE_environ_ok ps_level AGMCORE_ps_level ge ps_version AGMCORE_ps_version ge and AGMCORE_ps_level -1 eq or def AGMCORE_environ_ok not {/AGMCORE_cur_err /AGMCORE_bad_environ def} if /AGMCORE_&setgray systemdict/setgray get def level2{ /AGMCORE_&setcolor systemdict/setcolor get def /AGMCORE_&setcolorspace systemdict/setcolorspace get def }if /AGMCORE_currentbg currentblackgeneration def /AGMCORE_currentucr currentundercolorremoval def /AGMCORE_distilling /product where{ pop systemdict/setdistillerparams known product (Adobe PostScript Parser) ne and }{ false }ifelse def level2 not{ /xput{ dup load dup length exch maxlength eq{ dup dup load dup length dup 0 eq {pop 1} if 2 mul dict copy def }if load begin def end }def }{ /xput{ load 3 1 roll put }def }ifelse /AGMCORE_GSTATE AGMCORE_key_known not{ /AGMCORE_GSTATE 21 dict def /AGMCORE_tmpmatrix matrix def /AGMCORE_gstack 32 array def /AGMCORE_gstackptr 0 def /AGMCORE_gstacksaveptr 0 def /AGMCORE_gstackframekeys 10 def /AGMCORE_&gsave /gsave ldf /AGMCORE_&grestore /grestore ldf /AGMCORE_&grestoreall /grestoreall ldf /AGMCORE_&save /save ldf /AGMCORE_gdictcopy { begin { def } forall end }def /AGMCORE_gput { AGMCORE_gstack AGMCORE_gstackptr get 3 1 roll put }def /AGMCORE_gget { AGMCORE_gstack AGMCORE_gstackptr get exch get }def /gsave { AGMCORE_&gsave AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if Adobe_AGM_Core exch /AGMCORE_gstackptr xpt AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def /grestore { AGMCORE_&grestore AGMCORE_gstackptr 1 sub dup AGMCORE_gstacksaveptr lt {1 add} if Adobe_AGM_Core exch /AGMCORE_gstackptr xpt }def /grestoreall { AGMCORE_&grestoreall Adobe_AGM_Core /AGMCORE_gstackptr AGMCORE_gstacksaveptr put }def /save { AGMCORE_&save AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gstackptr 1 add dup 32 ge {limitcheck} if Adobe_AGM_Core begin /AGMCORE_gstackptr exch def /AGMCORE_gstacksaveptr AGMCORE_gstackptr def end AGMCORE_gstack AGMCORE_gstackptr get AGMCORE_gdictcopy }def 0 1 AGMCORE_gstack length 1 sub { AGMCORE_gstack exch AGMCORE_gstackframekeys dict put } for }if level3 /AGMCORE_&sysshfill AGMCORE_key_known not and { /AGMCORE_&sysshfill systemdict/shfill get def /AGMCORE_&usrshfill /shfill load def /AGMCORE_&sysmakepattern systemdict/makepattern get def /AGMCORE_&usrmakepattern /makepattern load def }if /currentcmykcolor [0 0 0 0] AGMCORE_gput /currentstrokeadjust false AGMCORE_gput /currentcolorspace [/DeviceGray] AGMCORE_gput /sep_tint 0 AGMCORE_gput /devicen_tints [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] AGMCORE_gput /sep_colorspace_dict null AGMCORE_gput /devicen_colorspace_dict null AGMCORE_gput /indexed_colorspace_dict null AGMCORE_gput /currentcolor_intent () AGMCORE_gput /customcolor_tint 1 AGMCORE_gput << /MaxPatternItem currentsystemparams /MaxPatternCache get >> setuserparams end }def /page_setup { /setcmykcolor where{ pop Adobe_AGM_Core/AGMCORE_&setcmykcolor /setcmykcolor load put }if Adobe_AGM_Core begin /setcmykcolor { 4 copy AGMCORE_cmykbuf astore /currentcmykcolor exch AGMCORE_gput 1 sub 4 1 roll 3 { 3 index add neg dup 0 lt { pop 0 } if 3 1 roll } repeat setrgbcolor pop }ndf /currentcmykcolor { /currentcmykcolor AGMCORE_gget aload pop }ndf /setoverprint { pop }ndf /currentoverprint { false }ndf /AGMCORE_deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt def /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def /AGMCORE_plate_ndx AGMCORE_cyan_plate{ 0 }{ AGMCORE_magenta_plate{ 1 }{ AGMCORE_yellow_plate{ 2 }{ AGMCORE_black_plate{ 3 }{ 4 }ifelse }ifelse }ifelse }ifelse def /AGMCORE_have_reported_unsupported_color_space false def /AGMCORE_report_unsupported_color_space { AGMCORE_have_reported_unsupported_color_space false eq { (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.) == Adobe_AGM_Core /AGMCORE_have_reported_unsupported_color_space true ddf } if }def /AGMCORE_composite_job AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def /AGMCORE_in_rip_sep /AGMCORE_in_rip_sep where{ pop AGMCORE_in_rip_sep }{ AGMCORE_distilling { false }{ userdict/Adobe_AGM_OnHost_Seps known{ false }{ level2{ currentpagedevice/Separations 2 copy known{ get }{ pop pop false }ifelse }{ false }ifelse }ifelse }ifelse }ifelse def /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def /AGM_preserve_spots /AGM_preserve_spots where{ pop AGM_preserve_spots }{ AGMCORE_distilling AGMCORE_producing_seps or }ifelse def /AGM_is_distiller_preserving_spotimages { currentdistillerparams/PreserveOverprintSettings known { currentdistillerparams/PreserveOverprintSettings get { currentdistillerparams/ColorConversionStrategy known { currentdistillerparams/ColorConversionStrategy get /LeaveColorUnchanged eq }{ true }ifelse }{ false }ifelse }{ false }ifelse }def /convert_spot_to_process where {pop}{ /convert_spot_to_process { dup map_alias { /Name get exch pop } if dup dup (None) eq exch (All) eq or { pop false }{ AGMCORE_host_sep { gsave 1 0 0 0 setcmykcolor currentgray 1 exch sub 0 1 0 0 setcmykcolor currentgray 1 exch sub 0 0 1 0 setcmykcolor currentgray 1 exch sub 0 0 0 1 setcmykcolor currentgray 1 exch sub add add add 0 eq { pop false }{ false setoverprint 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq }ifelse grestore }{ AGMCORE_distilling { pop AGM_is_distiller_preserving_spotimages not }{ Adobe_AGM_Core/AGMCORE_name xddf false Adobe_AGM_Core/AGMCORE_in_pattern known {Adobe_AGM_Core/AGMCORE_in_pattern get}{false} ifelse not currentpagedevice/OverrideSeparations known and { currentpagedevice/OverrideSeparations get { /HqnSpots /ProcSet resourcestatus { pop pop pop true }if }if }if { AGMCORE_name /HqnSpots /ProcSet findresource /TestSpot get exec not }{ gsave [/Separation AGMCORE_name /DeviceGray {}]setcolorspace false currentpagedevice/SeparationColorNames 2 copy known { get { AGMCORE_name eq or}forall not }{ pop pop pop true }ifelse grestore }ifelse }ifelse }ifelse }ifelse }def }ifelse /convert_to_process where {pop}{ /convert_to_process { dup length 0 eq { pop false }{ AGMCORE_host_sep { dup true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process and}ifelse } forall { true exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch (Black) eq or and }forall not }{pop false}ifelse }{ false exch { dup (Cyan) eq exch dup (Magenta) eq 3 -1 roll or exch dup (Yellow) eq 3 -1 roll or exch dup (Black) eq 3 -1 roll or {pop} {convert_spot_to_process or}ifelse } forall }ifelse }ifelse }def }ifelse /AGMCORE_avoid_L2_sep_space version cvr 2012 lt level2 and AGMCORE_producing_seps not and def /AGMCORE_is_cmyk_sep AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or def /AGM_avoid_0_cmyk where{ pop AGM_avoid_0_cmyk }{ AGM_preserve_spots userdict/Adobe_AGM_OnHost_Seps known userdict/Adobe_AGM_InRip_Seps known or not and }ifelse { /setcmykcolor[ { 4 copy add add add 0 eq currentoverprint and{ pop 0.0005 }if }/exec cvx /AGMCORE_&setcmykcolor load dup type/operatortype ne{ /exec cvx }if ]cvx def }if AGMCORE_host_sep{ /setcolortransfer { AGMCORE_cyan_plate{ pop pop pop }{ AGMCORE_magenta_plate{ 4 3 roll pop pop pop }{ AGMCORE_yellow_plate{ 4 2 roll pop pop pop }{ 4 1 roll pop pop pop }ifelse }ifelse }ifelse settransfer } def /AGMCORE_get_ink_data AGMCORE_cyan_plate{ {pop pop pop} }{ AGMCORE_magenta_plate{ {4 3 roll pop pop pop} }{ AGMCORE_yellow_plate{ {4 2 roll pop pop pop} }{ {4 1 roll pop pop pop} }ifelse }ifelse }ifelse def /AGMCORE_RemoveProcessColorNames { 1 dict begin /filtername { dup /Cyan eq 1 index (Cyan) eq or {pop (_cyan_)}if dup /Magenta eq 1 index (Magenta) eq or {pop (_magenta_)}if dup /Yellow eq 1 index (Yellow) eq or {pop (_yellow_)}if dup /Black eq 1 index (Black) eq or {pop (_black_)}if }def dup type /arraytype eq {[exch {filtername}forall]} {filtername}ifelse end }def /AGMCORE_IsSeparationAProcessColor { dup (Cyan) eq exch dup (Magenta) eq exch dup (Yellow) eq exch (Black) eq or or or }def level3 { /AGMCORE_IsCurrentColor { gsave false setoverprint 1 1 1 1 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq grestore }def /AGMCORE_filter_functiondatasource { 5 dict begin /data_in xdf data_in type /stringtype eq { /ncomp xdf /comp xdf /string_out data_in length ncomp idiv string def 0 ncomp data_in length 1 sub { string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put }for string_out }{ string /string_in xdf /string_out 1 string def /component xdf [ data_in string_in /readstring cvx [component /get cvx 255 /exch cvx /sub cvx string_out /exch cvx 0 /exch cvx /put cvx string_out]cvx [/pop cvx ()]cvx /ifelse cvx ]cvx /ReusableStreamDecode filter }ifelse end }def /AGMCORE_separateShadingFunction { 2 dict begin /paint? xdf /channel xdf begin FunctionType 0 eq { /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def currentdict /Decode known {/Decode Decode channel 2 mul 2 getinterval def}if paint? not {/Decode [1 1]def}if }if FunctionType 2 eq { paint? { /C0 [C0 channel get 1 exch sub] def /C1 [C1 channel get 1 exch sub] def }{ /C0 [1] def /C1 [1] def }ifelse }if FunctionType 3 eq { /Functions [Functions {channel paint? AGMCORE_separateShadingFunction} forall] def }if currentdict /Range known {/Range [0 1] def}if currentdict end end }def /AGMCORE_separateShading { 3 -1 roll begin currentdict /Function known { currentdict /Background known {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if Function 3 1 roll AGMCORE_separateShadingFunction /Function xdf /ColorSpace [/DeviceGray] def }{ ColorSpace dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] def }{ ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put }ifelse ColorSpace 0 get /Separation eq { { [1 /exch cvx /sub cvx]cvx }{ [/pop cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll put pop }{ { [exch ColorSpace 1 get length 1 sub exch sub /index cvx 1 /exch cvx /sub cvx ColorSpace 1 get length 1 add 1 /roll cvx ColorSpace 1 get length{/pop cvx} repeat]cvx }{ pop [ColorSpace 1 get length {/pop cvx} repeat cvx 1]cvx }ifelse ColorSpace 3 3 -1 roll bind put }ifelse ColorSpace 2 /DeviceGray put }ifelse end }def /AGMCORE_separateShadingDict { dup /ColorSpace get dup type /arraytype ne {[exch]}if dup 0 get /DeviceCMYK eq { exch begin currentdict AGMCORE_cyan_plate {0 true}if AGMCORE_magenta_plate {1 true}if AGMCORE_yellow_plate {2 true}if AGMCORE_black_plate {3 true}if AGMCORE_plate_ndx 4 eq {0 false}if dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading currentdict end exch }if dup 0 get /Separation eq { exch begin ColorSpace 1 get dup /None ne exch /All ne and { ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /Separation ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading }if }ifelse }{ currentdict ColorSpace 1 get AGMCORE_IsCurrentColor 0 exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse }if currentdict end exch }if dup 0 get /DeviceN eq { exch begin ColorSpace 1 get convert_to_process { ColorSpace 2 get dup type /arraytype eq {0 get}if /DeviceCMYK eq { /ColorSpace [ /DeviceN ColorSpace 1 get /DeviceGray [ ColorSpace 3 get /exec cvx 4 AGMCORE_plate_ndx sub -1 /roll cvx 4 1 /roll cvx 3 [/pop cvx]cvx /repeat cvx 1 /exch cvx /sub cvx ]cvx ]def }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { currentdict 0 false AGMCORE_separateShading /ColorSpace [/DeviceGray] def }if }ifelse }{ currentdict false -1 ColorSpace 1 get { AGMCORE_IsCurrentColor { 1 add exch pop true exch exit }if 1 add }forall exch dup not currentoverprint and {/AGMCORE_ignoreshade true def}if AGMCORE_separateShading }ifelse currentdict end exch }if dup 0 get dup /DeviceCMYK eq exch dup /Separation eq exch /DeviceN eq or or not { exch begin ColorSpace dup type /arraytype eq {0 get}if /DeviceGray ne { AGMCORE_report_unsupported_color_space AGMCORE_black_plate not { ColorSpace 0 get /CIEBasedA eq { /ColorSpace [/Separation /_ciebaseda_ /DeviceGray {}] def }if ColorSpace 0 get dup /CIEBasedABC eq exch dup /CIEBasedDEF eq exch /DeviceRGB eq or or { /ColorSpace [/DeviceN [/_red_ /_green_ /_blue_] /DeviceRGB {}] def }if ColorSpace 0 get /CIEBasedDEFG eq { /ColorSpace [/DeviceN [/_cyan_ /_magenta_ /_yellow_ /_black_] /DeviceCMYK {}] }if currentdict 0 false AGMCORE_separateShading }if }if currentdict end exch }if pop dup /AGMCORE_ignoreshade known { begin /ColorSpace [/Separation (None) /DeviceGray {}] def currentdict end }if }def /shfill { clonedict AGMCORE_separateShadingDict dup /AGMCORE_ignoreshade known {pop} {AGMCORE_&sysshfill}ifelse }def /makepattern { exch dup /PatternType get 2 eq { clonedict begin /Shading Shading AGMCORE_separateShadingDict def currentdict end exch AGMCORE_&sysmakepattern }{ exch AGMCORE_&usrmakepattern }ifelse }def }if }if AGMCORE_in_rip_sep{ /setcustomcolor { exch aload pop dup 7 1 roll inRip_spot_has_ink not { 4 {4 index mul 4 1 roll} repeat /DeviceCMYK setcolorspace 6 -2 roll pop pop }{ Adobe_AGM_Core begin /AGMCORE_k xdf /AGMCORE_y xdf /AGMCORE_m xdf /AGMCORE_c xdf end [/Separation 4 -1 roll /DeviceCMYK {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} ] setcolorspace }ifelse setcolor }ndf /setseparationgray { [/Separation (All) /DeviceGray {}] setcolorspace_opt 1 exch sub setcolor }ndf }{ /setseparationgray { AGMCORE_&setgray }ndf }ifelse /findcmykcustomcolor { 5 makereadonlyarray }ndf /setcustomcolor { exch aload pop pop 4 {4 index mul 4 1 roll} repeat setcmykcolor pop }ndf /has_color /colorimage where{ AGMCORE_producing_seps{ pop true }{ systemdict eq }ifelse }{ false }ifelse def /map_index { 1 index mul exch getinterval {255 div} forall } bdf /map_indexed_devn { Lookup Names length 3 -1 roll cvi map_index } bdf /n_color_components { base_colorspace_type dup /DeviceGray eq{ pop 1 }{ /DeviceCMYK eq{ 4 }{ 3 }ifelse }ifelse }bdf level2{ /mo /moveto ldf /li /lineto ldf /cv /curveto ldf /knockout_unitsq { 1 setgray 0 0 1 1 rectfill }def /level2ScreenFreq{ begin 60 HalftoneType 1 eq{ pop Frequency }if HalftoneType 2 eq{ pop GrayFrequency }if HalftoneType 5 eq{ pop Default level2ScreenFreq }if end }def /currentScreenFreq{ currenthalftone level2ScreenFreq }def level2 /setcolorspace AGMCORE_key_known not and{ /AGMCORE_&&&setcolorspace /setcolorspace ldf /AGMCORE_ReplaceMappedColor { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get dup /Separation eq { pop dup length array copy dup dup 1 get current_spot_alias { dup map_alias { begin /sep_colorspace_dict currentdict AGMCORE_gput pop pop pop [ /Separation Name CSA map_csa dup /MappedCSA xdf /sep_colorspace_proc load ] dup Name end }if }if map_reserved_ink_name 1 xpt }{ /DeviceN eq { dup length array copy dup dup 1 get [ exch { current_spot_alias{ dup map_alias{ /Name get exch pop }if }if map_reserved_ink_name } forall ] 1 xpt }if }ifelse }if }def /setcolorspace { dup type dup /arraytype eq exch /packedarraytype eq or { dup 0 get /Indexed eq { AGMCORE_distilling { /PhotoshopDuotoneList where { pop false }{ true }ifelse }{ true }ifelse { aload pop 3 -1 roll AGMCORE_ReplaceMappedColor 3 1 roll 4 array astore }if }{ AGMCORE_ReplaceMappedColor }ifelse }if DeviceN_PS2_inRip_seps {AGMCORE_&&&setcolorspace} if }def }if }{ /adj { currentstrokeadjust{ transform 0.25 sub round 0.25 add exch 0.25 sub round 0.25 add exch itransform }if }def /mo{ adj moveto }def /li{ adj lineto }def /cv{ 6 2 roll adj 6 2 roll adj 6 2 roll adj curveto }def /knockout_unitsq { 1 setgray 8 8 1 [8 0 0 8 0 0] {} image }def /currentstrokeadjust{ /currentstrokeadjust AGMCORE_gget }def /setstrokeadjust{ /currentstrokeadjust exch AGMCORE_gput }def /currentScreenFreq{ currentscreen pop pop }def /setcolorspace { /currentcolorspace exch AGMCORE_gput } def /currentcolorspace { /currentcolorspace AGMCORE_gget } def /setcolor_devicecolor { base_colorspace_type dup /DeviceGray eq{ pop setgray }{ /DeviceCMYK eq{ setcmykcolor }{ setrgbcolor }ifelse }ifelse }def /setcolor { currentcolorspace 0 get dup /DeviceGray ne{ dup /DeviceCMYK ne{ dup /DeviceRGB ne{ dup /Separation eq{ pop currentcolorspace 3 get exec currentcolorspace 2 get }{ dup /Indexed eq{ pop currentcolorspace 3 get dup type /stringtype eq{ currentcolorspace 1 get n_color_components 3 -1 roll map_index }{ exec }ifelse currentcolorspace 1 get }{ /AGMCORE_cur_err /AGMCORE_invalid_color_space def AGMCORE_invalid_color_space }ifelse }ifelse }if }if }if setcolor_devicecolor } def }ifelse /sop /setoverprint ldf /lw /setlinewidth ldf /lc /setlinecap ldf /lj /setlinejoin ldf /ml /setmiterlimit ldf /dsh /setdash ldf /sadj /setstrokeadjust ldf /gry /setgray ldf /rgb /setrgbcolor ldf /cmyk /setcmykcolor ldf /sep /setsepcolor ldf /devn /setdevicencolor ldf /idx /setindexedcolor ldf /colr /setcolor ldf /csacrd /set_csa_crd ldf /sepcs /setsepcolorspace ldf /devncs /setdevicencolorspace ldf /idxcs /setindexedcolorspace ldf /cp /closepath ldf /clp /clp_npth ldf /eclp /eoclp_npth ldf /f /fill ldf /ef /eofill ldf /@ /stroke ldf /nclp /npth_clp ldf /gset /graphic_setup ldf /gcln /graphic_cleanup ldf currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and { bind }if def }forall /currentpagedevice currentpagedevice def /getrampcolor { /indx exch def 0 1 NumComp 1 sub { dup Samples exch get dup type /stringtype eq { indx get } if exch Scaling exch get aload pop 3 1 roll mul add } for ColorSpaceFamily /Separation eq { sep } { ColorSpaceFamily /DeviceN eq { devn } { setcolor }ifelse }ifelse } bind def /sssetbackground { aload pop setcolor } bind def /RadialShade { 40 dict begin /ColorSpaceFamily exch def /background exch def /ext1 exch def /ext0 exch def /BBox exch def /r2 exch def /c2y exch def /c2x exch def /r1 exch def /c1y exch def /c1x exch def /rampdict exch def /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if c1x c2x eq { c1y c2y lt {/theta 90 def}{/theta 270 def} ifelse } { /slope c2y c1y sub c2x c1x sub div def /theta slope 1 atan def c2x c1x lt c2y c1y ge and { /theta theta 180 sub def} if c2x c1x lt c2y c1y lt and { /theta theta 180 add def} if } ifelse gsave clippath c1x c1y translate theta rotate -90 rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { /max { 2 copy gt { pop } {exch pop} ifelse } bind def /min { 2 copy lt { pop } {exch pop} ifelse } bind def rampdict begin 40 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave c1x c1y translate theta rotate -90 rotate /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def /c1y 0 def /c1x 0 def /c2x 0 def ext0 { 0 getrampcolor c2y r2 add r1 sub 0.0001 lt { c1x c1y r1 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2y r1 add r2 le { c1x c1y r1 0 360 arc fill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r1 neg def /p1y c1y def /p2x r1 def /p2y c1y def p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto fill } { /AA r2 r1 sub c2y div def /theta AA 1 AA dup mul sub sqrt div 1 atan def /SS1 90 theta add dup sin exch cos div def /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y p1x SS1 div neg def /SS2 90 theta sub dup sin exch cos div def /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y p2x SS2 div neg def r1 r2 gt { /L1maxX p1x yMin p1y sub SS1 div add def /L2maxX p2x yMin p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if c1x c2x sub dup mul c1y c2y sub dup mul add 0.5 exp 0 dtransform dup mul exch dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop /hires exch def hires mul /numpix exch def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if /xInc c2x c1x sub numsteps div def /yInc c2y c1y sub numsteps div def /rInc r2 r1 sub numsteps div def /cx c1x def /cy c1y def /radius r1 def newpath xInc 0 eq yInc 0 eq rInc 0 eq and and { 0 getrampcolor cx cy radius 0 360 arc stroke NumSamples 1 sub getrampcolor cx cy radius 72 hires div add 0 360 arc 0 setlinewidth stroke } { 0 numsteps { dup subsampling { round cvi } if getrampcolor cx cy radius 0 360 arc /cx cx xInc add def /cy cy yInc add def /radius radius rInc add def cx cy radius 360 0 arcn eofill rampIndxInc add } repeat pop } ifelse ext1 { c2y r2 add r1 lt { c2x c2y r2 0 360 arc fill } { c2y r1 add r2 sub 0.0001 le { c2x c2y r2 360 0 arcn pathbbox /aymax exch def /axmax exch def /aymin exch def /axmin exch def /bxMin xMin axmin min def /byMin yMin aymin min def /bxMax xMax axmax max def /byMax yMax aymax max def bxMin byMin moveto bxMax byMin lineto bxMax byMax lineto bxMin byMax lineto bxMin byMin lineto eofill } { c2x c2y r2 0 360 arc fill r1 r2 eq { /p1x r2 neg def /p1y c2y def /p2x r2 def /p2y c2y def p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto fill } { /AA r2 r1 sub c2y div def /theta AA 1 AA dup mul sub sqrt div 1 atan def /SS1 90 theta add dup sin exch cos div def /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def /p1y c2y p1x SS1 div sub def /SS2 90 theta sub dup sin exch cos div def /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def /p2y c2y p2x SS2 div sub def r1 r2 lt { /L1maxX p1x yMax p1y sub SS1 div add def /L2maxX p2x yMax p2y sub SS2 div add def } { /L1maxX 0 def /L2maxX 0 def }ifelse p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto L1maxX L1maxX p1x sub SS1 mul p1y add lineto fill } ifelse } ifelse } ifelse } if grestore grestore end end end } ifelse } bind def /GenStrips { 40 dict begin /ColorSpaceFamily exch def /background exch def /ext1 exch def /ext0 exch def /BBox exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def /rampdict exch def /setinkoverprint where {pop /setinkoverprint{pop}def}if gsave BBox length 0 gt { newpath BBox 0 get BBox 1 get moveto BBox 2 get BBox 0 get sub 0 rlineto 0 BBox 3 get BBox 1 get sub rlineto BBox 2 get BBox 0 get sub neg 0 rlineto closepath clip newpath } if x1 x2 eq { y1 y2 lt {/theta 90 def}{/theta 270 def} ifelse } { /slope y2 y1 sub x2 x1 sub div def /theta slope 1 atan def x2 x1 lt y2 y1 ge and { /theta theta 180 sub def} if x2 x1 lt y2 y1 lt and { /theta theta 180 add def} if } ifelse gsave clippath x1 y1 translate theta rotate { pathbbox } stopped { 0 0 0 0 } if /yMax exch def /xMax exch def /yMin exch def /xMin exch def grestore xMax xMin eq yMax yMin eq or { grestore end } { rampdict begin 20 dict begin background length 0 gt { background sssetbackground gsave clippath fill grestore } if gsave x1 y1 translate theta rotate /xStart 0 def /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def /ySpan yMax yMin sub def /numsteps NumSamples def /rampIndxInc 1 def /subsampling false def xStart 0 transform xEnd 0 transform 3 -1 roll sub dup mul 3 1 roll sub dup mul add 0.5 exp 72 div 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt 1 index 1 index lt { exch } if pop mul /numpix exch def numpix 0 ne { NumSamples numpix div 0.5 gt { /numsteps numpix 2 div round cvi dup 1 le { pop 2 } if def /rampIndxInc NumSamples 1 sub numsteps div def /subsampling true def } if } if ext0 { 0 getrampcolor xMin xStart lt { xMin yMin xMin neg ySpan rectfill } if } if /xInc xEnd xStart sub numsteps div def /x xStart def 0 numsteps { dup subsampling { round cvi } if getrampcolor x yMin xInc ySpan rectfill /x x xInc add def rampIndxInc add } repeat pop ext1 { xMax xEnd gt { xEnd yMin xMax xEnd sub ySpan rectfill } if } if grestore grestore end end end } ifelse } bind def }def /page_trailer { end }def /doc_trailer{ }def systemdict /findcolorrendering known{ /findcolorrendering systemdict /findcolorrendering get def }if systemdict /setcolorrendering known{ /setcolorrendering systemdict /setcolorrendering get def }if /test_cmyk_color_plate { gsave setcmykcolor currentgray 1 ne grestore }def /inRip_spot_has_ink { dup Adobe_AGM_Core/AGMCORE_name xddf convert_spot_to_process not }def /map255_to_range { 1 index sub 3 -1 roll 255 div mul add }def /set_csa_crd { /sep_colorspace_dict null AGMCORE_gput begin CSA map_csa setcolorspace_opt set_crd end } def /setsepcolor { /sep_colorspace_dict AGMCORE_gget begin dup /sep_tint exch AGMCORE_gput TintProc end } def /setdevicencolor { /devicen_colorspace_dict AGMCORE_gget begin Names length copy Names length 1 sub -1 0 { /devicen_tints AGMCORE_gget 3 1 roll xpt } for TintProc end } def /sep_colorspace_proc { Adobe_AGM_Core/AGMCORE_tmp xddf /sep_colorspace_dict AGMCORE_gget begin currentdict/Components known{ Components aload pop TintMethod/Lab eq{ 2 {AGMCORE_tmp mul NComponents 1 roll} repeat LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll }{ TintMethod/Subtractive eq{ NComponents{ AGMCORE_tmp mul NComponents 1 roll }repeat }{ NComponents{ 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll } repeat }ifelse }ifelse }{ ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get aload pop }ifelse end } def /sep_colorspace_gray_proc { Adobe_AGM_Core/AGMCORE_tmp xddf /sep_colorspace_dict AGMCORE_gget begin GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get end } def /sep_proc_name { dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or level2 not and has_color not and{ pop [/DeviceGray] /sep_colorspace_gray_proc }{ /sep_colorspace_proc }ifelse } def /setsepcolorspace { current_spot_alias{ dup begin Name map_alias{ exch pop }if end }if dup /sep_colorspace_dict exch AGMCORE_gput begin /MappedCSA CSA map_csa def Adobe_AGM_Core/AGMCORE_sep_special Name dup () eq exch (All) eq or ddf AGMCORE_avoid_L2_sep_space{ [/Indexed MappedCSA sep_proc_name 255 exch { 255 div } /exec cvx 3 -1 roll [ 4 1 roll load /exec cvx ] cvx ] setcolorspace_opt /TintProc { 255 mul round cvi setcolor }bdf }{ MappedCSA 0 get /DeviceCMYK eq currentdict/Components known and AGMCORE_sep_special not and{ /TintProc [ Components aload pop Name findcmykcustomcolor /exch cvx /setcustomcolor cvx ] cvx bdf }{ AGMCORE_host_sep Name (All) eq and{ /TintProc { 1 exch sub setseparationgray }bdf }{ AGMCORE_in_rip_sep MappedCSA 0 get /DeviceCMYK eq and AGMCORE_host_sep or Name () eq and{ /TintProc [ MappedCSA sep_proc_name exch 0 get /DeviceCMYK eq{ cvx /setcmykcolor cvx }{ cvx /setgray cvx }ifelse ] cvx bdf }{ AGMCORE_producing_seps MappedCSA 0 get dup /DeviceCMYK eq exch /DeviceGray eq or and AGMCORE_sep_special not and{ /TintProc [ /dup cvx MappedCSA sep_proc_name cvx exch 0 get /DeviceGray eq{ 1 /exch cvx /sub cvx 0 0 0 4 -1 /roll cvx }if /Name cvx /findcmykcustomcolor cvx /exch cvx AGMCORE_host_sep{ AGMCORE_is_cmyk_sep /Name cvx /AGMCORE_IsSeparationAProcessColor load /exec cvx /not cvx /and cvx }{ Name inRip_spot_has_ink not }ifelse [ /pop cvx 1 ] cvx /if cvx /setcustomcolor cvx ] cvx bdf }{ /TintProc /setcolor ldf [/Separation Name MappedCSA sep_proc_name load ] setcolorspace_opt }ifelse }ifelse }ifelse }ifelse }ifelse set_crd setsepcolor end } def /additive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 0 1 numarrays 1 sub { 1 exch add /index cvx c1 /get cvx /mul cvx }for numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /subtractive_blend { 3 dict begin /numarrays xdf /numcolors xdf 0 1 numcolors 1 sub { /c1 xdf 1 1 0 1 numarrays 1 sub { 1 3 3 -1 roll add /index cvx c1 /get cvx /sub cvx /mul cvx }for /sub cvx numarrays 1 add 1 /roll cvx }for numarrays [/pop cvx] cvx /repeat cvx end }def /exec_tint_transform { /TintProc [ /TintTransform cvx /setcolor cvx ] cvx bdf MappedCSA setcolorspace_opt } bdf /devn_makecustomcolor { 2 dict begin /names_index xdf /Names xdf 1 1 1 1 Names names_index get findcmykcustomcolor /devicen_tints AGMCORE_gget names_index get setcustomcolor Names length {pop} repeat end } bdf /setdevicencolorspace { dup /AliasedColorants known {false}{true}ifelse current_spot_alias and { 6 dict begin /names_index 0 def dup /names_len exch /Names get length def /new_names names_len array def /new_LookupTables names_len array def /alias_cnt 0 def dup /Names get { dup map_alias { exch pop dup /ColorLookup known { dup begin new_LookupTables names_index ColorLookup put end }{ dup /Components known { dup begin new_LookupTables names_index Components put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse new_names names_index 3 -1 roll /Name get put /alias_cnt alias_cnt 1 add def }{ /name xdf new_names names_index name put dup /LookupTables known { dup begin new_LookupTables names_index LookupTables names_index get put end }{ dup begin new_LookupTables names_index [null null null null] put end } ifelse } ifelse /names_index names_index 1 add def } forall alias_cnt 0 gt { /AliasedColorants true def 0 1 names_len 1 sub { /names_index xdf new_LookupTables names_index get 0 get null eq { dup /Names get names_index get /name xdf name (Cyan) eq name (Magenta) eq name (Yellow) eq name (Black) eq or or or not { /AliasedColorants false def exit } if } if } for AliasedColorants { dup begin /Names new_names def /AliasedColorants true def /LookupTables new_LookupTables def currentdict /TTTablesIdx known not { /TTTablesIdx -1 def } if currentdict /NComponents known not { /NComponents TintMethod /Subtractive eq {4}{3}ifelse def } if end } if }if end } if dup /devicen_colorspace_dict exch AGMCORE_gput begin /MappedCSA CSA map_csa def currentdict /AliasedColorants known { AliasedColorants }{ false } ifelse /TintTransform load type /nulltype eq or { /TintTransform [ 0 1 Names length 1 sub { /TTTablesIdx TTTablesIdx 1 add def dup LookupTables exch get dup 0 get null eq { 1 index Names exch get dup (Cyan) eq { pop exch LookupTables length exch sub /index cvx 0 0 0 } { dup (Magenta) eq { pop exch LookupTables length exch sub /index cvx 0 /exch cvx 0 0 } { (Yellow) eq { exch LookupTables length exch sub /index cvx 0 0 3 -1 /roll cvx 0 } { exch LookupTables length exch sub /index cvx 0 0 0 4 -1 /roll cvx } ifelse } ifelse } ifelse 5 -1 /roll cvx /astore cvx } { dup length 1 sub LookupTables length 4 -1 roll sub 1 add /index cvx /mul cvx /round cvx /cvi cvx /get cvx } ifelse Names length TTTablesIdx add 1 add 1 /roll cvx } for Names length [/pop cvx] cvx /repeat cvx NComponents Names length TintMethod /Subtractive eq { subtractive_blend } { additive_blend } ifelse ] cvx bdf } if AGMCORE_host_sep { Names convert_to_process { exec_tint_transform } { currentdict /AliasedColorants known { AliasedColorants not }{ false } ifelse 5 dict begin /AvoidAliasedColorants xdf /painted? false def /names_index 0 def /names_len Names length def Names { AvoidAliasedColorants { /currentspotalias current_spot_alias def false set_spot_alias } if AGMCORE_is_cmyk_sep { dup (Cyan) eq AGMCORE_cyan_plate and exch dup (Magenta) eq AGMCORE_magenta_plate and exch dup (Yellow) eq AGMCORE_yellow_plate and exch (Black) eq AGMCORE_black_plate and or or or { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def } if painted? {exit} if }{ 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq { /devicen_colorspace_dict AGMCORE_gget /TintProc [ Names names_index /devn_makecustomcolor cvx ] cvx ddf /painted? true def exit } if } ifelse AvoidAliasedColorants { currentspotalias set_spot_alias } if /names_index names_index 1 add def } forall painted? { /devicen_colorspace_dict AGMCORE_gget /names_index names_index put }{ /devicen_colorspace_dict AGMCORE_gget /TintProc [ names_len [/pop cvx] cvx /repeat cvx 1 /setseparationgray cvx 0 0 0 0 () /findcmykcustomcolor cvx 0 /setcustomcolor cvx ] cvx ddf } ifelse end } ifelse } { AGMCORE_in_rip_sep { Names convert_to_process not }{ level3 } ifelse { [/DeviceN Names MappedCSA /TintTransform load] setcolorspace_opt /TintProc level3 not AGMCORE_in_rip_sep and { [ Names /length cvx [/pop cvx] cvx /repeat cvx ] cvx bdf }{ /setcolor ldf } ifelse }{ exec_tint_transform } ifelse } ifelse set_crd /AliasedColorants false def end } def /setindexedcolorspace { dup /indexed_colorspace_dict exch AGMCORE_gput begin currentdict /CSD known { CSD get_csd /Names known { CSD get_csd begin currentdict devncs AGMCORE_host_sep{ 4 dict begin /devnCompCnt Names length def /NewLookup HiVal 1 add string def 0 1 HiVal { /tableIndex xdf Lookup dup type /stringtype eq { devnCompCnt tableIndex map_index }{ exec } ifelse setdevicencolor currentgray tableIndex exch HiVal mul cvi NewLookup 3 1 roll put } for [/Indexed currentcolorspace HiVal NewLookup] setcolorspace_opt end }{ level3 { [/Indexed [/DeviceN Names MappedCSA /TintTransform load] HiVal Lookup] setcolorspace_opt }{ [/Indexed MappedCSA HiVal [ Lookup dup type /stringtype eq {/exch cvx CSD get_csd /Names get length dup /mul cvx exch /getinterval cvx {255 div} /forall cvx} {/exec cvx}ifelse /TintTransform load /exec cvx ]cvx ]setcolorspace_opt }ifelse } ifelse end }{ } ifelse set_crd } { /MappedCSA CSA map_csa def AGMCORE_host_sep level2 not and{ 0 0 0 0 setcmykcolor }{ [/Indexed MappedCSA level2 not has_color not and{ dup 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or{ pop [/DeviceGray] }if HiVal GrayLookup }{ HiVal currentdict/RangeArray known{ { /indexed_colorspace_dict AGMCORE_gget begin Lookup exch dup HiVal gt{ pop HiVal }if NComponents mul NComponents getinterval {} forall NComponents 1 sub -1 0{ RangeArray exch 2 mul 2 getinterval aload pop map255_to_range NComponents 1 roll }for end } bind }{ Lookup }ifelse }ifelse ] setcolorspace_opt set_crd }ifelse }ifelse end }def /setindexedcolor { AGMCORE_host_sep { /indexed_colorspace_dict AGMCORE_gget dup /CSD known { begin CSD get_csd begin map_indexed_devn devn end end }{ AGMCORE_gget/Lookup get 4 3 -1 roll map_index pop setcmykcolor } ifelse }{ level3 not AGMCORE_in_rip_sep and /indexed_colorspace_dict AGMCORE_gget /CSD known and { /indexed_colorspace_dict AGMCORE_gget /CSD get get_csd begin map_indexed_devn devn end } { setcolor } ifelse }ifelse } def /ignoreimagedata { currentoverprint not{ gsave dup clonedict begin 1 setgray /Decode [0 1] def /DataSource def /MultipleDataSources false def /BitsPerComponent 8 def currentdict end systemdict /image get exec grestore }if consumeimagedata }def /add_csa { Adobe_AGM_Core begin /AGMCORE_CSA_cache xput end }def /get_csa_by_name { dup type dup /nametype eq exch /stringtype eq or{ Adobe_AGM_Core begin 1 dict begin /name xdf AGMCORE_CSA_cache { 0 get name eq { exit }{ pop } ifelse }forall end end }{ pop } ifelse }def /map_csa { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_CSA_cache get exch get }if }def /add_csd { Adobe_AGM_Core begin /AGMCORE_CSD_cache xput end }def /get_csd { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_CSD_cache get exch get }if }def /pattern_buf_init { /count get 0 0 put } def /pattern_buf_next { dup /count get dup 0 get dup 3 1 roll 1 add 0 xpt get } def /cachepattern_compress { 5 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def /string_size 16000 def /readbuffer string_size string def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal /LZWFilter { exch dup length 0 eq { pop }{ patarray dup length 1 sub 3 -1 roll put } ifelse {string_size}{0}ifelse string } /LZWEncode filter def { ReadFilter readbuffer readstring exch LZWFilter exch writestring not {exit} if } loop LZWFilter closefile patarray end }def /cachepattern { 2 dict begin currentfile exch 0 exch /SubFileDecode filter /ReadFilter exch def /patarray 20 dict def currentglobal true setglobal patarray 1 array dup 0 1 put /count xpt setglobal { ReadFilter 16000 string readstring exch patarray dup length 1 sub 3 -1 roll put not {exit} if } loop patarray dup dup length 1 sub () put end }def /add_pattern { Adobe_AGM_Core begin /AGMCORE_pattern_cache xput end }def /get_pattern { dup type /nametype eq{ Adobe_AGM_Core/AGMCORE_pattern_cache get exch get dup wrap_paintproc }if }def /wrap_paintproc { statusdict /currentfilenameextend known{ begin /OldPaintProc /PaintProc load def /PaintProc { mark exch dup /OldPaintProc get stopped {closefile restore end} if cleartomark } def end } {pop} ifelse } def /make_pattern { dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform exch 3 index /XStep get 1 index exch 2 copy div cvi mul sub sub exch 3 index /YStep get 1 index exch 2 copy div cvi mul sub sub matrix translate exch matrix concatmatrix 1 index begin BBox 0 get XStep div cvi XStep mul /xshift exch neg def BBox 1 get YStep div cvi YStep mul /yshift exch neg def BBox 0 get xshift add BBox 1 get yshift add BBox 2 get xshift add BBox 3 get yshift add 4 array astore /BBox exch def [ xshift yshift /translate load null /exec load ] dup 3 /PaintProc load put cvx /PaintProc exch def end gsave 0 setgray makepattern grestore }def /set_pattern { dup /PatternType get 1 eq{ dup /PaintType get 1 eq{ currentoverprint sop [/DeviceGray] setcolorspace 0 setgray }if }if setpattern }def /setcolorspace_opt { dup currentcolorspace eq{ pop }{ setcolorspace }ifelse }def /updatecolorrendering { currentcolorrendering/Intent known{ currentcolorrendering/Intent get }{ null }ifelse Intent ne{ false Intent AGMCORE_CRD_cache { exch pop begin dup Intent eq{ currentdict setcolorrendering_opt end exch pop true exch exit }if end } forall pop not{ systemdict /findcolorrendering known{ Intent findcolorrendering pop /ColorRendering findresource dup length dict copy setcolorrendering_opt }if }if }if } def /add_crd { AGMCORE_CRD_cache 3 1 roll put }def /set_crd { AGMCORE_host_sep not level2 and{ currentdict/CRD known{ AGMCORE_CRD_cache CRD get dup null ne{ setcolorrendering_opt }{ pop }ifelse }{ currentdict/Intent known{ updatecolorrendering }if }ifelse currentcolorspace dup type /arraytype eq {0 get}if /DeviceRGB eq { currentdict/UCR known {/UCR}{/AGMCORE_currentucr}ifelse load setundercolorremoval currentdict/BG known {/BG}{/AGMCORE_currentbg}ifelse load setblackgeneration }if }if }def /setcolorrendering_opt { dup currentcolorrendering eq{ pop }{ begin /Intent Intent def currentdict end setcolorrendering }ifelse }def /cpaint_gcomp { convert_to_process Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf Adobe_AGM_Core/AGMCORE_ConvertToProcess get not { (%end_cpaint_gcomp) flushinput }if }def /cpaint_gsep { Adobe_AGM_Core/AGMCORE_ConvertToProcess get { (%end_cpaint_gsep) flushinput }if }def /cpaint_gend { newpath }def /path_rez { dup 0 ne{ AGMCORE_deviceDPI exch div dup 1 lt{ pop 1 }if setflat }{ pop }ifelse }def /set_spot_alias_ary { /AGMCORE_SpotAliasAry where{ pop pop }{ Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf true set_spot_alias }ifelse }def /set_spot_alias { /AGMCORE_SpotAliasAry where{ /AGMCORE_current_spot_alias 3 -1 roll put }{ pop }ifelse }def /current_spot_alias { /AGMCORE_SpotAliasAry where{ /AGMCORE_current_spot_alias get }{ false }ifelse }def /map_alias { /AGMCORE_SpotAliasAry where{ begin /AGMCORE_name xdf false AGMCORE_SpotAliasAry{ dup/Name get AGMCORE_name eq{ save exch /Adobe_AGM_Core currentdict def /CSD get get_csd exch restore exch pop true exit }{ pop }ifelse }forall end }{ pop false }ifelse }bdf /spot_alias { true set_spot_alias /AGMCORE_&setcustomcolor AGMCORE_key_known not { Adobe_AGM_Core/AGMCORE_&setcustomcolor /setcustomcolor load put } if /customcolor_tint 1 AGMCORE_gput Adobe_AGM_Core begin /setcustomcolor { dup /customcolor_tint exch AGMCORE_gput current_spot_alias{ 1 index 4 get map_alias{ mark 3 1 roll setsepcolorspace counttomark 0 ne{ setsepcolor }if pop pop }{ AGMCORE_&setcustomcolor }ifelse }{ AGMCORE_&setcustomcolor }ifelse }bdf end }def /begin_feature { Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if }def /end_feature { 2 dict begin /spd /setpagedevice load def /setpagedevice { get_gstate spd set_gstate } def stopped{$error/newerror false put}if end count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if }def /set_negative { Adobe_AGM_Core begin /AGMCORE_inverting exch def level2{ currentpagedevice/NegativePrint known{ currentpagedevice/NegativePrint get Adobe_AGM_Core/AGMCORE_inverting get ne{ true begin_feature true{ bdict /NegativePrint Adobe_AGM_Core/AGMCORE_inverting get edict setpagedevice }end_feature }if /AGMCORE_inverting false def }if }if AGMCORE_inverting{ [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer gsave newpath clippath 1 /setseparationgray where{pop setseparationgray}{setgray}ifelse /AGMIRS_&fill where {pop AGMIRS_&fill}{fill} ifelse grestore }if end }def /lw_save_restore_override { /md where { pop md begin initializepage /initializepage{}def /pmSVsetup{} def /endp{}def /pse{}def /psb{}def /orig_showpage where {pop} {/orig_showpage /showpage load def} ifelse /showpage {orig_showpage gR} def end }if }def /pscript_showpage_override { /NTPSOct95 where { begin showpage save /showpage /restore load def /restore {exch pop}def end }if }def /driver_media_override { /md where { pop md /initializepage known { md /initializepage {} put } if md /rC known { md /rC {4{pop}repeat} put } if }if /mysetup where { /mysetup [1 0 0 1 0 0] put }if Adobe_AGM_Core /AGMCORE_Default_CTM matrix currentmatrix put level2 {Adobe_AGM_Core /AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if }def /driver_check_media_override { /PrepsDict where {pop} { Adobe_AGM_Core /AGMCORE_Default_CTM get matrix currentmatrix ne Adobe_AGM_Core /AGMCORE_Default_PageSize get type /arraytype eq { Adobe_AGM_Core /AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and Adobe_AGM_Core /AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and }if { Adobe_AGM_Core /AGMCORE_Default_CTM get setmatrix }if }ifelse }def AGMCORE_err_strings begin /AGMCORE_bad_environ (Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. ) def /AGMCORE_color_space_onhost_seps (This job contains colors that will not separate with on-host methods. ) def /AGMCORE_invalid_color_space (This job contains an invalid color space. ) def end end systemdict /setpacking known { setpacking } if %%EndResource %%BeginResource: procset Adobe_CoolType_Core 2.23 0 %%Copyright: Copyright 1997-2003 Adobe Systems Incorporated. All Rights Reserved. %%Version: 2.23 0 10 dict begin /Adobe_CoolType_Passthru currentdict def /Adobe_CoolType_Core_Defined userdict /Adobe_CoolType_Core known def Adobe_CoolType_Core_Defined { /Adobe_CoolType_Core userdict /Adobe_CoolType_Core get def } if userdict /Adobe_CoolType_Core 60 dict dup begin put /Adobe_CoolType_Version 2.23 def /Level2? systemdict /languagelevel known dup { pop systemdict /languagelevel get 2 ge } if def Level2? not { /currentglobal false def /setglobal /pop load def /gcheck { pop false } bind def /currentpacking false def /setpacking /pop load def /SharedFontDirectory 0 dict def } if currentpacking true setpacking /@_SaveStackLevels { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 2 copy known not { 2 copy 3 dict dup /args 7 index 5 add array put put get } { get dup /args get dup length 3 index lt { dup length 5 add array exch 1 index exch 0 exch putinterval 1 index exch /args exch put } { pop } ifelse } ifelse begin count 2 sub 1 index lt { pop count 1 sub } if dup /argCount exch def dup 0 gt { exch 1 index 2 add 1 roll args exch 0 exch getinterval astore pop } { pop } ifelse count 1 sub /restCount exch def end /@opStackLevel @opStackLevel 1 add def countdictstack 1 sub @dictStackCountByLevel exch @dictStackLevel exch put /@dictStackLevel @dictStackLevel 1 add def end } bind def /@_RestoreStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def @opStackCountByLevel @opStackLevel get begin count restCount sub dup 0 gt { { pop } repeat } { pop } ifelse args 0 argCount getinterval {} forall end /@dictStackLevel @dictStackLevel 1 sub def @dictStackCountByLevel @dictStackLevel get end countdictstack exch sub dup 0 gt { { end } repeat } { pop } ifelse } bind def /@_PopStackLevels { Adobe_CoolType_Data begin /@opStackLevel @opStackLevel 1 sub def /@dictStackLevel @dictStackLevel 1 sub def end } bind def /@Raise { exch cvx exch errordict exch get exec stop } bind def /@ReRaise { cvx $error /errorname get errordict exch get exec stop } bind def /@Stopped { 0 @#Stopped } bind def /@#Stopped { @_SaveStackLevels stopped { @_RestoreStackLevels true } { @_PopStackLevels false } ifelse } bind def /@Arg { Adobe_CoolType_Data begin @opStackCountByLevel @opStackLevel 1 sub get /args get exch get end } bind def currentglobal true setglobal /CTHasResourceForAllBug Level2? { 1 dict dup begin mark { (*) { pop stop } 128 string /Category resourceforall } stopped cleartomark currentdict eq dup { end } if not } { false } ifelse def /CTHasResourceStatusBug Level2? { mark { /steveamerige /Category resourcestatus } stopped { cleartomark true } { cleartomark currentglobal not } ifelse } { false } ifelse def setglobal /CTResourceStatus { mark 3 1 roll /Category findresource begin ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse end } bind def /CTWorkAroundBugs { Level2? { /cid_PreLoad /ProcSet resourcestatus { pop pop currentglobal mark { (*) { dup /CMap CTHasResourceStatusBug { CTResourceStatus } { resourcestatus } ifelse { pop dup 0 eq exch 1 eq or { dup /CMap findresource gcheck setglobal /CMap undefineresource } { pop CTHasResourceForAllBug { exit } { stop } ifelse } ifelse } { pop } ifelse } 128 string /CMap resourceforall } stopped { cleartomark } stopped pop setglobal } if } if } bind def /doc_setup { Adobe_CoolType_Core begin CTWorkAroundBugs /mov /moveto load def /nfnt /newencodedfont load def /mfnt /makefont load def /sfnt /setfont load def /ufnt /undefinefont load def /chp /charpath load def /awsh /awidthshow load def /wsh /widthshow load def /ash /ashow load def /sh /show load def end userdict /Adobe_CoolType_Data 10 dict dup begin /AddWidths? false def /CC 0 def /charcode 2 string def /@opStackCountByLevel 32 dict def /@opStackLevel 0 def /@dictStackCountByLevel 32 dict def /@dictStackLevel 0 def /InVMFontsByCMap 10 dict def /InVMDeepCopiedFonts 10 dict def end put } bind def /doc_trailer { currentdict Adobe_CoolType_Core eq { end } if } bind def /page_setup { Adobe_CoolType_Core begin } bind def /page_trailer { end } bind def /unload { systemdict /languagelevel known { systemdict/languagelevel get 2 ge { userdict/Adobe_CoolType_Core 2 copy known { undef } { pop pop } ifelse } if } if } bind def /ndf { 1 index where { pop pop pop } { dup xcheck { bind } if def } ifelse } def /findfont systemdict begin userdict begin /globaldict where { /globaldict get begin } if dup where pop exch get /globaldict where { pop end } if end end Adobe_CoolType_Core_Defined { /systemfindfont exch def } { /findfont 1 index def /systemfindfont exch def } ifelse /undefinefont { pop } ndf /copyfont { currentglobal 3 1 roll 1 index gcheck setglobal dup null eq { 0 } { dup length } ifelse 2 index length add 1 add dict begin exch { 1 index /FID eq { pop pop } { def } ifelse } forall dup null eq { pop } { { def } forall } ifelse currentdict end exch setglobal } bind def /copyarray { currentglobal exch dup gcheck setglobal dup length array copy exch setglobal } bind def /newencodedfont { currentglobal { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } { FontDirectory 3 index known { FontDirectory 3 index get /FontReferenced known } { SharedFontDirectory 3 index known { SharedFontDirectory 3 index get /FontReferenced known } { false } ifelse } ifelse } ifelse dup { 3 index findfont /FontReferenced get 2 index dup type /nametype eq {findfont} if ne { pop false } if } if { pop 1 index findfont /Encoding get exch 0 1 255 { 2 copy get 3 index 3 1 roll put } for pop pop pop } { dup type /nametype eq { findfont } if dup dup maxlength 2 add dict begin exch { 1 index /FID ne {def} {pop pop} ifelse } forall /FontReferenced exch def /Encoding exch dup length array copy def /FontName 1 index dup type /stringtype eq { cvn } if def dup currentdict end definefont def } ifelse } bind def /SetSubstituteStrategy { $SubstituteFont begin dup type /dicttype ne { 0 dict } if currentdict /$Strategies known { exch $Strategies exch 2 copy known { get 2 copy maxlength exch maxlength add dict begin { def } forall { def } forall currentdict dup /$Init known { dup /$Init get exec } if end /$Strategy exch def } { pop pop pop } ifelse } { pop pop } ifelse end } bind def /scff { $SubstituteFont begin dup type /stringtype eq { dup length exch } { null } ifelse /$sname exch def /$slen exch def /$inVMIndex $sname null eq { 1 index $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse def end { findfont } @Stopped { dup length 8 add string exch 1 index 0 (BadFont:) putinterval 1 index exch 8 exch dup length string cvs putinterval cvn { findfont } @Stopped { pop /Courier findfont } if } if $SubstituteFont begin /$sname null def /$slen 0 def /$inVMIndex null def end } bind def /isWidthsOnlyFont { dup /WidthsOnly known { pop pop true } { dup /FDepVector known { /FDepVector get { isWidthsOnlyFont dup { exit } if } forall } { dup /FDArray known { /FDArray get { isWidthsOnlyFont dup { exit } if } forall } { pop } ifelse } ifelse } ifelse } bind def /?str1 256 string def /?set { $SubstituteFont begin /$substituteFound false def /$fontname 4 index def /$doSmartSub false def end 3 index currentglobal false setglobal exch /CompatibleFonts /ProcSet resourcestatus { pop pop /CompatibleFonts /ProcSet findresource begin dup /CompatibleFont currentexception 1 index /CompatibleFont true setexception 1 index /Font resourcestatus { pop pop 3 2 roll setglobal end exch dup findfont /CompatibleFonts /ProcSet findresource begin 3 1 roll exch /CompatibleFont exch setexception end } { 3 2 roll setglobal 1 index exch /CompatibleFont exch setexception end findfont $SubstituteFont /$substituteFound true put } ifelse } { exch setglobal findfont } ifelse $SubstituteFont begin $substituteFound { false (%%[Using embedded font ) print 5 index ?str1 cvs print ( to avoid the font substitution problem noted earlier.]%%\n) print } { dup /FontName known { dup /FontName get $fontname eq 1 index /DistillerFauxFont known not and /currentdistillerparams where { pop false 2 index isWidthsOnlyFont not and } if } { false } ifelse } ifelse exch pop /$doSmartSub true def end { exch pop exch pop exch 2 dict dup /Found 3 index put exch findfont exch } { exch exec exch dup findfont dup /FontType get 3 eq { exch ?str1 cvs dup length 1 sub -1 0 { exch dup 2 index get 42 eq { exch 0 exch getinterval cvn 4 1 roll 3 2 roll pop exit } {exch pop} ifelse }for } { exch pop } ifelse 2 dict dup /Downloaded 6 5 roll put } ifelse dup /FontName 4 index put copyfont definefont pop } bind def /?str2 256 string def /?add { 1 index type /integertype eq { exch true 4 2 } { false 3 1 } ifelse roll 1 index findfont dup /Widths known { Adobe_CoolType_Data /AddWidths? true put gsave dup 1000 scalefont setfont } if /Downloaded known { exec exch { exch ?str2 cvs exch findfont /Downloaded get 1 dict begin /Downloaded 1 index def ?str1 cvs length ?str1 1 index 1 add 3 index putinterval exch length 1 add 1 index add ?str1 2 index (*) putinterval ?str1 0 2 index getinterval cvn findfont ?str1 3 index (+) putinterval 2 dict dup /FontName ?str1 0 6 index getinterval cvn put dup /Downloaded Downloaded put end copyfont dup /FontName get exch definefont pop pop pop } { pop } ifelse } { pop exch { findfont dup /Found get dup length exch ?str1 cvs pop ?str1 1 index (+) putinterval ?str1 1 index 1 add 4 index ?str2 cvs putinterval ?str1 exch 0 exch 5 4 roll ?str2 cvs length 1 add add getinterval cvn 1 dict exch 1 index exch /FontName exch put copyfont dup /FontName get exch definefont pop } { pop } ifelse } ifelse Adobe_CoolType_Data /AddWidths? get { grestore Adobe_CoolType_Data /AddWidths? false put } if } bind def /?sh { currentfont /Downloaded known { exch } if pop } bind def /?chp { currentfont /Downloaded known { pop } { false chp } ifelse } bind def /?mv { currentfont /Downloaded known { moveto pop pop } { pop pop moveto } ifelse } bind def setpacking userdict /$SubstituteFont 25 dict put 1 dict begin /SubstituteFont dup $error exch 2 copy known { get } { pop pop { pop /Courier } bind } ifelse def /currentdistillerparams where dup { pop pop currentdistillerparams /CannotEmbedFontPolicy 2 copy known { get /Error eq } { pop pop false } ifelse } if not { countdictstack array dictstack 0 get begin userdict begin $SubstituteFont begin /$str 128 string def /$fontpat 128 string def /$slen 0 def /$sname null def /$match false def /$fontname null def /$substituteFound false def /$inVMIndex null def /$doSmartSub true def /$depth 0 def /$fontname null def /$italicangle 26.5 def /$dstack null def /$Strategies 10 dict dup begin /$Type3Underprint { currentglobal exch false setglobal 11 dict begin /UseFont exch $WMode 0 ne { dup length dict copy dup /WMode $WMode put /UseFont exch definefont } if def /FontName $fontname dup type /stringtype eq { cvn } if def /FontType 3 def /FontMatrix [ .001 0 0 .001 0 0 ] def /Encoding 256 array dup 0 1 255 { /.notdef put dup } for pop def /FontBBox [ 0 0 0 0 ] def /CCInfo 7 dict dup begin /cc null def /x 0 def /y 0 def end def /BuildChar { exch begin CCInfo begin 1 string dup 0 3 index put exch pop /cc exch def UseFont 1000 scalefont setfont cc stringwidth /y exch def /x exch def x y setcharwidth $SubstituteFont /$Strategy get /$Underprint get exec 0 0 moveto cc show x y moveto end end } bind def currentdict end exch setglobal } bind def /$GetaTint 2 dict dup begin /$BuildFont { dup /WMode known { dup /WMode get } { 0 } ifelse /$WMode exch def $fontname exch dup /FontName known { dup /FontName get dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse exch Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index /FontName get known { pop Adobe_CoolType_Data /InVMDeepCopiedFonts get 1 index get null copyfont } { $deepcopyfont } ifelse exch 1 index exch /FontBasedOn exch put dup /FontName $fontname dup type /stringtype eq { cvn } if put definefont Adobe_CoolType_Data /InVMDeepCopiedFonts get begin dup /FontBasedOn get 1 index def end } bind def /$Underprint { gsave x abs y abs gt { /y 1000 def } { /x -1000 def 500 120 translate } ifelse Level2? { [ /Separation (All) /DeviceCMYK { 0 0 0 1 pop } ] setcolorspace } { 0 setgray } ifelse 10 setlinewidth x .8 mul [ 7 3 ] { y mul 8 div 120 sub x 10 div exch moveto 0 y 4 div neg rlineto dup 0 rlineto 0 y 4 div rlineto closepath gsave Level2? { .2 setcolor } { .8 setgray } ifelse fill grestore stroke } forall pop grestore } bind def end def /$Oblique 1 dict dup begin /$BuildFont { currentglobal exch dup gcheck setglobal null copyfont begin /FontBasedOn currentdict /FontName known { FontName dup type /stringtype eq { cvn } if } { /unnamedfont } ifelse def /FontName $fontname dup type /stringtype eq { cvn } if def /currentdistillerparams where { pop } { /FontInfo currentdict /FontInfo known { FontInfo null copyfont } { 2 dict } ifelse dup begin /ItalicAngle $italicangle def /FontMatrix FontMatrix [ 1 0 ItalicAngle dup sin exch cos div 1 0 0 ] matrix concatmatrix readonly end 4 2 roll def def } ifelse FontName currentdict end definefont exch setglobal } bind def end def /$None 1 dict dup begin /$BuildFont {} bind def end def end def /$Oblique SetSubstituteStrategy /$findfontByEnum { dup type /stringtype eq { cvn } if dup /$fontname exch def $sname null eq { $str cvs dup length $slen sub $slen getinterval } { pop $sname } ifelse $fontpat dup 0 (fonts/*) putinterval exch 7 exch putinterval /$match false def $SubstituteFont /$dstack countdictstack array dictstack put mark { $fontpat 0 $slen 7 add getinterval { /$match exch def exit } $str filenameforall } stopped { cleardictstack currentdict true $SubstituteFont /$dstack get { exch { 1 index eq { pop false } { true } ifelse } { begin false } ifelse } forall pop } if cleartomark /$slen 0 def $match false ne { $match (fonts/) anchorsearch pop pop cvn } { /Courier } ifelse } bind def /$ROS 1 dict dup begin /Adobe 4 dict dup begin /Japan1 [ /Ryumin-Light /HeiseiMin-W3 /GothicBBB-Medium /HeiseiKakuGo-W5 /HeiseiMaruGo-W4 /Jun101-Light ] def /Korea1 [ /HYSMyeongJo-Medium /HYGoThic-Medium ] def /GB1 [ /STSong-Light /STHeiti-Regular ] def /CNS1 [ /MKai-Medium /MHei-Medium ] def end def end def /$cmapname null def /$deepcopyfont { dup /FontType get 0 eq { 1 dict dup /FontName /copied put copyfont begin /FDepVector FDepVector copyarray 0 1 2 index length 1 sub { 2 copy get $deepcopyfont dup /FontName /copied put /copied exch definefont 3 copy put pop pop } for def currentdict end } { $Strategies /$Type3Underprint get exec } ifelse } bind def /$buildfontname { dup /CIDFont findresource /CIDSystemInfo get begin Registry length Ordering length Supplement 8 string cvs 3 copy length 2 add add add string dup 5 1 roll dup 0 Registry putinterval dup 4 index (-) putinterval dup 4 index 1 add Ordering putinterval 4 2 roll add 1 add 2 copy (-) putinterval end 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch anchorsearch { pop pop 3 2 roll putinterval cvn /$cmapname exch def } { pop pop pop pop pop } ifelse length $str 1 index (-) putinterval 1 add $str 1 index $cmapname $fontpat cvs putinterval $cmapname length add $str exch 0 exch getinterval cvn } bind def /$findfontByROS { /$fontname exch def $ROS Registry 2 copy known { get Ordering 2 copy known { get } { pop pop [] } ifelse } { pop pop [] } ifelse false exch { dup /CIDFont resourcestatus { pop pop save 1 index /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get } { false } ifelse exch pop exch restore { pop } { exch pop true exit } ifelse } { pop } ifelse } forall { $str cvs $buildfontname } { false (*) { save exch dup /CIDFont findresource dup /WidthsOnly known { dup /WidthsOnly get not } { true } ifelse exch /CIDSystemInfo get dup /Registry get Registry eq exch /Ordering get Ordering eq and and { exch restore exch pop true exit } { pop restore } ifelse } $str /CIDFont resourceforall { $buildfontname } { $fontname $findfontByEnum } ifelse } ifelse } bind def end end currentdict /$error known currentdict /languagelevel known and dup { pop $error /SubstituteFont known } if dup { $error } { Adobe_CoolType_Core } ifelse begin { /SubstituteFont /CMap /Category resourcestatus { pop pop { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $sname null eq { dup $str cvs dup length $slen sub $slen getinterval cvn } { $sname } ifelse Adobe_CoolType_Data /InVMFontsByCMap get 1 index 2 copy known { get false exch { pop currentglobal { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } { FontDirectory 1 index known { exch pop true exit } { GlobalFontDirectory 1 index known { exch pop true exit } { pop } ifelse } ifelse } ifelse } forall } { pop pop false } ifelse { exch pop exch pop } { dup /CMap resourcestatus { pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS } { 128 string cvs dup (-) search { 3 1 roll search { 3 1 roll pop { dup cvi } stopped { pop pop pop pop pop $findfontByEnum } { 4 2 roll pop pop exch length exch 2 index length 2 index sub exch 1 sub -1 0 { $str cvs dup length 4 index 0 4 index 4 3 roll add getinterval exch 1 index exch 3 index exch putinterval dup /CMap resourcestatus { pop pop 4 1 roll pop pop pop dup /$cmapname exch def /CMap findresource /CIDSystemInfo get { def } forall $findfontByROS true exit } { pop } ifelse } for dup type /booleantype eq { pop } { pop pop pop $findfontByEnum } ifelse } ifelse } { pop pop pop $findfontByEnum } ifelse } { pop pop $findfontByEnum } ifelse } ifelse } ifelse } { //SubstituteFont exec } ifelse /$slen 0 def end } } { { $SubstituteFont begin /$substituteFound true def dup length $slen gt $sname null ne or $slen 0 gt and { $findfontByEnum } { //SubstituteFont exec } ifelse end } } ifelse bind readonly def Adobe_CoolType_Core /scfindfont /systemfindfont load put } { /scfindfont { $SubstituteFont begin dup systemfindfont dup /FontName known { dup /FontName get dup 3 index ne } { /noname true } ifelse dup { /$origfontnamefound 2 index def /$origfontname 4 index def /$substituteFound true def } if exch pop { $slen 0 gt $sname null ne 3 index length $slen gt or and { pop dup $findfontByEnum findfont dup maxlength 1 add dict begin { 1 index /FID eq { pop pop } { def } ifelse } forall currentdict end definefont dup /FontName known { dup /FontName get } { null } ifelse $origfontnamefound ne { $origfontname $str cvs print ( substitution revised, using ) print dup /FontName known { dup /FontName get } { (unspecified font) } ifelse $str cvs print (.\n) print } if } { exch pop } ifelse } { exch pop } ifelse end } bind def } ifelse end end Adobe_CoolType_Core_Defined not { Adobe_CoolType_Core /findfont { $SubstituteFont begin $depth 0 eq { /$fontname 1 index dup type /stringtype ne { $str cvs } if def /$substituteFound false def } if /$depth $depth 1 add def end scfindfont $SubstituteFont begin /$depth $depth 1 sub def $substituteFound $depth 0 eq and { $inVMIndex null ne { dup $inVMIndex $AddInVMFont } if $doSmartSub { currentdict /$Strategy known { $Strategy /$BuildFont get exec } if } if } if end } bind put } if } if end /$AddInVMFont { exch /FontName 2 copy known { get 1 dict dup begin exch 1 index gcheck def end exch Adobe_CoolType_Data /InVMFontsByCMap get exch $DictAdd } { pop pop pop } ifelse } bind def /$DictAdd { 2 copy known not { 2 copy 4 index length dict put } if Level2? not { 2 copy get dup maxlength exch length 4 index length add lt 2 copy get dup length 4 index length add exch maxlength 1 index lt { 2 mul dict begin 2 copy get { forall } def 2 copy currentdict put end } { pop } ifelse } if get begin { def } forall end } bind def end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.19 0 %%Copyright: Copyright 1987-2003 Adobe Systems Incorporated. %%Version: 1.19 0 systemdict /languagelevel known dup { currentglobal false setglobal } { false } ifelse exch userdict /Adobe_CoolType_Utility 2 copy known { 2 copy get dup maxlength 25 add dict copy } { 25 dict } ifelse put Adobe_CoolType_Utility begin /ct_Level2? exch def /ct_Clone? 1183615869 internaldict dup /CCRun known not exch /eCCRun known not ct_Level2? and or def ct_Level2? { globaldict begin currentglobal true setglobal } if /ct_AddStdCIDMap ct_Level2? { { ((Hex) 57 StartData 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 cc36 74f4 1144 b13b 77) 0 () /SubFileDecode filter cvx exec } } { { eexec } } ifelse bind def userdict /cid_extensions known dup { cid_extensions /cid_UpdateDB known and } if { cid_extensions begin /cid_GetCIDSystemInfo { 1 index type /stringtype eq { exch cvn exch } if cid_extensions begin dup load 2 index known { 2 copy cid_GetStatusInfo dup null ne { 1 index load 3 index get dup null eq { pop pop cid_UpdateDB } { exch 1 index /Created get eq { exch pop exch pop } { pop cid_UpdateDB } ifelse } ifelse } { pop cid_UpdateDB } ifelse } { cid_UpdateDB } ifelse end } bind def end } if ct_Level2? { end setglobal } if /ct_UseNativeCapability? systemdict /composefont known def /ct_MakeOCF 35 dict def /ct_Vars 25 dict def /ct_GlyphDirProcs 6 dict def /ct_BuildCharDict 15 dict dup begin /charcode 2 string def /dst_string 1500 string def /nullstring () def /usewidths? true def end def ct_Level2? { setglobal } { pop } ifelse ct_GlyphDirProcs begin /GetGlyphDirectory { systemdict /languagelevel known { pop /CIDFont findresource /GlyphDirectory get } { 1 index /CIDFont findresource /GlyphDirectory get dup type /dicttype eq { dup dup maxlength exch length sub 2 index lt { dup length 2 index add dict copy 2 index /CIDFont findresource/GlyphDirectory 2 index put } if } if exch pop exch pop } ifelse + } def /+ { systemdict /languagelevel known { currentglobal false setglobal 3 dict begin /vm exch def } { 1 dict begin } ifelse /$ exch def systemdict /languagelevel known { vm setglobal /gvm currentglobal def $ gcheck setglobal } if ? { $ begin } if } def /? { $ type /dicttype eq } def /| { userdict /Adobe_CoolType_Data known { Adobe_CoolType_Data /AddWidths? known { currentdict Adobe_CoolType_Data begin begin AddWidths? { Adobe_CoolType_Data /CC 3 index put ? { def } { $ 3 1 roll put } ifelse CC charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore currentfont /Widths get exch CC exch put } { ? { def } { $ 3 1 roll put } ifelse } ifelse end end } { ? { def } { $ 3 1 roll put } ifelse } ifelse } { ? { def } { $ 3 1 roll put } ifelse } ifelse } def /! { ? { end } if systemdict /languagelevel known { gvm setglobal } if end } def /: { string currentfile exch readstring pop } executeonly def end ct_MakeOCF begin /ct_cHexEncoding [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF] def /ct_CID_STR_SIZE 8000 def /ct_mkocfStr100 100 string def /ct_defaultFontMtx [.001 0 0 .001 0 0] def /ct_1000Mtx [1000 0 0 1000 0 0] def /ct_raise {exch cvx exch errordict exch get exec stop} bind def /ct_reraise { cvx $error /errorname get (Error: ) print dup ( ) cvs print errordict exch get exec stop } bind def /ct_cvnsi { 1 index add 1 sub 1 exch 0 4 1 roll { 2 index exch get exch 8 bitshift add } for exch pop } bind def /ct_GetInterval { Adobe_CoolType_Utility /ct_BuildCharDict get begin /dst_index 0 def dup dst_string length gt { dup string /dst_string exch def } if 1 index ct_CID_STR_SIZE idiv /arrayIndex exch def 2 index arrayIndex get 2 index arrayIndex ct_CID_STR_SIZE mul sub { dup 3 index add 2 index length le { 2 index getinterval dst_string dst_index 2 index putinterval length dst_index add /dst_index exch def exit } { 1 index length 1 index sub dup 4 1 roll getinterval dst_string dst_index 2 index putinterval pop dup dst_index add /dst_index exch def sub /arrayIndex arrayIndex 1 add def 2 index dup length arrayIndex gt { arrayIndex get } { pop exit } ifelse 0 } ifelse } loop pop pop pop dst_string 0 dst_index getinterval end } bind def ct_Level2? { /ct_resourcestatus currentglobal mark true setglobal { /unknowninstancename /Category resourcestatus } stopped { cleartomark setglobal true } { cleartomark currentglobal not exch setglobal } ifelse { { mark 3 1 roll /Category findresource begin ct_Vars /vm currentglobal put ({ResourceStatus} stopped) 0 () /SubFileDecode filter cvx exec { cleartomark false } { { 3 2 roll pop true } { cleartomark false } ifelse } ifelse ct_Vars /vm get setglobal end } } { { resourcestatus } } ifelse bind def /CIDFont /Category ct_resourcestatus { pop pop } { currentglobal true setglobal /Generic /Category findresource dup length dict copy dup /InstanceType /dicttype put /CIDFont exch /Category defineresource pop setglobal } ifelse ct_UseNativeCapability? { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Identity) def /Supplement 0 def end def /CMapName /Identity-H def /CMapVersion 1.000 def /CMapType 1 def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } if } { /ct_Category 2 dict begin /CIDFont 10 dict def /ProcSet 2 dict def currentdict end def /defineresource { ct_Category 1 index 2 copy known { get dup dup maxlength exch length eq { dup length 10 add dict copy ct_Category 2 index 2 index put } if 3 index 3 index put pop exch pop } { pop pop /defineresource /undefined ct_raise } ifelse } bind def /findresource { ct_Category 1 index 2 copy known { get 2 index 2 copy known { get 3 1 roll pop pop} { pop pop /findresource /undefinedresource ct_raise } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /resourcestatus { ct_Category 1 index 2 copy known { get 2 index known exch pop exch pop { 0 -1 true } { false } ifelse } { pop pop /findresource /undefined ct_raise } ifelse } bind def /ct_resourcestatus /resourcestatus load def } ifelse /ct_CIDInit 2 dict begin /ct_cidfont_stream_init { { dup (Binary) eq { pop null currentfile ct_Level2? { { cid_BYTE_COUNT () /SubFileDecode filter } stopped { pop pop pop } if } if /readstring load exit } if dup (Hex) eq { pop currentfile ct_Level2? { { null exch /ASCIIHexDecode filter /readstring } stopped { pop exch pop (>) exch /readhexstring } if } { (>) exch /readhexstring } ifelse load exit } if /StartData /typecheck ct_raise } loop cid_BYTE_COUNT ct_CID_STR_SIZE le { 2 copy cid_BYTE_COUNT string exch exec pop 1 array dup 3 -1 roll 0 exch put } { cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi dup array exch 2 sub 0 exch 1 exch { 2 copy 5 index ct_CID_STR_SIZE string 6 index exec pop put pop } for 2 index cid_BYTE_COUNT ct_CID_STR_SIZE mod string 3 index exec pop 1 index exch 1 index length 1 sub exch put } ifelse cid_CIDFONT exch /GlyphData exch put 2 index null eq { pop pop pop } { pop /readstring load 1 string exch { 3 copy exec pop dup length 0 eq { pop pop pop pop pop true exit } if 4 index eq { pop pop pop pop false exit } if } loop pop } ifelse } bind def /StartData { mark { currentdict dup /FDArray get 0 get /FontMatrix get 0 get 0.001 eq { dup /CDevProc known not { /CDevProc 1183615869 internaldict /stdCDevProc 2 copy known { get } { pop pop { pop pop pop pop pop 0 -1000 7 index 2 div 880 } } ifelse def } if } { /CDevProc { pop pop pop pop pop 0 1 cid_temp /cid_CIDFONT get /FDArray get 0 get /FontMatrix get 0 get div 7 index 2 div 1 index 0.88 mul } def } ifelse /cid_temp 15 dict def cid_temp begin /cid_CIDFONT exch def 3 copy pop dup /cid_BYTE_COUNT exch def 0 gt { ct_cidfont_stream_init FDArray { /Private get dup /SubrMapOffset known { begin /Subrs SubrCount array def Subrs SubrMapOffset SubrCount SDBytes ct_Level2? { currentdict dup /SubrMapOffset undef dup /SubrCount undef /SDBytes undef } if end /cid_SD_BYTES exch def /cid_SUBR_COUNT exch def /cid_SUBR_MAP_OFFSET exch def /cid_SUBRS exch def cid_SUBR_COUNT 0 gt { GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi 0 1 cid_SUBR_COUNT 1 sub { exch 1 index 1 add cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add GlyphData exch cid_SD_BYTES ct_GetInterval 0 cid_SD_BYTES ct_cvnsi cid_SUBRS 4 2 roll GlyphData exch 4 index 1 index sub ct_GetInterval dup length string copy put } for pop } if } { pop } ifelse } forall } if cleartomark pop pop end CIDFontName currentdict /CIDFont defineresource pop end end } stopped { cleartomark /StartData ct_reraise } if } bind def currentdict end def /ct_saveCIDInit { /CIDInit /ProcSet ct_resourcestatus { true } { /CIDInitC /ProcSet ct_resourcestatus } ifelse { pop pop /CIDInit /ProcSet findresource ct_UseNativeCapability? { pop null } { /CIDInit ct_CIDInit /ProcSet defineresource pop } ifelse } { /CIDInit ct_CIDInit /ProcSet defineresource pop null } ifelse ct_Vars exch /ct_oldCIDInit exch put } bind def /ct_restoreCIDInit { ct_Vars /ct_oldCIDInit get dup null ne { /CIDInit exch /ProcSet defineresource pop } { pop } ifelse } bind def /ct_BuildCharSetUp { 1 index begin CIDFont begin Adobe_CoolType_Utility /ct_BuildCharDict get begin /ct_dfCharCode exch def /ct_dfDict exch def CIDFirstByte ct_dfCharCode add dup CIDCount ge { pop 0 } if /cid exch def { GlyphDirectory cid 2 copy known { get } { pop pop nullstring } ifelse dup length FDBytes sub 0 gt { dup FDBytes 0 ne { 0 FDBytes ct_cvnsi } { pop 0 } ifelse /fdIndex exch def dup length FDBytes sub FDBytes exch getinterval /charstring exch def exit } { pop cid 0 eq { /charstring nullstring def exit } if /cid 0 def } ifelse } loop } def /ct_SetCacheDevice { 0 0 moveto dup stringwidth 3 -1 roll true charpath pathbbox 0 -1000 7 index 2 div 880 setcachedevice2 0 0 moveto } def /ct_CloneSetCacheProc { 1 eq { stringwidth pop -2 div -880 0 -1000 setcharwidth moveto } { usewidths? { currentfont /Widths get cid 2 copy known { get exch pop aload pop } { pop pop stringwidth } ifelse } { stringwidth } ifelse setcharwidth 0 0 moveto } ifelse } def /ct_Type3ShowCharString { ct_FDDict fdIndex 2 copy known { get } { currentglobal 3 1 roll 1 index gcheck setglobal ct_Type1FontTemplate dup maxlength dict copy begin FDArray fdIndex get dup /FontMatrix 2 copy known { get } { pop pop ct_defaultFontMtx } ifelse /FontMatrix exch dup length array copy def /Private get /Private exch def /Widths rootfont /Widths get def /CharStrings 1 dict dup /.notdef dup length string copy put def currentdict end /ct_Type1Font exch definefont dup 5 1 roll put setglobal } ifelse dup /CharStrings get 1 index /Encoding get ct_dfCharCode get charstring put rootfont /WMode 2 copy known { get } { pop pop 0 } ifelse exch 1000 scalefont setfont ct_str1 0 ct_dfCharCode put ct_str1 exch ct_dfSetCacheProc ct_SyntheticBold { currentpoint ct_str1 show newpath moveto ct_str1 true charpath ct_StrokeWidth setlinewidth stroke } { ct_str1 show } ifelse } def /ct_Type4ShowCharString { ct_dfDict ct_dfCharCode charstring FDArray fdIndex get dup /FontMatrix get dup ct_defaultFontMtx ct_matrixeq not { ct_1000Mtx matrix concatmatrix concat } { pop } ifelse /Private get Adobe_CoolType_Utility /ct_Level2? get not { ct_dfDict /Private 3 -1 roll { put } 1183615869 internaldict /superexec get exec } if 1183615869 internaldict Adobe_CoolType_Utility /ct_Level2? get { 1 index } { 3 index /Private get mark 6 1 roll } ifelse dup /RunInt known { /RunInt get } { pop /CCRun } ifelse get exec Adobe_CoolType_Utility /ct_Level2? get not { cleartomark } if } bind def /ct_BuildCharIncremental { { Adobe_CoolType_Utility /ct_MakeOCF get begin ct_BuildCharSetUp ct_ShowCharString } stopped { stop } if end end end end } bind def /BaseFontNameStr (BF00) def /ct_Type1FontTemplate 14 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /PaintType 0 def currentdict end def /BaseFontTemplate 11 dict begin /FontMatrix [0.001 0 0 0.001 0 0] def /FontBBox [-250 -250 1250 1250] def /Encoding ct_cHexEncoding def /BuildChar /ct_BuildCharIncremental load def ct_Clone? { /FontType 3 def /ct_ShowCharString /ct_Type3ShowCharString load def /ct_dfSetCacheProc /ct_CloneSetCacheProc load def /ct_SyntheticBold false def /ct_StrokeWidth 1 def } { /FontType 4 def /Private 1 dict dup /lenIV 4 put def /CharStrings 1 dict dup /.notdef put def /PaintType 0 def /ct_ShowCharString /ct_Type4ShowCharString load def } ifelse /ct_str1 1 string def currentdict end def /BaseFontDictSize BaseFontTemplate length 5 add def /ct_matrixeq { true 0 1 5 { dup 4 index exch get exch 3 index exch get eq and dup not { exit } if } for exch pop exch pop } bind def /ct_makeocf { 15 dict begin exch /WMode exch def exch /FontName exch def /FontType 0 def /FMapType 2 def dup /FontMatrix known { dup /FontMatrix get /FontMatrix exch def } { /FontMatrix matrix def } ifelse /bfCount 1 index /CIDCount get 256 idiv 1 add dup 256 gt { pop 256} if def /Encoding 256 array 0 1 bfCount 1 sub { 2 copy dup put pop } for bfCount 1 255 { 2 copy bfCount put pop } for def /FDepVector bfCount dup 256 lt { 1 add } if array def BaseFontTemplate BaseFontDictSize dict copy begin /CIDFont exch def CIDFont /FontBBox known { CIDFont /FontBBox get /FontBBox exch def } if CIDFont /CDevProc known { CIDFont /CDevProc get /CDevProc exch def } if currentdict end BaseFontNameStr 3 (0) putinterval 0 1 bfCount dup 256 eq { 1 sub } if { FDepVector exch 2 index BaseFontDictSize dict copy begin dup /CIDFirstByte exch 256 mul def FontType 3 eq { /ct_FDDict 2 dict def } if currentdict end 1 index 16 BaseFontNameStr 2 2 getinterval cvrs pop BaseFontNameStr exch definefont put } for ct_Clone? { /Widths 1 index /CIDFont get /GlyphDirectory get length dict def } if FontName currentdict end definefont ct_Clone? { gsave dup 1000 scalefont setfont ct_BuildCharDict begin /usewidths? false def currentfont /Widths get begin exch /CIDFont get /GlyphDirectory get { pop dup charcode exch 1 index 0 2 index 256 idiv put 1 index exch 1 exch 256 mod put stringwidth 2 array astore def } forall end /usewidths? true def end grestore } { exch pop } ifelse } bind def /ct_ComposeFont { ct_UseNativeCapability? { 2 index /CMap ct_resourcestatus { pop pop exch pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 3 index def /CMapVersion 1.000 def /CMapType 1 def exch /WMode exch def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity)} ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { 3 2 roll pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def /ct_MakeIdentity { ct_UseNativeCapability? { 1 index /CMap ct_resourcestatus { pop pop } { /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CMapName 2 index def /CMapVersion 1.000 def /CMapType 1 def /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering CMapName ct_mkocfStr100 cvs (Adobe-) search { pop pop (-) search { dup length string copy exch pop exch pop } { pop (Identity) } ifelse } { pop (Identity) } ifelse def /Supplement 0 def end def 1 begincodespacerange <0000> endcodespacerange 1 begincidrange <0000> 0 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end } ifelse composefont } { exch pop 0 get /CIDFont findresource ct_makeocf } ifelse } bind def currentdict readonly pop end end %%EndResource %%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 %%Copyright: Copyright 1987-2003 Adobe Systems Incorporated. %%Version: 1.0 0 userdict /ct_T42Dict 15 dict put ct_T42Dict begin /Is2015? { version cvi 2015 ge } bind def /AllocGlyphStorage { Is2015? { pop } { {string} forall } ifelse } bind def /Type42DictBegin { 25 dict begin /FontName exch def /CharStrings 256 dict begin /.notdef 0 def currentdict end def /Encoding exch def /PaintType 0 def /FontType 42 def /FontMatrix [1 0 0 1 0 0] def 4 array astore cvx /FontBBox exch def /sfnts } bind def /Type42DictEnd { currentdict dup /FontName get exch definefont end ct_T42Dict exch dup /FontName get exch put } bind def /RD {string currentfile exch readstring pop} executeonly def /PrepFor2015 { Is2015? { /GlyphDirectory 16 dict def sfnts 0 get dup 2 index (glyx) putinterval 2 index (locx) putinterval pop pop } { pop pop } ifelse } bind def /AddT42Char { Is2015? { /GlyphDirectory get begin def end pop pop } { /sfnts get 4 index get 3 index 2 index putinterval pop pop pop pop } ifelse } bind def end %%EndResource Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end %%BeginResource: procset Adobe_AGM_Image 1.0 0 %%Version: 1.0 0 %%Copyright: Copyright (C) 2000-2003 Adobe Systems, Inc. All Rights Reserved. systemdict /setpacking known { currentpacking true setpacking } if userdict /Adobe_AGM_Image 75 dict dup begin put /Adobe_AGM_Image_Id /Adobe_AGM_Image_1.0_0 def /nd{ null def }bind def /AGMIMG_&image nd /AGMIMG_&colorimage nd /AGMIMG_&imagemask nd /AGMIMG_mbuf () def /AGMIMG_ybuf () def /AGMIMG_kbuf () def /AGMIMG_c 0 def /AGMIMG_m 0 def /AGMIMG_y 0 def /AGMIMG_k 0 def /AGMIMG_tmp nd /AGMIMG_imagestring0 nd /AGMIMG_imagestring1 nd /AGMIMG_imagestring2 nd /AGMIMG_imagestring3 nd /AGMIMG_imagestring4 nd /AGMIMG_imagestring5 nd /AGMIMG_cnt nd /AGMIMG_fsave nd /AGMIMG_colorAry nd /AGMIMG_override nd /AGMIMG_name nd /AGMIMG_maskSource nd /invert_image_samples nd /knockout_image_samples nd /img nd /sepimg nd /devnimg nd /idximg nd /doc_setup { Adobe_AGM_Core begin Adobe_AGM_Image begin /AGMIMG_&image systemdict/image get def /AGMIMG_&imagemask systemdict/imagemask get def /colorimage where{ pop /AGMIMG_&colorimage /colorimage ldf }if end end }def /page_setup { Adobe_AGM_Image begin /AGMIMG_ccimage_exists {/customcolorimage where { pop /Adobe_AGM_OnHost_Seps where { pop false }{ /Adobe_AGM_InRip_Seps where { pop false }{ true }ifelse }ifelse }{ false }ifelse }bdf level2{ /invert_image_samples { Adobe_AGM_Image/AGMIMG_tmp Decode length ddf /Decode [ Decode 1 get Decode 0 get] def }def /knockout_image_samples { Operator/imagemask ne{ /Decode [1 1] def }if }def }{ /invert_image_samples { {1 exch sub} currenttransfer addprocs settransfer }def /knockout_image_samples { { pop 1 } currenttransfer addprocs settransfer }def }ifelse /img /imageormask ldf /sepimg /sep_imageormask ldf /devnimg /devn_imageormask ldf /idximg /indexed_imageormask ldf /_ctype 7 def currentdict{ dup xcheck 1 index type dup /arraytype eq exch /packedarraytype eq or and{ bind }if def }forall }def /page_trailer { end }def /doc_trailer { }def /imageormask_sys { begin save mark level2{ currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load AGMIMG_&imagemask }{ BitsPerComponent ImageMatrix /DataSource load AGMIMG_&image }ifelse }ifelse cleartomark restore end }def /overprint_plate { currentoverprint { 0 get dup type /nametype eq { dup /DeviceGray eq{ pop AGMCORE_black_plate not }{ /DeviceCMYK eq{ AGMCORE_is_cmyk_sep not }if }ifelse }{ false exch { AGMOHS_sepink eq or } forall not } ifelse }{ pop false }ifelse }def /process_mask_L3 { dup begin /ImageType 1 def end 4 dict begin /DataDict exch def /ImageType 3 def /InterleaveType 3 def /MaskDict 9 dict begin /ImageType 1 def /Width DataDict dup /MaskWidth known {/MaskWidth}{/Width} ifelse get def /Height DataDict dup /MaskHeight known {/MaskHeight}{/Height} ifelse get def /ImageMatrix [Width 0 0 Height neg 0 Height] def /NComponents 1 def /BitsPerComponent 1 def /Decode [0 1] def /DataSource AGMIMG_maskSource def currentdict end def currentdict end }def /use_mask { dup type /dicttype eq { dup /Mask known { dup /Mask get { level3 {true} { dup /MaskWidth known {dup /MaskWidth get 1 index /Width get eq}{true}ifelse exch dup /MaskHeight known {dup /MaskHeight get 1 index /Height get eq}{true}ifelse 3 -1 roll and } ifelse } {false} ifelse } {false} ifelse } {false} ifelse }def /make_line_source { begin MultipleDataSources { [ Decode length 2 div cvi {Width string} repeat ] }{ Width Decode length 2 div mul cvi string }ifelse end }def /datasource_to_str { exch dup type dup /filetype eq { pop exch readstring }{ /arraytype eq { exec exch copy }{ pop }ifelse }ifelse pop }def /masked_image_simulation { 3 dict begin dup make_line_source /line_source xdf /mask_source AGMIMG_maskSource /LZWDecode filter def dup /Width get 8 div ceiling cvi string /mask_str xdf begin gsave 0 1 translate 1 -1 Height div scale 1 1 Height { pop gsave MultipleDataSources { 0 1 DataSource length 1 sub { dup DataSource exch get exch line_source exch get datasource_to_str } for }{ DataSource line_source datasource_to_str } ifelse << /PatternType 1 /PaintProc [ /pop cvx << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1.0 sub 1 matrix scale 0.5 0 matrix translate matrix concatmatrix /MultipleDataSources MultipleDataSources /DataSource line_source /BitsPerComponent BitsPerComponent /Decode Decode >> /image cvx ] cvx /BBox [0 0 Width 1] /XStep Width /YStep 1 /PaintType 1 /TilingType 2 >> matrix makepattern set_pattern << /ImageType 1 /Width Width /Height 1 /ImageMatrix Width 1 matrix scale /MultipleDataSources false /DataSource mask_source mask_str readstring pop /BitsPerComponent 1 /Decode [0 1] >> imagemask grestore 0 1 translate } for grestore end end }def /imageormask { begin SkipImageProc { currentdict consumeimagedata } { save mark level2 AGMCORE_host_sep not and{ currentdict Operator /imagemask eq DeviceN_PS2 not and { imagemask }{ AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get /DeviceGray eq and{ [/Separation /Black /DeviceGray {}] setcolorspace /Decode [ Decode 1 get Decode 0 get ] def }if use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and { Names convert_to_process not { 2 dict begin /imageDict xdf /names_index 0 def gsave imageDict write_image_file { Names { dup (None) ne { [/Separation 3 -1 roll /DeviceGray {1 exch sub}] setcolorspace Operator imageDict read_image_file names_index 0 eq {true setoverprint} if /names_index names_index 1 add def }{ pop } ifelse } forall close_image_file } if grestore end }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }{ Operator /imagemask eq { imagemask }{ image } ifelse } ifelse }ifelse }ifelse }{ Width Height Operator /imagemask eq{ Decode 0 get 1 eq Decode 1 get 0 eq and ImageMatrix /DataSource load /Adobe_AGM_OnHost_Seps where { pop imagemask }{ currentgray 1 ne{ currentdict imageormask_sys }{ currentoverprint not{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }ifelse }{ BitsPerComponent ImageMatrix MultipleDataSources{ 0 1 NComponents 1 sub{ DataSource exch get }for }{ /DataSource load }ifelse Operator /colorimage eq{ AGMCORE_host_sep{ MultipleDataSources level2 or NComponents 4 eq and{ AGMCORE_is_cmyk_sep{ MultipleDataSources{ /DataSource [ DataSource 0 get /exec cvx DataSource 1 get /exec cvx DataSource 2 get /exec cvx DataSource 3 get /exec cvx /AGMCORE_get_ink_data cvx ] cvx def }{ /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul /DataSource load filter_cmyk 0 () /SubFileDecode filter def }ifelse /Decode [ Decode 0 get Decode 1 get ] def /MultipleDataSources false def /NComponents 1 def /Operator /image def invert_image_samples 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ 1 AGMCORE_&setgray currentdict imageormask_sys }{ currentdict ignoreimagedata }ifelse }ifelse }{ MultipleDataSources NComponents AGMIMG_&colorimage }ifelse }{ true NComponents colorimage }ifelse }{ Operator /image eq{ AGMCORE_host_sep{ /DoImage true def HostSepColorImage{ invert_image_samples }{ AGMCORE_black_plate not Operator/imagemask ne and{ /DoImage false def currentdict ignoreimagedata }if }ifelse 1 AGMCORE_&setgray DoImage {currentdict imageormask_sys} if }{ use_mask { level3 {process_mask_L3 image}{masked_image_simulation}ifelse }{ image }ifelse }ifelse }{ Operator/knockout eq{ pop pop pop pop pop currentcolorspace overprint_plate not{ knockout_unitsq }if }if }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse end }def /sep_imageormask { /sep_colorspace_dict AGMCORE_gget begin /MappedCSA CSA map_csa def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_avoid_L2_sep_space{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def }if AGMIMG_ccimage_exists MappedCSA 0 get /DeviceCMYK eq and currentdict/Components known and Name () ne and Name (All) ne and Operator /image eq and AGMCORE_producing_seps not and level2 not and { Width Height BitsPerComponent ImageMatrix [ /DataSource load /exec cvx { 0 1 2 index length 1 sub{ 1 index exch 2 copy get 255 xor put }for } /exec cvx ] cvx bind MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Name findcmykcustomcolor customcolorimage }{ AGMCORE_producing_seps not{ level2{ AGMCORE_avoid_L2_sep_space not currentcolorspace 0 get /Separation ne and{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentdict imageormask }{ currentdict Operator /imagemask eq{ imageormask }{ sep_imageormask_lev1 }ifelse }ifelse }{ AGMCORE_host_sep{ Operator/knockout eq{ currentdict/ImageMatrix get concat knockout_unitsq }{ currentgray 1 ne{ AGMCORE_is_cmyk_sep Name (All) ne and{ level2{ [ /Separation Name [/DeviceGray] { sep_colorspace_proc AGMCORE_get_ink_data 1 exch sub } bind ] AGMCORE_&setcolorspace /sep_tint AGMCORE_gget AGMCORE_&setcolor currentdict imageormask_sys }{ currentdict Operator /imagemask eq{ imageormask_sys }{ sep_image_lev1_sep }ifelse }ifelse }{ Operator/imagemask ne{ invert_image_samples }if currentdict imageormask_sys }ifelse }{ currentoverprint not Name (All) eq or Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentcolorspace 0 get /Separation ne{ [/Separation Name MappedCSA sep_proc_name exch 0 get exch load ] setcolorspace_opt /sep_tint AGMCORE_gget setcolor }if currentoverprint MappedCSA 0 get /DeviceCMYK eq and Name inRip_spot_has_ink not and Name (All) ne and { imageormask_l2_overprint }{ currentdict imageormask }ifelse }ifelse }ifelse }ifelse cleartomark restore }ifelse end end }def /decode_image_sample { 4 1 roll exch dup 5 1 roll sub 2 4 -1 roll exp 1 sub div mul add } bdf /colorSpaceElemCnt { currentcolorspace 0 get dup /DeviceCMYK eq { pop 4 } { /DeviceRGB eq { pop 3 }{ 1 } ifelse } ifelse } bdf /devn_sep_datasource { 1 dict begin /dataSource xdf [ 0 1 dataSource length 1 sub { dup currentdict /dataSource get /exch cvx /get cvx /exec cvx /exch cvx names_index /ne cvx [ /pop cvx ] cvx /if cvx } for ] cvx bind end } bdf /devn_alt_datasource { 11 dict begin /srcDataStrs xdf /dstDataStr xdf /convProc xdf /origcolorSpaceElemCnt xdf /origMultipleDataSources xdf /origBitsPerComponent xdf /origDecode xdf /origDataSource xdf /dsCnt origMultipleDataSources {origDataSource length}{1}ifelse def /samplesNeedDecoding 0 0 1 origDecode length 1 sub { origDecode exch get add } for origDecode length 2 div div dup 1 eq { /decodeDivisor 2 origBitsPerComponent exp 1 sub def } if 2 origBitsPerComponent exp 1 sub ne def [ 0 1 dsCnt 1 sub [ currentdict /origMultipleDataSources get { dup currentdict /origDataSource get exch get dup type }{ currentdict /origDataSource get dup type } ifelse dup /filetype eq { pop currentdict /srcDataStrs get 3 -1 /roll cvx /get cvx /readstring cvx /pop cvx }{ /stringtype ne { /exec cvx } if currentdict /srcDataStrs get /exch cvx 3 -1 /roll cvx /xpt cvx } ifelse ] cvx /for cvx currentdict /srcDataStrs get 0 /get cvx /length cvx 0 /ne cvx [ 0 1 Width 1 sub [ Adobe_AGM_Utils /AGMUTIL_ndx /xddf cvx currentdict /origMultipleDataSources get { 0 1 dsCnt 1 sub [ Adobe_AGM_Utils /AGMUTIL_ndx1 /xddf cvx currentdict /srcDataStrs get /AGMUTIL_ndx1 /load cvx /get cvx /AGMUTIL_ndx /load cvx /get cvx samplesNeedDecoding { currentdict /decodeDivisor known { currentdict /decodeDivisor get /div cvx }{ currentdict /origDecode get /AGMUTIL_ndx1 /load cvx 2 /mul cvx 2 /getinterval cvx /aload cvx /pop cvxs BitsPerComponent /decode_image_sample load /exec cvx } ifelse } if ] cvx /for cvx }{ Adobe_AGM_Utils /AGMUTIL_ndx1 0 /ddf cvx currentdict /srcDataStrs get 0 /get cvx /AGMUTIL_ndx /load cvx currentdict /origDecode get length 2 idiv dup 3 1 /roll cvx /mul cvx /exch cvx /getinterval cvx [ samplesNeedDecoding { currentdict /decodeDivisor known { currentdict /decodeDivisor get /div cvx }{ currentdict /origDecode get /AGMUTIL_ndx1 /load cvx 2 /mul cvx 2 /getinterval cvx /aload cvx /pop cvx BitsPerComponent /decode_image_sample load /exec cvx Adobe_AGM_Utils /AGMUTIL_ndx1 /AGMUTIL_ndx1 /load cvx 1 /add cvx /ddf cvx } ifelse } if ] cvx /forall cvx } ifelse currentdict /convProc get /exec cvx currentdict /origcolorSpaceElemCnt get 1 sub -1 0 [ currentdict /dstDataStr get 3 1 /roll cvx /AGMUTIL_ndx /load cvx currentdict /origcolorSpaceElemCnt get /mul cvx /add cvx /exch cvx currentdict /convProc get /filter_indexed_devn load ne { 255 /mul cvx /cvi cvx } if /put cvx ] cvx /for cvx ] cvx /for cvx currentdict /dstDataStr get ] cvx /if cvx ] cvx bind end } bdf /devn_imageormask { /devicen_colorspace_dict AGMCORE_gget begin /MappedCSA CSA map_csa def 2 dict begin dup dup /dstDataStr exch /Width get colorSpaceElemCnt mul string def /srcDataStrs [ 3 -1 roll begin currentdict /MultipleDataSources known {MultipleDataSources {DataSource length}{1}ifelse}{1} ifelse { Width Decode length 2 div mul cvi string } repeat end ] def begin SkipImageProc { currentdict consumeimagedata } { save mark AGMCORE_producing_seps not { level3 not { Operator /imagemask ne { /DataSource [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse colorSpaceElemCnt /devicen_colorspace_dict AGMCORE_gget /TintTransform get dstDataStr srcDataStrs devn_alt_datasource /exec cvx ] cvx 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def } if }if currentdict imageormask }{ AGMCORE_host_sep{ Names convert_to_process { CSA map_csa 0 get /DeviceCMYK eq { /DataSource Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse 4 /devicen_colorspace_dict AGMCORE_gget /TintTransform get dstDataStr srcDataStrs devn_alt_datasource /exec cvx ] cvx filter_cmyk 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode [1 0] def /DeviceGray setcolorspace currentdict imageormask_sys }{ AGMCORE_report_unsupported_color_space AGMCORE_black_plate { /DataSource [ DataSource Decode BitsPerComponent currentdict /MultipleDataSources known {MultipleDataSources}{false} ifelse CSA map_csa 0 get /DeviceRGB eq{3}{1}ifelse /devicen_colorspace_dict AGMCORE_gget /TintTransform get dstDataStr srcDataStrs devn_alt_datasource /exec cvx ] cvx 0 () /SubFileDecode filter def /MultipleDataSources false def /Decode colorSpaceElemCnt [ exch {0 1} repeat ] def currentdict imageormask_sys } { gsave knockout_unitsq grestore currentdict consumeimagedata } ifelse } ifelse } { /devicen_colorspace_dict AGMCORE_gget /names_index known { Operator/imagemask ne{ MultipleDataSources { /DataSource [ DataSource devn_sep_datasource /exec cvx ] cvx def /MultipleDataSources false def }{ /DataSource /DataSource load dstDataStr srcDataStrs 0 get filter_devn def } ifelse invert_image_samples } if currentdict imageormask_sys }{ currentoverprint not Operator/imagemask eq and{ currentdict imageormask_sys }{ currentoverprint not { gsave knockout_unitsq grestore }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ currentdict imageormask }ifelse }ifelse cleartomark restore }ifelse end end end }def /imageormask_l2_overprint { currentdict currentcmykcolor add add add 0 eq{ currentdict consumeimagedata }{ level3{ currentcmykcolor /AGMIMG_k xdf /AGMIMG_y xdf /AGMIMG_m xdf /AGMIMG_c xdf Operator/imagemask eq{ [/DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK {}] setcolorspace AGMIMG_c 0 ne {AGMIMG_c} if AGMIMG_m 0 ne {AGMIMG_m} if AGMIMG_y 0 ne {AGMIMG_y} if AGMIMG_k 0 ne {AGMIMG_k} if setcolor }{ /Decode [ Decode 0 get 255 mul Decode 1 get 255 mul ] def [/Indexed [ /DeviceN [ AGMIMG_c 0 ne {/Cyan} if AGMIMG_m 0 ne {/Magenta} if AGMIMG_y 0 ne {/Yellow} if AGMIMG_k 0 ne {/Black} if ] /DeviceCMYK { AGMIMG_k 0 eq {0} if AGMIMG_y 0 eq {0 exch} if AGMIMG_m 0 eq {0 3 1 roll} if AGMIMG_c 0 eq {0 4 1 roll} if } ] 255 { 255 div mark exch dup dup dup AGMIMG_k 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_y 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_m 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop counttomark 1 roll }{ pop }ifelse AGMIMG_c 0 ne{ /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop counttomark 1 roll }{ pop }ifelse counttomark 1 add -1 roll pop } ] setcolorspace }ifelse imageormask_sys }{ write_image_file{ currentcmykcolor 0 ne{ [/Separation /Black /DeviceGray {}] setcolorspace gsave /Black [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 1 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Yellow /DeviceGray {}] setcolorspace gsave /Yellow [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 2 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Magenta /DeviceGray {}] setcolorspace gsave /Magenta [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {4 3 roll pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore }if 0 ne{ [/Separation /Cyan /DeviceGray {}] setcolorspace gsave /Cyan [{1 exch sub /sep_tint AGMCORE_gget mul} /exec cvx MappedCSA sep_proc_name cvx exch pop {pop pop pop 1 exch sub} /exec cvx] cvx modify_halftone_xfer Operator currentdict read_image_file grestore } if close_image_file }{ imageormask }ifelse }ifelse }ifelse } def /indexed_imageormask { begin save mark currentdict AGMCORE_host_sep{ Operator/knockout eq{ /indexed_colorspace_dict AGMCORE_gget dup /CSA known { /CSA get map_csa }{ /CSD get get_csd /Names get } ifelse overprint_plate not{ knockout_unitsq }if }{ Indexed_DeviceN { /devicen_colorspace_dict AGMCORE_gget /names_index known { indexed_image_lev2_sep }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata } ifelse }{ AGMCORE_is_cmyk_sep{ Operator /imagemask eq{ imageormask_sys }{ level2{ indexed_image_lev2_sep }{ indexed_image_lev1_sep }ifelse }ifelse }{ currentoverprint not{ knockout_unitsq }if currentdict consumeimagedata }ifelse }ifelse }ifelse }{ level2{ Indexed_DeviceN { /indexed_colorspace_dict AGMCORE_gget begin CSD get_csd begin }{ /indexed_colorspace_dict AGMCORE_gget begin CSA map_csa 0 get /DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and { [/Indexed [/DeviceN [/Cyan /Magenta /Yellow /Black] /DeviceCMYK {}] HiVal Lookup] setcolorspace } if end } ifelse imageormask Indexed_DeviceN { end end } if }{ Operator /imagemask eq{ imageormask }{ indexed_imageormask_lev1 }ifelse }ifelse }ifelse cleartomark restore end }def /indexed_image_lev2_sep { /indexed_colorspace_dict AGMCORE_gget begin begin Indexed_DeviceN not { currentcolorspace dup 1 /DeviceGray put dup 3 currentcolorspace 2 get 1 add string 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub { dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put }for put setcolorspace } if currentdict Operator /imagemask eq{ AGMIMG_&imagemask }{ use_mask { level3 {process_mask_L3 AGMIMG_&image}{masked_image_simulation}ifelse }{ AGMIMG_&image }ifelse }ifelse end end }def /OPIimage { dup type /dicttype ne{ 10 dict begin /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /ImageType 1 def /Decode [0 1 def] currentdict end }if dup begin /NComponents 1 cdndf /MultipleDataSources false cdndf /SkipImageProc {false} cdndf /HostSepColorImage false cdndf /Decode [ 0 currentcolorspace 0 get /Indexed eq{ 2 BitsPerComponent exp 1 sub }{ 1 }ifelse ] cdndf /Operator /image cdndf end /sep_colorspace_dict AGMCORE_gget null eq{ imageormask }{ gsave dup begin invert_image_samples end sep_imageormask grestore }ifelse }def /cachemask_level2 { 3 dict begin /LZWEncode filter /WriteFilter xdf /readBuffer 256 string def /ReadFilter currentfile 0 (%EndMask) /SubFileDecode filter /ASCII85Decode filter /RunLengthDecode filter def { ReadFilter readBuffer readstring exch WriteFilter exch writestring not {exit} if }loop WriteFilter closefile end }def /cachemask_level3 { currentfile << /Filter [ /SubFileDecode /ASCII85Decode /RunLengthDecode ] /DecodeParms [ << /EODCount 0 /EODString (%EndMask) >> null null ] /Intent 1 >> /ReusableStreamDecode filter }def /spot_alias { /mapto_sep_imageormask { dup type /dicttype ne{ 12 dict begin /ImageType 1 def /DataSource xdf /ImageMatrix xdf /BitsPerComponent xdf /Height xdf /Width xdf /MultipleDataSources false def }{ begin }ifelse /Decode [/customcolor_tint AGMCORE_gget 0] def /Operator /image def /HostSepColorImage false def /SkipImageProc {false} def currentdict end sep_imageormask }bdf /customcolorimage { Adobe_AGM_Image/AGMIMG_colorAry xddf /customcolor_tint AGMCORE_gget bdict /Name AGMIMG_colorAry 4 get /CSA [ /DeviceCMYK ] /TintMethod /Subtractive /TintProc null /MappedCSA null /NComponents 4 /Components [ AGMIMG_colorAry aload pop pop ] edict setsepcolorspace mapto_sep_imageormask }ndf Adobe_AGM_Image/AGMIMG_&customcolorimage /customcolorimage load put /customcolorimage { Adobe_AGM_Image/AGMIMG_override false put dup 4 get map_alias{ /customcolor_tint AGMCORE_gget exch setsepcolorspace pop mapto_sep_imageormask }{ AGMIMG_&customcolorimage }ifelse }bdf }def /snap_to_device { 6 dict begin matrix currentmatrix dup 0 get 0 eq 1 index 3 get 0 eq and 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop { 1 1 dtransform 0 gt exch 0 gt /AGMIMG_xSign? exch def /AGMIMG_ySign? exch def 0 0 transform AGMIMG_ySign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch AGMIMG_xSign? {floor 0.1 sub}{ceiling 0.1 add} ifelse exch itransform /AGMIMG_llY exch def /AGMIMG_llX exch def 1 1 transform AGMIMG_ySign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch AGMIMG_xSign? {ceiling 0.1 add}{floor 0.1 sub} ifelse exch itransform /AGMIMG_urY exch def /AGMIMG_urX exch def [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY] concat }{ }ifelse end } def level2 not{ /colorbuf { 0 1 2 index length 1 sub{ dup 2 index exch get 255 exch sub 2 index 3 1 roll put }for }def /tint_image_to_color { begin Width Height BitsPerComponent ImageMatrix /DataSource load end Adobe_AGM_Image begin /AGMIMG_mbuf 0 string def /AGMIMG_ybuf 0 string def /AGMIMG_kbuf 0 string def { colorbuf dup length AGMIMG_mbuf length ne { dup length dup dup /AGMIMG_mbuf exch string def /AGMIMG_ybuf exch string def /AGMIMG_kbuf exch string def } if dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop } addprocs {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf} true 4 colorimage end } def /sep_imageormask_lev1 { begin MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ { 255 mul round cvi GrayLookup exch get } currenttransfer addprocs settransfer currentdict imageormask }{ /sep_colorspace_dict AGMCORE_gget/Components known{ MappedCSA 0 get /DeviceCMYK eq{ Components aload pop }{ 0 0 0 Components aload pop 1 exch sub }ifelse Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ {AGMIMG_k mul 1 exch sub} currenttransfer addprocs settransfer currentdict imageormask }{ currentcolortransfer {AGMIMG_k mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_y mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_m mul 1 exch sub} exch addprocs 4 1 roll {AGMIMG_c mul 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }{ MappedCSA 0 get /DeviceGray eq { {255 mul round cvi ColorLookup exch get 0 get} currenttransfer addprocs settransfer currentdict imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 2 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 1 get} exch addprocs 4 1 roll {255 mul round cvi ColorLookup exch get 0 get} exch addprocs 4 1 roll setcolortransfer currentdict tint_image_to_color }ifelse }ifelse }ifelse }ifelse end }def /sep_image_lev1_sep { begin /sep_colorspace_dict AGMCORE_gget/Components known{ Components aload pop Adobe_AGM_Image/AGMIMG_k xddf Adobe_AGM_Image/AGMIMG_y xddf Adobe_AGM_Image/AGMIMG_m xddf Adobe_AGM_Image/AGMIMG_c xddf {AGMIMG_c mul 1 exch sub} {AGMIMG_m mul 1 exch sub} {AGMIMG_y mul 1 exch sub} {AGMIMG_k mul 1 exch sub} }{ {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} }ifelse AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end }def /indexed_imageormask_lev1 { /indexed_colorspace_dict AGMCORE_gget begin begin currentdict MappedCSA 0 get dup /DeviceRGB eq exch /DeviceCMYK eq or has_color not and{ {HiVal mul round cvi GrayLookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceGray eq { {HiVal mul round cvi Lookup exch get HiVal div} currenttransfer addprocs settransfer imageormask }{ MappedCSA 0 get /DeviceCMYK eq { currentcolortransfer {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }{ currentcolortransfer {pop 1} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div} exch addprocs 4 1 roll {3 mul HiVal mul round cvi Lookup exch get HiVal div} exch addprocs 4 1 roll setcolortransfer tint_image_to_color }ifelse }ifelse }ifelse end end }def /indexed_image_lev1_sep { /indexed_colorspace_dict AGMCORE_gget begin begin {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} AGMCORE_get_ink_data currenttransfer addprocs settransfer currentdict imageormask_sys end end }def }if end systemdict /setpacking known { setpacking } if %%EndResource currentdict Adobe_AGM_Utils eq {end} if %%EndProlog %%BeginSetup Adobe_AGM_Utils begin 2 2010 Adobe_AGM_Core/doc_setup get exec Adobe_CoolType_Core/doc_setup get exec Adobe_AGM_Image/doc_setup get exec currentdict Adobe_AGM_Utils eq {end} if %%EndSetup %%Page: xen3-1.0.eps 1 %%EndPageComments %%BeginPageSetup /currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 - - - - Adobe PDF library 6.66 - - - - - - - 2006-05-14T09:34:14-07:00 - 2006-06-26T18:03:19Z - Illustrator - 2006-05-14T09:34:14-07:00 - - - - JPEG - 256 - 112 - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAcAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FUn13zZoei L/ps49elVto/ilP+x7fNqYq8/wBW/NrVpyyabbpZx9pH/eyfPf4B9xxVIX1Tzpqx5fWLy4Rv5C6x /ctExVT/AMJ+Zpvia1Zj4vIgP/DNirY8v+arT4o4JoyNwYXBP/CMcVV7fzf5z0pwj3c4p/uq6Beo 8P3oJH0YqyvRfzcidli1i19OuxubepX5mM1P3E/LFWfafqVhqNuLmxnS4hP7aGtD4EdQfY4qicVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVececvzLMbSafobguKrNfdQ D3EXj/rfd44qxDSfLOq6zIbqZmjhkPJrmWrM57lQd2+eKsz03yro1gAVgE0o/wB2zUc19h0H0DFU 3xV2KuxVZLDFMhjlRZEPVHAYH6DirHdV8jabchnsz9Um6gDeMn3Xt9GKsWjk8w+VtREkbNby/wAw +KKVR2PZh8+mKvVPKHnex1+L0nAt9SQVkt67MP5o69R7dvxxVk2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KvNPzI86uHk0PTpONPhvp1O58Ygf+Jfd44qk3lTyksypf6gtYjv BbkfaHZm9vAd8VZuAAAAKAbADFW8VdirsVdirsVdiqhe2Nre27W9zGJIn7HqD4g9jirznWdHvvL+ oxz28jCMNztbldiCu9D/AJQ/HFXq3krzZF5g06slE1CCguohsD4Ovs34YqyPFXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWP+d/MY0PRJJoyPrk/7q1HgxG7/wCxG/zpirxaPyPJ5xsL 61lvJ7FShKX8DMsq3BBKMCCOQB3YV3G3euKvmfzZf/mb5V1+70LVtb1KK8tG4ki8uODod0kjJYVR huMVSj/HPnb/AKmDUv8ApMn/AOa8Vd/jnzt/1MGpf9Jk/wDzXiqc+Wfzh/MPQtYstQXXb+9gtJAz 6fdXU8tvKh2dHjdmX4gTvSoO43xV9teUPNekea/L1nrulSc7S7TlxP243GzxuOzI2x/piqc4q7FX l/5v/nnofkSB7C04aj5mdf3diD8EIYVElwR0FNwg+I+w3xV8m6p+Zn5ganqE9/deYL8T3DF3WK4l hjHskcbKiqOwAxVBS+c/OEycJtd1CROvF7udhX5F8VW2/nDzbbOZLbW7+CQiheO6mQ08KqwxVG2/ nr8xrmeO3t/MOsTXEzBIoY7y6d3djRVVQ5JJPQDFX1b+R/5I+fLc2/mL8wvMGqPOOMtn5e+v3BVC N1a7IejH/iobfzV3UKvoPFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXjX5m6u9/5kNoh 5Q2CiFFHeRqM5+daL9GKsq0LTV07S4LUD4wOUx8Xbdv6YqwP87/yjtvPugetZqkXmTT1LafcGg9R ept5G/lb9k/st7E4q+J7u1ubO6mtLqJoLm3dop4ZAVdHQ8WVgehBGKqWKuxV6p+Qf5tP5I8w/UdR lP8AhvVHC3incQS7KtwB7dHp1X/VGKvtJZEdBIjBo2HJXBqCDuCDir5+/Oj/AJyRg031/L3kqZZ9 RFY7vWVo0cJGxSCtVd/F/sjtU9FXy9cXFxc3ElxcyvNcTMZJppGLu7saszMakknqTiqnirsVTPQP Lms6/fCz0q2e4lADSsB8EaEgc5H6KtT1Py64q+xf+caPyr8qeXYLq/mhS981QkBr+QVEUUi0426n 7G4YM/2iPAGmKvfMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVWSyJFE8rmiRqWY+wFTi rwjQ1fVPNEUs27SzPcy18QTIa/M4q9OxV2KvAf8AnJH8mf0vay+c9Ag/3K2qV1a1jG9xCg/vlA6y Rgb/AMy+67qvlXFXYq7FWcy/nN57fyJb+S1vTFpsHKNp0qLh7c/Zt2kr/drvsO3w/Z2xVg2KuxV2 KvRvyp/JTzJ5+uVuFBsPL8b8bjU5F2ah+JIFNOb/AIDv4Yq9180ebvym/KHyzP5T0uH6zqkkf7yz gKvcNKRVZbyciinuB1p9leOKvD5v+cgvzEhmnbQ7tNFjnX03FuivIUqDvJKHoajqoXFWKat+YPnz V2Lap5i1K85bcZruZ1oewUtxA9gMVSKWaaZzJM7SSHq7ksdvc4qiLPVtVsiDZXk9sVqVMMrx0J60 4kYqzXy3+ff5u+X5FNl5mvJ4lO8F8/1yMj+Wlx6hUf6pGKvpP8m/+crdJ8131voHmy3j0jW7hlit LuEt9TuJWNFSjFmhdifhBYg+INBir6BxV8PfnL+ev5kWn5o+ZLHQ/MN1Y6XY3jWkFrCy8ENsohkp Ve8iMT74qwz/AJX9+cn/AFNl9/wS/wDNOKu/5X9+cn/U2X3/AAS/804q9x0z/nKCLyh+Vmix6hcP 5o8+X8UlzcRySD07dJZn9D6xItaH0uBEaivjxqCVXiXm78//AM2fNE0jXmv3FlbOTSy05mtIVU/s 0iIdx/rs2KsBuby7u5TLdTyTymtZJWZ23NTuxJ64qmmh+dfOGgypLoutXunslOIt7iSNdhQAqG4k U7EYq+qP+cd/+cltR80atD5Q85FH1a4B/RmqoixidkUs0UyLRFfiPhZQAelK0qqzX/nI7XPPnlfy dJ5r8r+Ym0pLAxQzacLS1uFnaeZUDmWdJGTiG6Ab4q8488+f/wA7NB8j/l9eab5ra/1vzqUnFdPs I+H1m3tmitlHpMrcZJm+OgJrirDde/5yZ/NvUdDsdS8vap9Rg0qxtLbzBMbW0czalM8w5j1IXVfU jh5BUoo3xV9ieZJPT8u6o4NCtpOQT4+m1MVeReQEDa3IT+xAxHz5KP44q9DxV2KuxV8k/wDORf5M f4dvn816DBTQbyT/AE62jHw2k7nqAOkUhO3ZW26FcVeG4q7FXYq7FW1VmYKoJYmgA3JJxV9Cfk9/ zjPcagINd88Rtb2JpJbaLUrNKOoa4IoY1/yB8R78e6r0P8+fzQj/AC98tWuheXVjttZv4zHZrEqq lpap8JkVAKA/sxilOp/ZoVXx1NNNPM80ztLNKxeSRyWZmY1LMTuST1OKrMVe9/8AOL/5HaZ54u7r zJ5jiM3l/TJRBBZVKrc3XEOwcgg+nErKSP2iR2qCq+woPKPlS3sP0fBotjFYU4/VEtoVip4cAvHt 4Yq+H/8AnKHyP5f8ofmebXQYEtLHULKLUDZRbRwySSSxOiL+yp9HkF6Cu21MVeRYq2CQajYjFX6G /k158fW/yY0nzPq8paa1s5l1Kd/tMbFnjeRiepdYuZ+eKvz71XUJ9S1O81Gf+/vZ5LiXv8crl2/E 4qhcVdir3P8AKr/nFLzV5z0eDXdWv00DSbtRJZBojPczRncSCLlEqI4+yxap68aUJVa/Ob/nGG// AC+8tnzJY6wNX0yGSOK8jeD6vLF6p4I4o8iupchT0IqOu+KvDcVdirJfy0kuI/zG8rPblhONXsfT 4btyNygAA71xV+keraNpGsWL2Gr2NvqNjIVMlpdxJPExU8lJjkDKaEVG2Koebyt5YnTTUn0iylTR ih0dXtomFmY+Ppm2BX9zw4Lx4UpQeGKoL/lXf5f/AFOay/wxpP1K5lWe4tvqNt6UkqAhZHThxZ1D tRiK7nFUw8xxmTy9qiKKs1pOFHuY2piryHyA4XW5FP7cDAfMMp/hir0PFXYqpXNzbWtvJc3MqQW8 Kl5ppGCIiqKlmZqAADucVfL/AOdn/ORsesWt55X8ohW0udWgv9VkSpmRtmSBHHwoR+2RU9qdSq+f MVdirsVdir6g/wCcXvIfkG60f/FHMal5kt5DHNBOoAsWqeBjjqal1HISn5ChDYq+iMVfCv57eYJt b/NTX5XYmOyuG0+BD0RLT90wHzkVm+nFWA4q7FUwtotfjiH1ZLtIW+JfTEgU1HUcdt8VVf8Anaf+ X7/ktiqhNY65O/Oa3uZXpTk6SMafMjFVn6J1X/ljn/5Fv/TFXfonVf8Aljn/AORb/wBMVfV0dxce TP8AnDLjPyivtWtpYEifYkandsCoH/MM5bFXyNirsVZT+V3ldPNX5h+X9AkUvb315Gt0o6m3Q+pP 0/4qRsVfpTHHHFGscahI0AVEUAKqgUAAHQDFXhn/ADmLr66f+VKaYG/e6zfwQlP+K4K3DH6HjT78 VfEGKuxV6n/zjJ5dGt/nNoQdOcGmmXUZvb6uhMR/5HGPFX6A4q7FXYqtljSSN43FUcFWHsRQ4q8H 0Vn0rzRHFNsYZ2tpa7dSYz9x3xV6diqSeb/Ofl3yjo8mra7drbWybRp1klftHEnV2P8AadsVfHn5 s/nh5i8+XD2kZbTvLiNWHTUbeTiaq9ww+23fj9le2+5Vea4q7FXYq7FXYqy38svzD1XyJ5ng1izr JbNSLUbKtFngJ+Jf9ZeqHsfauKvuvy/r2leYNGtNZ0qcXFhexiWCUeB2KsOzKdmHY7Yq+Ffza0W5 0b8yvMdlOhSt/PPDy7w3DmaJveqOMVYjirsVfpZ+WGu6Prf5f6BfaRMktmbG3iohH7t4olR4mA+y 0bDiRiq38x/zI8teQPLs2s61MAQCtnZKw9e5l7RxKf8Ahm6KNzirxT/od7yt/wBS1ff8jocVd/0O 95W/6lq+/wCR0OKp15N/5yy0vzb5n0/y9pXla+e81CZYlb1oisa9Xlen7MaAs3sMVY//AM5u+YvS 0Ty35cjfe7uJr+dB2W3QRR19mM7/AHYq+RsVdir3z/nDXy7+kPzNutYkSsWi2Ejxv/LPcsIUH0xG XFX2xir48/5zZ8xfWfN2g+X0eqabZvdyqOgku5OND7hLcH6cVfN2KuxV9R/84Q+XeV75m8ySJ/dR wadbSePqMZph9HpxYq+scVdirsVdirxz8z9Iax8xG8RaQ36iVSOgkWiuP1N9OKpD55/Pzy35S0CF mIv/ADHNHSPS42oVcbepOwr6aHqO57eIVfJfnPzx5l846w+q69dm4mNRDCPhhhQmvpwp0VfxPUkn fFUgxV2Kro43kdY41LyOQqIoqSTsAAMVe5+Vf+cWPMeo+UrzU9XnOna1LBz0fSjSvMfEBdE/Y5jb iN1rVuhXFXh91bXFrcy2tzG0NxA7RTROKMjoeLKwPQgihxVSxV2KvX/+cffzgbybrP6F1eanlnU5 BzdjtaztRRMP8hthJ9/bdV77+cP5LaR+YdnFeW8qWXmC2Tja39OUckf2hFNx3K1NVYbr79MVfJ3m 78r/ADv5TvHttX02QBRyFzB+/hZakBuaV41p0ah9sVYpiqYaV5g17SC50nUrrTzJ/eG1nkh5U/m9 Nlriqhf6lqOo3LXWoXU15cts09xI0shHuzknFXWGmajqM4t9PtZry4b7MNvG0rmv+SgJxV6n5L/5 xe/NnzJLG1zpv6BsWoXutTrC4HWgtxWavzUD3xV9ZflH+R3lL8trNmsA19rdwnC81ecASMuxMcSi ojjqK8QST3JoMVfNX/OV6+Yte/NqeK0027uLPSbS3s4ZYoJXjYspuHIZVofin4n5Yq8b/wAJ+af+ rNff9I03/NOKu/wn5p/6s19/0jTf804q+vP+cNvKN5o/kvWtVv7WS0u9UvliEcyMjmG0j+BuLAH7 c0mKvoPFXwB+fcPmbzH+bnmTUIdLvZbWO5+p2zrbyshjtFEAZCFoVYxlh88Vef8A+E/NP/Vmvv8A pGm/5pxV3+E/NP8A1Zr7/pGm/wCacVfcP/OLHlW48v8A5RWRu4Gt73VLi4vriKRSjrVvRj5A77xw qfpxV69irsVdirRIUEk0A3JPQDFXy1/zkV/zkboMsLeWPKBS/voJKz64pDQQsAVZLc7iVt92+yO3 Lsq+Vbi4nuJnnuJGmnlJaSVyWZmPUkncnFVPFXYqmXl3y5rfmPVoNJ0W0e8v7g0SKMdB3ZidlVe7 HYYq+vfyf/IPRPJMceqapw1LzMwr9YIrDbVG6wA/teMh38Kb1Ves4q+Z/wDnKP8AKoRv/jvSIaI5 WPXYUHRjRY7mg8dkf3oe5OKvm/FXYq7FX0z/AM48fnhENL/wj5jmJuLKMnRLhjUyxqP95Sf5k/YP 8u3YVVeh6Tp995p8xiNiazt6lxIOkcS9afIbLir2C78n+U7yOOO90axu0iVUQXFtFLRVFFHxq3QY qln/ACqf8rP+pN0P/uG2n/VPFVe1/LX8ubRuVr5V0e3aoblFYWqGo6H4Yx0xVPrWztLSIQ2sEdvC OkcSqijanRQB2xVWxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kvmj877n/nIfzqZ9C8ueV7zSvKx qkp9e2W5vF6H1Ss3wRn/AH2Dv+0T0Crw3/oW/wDO3/qVp/8Akdbf9VcVUrn/AJx3/Oi2geebyvcC KMFnIkt2IA6miyE4qki/lZ5+Zgo0h6nYVkhA+8virJvLv/OOH5o6rqdvbXenDS7KT4ptQnkieNE6 1CxuzOT+yB18QN8VfVn5e/lr5Y8iaT9R0eCs8gBvL+QAzzsO7t2UfsqNh86nFWV4q7FVG9s7W9s5 7O7iWe1uY2hnhcVV43BVlYeBBpir4686/wDOOHn/AE7zLe23l7S5NT0XnzsLpZIQfSfcI4d1PJPs k03698VSP/lQP5v/APUtzf8AI23/AOqmKqF5+R/5qWcPrXWgSQx9OTTW+58APU3xVD6f+VX5lyXs C2Gjzm85g2/pPHz5g1BWj9uuKvt78jtO8wWnk5T5m0eTSvMfMx35laJxME/u5IzEzgIVO4P7Ve1M VeiYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8885/lqLl5NQ0RQkzVaay 6Kx6kx9gf8npirCtL8xavocxtZUZoozSS0mqpU+1d1xVmWm+bdGvgF9b6vMesc3w7+zfZP34qnII IBBqD0IxVvFXYqpz3FvbxmSeRYox1Z2Cj7zirG9V892FuCliv1qX+c1WMH9Z+j78VYzb23mLzVqP GNWuJB1b7MUSnxPRR+J98Ver+UvJdh5fg57XGoSCktyR0H8sfgv68VZHirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdiqVa55Y0XWo+N/bhpAKJOnwyr8mH6jtirANW/KPUY mL6XdJcx9opv3cg9qiqn8MVY8+geddKJC2t5CB1MHJ0++IsuKqf6e82RfA004I7MlT+K1xVsan5w u/hje7kJ2pEjA/8ACAYqiLXyP5y1KQPJaSpXrLdNwI+Yc8/wxVlujflHaRFZNXuTcMNzbwVRPpc/ EfoAxVndjYWVjbrbWcKQQL0RBQfM+J98VRGKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV/9k= - - - - - - - uuid:65ad4e0e-e367-11da-8f1a-000d93afebb2 - - - - application/postscript - - - - - % &&end XMP packet marker&& [{ai_metadata_stream_123} <> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 Adobe_AGM_Utils begin Adobe_AGM_Core/page_setup get exec Adobe_CoolType_Core/page_setup get exec Adobe_AGM_Image/page_setup get exec %%EndPageSetup Adobe_AGM_Core/AGMCORE_save save ddf 1 -1 scale 0 -93.5196 translate [1 0 0 1 0 0 ] concat % page clip gsave newpath gsave % PSGState 0 0 mo 0 93.5196 li 214.165 93.5196 li 214.165 0 li clp [1 0 0 1 0 0 ] concat 8.25879 46.7579 mo 8.25879 22.3165 28.0782 2.5 52.521 2.5 cv 76.9634 2.5 96.7769 22.3165 96.7769 46.7579 cv 96.7769 71.2032 76.9634 91.0196 52.521 91.0196 cv 28.0782 91.0196 8.25879 71.2032 8.25879 46.7579 cv false sop /0 [/DeviceGray] add_csa 0.8706 gry f 5 lw 0 lc 0 lj 4 ml [] 0 dsh true sadj 8.25879 46.7579 mo 8.25879 22.3165 28.0782 2.5 52.521 2.5 cv 76.9634 2.5 96.7769 22.3165 96.7769 46.7579 cv 96.7769 71.2032 76.9634 91.0196 52.521 91.0196 cv 28.0782 91.0196 8.25879 71.2032 8.25879 46.7579 cv cp 0.5647 gry @ 116.116 47.1055 mo 117.075 42.9981 115.555 40.2793 110.896 40.2793 cv 106.516 40.2793 103.46 42.9356 102.483 47.1055 cv 116.116 47.1055 li cp 101.063 53.17 mo 99.8052 58.5411 101.595 61.004 106.256 61.004 cv 110.22 61.004 112.205 59.3594 113.233 57.3379 cv 133.266 57.3379 li 131.397 62.6465 123.05 67.7012 105.038 67.7012 cv 88.691 67.7012 78.7691 62.834 81.5796 50.8321 cv 84.4605 38.5137 97.022 33.586 112.466 33.586 cv 125.82 33.586 138.41 37.4395 135.127 51.4629 cv 134.728 53.17 li 101.063 53.17 li /1 [/DeviceCMYK] add_csa 0 0 0 1 cmyk f 139.871 47.2325 mo 140.86 42.9981 141.766 38.8282 142.365 34.7872 cv 162.536 34.7872 li 161.512 40.3458 li 161.648 40.3458 li 166.04 35.8575 172.068 33.586 179.16 33.586 cv 185.423 33.586 195.758 35.4805 192.936 47.5469 cv 188.498 66.4981 li 168.054 66.4981 li 172.026 49.5059 li 173.122 44.8301 171.49 43.1876 167.941 43.1876 cv 163.209 43.1876 160.644 45.8418 159.507 50.7051 cv 155.807 66.4981 li 135.358 66.4981 li 139.871 47.2325 li f 39.7618 47.836 mo 17.8775 20.8731 li 44.6934 20.92 li 56.3023 36.6368 li 75.6192 20.8731 li 106.646 20.8731 li 67.9107 50.6114 li 89.6958 78.6407 li 62.6739 78.6407 li 51.5777 62.3243 li 30.9258 78.6407 li 0 78.6407 li 39.7618 47.836 li f 199.061 36.5992 mo 197.165 36.5992 li 197.165 35.1919 li 203.389 35.1919 li 203.389 36.5992 li 201.493 36.5992 li 201.493 40.9673 li 199.061 40.9673 li 199.061 36.5992 li f 204.381 35.1919 mo 208.069 35.1919 li 209.276 39.063 li 209.292 39.063 li 210.46 35.1919 li 214.165 35.1919 li 214.165 40.9673 li 211.909 40.9673 li 211.909 36.6236 li 211.893 36.6236 li 210.309 40.9673 li 207.956 40.9673 li 206.469 36.6236 li 206.444 36.6236 li 206.444 40.9673 li 204.381 40.9673 li 204.381 35.1919 li f %ADOBeginClientInjection: EndPageContent "AI11EPS" userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse %ADOEndClientInjection: EndPageContent "AI11EPS" % page clip grestore grestore % PSGState Adobe_AGM_Core/AGMCORE_save get restore %%PageTrailer [/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 Adobe_AGM_Image/page_trailer get exec Adobe_CoolType_Core/page_trailer get exec Adobe_AGM_Core/page_trailer get exec currentdict Adobe_AGM_Utils eq {end} if %%Trailer Adobe_AGM_Image/doc_trailer get exec Adobe_CoolType_Core/doc_trailer get exec Adobe_AGM_Core/doc_trailer get exec %%EOF %AI9_PrintingDataEnd userdict /AI9_read_buffer 256 string put userdict begin /ai9_skip_data { mark { currentfile AI9_read_buffer { readline } stopped { } { not { exit } if (%AI9_PrivateDataEnd) eq { exit } if } ifelse } loop cleartomark } def end userdict /ai9_skip_data get exec %AI9_PrivateDataBegin %!PS-Adobe-3.0 EPSF-3.0 %%Creator: Adobe Illustrator(R) 11.0 %%AI8_CreatorVersion: 11.0.0 %%For: (Rich Quarles) (glassCanopy, LLC) %%Title: (xen.eps) %%CreationDate: 6/26/06 11:03 AM %AI9_DataStream %Gb"-6l#J&kFY9G%;<$r+h\4JAk%%?HMjl%q;R=s %l1aX&+/jcu>SYjZe[P=S*uao3P\knM>lDQAS)=/3bMVZhb-J_7 %r_2ae?%uR_PZRnScOWg$]RA]M^e=\\W2FB'pt8J\f+$>;(,1hrp%J+641uJ#(gBgs*W-hfTu.YeFoVAeGPA$PQGZPXY6Jc$(]EV? %SuiedFbrn0b9!]'i.'R,XhXS]:[e:)X4Ku,l`ng=(N1T$!6pg %.SFU7aLrMV;OE7e2"nC4=*jOAei9$c45`g:F>Ie"f6=r=:"0!CmGkt\o+/Qh4AH(+;;X7E\aEhn*ZgpP,+%R_s5CG2hq`e[oR-Q# %rortQr/@!"n*WAes)@l"Ncn6)^j`ho`tj/Z^ZA'idrZ=`1Akq.&[iB)M8&.;po:R5mf*1amOte)DVs87IX:kc-f+i1h7qu%Z?cHA %p&0BW?Ke&fI]W=nhgU$aHiF!(4`2e(2^@5Rl_jK$&$uZ(hYk>DmL&>dTnP/ph#eQ %2d_#`p\;@us$a'gGu[j(lh)!7M>nu4!CDRR$L2<.WfEYT<2bsMQh5j9%-td!oFX5[_,mk%^O3cqmf)_md_PjOIt#+]+80jgFn6./ %"0HnJ5O*`9/G/hgVn5H5I/hI[rq-$(+!5FiEH%r:WpQrs,/0FPVB>!U:U`$jRIM=7Zm4TG2?>E5?6 %:V7&3LHg&"H'Rm/o(2C.\d#D#\pebH\:$L)GSQ:/NXPTO>E:B!G4BXaAt:Th6=4sHp.e[9p($QR?LtYY5Q$@>nbU9)nX/gZp_0jI %hRP:]AaA43OlIhYlIIhoCIM;D[[^D+Y6E_u3i>+.gc?L!IP-[#[TmH5qo3KnX7YX]45\BAo8?hu4-N`%cT.$qf)cX\nO?7f5As(>MdI*UnJ-Fhg(D(&V/$J%0eh_rH-F\44,8Y<2I4[YJUm]bGdl %=.]C5mgf"gSXV=Q1_.cVX17'W2ge-F9)]Mo@/9/1>"do.8=^bb41+VSfYtV9hsiY&p."2S8_\X8I-:Nbg2WtC[<]FBp,BHcC2EK; %BM0D9I]e"lF=/kaUuhB8Y&E'plET8"^jGfse+;DN@bN.*4j`6K\?*\T80i74780rS0o]%:*CF\Ya$p-S`>fb:PG?$5k_pbtAOT8gV[IV]Km31B;=Do\rQ9nV-3HWW5!WCBD1H&j/mE_Aok0n %>nc"'?>nfEbdU\hP3Xd'Y#[!1h`[1I(l^.46X/V#gK)<]fAALRpF/3,c!4go$r\3np6OjMf=g6ZRX@lj^6Q)Cc#,M]EdcMOng^n$ %[4:mUa68qToV`-\(:nHm%I5J,kB5063P5!6rIeJ_kM^V@;P'Yq1sDZ\G8RBJEj#B(>nZh:$f_fPZ::m>O&9-XpuF:_#MU-h%qcK( %!uF2l(mJTXROq:j;<`W)dbNZuD8nd'lD3U03hFM4PPLr=#26+8o.&\i_u=;;b5Kj2V)VVhA&gV(jJt!l%b]4IeFRifd_b!<-s"He]E"')D,7n'i^@?e9)rXe\fu %E5C%e@^"2gh%=u!q2bJP2@-rM97k7&DMBkFnWQk-9'6P21\^4mHTj%ZccLe2XFg1FZ]Q.ab&(=.HWYk0S7haA5KES^Q@hkFC$2a" %ERF>rb0i8YP>\YQ-c;WV;!Z!oD0IHsgQikH6T:`df[!it4-:PPQ0re5'$Wr.C[CHE67kW%"5!3=/^9`m`md2+dBcmYmN8W!%?Or[ %5r1oQP+D\DoS_PcHaHB6?e_IhBIEYTer$Z&T,sT\CnO0^O(]R %52L+IiTm!#]=[h3%hH-.]A%P%5Mb/nk0s:Hqn&=NoeLa_H[j'f?ZJfIh;#`VIt%.f_m^/#s)E*!Y2T7rWUb7:q&S;UDXR;N4*0_Y %^\+2!^ZTD#br,7pRRaC7h)t58:OMPn\b=-Pqnu5)ba3e@90\2)h9BS^mJGZ,^:Sa+Gn1@s]=W=nj*gOhe(sTtp>Y,g4#DrQr:0Br %_qh5[mr+h<"MXob%G^L4p@8)'+(1>)a^b[b]t\jeo_fPMHprbnFt5%5ns5Q0^6k3bIj4ktLZ5@J]j^UnoE)uO"! %5!6[B/t;CeB:.tr%o8f=m_8W6hXO.l4ZqMLO$3O+mM)L6]@9tIn45egtU_[obCqM+=3GN!WBnGW=#hr=e. %KBC5P?i=?h52YpimQNj";+kW$pib+JWm9FJHOh-_jT//kq&Z.!oH"eSc#qZOJ%Y`)k8Qs1i6kDNHM[OOQAE0+QmK="IrBRCm!Ri: %4>ah6c[TYqlS&3*^Z:]*=8^oUo6^K%4jMQtO7tTqDOuXp\*oo.]g(EEA[h,A6h$E(*URbDo_J$hgZQm)*c=2l %JpmFdGk^BjGIMO`qq[9+]^>ask'%n3J%5BpeSjA=2L6%)g-*/s6=5sa>^^*&6=TDF5MSY6hF(GN4o'=%038L&:oh7_]RTejAC\P7qp2mpn*[?YVSJ*3?laagoa`/Dq"4(#%K@404a4U$ %nb`U2pFDUN[#quXI#m.nhgG+d)8>t1kGQY`s75^7-he-.107hV;>g7[b=D?f:KQ$:kDt,(qVBWL_p>LF$fih@"i#HaA?S2l%(LJo %r_V!2F`22LO:_)uJ![3"o=]Y!g:[_5\:;#:^'f)1>Q=TYSR9.,U!0o"rlS<6\`9T7jt?XU(;m#GAXMI5Up\2!e<< %s/mFbY&(iLp?DC*R9KH/p\=3$%o;)P@J$/lD7o`&\'Ns8-(m/HeUcOXi^ %Wk4]@c1h6sRhmL10?EZK9<E,6urg$9U!X5Mc2[b1r9AVS2HbLQsr %2#K.'`<;A[_A)Ys>qJcW"oX-(KrLW`m5Vr;NT2_d@gD=u)/JGG3>TM]fXYE3[P1@D@2t#qLNUuSbtnr$;"XX6#?&jUTA\rY[%W8_ %dmAt-BNa")h&b916Ye&_2>TK0d"g1mH6DdaW#(ltsS@/98i;tMHMTrkSRJ]$k1_CuHRR(.`P(g>^" %'lC@QhF#uD-JZH`i3jV68d:Y">kP4OC[kE@`0GIBm@ilS12!!&$!0)[1%Z$S)^i=Ql%_o?+d>e1>T0h3AmD"5?uY(`N`K"Q];pW4 %@(d:89,,>dapuuPXD-;mY_e7"3`S!aPkt%33d31q4<$FoUgVnZlAZ#LAooR0!RWlB[P\1T+6>.]KUkXcUpEaOjt(&LoRsOqdQ&NA">VmQ5ja=.C8cY`1pBA0+F!u>M@C-4/J,e4)[ddI %'bJGU(=+*r@nX/+B-a+0SXbUc,0k3Ei^m84&P+L,0jq^]Gm?Gf[_bs1oGe&+'ZsLmq;OMXTaXCd4,)>rAMok.@!4n? %%UqJdk>8mF>"G-40>l$:cErXf>mGhC_<9cY;V2UBCkO&X;66:tOV-+dlA5'E.HE$Z''\JQ[$&QsV5FAb@R3["NeA]>n2YrY=,qAU %eq(6R<'NLC6m"QAtcG1>D4Oh[&]JXV=`=TN(<2T-",G$l[K5sZO2K;0d-TYY-9(&":J(1ElX\'r*Wl&R3a %fLVJ1KTUA2PLN1LE0>Z:bD;9kN^MJkUr9q[ISr2K;+S-9QHEJ_Nu9oOr>fmKI*U\YnA<.9l_oJn)Z<(K1f8U'(ojJIP&Cdkhms-hM999jJ\V6WCe*/PKe&5gBg\]i,Cm\K46H2,LD@LWZ&/I492ZR6ooLCTuM_kPFE %_Ti@=*>Nj3&:4-$0.qURF(P?sR(J8:7*BVZaYrO?qD'AR\:h6/`)Xp['%^[_$?;VnZL7KeELst3i^g.t=a.4?kHL]`Z/'an>O.l( %6=M/WN6]btlseec\9Cp[/'XA#K`&)W[GM)H1IKiIF:)daQJ8Xa/^sfhCZolCTJ(PSm=A&"IVC;ped+@3hn`?J:#?LBYBHb;'5nE5 %c,@(cYh3np&$VUeUMGF&f>QX5BQo2_1,$?gP(I]"ofsa`RP\tm<"=YYKS+?,.u@u_a7k:kZag>gVXoqU40Q057n6mep0d!#"ZrOmeLrC92Pg,=JJts7^5]_h'GPW3"IHoiqF;Ng,Q)4At_E=;`qq(^OL7KX'([2e?l2@;`1NJQZ7$ %j;KpXH!FF)=)Af1-*(g@%'pNFIA0m67L(TiHId9oRYAjs'jtP88EgC;1+Kt7S60L<'PTZSM^pFk#E2bXC2Y\\D'_IL0-f_n2hJLm %l7?m9imleB`FS\r$u7^tnTlA_`1EjY$J2sQ?PW>KM/8a6^@;+(,2Oi8$S#+nr3]i]#KR:r9.J.,M9!rdjXkqW[+6hN09[2'7gc!T %7D/!.HJ=7;M/lk:*`T8gE0#F)<=J"q6M@^D_4k#7HB:/d63=Q3spt$A(JJ93g!C;Ep4^%'MG>UBoH1fa\lkF%+efr %<>:m$?H'3i,X89dg63MQibQFMDdmOFF;?FJ^.ERI8pHY)0M6u-?ehtWHH'I-m$F0$[7d8N4\GT]H\8\Sd2/,Hj,UXmA_"Gll:>m; %8ZJ[jSlk'0":hmbEU:WpA>G6>d'<71a$BP:>:JKp-$GjjPVjLo9`E2J[suMHQ[TM%)OJ/T%PW9.>f6^sbIY6q:&^;;>_Y1CE2CF4 %l2SThPC<"c37u()ORfVq[rUk2mG`0I'fn^`dbHFsm!l(D9)ifSbEZ87Upu@O*7$n*`7T$9R\)HcgULq@m>uM=@+t9``H&DgKbdG/ %1jfp2pfQ4Fh3:6eaE;bVQ4%VZG/F.oVM&T\5lF""eOI*i"3reTN2%U"<\V^A^@>)/ZHJ\uG@HH?^kV2r7V)%`@fNDZ&G4fC!jp-D %d,HimAEZr\BG\e;@Mrmm?)/-\Lq8#>4_-oST9rD^Y(N+/]f:TYl3ug26"!`e&^R\IfEh-\@ipPiHFjd7K3pG-*"2X=M!nG;"&Y1= %Tk5OZ(bn)jQ_)3/n:"pf)Pr9[C9'TDlt;'J7Tt5+q1u^n7Z6[!/Ic8]_qEM#%V!0[%MoLs$`Et>1u]f9J!D^>,R(Gg*u-Qp;&Q?L %8?"n-aF2&T3n;-p%'_Bk7\H3`fi^d2a+?gV1Lm/SU*CnXj3.Mf+GG@RK=1:hV*J6X1N&Jf*iC'gslhf>!0K'=LB]jeLd:,!([89!e^nfDc]Tanp-6bGRn\SJBA@/`J#?;_*;!k:Y"!*EaBKjYOslaF^>2Zs;_cR>j&jU,0I";fojcPF=6 %Jh[]H1R#*2pi!aNWNP3Ukecr:\;-]mOG+EZ+1?knCP:)E#fiO0,k9sUg["^ICqA%Wo&;.'"Wf9-$a5)P;(hMBlW6mn#3iC#0,!h% %2MYM`;f`/5J%deIqqN.LC")ES^"$USn&51jqtKPtIpd(`qZ`WgX7J6sPTc_?.Re+jOqOphKWOsTd7&h#OBPY%n=j73auHY]12GW*Z&&R`7#Vba8Y*(V`#gQOP+D,6/r;/HV?grM_*"_[*aSdg]_jh8/ %4nY[pjHhTa(WMJ[*ThI*D.##:jDgR)$2b6R2]29q_h$>OQWQ6(I;%itXZA4EA41Pf8>^$f:u/-fHC?jQK[ZSLM,d27Z'80:,LIJk;&sr$;-%D<0m\bS[]$Jm%oQ%2hKs/V\%U5bmLQQL3mpBn;T.EDKS].D+[Z,#'.ICaHO_6Q %$4nUL*-XUVZ:!_AHoOWHYgPn#*@13mR8&C:22>E"VCIP2:o*6+V=01X\6so=kLg65M=hfSrg@)d5KjrWY#bG/Y+gnFcQ)m^&Q2d)mrZTiiY@8@:RU&gT>'5 %-mX0bGsRoplc<,'<[sn2lM8RT$+n9tdX/_!I-.e,92fF$W_>C*Z\j=Wc/djVP;De-A1JA]b97Vt,oUrN8B$%7L>\%*V'DQ?7ZD]c6)"aD#l3DorO"'G'&uZ4f1nL6c[NEKoNh8]u>H>qA!j#huS'ibLPH>Z+ASd]N:L2WRM:d/mD,93gUm %hCl"n?lTMGI6\u"8Q?srQ7R+O>qom^"m=^]dNYr>+Hb %s!Q=WV+=SuP:ELFBdgo5Nl($t`RQ>THa2?)5d%GtN1I8&Zpto[H#HIIdDW6@s6P_Ss3LQ!q*2OLeWTgaO[rJt9eksjS;_-+rNJ)B!en$IPt&`@s98p(l:C<[P!]0 %7;<<+Cat[J&2JRR@e+QWm,K:A&!_,UF%P`/G`8p)Tf>5of<`!"H`j.6T$E&Z*]riN]FbWan?1$OKfEL/auGQQSop0f_>tFpj`r7\ %)j?*re7)":Fdqcnd[B)@*p:EKD3/1sW6XK=&5BKAj5KTa28VLm/j,(HOUiOJf-'`':%%+Cck4jg=U?H'CUZg'%nP.EF>1dX[^P5e %W4_J?H?'60O.+U,,=cWeagm$R3Xm%BQ1FJs\UY(V5NblAlM9lHmAHlFX5+;1E3MfMiG`Z+E!>3qVOb2I4k0QVWdkf"dt&Y.gF_cR %*Lp;(CM-u$IPjnbQN_G,*HP#:(3U:DXiqL.[dg99i*BGgp=-!2\T!F>KEIbj]'tJ'\01u5KM[spMJ!d=4OO!RL/LApp-+"8'&d;Y %[W^[U(((X0G#>'PBQ4Yi&h"hG'Ja+f-8Ha_,ue1jTnCG.=VOA@dtsm7P82KiU"BGF)h=,cWX3Fo69Fm[r7!E95YYW!R*p)Jh?_B" %T/\hf7?5HMb&JoUKl^Ql;Bpk:'.6"S8u?.M*&1tdDkdH4oU^044u@tM=I;OJ8I\AAi2"Kj8KE5@$;YO^h'teL;2#d77I6S$GJV"U>^\bnQ %No$=D?&`=^W9.hf"a.c$5 %)RZ(9?s'mR*Ri+IXc-JhD&om!XiF_W+H+5TY0.PM#HVk3Fi-Q"`a&dWY\nl1CMMJrTFjJn&W3X!"I2hm'cs&VYIH/`L1*d1%RH2Y]#K(XVVImi3i\)[dihlUL6j56oi*BlU:_g+sfUqC'LGJ#[dpqc_tdg/8]UVCE;]-NK;F) %B*3iA/l3K%0TP;:M*FGENQX'Nb2+Xb=Y3T)7WKb1W\`9/-IbNe(Gs]uG5jf4%IX1PC]lOKW#H>W33Wba'(7(RZ4cjCn"_!$Yt]tG4M+t2P0NGS5DuuQ,D0k6f!X2)0JN%Z"hcn(m>?[+']h]5]K,>Zr %`Zg3X\F@dhaLrE@g`hG&Wa72jS)0q'9qo:g"&QKP*DY^k_E.2n++,'\\nmWDe0%n6U_)aM#Fcpb"uH076#d,9@Ad&)dl3 %>I4/iGUZMN[8\6\&]%11\%MjFjq'@-$_:V(eQW+2$%dmjQ7ie+@NX_YL.89'':"V_BRJrUnV*(G1ak-0ong-'H$*Jon4SK3e@R`k %qP>?u$e8Uar(GRiBrIh@!1d0lVLV$J^gn?=RC^=-BSc8"PGo776RUc5_gbb!iQIs/h$HVO_2[E2N;?Oi6a?Cg1A$nQ:01#3+3(M[ %E2p`8$*]Q+)M3tKr*)0"DsYX)pb;7lEKmED7tIDujK?3PEHp['$-t-4]=mZ_pu!-)KAYPB5Q:3;00aOW0;taH(Ba+eUfP:@=E@u? %=pK\bc2R/ujE2$th/X,Cc-4pLt]n>.;=fK=hV++tsPmCKp,jtt.-G;!f!e%lL&1KkU!0mOViVo8> %B)tl>IUZEgBJ8!LYE+&\Mgd5L+^<)?.C#YbMD?^.dMt"2_R_PP:7NZ2m;7e\m,K(uS+JIq8^HC,+6p.7AVqS)<2^'_'M'1SQ$JFY]N7op#3Mj"[E$pW`F>%;+jAPU'TWdjL56Enn,*%3krP`LN!(%X70Ms %RTCn-/$r.hs6.*0W@O!Z83O8rc:>R$\/1-Q=b;OH[4YXa)O\87=qfJ(Lkd@/*<0GA8UJt0%`_,2`);[BFadF09b%_7'c %5ReOkONGJ_pBf2<^uEut$<=#*o^!]tgJrs%Om\Kg[TYf:TE %7=Paofac<3)U>N-cE7I`5UlE5,sB2$!^1aq@qt$`BUUUX(g.qVVQC\>CN!gU..P9JE&f3sRZ8L"M=ptt:(Ek7m"@`=Ur\oD*B(;J %#]./mT2-7e>PMa&Es3470S7)2Bbt@fFj>cRe:'(*Z_KASTQ=GT\,%3,4eV9HD[;(^6&bYdE0gVWXG'`ep%V-t%5d7%?S&WZM\6]F %"%:_^=jWQRb]_S`V-]C$Xgn&-hJaB%WUkfhbS5S>f_F4-`1*nfV4X6HGhDFV31tN;I&fp<&o3#D60Ma%Yk0 %J6(i![9AE`IRVmo#*(a'Wb\hT[i+O8F5X%hO>@bLE]Hm>K[r[p-77L[d8H.(^na5u#a09RFTrf.G@]DQT4B^=UNq7I*Kng78\,9W %rl@WGG3"QDP-Gtj$i;)C@VKV:Z3!USij>Y]!XZqu%LjFU&#:5GW'FQ)jf&nN"VM1g'hg$C9JDT*&eP_3KB,<"lO+gJDo1Y+YSh5+ %]dqqdnhQ5HV);jB,jXD:[3CX5LP%*$[iS:4e9#?,#$D>]8haA90"VV[8siXqLim`Sb/*7cS8(qNMh52h,&S;C/Rj<5(i;b;U.I-k4E93bAI5ADQj3Q:Ynf);)>q'Kl\=gP>o.0Y?XO)6`] %hQqT1AhZPH\X5L67Y]Vdm,+jo,Ycl!(4#9)AW/H88EC&7R_cim]\(pQg_0<6.^cqk`bc["G(iBM((cdoJ6<`C>C<6("XNi9CUm3[ %P8P8)`Eu^1FgfGfQ_*4Np%@/$a3V4*=22Fqs"bJ)6Ph86D5Ml[)FV_cadT]/SWaaB=n1Atnc4oGQTUq1qM@?LX?<[q:$^SGZo43Rh %@fiC]"#[(9e=%EMX9[H[_9'(ic?"^BA-Ual861DkYdL_lM$4leJoN5s,>lRf5/Bo/5kQTL %N$XS3!m]AfK+i3UDN&Q4%57eb*)de9$[6R*FE$/O7q+UN/=a3Ok97B*@bh;3 %'&JYmJ8,4'#j6F7h+#:hj'_`)Epg'Y4jhTXQQ7Afk_2j+CQ*jL"s^iUJoHKq5eR:t=:%=b81$>B%tqT>5.158_1EY>/ro*iI*ZZ6 %GqRTpLdKoF+6jmKh,t7c3!kn4*/(4TSM0J4FtpLae[[7U_MqXM!GtERB9XI?kV]Z$QU\`D/NG4mjCq92IihqR<^#m9N!Um)U9IZf %YqS6=LHn[>%C8@+a@(*Y5)@%\KFq/HM#1K@$EF8+gt3#+*:pQ^/\$j%h`30c/F>o2IiLD]rNRWUORIg[j\q'd46 %fSG`Yqd9e&!CntPlPP1^=BGt@4<\)@kOZ1ZI'Xe,h?b1_0b3usS5ml(^c;lAH!ocbeQ8dF]WXK"I4>`i5oS8L\Oi'c9D*#ONHXJT %0g>/]:,h'-DkS01;ZsP!E%#Vg+qS3P:A0o&W^p9S.Y^'mC*)Ro:7%KkK^dXfZ8U[gZ+ppX8E83kEP[!`l,m2Ca!L6d.^N]W'"4_Adt7r666BJu-P %DTA>`p.UAq`s6`J7]Va,Mj$hY['`QXn6Tr!a]WuGb7$R-Nm#,[i03_:6fD?do#\]$]FL<'BTRQ]0Um%.\CUbf#tKu%a]XfjC8.q$ %X(MP0k^Zd:\ihsE#LTBeQ&,2.Rn"*CK(k7'3.9*39gP.YI7B-^Ir9JmUAI_PiH*$Y`DlOY_B(fFZ[Gb5h)UHSe&#eGa %8Qa@Rj0-K/lrs;MJXSV1I1i-H!%3T*[._XNH,pW$4n@q9,]l4bWp."5Q!,LsWW<]io7=^G=hFOukN`!#]$eLi" %NgVG?N/OrN330".%L(CE"\kOgeAq4`0bjoJRGN:pg4eNge]'==Bi#Zd:`X2'"U9\n=0/ukKs6*6CQr*2#4/kN*U!=K)Vc'-KeMCc %[4?C3"C.d@\-R(sYHXO,UkH!fQoS3b"=9#S_$"FHP#,GQJL$.Fgb6Xs2-JJK_Q)aMIl/f/ZJWschn=mPR#AND[mpB4)]dF+];Y'@ %?"/pIk"5Wl<2g]M[E"e[ZEP]pVoW!jl3%rM%=/tZ]1^M[dr\"_I7]86n(GrXZ'e*L$+i/$g%@_jU+IAsG;E_?%Da$=^^gJUK+n1= %@'s.k!tk[W*D9m6QR0r#]'OamD&5PIS">t70'>89&t2_-?)H6%B/B>q0)048nX^clIOl[kTsAl2':$HVNI`12+[].`NIu*\(;Rr1 %Si[UY(HXRS2VnXhq&IbD:-O8.G+rbUC7A8s9lD'L47$("9-4$4nRDmmX1GQi"IYAq#C!s%F$N78Ebe4boOA4$$0LV!ZO)ce>\XpI %'.@.jGY/::P(>\(R(*+6P"L'f(LA<`LP/PL_<1hhVn=.Uq;KcIV!+p%^QjdeR`BBThH*Sd,^-+"O\53^-0n&o/p-;4:Y2p@g,+h- %h8Z(.F*3iE\aJ?9p\3H'Ij4YMadaZf0W>U?V4T)(mR;#-,pdRh`eb;K<223BRLo1%e[*FGo4-'#;rcH\W&`ush5k(j>BRC:P`u#q %/sH5)7I"Npe3Eh@THV4HaW%KB!tpdW2&SQ)5`h8KJ2$IQ.2f$/j+Ls+Nm-Z1j%O"9&nNV]WM!lb %O'HoXR,\T4Zs2ghnbcj%e18O4TOQ$F,WWD;1$\2n3',33ZG!>t"b %f!C$47ui*=*@_Fs+`PDjC>OEkK5K %G6rNl`2j8@QR4!f%c0+5figQqS&qc(c9Z!eBM@'8%liOq;Y>?4YnrQRg:E_W@)dU)%Git#eP0%U]F@3@4,Uu0^-IZ4?BstaW %[P0W;G_/9.nd/QeN'h$f>L$EHgg`p5W?t+g8>oWjtcI27@1) %Gl4b9rpGs0s/dU#Q3:FfE@^jRSU>-#O)3otXqe@3#M-lb6Qp&=O&-q!kb;!43_.Ft)GX5V?/A26N)$,hj^9)@l>.^.lf9j7bejAH %4:Y"-fijaXXFqa-QE]n<+VcA]>aS16_@MQ3)dfI2fnSL>_)tnG8Y+irOEVVa\.)Q\JLPU\0R6]o1oi'@OtnAZbN<"$R8u2sW_'Uu %8cM,AChKJQHfr:W6`@)4AV=IEJEIcrf580:fmE_97A7%k/5OmnKpf[Q!je*ZqJf@j\\`a@EW:kQ%uR1o7H?m7S"N+69/2n2SP:`m %IDkR(b3lgY9-j:h`5./6jo)hj\kShJ/TFA?F2+)>4.CCW=6@s,l!0^upA>fPc<,5o:NIl)\s"Zc8g9UbI(n4j=q[>ueD>#0BHMN^ %N,-fr)fo+MHVYk9moYg68p):"eZ9`@+tOO')M8s:54Msjmp!-YLM1*iag.!;D@G`?]Hld<[(4%[+%Q8m<]rX44s,p=L\5W4V3G![ %&+op:/INYbUc.Dl&6\m^]rt]"?";/[q,X-5FK*HR,HI;6(A=a^N9kJIB[DSFX7VfPpJJ@sS$>r9`oJ`m]q%fRoBAq9l#Pma%^ %D$L%&1MH8rHH@cSiS<&r3CK_(&&o4o=_r\jj9rQ1Q\8B!Fl0[9WAaaGnS'[RVg41X/?Ebpc@XaJlU0sOnVdf.8uh#:cP(?2%Og+E8T;-E&/\\",2d\_6kg:I %"[tsIKEd/6HED/g9!ncgmS),\Q6?rThtSt0QHc\o9%LBjYg3b/FtsZ5o"p[`ZB^]UJnM?2bdF10$;i96WK2&f`(N&al.0Ca(11@Q %R&S-r9U7JXfq%=p)i`l1HTcMs\083Y;_:Ka:KAXq]^3tVPB1h=AWj@h?FZcUND<[??#j0>p/R12g+S4:39_>Oh7]s@k<4!$Zi!.+ %:0=;MQmIEq/>-k^g.Zk/X*4kSPNH\;I!q&oi:CVM%)R)p2LZB4,fUI:SGVMDkTq<,?r09;C;BY\!ZBt)C)9p` %/=]6Ol!JH@!'q9n/c`]o5huEL7fZN4&BqNX"/psO;PsMuWF^`%Z+ %q0>R9f_'EbaH)cg/gQR[I@Ll8F(]NbKoBZ>hshjhW1fbhMdV20]TB@k4[#;!_!HFW&SWgbK/%]3d#3p:2'*2Q5%e>u=D\e!VG!T0 %NY1$SUe9<:`"=6'1$N@CpJTI;7HB(,aPN,A5X:Qe!"j51LgG#PPOZ-sA9=%`'UL4(X[;W0=u2qs'Y.&Z`'ul8C_ %WJtId2S]&d)[[VZGDCGIJMpPU7ZmgQYD,5 %%'2N-_1,^,Z3]GOP5`?GkiEKT/Fi58DM``[KJj.lbMlS;LuUSTk$$CKQ1!iEm9CsB_.qPC,oM5r4\l.8dOXhr"o %N7!uECc0Ep"PVR+>8qCj#e+(DgocFf/i/pjX?^Yd/^T=3PLietEB8WDaS6e6Vsr2*>n;se:<*j;jQLU*l'$bQcJa%%Z$iFXjF]>NUQ`k^Gg^np++C#>LJ&-* %.,jNQUS$^>Dmd*__*+i(3eiu)btd2ZcETGO.;Li@Mp$VA$?Ol]cRpXp]TuBP,9ot==F'P=_Z(<[.S?bY-O1Ap-RW= %O>2PH"M$sahN5=lVX5:LDB(Rl.*.mn]Eu[6DOt.bI+*qo<_YMaK_76M43a/.]f"QuC$M4M4NH2b9_KHu*C:?1pQ>8p$pO:.]?LSb %dbm*WGFc4r)<1Q&*>Pi.>l6)@8\XU %b%:Zm:hW+$':j+]cGuhfJ4ACb5ebBS;u";+;pT`CMM6BmeI&Vt.Dq6Z;Tm(i).(."$S^&T%%CfCEd@-%b]btBc(iAb_!Ip.dBBg4 %.TK8I\ElX`RknL"$^DEc$%Y.;7lS38PeGDQFGEOG+iif4EiSp\M(Z&VDg"$gl59I_/j?Vug#?]4<&#PfdrBgoakoSPgGTB"NY%OeJ6.d"3'[n-Y-`Y4p'^V'[@MA[d9`073.!6X@&'f %o`sZ"6uB*#3;+h^^8eN[a@LV@3(BE&7?S354@RP:P<(GSP0;rkH:bCgpKDh!H>pG_R>j2o]+`6!e@@5Umjl@J[Egi.7;dQ,nad\5 %$X_3,0=L%4`]WlMYZAEh_(U!!3sCmJ`*;'NZ0AA=+ojun`4#5XQCg5F/t^,Y1FVlIe5>0^osKLM?pW'fkH0>bq.bn9=//"5bRbkp %Z"[\%)Xo!/N[6N;k)69:M;JZU(95ZH87el`[s4/h0=&loAOV[pH(1p_G$2#P3_Fm;;rFqkRu`@Wb837TF/L9@E,0,kP_:jc"B2h. %(`>LJ(H7.m.CLb'Bp*hO-`J\3?H_7s',/<1SID(sZFM[[@6c/#(#RF`%p=!I@Xam;^FA[!12>=u:g0LRNR+Nr)N!-0B2.l\02/js %4EY,f\C+Vm=K8F)\F03j]Ll(ejXuW7>U(R8.kka>EBU[nV$lmI2)X+si.FH2Z#afGJ5aV86KllehFrpimjP%XlbKha]c[iFT/BqZ_CE%.n]IjR^R>hb)9SE'jgf!a[0rD3F(N3-AUWq*UCrL$0q(k.;7Da^=]#^AlH-S6.deP]p;p`iPu*B$q6L61RXI8Q^_RQ;B3NKVMjRgXR2ociSTNG*@nMT6$XYoCpteH0:*6Pb^-iXAK2oH0-/lsXAWh_DIH1.So0Z2Z02$/+XVSoj'\kOQ!N*ec@G"Z\\k/? %,t_7BE".hC5r+t#_7`JR)cORl*QZsUL2S@(a0+p0b;>bZI4f-#%b$aX]PWs6B#Uh%X'l[n=r7"bY#-1.[k@6R?,RZq`Si5tfL]L` %=qdfS,P>8X/.o!dEe;o[kQlOPU,FLh`6p,D>SkI.@=_e=G6%u.1I.Js]J-H1^pY;)gS;P2"GMYg,ANs;7-OuPOqSQBrDFk:m\AAb %TcZT_p>g_-*G:a0F?4(UGoTK`b!UU^mF5'hPF6e+)PC=[3>:afB^<3uLNt[oaZ-#$Pj1Ub#*ChWp/^-VKg1D$s$jZpR4"W`F@rC1 %/NiFM4iFkb(;@`t^/]Eol_igFG-Pu=g"p=V^1F3(Li)/2dLV9Y_cdof'_6IhPqH9]0gn`@>i[[!>pkZJ0H@l2E4c&L=G8UHL"MSW %$UsX!Og(HYKs0K`HB:Bsk%]4jIQhQA0"7oD\lXr0c"&oIBK*)2_jj0*h+LE2ZIjL_e"&Id %WNW:5't/W9l4rCY:0e&[,TqhDW/puk&mU1Va:EF>Ofq*h`AsLCX;q!q.^Pp*l"P%VMd'#E*,Q"HV=m+=Y7c_0k<]$?sAHI\<8\!/3IF6)uS/lRn5%&XUUlAcip8qI;:#SID/J1;+#GD,[B3'ZVJ %=2LJDMbPo??."0FBmeg(Xu&M\mR9M#YlbG\Sm8`A7XI;(LIr^B,K2X(DbAJj*DFbnojnU[D:ZP!r>@bL*)$\hB57a5C)RRdmoBPX %@?e.+:!P7 %R4,@,.9IRI_a,?ILVe4)$X4g8o;ER,LXo2bbj)j-I,`E9*TWPae$3\9E/Z0S/XO<.MUAku=Bc0//ISoH#\T&l8NHB='1IrUd^U"= %Fn0d['-2j4YC,(2WiKO=3hOArEPt0FF*?29ACjkd>mHGXWq``\`HQG/i`/6M"mE@iZTS<%"uJ)np<$L@#4L*)#':Z4^6[h(>gf$@ %)p#=N30.AMPe^W0qiqDPcsIfq=Zicl+nO]NLYqE^ijC:aobK/1A6(YX_K<@n;c;CbQQ>RP=u^)`E7)6ieZu^FQR!m->:7CX5Ar`aOM6h,3%umG5*"P_(O21'u9n!j8,']'*,#U5,7tk#" %E(PI@es4?.s,ou66Te`1<..E!-:ANCI.40Q&C>G4QnNZ,!b:\ %a2g:?,!Gg]$kZ="obL,oW,2sN@P2t;AsNO)2MSe%WB_/lfm8Ln4sH,ALl4A`XFEdd42guMeD_=>DB\?`il*8;#qb_;(ouL1QYQ(%*ggi-D)Ir$FTJS2 %GW'l_7^iB^N?NV''k#!\?+r+DdA>fZ"%PIuk.NpXaWFWKh[*Z?/G/_DYk5sYb=^+Oc7VR<1E-0Ylu&o5g27rMW0D2Z/G %n[C+L[`..4ptHSaqq^84d4@.)./F$hkAZ!]>+]a#IY"XFRmaD/@eeD^W/F;*lu[!:ljBmtAgYb_8?CcNVU/!C9&t9J*5Hek='n/! %h&9\`JI:!l5r.h=eR:-s029gE!0%nPO,'rc*co,a3+hCNYAaXBLUY0>^O]*]c`p(3t>.4%8.8OJYJ>RjiF%a)"ZnusX2Q1K'M/M`(ZUO*F`]!\3Cf.`n& %$bCZo'=uGLj\AL1FTRRf>M.^3".M6Q-.XrYXg)eDQaMb7/E:Oc:TWU5hcD'4(VBUJ48l>Yr$GabmYKMX(Hee.DrU$IN7agjLD;gK %i/#'mXe_XgL.E0,M\e[h:r,IE$BZXI%&&d;Z"]E(JgFPHYCX_3NK(0Gcu.HV:4Ym9PW#ATg%VdlPOfBFC]PM%__Yk55YL$#sd<0Q(bJPt;O`HTae)9lbO4le`YHKRl9!_mrA(L/>%)]IXi\0qd(c>--@m_YVTiN,pj %'1.rj@6=+QTV?C_jO?N40FZ0gS>%Sdpk+f!96\Gl@6SqeMKFUn!&$EsIq892>kbgnMH4t^PMN5;HJIF[F'E.FRM1I>=$(ChW_+>k %OD<%M-e\EJEH]-Z:M='")N]()1,eF=6LE%H$GbDcbX*YWU27QdL$VT,)Tc&4k>rLIJ;^CO00BmOkM.nOZcpF5N4 %!nD+dWOlW'F]Susn$Z!`\oFg:C3QH6;Q7PXcQ3+Bf3bmPhcQ[fsP$pVV< %FDqYPgJ_I;^Jf8\21;lWnjSgGf.A*FGfr?78l@rBrOFQ-0e:0%>Zehc31VVI:.7E054jS+T&QKT"VpVX7=A&>\W-Nh3Y!W7d,oN! %%2NqY5[20\-2b_n8;kYrPUdd_Kcm=1dEaoRgPMYZ$L]hd51mY:nqK-IW/O%>n7g'mA;l"to2%('-6)[bO?q-)\b`JemQ<*$snFX\`[ilH5L(Kg4PV&S=/Sp^b1\D?9I8.cE#,i4WPa*Jd %q>o59"K3uq6`VTLX;R%_P!$!q3\b6pQ_L3r,U]WU3EL?V5ej.*K"QLPks62:^(f\l5c;I/=OTlII7M_rc#aZLF:\k\h^%c"PG`=0 %,^scuN>GlK/+N3a9(1`Z^3m!rB8ui/7o7Hm^FflrV>j-H)?4k,FE/sX1ST1&f-!0kW@Q&S#`jI[0cY=:1>l?2"b\HeeqVsJAOmkO6.e"W&]\*ZKgD.<2%?m^fYZa'5^/B7Lsq&k1>79p,HSVAe'R*S_GrE!\Rt/m`_I^J^N2fM.o3SU %43t@8F\>`:iBmAZr9Er0Qa4%=:F"?h`9MC>"971ht9JnmKr?LWGWYNaT!U/?M4HNKdL %jf&sWs/\Ur;mB%)CKSK`qPf5HgTpp(NUnXPfdgO:Cj[+qdYG]>V:+C[=p:)K?nbP.15sHOD2?f]-e+q/5T:oI"\'\G*?neqG49*> %L:Jmi&`KZ4[AcP4Rn6sDdVK;NJXN#WFD-o\_F]@D_6>'m)H(ZQG)*?P7,;3"d7Pq+k9(0UZL!Bc2V^"?KFMlK#'K,S+44 %g^)Y9#`CY#``Emp.uIc#]lkTH+nO7m_c@G3-JDeg:Y+M:ndu-fmsrfc1nBI]#XM"XVfT6P0'EbPg\<$d]3%5V@dHZ8KDB;r"K*:= %MkUeEj0p6_FHKUV]G`'H@$lauDEQP4%(d7AXM@gb-P^kRmhisrZrbYKKud'aRW^2DUYT_>XXI3JCYGmsR"(Q!9pQ&C/#?N#R?s+N %r`g=Ab.(?*ZoauN[S5A[>q'i"S3[_-Q`MZ]eK:]2M@>]5C8DagSlN.3*9f@Ye-=2gd:X2@2@^rHe6-G4Uhu&BA@GC^"pQGPc]W>" %ZT?CmIh0m=Ja62%Sn8SRBJV=H5G,qA&WBY-pJH\f@H^ntV][Z#MOu#_5NM_%]I1q]_%Jk,Jp2:8]lORn!O3kGUlXh%i37a*%P`J8 %hd!Fh9i?b5GU977+0QX9l9RZ-P"J842K1cdbsjh'g9H71i]A(dS*Vh.:rG=Z:;nr"+b;OV+91e2&nhb=A0/D1DE(V6C[3`j@jJ?TG]kq/V[:ATWJPu25@]k-p23N7ES-0RTnpF@f %>a*n2Krd@u]a@-V2^WQ.jdC/e;JTPNS;I-6N5f%D@_m[U\F'R!h4P$P2-B;kF*a=ckSh+76rfFPctq8eXj1q29b]I!9$WX*X4A88 %cS^=rIJpSFfr8u$,Ykf\/>FB*0iDrm$Z3+1O:7;71M>,+,[-YsEs?o:!)64Bm#5"[N,"TgQ!0m931%4t^XRRs"s;=PAZEdG@iS3q %X!o&NcD1)4hWIkO:=U,hG47?JCr!NeM] %@n/ndghIt`Ta)SdDRD&D[jfcmesWBpI[V*JP+bGS1ei?U8ZoCm=&mMFkZ2\u#M#h(=+b6&Q)g*m33eq&>eoef%5(7d=HNlW:M6W+ %<]3gn6,+c5f6KGX$uMo9^ENAr$#>lM&p$]!Z,?taJF0oNgeL4h9*91CGK(seM`0#;V6"7.pGh$#GOsE!gT/t'1gX->CW3E*FgP[$ %F_M4bM`]^FPqoHXkDuFH1*7p4QOE!1M4'K`_o:#a(IP^t/+7G*^7$7H8pHU:^/B[J\`H>$Zh?`b7'#ATo2"`P@pOW7 %$-9^[nV]L^cqW6(_8POBO'?0n6OQ]KISXGg1Llg9 %UFj!g_TQ0XaR):Sfc1m.dD*(H,Tqf.Ns50`81>M>5Mq(JK?RnT@P1IB4[1k\=peA7cNY@cS9t3QN':8Jg\3l8iQhX:bK6WPk[2JIu! %QXmY3LINsiV/Aq]Aal)R"=K]C-Wg^7&t_F)A2-a;QVYjV,#4l40)MH^*a/fp-[4WZa;G?r*e,WmbSp+Gr4iDqF4ihi'b0NI\W!O, %Q&1,ECnTWBD3^$0hEsQ?GIB>Zm(&?\+b3iBf3K#tY(>mXZZcql'l&]=`2C6$L8WWe^a+T2#=,@% %QQ@@!)p1WVKfF/jKqWFD2k:l26hIoJPU@gK?lV+M3BZ^W0p.&4ep+>=W>-QNB(TM2YTTU1C8 %Occ"BA3lR`@J0ekO5P*88-B>kB>["SgoZ^h@,:jCJmgu(S!!8@1Oi8JO6^+3$g&sqX)PpT-qgfRV[V?KN#4AW6N3!!nuG^aLH(ZA %AgP&;g(g>oTl,(KDeG'AC>Dn]NbXc-'#q`q=$m[S\qiWEi`-YGSd+_")oSejZ'5CC//>7<:_a*_S)Pc^9c?d(BAn_+`d/9a-c(BI %gJEJ:AJ8I->X0J'QBXGI+&_a)%E7'@CPm([$p7L)J=D`.\PqiD[C<'pX=7AFA*5Em75VEgM@s_R_1(B\-\cORIaO"SK^C%"+5(sm %aH)`Aqi-C/]Ak%t#:]0M\l=%)Hj$7H/^[k@O^OG"m4?6TCJQHjB3'eh%n@!Q\7R5m`XkHSNii]D %9T'YU3WW04m!3h-jAnUY%O0sVkMmJt)MhH[R/aAlP,oXlQ\,9SA0pGCke(6C`[:\PCr<*QKpjh7Tb6nqX>@g?!uD_'9CPrF^9f7O %7+N/A#&gC?iIj1g,cK&3^)i\N-OA(L_V">"W/kW5gDWadeSpVr%GU2T9B;6lkF'+]sWP=$G %7q6#=b5#O+GUn`9=b4k&@N12k\VXkG*4jWkjGYpNX`Y0%nTF43C@X1je-aX"HX.X+kMsa;9jXcPlCE^kfLDBA]`Q@h@np4G8]eoh %:)K6AA*Sl$(lN..k_EJA0Y+l27@sAcqo?Nhr-SZH9IZ0l.S5slm>%!U&'*C084E\NO6RRrdQK_O;&a\c28#K-o %Ct3l^ibTjt-*^SXX0m__VDF$RPQ4h!+Vp<[lSO`G!3R[4',Mga9L_L4/_M;LoFY<9Mi?=L8NiE3Xm]b%lWWCmb*O!b;9%8>E:/j> %b!M@a5QQM*$,@A]'U7tMT1'tdq&U#,.*EbZ6:,OfGH7^GlLl,E97>@af0DtIo9==a&g.ki.$:T0rf0kqe@*tKP,d!6kIN\'TqcD6 %+kOu(!3S0gN'_As536Mh$DGNQj/9g_2dR_?2K9fD07/gC;UuedM6WRXq=ReIlW/8(`B%MD5$1PhYK-`WA4fTGH`4"_h@=k2*O@Vp %CD]1QTdqS06C$=Fe__::G>dC6/VtQ*AkEgnD(>*J[b$^pS)R*k[SV-;$EH\kd^VWSS42k#.Xk&IHXJdafg;cA7aIKGY`WAN#$U?S=A%Eb![hmmFq!'R2uD0SV?OFGr+(j4:#;PiBX?]T>tTdX+T?4H6JZ25tEf7`'W@$@`bIF!eeHS7t%"*3Bg6i1Q@5-\qMT%,#U# %oHVC8"Mt`a&48QbR7Z+))GkdR#6Mbsf0DYWOB"/]%+E'C[F^n?SX %@%C$TRV9PnSlh$&@&a?.%9REkj\2f-6J>7JZtPgnb?o&Dbi%@_o8a*EI-cAPB&,ncKoX$WDpWuW$2`een.Mf([".E %D5e;IN(O^@AnT;Dq+Y49&=X,PZa"NGfKN&Fs$jkSqA'!p#fN/.h4;.I:Yb1>Eho84Rnq*=F(in&DcPGYDRi9^!9U`OE]Z`pdHNiZ %FNqMOco[l-Y`W%*[ASdZ7>84Pn)\9EJuF]8PF1%Rcor:VHUmL4C2df&>+<2jXmYe(lQXgTkY:NNl^)hl'(c"ec0srg,rq\3__r@h %e"C]'&6'I^6b/r)2uFU$qlq[L;(0]n]YtcoEK%K1&sY;uirN>H+X@pLOrjD/,CW3F;R0_eL.`sb67sgo8-q^Y,_SQFj81i*j<8d- %=C7S_0\E0J)btTh8V6WT.2Ku:-KlHP1nAlLFaEgbAr %CqEtK5ffDVJAZ8$U!2e4Ru7Icaln8dK99Rgnch#HT(L()4l-:'5gAi=_-hEW"N/ai?/*5HeNdE\S@dcbPf$^i_qS(6>7,:AiGC#S %A"T(b;hS;Fq_!O!QZ,LkDdUEbof3ed2u/^cbLq!VtP/N/e"%8Fu+qu<>OY;qR'7U%< %O)SkNA0!\;q;#NST9=D/8H9S5c_f*9adhf%m`ZRcCOJ+.GtkU!E;#AuW6Hk9:*g'!.J.A2[$`ep"3j(X$2!2Hb_]r&M7q'qH@(HE %aak[?GXN\SRM>'AKftsX--ke5$.aO75VY0.Pan#f6VuXflDb`).p/cJqLjcEQ`LYY:(Fm9P[fl_G.4_G. %a6<'mVB;7sKR*R10;>U:)&r_<4'/)B;>a/3Y:VA_;;K;Jt#mpF'_`Bk4V9b1@FHY'V&!)i",MZ0H6L42"^NjAgR#W\PS6&I+&jI\*j\UbjESY_.?Ft?H9a7XY %jQTBAHsPgo*B$r^naR[F"q+bnhD5haJZ<\:#&CN6/23?WoN9sARsct>A*n(j=r!P\$&)t9cIfu%Z=PSU[p="$l\o+hM1\kVFQ,^g %kOh!uZ@N\0_B]UN3P2qRF*&,Xp.[N0>/,">?udSJ,,ER[2Gb(o@H/J^A$bTqN=/=#C"Onb::7HW(_@Fa[Bgu70fDAi[O^2a4T7D5 %GW_$$S/an=$p/FE<&u67.lqH^b$!l6VX=09fG3?k^.ChC%o5.[YBUPfKn2IlM+E&H;EMV%i&bkk\#0&\knDh;HNT6>Ou%=j4a,4a %n1b-p8-O)DZ,R_UI*bP5\g`un9ZQsJ<@an,.FL_K2N!dI"(a]51k2m-m,+<6Z(^g;QiV3$Cu/i#Y9a/,L2nAV^??RabPlFm/+iLt %h6C2='pn9JBSX*VF'[Z$-)[*Qlk(%PP(efeE,I\C9=h?#SD>UMNFb$$e;s'^SV8\;OV7DM%4B`b#5tZ=Dcq-C45)6aPTEIYnQkeb8qkt%S9HYoc4*\`7Z`J4A'.F"&S>/og,6n[l^].>6V< %Mp>V%qd.)P$A>:J1*VpR]BVG)=-C`%]&k9_9iICSLTWDDl3m'1RD+!glDo]m*dB0$S_#DE38un.6H6M!OAf(IRHanO4-SqletR%^ %65:a(&J_11jQ)DmT##(WS=,.7+d[geW"r"n<70M^R\N'pG&P#g+b2-1]d"GbF]5DI %-TZst)-DSaFl;HI#u20:h29YQ'X9!oV$E%f4hP3(O^m]Z,"$YDLlD#rn`noVs4:`'F6)M#Z"A2]%eVq %bb#mg@<;@#kI>"c_K$0(ABq>f<]W!M>GHAW?]B&3ql59,>9Lk0b@[F<8\O#X-k%nn-AZ/lsf$RdB9@a-7fDq;D/n8"u\]Pmc2d-O1MqQU)E.U6l-@gsI%d"'[^% %OTQ9:gj8-7i+^dCC=aSCCIrh!Shn[(c7EC=/Pp9m;nE144U>&G@'tlkIgT;[5h4;WMYJp6CYOM@f'F/-6g&ENLeDdn",6]d!Xq]B %6at7s,;hY0*RB;\JhrEp4u(kK3LqEF$2NgBJO4F8,RdNi%C*1S&3La].lIe_-Girn%XK$kLL92&]6"g0-T^;MJ`eh\ %\F(ZG\?RD6FZ:IbAXjG*"-OT9)AKXtQ-?b>GU[9\`arG@o-9Lio]KkJM83I;o0UuJsnS#ji %gZ`a8LI2:,OSYalYM55qrDn"gi;uoQe?F0op!Hk)&dZ+P$\!^K.7\^8MY%2LbQ,c8Fk-+a:o:mu%VeAWDM\f)1Y;Q-@`QTRiMJ,G %S@l"o0r)t'nG[Kn3WJF5]A'CNiUbmOSG=*.e>I1S*%]E=q+,@tTaRRJS5*\e.:mZ7gcGSOG6kRY.:`KQ]&]$S,Xe/[:JHJ_nNG\i %!M<#0nVe6Er#/1oH[%A2+O)*mVP@fBg!;5/f8)Ys8%Lc4hp*Z%cahFnEG>nVN%t1]ZHa`7./hF##r,n@m*1o_ho:"Q^te_0CiofaLmlj" %\5X+T"On^]Kk.j#@V\FnZ=_"s?lGG\[dr2K91'Ftl&[='69^NH7Bo;%LE(+e))OhA:rL4t[uf't$R6atLP8'oN,ldDd4J-28pf7? %C:iWjpO4WJVB:G>n=UoSqGV?7S:;3>KY7rn]ruO_9rWO.ge*]A@^cFj4fl1+(0h(l9!N(M9[j:/Xah(0Jt5.d>#h1:/&.!u7f. %JhXDV([?aFV`C^r4&+>D"ATHF-0,&gs2,D>4fm`d)EpMu@>2KTQp?m&4H0h/bnfHJJis91#hE#[]5I\8XFNGp^fab?,;:9a7KZRG %"6jN.mEL6S0u+^3kS^b\q9\0nEqVMP[mJ.o5*p7_ZBbV$-J'R9C.YPi"fYZ<.RU)g.[;ImM*deT9i6)5T$/ds`g6k14-QN2P^rGm %!P\6KS1lM"kt*&Io[gUkCs_D991a'=\Z;k`F#A_Y9%8407_o'(rmUhD]DqbCHFSCtkF]<[/_0Y$F7]ZXoEKC/#&*R^D=b1MhNl%5;Rd.tk^3m&&pU41\=TbY_T0+r$1jpa^-Oor %nN_"Tcl9B>48@Zu_V7t5>7,kp:lk+^2nsWar9F+Wn^IHsGc1Mr`PDQeNdq)_uKr1Dc%K)T*n %^rq,qc"Cd^[d7@MTXXq7rqufS_nTG6=22KG_uD0ghUCZfnltA%#Pa;O'N`&4^SF>FT>'?d*q@CRc1gkXQ_\*nV@#2+XAg.d<=?LM %-r+YfnF0=P_pQls?Z(9r.r?do!Zk?>POreJLb`[RGTYdjlN`$2GE#j*5Ue(b4D5*aS`./uHV(E_fQ5QJEk#k>lY`X_*hN?LQ=/rA %.m"12C[q@"TQ[`VDYk$[+/-mIZn:-eTCr+b!VOnGg]!`F4_`l[9;P0BrL8q%5;4j?K %HL0U93\9dW%uZBO"-Y]R[5,&[^97Ctj838doeA9j:e`tD1b:J9%E %;8YO[1pQJP>G,e6YV)SIFkr,RV\r3V#JKOD\5r%^Wp9jiP-;?I/e$06IoC";oum>\!:im'bH]%\4ie`;^?TK>aWOj8at"%jO]E.0DdbL4 %/#t+)EQNfk-^Y]gsL5C+Q]%,6"\@,V8:Mg3ceDlhf)4ibsr1:p)X^F(EV;=RLLS'-.GbmbX;\eHBX9Mu2*1kq$Z2f^W %C`u"*91'%V`<]ZZqV"t(+X91Jmg&Y]+#mRaj#%,;jcs']m6]Hi/#a$tgpaSTTV`3c1JlF.[Nd>s %)TSej`ge5U6CQ?V,qWHkYQj:sN`6,2_37M51aI>AHJdoM8ppXo"R^`Ck]*&;B4lt3J-:.JfR-<[pfUhe/mgKdlL6do9!3Dm4An^q(@duJHA.gYIiH_A,@%*'j*t]B^1<;\-QH:L3`otdk>q^tga/*F)&nM7A6Ogpfr.,,f;DAPj;C+ODj?)8m8erCa %SZ^3H=>H[\XJ:N)p;d.&mI6SuP2;0`l%S#*Q%+m4&at?cQRoRA_]O#G@RFu9f7l\-Phrls#g!Os,1&g^hb`jt*e_JUT)2QbRrH`& %0EP#q.]/qN:>D(\b(buW%bDl3PD,kD794fnFoEH?@/7-l`Ro'mVBC:lT#$aL7#A,iL74O*Lm03=0"[I=WeG`:ZYH0#g#9;=Z;flq %hC?s$;C!C.jZ>l3=A;]k=Q'Ui@'EjG,J$d]3%u*rLp\6U"CO<1rurB`.m.,h(\8P:kAW6j;N_T[m*5ZHE5XdejFBjo2f]PX8+iN&!PRl>.-Rk.(Z'th'@[5&A$+euhU\nTFf3_HPCIZ'6Yf4g6g^nCY.okJ%/h&G!?js] %V4:@n3MA3I6GbJ!-d#5Y,,-^0X)oK%Zs:H`8OJmtWXD]#nBR53 %K\M$kCn>Ce`/mCZpH` %*I9e87#*sXc3Vgk\$5)US`VpVUX/Ta;6'4^Fi$eZ0iCu^UanSsV>!F?.4RJMNZ.#JkVFO7neaImF/nA(@u6SM64_G8?Va:):f*!S %:kcj$1s-B!c5*@Y:J1juuB`XjH`r",5Tm7H)-56_tceI4A>*!IP@8Ck!iO]D(h\7>.Uo<'/"UBi\6%X3K\.Jj0UYOsQd(<_.g[3UR %`m:GO0(!Q.>'544:4:PsP/oq0EcV/<\]HLn[uDoRoog[QMML8]FNm0oUn;[pjKB034+/Vbs7pZmhBf%Dd@HtRI7OT8ee2A-=>.=, %]rsOoE1V-c\J0oo,K)`g3T6&ljaXn,^LoLUn^B?O[Uq3c5-9LWW*OVlnuZE6p:nP?8E&bYg-\S>HXB4SF8bReV,9KODFa:\#`rDr686IbN4]ri,(/$9f`J752oeo#$c%*]Xs`E %^?0gMPC9tun8mK$<+f8?['k9E)[0hncn\l1;m&_7>aukfX-'$6SWun_LPkVrfgWT-j;C@\#'SY9mGtegT*eWNKP$!iXs*M>(XXg-O6/ %BsWZmaeCUrS=V(c0M1G!r%ueEi%[-V*+)K&[]]XNf'NkCW_[+^O68LX%hms=3&d8nVPEbUM'H<*DXAn>K_UAZPHWL6\,??@Y;o(Ss,9FLgBpSOKofTokok0]eYui#!:UJ_sIEg[\I^j(j:d&3)5Y. %7Ber^hl0+ELF4pgKM_^87j(ndr>B)(C$#?FodS7sj;@";+=s-1BeO(2)>pf6d3A6]4[P'80DqtC1%=e)GaLG'H,0YC57AX7V@iRR %#p&D%nrOBsYj %Z$-"VL?9,n[,r"GI'C@[VX52;pG\E.0V-OUp$Yr.Yfc*.ppo[O8)2Vk7`pbZD$%"#>>n&78" %F_X:;m<#C-0J,P8r5S@h)+Q('kqop!nA!2-V\s%0^VN*3N[F_.B!$3(?@8@pVUdVam:bNt2p'u\5gRmU!1+h2gqOcXpV[XLa@#e.(T@.B %Mt1c"F4_RT?;-q?@@IDpXt,aBqBe=6qGu4(B\Ukj^`9-@K$"d:0a1s4f:.!Hc-jZ/2Q'^p/`]!W1[`f^?khPN3)F@+^CCh-bQe\C %7(r=):6(FX:%C>ba,0c>HI.Uc9cpt=SU9grTT?/RrLouQIB@.o=/"FkpS"?K7p=2(LZ?'i2P2\,Y9S&^KWEY)cM(;se!)qO&b$Mf %c[)r(phD+bO6DNk"k5kG,q%aG^5N3aNhMArUhnlY3g1ZE)=s@/XJa6(,.RV2cU?e@r(!f9KZ %H1-F5e?0eWGqZ>.V^'2?B^BmOUY,3grA"IO0`PlEV"kMBBqC>qaiut %rjFAt"Z*'qVU%!eDNHFGg9i>$HSP*AU6%D2CXM9I(*2:>OOH %B\][1p+uFs@OV?Za&3%.SJ#mFI;/!4HL%b%lC4r@U#oukmb32=G96SY@6QVX?bQjmB99ll9tgINQ#Eji(u[@JChZB3:,An;RSgcI %N8g6r1\t_2c#RE\6VdeJ:Ps&(e3>;/C2W<<#=7ZNf@(UhL=`SWPJ`<-Xq"(/)a1>c %QW1TYE!*1s54mrA?K35K%sF5(C#XZAQ>3^c\L(G=Lms32/r7cY[M4O==6O<>NfSNk:+`1'gfm7q3OXEU3CRT.G3`BW:a^@!7C]FC %&FTprlI'X!X'2?WoW9"eH`V\2Y&k_5GR(CA"E]B][,)6uLB_sZ@T2alIaDNbg(baluQE %?b<`Eq]h1a.#?O^<"IsW]qHTj)^"sNH0agT'+9#&BVH*Po5Y^(e,J[mOlt34=*M(l:*B-7jn01;+MPpii:UD["pM2k0g_Ua"u._. %B+WP_FR]*#Rq&))oWktK(B9SKJ-9[#.,?aJ:_j/hVf2A&g[[;mSUJ0b3(BV4a!GLeIolr>cO'PY3LYNaKG'F$J7'Snfe(C/G_Cp^ %!MAFq.VDGN*^-[B=WkukF-J^P!TlI.oV3e;IR/N"dMiLK`mo"$[q@5Sf?ohO%X@+0=1G!h?udY7teK4^.aLCV,,>&Q*d.Z %1j6D3UeQQsj3u28(NK%sche9aDFlFGa"=?'H$0+A;V+gdehP1>]:S]4QBc(4Z6cVupZPoKTgV>p %*h%PU<(Tj %qtdQ5en9Rd6ZPXe2r=u,(?l]t0YTg.NPYZef9`b/?(9Q:rTCN(VDZcnRVCRdlfqp3mH^<<@3O.k.4g.,#RROp/OZ>FArO[G;Z3^2 %jaAmVM"4)+#uMbc-r1&3-_J6A;g@jpp_bojs%Em@o6ACZq'/kD)tL3#gt2bg/1@,,*Hd',E!flZ]2e]E<9ZK:=Qk%E'l%-$`Oq?+ %4sFoUOcL.p=\HgRkKqsuf\FrZmblYacn(o_f,qDgaMS@%B"PI=D:E1/be"2((Si-Bir^'f].'G9G7Auba)bTXGr1DZ:71uBIdaW@ %qIu+?Gtuf3D.dH/9]=6DY[gM;c50FCo4"?R_2Gsn(2bNh&ZK<3WJ)gM-dj?H2i,FECHem).\LC6r#FobKft3DV:7uUbR#UaUNO^ %6S\rVLV*=@(oDI9k,49]5)q@8?+;tp]cVo3pNS'+\+?lu:A!\#SR&V[\8a5OOeEG@()].fY^Pk_%"@7c`8#;M6;;lg_L[fJCZG,j %_\#h0U[X)rN:8Y(cXSfCP:(SGjGj.5Vmp.ekh9NGbF#kmlT(6)ehPdYSjP!_UX<__*5>[C^GA'_1p>#MrS96o=5(:uT,&s:qT@N4 %1l+W^B_5-W1\RC/h0D&0F`O3N\Tpe2:"on?h/(/Z1%l@FHoW4I,!^;6jHp`t'+dK4m1"5Q)h7jcHqhW)d %[Abl61U%>24C/P.3_Q5N>(,/3GBD?',1cao>IM8bPo8QT]]^mjER":G=LJgs*>>F`2@`/#dOVD47/"T0lrY1TDaL-+1LYJjl^X)6 %(0YK!S1.O4kpE+C[6IlRMfcBtX.m)I8D&bN2%k(A<;ZI_=Nus3&W>I9ho"rgNp8HOY>1he`t/_ZAY)IhZd#4';CFm(2D"\=MPd(j#$G8&$:9QO84!#_LrX3`:Qq]U1`ts#nrAubfGdZ5.WeHCojrPFu!fcJf%WsTccgjfCqb\%lDd" %c"si$9SSs*gWeNnW=Mf'Hs8n-=+$B:jumD1TO)fF[^D+LhC+=i,k[';8NaaYmr+;TdJrJAf1f9VJp`_dZWN].hQ$e#@gZJ>Ibu?XN2kbu-XPu\B*rB9T_@c1;8N8*gCmGk&af(U["F'dET8f)7LF@eA38H3?GE+'<^(l[ON[T/[kBVpXH&,NeQ^4Bm %JanFh"7*\Om0gZn#O42-HcG,N4Mu^^9q%RKe>##p@h.Mn-4KaQ3VD;CR9aU'kH4@!rB(R&eAR4iY3;ml\A!)6]JCZ@boXXN2e3he %kNUfg`l$f(SO0[3ke!G"'(2[5GE@'*r++DAW07:r%W!1#j7JIl`U&[m,(Z=PI_Cmcq$ch&aMBMuD?M7'YGR %ZL=fGPW/U52LSh3amlT^"ApSu,VS[@r%85$YQ%_YA"_Dahj7"5:cF`ObL7!55`bB>IkFLKPncO?2 %DMGd[P9TX)&?3p9o`bl94I]?:5S4HTO54W[l\.q0h\,Jn_e>;uDn5:Pt@-r=O;%g`FaD5PNQF])MckkTn*VpDp4t_\;F.5,'BlA*d7.`/?T,E.kqX3kD7SSooZS,+X^=tFn:WUe4CDLa4ZaaoK<)K]t$%R8^ %2)ho6NOFIfI&e!to!=CXE#(F>5^HH_`_d]\H(4p(7l&?6eQ+MLC$b?qa,JOWjYP\e@%$*$+I"40ocha(i-o&)KWhXT^eE;oqP3eo8Q'R(Pr$'0]dS %=h[6=TFHaUd>]5h!RWh-U"cJu;tjR6;Ek=V4gR;B+SlN!"R1G\f?gc5GMcRcg*6H-6_C8ZrY;o>FYKq\QXs\3H(=Uf7i$7VDiEei %K-tufH#oPP"$mb_Xh3J83c#bp=.Cl>ZfK#,oBAC6;V<6"n#?]`>^nP]2SuN"3gjN&5U50kD"BjhLW)<80Rl[h%-$VBfY+Aa80_3O %]$!*5rp-.&EXR0(mUBDcW.&XH+'KqY\S#sd.MT-nnXI,t%cmI?8)@9:VLErISEM6?Mk#&q=AIddr\c=-5FgD$bC#f![9pC%=;-Rq %35<6&\*nh2,+:BspK:H(_W7"UK;q[YQ!#a.MDY`j]n;G1]r"6bO=&89'u6nVO#,0X@B@tq&X>'aO]?XF:fN23]Qb[Jn;gc)cX'^ %,R'*%2O8s62QReYBh1H3,TWF@(OISW&V=n)BrHI+Xt^Z*PG&>j%0Y`SLm>u+l[ %QC8!q<*V\e/(*8[+G4!%*dTSGI_U8K[LSALj&b8]gfm1JLseL2@'a(m$eXf@KrWX0[mCq\ETRe\KsLOPg'0rHh"B\MMEF7Aah7a\ %H:>KBf[*:@pst3!['X.-g*#lk-).G$H#G+fkHm/VNW2NaCAlQHloWfuLZ5>l.r(p%Vg%2H$YIVDk,JL3C6d%N*LbTDnG&[5!oeem %*t>DP'M=3A+[reW.K9"@2.X]5`?-*JjDaoHi]Y^1ENqsN@'Jfa`1SkW*h?:CTB_rKYQuO:6akMD8\7DZ^\V8okZHn^Q/&N(lW^t9 %V8^mHja49X.E#(_n1J8U,5!hY;B;JQ?Mi/!?"uRHeI_L(=4.7UUCKH_? %@:R$jOKVX&(`j+Eo>I+Gk;7CTVtXjs*A+Cg)>=#2f_M$T*E9U21MUu-l0?KlVka(BJ[!Vt3TJ.irI!m[qY]-eQS,rEo'J-`H&[;rl_iK^`dOiD[&+j\h!HF3r$%hInbocA**g'994i6a %WS`Q1mjo>]3RMJt:s$,-F1b&LpVUD%l0hndh?\jA@_cCdR^5D1hWCa8FBon@E+!5WjM8omho!>0blcF)DnT_HKVP1[VE$p[B3%QiZ"k6_D@aTBF/A]Ql.=p2O>M"=J_,AmjrAgq*doAe@%]cu2D>4h\5P=JN6F7%"ae=/KlgntMVV\rQF*1f!Zf]f,H6 %a8P#=_fkT]juSN"j#N,sj([+4eu(>GCSF=4Ut/L<*>I0\1:BD;feMg/O+Ce<=@iitM7Q<'ePqeGl'?(@@Pnpm-&U4Yk^+"-dn6OZ %\?Gn_*BZ7bf0.bJPdB18L+1s5h?L--[e>>X[S^r&]$1^jgge:gOE;eXRP0nIhnV0;4H7/*+AEGuF+iI=&E.OkIGYcgA!hWo7PP$J %1pp])dF?NLU8aj"4IOqNbP#K@*fT*B`Vd]Jrj7KYFZ(njVko9UO>a'8@b1nn*,7.ghcEM7M=dWa)^jB"(E_[+T1jL9M/PGs(Y?8+ %D5t,&$aLW;a6k %l0@H8f'"P>GDt;D6[Hddh`2DG0jsZ3dU8)%q9d&X3_)I$$:@pc=ee'j&o4!]oo5UCNT?_`QB!%*)U[:5o)SGC1(Re,;d@9UFn+7R %G:$%"TA1;)R%7l,Ek0G4#N_+;s0F4l4nSbkaBuW2P:'o3PIsZHEGE7k"TE(Nq:M`\=5H#I*hc*UoQ'#kAeKnE7l?Jq:XU69m,@cB %-7KDMD`(+#p-29\(P2)+N0t7`?d4rUiS:j$BT*pp1*3S,, %1BQj:0+h#&IGNKUMLcSOe.t7c8.Otj7QW^=0d>R'L_8sUB2=+m2JVh/OCmN(bpn'^//43m`H#;Np*5a!9$>j9?+ucVYC%k+Zf9Zb %YP\(7))'\T'//'!c-?-io(rN%7)./^pni@5qji=Z[#O,0G)fTC9JbaCO/^]6qjjlD'=sW/A.FWuo\)$KG3*H3%8lf/'t#8RlJnsl %Rd3%46@kRG=+.37';Zr %:g9M\5>4gan?#5nLh@g-c-+W%B&,QiA"J]:Gb!XZa2N:!48V@3hN4$&IbkE7bO%@ZgodN;Xb0@acWUK4],]fQQmEnkMqkD2CRo&% %/95Bcr4KgY&#c?3N\$[R;Gh1q_rbd2pnP0Xin;A+0lM('(-(]C%[;bj3]b1WTCD:Z+`HIFeNWeNkk5B6:WUf?CDLj7F'3(X9T0sJ %7C=EWe^qa63[PW]Z]AmA(-Aj)H<)`>;4Ii9QiZZ2)9pEKG2(ZGWQ,)\'36b_5/TO@QVmUue4?Ds/n@Z(!DJMm[[Mn?^F*?sn0F="`DHT9]247V:rMT\F8&PFZ'pk#J5k8oY\o@BQYRE2j8 %;3cifksXjc;/#=`neYT'0"`*Z>:OT3r0YmFa6KcHXRiTj)OWh(PtojofU;Wc2n!M6e&5Fn`r;!+]HB'4q&S*qc>p>-aN#F^]WR[: %+;4DA$r`^AY@Tc*;g4;7(&q<4PUp'%uDVp"koF]dg0^=Rg-c='EGlN3:5K1JXaRLUjc@HQOMj*P!6>=M%= %8UJBMe;aoQ.-Rn;,Q$5X*m[?k`WCIuPC6X%"D02"T/Z$@LpAHd[jI)"EjUV_r%Vs9;`g5J)74t&t[Zf0N %8c(QmMldK\,0Ef"W?iXWY*/Ujra#cf-nl`RWfpRV^RpRQbp*#_r+#$:7s[q^\]AgVqjLMq,3P9bUuDjF],F=jWAX6QX6*MW\5C8@l*m_#P"YkC-&#?bE)jqX:V^(mV>dL.8@TO4%JBG%O"1+bgn4c\eio$bMoqDEE,LLVEG %>=[K"V?o\':"R^$I22DSXQJ'$#$R>C?sA,g]g(35aV\fqWP=0g'la8f:l0R_ %OMHuS&e]Gp=Srpb]3DftI;NB:K %nCZR!dY30%[(YrDFo,9Ok/9G!\N-pU4cIJZ\RJJr^I#I&!pEWL]rjP3@YGFnDC)0=8k^+fQla-_hM39L+FPf%_PV,,h"GZ^b92?s %iA<$>-,1MXhTI&]B1D@3$md<,R@tlhfGu?WjD;8pXI:ddjAj,\L`qL#L&TQ>C9WFdK$>"^_/q3-@X1:tE8(n"ai?0n^uZ_HRuX"4+(oWf^L9UMS*Xq1fLp?*h`QH"lW %_&"!>PkHhCLn+MBSOZ1>kVJ5T/kpDG.74=9*edh?GUI6Mo!X",\&':M3c#ms(/E24Om+:Z`=).EnU>F%59V?R;\3D]`'q![(!S9" %>t9>F$+7BIrX$:Nictg$L1tZYcYhnNcZJ63h=W4+S9uiAZ'I+UP(_8d%hie+&c],E[aoLjR2db>Z^H%r,EGmffa.OcUjcK=dpefu %imW3rJjqW8GpI&[/E1%2S:)c,GFhN9J%APsgPd(!jC9=LP;-r5ekKf-8;*uq!"au`eHH#g[AZf#\(N8*1qro&QtOLh/9:._C!tIV %e"W9D %#5`!3An'FL$IdVq[V'LnWD3+4r/0fB\.NuS[977ZE$KBbroh/c=L\rTgeXrkX9_NF1+tuCGRPY"5qnPC %0F3D2=mDZ$7NP^fM``e2XDuoF]C(uBMB/H%pLHU4Y"if$OfK-WC':F._]%bMZ(M2DQ)@3K.!T)jAJ.6eSoN$$6rH:W+i;:sG",q: %oYlYMdFCa^di:@D)H]$B,j#ZR3CNAKR4ujNGr@h1\D0^@:]M/h&AUG0JU1s9[L$G#5L8KVDbSesV\PA.AgeqPb^TN1iX)S&CWh<. %'t+giA=D=k4-o*GH+&eg.7J7;>\U7NPdc9p="\>0N$+BbSS`_ %'>-Y!N!-?2&>(L%T-p"K.dCPnRB88@hk/ZudYEU,^9+-TX1_:]lLplZM]2;mBlb4P^.BBl_KqO/Y7#4g2u6'4niQMdZUr]ERRL[^ %W+Jg\m=Q+ZBaqub1%,FdL=,$8MU,G654A8VJ%DeC(mI>4MaXItho"aXm8%r#@GdgrJN1fq;4,Xlp/MYg8H?I`PeU+cni-5U*;"MO %4O'?S;p:iQF[gcW0r8lFh\XVI[$b\F.*h4I]B9h5Xh(EJ\-sPtRpM)S)nn %jJGAY?Z8+(P$?n%/?#XE+4>o[TDtSH4b5GtX!\3;71u,rU,[1T"QPX8:U]R%rS3ML^LG@f6PU@JF`L_EP"X9p(ZP3c1bFPaGu<=Z %P0>UGFp=JdD$@WAJ])b+n\VJGStFV4V*-0CM9"_h0'-!uIbH\3=oS"P^Zj1rPcFE'&)eg=;#B\W54j(J52uHqJr;-;_Xbt;?^JSN %1&mH-bP1XIe(iEEs$`Thn,M&frr?@9>>0GBB8sjrIb+O%k'Z'VT";PPHoF!-EHB8ed@=g4\o\\gB/?#u>F97sp&Yfu(K%D_nF]Wace:17b^UJY&+j]W^_i7m-D+&F-s3G"O_tW&(FWJNb7-mo#ib %]KuRX5?tK)N>l@B:C$'R[s3,L*ZMWh1Ca9B7/YD$$[LQ$K;b]l<[8l#I>DtQHiKu[pAF%'KKW\gsDf&/JhU&ZQ&OLsVWPRmC97JUG@4hEQ;'^6^cOi`Jl#u?e[638 %CVY:JQ[nf3YCLWl5P/Z'M`6;+5Apc]o=Z6a`#koUJ#c/%,gYQjo<*['EnL-1+9J-X8etn@WeY2*U9bF%F[Br`Zg2TPmEb_!IQu-8 %DQPrT*Kg=m]K'<70C/DUFr`#*,5bUA3>rb/V`s`J]0BabdP.#+?'*[i+[,;81-L*?EtQ=]&f#K*!6-,JBAB3p3Zd@9hqC3BHCKDk %b;?-+QCGE653Z9dSfd=Rg,Zc/?iTrg+h4\BYmg+RMtUc&ft/5Hs2_\CouDKYDs"djmtpeID#0oh)"EdJN^@"o %GiB4r)IG:<(#:[/h_<#<8$#A]ne)`.KK[Y?Y2N1JO1=8/NqS.?0Fe'6aSb3K/`iVCIsgS6I4%5JMe,r`Z/M:(rl`Ks@`4QSrsSAA %EXt0Vgp,pum%eec'FCLU2H0,?Ofr]Wo$HIL[QHDA[r*s(79C8/Z8-1t6BU$!rkC5e!0\R3J6kCuM!shDD'ZWdYMQP9f*6kXA_QA$ %THZNVIeLt`ZUH=q^HB.;p\r!gB,O8?SPsL@ZlC@(lRfkn5NBd"I5kS+?!a.P'ebK+i2L!9L6WQNXd9q=hhj<9V]^H_9D:Mtm$H>5 %[?%h1qQlS-N"b%\NJuc6f7)*kAHC26T>g-U1Y7lk'-h)Q&OP#^`(ua),+ZAH'.C\@P=Zit)\,?CVdgn!,sUt,*]`g]<_%/Xj\+?3 %a:`kL>@\RGAQ@]2`0:1:Z%-Mqogl)b?<\u4Yodb.G2%K"pR:aBKAk-l]K9tir0pG=ZuMFMaLV?W1>8.!>kaGi[F:H8p3CmWb4-]A %E!/2WD?PM^TG?X?!!,BX];kZ^5h(@X90!=&R;b'bk"gpUf=kkGR5:cJ9sTnCnYX)baubW7LNu%m %fii1NIeVUjr:Jb$#tf$0"NR^+HN?mS)XF6WM"04LZZNr@^Q/[LQab2D?Pi$-=9S-]"9tt_rb^HZIiH^XMsNLr;DHqP1I;Im>5#:u %:j]=>b#Y&nXetH6RYdkj42$pZFZ+BTQN-?n>p16F/uZ %?PoI2FNY3oo(oNR'-6dqep"^7q*3]Y*q%fZrI`+E?gD%UDV`W.bF`\.n!i/kJ"d/sT'e\pmWC4kB:nTd5`H$G2eDP'm1t%kEbH[A %P7UN9Xo&:TnF`91KpYmeijLH#[Rse!X8CcPA&UD+6Fbi"t"pgeh<3Sd/%d %g=dpiEE+4naN_6U>1n*XK?_'cPecb72SuN8CN;h)HeX!Z1tk$M=T=pgqJ`<>BnphjNJ61Y5\k)l^iND>*;E)UYoQq2aObEBaUPq! %IYjOS5#Gkfq,r"id(?+EO\"dbRS&s3Y9QHN#J0gh)gCr;*GrWS_\O)+`LK37GMetb)gAj+_hb\ge@V6j?V!`Ua&ZAnkrlYI0A\6HEX`Nmq>aW4L53S:BC2oS2We@O';-?,I_P%<&>/Hk %iF"Du!Q?TW&m#'jg)3H"$=+hQ+06]"5kTk^1VOIWr)p=rm0G,qb!;uk/rLpoJ!O8gY/X6G7!jKil9?KQhLD*pmbdrmJ,%?>p%SLW %:[ns9aVU'9,JJ#+RP$Q8EW.E_:N'D%g.V393RkX$r6jEJB67qcp2mW(g7.CDKa4(0BpYeV49Z'%Y+eP.05.Kb1Ule]JF'jgFdYnOg^B"X`*[JVe/`qM)cI/(sH5\OJ*IYZ5`XkIp2`55ABGX9A6A271' %aA8Kt5_k>uGQ$o^l_NA77C(s:iRaQ1K:D+``\]B/F%!Nf<*`-]cGo[WCK3DldE&JPcSTEm,7@[pWP7F(Z4V?JN/9M$!Q>]AB<1e>Z+W6UsclTK@*XaHg[Y1@T72XcVBA %G.U7b^b-"C@$e9p8f]^PAfR"%1-H>9D2Z9\V@XKZ[k1&"<1XZ,AmZn)VQic %3Hh69,L.!(#SP,#ID'X,%r^&Xf045`bG8)a]RZ9'B1Z<+&J>L%MGY/K\oTfY6?JK2.tX(Pc!]8XW\?1!_p7[MDVYYa\DVmf??;;^nH3(sWcR*pr8%)Y*3lhnS?J-cMsHhsTgMCH:..UOTe=;NTQ]BJ!D&bP#2l/mDY(#W">8VN?[$K\n*4&qd(OP/ %6V\-9:!&'Z\],b(KiN52(HMQThBuj5)ZnY!FZ627so#HWn^1%FdqF_psqXNu?Hqd@PBq %A-Icl1@jK9.& %krLa!H#Rf>=M=@76VaYMQimr%TqJbtR&]/F]o./Wt4dhN\fl]MkE!K^d/!GCWnF<]\nFsJNAj;u*C>gN6J>s2ghDDV"g\oJf32B]u?m?PuAP;gM,G0gQ%`0GW3 %/03-(?GcOL:M5Z&q`H^WF0bCIK;uV!U7]%[eWh1PL^4;J"ciAHd(tQq1;NE!\2i#]?_>UD_+Mpa'9CREZ6gY5cg.=NOc][V8u\#I %K,CJ.E'g^n`_TrQ^9$dmVY%QPuN5("@X=<-"*1_WgO^fsZD#A0+Rc5/bm>,2[H$=Tcej2'l@1,.7e-BGk,c4"V.7ET(L`DW\j7m8D8eoJQhRlB(`QA%OhDC2-r %Dj*^UA2[jckCrt+5#HMYBnDXM207c.,PfnW5cYVZOQIOAC#6s$G23`juj9Wk;PF %08k^_?GP'5-.OIs0bKb2UE5$dEJ=KN33uTj^6P3D<#Wgr;B%SH7:'%aH;o$Te2;s[je:p*k=@N>d=J%pi"7@+[UBZ>o^X:H?TRhI %D<#r5;gn!)e'cmDf)o7KKhm8qb1IGo&'V^;#BB8W,Db;=2Sm;i"["c:eh"]m)1Cg'P*IU(.l`.u/m-$uLcB/=-rp'd^o+PrZ]DXG %`eQ%b!h7h./pUDW>>`]B"BiRrUX'>c"ZB"eIFef--H8PqC.hFf$DOoDg'E39ihJ9YmS(K9DD)2BW.]G\.Gd?DJER^L?P)qA$Jh`5 %!!laC8lCNF@O8/+l&'=H>OT+YeN9'A@YK>.?:3Ar!M&.t!jRKL %^u7!Qi#J"=&_r\g_bAd?S`q]FL1aC`91,f5KaQ)&Q,d(t'T$9"Re>Mcs(215i1X8o6W+ME]rp##GEPN,4o3AB;-&Ma$6$FB%+'S' %(][NY'ZnUoX9V#fN^SqD-DZ>EnRT'`5]g4:!)`Om5\;@:jTaN!,h'qo[]^eUu2BY0$.OTR$e&j(Xa4J8jZ8t %e*@8Pd8^d"L.GqQ$R1>^OdcV[m/dg,M4o\gI:-Hu]9%o'G;5WX93])],BiV=?h!-(C5Gg(L+keZ++>bfj%\R4T39!k"fut#6e1.8 %THK"^>`1rFn4Z+N=XI;1`fsmkN)u8]hi^p2k#Z:Dp(01qiUlaU?*ak5\R(N!QblHO& %VSpNX9oAWQftW&snsa_BfA*$Ju\t']K+K:po@:dKbfgKf0/&O?:-,.KfTlAE&$gEaCD8U@n\X84t#,rB3$Q>n3Pk,l"G*. %$\[PFGcg1rnVL4VmYb$F2bGCa5gTXWP0g"hgEY5RSI>lnfu;L<>ta[G*W"ui?]oS7]^=-&CVW=%%!]33(*Af%3>Kf!eV%LcJdua\ %s(]@RrT\K^$1NKb%r0<#Cq-N"rhC@sr7;*AB[>NinV*Jd;pT.A>5-DXu5P:QG#mfmBu?b1-4Wg#M!K %\Z*kk2M(=Nc[j#UX.qW[W\CD''W#mrT.J+3GhO!dImM*'mUQAcW'rP<,'d]6u!/TkVB9AM_!:cIWgHAR=Ft>@?)V!2W %AH`!"DffDEXK,e79q:R1&6Xe\0^]]Q@^"BEkV?@PT6o&gjAWX(#_C;4ZBfR$f,rI99:KH;_(<^RpO`er>WB&E;4n>)\59L[MprL" %EmG[?9t=ZRLY!9(TIuX)N%t?4m\;>hE&;$.mS]f??e8h"S!ob6nABn1QR#:RlS'Pn74S>/nJHd$Hf<-$$ %T($oEC["nJHhi_P,#O'^Xg7'<,2RQLdu]d^B>V%]`_QL;8!h/B5I!gTk"e7n\]NJ;&J*6R[_:@Tc:oso1A+&ICchLDNL'[FZ<=P> %Fh`J3+Fa3q=bh6Jj)6i)"^PLt:RSbD&t_0_pWVp[m-Q_6P(3:afa2S\=TT6[lmhAV_/7<79C.UnPU"7/MK*/Zd/p`_2JM.G7BV9n %HPZAj:MSCebrf\';C_3tPI%X-JeBFjFpIF:=KpZNW2GbWSZ-M2Cr$:+1=6dZDVYJ=#u`hN/nE"W1gRLt8AXo$W5[aY"B/\VNYisd %.-hYt%(;d#\RYfoWcLMANT78W_LjX\eZVGM]5`/7re1kfHFd0/gn&AUGj;t'-S\Iu^mpr_K";2EKFMT/&\sWr.>m(52>kqT6TfB$ %o-0ZioJ..Ej+_o'OerYn!TPN`^^%#.`mheUKYn)hUKo3L'lg0rD0;BBgF-oq7t%p;E"p:R+2;9SG1ko9#5<.1dtF-CXuCGk`00Eq+p^1ap88m/=n30;^o6i3a"aq(2:f0L-KnL5e6@rdPVG/S!XX"AGWFO`+A:T:he]JA)%\;K?9M,tPI`Sgs %MmD96\0_Y(:]IZlG5C$^@Tr.A)B3KcVV5I5qO8q#OYA8+SbsX?&*ol,el^M_M.`4NAM;>E>dhM]&9- %>)XoC`[K5eFZmlh8B@*eA8?iI/Xco:>!t$O;51HQM-ber9p]$kL_E0;HttT`.q:lhJ/ElP+bC;c(:P!1IEI+i3n>GYM;A;-22:V6 %i-Gp^4(_(PTjU@-3A$9'lsX4:QV?BmeLk@cEfSQhCZS_gLo!-K0j8WbJcGf1CYL\,9A=,2_g%Keb/>>+d0VZO.g-&7,jf(7DP#mM %JQZ^kBtUb(+Wsc>_4uG/[-9;=N)$@H'1#uGPlZe-P!IXXLlfV1-(;4O$'f5?u40TG(7 %Wg8(U65RPHT=1pN3+L8!+BaLdI+@8Q\0&FpQ'a&P)6P#$(q=)u(_q;!$lXqqSKn5k'CR5`sk.0N1P"`F4SKM %[]Upap/PnbD4D`55S[#^"F:/sF8SWsI4lM&-GEURJ]\DMMMX<_.G$hM(]l;h>qVs3^9I%c9Z1&');/o#I]n;U:Y1^k>_RNPM]efm41A.[bJ]%VF?kT^+d58=sB %'$\*j8,S88S>@C/W3Kff<_s"KJ7Fe68pO`9TMtZO,iE^%,8(,S;=l!8R0>p<'_R+(S7sD"EOC>f5MZV(a)-tU,Vm1NqP!K %*a%a-T!V4haG']Pl>h1`d`T']p^NNW9MajZQ\Ku#YBYOI"'K8E]5d]GQ>/6K$fR=]]FC'bZ^]8i4tO)Zl!^T$`[`s1CnZ7nf`3aE %8$^7?fJnPh4"3> %b-'HX;:Xec7mAphA3W?:g$c2BAII%!iG3qZ[2Yt"D_5Uk@)L"=8nW6:d`sc>SS-l1+c8fXN`,DMPOf_bRq0=;<>d %N2-mm1m--f&Un\D`j.#8Y'9eY7E(:R6m*>P%eC1t&8iF&=r>Q;K-^=(4\)!&SkD&MD*uE3)?N;"0gT8 %rI1XF6,pd^gQqFp/J2Y7I6Amhh/!.Rirkipetcg^30;t09/jJKVUd*8N;4dKjPI*0p0g+9^4n7rKkDP5KOml7?R8gRbHU?n-p*u)Re8>23=D39Mg_hUimj&]m0Xe)lDN[\e(O'O&V_).-XEp]M4n\ %.:ao"#'l!FMQ!ksP`,;e1,:_nG16O8/0Qlu3/#S'EC+ERf/=1mYR_1_0t:?#IW4L60k888&-[ %EVt]gS9Bic>'?R@UY@CZ>jAg]/d?5pa-\mkF-XE<'<^.6^#;68KYf_MYKOt7=B]gD[>IHLC;@BNF.B9.XYS%k*%/&J %F6t)+%J0&8;_=gXK=Nti.d`B3dL)(!YA50PMmO0_<"T[t7C>d`PLV"L_V4CpQF!9l(L-qY?:!4?+JFR)51 %*U.8#d;V;-D%SLVIoF5bj-CP#GlTpIBNo?s"!G#hTZ(ip5ZC(#<`B#(f@jK8_ANDjR1tOKG?f!1=278qnmam=5@K8%a&I=/Z4J?n %48[i<%OJ_kn;jI$XXS."Xb/L$7*BcMB]Q:0f %j1dl//$a::QU@(jB*On2=a\rcFlhNj+=/0V*4D?V/ZV//WC" %gA2;<\""_oXQ*]Z/#N.E)AQO[fA4!0CNZYsE^k)bicHU8/W5\09TNFHgs;ODM+^$S;(Hr8G>-V&;7[/o$lD(?/6&H#XdaSHOKW#sr#cVX&Gt"YK]1sBL'%re42lgLJaWC"%*YG\+06&7j1u`_n=[U^";SP*'GQ).Q:QFm %g>Ba:]+)\hM"$:pSe,:3BYp.tD"LZ_L[)Z0X9dsm_,M+r&=VD(TJ:An?urOccN:LB72$tSO(_MS%0RT;%RAf$VFM3FDGWg9p7R&u %*G[4W5>H24Q_u9o.5GV>=uSmC1:Nk.=[;%e,'l=mj>GFfkS6[H0f'6*"BV]:;H3:=:_&G7*7DD#&1,H#%\b<.<);,I8?pbVFF_#4 %p.XU0UWeCupp*.n?iUk8P39`GGL$g-';RQk?NDMB9Ad)g?O)L(,Eb2G8=6"`lQpX%(/ja6>[6#]@(@M%C3#j=0VYDD#-g,`tLCH)K6b2JEj2_33Xp&VdWXH3`cBe9fHkQu$_XWAU2H$OZ8!3Nli1S+'GFbqMRoe\9]E[DmrE\dE %)s08=-[cVNOkS0d`(m$ciKh;>+ZdTBE^f4$;c$e\I5V=7)n%$RTf,i3NZnpm`;HAJ%>J6q)Y3T2Bb[UgEe\Q5=0mY4G?DLd1W*Cl %N7.4,VUSJ+]=(%7O/9@`o?oC#&qX2S/N0%EMPIDn\Ce^i(eq=oU^+/`hkQgLdm\!/^R>beS:!VF-^ND=@(P:"io8H%ZfLc %SAJSJ1?+,\,uc@p@]W\@Ld,+DVFI\g`ggK31;'6U_/Z7risb=+baUb3=%nR_n).U0[h4XkW`s!3i`N9JGn.4'iW3N)@SVrgr>cgF %=Fj"Z^1pZ0%IqW*L9=4iR*k'@XQ`a6UXC?D7BkL*:6+pQh61CV+gMC]3\?2MKMLI1/$+!6@h[&&0>=u_1KMBOo_bfOc@ZJF9D^e5 %I\4F[/!Ju/`U(?KUD.:9\6(^7S&<'9[ST;W-o.S'%U6@hBj$u"m?eRne$O#aVIC3 %k1cmJOebD`oGfAd,KcJ,]:R,g(-W6f:esBQ%47fAa_r0S_f))sYc.)?C[2iGYOMJmC2)XpApsVTRrPP-3lL:cK+\7'u %5nU.4)AhD2:C2$4(N]"L0!%9g,W#bNL]qNd),''sj%)W9#q)O5t`Ec5_SV#GSod6<.%X0UKn$"reB]5k/Obd4&nMWGLe_a@B.41Tr[uKJui[$jCa$1@HY>\7\%q1fYa0,2tOB6)dj$-d'6+sKl)aKWORZm*@$rAAQ+.M,4C1n %>&0T4%JiQ19Nl8[LE9b?*Mkf!(4eMg)Nc`8p7O,cq8gGFV4!s0Z6[nO?Z./@GSm[K!@Su8N9*L6TM1rXgr`mZCY3Ec9Y8rnWu:0e %lC:M=T;'f8/20Gh2c22\)h>aZ6t/0+]JT5T^_#.&'!ileX!Oi&i]&@[=edbaT1hL6jO`JGVjM0Y\kFlK;+r.TGE<9dYNqtFfr;b4!bDs=9iU_HHP&WkisA+KP%;U+ZnXkdi/Fl/0;g4WlCe_X.8"So.9t'?\6r9DW:@HDH]sfQ:FcUm0_HDMV>o[A-QR71%CYN9FV#;D*M)_i`=P\@jYh6TgX@K-I\4\#E+(i2q#86$kmG+ %[Q.=L`I[s!.-kEGEX^')ru9;a$ulR))\0n^f>$$JT(gZPQSfVl)c't4m].lEMmi?.#Ng_K"m8/;[=pbMI\VfsS^LojlcU6.Ea&_JR>H_g]cPCeIdRi(!M0+fWJ+S^`0(Vmqu-#R5'6gG>g?XOt!`,\ZgnZpj[ %S&KBn6WXh^_DGY=.^qE,)cBIbb-Y9/FNou&@27bJ=<)9\'ZUK;n\K4<%rfDNZe1*[M23RYTWWDpCkf6h+S\_[-aSt4&VePd@?X`^ %@d?Ckd)pF-JkH\S"'lXZ_kYA!9de5i&g"t,QqIb=`9JQlCsg?6P"OnL'-/7BF`jJjIHJ(Ql4;N9^5VXgS_26PK.e7CQUSr[0SL-_ %\nhe%'nbA[pk5]kPsP>LofODj6'-is)paOoF>o/G]$O,]`hrr-6E.<63r2dVmtJ6\M.&l:-cpq/0]H\Wc*S%S4_d=%SD8_%hfUpf %]<(:RVc#MK[9ONmIND$FXi4_I<+?>`=ql"S4:8(b]S:B-A:oHVafsBo/1f"h7jngF'uV8;3j31JlEbF@jM#8Igi4PSmUX/MoS'.+ %g>:G8T+_`uEr-Fef-99%/f=#tR->ab]J,U8=N2B/Ud]%Sk+`oXk7k@B9bTXL[7(#J6Y0Upn1GA.Qp(T00?rOoSc"0KV@20nR&AI8 %P2-:sWjYs%c:AA=DH7Lic7mN.?o`/0LFaAX<1cUN,giqPfQ01WG8u3c/D7I2iYJ;L\?&%DfqG1B:3*A7jhS)n`gpFFH;UV4K7_:M%Z)6+,K&=QL/f3Zq.mQe"["f+&B/JHX+E^8)`q-".`H0) %l[p=H,`ro%b^r"!Z"Ri',3V>&0im[MEj7*;$Gi=E$!2u4e"m509=\k,SW%FX=>#^XPsis9bj&+AY_l&S,ir;2V=daWmQrHJ>Peh; %"Fe+;9iWffQt($hGmIiK%T_EY(DjdDl!iVTR2QjNYKC$FBr"2N.#VhsXU=.*Ta7Nc-c0PEkK6P^B`E)hV+*+F,' %P+)1jWqqcU%_/<1(%>AaHXh"$ZqL5o_@NLQMQi$1,4&AjhX3nLc9\?!Rg`:&d?NOF-i>MQKY!.QGrB;+^bp43q=]--haO40kS'W` %"XpR`R__bE?+CH5NK%,[,>K>7lti[u0)D=Uql7*HdhRn]JVVR&9^oXI9`5^m[oDo9p^,pC=K\J(^kpf;$"OY$Z`8I5BcFRs/l?a> %WIjhN8l&nj'l4&@p8/>]0[Nl=A!J!]9X5B?:.WAe.E2q>1W17cqD!q>JbpegP&N@T8VD4U=T>,ac!Yr6*#,Yd0uu\Q,r$8("q\,> %Ldh"CE`@s""Fi!MQ+LSh@3/i<6`[n1,U5\SX\Md:*c5Uc%ZpkkjF?XphZ_eT+9+c3m8`c\Qu`N3q7_b!=0!L+6YKIK8%Gq.:j_`!nIDS^4Z3W6+!b*Po*]*O:VL#_kRE">M]6 %ZYT-%b#or4#h2>JTp]hS.c=ZKmp=_N]0i\](jZggqn#M)0OVN/:F@cU>RXS4H8(*[\q/cM]A)nOV%XbqnW0?]o`\CEYU`_0PCE`% %U[Y0U_0V>lBo.7]?Ong("D`ep'*'S#MP28hUnc8]7@GW;$kfQNQ]f4e_A6?#s/WMI+_P6r6:-e1oHWElFjh5eA1'?Npq3R7j14-/jVSiKEgF_^X %l7=%Z`-\H67GES7bnL@I)$f`@Ko\$",)5BI0[W^Rm%B75GDTj;+-a%RY%?riEn&7kJsj_Zg%;ul_Oj99D,(S$'Z-f)<.e]hPn%m5 %7QcM-1.@V\`ThaD"e6Us8uuW3j9.SVUT^u]U[fk%=B1)0q>'&_Rb[7$0FMD*Ajq[^;uj4jT[p`>CQs$#`TZ`FZZPhF>G8<#Gri6*?k]]#4$-_$N"KPkr2dlrQ`uq=/5TVe#>qg-7/fj_:P\4j*%*84&\qDHn8X>"!X8:Z %;c9W]4A+@;[g#FJ@J\]k"J9b#OPFkY<#:nTT)/DR+Wf/:`Gh.lZ](Who,S4%+r5jK.;%N+!`r2YRF5&'".Zd.Z;@p,3_3aH&.t%M %OGA^E2+S)T)\.ac5g5uQ*c/XB4Fota)+)@mF$;'J_+7a)O]1YZCi#cAX(G_l9,*S0VYc\>BXd3,3qrM-X#b#OZ@k9kk3fkLuCNX3?PNGi'1Vccc"IG:AI/:&p&1A[+-I"[&.77`qRC'oC+,`g"o.^e=r+jVTSTg-J6\,5r.WeN %*PGjW!`pc2mK2P6YUO&-eo58U8>bh'-l3tN6<]!,a>/V=%TFQdZSc]$Lnnl,C-)?FZCZimM!6.5l1J\4Au=S6`H[Dg45/+FCAcY*2qpgq0<\M1/Q^ZM>m-67U"NPTIH^672IW*fC(b7%H-a=lC,cMiX&Ki)6XI[dg'ebj:B)/J<%7UOc)I=O?itp&hP$9'&:r)NkL?B3M/$g6)G-jsh'WI-9c0'+p5!hk,$]WP6+(E7^KhN+hQRcl-F1XRjp845?6<^#+dFh7f,6b4#T1qZk-_V"Bjp[oEnC>js0iP %at3\XL7ke0J?5&fb(QiaIOO'LB)-dUn+_"h,C?A>+B?Ee[[PGE4cW.G:6[C`=ln;Y?+=4K]pof=%9i[0'Vf`15I8UPU1B&>&nZ%! %-TsettD8-Ggp!X[nk_2BX>J.##`IE= %=b&pE_2X=Eb@Zd&,l%3WIq0e[`#+3TU-7=R%u(fY*ao/+:o\+2"T+q@ %j*h%^1[6#M"uAZXQe1G^%,u7A^9+nku$`;c#9pMU%[&r3k!-<4!ie[X\i/5DWH=]!DZhAIJj^l*;abdq %IH+(Nm#=j!d-2CO89IWdMf)F&W1g>6bJL7l]V9q:`t;N^[_f_VlKlcip:CUWZV^^i<@!#Ueo?mMd5=u!SiZe;&J4%h1!^BLY:q@X %C[)usq.6#u&"31_ikKBU]XOMj-:2,nei%`*DG_bJB'UOR<2R9t2/d@0C-:G(gYK;!e>.0JmI!5J<"hE^J#`ee_.<(=4V0oA.+hL! %LDI?1S.:n-61*^QeE`0SJP8>NI+MZ?1/!S"J0\$T*9_Q*Bfn%$eYN>p1jUfY/r,("E%F_q,.itBLB@#tgK;DGdUX'?6X7/OSj<\l %Pd5_h#*QSROF%R:#R2/T8Jrmape6jF.?Pq`N=Z%@VKg-00j,f"i$1Am]f97?D[,,UX'f)k)Fh!_i'P8Y6Y3t#@jjXO#NH@!,2bR_ %(p:Cbo-+tN)MRG[q^*g5X'&_;G@0H"@TcN_SRKQl#o@j'E?3A9Zh!Ne`KtW\SWF<,>k1E/7-$#j`9*LID,3j4gGoI[&/e8idn3M3 %!-49c/:K.q&t0s`JAOh\t0atPtjk1&VLVr %4=P/F0mGXl0BOenZgQ\Qie^*OaOkZD2ot/VW4#b2Ps@1C.[+<'5*UPWJEL`=0^@&@L5>\e&5:'O8YjRAc;,(bbQ*#u;l!0^=4)V7 %/?':(X%k6,.FnOP-?E]_28a)C#E@h6hH^md^-qDWj)h8p*Sbi`k=YHVSOV.$3X+4n.jI(K6Pd[hhQ5+O<@fm:JE@@r+]EI5Te\]1 %)>2Z!X6:+SI-oLblLMX83=l3K6h$Ll0cui:a!)C15e/sSSqp3qmLoqC/?)X)"HMZm!2ZNQ8Y"D>^f#kA<=WRXm[6gBi43aM)+%[B %n3kPhHc0fUrD;EfEA7k(8js.$'dQCsV6^Z>[Me(g\[=^\L^5)g]*7lIG0=J#2\bh&rL!K^Og-VW`U.#"`BtQ[g_=;Ai+fn,_Q.jcBplcghB4JpOqm@'@LDHbJWlB%90[E`-Z2(4=X/W>mfIAMVQ411=[.6<%,Hhc*bH1Ca%(FJir4 %>/AF:]b9'FHu:_C+.41VAJpY#%i;1hUuTD)"o:KJTd>NoaeZOWp-"KF.h+BafHsER*>):NAcTfD@!%oJ=O"EshI$%i;@q5Tdsf%] %j*@gX>q[6#"%aODJ,uE1?ENc?MS78]e&h&55.&?QjnR>aAis"s\UNuD7n-$)`b^$*Ei$L_8Mc!FMsMc1g8aG^Z:kRdA=,CjMUmM- %cb@@EWA(7.P:Aa86Nf`%!m?D^hM\0ad*1;j8^p\N107Qa[Xj9!TdDWRM\5W,dZ:I=# %ls%PlL?/X21_m^QikX0OJ64!'&\G* %'h\SM%!hsO,363RFBJ>m,,(5VbaA9!Bir;L[%EqD=k)':RY16YRQ0qmF3$$COl$8CYhid9'c,oNo.$SkLO)KboC%i6a@@0f[9Cd`9)JH,ko"jd4&!`dS!Jis5*R3e%3>'F.E<`@kkK^Due*HRq/#^Ek:!LAP0!-j/jZk("\JMY_$q]^K? %C)"^c&C;uOAc%1qE*/@k[ir$m'dhSp^5feZRso@g>gIRXE4V3`Dma?2gSX;Ub2>p] %$"BK?apZ;N(J/mWea2;".oi3ZCJgAR4\>Z9*FK&#,VgM$6q47Z>T7d&6#hrGZVUu?USdT]LFb<0&[.`jG6O[fo4"pAQtEFF1u\(p %eb!t6*@P)WXpDM^U1%)Rmp1!dg;(+$N`0S/W)BjcrN'^,-GJKhp*9TJRiIWMM0]aA;S_^-,]2Ub<=&5:;m4e?=d$CT"J!d9fhU4j %Z2C$cj_KLoGoZQXR%c:Uf+d45OUsLJ[%[t"l9N^BZkp-DG$5/0PgQ%!qS9Uu=!:7rlGK1qE#L^7TrGOW[9W'?d'r9a+Gu"KJ(>TO %A."?[E)Bs*P*[=.A^D%ZS,UeSJUWcLePm22f3k2meuhh"R]>hR<3oNQL[],j"tQ,%igPC1ES&/m->Xt):*Ymh,C9n"=ehQ2#ZI(l %[2)cn:A%_J-kf4F).67la,6g7A'PcgHkD5\8ghO8KTd2S(1Xk?#(d+/h2ODlY+;_$6%V7?F %XAB)qq\[V_b(K`sX8,;I6b\lBW<<9Ihf=u=a$;tcNHMaEN0"Vk6#B9YTajdo3VLDMq5aA<<^Vu38W(WJ'R)J<`/7%c%U)@lVrXFA_7Ad((pZ,">2ZiI:j'lE3)SYa %s&j<(.0cTQYV4M6FWtN%`Thu*(4aF92Pn&oT8'e)P@q/^VRl1:XE9CDF`A5;M(?RR&bU-Xa>loQSuQW[PjY9L!S7YA'sVOB0a/2G %*77rS6\esDln+E/_!!#D0j[>L_-IgM"3uNkES1qY9GKTk@$@Uj'F&>?0juI%N?YtcHWR=Bk9B;bJ3.Tq!0Q?.]R1^K(S/o&$#+m`0aS=;h@aLlnhCnd;sc%tu().=JlWZf@C9G#'F %70u_hV4WGh]Z2_`Y%$Oka2Eis&`9E,"QJqb-gB3V=r)pOf^(akrXH2,%L%1]EGh$gg]fN&/jEYU]hN6Bqi.Em%TMS0@735:Xtda' %ocmWJ5"o79_.d7#Wr2'FZ8B`Pe4i\Nn*>"DJu"569Ma_E*9, %!o$[nLfPUA@D]/_.2W^Z[N^L]mYH.Cn#nLf6SCPrPIHA-KttL?E@M%PB0iNQYW*UZJsWd5=,*3B^OSCpinXFr %LiR_OKD`PCo2hI13J?;.8_<960DM-c?3dsb5k4%$DDn,^n4'lCK5;bU3@oO_kNW\31R'&4Kmn!^iXROXX`_d3a.6Z%?)9\Z(D %MLM=I&5m(@L^[30IeGcA(*]7di:b$$5]qg^#SrhXo_AXqfK_KHZH6I3D%YrN#"XCb&1d7=-r:M>"N_u\G3$CnK/'Ng1fn2aN=/Q* %r>-0N]6J*.rGbnG?PS^>[_b-5^G[W18-bM:qTKl7lH*j(D88Frc]!K.WU^j^7'>DimEO^7I"mlg61s=KDKX?50^J5^212b0>afAp %AW:(p.R-A('O(5R7D%Pg7AKhQT5LfAjD\N^ZiUA4&\H`Sac6L`%8jc32=VqqVsA,t/EM0? %'p0MijkpWH#.),*%P!64Q$tIe7j3l2GpAVD>N&1H4:!"^:)aqTP14fr?sJ;[0+c<%V(laSOhffn\G"@ocOA:`_F',*&kO48>@C0l %'"0YiX!H@<:td^B,1oGXA`k+fTqKdUO%Iu<5S==L[CP\'=GHWjaG88aKAGc'3sL6<7;5c16S$e5TeQSgD'a_mTkpbbW":?/pYg^$ %C#u=lT@oN5O-fZt8Oo&E&\qm?;JjCt\]I_Qi(/Ab6LD]:o/4T=8T`&MN/,^FAG)XrFie=F!,#:sXu?@mX.9:8WemdV?WA)p[4Y?u+8_\[IEu\?=]Ddgll*Wp!^`/nXe[C39"t;:=#*#M'FC6u#,(KZs?=a?$RQ2pt0_:G;%0=^:q3Qk_>!Q>X!j %OlCK98RMas1=8Itl=Y-(%$9F-;"!T^e.oDZ_.'37"hDL9bpkbuo.q%5.iUchXu^2`AHnaP\&F%f;8O:K!)R_;_qd,.-0PNdDDKBb %E*,2[L.?;rZC7L);cE0$'/in'j!+#B^g_LrU:m8$o-u=V[E;CgA;>oR'bb%X.]i+WD6BDWp[^0K/X`)"\?j=9(U10uCMLM3RA]"E %`#CgNSnj>PNS'Bq\[k+,OY!Im?`F;PRF\R0S*H!%0K/)1:a9]Eb)DLqYb'&X")=^R$.tWWZ"4,fF6J`:M(Kj^2Y,5D&'V,N^0[%B %`Mg.E'4Z)YG8/hE@@i^8/1WZi7RrhRb;tKR#*1b?H9PKq+m'I7t`%@?QRHTtOCFLi+fJ,\l=6k,o@%dX[MSOdLRXB?cGt"%[eBSlgd2@s]-Am;QFR(8sqZbpN %>(D%-*MX?U!HBD@f-o]6#ImVV*Mm+hqiT]uo`eHn1,:&]eKk6A.2Z(+,`E`V3]XE+%i'!s]'E'qN`egUs3nAs+c]?u/ZSYjf2CIi %$e_ao+jE_R4_n<.da+d#2XGT*Sd+DKl4D>4],R]hbj%t7%[,.?qNpUD-_)DaOpnu %1O]u[/3Gc9TZ!:2KPMP`]+aO92(SQ:VZY-L?0F %kslLXQC`\(%%5ne+cDiA_Ipa`.2oqAN_`MuiKS0]a.14?TN!i<'&=F1/gQkB"-]hR(*q@;k%7n+W+e4i;F%N5/[U`d9%4'9m5+oe %ufpB-ShdKZFeIahqLr.K.7R88]/F=#BUA]!7q2]=QJkLga$R+e2AN7NX,oa#_pu'Mc-6J''F3G*`qI"]aeY,j2a0$ %Rgs1Tf;^__eA(%`ZKOQjZVh<>3b:?heVp`-i[2EY(DI]$WfS/\qjFFE4$&V6U'0)H$n]=ULQT'OLFGbT+Yl1GaS>D.(HH8g-HE<0 %e[)87r2Nah*L2gUd\%`g%2Nt^iX"g$Ls##m-'>76g()2(Km3cA4K.9%jq;C()`ttV3VW2PZQ467\GcT6(,%]?"#Hrp+EHP;*Puld,eoA[TDm>+@"UaV\2dI3g>c[U$$f%6e[7fG;A! %GbS?k#'a!J#ITuT(j^nGQ"tkQPhQ7Vgbl^$j"$>=[W^gU,,+*MN"2u@-lS%4%G`br0Ns&"eeud5j%l;#YT@9GMh35r)cG:lAeO;e %2tQ,r2-f>rNQGCo*tC2KM$b4W&A%qe/NMbH"2k8$3*bFXNEF.ejq+DnE/7Op,hi/YgmIT.JQ6JeHA&HQ4*!RRXfe)$:@^J))ETORE?__s\YF@]aln`H2<#]7G8Uo^u&R6uG7BkAjb2`fU>nla57WgDCPGk_:R=$i?1Uq\@R.RB7FP %G,L(Pa6og,\rL+`V+H)57Grd/_q7W'6Tto",-MO7Ni` %Ndf2>d1,I227XouP19qBbZrme9>bVJ?H8i=BbCYM9*!,EVVOJo:(`R,MdI6FqPVI3BuWV9P\ml\,aqmb"cL/BF442ms"88a&=b(" %_mgog)9*8EH6dF![*CC;ocLU:+9T'k0f[.`GZJ!f]3Z2emD[+m3%pdOCT:'Y9n"T"7caVJ@32/]>WC#!fitu5Aht)NPp)8G$ikt`9:Zg\O\k9R,6P7nCB7MU=]45(inO.AdXdZW %&:em"9iPIn1AjYE5!#Pqg.4PHR`Rp0gGq:W$YndtXUCQi;AZl2kN&i+.2D<'2L=q#-]m8Bn=+m^(\1NHXG;Yrl6&jF1j*,![41N#AQ].qMu*mPB!L:^H*2.N?\ %Tq%'e=A#]OF""C`NE[O*$B461Y;;IP]^lE_O\g.=bN1A@DIo(,co(GJjhd57c;=:E8J]a+e>BgrH]Z>&iu,$`bU3sq'e?"puh+hC7>T/Sh5j8d&) %+HV6".SDVe0-0ep1][mUO="=iXUTe=L0mW.%p0D%a@0kX]LWP2Y%G-*_STc_R1baTBm+Le!-nZ7&BqA@:X'LK/t&XtPO]D2=$/ %`DuS8n2sbUc(I,Xa?;F9Q8363^$-*Ok>eoW@-Ed5"_2-@3`T`h0a)_rf3G=>`=h"ABgrbN?X*^nXGFpl\:t-9@m/!%XOK;^'ipcc[Vi#&:LA`dp@^@bTH5MnKF2)o %4c256l%16`N9=!eP?&F3J6/#4pKDc;@#5c\T.qKk#jaAF>uRP&0AZ8s*"?'$BlQmL;%S"EAOW^MgIa7/dd/68,VuCt\4I"18&'G5 %aE+u6an2s;!hi]t6FIr>7M`s\Yq)OOWQNa8*J&R-GqT_Tj&oJk\M[U=lSir.="$%,,`k[-&esVgT.i*:3YPW9\pe05Z;pJ!a]F+m\4,rpR89?d+="/j:K\HO8q.,8eg"bTj\mb"-c+KPJ6;QR>^WPo.Zq6OKfBe9iT$+ofl92rr %RVMT4c8UtF@A5#rA%rnYlT*"s\B)eA3LT%V`=853M;^Ep4pbgMLhHODVW>tnimXb!3j(FDb"N*XGA0e":,4tN<*J3eD@i*d`X,!I %#$\?_QYuXl.W7cP/8GE/kq1:`<.F645aUH&2IXp7=[Ui(6V?!cLpWZBT@(a\hYla<(nQ@b&!"l$J\C$7_h0S![_)WIuKp.(lQTQ#p]S2[=Q'"DWtoRbmD;hXV6U4Os.MT4E<6hqEK287 %ChP=#LZk"G73e/B:Z@>9niObo=GQD$9:sJ"Y-("in7gjc@lYFF?[5F*U_LP%ZmM"=^""WA5p@RbMH>%Z;&Yu9*_k99;p"a.%0Dt; %,41^nhC+.jFD&eYO5@lnYs?cC6EInA_5;coWZ.7R@RQRoSA99&ER2r['@M<,A)3rI[LNT2Oo%kq>KD^l@MntK",khhEJV0CEi*k% %8:!25IRtaFmac-S]#JkdD(U8R6M4,5#SC!T7MG/E4N8Y$K;Y5KJ' %!D,dAZ78!DC;psj)a/nX6rk-CQr))hU70=Mi#$!9pg:9lnVSfY_(97OCcK@9PG! %=^PZ;M,\L+o/p0IL5?stgUs8;@jc%$L\nHdap?Y;ptNJ,Oof(dN^ud$3Y.*78XNgel'O*KX!0hLp4Gfk?-nCGK`sJmD^tW76U;F,'nHu` %me#'4:!-,<%RB\(a:+4\Og^Y*Z9jd(bpEuu\?m?H3fJ/UJHVEM<_H;RQZfup&3c6GBdS476HctSBLHe15WWEZ82/IW+HdkmftX9u %W`C.2;lp79Fd`AhL-d:M@:!8MVPL^2[d>O_`qYuqa=Gag?,Wq"\khUq'3-khd?2LVLYsoLn%C*7dO4dl=CNOIJlX]r3UeVh:T.U_ %Z]u:'TufY+_5V5R$00(bV:+ZUXL\gdtX"%V#Z!S/gR4_bUdi(Lr#b+]cZT2-$]hGQB[=`V,u#`R7N(]XIs+Kn@gSeTFX:pf.>QM%G[A0G=i$ds.Gh:":$R?GM;UVI;2E1H_^oQ5hd"Yb8%A7=T"1 %FNf"Elq4sEK5/P?H"jfB,nsMph&DHU@3]>9[D%!q^_Z7D(98_&^DFZ@$!!G]5,Uu!o?liVeKer)W_Ya_\RD\:91QSi+mO/c,T-': %4#kRDb1pU.)2'&F(/Br[3SXZQIHN+\/e_?WV)Car:(fW$KHU/@hTr6C!r#H*9&#_M#$)*ILS?=;2?c([pROT)=AbWc_"GT)Z(E%.qn9^+aZY$DHBW^7TorjXWLYGJ+N;(Q/] %oFG1l$_-Ve#\,AE:5uk4ml8EpB7],ihYE_=^%YYmIE(r^#5fg;H%HB']$JM_IrEIiDT,stW:4PcorMRsE#i(X5Ar!ZOY9f%.k/=acbUh.7"fcU:Y_8J+"W'reC1ItOEfO5EiQg@lkS`fgO'edG-)>IK:>m6]/\>H"Q4OPZ]sjd]-;Pn:Hu %UuW\I/MNW_Op=4aVo+N*0$tr:)$7X4'!o%OrCZjTN]ODL>%ueOX@aIQ@.A*>kd^X[<"Heus,>7FkO2\3%SP6hPsj7?WcZR']fIhW %cuZ?`-Z[;6iiEdbDW_o0L1#4RigU5X6K3'&'X'7&O8S&u.4>n_!pUqi%bXtM9d56KA+&aHmC+4lG%&BtL %898>pH89^5Xnf@QG7>E(H+!"-ATE+ge4pJN.Be8:SE]rnf1.[0*%5d9s=9quc%&>*@M!l=/'s/r>4X34.llCihufpGVtd9H%i;R1l3qP/Rc/ %3"R@"3Al5_Lu0<1E'Q#RR+pCnif($:eeJ".D=O2Jdd/AmL!;WR=TB4Y/4s1tcBoG&-JO6O7IMQUq4tQ %G!iP6]st-Z'ZHlQF^,P)_;UCnUR%]P6HNg'Iujl2RA:m5+#$]pem>g#?'Y2:0&A"'dF=J&,U0F2%-!d<(ITp^\g$FU*TE,I8r>K-=CVbfq$o:50OG'TnQJ($E#6,Mphr9'X6GmZp=F[V/89e.!A"?.RWq5WK9E%WX&%,qdg %11>I099_rnV8W41:"hSn$,a9*#OOE:/24d>1p4&e&5V<4Ieh,jS,I46962J29X\7pD!]!6)e%uK0_QD_S\q95fGUroOskoK90U;?l&=N'Vr$R84VR<(N,YDFP3X!$D!LfQepaK(boB%c.u3r:fS;R]R?T)g-:%.2W!!IF^g>Dmo!Vm6RT6#-(57N"o% %)"C/G3o=*P$a3Ulp?G,G;l*7A[rVmMVNdk'.Vn^d(iZ..#J[?Bj0Q?Y#p)gpf=D+bM>k*-:hS2(<[ct@'t$?"Nc^NNLfBA[5bfK[ %%=8OeK@eG^2;0G=.-ja\DTLtRhaRk&gXB]W0b(9-YoV327*S,.es^6I9/rZXRKXoHSpE=`)l>25ZA)ZYE_/Sb;&UBmSLS(VAQ+Q! %,,#@(*;4%/MV@6RDs1K%$$Q%S&bOO2hAY_oHBV?4G=[/"LNS5(3^SRRU4fkoA_?19U7KDc7\OJamSVi;BqrT:VTk)EX`4/a3T!Wk?C68!;o089Y+\US<\J/j=4-nXhV.>j %CILue_[ni\%PGU@B8R1]\BaofKNGid":)8orqgocECNs+Y`E^/'Hq$d]kFsE2qt)WLjmVu!joS-2-p[Lm*JJ0Rbjl3G#X%*Wh?kk %R:Zf-T[$Rag't0ELuIZ$IP'c=Kn(%F/>A.Voa!$!@Fie;>a)V[@^%3,T(:dpAs@@(A-7rY[i&[=[EGcGE0UIjr6@;-Q"552RrRtZ %#S_D#CJir98CruF[Es/NW`R %]l_F]V!&kghk<0F_b3)J6C,AN'F18(cmLqd3gckO4@rquODQ?]3[%k<$Bu6N]C$E&q\ZfD,IX+ZDfY0$H"o=1,.Ui&086g+.Hmk+ %4dFaq(99e[JUUqQ2[$>bEktAt.PMS'LS5n.6B`TLk3h371%)(nF_5-FA=,OVLS86D%KVotB!nYA`C+*qZ%s_^$$QuP!kO8SgRmKW %>BMVQ%=@E::P8_K",TS4L$O\V#4m[?86cQF+G5M&c!p.[8+[atP$I41)BAus.Umj$`\DZR\:-mDnKH%-Q7I]/:L%"nG;'$nqg?2DF_T>[Jh/[QVl %h:*.U7(et8V@2@]PtnAjb]%GE5AZT\P]Ch[3)G$Y;aE>Kc:a,O^e/4JW?:C>s15nd00Jo:[q6@H'@E!3"S(mdXTdPPJ: %=06r%L"#R&k06<9G7/K!%uDGJB0jC&,@32%;OG^!A&5juUhRMXr,L2G\u&:07>%99CDL>a-Z+FH\oo+bt9loks]CufPG!0@4=HO/ebcp %;fbj2]^gCaYfW')@UO7HFfRs'W='u[CS@oiWeng5X2X@K/IW#3(]?QSmB@'':`MQZsUaiAZMu_ue.'7_>$lW(W#K'MHOMS]h/s.U4`lae@]m/4#>5(3JH\Z:1e+U6FjP?gM!>JfYp4Q/Yu>C<8GZ&?B`30s6s79K*%L"oomU %/iq76_r-=+D(Ar:[5q+lbam2k]Jo/YK0BmN-M5&lB4Hpl4,HNNWlPo-hS`tZW6\Vb"hPYni'(V0;R;`"!P1#dMWm0(e&'J-]84'^ %VIJ)MV1A0#/]>nGZ\qA$l7SgCI^7+%-7,ON-Vs6E*?E)j!uA>J*hiPY %1t(gL?5rRg7DD&J%Yk9OB#I^4*'L)h>K#&3GU*8Jno?S!ZAV>>^BZ0rGlT(VM\/Lb\o]e=$B]X.,fjOR)C!Da_(5T)rD=9Q"\U+hTn0_\$.\ %J5J8'd)@C4,rVCL%>gNd6P?&7WNNG7&uc`XMO%]1J'!1a+#.L?#Rmam*@]$2=P@(PVZ:GQ3K>ggq%dG*F'#81_41ueCYSKNj]h-u %Kh8_-2A5fOP,ZCYY<#0V<3$?[mOQ'oq+c'Se5eB-&lS>j_jY?h0Xnh*NdWLFl!h1LbT1L2`RNBS%n/C(_-RX60$q;]G+&PWa;pb)+1^U^U1EXtb8$'rA/e\iN5D%^^ths) %KnQLf#+gEJ03[.Dj^l/Hqc"IR2Q-qqA-\55P3hC-se_lI=TVXOocK%4uL?Jt!uR>hZbSCOsX.L8qV#A]prEB@`>W %C2oH+.Nrlfd>c#m.7W4"S%AYI`?jguUoIML(?%<87K`;u':D1SMooMOcYkF_jsBQ]AAk)q1>?@>;#m&3/OYqAsJ:QBS1$=;N#+5E(I@SIC'MM;>s/A*XhUa %@&VF?#kEb4mJt*(7NLoI`>!s6$.$Sd'mGC[MMh&e,ZBGbY=sS=)pb_U7UX!h)Spm'/eWh=[7ke*%@:Jbg;+X>!F-49D[Aq(0B/"?a7d1i"!2J;=q8PZ](_[:-!7MCo/ %!=,&L,=Hs;*VJZD^6Y\tK`Ej(6i&$D*@$Mt8\^U>impUt*,6o.5H8Em]!ReT& %.aNsOj_&Hc4='j*msQ+oTh70Nnb9^cJN6/fQ+@!)cP$q>kq8eF2:'&.# %;].0!)q)j'?,Sq[FV(;TXTd8upajkuL.Q@#/8-TYOK1FE@pDD("D0rQ4P;=qcad?J$`[WkigmsB=Fn(G?M*eK?OQcU)Q3(]V!/UeY^tlj^ %I/]Wh"^EYFN/F#;VG0t!"8:_Kg&g!OUKN9&$7HdM %'j]=CVa*^1dF$.HHmuik%$`b.HVl,lrd,H[jc&Xlq$SO'k\@Kd&K_9 %_m5)<,(p_#\(#7n\.Nj47&FXC6:8SuIefKe72Dd$i<.ApmCb(f$Ulb-1jZ5-**l\oMCq0]V5`V>LFbimTJ]`#CcQOb`n."X4A1nJ %G!]_J%8t#G9*FGiafC(Zd(D?__QQqFcrC07)e#0fSjppDPdnARb*V+4;^&_L6oXkC-$aRI0`BuLf\m0So-QVLQK1AcCi(Japd%MH %Q,=`$`muq>j%iX,RmlDPehYEHjIEZm'6c5p`9h#_[C6FIA/uk6Le:@HROL-bZQ8VmPl3mH!MCc8(fLkb`65W>-.Xu=Xh`r&D#,]N %)8dFM?"f/D[9RUc18uuc64EChM,t2&C8raY:$:hsOS;kJ[^VRBA07c=iHQa7(m@_(E-rtB-Z6u!p3j8q=8Cq\Jt@R$g7V%:(4N^U %@WD"T4[qiPHS$sTjNGSn/L!(e0nAp%8C>%t-BK%RB"s87B`NER^'D6RoaORc)0.D^HSAm@NHMYhA"OqgFj`>aEAd.* %,j"`n;fOoU7@&]prsA^7''-7Ge?8.9;fel!qF_?)FO`f;T%S9[;'\kQc"olEjNVQW&lAtanYpdt)qW6,l%U2r?;(sD"K".&2[\LQ %Mi=<(P*Tg\NDARk\6-V!:ka9-`^sIk[J0U'8'-b20eVNP,c"G7l5g<;E.dQj&pJ!!;MfWsaF%MnHc9oh!`A4oRW2i;GV.l]N)$oN %R]JBM+Z*l%8-l>e5a.$,PJK!O%&tqT/mrU@H9="rd<*n(H>^j.KsLPp=+_K#=fkWTjD:bMJhVmKKc9A,>SN=(._'O&Pc?@'ro61' %-!d6@Ls.$_To_$t.^6_QbRt[c'E,Kn)@@*b26.u>6?$R/(?#!=^(eNNo'iW2dCWH^efM\N,YNSQip8$`%0fu&CHW] %FN3,K!Tujc+YIO]K/MB46#bn!&r@k7O@=s=U_ZP"c=?)fnnUmZ68qU(53<5`9HN4.)FlIZWO8dN8W %:0i38`.=?`6k+kc&JVBubo!n"*;n5=jE=fO`NF"X#o#Zg`;V,A%m2qERa7RH.;9NZ[82W[330e?3VW)!?]/2M9gW4.&URFd6X.6: %Z1a>&*uGT/QPXXNQ@:-AF("43W$+9im7H,XKgb %53?W8X/:JnX;VA.WF]89$?VK.2//(9FMeG3XR;kYajF9NU:r$o\ch],U35m!?Q#`:L*;1rN?"rPf>KsrkN9<8_@Jp'/dkqml7!gd %$BPHeA<9?pI*:.$Xb^[#]aNg %%]K@sNn`Ws6(+_8:\d>aWX2X^3-H.:>os<:?-KmVO>_1tWktgV?km2"WFT)!MUYKKZ+n-:A,qG^ngRoQ;cOR@B2`3QCF-uLOI`&3lE0D]ZfL/?&0O:L>=<*PNZVe6@h9W>"S9'i=0`+g %Wb*F,)_`ihN\NE0:H)gp'L=D-.Rd")>(pE^_>RZ(.R?r@kbjbcq,3T[dQ5MtGZ;#*8ppl:.fCa[cGJa%qfn=cRhDsBhJEG1JRKCm %&-2.:0Y#=pSm!F:QVsAPo9#_DG)K+kVF %WAE+^&R'qQZtXQHZHVtQm2X,]!8lH@FGR9pfI=ZeEN7ciMfD)N,4X+%,H/=,U.T_Yckq$,QEPt2MRQoPE]&^W8%/2L/VAl5,"P^"GMZKr2:K?KQZVho<5V.WPFZR.6OW\/?/<+a1bKuubAs&,*_f,SXA@D@.']\`,[sU*Zj(`NaUk(0L %VQ!8;hKG0+;W=dWMS#8C^^_G,!Dl]QH>`4pMsKS$EEcZ[V>qB)#_3k/99eY7Y#;po5agCQ_"kN,jG?RPH"B&]92Od6&%UDhbHN'H %ghc@nemqQ&XZHhl6Nt08<9s6Yb*>/"<`hP`W]_'t6s\!(2_h1:@V[?n$?U(PN!LW-_(&"Yg8WgTa\#f7WQ899kCUllR"9 %G-5_qHVTnW'e4$MVqXkd)3V*I.^bIR)u,177:;"qn4?!KQr"3^i[^-jqd]VC!e1Klhu.$-ljfJ$"2t$C^eIZ^0k8hg1-=qD^E8\* %&ff!\W&:GrZ:rpg##BC$-$dn((gJib1"%JSK(([Zqr5rCPAQ*+\9LZSEG+ARVF/WjC"&N:Mci]a;a8dDjD]_#)R1DhRYRrb07rgH %jqQlP"3smu6"\Xf>QX>ph3C*N*AB5GOAJDL^hO4(^?^d#[g(A3MqN-a?d0S$6Wfsl82;-]OJt3[Q:87F'!LH$l6FGrm4Nd*?g>C; %ap&DF_4ZPT$R'W1F*kmDs9c=YeGo_#P)JZ80\e3gYdl.!4."=BQD&*$F&mcH1'hA)7eRJc6G5]iAn\I4H.Fu+A=*XCLM$,Bet@@]i+ %93SGg\:`'6JJboAaI4pjD=^1E;(]X^bR.O5@&F'=+^CHJ(9e>Q0fq7iP3F;KR3MtHTE=9gHH%QVo`5=-@sI+<@rRJT+iBE9YB&=< %db-Ghi<878GR(KqK(&T#oEC.U8XulFfchhB;mb\`T;29Z;]!n8dq?TsJHu?M02R*ndaYB$"=!nZ_-AIOpFRJ8TI%q'#>GIm6-Cf; %#F;nDe<7oZOiFl&hVa@:XqGZSnJlKPrR-`i#>o>hEue$>Lj#@U,r %,&!.s:`O"1:%D54S;nKh-7j65]PCXn>SSdb;LeeaKPcECP42lfS\d,[cu$98@U#RuDR#2-f:bYV:i!7mBHP]^3oDXd=#O4b9k"J\j=6Eb;k-7L3PQ`V/\HNMB:..J9)-K_=#E`-IdFP?ZdUr=gW0*sW %C=%=N7Z3JGAoLQ/=*%uh-3_U*M['mok\aLg*9^<%;9Hb9&`.&D``\B;\UTOJJ8WkJhZ %!*nJ\<Pm)+W[\&82"n,\%VhNV,)q2U*A1_j;ll_C'38(3`DE2`UpM[VgYAaL`P_iM %@:R9W``/mL/Lrk"PeVj@f!U0X$%1$6>Wtl'XI@i@hG_2/]%`4#8Ff0#J/j3ARq9#u]fgtoP;FL<,XCf26?V*7&lr#\6;<'-a;T\I %Wp,RQTpeOaR:=XndN(iX('o.e.7g9X0au)-\a3A`m:43F]WXj:Ho!Ql>0i9\2ju'q'nA=M2!Doh(27gF(aHrZo$9oliH>?&9\pamSEN4!ADNNe!:-0pH`MJpA[HFmKd(&0*;<3ZB9d!$Tbs&-Tb`q$,J2Wg<-H %99YccKi?kaS5k,%"dM-sDS,uj2'AgGMa]h\O=<"p]Gm1Tr( %A8-29NZ4ONj*AgoP=4HB7TE2fnBDStIorF5InY@RVkFZ3A2bt)1k..Z*F!JLN)a!?'I5?ke!=hnaIgF_APhEuLS*H5?1_oYM",TeoKf-%O\$9.]8r'a0G>Y)S %R101h$B',?XM`XD15Oim&HkP^d!KHd6V&FVF./r]cAT!Mr:c %?=lf?,Pme-o9_Nn,cNk`R[2qZQr=$/i;'%AOHBcD-oDlMR/iHs@nS-jiiJ.olm\PL)]OP#"/c["(4,O*K_Vp0[=@JS>45daDFa %XU,U'A/o?)E2%te5`I,li:JdLc_+mi!VYEt!.OZ.C$MR)h'+tEEHeoMOSPc+T=j[^/N8q(Lm$^[7&Gk-Qt"%Ogq>Q&1?+b\<\Z%T %Vu\UOCPFH_'huYNWaO7&%Y5I`)6YbQLbRRd3dj5@bkXkCE0Ai^Wj1oYX?].A59)P"m_)kEG%@W.ncV]G\uIrKS_T'A@%\nMN7E*m %,GcJTl2igAlf52C1'ROd<^D_[Q,YH!-.0Dlr$Q"SkG:-Ym]Vk]%*Z3X(OP(OAgoDY"OVREo)4P+9S?GGYRoh<@Am*WdG\ac(r-sh %PfRd7r\Vcu=^3]#Z'!RUiR1\PP^W16ED3#?1YQ6.'98X.bCe3JZ4K)T<;ghqbdpG4&n?PR33t>S^/P!>L3b2,YoAPPip'L^gU+/_ %]+BBbfG%VVSO$AO/mG0^NL&Rkmii5pjb0Kk<3[F,b]5F3,lY[F4?@03Lj[CgOmsprVaI7rj;#e48/0<,^lL^&cM)9T<(Kj!M?rJr %9$nmk&YshH[7[aXJ3ks@=g"6M6T@_4R<_mB7bNVRIDNIa&WJCV_0AgQY8TJ %J'bT,H2KONF^8X\JBi7m0[kp[@Zr^c0\,Bu4MbiXM;/Mu-7TTdbcIu$VID2F=X^$#dJi0qF')Oa&Qii>aU"n0J7I;q7BDMH;8=Wr0uh=d10$Mg0>A9W=%a-RgAh&0!t3u:(s2odS;1Lnee?cp1Qotb7G:A!GlBILW3?'6WFk$\JK?'GnserB)5M" %6!1T8!$S-MmfBG'euj+MGD71V8Q1mD1O/BM]oL&^05ib;(_5g9>+6^GMIE^tK",h9XFUdq"uM@48#`)U+[&h1bN-'6c4RC=q34n1 %#MYPqW$:c/DMo^";tPNRS:]::Lg[bu@O9rM-l,l'j.^L9?>V#Zb_d#c;bEW`;;dAK<0-s8[@ETEfUOV6IYj/@1$l,8@PLG(e\iWI %+=\r(Ab86^*RGJ/_7jJ38JL/g#0QB,3t($gCqsQA#l1&2CAa] %8h*?)d=II\F\>rcWhRb-'dLn4J^0,rZW,@)7CIg=Ch>8c(r#e_9<)unO*57hfgbTa6\3W=2cFe%->8lAW+\Ksmg$i#Y-bJCn*Xb(pq=2+Xm9j?Yb>.n'\ESh]/NSd+TT]R6gW9n>&(94Pb;GhrI9TI5iH5@7n %.a:NX1U=p71GJ2]aWVA.P(t?t,@Z92ror@l_4AG'mZ&rh+e.%s#T[>Wd/G?;j'urY;\:8![].Ida#=DTi'4uWV,^YsN8T1a;_h9B %H^GOT=:[EU:#5Nl#9VE+l!Y`uAIW:Tr_R+gU:+&ieo##;j7RODq#\24@h5ptj088CX^MU99,j46o;8t=MHGG:O\>&*.Fu]L%($m] %.mZ\dLX6*RB:4UH$f*%IT-b-r+`Xs.K&D"[h%MMS(-O'ML,Ca;Ui0"0RQkOZ/-6j&b3GX9Z(`hk;qK!C6&Qf<$;C%1!Y?Pr=II:_ %DcqEnj/=C!VF7KA9n'&;NTTp_1?/(HQ>!?pOA]&_M_q&*m++X;RpD9FbYu!J]N5Q^]O2S+)$'C^,4j7tC,IFsM)`jKI#DI&=Re+G %@nU]V$&94D3B5':R`.[-r!ZM0Fpu`lFVqpF.9\8c_\%#NGXleDi0kiR)C4"8-s6HkejRWgeT8<%P%sUG-+>jci/cj`\o(cNq[dcS %0S&i?KmM'^&hS5/GQ#ffh3g4Ph<(GNl]X$cfG(9M&8l\YPN&rDP-^G]R4$7U%paYr'r-6J6eaepdmjR$.mY7<$4rr5QV_Y1pj)2' %Zat3:8;:P,`L;cf.Ps),K64QCB_n^sm\-"'c>S/?W2fG4nJ0=3)#T$A[]bg2`9D4*MG-cF^..c%m*BoeC"Hu+D`o/-n6-j]J? %I/e5o1NbnUD*WmOIT[niDgt-fIJ(7\oa"h@hEI6.14\Z^fO%4`L!1F:MKV6pEJ$1Jr26glS&\Vefn/B*4j9"[#0k4H@,.t+@em[L %A.bQ@IIfu@QLhQPW`@='Yu>FP#W1lC!AQI%p,*(.V^>7%3$H6g`8t7=.hE`e(F-!dB&^FM) %[Nl>@En5'fn-fn"V%q7G;N^SlB#+>^3$J&J$QLKW=eBE(DgOlWU2g7"ko5:h3Lq.U"9l[W_jGl,?pJu1$8_g_SR/%O`VIpf5<@*B %'PigE<>5jQMYQ@1^\l3R;HeGm2GgeQ&iqg]'+W*!WCm)M.%G:,<[e%`3`EuIP2cD\rkUb8]AStK2GCObcUp"[&5b-QkKs%+LbN97 %S6<&7U;>IU]R%!._*TV!=l5T@!Mn#d@WZ2>(f^Rjg#?\fm;Vj6H2"m,ak>1*9R.Ug+V*@fn6uBR:hfjV$QOds0HM-eanmA#l:a5r %nnkV<$BX>g7TLpt_9s!G/Rf")R%eT:Z=%cccDN:gG_fX,9k2)&dm<=-jsl:JM\Sk1_pHgDp`#qR68'hQ+2=:DLdjYd7o<7mUdG!h %Z-Wc`@?Cgh\pPSJ4oFei$<"fL85MBiKZ$iBQ_HqAg4i\`P.q1V)Z[/p15oLuUqLP9?2_`O %;DCh[_Zr\=cKPCeU$p'EaKSJ8,"\cZl-O&o9?CN7F/C33E"HH3Z`n+";cnQV8h"b`5.&jeQhNq;j1J>Nj6iHDeg.-oW^rZRVTr$m:9%WE/tKO=9K&^abN[4!eTna7/_S"!ejYJeFl55dM$lHD#.K.54s %DTU]/EPn7^SQ)dX7%*>!6inEeFjI76S5.DgSIZF1RSI%2B-%2[D5h!=]'dQu %rt)YE=$8uC2_L4%`s#ZQL6o*"O8BG)TATXe?[Vb:s-:@uoe6@$^\XSfs8K5%r]gA-J,738r0r32Hi+<&?h>F>Omt:5'dp5l548&=g1pH(o^/j^+9)0sO+7.9O+[K*>Pn,4^\r*N0n&pp4TUeaK0ET4\TJ %n;_fr"OsC0SK_WD9JSjG@1M[H8/J':-8\7*(E9bL=?rOuVAP&!bE0hlP_*LeB/6iM=3o*q5C`[#:dr>H.$Y3k7ZI?1<8mm_iBE%5 %0bba,s(l#Ss/`OYRe]4#+OHSmKd!`,du_rFWNZ%YA?#gI2K40t6S3,2aZE&SCKq,o#V!+I\uMN@3grnYj2_;3TYdFVLe+cjN^;[S %0Qh`KQMRE]cGE\JoK[)1Rl_i;+[A3+TdaRU"RH,"TWhD[\KN#!NbFqtS#>PR&VO[PX.KXgRNSO0'B3]SWYWTHAD-"%`S$0#9GYte %G@Rj".kW=A)q8-1F%@#aU*a$nmKdq?.$B1*Yhi@>;&j%UD,I0srmV(u1dLHFFQN5)AB(u%j:L*QC?0oi-Z+:ob$+\]4AHHZ6Zj9b %l0rt[i5.WZ`82dPd$!U.:kTSF(C4-h!iM]UdgaHJG1;%eT$lDh3.=5:9;%\e7(%gKie:B`7A-0Cir-o[_-5l\0jJgcT7<1iJK %Bgh*hdVVLOK3I]k]O]s)gH$0<92e,1C;H"QpTBHc#H8(&:1,%i81X$3t1#c'L5V8`,<]<$YLT; %4ph:P61.A\<])[:G-bbJOk;ZTU?+(A=JF_+^mr9m5!7.G5uKr!LkKm^>QR%V&=iq+0sBIVm=OmOg]EBp'#laX#8uZ^b9m/r1PEIML:/f(ga!nI>hSMIA\lk3#6^pN.p\A %6Pe2Xeh,dE+?1ZS/n^&`gFWaXYi$8t-Da08A=9 %dTFZDn.6TnjOQl8,E&h"7WJ$G,`TO]fOFKoOPRB*e7tNH-?$+>?H@(+/[9>""q(rN>Y1V9=qFtQ=\!F=+DpfnYCj91DJ!e8&1mhG %,a,ODkq0\,[3Y.nb01_<\De_T!'`V&oam:'A]B0V_AF-B%<;LCdN=jEdWj!n'b3)uVeK %9.'lEWf0*A1itVY?e\a4e.gMhaa%Fn'J4JfdTIiL-,g]]1,UE+[,K*U\lrdmYdou]E+e-c&VHrL'eCVd?.WM@JmA\p0,lfP<'PGN %(WL(Z/?H3@"KMWi9"2.FP]=AJX;W#K[r\F7X0,5'7uSYSf3-kUPj?:QSgsJ%02q;BAEB"T\YqWX(\,D3>Et$!5n:C`\tk<+iX&%M8\^>=cb7;r)%E %\?'+>Vb=c2jdDd6Zn=$CCe@0hUj](O,7tm(u\`4eEnOF,'?*;>5P]W"aGOIf_GBV0ht--)#j6SFj?Uk^65DjBD*,^nOi6( %Z:DOB\LT*dje'<0$A@7#,CnKGCI4N/b;OAlq^ui&ZhDq]T#:tXTP=>HqHCDnnIYoYN;1"($$YX"*/h8$Cgcmd>5[VAFj&6:mQ4+H %mP,\ebS&%q1_=W[MS\NHJlcle4:NgtDEj1GcuD.SW=dk,`NBuo(_Mkkd2/RkH0.7aMPTITII?%+et/cV_X$af0b^$DKt$l8a)3QT %0rnLnU>]hWh]M/1ined^OPTc^W7oKjp*h3_qgTe4Zi4:$d("V^5)sC\i#9e4K#GF)5+%@e5$Eh5Yp*m6S":hnLO^qtgbS;/dVe@66TB %B+kBPZojB]JjJPl2lm_;F\L7ogSi>b8_L_h'?=F/s*D#AmSc7W/3G\cB05H<2oAgG3j"0>/CQM$_scisHIV0)M@aC\ds5'F$,I%i %8XlKB,2lGRBYAnH/R'ie*mqEFmr)eOq7ZuO=(iq"k!Y<%I=E[bj0t>QV`akKR'$5^ZqX=h/33ApIGjRg[fH1KOPnKu"WHeeR"@rFci%7`fm\#?cC%U$DK--&VWfjj`q5.Mt@-2u"cmS$\5?gg4ePJ';imA;W> %?,lYRT/'SV/h!:9GVOQ@0bi-RrgU,RoOm1oiU+W'*"Hsns$J$"54c>)/p.Rp45KX(_Cas#'>BoA4+E<`Vrlh8kHQoEr%rUC!QQm+ %,1(kl+\AnJ&bqn;%ZPE2`kFaUN+U"/p>J>^?OT)85?^I3?J\l`VHC>FJ8(>%HX325H4mTrLb'[C4D<_s`IZBU&Pl8oW0u3`Jk/R= %Pks>Cj_.W*YoS>(pF3+rk!BnJ@U@G]&J^5[gdkSa5c^-t,-H[H6#88BDtk@;Ta8r;aT3BNV;Yc*]:Qe9O2$&dQ5U.]+KFu1G/S^!2L(W_#,mj2@7N%G2IdX& %qe:@2V!G6#ah4EI['at0g%(Ld@d6G4``&j:k(f2`X"I+7KcMBk-?',FfW"?K<_p(a16^67R,;HjNT*A"DF2j2s%p948YKdi>!pXD %fcq^?;>I?BDH)fu_>;Qk^M;XQ.0+B.8RcnDX<3l=>i)$CnB7]XJA5hp;?O\U18&RA<;"4eampMVg8=9one!1p+3(J&hZB4!U\ojFG#J;ScZCnd6r!`\%Qot52b'tPEIfB*M#jq.nl[MsL>Q98HJ"E77XCh?8U(m(TsG>M,DJaYWYZ,u&:C=B %h:5+59qqkWII[V"WL4]D`AQK=N*5s/glTt0(^XE#lFu0#*NQ-J>/K3(LmW'=-4mOl^522T`gi"*`J40 %bbQ&_1"IJk.]c>m1*T')5]Vr7"UePZ,..Kb%$M+W:fSN)^SDe/J86?-L<:A>bRp#(<7_?B9oc,XV0Uo!a)/OAK/FXSmdTFYkDpoE=5p,JJW1#O_ %aL0I+a`.L(I_W#-9UM8M2PU/[H&%Ilr&5*0Gk)f %[L@9o3"Ibi'%_hk)o+]q4NS6lWuPiecDs]]-BXb?fnG'?C1&]NWPCBaEWM3;C.cD)HsD0SiJ3i5!"aZRVMb$q5Z^Z]o(oUG-N<+V %GVr5\iPGf9TrDf%At`hCUtTT"E[$tV2#pNG:`s_@@mX,LH)UBYH=*dSLJ;tqAIlSc`s[KB4\rpF06d][D3%&bMq;eWIp(nghJY0) %5-ek/]Nt5s%bMh,U[2>nRL7@]?0](a1(hdfT$ %m;:E8hQ"aUf-FP7KOlc1>sM1O]TjaRLmk_`djRX.(MR?A10s#SVsG%7TJS=qN/5J7g(_CU$uNg=`*W"9ZJLGC%c;pcfL^62$jPiA %]5h!Z-R25@e@4@3=Yf5oOS5"*CGTO6I+S\'bjb?l+:+2n9VJa-\Hrf!H*c+kZI_gmNWt/0g88k_a:3+Gn;qUQc %P>h9dn[?5VIT[.W9XuB2D!.jm+U((1kZh %8(UbJJ/lbX_Kck6ZE5?YJ;]9q5E=n/EIkN#7q;GLs?^K%4PTp@Es0\f"pNdlueSbO$dLfbs4Su+]3Ks6m3>PLV"03 %NfWqfK&%Jr;O%ce4hB2jggl=$*+E8"fomkJ"L,O=I5?9Q9/GQ8%d)R+'4e(E6fN_bU^Oj1j()n';/<Ic^mM/M`2id$%Q %cJsa50i%o?fj*aE8't!Z"g8IXk$KVK`2=!NUFJJf"X"#VC2a[Rin=>K[1dilI>sGj\I/E6*/2 %IPQ?qgbf3_g`fL0%+$!UN+TA5N/fN!<2)n)N6d4Ql0DhUJ>7BD&2BqT#HA*$Z%e7[d"7F6l<)80M@;6hNb\c.;K7'i %-uSk26^X0VGAauQmA;_G]orugYnC1%\+?=o2Q',jh->%8[PKR@8KVVXZ5!9:NA2PF[6?nlDkR3X>fBRA7InJJjJkkb8FX=&$6L=t %@8h_WiF(eP_DsD:[E1*jY6bBII9f*0MD*ZE#D5e19P/H3X5u'UJs:I=[$j_$5b@E):sGfoq:!APs$B^+2EA;k/a3ZN,T:b6CjI3R %Vq.&)1k&@ZBG4$R%WK#\?Cjk*_6Q-?3m.SuE/?jY[B1LB"[_+P]oaKd'@*Fn2AumO[e+?#\qE&]en7*OO^@KWnCq@#6JEpph$LCY %S:CL]-fb&q>G1ZXrprARm>jL1h7#WJhuE>HJ,#N5ne](=F@9\E6duVnC&6q,F^%0)A5hK:kGMg>[W2b9Nt`b:FD//"nsQY.m2"/e %qmEluF,uZ%naGSA=BZ;PhiSUK+[sM/\s5;u"*T(hl[OTlr6[QdSaG0]PqaNbRjQM[qs>5"N?Z&k.DFD(LZ6Ic&+50^s$cCUGHo(l %23gt=F#HaJE#,A<53O;&AI$3Of5u74:!YY %+!'sLDa3.HHF9iuLhhOI]ME;h/jm

Zl7u@d[(IS`Kb?`h!Jl5]NY*#j]ppgO(6Pq__HdHrp6o"p?dM0 %I;*7DB$]i)"]IB:Ne).(4s.aC'Xd_o=Btas_>S7)pR1EfASEj!@O@UTj#67f#1J@Jau'Z9mh]nDjIk5[H,#Am$qtBPOqT2=h6\TTb]^R*OCMUM@Y`d[;R/Bn,Hn@@Yh5K;o&<[5?=u8:b9BWiN[JDhCnUbRoU224!c%RW#^`4rS^(J7NJ1n %5999*Da3.Ddu=jd%C\gt9^h!DF^B9H/]XBu#KM/'jO9[62FLu[AHklWgbPkg:aM39*BObakDtZ!d^Pk;p9e$4PDq=#i2'-qLWO$k %]rn=6WIOnL>l462rP#]SDLFX8KgYR^a3)%Y+3#:(jJ-4)mFqm?qq=5&EnAOfnJV:FN'a;[hBUqV:IjEU[h%mADt_M"IfK28s7RQ6 %oQLh[8[8st)meLO$s7X8l0*bW$C=9%u8unr*cI1k#Wps319[pZNmGIiY[->J9Oq>qJ %Nk3V,7iil$:]R([[*t0@@MW)rL"jP_J,G#AUR>(T5X_T^73C@,FcGoE.KXLA*K`Yk0B\W4;p`i!ZY$YI#SIDq=-lN&!lia-/qecf %JA>tYpq&=RIn0nN#XL$F5qUH9i0j_[a10:%L2sbC#e\bXXH&7(j(kq'RNcY_AGW]1!iRcJ,Eb]`O %!7;cA[&X4db]7p%'UYSkY4c=FL^C&*4K1I7FWG=2ies2HAS(u@Sh1PS7)9p@_%Hp<0A9ZSJ<0pKpB2)nX>tO3JN(DD>ZhGLr$74e %A*e9d6C80K?:]W%Bso9j`LPNkEuZT&&4<>kAZ)gUP7<$BFTJ>"U`VGRa[k^T2_5K]G;(9K.35(8!5@*O6ic`jrXICQ^^s$gg7+I/ %J.M&,/#]=G43^kq]1C>V>s`aW(KHqq[1sUW/rkM.Bee($9\U./027sUbaJX^!l1#lAZ1s434Ka4C=0P7@7hr?MJ,RV"?MZu&%oLW %n74u@cbS:->CpqCjpJL#aI,"6rJeYIR1_IE%&e8>3sVAH(!)aPXs&pR;@XW9L=h;JW^gAIgmH3i;H.6"6RI4SUqBq>[5=$g$rLAp %&N-e)!1PS3"qG0>QAfnl8!Vp"LS(PTIP5u9gqCnsLV-j/Gm!Ycbs2R)o,BUdD)2Q"E#rna,hDGnDHOuT^gM)_\P'o7(2_%iIZ9Lsd'XXZN_$#T/se"%$.NB%8M$d(HY %Xm@KE4js8l[40'uNXJf-U=9>$KHV)KVk[:d9OUWhp=!/UV2X!,;Y4]qHCK=K?k`Sf.H0W!bO`NiP`$hPk#'j=S2DCH6G^Tt(i,o1,&c_PJ\GpF2GdX=k*>&Y4C"HD\/Y@ThCp;T-gWUeeC:mp'pD:$<52l'8U8aFiFO5akl+fC[' %8S3$rWTqMM$l0<$&d)PJiZ\)C5[-Tm$N@tfS&_id@dDD1"58r3CtC'P`]]D3-\lH8?JF$S&aLcH)7;4Cg5/Sj#):C!(-=*HZk1$G %T_[S(H/BlE\&ngD[6%BhdQ]'%,ZnaG31P;,#6gbKg4"4Nah;V&s'_`>`Zg001'9^JM&\$Om#PfM,2:kjAkKRjQJem%JgG9_g&oo1 %Q*17l&2U_./W>+A#>KKjOfD4lUfK#*j?6X-"pFNd)Y-j!jCQ^Bu6!4]0.++3*o^S*kf44VbJNd55 %&lP3iHSP%VgqE77Q-PXs_#Y)l6ESH#aQ*LEgdFnk+dU$$)9^iY1bAKr+@ko(o/MTV>rG69?$^ZRekK*MMqE?MS8Fmo3[-pIQHG_t %.M'IF^XAp);?AKL7t5SLm[od2p<>?#S#R`d.Wp2j:I2k5ns(=MmWf/#DULtggVY,0<*BSbc^qFm+?2clp[*=(5VoVmIhS@!6F7-; %]9l:]XP*,W%^[\gR\>fPJTao50gZt*e76Q,epoG2Zlt*s2kZJ%U%FOO=Sk7)Pm!oi(TF'k+8[K]%cW(*KhH.V,[c]U20.[bA*(R> %!0u"(6n:X"#j*[3eG1j[7dk.s^@rp6f;N2U)QcE_IGm3qX;W@LJ\Quj1VInGP"`+'dSUg-9FRp.ZIT17bmB9[=iDN(N9_Q2dX;3)#p\M]6iEYF-_*e$rII&lq7m_e[iln)Tk_sI2oXf?rp>9R1k_< %'a)Yo?gQd7BCl:9\9AL$^e73heWKIRb1stl-UZW%! %"JGQb[s^'.@T/t[-J8mma5YYr9AEOCL2\i0gd';jSJYQ>SLdY!p\W<'liX\X7SX9GHOh+kDU%:=0lG?-n-ELU+=5"Ck>;<`[Mf&Y %K;P8-5ED4AVTL]*CjOu/9KH[;Z?_LB1klA&WPUl[OTH(OLc&\8TN8E*'!-'sjjErRH0c&bJiH4rU(+FSL'T<$T#M"GP#,s8_h3.2 %mapZ)U-X2G**lPJ0fG*tWpP`R,c"[&(?;,[;`.#J,%dd/M*V.jH60OA%:d)f#fd(b4S5X\p6OCX3:Y!44JdNngCfJCA17]WnSX:^ %UqMmTH7EqWMe$al8miKr3[BnnB2^ek'iS.s<[4``j/O?jVbp*9Y]mYHXj*^=MFu%6LYG4W"A+[WKj?),aV=^@?G46j/`LcYgY_U3 %,;$jt(8YG.1CkF4'cHYe9J#)IIXhD=,1eG%eu++^'9[Lr9.%^P67pg+/!1('+'LW8:.[Cp0RdHK>SCUES+FSP+UDM;o74,CES>@2)d6Lqikd\BL*]!+?a%=pYZ,A?iuSW.=GRkOq\^c,eX(/#Z!"3>!#NAl04\l %;U4&Y+&+S+:`g!MMua&87pXNT&KRL)"XdK_=RQ*%>i5^1HZ%T8(&G<(&@s))(Af]?rmn;=<[5Nr%9o]$Y"uqReGIaul"X',/'N8W %[*$S+2eSn+q`_-=!:%-S--15k;bM.o@8mW>4:tW$6$N1h,$tE,U&uCT"6ia_iZN<[6l9a!Y %L1,Wa+KKbo'?8aVe+YTs]OW4<%=0Ad%61IA47VV6ei= %S9MdB2Fii:B4e:4b:6*Rj6Se27'"$+GB+I3s#.4OncqoEr3H,p;[6$Z12ikT1`>pSF0\?uh:DJ@"-h/q.*=7n3+0ic%R`(?S7I?1 %"#VnWOqj3a,Hhq%&pP1tOYf5--HkgX;YY$DO0(Q_:%*9nUm,"[])*N;@:Do?\)[Knifll&H_4[^Nd:NW57 %@R-:io;)H%!'2bAN^19%ito*!c,*22BAt.5D(m(#K@2d(GRt0-KkEd#'^u-B^;;%Ha%2*_8P0dC=GJYH.+P=-qGJNA;^dj_4I0tE %WDnKaK)1Cr^0$AhksAqrCB'Ct)O[mkFHgQ5nJ0]'&G9?>.Lr3Y&2p5B*Q8Y'2B7?>,8J%-A/3]b-DKK_(!1*nDm=KG/It.?3C6VL %]5D8m=>ca&2_L-%3(:[(+;$'5D.Y1m1QV2Q1),kFr[C,6[qemZQrT+M8*6A`.^$WuP%HQ)KM=M-%m,REc/W?,cpS^Up*@nd%ko$WIgfp@X5Hlus[VtJckFqf]RLO4eB._*rSTMo&7a;$C4_1)qeqNe7\KEu@ %%M!:.m?Ge#[u`hNc-_YHEN$+_*]qN=K)B@]?tY*X?BTFV+SnWs;sDd^l[Dj2#oolWnu%8c_*VU.9$>$V)i;7Z@01`L"mVMmTWk9+;f?jd0[A!'k#r/=ci %R86Ubf#9#UE/ast8l %E]CCs<%RWW0='3@EcnY'A6+KJH$1$LO;g"=Fc2q@R?9bGp&tbfX;"uk,F*Kn<#D`B-R,>j\Cc^2_L<"j'onge#OeH?h^I+j:m*uP]B*)-:PGm*[*K,48F\I)i[g#Va06pl,;/@i.'p9"]lc-ca1"?S7EX_r"Z2 %IRKSIe=;`qhAP4.KK>`;S=/s4XWF,QZfu6GUtJ[%4eQDGW>&c^Lc+5A@Ef&0%/2'Si+ZSoc&bgNr:(7UbM5o/.jWt_=Zc;*M. %+Vh&>7cOD4cBu'o3A>)AC&7n$EEL"K2s:[pafJ%+cIA8YrB-jbPh](XS5=_b_*($S#t(*iY3?'lT!Z]4Cnb%dm+5bLZt%si&h0;V %k#"'SfpP=YN?,>2O")Kp3O=Obl0`0s4aJ$d7nb(F&N!QL`tUT)XI)8,5ajKW&4^*n*b'99(6RtOb^+qY8`tdUM^,Z8a]>qR[Tf`J %&)sunC(6*SiS(F4nI!i.TFdf#^d>1?44q%;0P(@^#H^115o]Sh/j2_K"8@R=#^JH5p/aX[F\mQTmf3#g0$k]tX<5M* %;Pr)3!qB@#OBaa!P(5b.,ihVC9mFG2SMf2@B_+Dq^S[9K/p(M"[anbpr?sIu)FkBG/7RCPYsV6pHa!X0B8SQ,<`32:F[@CA0=6+5 %,:3@p=Si'g:]KpFJ+kmOnOre4q"^m5Kh#(W00kaB<:CF1p6SS*@R&\reZ'C)3[F8L%l+4o0DsbTmD=4Hp;>BM,t1_.[KU$4o&If] %TZ@2jX@hm[VD%[n7"_IL!_GV*rlMWbfBM&=-AY1%cV@i+\DR8;n?ob&!M&l4 %H/6MY@qt)fnbG5#J,A>@XY#\[("MbP#t&9iM5]9%s0#=l5O%hgnE9c;DR\b_\&i:<].1C;h7Cbd7<@l8+u)O/D)r(9_g.^],E8%`?dFi%\*9Pqj#W5,VUV3/9@0s3[r0YdGI(kX"CHDC]h187> %#UX1M\>'*E`rL,JQM5s,KfEG3[q!PCq-'C\(,aHc,&-QoMaYV>mF]ead,gt'F,lN`o>I]eT'jX)'LD,-D=MoKFtEN]M\7FeBB15I %'5R-\3/!*"W+7`7ft'>Sqel;qQs)0!>/4K"mSEM`UY`^#;EpG>Q0UOW7]&^RrH:N:593WmgrgH=q>ufSG;R %oai:iO.1KCLg7u`ch"R=Tg\aWHFgJ/Lg8!3LJ<54aR(-kDt**:EZGNJLANYU54@?ZamWJP_`I[clg:8'He7Xjg,X?VNpT,Qs,QBI %\F/PK)#*4i>/[IZcWKVhqc"i!n+2>XE:Wg$LQFBIQ8Ua5TC2@;#Vc_;[S>uO9VGNtm3/;;\IDor_3Z1+>YX[74g(A'q^uX`C%AOkI].`;^C$7t`S[\r*u/@9(>9C,L^,_5A[OcAgc4SB6bVV=qj+mas3>io/oFZAM]b4sJ_''B.;s#ASaaBG)+lHrP?(OB`( %/.X((D`jBAMS5r>!aZ![FY*pNV+L45(;Nt=+)=[,'#u#_U>>I/qgeG_"(Gq/+@1i83GPsP@&A%^9,Cn:U8i6ZQnL]lTPdB*<`'2, %ZN,4\c@A0t_@4-fLg#1bXSc3D3kQaukhsj@[uZC5)LXk34W\(ZAu+!`_*Nd*>c)JQke?L(*omarq_2Fk^XnI^r;RcYA<<^,0RHRq %,(cc@Ma?pVP2;uO%'oc\3(HrO4cPJI'rI'a;:de,-\iSc!SA)O"rk?/5kX?&Iah2N!W5K;?I=p(&B%a-o\J%W#I-IW/5NgH8?EJn %?FchM=W+0-Qn(W2@_jbI0J3sOKbtL.$i9M'40QKjM)YTT#+k;99k%o]R#5BB8il$n*(eR/ALipoSka/A*-5-S8jdn:>ai.M_,u:l %%#YJ\\mg5ii(HQ841_pYD#e*f(>fBBHej@ZhmJ(C/RGfKP4#,IAYp=-ND?Rs/g,)Z=hn/(;Cd%Xc>.6'I12nj3KJ9$0@(M;uD3-2LG@XT$GF7#Q("NV%#f(3l%A*I=Z[rVKs;&-c4RI/s"ck"ss9t:UC"u'9^ %UYsMO>[0l_1(`04Mm>KJZTq/W>HqCh6T*ULN;%9G>p"88I.1S\Ss'W$"V6II*\UK#M.6s\VurktNk;ojG53R(N)[$M@_md0hF5`1 %obW8@DH_;#0F??jXU:.%)JKJ!1c['ZNg6CH^)^uG!^tc8#mYeDi9t%-Au9/QQ3h1lW\^h\h*sSEB`NqJ&>_hbFke(Wc-QIWJIPlI %=klS&b%$)"+&X<#R9E"*'"?5iN8fu*J[TkEj.\r'Nrh!;((Ki#8F&Yqnol%V-pV4W_D;6P'^HfRQ>@ %U'/0LqdA+/Ci!-BMIUT]YTaYQPZ25&30q'QHE8f+`/pJ,/Ei>(Pcq([!!'9AGQu1qZXmBGTZ_ou#7u=>RGMPu']:@UhJ5h*o'D<, %oUcuJ6M(2eJ'VNud(3R41?n[M;^'`qNg3&e&"*euS5^&s_:7gM>l*mb!HN0")j3\D7PLQq#2![2T1fUhnqn`p'q@al?m-hfP`;B0 %&G`.&Sr?Oh*oIlO3cI^l[b,Gj,H6SX %2kia]p"LsiN+;dfC\[d.SMU"h3eoh3h3?-fBUp`MiSbBE]%E]ra=Q[Y5*'e<6d$$2d'_`+.5-7VCd9kN'\#jHN-cae8@Yg&)CRc$ %#k*?'!p#SUL>uhJ?2G%Oj80f`YCY"*[m3(h9N=[fDUlpV"DQS8c"J$N4nOT,2MR9\euQX,7iYEle^l>`fV`P-7W>Vs9E@4;IXi!M %`7u7pKToqgBf&GR])6=JlTCC1)F*(j*lhm^KgL;4nZD&0!Gk"eltIhgHf#j,+o#J)K"U&0&-5*.0U#b!>tdB+h_m+5OE-U7/.?]M %Q-99r??uf$eFmS7`.r7k-$m\=??Tg[FVHFU9lnI0KkgbnTCDCG?u.g0Ih@0H@?@8!j.8kGCR1/QlBI^4JiC+/_D\Ki8b:$E9oDYT&ZJH\WId*-CJra!FR$<5&@6p_b:(kf,t1)d2CYkkj2l[V:gQXb]5kZW_e*&m#i7<#uTU`cmUjDr4Xq$bI@7dS`9SV/ggUu".1=.IksEU)K8T)O5=H^A#2 %P3"ao$gJgS,!['N&H;A?8dPsTu"Ih=V0u[r,]A_J2qo+6gKns# %3GR1'QF+Z_]ToqfI&2M+f_!tl0#_-G/)Bd-Y.+aHl,L(/]oZ,p[rM]=VTN+DCT6lrl+0jiHq0IJ2l\uX+q@VEn#18R8!Vu-G@6Be %;<@D/.duYNWH*?\b$-EG;s""=.\H1.o(e:q[l:cKpDW,gSRD6,`in#5f)UWV?>fMoDr;<;(P %03)oYW:KaRPrHDQ8ZOsYkuP7Q!O,7#S]02;Je%$EdU7nK/3N^^+K,.3qo*^0=OIsf2cY_#&/'is%6J+a:`@rZlV!3KF$+XpH@`HO %)QWkl9l6#/nT@K)RbrDjgD45ac,qsbOcH.3%H"?(^[nt:/Q-#)m^ZWd=AhlJFicDpX>dS;b3HLt]^@_el^[[cWHT;>moZjsk$]8( %?)ZF>fp<(uIV68Ge*]6-aY.29h66Qqh>0%\$9uWH70/_3V*eD"$rjeheR6EO5YgU@)E3q/_,-2SE7^S-f@qcEH!E.[()4E!Ch$%D %Ip3)j%L[FV;RN=fU11Mu,c,tG&#CK$j>@S]BqEWhg<5ZK2*2tE[V=7eNcoV^kcWalZdWgGF'+VZN=QIXD]2f]ak([,=h'JbCLbn5 %;LIrdVNXZdhhgY. %_^56DOgV)GO64)AYn%S^11l1k!=<5*q*lWNM\6("XV4="T3.PC6d?eN,u'V!E>ns"qMO^F8hE-V"-X^8ZSe]cjWoY/eMuKh%W,Oj %;cHt.Ya]*SF&JWi-f]=lO8$GP5e0UoN(1Q.E(n3elYWhusm)#/;3XO"f1Fm1U$dNF=Mb=Vp_CblF6*UA'iA"Q&0nb:,8?.&]#+,:\.qs'l_'Rs6 %.-:4\RkJCJVtr&UKl+E;]$,DJ %2]66lSEp[\/USrtrin4tlrSt4EYl&@@u-(p276lGBCE7\kZ"TX3d$oA+O#KT?raea,`pYT>DB4"Q'!Fi!3>uWFq>Y3-m8Mb:T^21 %5@OIFJ0#sLJ=5=-)%[XnHRs&IZeK<1Q?G8)(m\i#'2FW,T?P]( %*=Z.kMO,ebdjb"sR3i,.$PSDQU:&PgdDgNl.?n*02d(2.p5&"@Z\.0]Q!l%@d7=bFgW@$sqe@0K,2J-\KFNMu!`P(s_k%IY<]t@o %A_9^Tur1$j#r[$9qoc94jI@"e?4VO4d3tM6:OBa$2.V7$Or/rC]U!_<@)&V=HQ'n`hoOUh@85S&>sb9!#r7B&9V#IAjK3g[YI,;ifG"++(Zl)!JdJpCT#nH9e$oO[=Rj5*A=d1[*T/'?bdt@JXg0o.5#[3 %IuL*S%*UdpH-::BCeHZI/ZXPkY=OUKVeijGS:"fk=rqi:3SBhVjAmn>Gallf8)A7TV^j>/jafP],Y=pH%EV5b(Un79'G9IT\](g- %1i1h^A(Y<_e8e0=bd6/q..X"QVk_HG^t?ur=!Lb %Om4A7oJ2L>(rN6qnOghL)=PtsO>N+FFfA$,9Jc %dcpD_+LC3/$XSO]5D9\78q*_f3W6"VaaDY+9N\%.jcZ;T4@PlO="^Y[-kXkBD1]TsN6i%1AfT",L'4sOrL%=f3h\o>+pXoXM0iF%,)@'4=g?CJ+"edbiaVLC>BhU5<5#+W0P.U8Ln%*tHN/^u3Jo?\0QaRhTk0-='QA^)fEj@3,q!pWqH(+P,f.6;MY %aOc.,-,hTk.mo\r_XhEW#on^bqL`H.I"?t31%NftlN3^kBAcJ,?rK/YRV?Wn6!)Rs"V_d"/i-=B1X1S5`o,C@j:"""7(MP"2drng %/`ANEdtAHE*UDhCJqF'=*I(dN6`"?UY/#B1[>)tGGbo$=7CAg_$Z$u5F6X[HpnY$ZVYY"E5(N;hQY*iK+j!43SK;?297b;DcJ!83 %(2t(&#s++2N??1D'78&tJl%(J]Sjd"=USjV&=Z&9MgSc;#01/a$](Q`o^+6F^8/?b4jaiF6B'-1FKG1'2uoAd`<;H_q\o;Y]CSddpkXd#(5EB#(UFN2J"Tes_kr5!j%J$oltQYI(N@N>J4ph*bd(-&#p[(ed&F\g,e4E4Zm6VOqCq(& %&/MGgfV)>3I'9F'#O*Gji!mW$1_)CKg*Ln_7"/T\_;ob\W&V8P55Xlg+cDEq>V>EAALJ %-`,+Kj?t6_%*K1-@YJ7$(:4oiAVIDGKOsrRXY]Ru=lVGTXQ!OZ>p;4]=:/8bS;%n+_XFg>5CEMe9Gu@A6j4UbHW]G]M6FdH?<7i! %=>ds3:P-a!R[sY-:!-6kJui80qrG=*)VIRa5h4g+%d[+*3&lOQ.:%(]`3/ZDf?_JFH;9j:XtI3%*:W_W'Uf,2"RY*V5k3Zg%h%Qr %qD'Kr9SE""-_KjK6BiEm/F^$+=D+OS@W;R0/TOOAc;`'M%n"GB-m@1-&#P"4/Z-J"e7bC'4(St(\;Tl%_`L9J8mpga&jHtq#@&,- %Rj:oaPW0[+[S0ZEq4)V;E"+="MCL$C]1J9uIS6Bt'rYQa1N'`Q)!i$I[iChAjTgYp8fr5sVh4-g3t0%8(."bCJ`ara3f:XZbe/bb %3t./NhM[U#Pmql9!S;.5a1j']fgDi(3'iEFOYqO4;L?Y"%0PchTjYW^>$NPooa6L"+#jrGq'M4;;i5:?C*Se#bluPtcf;(0@>q=e %cN=t^(HWo?R[#]'1rZgIq9"@EZV-.\?=]p&-J(OO\kJ\4*ACoS:A-Kj0r:o&OW!+7(#,tiJ8:WNBQ>ZU4$s;qWT* %a+pg>L)&nR"=%07Zq1[`r1PRH,:js&&oj.ISu=hfejoR'DPYh@r8(N6q)Y+?aLb%Z))pgjerW!nYif;RY6>0#FcIUS]CUR<4((Lj %`&&bTc&jm+S0pglT0s*2_ndTQ&&oAe?[^1mF>ESmTZggbMnm]a[^b!Qt9`=:]%Zn)nC*%R"O+30#hj_>]8iDNnf8V8Xd93]FWQmAH/P&q*Vc1 %>f2@3@+^9AK9d?_'pN\.[k",#PDkF?80un_HO>pa\@CG_[cHJ/.K`rV<[Sbr]7:2NYII3^!#E'4qsoo%iX%Gr=n+e!]]f_kac8?V %<#%:F,a@?Ml&`H4Aj5a$0JW\+in:-AI^U2Pdmc51#In+XG;tgK_dgc#fB4>OB9EC-DMprYMr+L81e3#bq_3".!+?/i!$@&$WTN7Y %nWI)CA>i0cds8qGr-/dW@3^$\-\Ef2=r#8KU>'Oiqghm]+,<3/S*1Vf$8me)%T,B#C1_]Zbf3!P)_&C!99,%USS\hX4c@d3eGSl^ %Tl.tgamqPohd5!3=Y?o=1;2"V>Ykp#KchL@!m>O;5io%gK-c5!$(&QFG9Z>5XD3!Y]I',CGiHd.L-e6ZWZ)GbUs[-N`:P3hOlCUC %F:\i@:iF>8"Ch(KR3qgWBt5k2)o`(_P:I[AskKnu.W$Ep:1K";c`8Y,F7QE\%,)G<&RXWg^ %g4?oVg9j?aTpaR!ZT6T,Hh_h_miWXO'-MP\MOPQ)Jh%,I@n]*f2b6A<=o_6_[NgYaj@h&Cb_j(:7Gt$P^40CLnGfNf]`K$RtmRd&UPa&*97-$JMn/F8;I`F93mrMZ* %RpJ+(HQ&=08dkuM)B"D44$!0"4Zl?jf^-mHTQc#tq$n"._]323BtD^Q7,bDE0-_7"`F+YmB)3[)$ThZi(F&,ud7l`DB^bXnGciWm %Z@/=HQacK9/6=Xr2Z6@-Z_/ID&uT,']Id6k;P52,jW*`*0`Q%XVlr %.Zp3^JNHI:cZ45u+Xa,7@qO[3S)kXQH+'#7@cKfE#Zs.C,5@X9fAX='/D:+E2l@@Xm0^I>;oXM#k`3iK]Y=!IcJU5]#s3&kQ7M)b %oThc0-6r-"TLGAq8Ub?@0pUOMBq2IqKtoHQ.^;f4Pm@\*-4>H1h/MCa %WppZG=X8Eu2'u4*H<-='W>n*N,/'!=*$Q3PmS(hLf<@DuDYbR$FdD"b9.'6!_1Ll)S626k*XGts-5k1L9Tk+1BrfEH[%]8aU+=o5 %6(UZf1iiBh5FBQbh0rp:VP7)J'cG@^AS;HHmp$-rBQ:c?L_g(SR.%imj8S5?QQl[=#XpBNg'74/37_j-JX0kA.L>-rRbdG3Kh9JC %+[>;SKL*cG*e]+K\kQ>;$I%r!A.pu]aef";_[kZ1!^MO"6**tiFC\I9G]F*9aj0Hd3KXH;.hLI).aG@X5ITFMV-D^]6eh2H3hj6` %1iF?J]m@;^@LI[WNt9fUl&-I!j^S=1_Xr%nj<;6\OCFC=P-]1B3UF,'88pboi]cF"/K+Z+`H5N,qk!:pWb8!Aj'dd9YM8qZg#en0 %b:?'>XqEMLbmFVI<(/Yg'gbU1m8V^RQKa#e>l`-sh4>o:lAGFL['g!J9[WaM?t=m`*M$or%H?=C>J %RjVYm@%tI2FB*\TTD'8$#EiF+78"!,:^id=Jd3@[57%?c?]\/OE(=%r2hiE9K46G-Zmm6.Q'29aj*VIS[tVGma:a&cd@pF3NqLeJ %BHAq\h1-R,!U*j6P6qCb*"gUET_A)%04GdJ!OCH##S)4H_^;_#R %@?"%p>o(b'bp\tLX/njKS0IZ65h,:@,S$m;qs0!9h*:?c4A_A_f_]8e%bYKR2.`Vi6jHpel:3n(LO47Jl>Xf\A`S=(5dAHl9qJSI %WAD#1QP.2RW;Sdmc5GRDXVqGP#Nt*RS5-bp?q"CS4YWd0TD%j8H^5?)gfQq.'>raepd#=E9X4UtikNe/i?[ueqa\P+F\!F+[M_tf %P\3SL=e8&N?3Pj3Os"mX_s/SUaA[k(Y,nm9[#C%N[]1i$N?\teQ_aB9 %E+@.d"a-.I_0`f$*#BSdPt11a+iTm@+;=7I.G978,eRVnY,`WjP*A+Kn5#[c#n(TqEJi'Rf$LVu38B##ioe&>!`\I<&sgl$]4R1: %&S"Lp7?hsDE_Z&MaWiq,-H7Hr7LMd<1hm4a$-A0hA9\-&7FH#hf:\1MQWAh#K-E_r[P9#Kd(q//Y;iHB^-K9cL^F.G!TK'a_9ViR %GqW;NHG_uX9I4pWSj3XSmYiZ25tQbl>pIk\_"W,f!7Tb\;/`a@Z6ZELCHPi4,`]IQVTcVL^/]Cur!eZrjBCiUr^RRpP,PqIP:^`` %=IP=j'"3`bq[o(S9qgKP(4oc%an6cj*Q3H6GKIgoe(`B`+aaf-j %>onesp==d)!U38cO/EPFJfq@r*%\,9F1"J)'@4l$!1JcB/B4,.:Df$W*lq^urLO(S>("2DR"Z"e-AW>*$NP[, %%LRdZOge?;<4WEFAYi[8MZqoV=ue,YgI7^`KPqMa4rRuV_ZaqZr('g$Vm80t8&L"m?5Nh;&+PGh:HD5s\ccBtjnN$1]Jq4p?)/#W %/V"E6%k1J]J/G2O@6#cg9C?D(&6*X!%*dpK?)J+B\n=\^HC%NW9#rf%!:^]kOk$4BT9QG< %d69!NDXGM[;oQV7bXip:':-`Z$F>kd'V'5(-OT[32QE6`pfWV!Xb.uNSg\5[BOQ_8(on-Z"bu@S]$Au6.l@l4d;K%'o8S6RXcUpN %mi`H"H3-"%;KZ>q\LQahKKbhX&S=MpD'=ihG69Mn,\SGhO$[j:pMuRA+XDE'Bp*47nse3>$%)5+rEb. %jd<''Gc1-n4KMql.QWm?r.*\X.=Ob*d)f-@Kg6Q._!FFg&s.>1#@0,ErAi9r:5)9sA0Y5,Sdr %5mJL41_k/8r2`?4mYe&ZVZu2oMdr3Fc]s%-T:e_E,\g5Ra>d:S0%\WU;,WY%'kF>iP6&CJoibA^aqc$bK\e'R[MYb"T_W[m@0S1f=]Hn'Kb %h?Q;o=-U-@BG'jgOts1U(:gN/ %EM%,9!5&r0AMB4`1,p-*,7`1$-fbuc&a,Sbehlo@e*fP;B1(-nNRFqfLh$m]QSCipd"<#`[9OWX>cm+uM?d@.\tNj#VjAP*a>(lfsCC %45]\(OdDqY^PEM@Uh750+dgFQ.&N&J,#nT36a],*]E56=0qSI@.A.9(GL+:C_u.)pPgM"'B82iOVYu1YJ^hX!lba<[]&Aj_g_:nK %(kl^h3f`Sm%jlK60#lXT_)GqEX7lp:4';_0m'W&$FnO:*#21hd6eU"5"7s^1j0$O(]Q)-W-:VtL`"^%3"HTg[`'Tn[HJ"G7npD=[JjLc3WRlq0iVf8VkZEVr$(Z$F8"icI"$5hdMN"-n2G/t^S1/quu-8_=K %k#I1o$j3'1g-dNEFkVK]k&6,A8!P)g_C;CK8/K'9%W+2'a>[dDpG3G_n"i8TmGViC\k?%-]Tn1VNGsCcWkMpL"T!gmCb(F*_6NC> %rs_pdWDS4)VKV@"(o*Z\Z[R,kmRkbgOBaE(aLR`Y<+MH&nR+;2+*=ME2VSaBT=TSg1X/[;:BMf:1-H8YXFLDg.eBPEIbARl_2W>W %ee\+*ftH]Kg>.J?jDbK>U(rD(-as-l%l(\LR9a]%;cH5nf&h3?uCFd@*,2W1$!V-jmZgfMe:Mj,$qWV8A!X#'o#pt9q2oG`NWG:M6-LO6Aoq0=P %:%^/PU_^\P2dD(YA^8aspR'A&0rAI+TeukX%a=G6*5Cp+'OeSUK?eGS2sG"tAkAE399k/XSb;Lfa-oVG*N*qN:^?o^#"Fh_n#OZs %b#ln`,VW.q8<`bB-HUV;9(uGp!Ld%[X%g0!JC-0oFfaFIfa5;Z@MF]RmioKe9o %OF:@b;t+9P?]J-?YRUpKVkK;9:Jn[)K:`*r%NpJ"MF.TTYnZGc<2F3TGnkGN,,bjMctMF^."lZHA(:)aJ)HImO_EGSk-7:*^n7il %7Bh\0:_bUu]X]M*P"rG,5Il)B_D>Xl@"Q92@@(U4oF2kU!LO2HW'#D^*uEGGgfB.\NCcfHAXbS%qr_mCXZhLT88qG;@Ue6n"Km!E %&*\*ugh`O'fe2SFF.dQ4/SE4EF^("u-i[+Dc)5!aoI/M20jrnR&pDnB[]CDF9emI4RI1(A+*gT::$5Kiedro)Y[#bXCfIl1%$euf %QQ$!lIb'Gh.lL?cd^/GZLgWErQZH1aIi)XcGE`G'=dfUkPM*VY!qW.Zn]0/4DeI#>@NZ.4[FJ.@-N&cDiFg;B&VfnoFmcUs;*YMO %e8GJPku1H>Di-uF;$XM^#E*oE"UPq1!r!]BIDO=7/3[Mp]d$qKjWP %7,i+V_j)IsP;r-Q,#RQ!?VK"U"""<@6:>H-CI-sF&O:rm7?cIn^H32PYW@R5aE=4H*Gm>6:+b7JQr2q[/I(>jYu1n2^!F\UZThCL %Djoh]ncTc"=Gs#ua5Fc`s4gjp(K1bhO,0TKY:G0u>6\.Hu0]S_9OJ@BQB0E[!^]I)'mMcJ?7JZ929JfbO<%U!pN+!;>DPc&9 %WmT6^4j9Z&j"QZ"_O,,nKPW>76uD9#;['t %4\a(fiHHeA8S-)<<=kKre[sgk5gX>q+nt'Bq7IDBQ_du\Ma5\N:mh7J0,Ffd&3gc==p#TeLeUiUZY,1WJRZ@G-WVUHAkoG9/^H'C %0_5[Hf*``#o'5`EP)Et5aQUn^.<_S8I)g=``1]m#`YcW@]EqY=ofZi`)9gO5/],q1R^m/M/I@IMRVA-Z-0FJNDct1(X9)::9JRmO %8-Q3Kk]EBagiiL=11%;tD$:IG`h$>Y-k?2p;aC/>1Z26m1f*N!Fr0U%3>7,I94-e:0\A/A.APl3M5@I3@lOATm`Kl4'7k%9OSo0p %dC,cj#^m)bbL+8VLuXp,@4IPLe)ZX`'[Y5^d&!5OYN-E"[FXZ%Nb>%Z&Uu2@3IWf:s2Jj*%;s8t6:T9!uc>iK@"or&rSG19W,3fT6!-ss68R7)To),a,[JrgY-.5Wi2Br^GC.7!([9?6VhL'R(E;I(!ptQdS2W]btQ!5 %35WP)jq9?0ds.=4(E&s9TU708DLU(!-tSjHAo?erhS<8M2!('Pf#GilY/@5Th+4kFSsl$/GU,=01rD#&U4J[pODt\/&BJN31M\k%$^S" %j@p-sf1!R_E"YUap-&\"kL!4eO^2Z#Y#C%hqfapo[X]@6p\XO,Md2nI1Bi?S?s0g/IFeRg3pH?4I%$U'M[Zf2$l%\URt<$U@r-S` %=E`(m"!j*-B)tTTDBIcb!X$p3md?GI>i1L8pX@lGcqjg`C7H5nD)t#n]1f7Clht,5q,9XrO-VDMTUmX"fZ3Je50W%5OK$&(@i+eT %'c3fHegm,dakuno^1dUiqCW3mZ3&0Kj/Z7]bi0+W'U=Z/YrFn^["E-SVR`o"cP!`),C@SO`B]Smr:/k@JO?SG0+-'@8:T9q %X'gn,?-e`2/_ih*C[W&,koF*"=u5NNdaV+7.\_[mj8+e!q-omkp8PJ92u+02C%+%47F/1B2lDP(ld?>185N9EU*8drnh7b_NhP"E@%"#'Na]SBa\i33o %G;CpA$jI"(0Pkj2=U7EIZB$FCj_fa#D7;Z2ABHf6(S!Mnhk.X@:Dk5f1`,u7hed$dU.PIbEo"Mi=q@K,O0CS04gTSd[]HMerOs5G %L%hMDn^>&ZL[LEie!ngU1%f]ec^CT1a#>R^e.s*6=GZl^^T`_/EQ<=\=Mh'6meao)(]OeW1(4Oe.pThJnQkQAUQkPIW!UiTJu9Yu %/^R)NfWE7=^YcWAeA&%TDU2LirDjBaH`;s5UrRos$h.!,:Dua-8%\sbM[htD.j%?)Se%)\7"sLHbIj.!6XA5qX@YjZpH9jUS>,u/ %XIGq'<=4dMjP\G*D11Ddao-@[+MGU)$<6S/=g7%/O*5W>D4I.fV3#bU/#hUFZb.s_pm$PB\;9,T??L@@XW@VTO\VjA-"L-f+#sqp&7rul1ZPU"D]Bcb-+'C;;<,frlB>2\2!JFdnm9eF2Hpp1fhR!ZR2YeBi1*C %c#9("ZWh5@@8/sZt[@Z5.k:n1>O;JJa`o=21moX29(;&%sj;AZ#cleOgS@WHh%i@"sdSW3qa5)BF_Fq0BZ?@f>*=Cqke %>V3T6n065n`PT>HJ7>cOrTQb&@,`iGGDP]]3qI^67:YF?Aos4Y+9o2q3Rud56'H6aAq9,B#?IFgpnAYM3p>T1c-S0^)j7+!&anT5 %J[t!aY]oga6!h#Q&iCL37M^$.A"9&p[c)n]7iiT=;'%1tjVF=YZ%j<]eh3OOQ:d#1Sn".6Y][,+'\<6g'NWUi3YiO%D`/rmJX@T] %HnHK>r;$@+lmV%f$(iM:-!V:rjD"Rgm'tc!+A52&h4b`[p'rOWDjkknEG)55%m+9!:.hfdnmP_6g/$[%ODU&`@Ae)C[P7Tb0[nQQ %GQ=@hZhYat55D;*`V06*+'I$.eq?AkjV$(jKHH;!^u0_G(I/r[//SiK+cXoQ3[lOK5(JQ?5@#;DYRXbZ^CZJ'u,5un^(`9jPI-&uRoP5qZQ-m:ha+mjeaZ]gMs;Y4dJo_H.V/*3Vke>q`G %,!Nd(a/:I@=^VEQCmT4)"TJH])oiTf4,8.3l]Y(V!%JB7+%<4__%H%9jit$-ZfSMfA1><.aVuW.U@<9k!TCiuN %3I'=Jbr5\g#>aP`&;gQ3cKOX3D`s/r:$,YP/lubG7Q@S>GdftH83,c\]QscS(N`WD('#>G"T+?..)o,AlW2,eFsNWL!QUDl7-1`V %g6=ESe5.Hi*=h18,eeP;UF)(i>O@j.b2O'%,T!5c5f'Rp(f"bp?dGK)L1!kaX[)S7`(EH7j^Q)Z:S)@EfI$bYBK/R127u7!I5W/( %P\I).KQn>!JW/3Nc,Ze@k);9fY"DQT2CJ$m-I+_?F/.5BAW>(u`nH;#X\FCiQh(H:/@e]T9B,'/W!?^=J%qdR)8Gg#";6;Rnuuo" %A?dimPJLGRs!'"KT^AF"j!CL&jrB'"sM^YqDpi<^B,#iP]oI$-48nJ.b %K6+^+BnpkS/2ae4\Vd'UrJ.=`%>?q^;8[d.6A\>#ii>O[E@(1F4XO$7E^%;%$;i4Cm^SW2ESX$b%ld7/FbJ627u/PU6IJc %p+nM"<*k\e>u9p!6G9_;D$7]4(7@5EWh\&GEOpdH``IX!.5C)S,m9f8]F#(D4$>B[Lg[U4ACD)1NMV<2]"!=pZKf>Z?lJ?lDI<+8 %4C!Z(!Dn\$mG4!l8bm@CBulGBf&=,m_3/!ElpFQ-I;Olm%SeliV52C8-Vj>u<*@]1I4'o>Bur<[=M6cOq^'.Ie2aC&/l"f1IDhEjltl6g.&_MS(W1#[;'GcU4u*c8?M)')]];m`*eG24G5l0nEhnSjr8OEQ`n,rl+@KR %U5@G'Qm6F]9njSek2:r,Z=)Lj0QFZV.Q,$sR%e/+ee2iW6q^Eo%jd?,nE[<:h`pf:A+$M%c"tp6fC9RaK4H\gP"4=rh-$:F;5SoX %U?Q4G&![c,itdgIeXtr:,tW]aAkDu0e3"a\;n%TE,gmS8T.r=6n0FFkm<)cG`-)_Bi9\PHptJrg@#Rtq!gMNOd%jbo'-CCj/.U(p %*pVSI6mG`2L)Mfu'Dq7',!#WX2E^2=##>KjY/N[@#%L8tSmM*m^iFI.8Jg)PdkunZD#['u\8Dcm6U890qVIn(ZZ^P75*WJuH4CuG %"$kn&/M'4mCcP_Ak#M,Ablt_h7i%m_O[2*X_H#t$5+2#U8EcS9*!)+QLZr8S+87UjWnB@BjqqJ+@V,H$-"bT%WBSa+id@`K`W%]u %3Q$HLaU.U6/@\X%e`(b4PJG:L%P%4FeSOc3;N2MH8glVcJML0Yc&bMFePQ"J6Dc+&D*r_aV7XpjcH?>WB5.`W6+efaD=W%BVOGTF %6[uj@(Xs=Qf\>+.clsOV$>mgaa$`Ud3b8U5Fb1T#*,WaOiMi1PNa4/ZH6:]2r6@'o1K(=,FWnQN@9fLEtR)*e.E( %oaVupnVfkY;*k6X=A8Wtd`UT_W)jU7",=npTc=7$n5K.VI$,fWgoE#;_*U8m,3:"XE"^BJ+F![^^H#;RcY>b28j^os)"X?UX*3>' %&kR4Q2&Q?7^p@!)$GCDYJ!GWK'E+gD$@\=j!W^8+k3&./M2G.Vlkdh*I0r91e %^_QW^7gsP<+jR:C1gGebYD$57f%Z6]O[Gj;kl`+kR>t<"Tf0'sol#Bok!A"s7`V]-g+CA>0 %Vs]8kY+`9l8)@%d$h'4=92;C>d])LR>pX2+,456tFrFgVJ!;;FWWGKZ'nQNM7Cta%?8S`K(6D'gon4;'Ee`3Rs@dg^R5S!ip_I`Uu=U,hG?pA0%m%i?5`-_hO=3T63;d/TkKF %=`2.R?.QE+2P4[+L[&JlBZd.C1[9P'3Jk9Q\#Vr4ckL\(La0<,afNihG*+*L`CU\0;p^'i8KP!Sq`TP2(hjG&=Y4B]#7;?G"e'o1 %J=YDZfd5mm=;XO_p&$06fD;&/B)8W]nUB)W#U_,'J>iC&H-HOD@gpCa:^D_0Tk^N^[5+SZ&e!)l=8oM:/O:>SB:01V*B4DMY-&&g#m_=&$G%e$B9S>J\tLk-m3.I83XO0uM\*Fg4`cDk$ftic9J0;Ua=gXdKnFEj7Jf)jQ#NH(P*hE9\q@PrAmQgMC>L)lAWq4`f'>@u?.``Qej7],0qFdo`m.PBdrbB'N>/L?^ng0ki? %77J3s&@1).:DHH`L(Rh]?o=/KTsi@q0*f3]*a5I$#TFZWWQ70*3/N"jFSl33UEOb@oQJ?>hn8nG[b]8;'@c+7mB](X'X#s,:i^T#a=hI=l*W['$4k/IBW%)MFfcN^B^YAiGB7h8'F8Y6)'](_]7nR;+/"eN\8H-R,r\W]d$/9797!t; %=5$o#gZ2g_5>Q0K5)k.Y6s_d:&FnhE?>p,?_G0kKZpo/T8gq`"'jn4:,n$-BBb>,adFePL,Dd.dkuKp1Vlh.11m(=Lf>HT..k2EX %Ls/4KN$Y_V3Ff@DX[_m7XfFlu<=Dh?BX4"'n%r4-P07u'[?,&mCj/%j8@3E+&lq:U\b/<$f;=B$:mGnt27ABN5dmV5`%'UYQ^N"[ %Q4G\*Z9ujNVrEo(s8#^\SUF/A:Vhs%,]3@QVUujB3"+8lr$B3R$*caS(n:d6^dWmgTaRcCAjle7M_n"RCNSp;qXQoMutps %8FSKVZ.bjM7Hfe_KadIk,$saWmMJ:mZs?7tb(hl:8rOJb6`Je]Gq&i`r'Ano'-K6=Z-_S1`\nFRLSThXiD`fMFo-Dl>D;2RA&"\Gd8;Z`a25aMe-L""AG8qJ`OJV<&DshID3A_P\l'5Nhc\gg,Ck %oNaFd+4jW-bB;XOT"Eji)?da'D`.JW)Qq&k<0KJN(8ItsRbrDjgQ:qhVR]6a%)D])0tn#5R($l1pr.*?#/+jX$U?g-)?_DRC)#l; %c%#"YHa9ZYNHYFtEdb;T8,#pS@Q)$VOBsACaa^U-lSY$-d=NpP>@UTn]=n'uos=PB\V.1630YhUnl_)^.dBHT9m/Y0Vns=$B3aJcqD9T#T%p--JD#/>.;ud+mXG7T-b/iK@:<7t,4MSmOgdf#HaqiZOb9+.AWOqH/R-b^55Ge(i8%lTP?IM*IQ0?7D %=7Q2,0@?hcYtPhHBBJ]KATAkF^DCtd3.%gSN;'is/&<1+@pg3t^\\a)qUCP %*)gh\;=fmqAP*:?M:jn-QX+FRUb:b2d@[:U6$KZ[hdhJ-8">(Jb&/0I,n0-g"R^(nQN&;u@e%Z8ZCtUr\iobPH69.i6XsmbcB;]Zu$/?T3J)D.l]K8pta8c[)V];fllR;5L7d#=+dqkdpP?pGil*D)KXe]C[:en/R4F:OhTI);]9jtA&nH#CTOW'pA8Q?>V4iR %?13rX_:0N6XZ$\QXjs=,=B]&'S^u`m,Y'[MH!94hGb`d-96)+(Tbb7;iDo%efeB4+)Q'$5NV]Ng*ib\6HSX?Q_7\C&S#7]q\(*0c %`bV&5h=YZ"n2kU5TkFWA#PD=YeRhZbIRCJE7dWib>Li:^)iP#iEgDbdSU(0B/G'0S?ZXJ%g^gnKk:blm!S:M))V&Ngg6KP1@k=pL %7`(<6YhlHNle?l38oZR$.E*`,5TB(8^"eHQjP@60WEF,qG&8m0!8$5(*bs`D3GPX&QZZ)>h`UA-Vs^0R<3t$,-'0g^q\]/d'n(L0 %H=cPpW")3:Z`CM;V3fI)o]R$9q!NT=Cjr%#A4H[T&s*i0s&F"MQA`-nLKFp;]+&VK6adD=]:F@LI<]R'YRe]iQ[eQ/UI+R2+anLH %"D/k]L!4='09S73HJ8IX,j)c9RmI338rFBK=a2H!cL!H6oDVLVt[2tn7^d]6$s6+WG8gQghka96U9&"^JmEr?9ra^3dJ1lEWm=F=>3dm/R1gf,!)=ncknP!Wu %(hC3o$4eC-=$80c*`2WV`g:n@]/pQgf5\]oiJKLOAahUaV9A.8gr>f[V:Fb7.@3[LQD!-bnFk3>FqB`fA,?9i&!"GKE`=11YP:BT %\g_.<`)EA;LSg=m]"NDo07+\4kX^9)cP86TQepKqP%OI^[teE(AWMU?5NCPc:/L)>>O4_2ATNcXfXC4oh8ZV`*:6)eV.D.4=p#q" %/RG2rhIMll<[`==`P+gp.fZfrXjPrX(0\9J[VkR.k$>jPgo_Sg/*>)>>I&!&R;.3:(;n8nNk3J\?A3ZkM_Kk8J882U4GpXDk`GI& %o=M![Z`^uV*kIVJTqg4mn!!(1(j>It#qptE],0uLQU2`dn9m+AnVl:o^JXjjpU`VtU9?C.b`-4fs(K+*S$P::,sqVBoKe;:A]3[' %[8R@ogXj$;maKc#[!_mUQBg9]:s8A#WMD_(qG_(YSj)i@Ej*aRBpnk!^@-,![KURjmF&I4k%&?I=0sO\S&N4hkPK`sK`9I-fsXa? %lJ!3bq\FUN]M?t2Vehi9d=(TU'Q2-2f5poXiVTJ=D]PIiF_bidX$,AeK"9`L"VbDna^%?KiB$jSb8+`Nr_s7u[Rrm4bsmsUG.gOl %-/Z8h0DS._DF_UC5qBG1%c?`$k9,`;K-fu.3T%!O`pUO'rQ8knZ(4ccI=""--G*%5[UlE(DJ\;OApPP6ne#?fqfc8gn_EHAe+`1; %-Ku*I>0jl@qt:4SrRAApXs&\gsEPFqZ95/H4D)Oj]HA^UfdW1e-m3*e)c5CsSq,]/U1#C=9YL]ns9(TsjSU[SLDJ`4>8g %LFLqHB#2?buS3:FmKJ[ %(>*5kDA!6T,_#cu^Md@uY.qLcb8qIngfd*[rE\4pQL*&4D\KaA?M-ZPFg!-NQZ1E>F;pg)9C;ThmXAHCakOa9`VC)XUQ=;^fGj># %l^CJKQI+PDgIOu&TAG"^a7O"srP6As;fi<(bV,2l,h %UJ5m^48h$3>\-).WD-C(^>o$;0>mF[e\?AJ`j'YV4%s(-MC-0sY"*@H";V[%H_1mt!QX=\k0u6WYgj4Z9.QjQIAm3-\"VaKhkbLC %j7Vs2!'!FNgDAsq0!V34oL2,`gigU\=[fcJkpS#Lrg1)Qh6pa9U\"Jc*Od=qB4_=&ThgUb3>j+g[CT]DBr/Rtl6Ck:0e<3KOn6q"n@WIgPq(1oF"5bE)UTc#6Qt1lW#aicRFd`ST+UfBNkGQ+fDOX/i %Za6j%^OP*U3,Zm0\96A7LCRbI"CFEd@Wei,VZP(<=`r9<\\20Q9G@Vs;cYLp8L"#oTo+1;)j]P#ddbqP(#uf?@Nkm_J]Q5^9],:/ %g+6Dcs#!G;ZM7h+:?I`61U1/+X'&.PPq%#_dAVR-clBQIlm)kP[*:#RZV\%AQoeJDg$p+j1 %LQc`jmB]tj5bs67RlMD+3f0C2CPA:/KPBiSIK-`WQeslF.Y,f&'tm*aX0NV%`Dk4d,RG"f+`s$WYL[7;aao57d,baXOe/mZ*<$u` %D[D;$rNV\&]mGQU"ELR0G712'(p,0JPb^SYZLj[B(i* %KoK$;&]>geR8]M;2Q#uaZ>sBqMVX7%OUP2JmS.N,#.^tp=b#)SVU/Rp>^%Qbd<=3ArPLNB!@H'$'q_4-H-An$Jt&D2&$"5--.kq? %k`QS5'GgrWX&)dXEjh37Q^'u+!'C`pN?#e8J(59*A/]t+5cTSdX6D"T8WNRJAk+F!=C18VZWbo?m7DuNi/.[*25u6%B=X$`DEV=0 %;E3h?MFBOn:S7BeNB50$8,KT">K7V@8s#`g_#n#8U@O0.&;D<[I&^gS_-%urb^*IeU;YBt.FXllmaO`L+NXk47!OOlKBTrK'saqD %o7FQ?;aV'mo`]jY1`D,h#FVPec8%S3h9/ja,SHO=,ch]jbL@:=faQg#_/.`i,YW&*(/:AEmkEM',t4cr+V,>QBr-m2DPgdmd_hqA %js;Hs9-7?fe\/$p@EGR>TcZTQqp26*LH5UT9S#4/W6"/do00,.j-:WuDY@jM.auI!i3j75AYN=+o1b!%HLq]/!.i:L'M?$c^KKI5 %I,)R*$GWN/n=6X7aMDHuYUn_rLI;ff<*$o\VcS;op,5p$]5EkjNEd/b":VZr,EKRQWnuNq/G"'6E/GHs':0;,j,;p)l",=P82L39 %2L^%"p]mW4!U`*'m[@CV%/Va^?I4iqnD\6`Hb)K_3/;am;@aeoIi*TI\"Q'Fkp7=P[pZB!)3/I]A#h5+QaJc87P1SE[85@B?h!Hb6sg>sFj\_ZT^9LDJ>$gWfGur_KV_Y"$l1(l@*NK-8C')B'W"%cgYRFGpWYe"O+ukM*\QGP]eI/f_)56;uqGR@kNt!f5pe_:Ffs?2[C: %"#nmS#f9;#0U$gk?CV4>m0d:b=s:[gcF2B9c>"OO'/)1LWIJ4*_(16H`&LK1$o2`64q5SId'`t_kp*%-"gp6Z`$u9'&\?8&$5a:9/[O9':DNu#h$/:&SF'Z3Q&=jl7D`6I$ %dF3ZduJPFsukIsq2TrB^&D_'.:EnR)^,eo_(iJf\+4S/G6euo3OGG:AM]5*A5KI@5\``*&R-!q6U4iL0Dh/>nli,T8o' %&Q>fTr&Y`sq"aa^r"2WQgN3rZO5+YP_/D]4AXeRH$sqUk:#H@T61jep3#*YGnJLU2(^6`g1dLMcuB,]oBS\-!8NB^M7Umdo^)ubOlnGIXC<:7\ZJt^2A""h+.$5e^n;VY2.^Jfh\WcRD;ldC9No+%&/l,W/YSO5:_/B*K.H %#%j8sS\u$'8%:VH?Al>^Ee03Y_.n=C`&5]6\= %1pG"UA0?b9^P!94.eB5qD*&[BfW?*B&)m,Beki)LDe]`W`1(FunnGe7QAJFo*.[mJ$1u`?G@CTMd6 %\n^:C\k".#RH`[OoR-UTimuf_A:+6DVf2%J&_hJ_h3GF/8;`Bn>ehaRahjY'%S0QT+YC45`3M3HeBehW!'/b.:SJ %FZW-:$PUJ#(qG0ENTlXN!_rQ?\)9RH`4PGNnJ*Uh=.?WEA$Wi+![[>`gnB'jIta^Y6iIX;";fD8nI[%=e3QtU/qQ-Nleges&!F=I1!'RYU,RLckMa&t^BpS=+Yl^"e)95?/> %$WFc&(K(VC"Io<6WVIGMR]#V%N]BPH]kfr^G^LT.S\ScSD&0>>T6?EU)lY5"&i;/PQf>uSblU+.KVNPQFX/>&M`MmgKJ:umd7uFY5TKW#)-<'_WJLVIN4fc+^0H&4joaZ\`s,+VgqFV %r1W;uUiJn?[6N8Cf8668',#_Vg.VE=o8t=>=$8T"V&!Rs6lW=DFa>Z>3pH,Eu$TL0Gt %_nh"c0>STJ-E6aCPq>tSlqR0o:sLtqH4>.3.s><'7^Rn5f`VqbJ%B%q$3:CDl'd/%p2[>s8OF?6`gRE@=*$8b*QF:sEnEeHD`PefuG@c;1Jd %ne;]EaEZX^;0iBIA)mqooQ0@#HLmR-[ADrtD.`0`'%UiXqln,@-ZV')"E>&R"CZG]UHg%[285c19OVH#Eeg,$%^BK)1Q/?*'dXb$ %_N6F/J:A,^JDsYkR\Iu"MDu,hT.^7(&&J)D40#i#:JV6;0f&r6!30R:jPuIPOfA'@S*S0/H>A&goB*-4;JMdL`hi#]h^9`F9Mk33Q_HV-hS%D&$l9HeotbZEG4,RP?dcK=1)36Yfs8dQjllmRTQ"@ %QA7MlN.l5B-Q^8IV*=PeW`J,k^+5:l#BAGKrs;RWp`@X(6^^o'';+ %+-bMUp!dQ&V_]0g#ouO1Y`Y$M:72qCd_#?60YaPgaSR)DQFOjH4Y#DHD$KoK3f9+`@(+#/$=RQA3ilmeDi.6<#Cam(a1UHYo0RqNMi7'2AV"kX\T^A*[8l)NF, %,eD8mP'q)F#gOJ8fcdUBlXT'Vo]WN)FGUE:1>,NT46GQUK>_NAC/4F&0R7um9T[F7$4^plb`Fn-5j*EqH1=jro:CrSJ/1>unUgk2 %_;A8hNJO$9MEV[0Wk0r+H;WL*pm]2j5We6lTGp\dql!([%igim2o=Q!Y5%NNTTI/t@6,W9?AXEsL %PV`=P]/u=t<^$)CUPK-ohi:TBA.POuP-)*USSI/V:DjW5<0@p*iDE,oqsGfg-(1`_qGbPCC7kBs%KsYAdS84%3'A %Lq]9BQ_IL;&HD0^r*ElfA_V.S;7+g-*lnA4TH&Y%K1u.f\,rY[_b@tu"BTn,o8Q.,q[N4[g9Qg6\q/p=Rh.uFH4?HcG-A]!L?Q'I %1J(SMn.:2)!:>U7!*7+48fkGC]dNH']eQL4U]i-*Q&]+gV'd/g7^km;h3j>J*@a^D#@:POJ<6aZYb %o(tuFMb:11"8-CI9hu.-DC^UHDMj7X*6oBkW>%2;6,r!R][.IrD3CVc.tb&,jqW.EjQB[,PiP;C^Vf&]9>MV).6$3E\JYk$?f5CF %TcCRr.NAJ1mGG;H0cLTNH4QYGl.]O&)'l]K/P.6Fp:7F\5VA$R?uHBGJsbAtEYX\0"H*V6NiK3E&.gOS:&XAH+l->V`/B3a'2g8X %=`LOj5n8&`N=Y\gPR]H#!sf#k%XG7530@$RU(=-^*q0)tFG62Jra]tcA@#(H$c8ot'7d4W2fFgQnXVJZZ(MIA9Eh*+@HU$K>4!66 %;ZrL^nNB=/h1`[8Qak(`+Y#G,QPn0aKn>],`K[+rWjk5JMtFMil*q0;.m((Bf&nK..6PIb$9/)-^D`RDL'n^(M.UZSm8_*Kr)N_j %&l+MHYcbVmb/fU]T.j6Gf^%KcU::i06]gMa/$\R^_r2pQC\Lh\0PQh7^':s:YqeF.kE=V1L_Er0JC$N^J!69p^^&`[o8_0)gE%4$S.N.M2"M$dS]CFBN':>'K4TdTn-j7h'*;QRa1Y2uS#I&Lfj'Sj]o?k4tB$;96S0N3'6kWk9d)A72o %7nB"4*0G&!fRa0*P/[)i;tXUlF\lP=]_dQYl%p4mhOt!''(=a$EMt;3'E?^.3Gn$qrn(ML[\o(ZAtE<,E#3U4RW]PY'gQKu:FHSi %;q1B[%Com:%`0VJTD35e`G+I;Jsm,[3E9o(/1BZG'\Rt23_+5QPF=9p3T0=u9akb`aa(%lK^>OqIufB'e?afM3_F=]?64P2c+$r# %U8g38h1nlLZ(XUnmFsB>6T)DXYW]sF'j1XTG#`mL6fM7P=@1Ee=5N83V:oF?^Wg$MkO95=LA$_Zq(=ma]R#@-;4&oeDAM"F_%e$3 %WSTI1$k/ZP.4aR.QU0:1f/BZ^(t&ZK:YC\]J=AYlDVEc'J>DQ=T*rn8LX#pf50X"=\P-#/AZ$lqkHJ^6IuAn+aY:\M-!`m)QNQKI%LV\rbV<7If+G#!t,-rHRq1nff%34hm[mQTg`tD;qZo`5b%=TH9E#CY1iCS*#If!`I$dTBGL9Ad__(BNKqXA&3HM %fkUgc$tgusiG#C,4emu(nP2?lTSj%KgM(,S;^J6.Glm1"N7KrKA-"[`+9O_n=\se"j5@rc+UU=8"rIA&6o,cLJfX4_M9NC"E-+I& %<+n,rcnP37VC(%U2'E;=;aW8cVnOYjT&!>(-fC:C"Zt7NL[48.`s3K4XHH.+9Uo.FE)W!^_%c5fj1P*c@WDJ&BUF!\8_r#nm"1%1 %6A.dEQ>\SLd>;AuOHA:Nc'*=T=a0L8;oA]XaR=GD6Z6t'ARLBlY@]+F@$QLF\6.W9s+pY,N`q(<2bgpS'jSuN(C*9h:2de]>PQD( %ON1'h)N3_ur1`!tCmrCsFEZljP=TR.#/eW`_c#[?UCV^_H9/+R07ncEl:L0B--hsug_<8UO!sC")ZdEogK5T_n2hWX3n>i/`6E@F %$%882(D$'$lBUOtYN5jBB`,t*2:\;*U!DPA9EU$#E5_1.N2R4BQ/?k$tR3dDDO?*p@!>HTm.f?IV`G,%e:V2X`:6sgQ[eT"&NMEiD5X/^C?a%-?N %^Fn,P3U#BaD^_\0SYl=OlVT(e'!\;4]m=efT# %AGH4ZIT_=4bme.6-QWOV-K]N@]1lnVWh5mT)A>D(CBuGs![?0Dj;CNCC1s&YHseYI_d\P-]+34mPZAj3ZFT0[Me8lW12\(jd!s?K.5@c/Me+KbEX!R$,Yt(aS4]n.Wpj/-`:K %0Z%g(mU?]NROWG:[@cua?Hnfj[Ck?u"n_,?'2eHG1;Xt?E[@\=j4tO&[ck0R%r\N=9hok'>u,c\m9uW#b?EgU0)LCpFWq"<9FB%l %+\=07aG5?t8HIHT0t`pMj;SRpHL-0hY"*o5`(uiqh/\$O>q^?E"jMNe1&oEM(IX#$^RS0uHlFjcRjh-9;%-sF0>.(^5(6]WL@*%]TOS/4&7PE=]D$r&.dlN4^7[e^.`+I^)(je\P[o%M+[\ETNrl.?,4 %MN8TAYrMI&ot0Os*52u[(/heN>c^U(i[=:X=98O# %!"/h>$Y:>/>?e[)qNPWL]]KB>;7b`KRs5n#>qlO#4`FB1p5lda4lP960/Gt4.W,AEfHERa2S=_t+5bhh!>pr2A.XbNCLl@^i[PdTpmhCYR4NZ/$)QKioF5h001Z'IB*5MG-o>efmT*$7M@Z"A)Z!$VLT\*iXO9( %W_+g?nflfCp"RaEpV-_O(RZPsR)ker#AdF=L[Dt*3Z.DM,KI0Q;&,r4=_/AdUAZQ.gP8l)S@<43qNH>2WW3.r.kjp\^Fbk"LLP8J %ggMH<53ZJ3,k]QaV$]UJgmGq'(\Is1@2@p/oG9Nr(&$=,m/O$="#p=bJ19pk+FM]s`:?`ITpKXPhd!)`2*kigNCuDgEEJrFm:a_g %XP[$R6MmC*Ylj."SOt$A'&ho,=$omJ#BN8m2&%LXm9#;*>S['E96@pFq2)ll@R9/.DE@5GFU#?:=nAmPm&YSeoT0^0Vt\P %Z8ljCk(?9=NQjngZbNiLCY/NZ('j8?\c,Xbj_]VW)ikE03%d2r2,DrgL^_7HX2dQ5IE74`p`sci[pKdCGmA'[!Lq[Mf<=GFY(mpt %If%X'e850_:pZXk:eXI?>ke!]5BP/_>n]mqGr*2iI:[b39L6@Oh7i,B++7Ca6H:CGON+,a7^.OBBKIeZOmEDkP0>ig#sUeCENEsN %gCgNqCL!8Fp\C[>f=UHCmkUWl4$7r?Wt><#)LUGE8DRqC02'Rg2nZXI`fW(#C4S0EZ6c1K?>SN@YEpJ?r"OZ6ko*-q63&gn@^p4@g$&6$+gu%S>i!o*[]+17X#aR1UD13a; %&G-_!^0+a=JH?$59(g"*dKUXo<=>SU'KT0/JI26TY9Xs3:2+Je2C?%A0Im2HRlk(%eO?;tP5T:;g=;H$3!$gU5b_h_1Xj41Mj_fL %^5KBKJieo?!AOVr?+W015DeC-#ZFWu%"!R\kGQ[Qh">XIo:ao %TplYh9f_GKLC-/fLl%].V:qdhLHK9.;Zp=)bb/E\L+-SD[E52Fl88Yu5c?rB"L8J0[i=[)#h77Eedsg!M:Pt26J^O1b+oad(9j0j %"V9ndj7"=O(Ce3[d-A[gQO-R3X;u:\`f#(lGc0Gm<__mjZt?9GNd*J %ee$X"'`&DNLrKjb1D86j@A1tSR0$9a)%DktE&IAj$sYM^>0WlU#U9FIcENhSoo+i?eH&cmA6Qo[9PJ-kT!@r2KkA2m6u@6&LfI&*!4>9aV7OKrXg1;G1)P&juh4U_g0/KciTmd"_JLbo,Q6nq7@'&J/E %_=^DVrfl'CY^=)X5lbgi*[CNZRn.d0#<0]U3J59gD2+Mfh;u2k7\U08kfX7%ScZsOL;[[ak>_mbDRY6%bB.Tq-5/fjN!@s09.jXd %4)DU2C^hWn+hL=!)tj<"kqD#N@%K[HBJfP&H/Vtin"HoMLuACu'O$H?N!*Da,5kn._T%u\0b_?9j?##!2XfJ9GIWY?c4"Xm?f'1e %Qd,S5M3ZrsaoF;m[\+hpq+G1$:9$jH`4ugLS.JC%0U-];_[HlQJE_hY$o+idLb>=V,'2gRmP(B'sM-*Q;`3b?POELb+.Z>@q %O^D'V0_XVQ#JF4Dd$9%E/.N$OE(+0SZS`u8a=XVjP9hrkK@4b"V$FIO>S_="_#o4rl:*Wr&9.F6)dAbb6YHbFcklf+,YAZ?%P=.W %S/8(S0?kXOVVAcFOWNQLprU+>l.A95N5G++Daf]meQE],=k?&TCPeddqg!B(C,WCe:MYQl_`MPlp5ckVjUZa"G?, %=\cr^gXfV5pV(5lB)(#MpJ`AeRs!35GV$Sn]&/\U^:$ig;k"n?7=aC0^2j:E>h^Sq0/HEFg"Qs!?p3EiegP\mHKYCa.4$uLO5CU+ %rUu/1b_/bd!>YO+\,#F^BNQUJeof1h`H/f,rQH&eJ!E5#8qk_c&.$P(G](]"',o+PhA=mL4=!p#b8a@# %^4i3U]I"U`Xa)]UmgC_M>G__=<)G[Nl5cGL>-QV$:Z(u1GEAVXj3[^nS.1D=LKWXbTiW]1KM9IHs` %e^ZU`Xr5T!(A6apb*/k8*p;ZP$K>8i!:J*_Tu4NSOE+O\L+cTc;p,m6[hQ!oPhSZVPAh%/o[^U`SaFkahda!)Th9_$P:F5ZegQfl %@Do4&?U6aVD0hN'+1apL1mP@V)'JNE)Q&]JeW.#tqO=%7U&%0s5N!0aK.$*Vc.89$Y>+[j?hQ_Ug$-[A0E%>nDWVN%p::V2O+,]Q %GS/8i>hs42>5O298Pj:1jEC40$2+8**+Y-gSRm*@\*&6O"cs:24@n)EFqKG5#XT`(\9qSg540CaY\0mA)>^Qk?!W!4d[0nLNEtgo %5)$#q-TI6ckP^>__JumWA_P[?41e%5HP-AS#T>8Oo(EqS*toL0_OMe-s'7O6OQ\YWSEa.Dbe!gShTS4o!WhJ7qF-NslRZ1X+:.j! %(K-fG+46^c(mCZ!Ofu?JVZc[G_hM>,(00#g%P$h/3*$>gf;)AW^PUEMf0,_+?oSYq!I'pg,^gG0_2Doe\H43d=2/]P0fJtjUEa&$ %&=r/FfjL*hE2i^gEf5P:)-u>U-d0WR@[%>KJgP^)l>m+&S<*^1mQ9=pO3`R9GL;WMG`#Z:uSR5^c"o9 %81u:,)VE#GUA9di'!1IVPk+@F$1L!LCla*[03VHVRjoc7G.;B"30Z3&R/I`Gbn!!<.0Jr&sZ0ke%CQfO(SI[D9d7`-B %.c9Tho<6f#2-A%#h<(oNK(e`V.\j,Q]1OIefCbr?U'a2M%WK2[5jZ2A`'$W=igmbR3Do<-T"u3DLM7a>H %oM_;Cbl@Qm3J7;(X9Nsj+@R!iApA$nFXNO]f:8@ZQWd,O&tUekgJh467A4ghAr>a8LWV1,:)$QBgh,Nagmsp9+G*OD!tfYbPQ!&H %3uJsYW*`!^ZZKU:'CL*CQuM,.7"$t@LfNZLf>!u:]RR*k;=\#74ngcN^Woe6@AQ[e]^s0qQkrq5`0oC)\M5Q&FV %rr)<\h=1;+rS.A8pODr3J+rh)r8$iAorn?e_uK"?s6JS@^Aj*urp>3U^R=pWs6B(Qnc/Q+EM%a[f>%@bT>1EnhgA&rig8]S^O5tB %5Q$RLrpfN.Ru[JtO!"E!j+%!aO.lUDWIF\&TDl%oG^T?,>l3u>q5\hg"+,j3P,%dK07WZIlW?1(YL,#4d>%je6&#DCJ,eBXp"-tU %V>cN_hCKf)(d?RPe_j;(3NBQ%gAKsmJ %9V]<76#[>)ck89F]qb"bW$B"[lo'V@eo\"P!g56$m]lZQgPU58FUJ=DD\I48&kR>\DGVo>S.liWnh<-rn@jTr@h"q!mgqNVJiN&, %0u*pX%\R/)qbcnsDaO><%TdmU*Y^9cJ^\h#S*&c>o=:_'6.]:&N.nBLH"P[k6MS,IA#H^]&-M#5N,Ik]R,Y@q-K8IqbGTP!m.2n1 %`HO:]ro,FVWJXPh7.\plj7FD`!]mjfe%,Ms*hM;%Ulr)1KgIY4MAbi22u&(QVNN;nNNriTrl'qff'1N%%u'T4XOB,Qk>JVE4I_YT %aF;_#S.r8s`FFiG;Y;,DF^-S-ku>3+ERQpq/Q+eOm&Bg`Qii9`@+7KbT@ZIn%aDn0F\Uq,ok$FgVm[qXY-0u#;":495dY0)KU.rr %+9eZucOf'q3-P.%B)4AE>25e';Nr:>o'i'K#:&uIGjtX/23^UW%JCC7M&g+([A_p0TZAF]GZ3=PNfprSqhB\?J1E('*[G;FXGVH$ %8tpeeEShDk_@tB/?cEYoHcgacrK@f-a)G<&!uu!U]Q4PUrpb#Vs4ZkCfAQ6Wo$p39>!#`Bq;&s;;OHeA#*9nNf9.9)KA^M'+D6A2 %`f`BN25^+bE!L_nq\E]WeDU!0A6dR@_dFi$VAX.c*H739_GIaFKBJ14UfQKoNn4+7j>W)VD'QA.OmL*V5IIIepNUC$#1\!3$aCC17i/j]obCU1nK8(]JpnRQIh>-$Je`.cnb4*$J7?0ia-?&6*KV6cO@rLrX2_HReWE0p/ %7"+bV"-'o!g5*1&Eag7?38Zl9o/Nf\l&=eX0U6,@8$_qK*-+YhtZ %0b`p-?@CdB$S(K2COqhk(RW-0C03Z55>Np5hdR!'Z5=I3;e_63"n:j`M&E;V6i:%Sd6KM?f>YNpn'5&>tas2MMFmO#7UoJ$CcjJrkPi\4GA %CadsUBK:COgsb<#e/W)G+-FtZ>N7jX=n&X&7gPa?>ks$d80HaH:juWW-DAfaeF;][p)"d%P%P9([ia6@^DFHD0q-[Y8Y.8,<*7GW %ViOn=+ceF]kN@Jl@INE&m?GeF0J38rGGVY`OIpfdb!(t1hs_O*=4egs[1U(#D!c4_&d3UL)*&qU]Th&>@n;D)h4hBO^FfO/C)c`?hmH%rc:(>%+oXi(!`i(+Z6bAYsQm'TR+eq^Yo[0A %O9o?dIKb$o*J^kM:E"qhSp"CFnE[m'-6ZV?m^+"2XjB>trOP_U^rdT*3-IN>,8O9?MSh8Q&k(+HVE'VOhqhb13MI0Vaj,T)VDi>q %#W!Cg1+TlZUiK]72;qT/?cAo"2*sP,p:=;DaO!2_c6(b<#b:nsMpL]\q,90:7Mqh"gNsPCcX["WW5#1lC68md^]9?Q(j6>bi$L%LILg0#5s7?Ib0;NN4`Ad;8-6/jD#hl55*`^dpCC"G=\SuU,SeP%X6dN$nhkqNlVo3kY %?hTBbjH+A@%-Mhjl$o5^G^nc&EEfsM!c"D`rlV.db0M`14gm*C6`u*>I#R)0h=T@.;>4gOQn7>p$CdhU(#2F)bB"FPp<*L\@dna[dS6Qq6#Mb!k?a=aGm])b\SM/aMfnNhf]HC8-k$O`J3t8`>_Qo_E %Z=aFb(-lN5Rl6@(07.Yc5eXujZ>'L.!Ng;S-=0P$80)[>LG%\hGH_*oZ?Ee/*Wn&_*E?>niFPT`0?nQbXNgjMS&SBYIs4Bd_@Ykd+a!3)(T7G6I<%eP1^G"iZY*ZN=E*K8l#;m=ZOSH"8p@#MZ_^Lk4L\cP %a/&O;t*F %A?u>se>FLD%1VM4QNJs]&''7W.iM\2?JZ)dPaefj#Bc>i>$1XZRiCiG]F1<']GJk#=pQE>=s$LX:OK_`obHm/7ju3_hh!fh4eSm8 %NAn8T@&_OkoZN5Y&G?D#HHHPLI73_P*XlLelD$0Wb2CSr'EPOuEgJIi<(h)k)JuTaYR8(](5U3Pa.#Yq;VRGfuQQY(s^?@inO&#tt0ih/) %'rdM>H@lCZW)Ba-$T;o[TO%3>u?O.6XL^#[D*\F1;IDF^cYnae5NcV1"3nWVkZKsCJ+!.dF;ta[`nlX+k&L)l^m67(L %)]2dF"ODH1e>f.=)7Dg@KHo>1>@gSXK*c6NN)i#AS5UGIBo9qk %,)c=cU%E&a;u!`;q-jm8_T5ju_:V%IqpF[I#%41KcECFX]elF,$Z7A&(r:O'&YMm9BC'A5ED;X^,726E(J_,SoB:"GscNt %]L**'[Crs:"?-CDOo'nIBXkmK.;SeDO3RO?nN1N>7=UbY.;Y]l;k+\kIS?A`HrL+ln7![M_d/RifD?Qt*'ack&nS[>+ZH!>!%$9C %QNeX;a(oHY6I=M/QsahDn'H:m(*o?IX\fpJa`G(A@DY`I@>JaOO2%nBH4aQk;d&#IZkj6@F96;,5YJ0bp[c(7(G@U]G9Z5s>8`WK %MIG6^*VYP&.%!HXfAY['cPA';'97Ylh5:2NqK:/%=q\Kbo7Wgl1p9sbA-(K7c,uf$Qp(@=6,a>9USn$dl20_+&4+eJ#QCE`i*6Y&"7O-$FT-7IuD0Ce%`gD1rIt-9,`kn\SqF"^F.j/Jh+$e(Zb2+8)L#G3'Z*4HN5=E,CZKW&Jeel-H)qQVKPi>_#[d(p5eIX4.9HD3nk[E&GqLRFRdI""E\JgA*WaDC$`Gqr1+;k>r`Ou&UQqg:Ub]p^9Y'1QR6ns)a-4E6m3EE^XaDJ[:+mV3.Lgo2L42i-U&GD(YI-SOlD1Med %m,l@I(.c:Iql"o>)PXc^fp,D"Lk]0uL#';/BM*0sEj0OV@HnISEGU/]\"])3Z(htF1TY-aI2(@0Ai_W3ksTq?LX1Po0KXJ32?4a( %q)Fg`KWWo-!=ChH8("BFE=_[U/i;l[,G\u9::-@qNpECSoZQtpl'317!#.`:^sCKFh?dQTb#Q[0.)\IK?&fT$&*g'HYW/fq6Y/(d %]=AeVpT&+N(+5c.,uT'="*iEj&8T#MKEII>-nOCi>m>sF/nD0E=>@9j?6udQ8jN07hpmkp9*NC6;n`rqZKU]Pon0_=q7@d2:jta@ %-i5UiEOQ.JSK[@8b@cLM3J.#[Lj7N;NAuW;V\!TE49?k_FpB&_YEId>Q %/u\=Id*?Ad!#7FY&rP/0%7cJ9&`0i`QZ.[U8Y8(`Xe$%b7Z1nTGcN:['r!L<\@ZA:+Q)^) %Wh^bt1L\%;I@U&_K9eIm2&YgscCmNYPX0(BU7l;BY\tcW?2[ar$]I5V]--$f5p1WP.k]2-"ss-""'!,AVLC`)+SOKE5DATSWJ4\.pSY8XK6)N2=mtS%i&C0Vn%L@d!d<2`35_ZU#G'>O9**P:(EF]/T:sT3-1s]Y_huIGl`?Fb5/J' %['Bg)84-Lfp]H!R#B:#3SOr9Wt#W%Yn#d?%P5j7eta9h$bM(rj'$J;#&?Ici% %X.O]W;?[84p@6C$'d2jf`lT5fK\8K$@51MIm<`$jp2SB-&i5bLi:WWgSi#9mi$9t.3mV'*-B+VdSNDsdIK`9k94s$-kg3HprY.E:r],24gGS=p_]]s3@[,/+>!WhMZ=C]KX+8#*5G9.$%)[TO]O4Wrr*Kp.fnq]l[XsX&PkKG %kA1]MGDr3<@CqZAiaQ._ZWr-i<`P.t>[J`8nnd6hJ(E)TLg)0i3ao'.bA-J:@3#ZC_^O14-ikbt8P]Y?9M?=I*4HRqdKhmJ01!Z]r0"Q?7JimiDX"njKJ2V:c6@(0iD;R-ES++p=G!4+R'*J19VZA&cRKo]=J+q5^"+u\4E^7SWP5\AL\:\mMK&X3da %[H3LkDbqmm0h2r6<2'T(i[NcB-#*i$&Ygnj7;@@tujAK8T2XjKK25kQRPem]q:UN_Tipbs#Q$M'4I_E.n=_@mW.b/P(\A%7^(dQn&DX$=l-X %>?j@i]_)9L?RIpb7M`iO1se=25\I/)E?KUYE);A00qqu!Hbb$k&QOodBN`Q9>7VeBLN"GDKq]X9J;)AEIBDI2>uft:=:=bGri.`b %)JCmTWAX+>/TM&-VlL'c!o-q[&sHSE+_Jcl>dQRuf95IsBX^fhnX@.-QYZN_2;:se\qC)dYo[;2N%=.6Rn&%M>!q#:-*,L\/%?D( %j4pV).`l*,B:6>iKq4LT4TqI_-c(.]q@IIN9+tm"eMc:j3t&rG/*k6@87'NPaJ^+idY8TI\FBspqd$&jNh@3u+ld4q$Ma"7q[\E" %Gb"K?"Q?cFuq-Q#qf%q/L"l'1uXim$5kmY46rfU1X'$6ef<1Be;/d@i[T2C=*j;8Jc1 %"K4_(?B-$%n)[3P.LQo+q'?L'nc]jIY/FjnfphEgqQ`'li]0h %cA[$<14W/#@2`$2F#=?+@`dhV^qNUc=qS2^L1UiS^pF64G&),oAk%u';$85_M+!f-@?;. %?ZH*/K]\oBA\DT\5pPK?QW!K\l3\cG$%d.H")['>/>m:(MkI?J:f-sAOoHFc3u?>WLBA1+`D[H/B8GN5lG$4cOXN5Qf<%a.[C$S%(O+VOFS'/WaFF(g+a/guqiULetHuT_RO6Rj$8boKe9Fp27D6+2T03W\Zb]#Tj9fHGt8/hq;"WA,?2@<#n'1 %@KkDa_a:CjB"5>RB&'8[Ff\U_A!e8O6mH\^/[@IW%I^4Yc=A]'a3:.Z0\GF,i>d#\c`7k>2>ff:0jS774A) %#TK"](?u%WSQj8V:elAjk,(fLetgj,qWS`3l5"n4$j!RGfWlIsm]B.(Gp9UTN#8,O#QXIE<9kG`@gG.)k^%$@P:8AZY;_9`1cUO8 %KRfeCr_Ts?F\b>+:91bWC-XAE&dcoMh!7-_?Y-I+l4\^eCJL".5_1JKR)9NgKRX7ZC(9)b.u+jM+rK`7,cg8\%CcOH3'Vru6P8,t %FM3D<`c!PR3b&`JeY>:%1f?0qYQG;"*Xq`0Y2h:gH(p.b3RBc@5H:aVb!Xp,1l/gRkmtB3c[k'\+_1R51NsQ`5IR\nIGsiT91XRP %k'HBik\lKLM$>N?YX$DhZCQ*['k';-eO]+JMF,ut.F`up=eR:1)IZRgDL,E@,Qfj8%ajTHajCT5#N=$q%U?o\!c)h6P#9ncp+1T= %LW@`bd6qF\mb>.GK,FdHZ!7TU2lY#3P5F@)VR\?<`mR;aYf17B_qQ%<**0QZ?e1[^]baHo5KUj/==cl0bu;t\G=R>'!qUGS5`+i+ %1gik'TNbo=,%TfBR_LB`20)lu1n[/@F8VL!Po3VYqc2p8XTC)-&UT06.dK)@0k %N<@VA3h:LIZ#Xs*m;!8^j4ANnJjSki:lT"%rk**BF<.1I#&tH9+UW.9qr!feCgE]==1sD,;f*c\)+q\@L7e"OjFgC0AWgn_f47'm %/Tu=jNcf5pM4eVk_N9W`;_9ms'[5kL^$=I-dm0lpp(k;ST))'HAHSor$'AD*+V,WUej(P.2j:+W1EFhr6`J4b$Z#(\Sm0Rk*!XMD %GOfciB*IhL+Uh\QI'G,&nnf\tg&_qG4hLTh4`Ji<;n95%c/79`\LJOX.2691G)L&kQA.9"XQ2^P.5R1Mbml0XNi@sXFGjIR''GuA %."_](0al%&pkFk[:d0_W6cu6HMDLNu.gV=`boqaWE-]g(lf9'0b#t-CLI=%)W"]bkI^eEk'"RJS/Uf6#*CkW)Z+LDoSc[R?c/V;^ %=QV<@(foW?b!C4n6H5S";(Y)U'h=QLCb9*$+D$j+h?)d?qp*V\/,>%;O$WFC^>'\3eISk@lC[qBTo#%1].\I.lK!peQkl2,U@u76 %YB^#[Gq.Z71C148Prt)%.%N7p?oXU\4o"n>Y8V@RM8`&1;*)lEKs00`q/OF?"*gH8!(:d6WgN7>_?21kYVL %p2cD99k3J7i3ID[nQR:)H+-ILlTU_pfcru3kgqal59gEfWW0R#5m%MS:KAc8'@n8iAf$S>O@J=dj!/Es3n?_' %_MCNV;JlU$>V*dVX3Y`Mnj:35&-XeV5=sjkXppT3fu-6.@EYH+J_hNH3L0c%_'>8sIStF8c979">)Fm++9i=$?eeRjXrargT=Qq` %OdSr)3`I]4HnEf!N(OEe;G/j`%6VMENgF<49SL(=ZEd4nfF'IRY1_jj*HA4X1/^q1`ZX3VqUjd48*%<3FhSfRT0Ui=phV3mqn%*I %2E@jV\e8Srqm5@>lEI:Z)tP?9%p*X5mH+lp[>TS[[Ac_kgoJLPYj\m5P7+QjF1[RaLZ0ed=sM!6O8H"&_44T4`Zu^um'J)8=tFk-.6suj.Lm%P'LufJbRr/$&DFI$REEl\ %I0f6lGB[crmq5WaII6#hA\ru6c+0".bg[RKqjJHn>>,LGX>(;$O5!1[YnLiRlgii!=?A`7 %A[.Rr*OUDMN,V(Ln.I0>FLn3,.$)M%k`h9b]%4K82AMp,"+Gi:4 %iU_-p?>X\u1,[oHY/:Gs7Zq8seeUs+HmO?uU7_)2Ghrok"b906a=TSU%34JT/B&7.#fphli<74G+LClI9Iudp#CL.\-*;+\FlTdC %%NG!"+8')F?.=S=D4(sRd=He.Mi"I\kgt"7^t"L`&t#3L5%FfehU986<$De %=h6",a+7m!_^ApPEcOhJCVRPXSq>TXW1dttpH]O8X5>/f:u<)3*MMGdgq>fI%_ML^dhf;2I0/+rBVpAi1kQ\q]W_a>p(%jOj367(%LFg3)q70;8e)k^)% %"4?iPLXntM]51@q+3a0jm<[GGI"HXdAak6'eh(,s54p#,DQ#GS,SnK+?*ORs) %L3hh5#,*M^eKL3OVpYl/P0,s/A%%T[2!/dV31Q-kR.rHUkZ5ohreh4Tl+V]-FX%$:FFD5f=cmA;%03AWe@\=1m,sR=S&MEYe?Nc.,"SH6_,D+D1Ff&u:R.i'p@_0q5h4seQ-V"0OHUE\'T.)AaRGNN)m*d$AmFn@g$o.L*A5Ym8^dNqE %9cq),YR:uGCM4'Q#E&1a%)[c3jt*o!'?g.tiL)DE:&5![jPRQ^5SC*lKTnA.i^RjRaPr_WTij<25b0`ck7S.'3Uc2^l.$#A\>_$c %dDjQd6`k\2aJXTs`&R&Z`$RO5P1$@Q(srUM-`FDIBC*8.QcQ-4*K9.j>\:mcFCCQ0J=*R(12eB_I_#Y_[jh(S-C#Q##?Zs %T7(&&^ejV`h>c3R&AgR9dtXtGN@lS6cRdnh>&H\a:atmFr&s:7'>X3f8h!PnkJ&4DJTsfr.[iQ?:6e9-AO=@d]\9b_jhqpC(A*e4 %R*W$Y)CU^``s,-ZT)uq.*FQ8jTrkQ&qbX.Z\X;m`:qZ"r@b=>8A]`pKo$#g;-'+[M`sD":6G*:=%OQt#bL#R#GqQAN&R3U^)DNHH.EB@&B\etr,:c'j-!!IMtn#GqB(YXjoL7iCc+>gV>^"K:(GB0EY'Za-Anb"&h_7F^NF'j9b*O5%Cs[lJSik#4^`JC*0oU3u(MRZF-dC6]H2NqV)KWn'#(\GP26RL,tZ6S&3%2L6dm.;*jdP0@_8%PuINbkeDt@gUVBa'j1It/@!0rJfXicQIG,AdQ,l6g+=dU %Gp7SeK1@/E7+Ks+@'d^dP9^G!80UQ %$A[T[4+&#%0IPA_kWLu'cBLrm\-5=\j<7GW[>Yl41p$3Y5E%2)f:R>jRmXuG/ %BMfu#@lE6MCZUEs\d+b?:SO<=HtS`(a8q,,+g[R-`ESR\RE`Lf@VVpKkU;gS0%eV="OE3J[O"dffg30ob#/Q&Ka<#uXISFhY:L<& %JKI\CW,@n!.,g55UNiEpeJo3CpLd?MeZJErX4#Zg=?_dRh7#-erMFJ`FJ((\GJPk>g0!LL(2UDni#$Q$(bN4Wpc<$*-`MQ;Z[Q@U %&L<(7colK0PId"PP6.?I"u3<_'[]1'Hfe%WCU^HcW8Ipl"@]`R&;JI@f%PR[B\$Na[8UC,J3Ig`Fg)rsG^PRj2V'0Z %#a0e6JU%E:(n[r%%V6m+oJM9X_:?q-B+0+W`skF2C^>\3on7R=_Vp\)`KTsq%,`"k0IG"Sfe8V6\i$-8?t"l&=B-qa3ML?4Wt=>i %#O5d+Wp>nS!LKDh:fLd)FAAA>/+o"7U9o4PR2V7+:De_,!mF#Cg.f5un7nW_2i%bB/>6!7/.-)%+B(sVU.3CbQjC!I'GYB_MT!)5 %bef<s5Q\&Q.$IQXJfV9Kbs)N`\^7= %)VGh4arbg(QYMA]6AQ5UX+s,"95ge$)/(IT+JOE4KfP:T]I"paAt^j#4K\=)FmV=Q[Tkgi0lk6]%-^(gn4JQfNt:L[Zuk-b*?bI>#/rX#>XAB13],%PWqn;P0acC!T:cVA( %S5M#-gco?Wc!8+[bg33$;+O?m&E!'nT92nOW4cnJ8p19N6-Q[/KJuojbrd-[PeLQ,1f/!gRJ:?L);Z@gkZSc?8f$B=5?ebC9G)Yr %V4Aq^F2`/E)g)NK%NaVa@uF3edT*+6e<2Lok5F[8Cjc91,mgl]B.'ffYF1:rPuHd,Z$cS7MT>XLEoKqrqk>UbL4!P2Sp7]-=Qk`" %>/;b`dU`S#PU;q%+E:E/8R/ioK8UkU-Ie$`BeYhg%OTt#Ma_.lE,QJ](G9M2"!*-/LR?Gr&ge_OehAJN$:\3f6=^6;q[XhW'1W/) %6r7Hp>uc\1.m83-H%]p*^%.s/a)%_Y7Ai=O3VQPi:\45_2d3OEEH,6=8W.uR=XmDDO:tHPJq=lt&LX*?SCo/c6'LbgJm.T7R=k7PW@9=E5RQ=BT0._^\)C@9LYCMm?,%^(T:1*']*%kqKPq %>\HR[6b/;\0E!M+=;';W%*#5=8&llSJPkq0e&%4MJXco+WaILWt834[EVC$UW8%?`"QG@2u.,f %eItqcPCT*@'=4`^('@JM4g:Xm\Cd9&\MLI^C?puRT>Z4R)"usD5?J\kiB1]qMq,dPXDE*8bSP1g%cMLYWqSjgZsTZt9"Gr6H7U4% %bd:'e)jQB*7^&t)=/[u]/B00Op'bSg;6(Cb5),7pfGFb=rH"?*)1 %O!qrFRg)L.,faAn(XkDN4AE9[U3[6?H?51bRq(bT1hCC\Wt*@$L6Bjn./JHcc%>jio99BW8rZs3\`Z^ID!"K`N&t`nXI/laZ7Mes %Z1XG7"TO6'HddR]>a$ctA):Cj.7VQk?JHFM&N>>6o/\$A1E];UOY\4OaA+JoY1.J%a6'F^hJ2kl^G7ZdZl^8[iO?+DhXHu._KJ`>d=j?WI:+89eisIo?Q(9-nFppN^l%n %i%@3EZ'&XpGS3qF#8g_LW=\]_f+l*bS_la"#@V'nF9dn;>qE^ib%4Q_C#i=B-eJ,q2k?P.;FKucn+-icA"s:Mpbpr)Y<$N4f)@_G %`N+CNAC-s3hL[ZpUS %Vg"hAfNkAdb&,SF76hr0ZB$N^*2cXB52C+k_]iSCqq?1nT0d_e]'CRShn,BTnV"9n0o/Xo;=saMWo=Io0FZ1b0&nEs,p2)R %X=WOuW*n&l1>c5+k@H?^`gX#OdE*2W;99 %5%_$8pmaTFfM$J7GHA5"<^P$Q5HGXr/t:&IGg<(ES%W$".lFC"\e`Gf$t14\6JPaH'@T"=I*l-#79*4S`9MW$G:OaPBpJ)3g.^iu %ckq!43_Or&XDQi%-)D@]iU'9l9!NCXK:@jWrVl0;gf4sP[1:-+O]/'aZ3,Wb=9BcLgK(L%\@?UCB;fEKZ8l2.jn:GMYjUY%K/df+ %P/m'nT[MT']P8]>V_/CAbRL%WB:+$-@41&d1$(7Kn8<`X$'(KfH[;PDB^HNNs_k,1G %mWOYK@LS>An>^`r[grMY/`2`)J$QomR0;i?HYm&a#o5a2]FYeQUVCTFKVCp+:s<@'?S['o=H"r-oK(^U%'V4D`VeYb>J]R>%lihq %oCD3FZpUg]F^M/+]0I6%miY.h&_7W%=4u4>VDL5*ULjS&\8D@0mF5[GU;S;`gGf6q[rc=2XrY5B$q*HH-(15MStfSbJK;d^NqLYq %8'?J-MTr2T^ijSpTCMY@XBPYY!Jqp2_SB"upf*O@@Gu7bG:Kq^10FCe"b\NILXE6eP<]+TfnVt.R+`!3_i*(1S3l$&Oij^Am)J['Q9.DMtrh/BW-2BajoMYaPK %2:W'b3nUHFU.T$"/gIbfKYZBsU(dL%jW/#qOs7c_#*Ia_!=JI7o(5+0E,-TdTO^I6dV9?lg2[U(hS\8p3rH@NCQiFIF_2?=LcrVV %<'!S3600)^r&lR-mr74)aL',XjV?J=%@NKc'<:Rbf:1h`*)D0L4nDZ)DSffMWiYK=lR-g#ZLmS56errl1sK19Yu`qUf#K$]igFFi %Z0K6f#M="HRW-X)nf7H:ZB4O44H])Gi0<'aA[)9e8b%2_^jT$uC4V*!&4VZr9lEs7mZBuEH_SbDT1i,NE%aS6R^9)RiZ&/Gf$J]LH?eg*V5# %k-3i`kmZ`!QHRc?ZY=i[k[X\Q0H!i,L:,Xeo%dTekb++\[576qcDVJ]"EWEK4 %>ELP;;$lRY-!SIC:a]P)N.r2:7,q]"31\OACoS\E$l9r0rGsJL\W$01*Do2hR,:MD2/+UoP*5l>O!h8HM>O2gnS0q>M:6T8QD,`# %6410J&E]a`h&IB+WelWDUJr7(M]ZpjN[B(A.6j0Ni75nV^iLJ'@dc9<'McSTTu08;EusbC9iZUtkg#dm<1R-a=Zf3Y_Qmj2j%6g1 %/G?scJd9+K=Or6JSb[,?Ht.erEE)EWGHsU=6[&0s%NW$VMe2:q?p._c;/BY(k[=D4?s6D!G*<\V@F?BcQbS<^c4?m.)QhE0h`GZt %\r'gj.o8&*g'PrqiE7:irBSO'X=!i>Uh(Gt'rhH(83[b@j7/+LG:G^R;!(> %>V9A-RDrY$,c;#S1ZfD_@)YogR>qP)cM7joP/E0"?_?cAI=iAQ_tfPlFtu&D:Qbo6YW[^g6"Ano9,b*d>n8;Bhm%o)>I6pcS;ZtD %oCid/'os!.CI6gT-%\og67FX!#/RGmJqm^NhNf&G,E_WNQeomFlsgXab3Zd!Q?UEr1JcDU&W"XBZC]j]H0[A*DQc?#n=K:rA:qiU %PH$2C+l?oF!-^mb%i]A`@bG0i,kPu3ZJ'O-oGLjtqCZ":oJ8D7JW8DW?PR:='L%<)@q/K/IIap0TiakEE'SEP`! %4'd7YUh+.le52Bsdm=ea?NaiX=,cd3/mOKt@:MkOZAP%]23iK`s*dH?"?L]TU,.]8%qRC;>b"m95\n%aQLI(#'[IM_.4-b?<)%ET %@MQU.HJPJ+[U+;>9)EF*4S6PiS`6dZ^oZ:umK0O$$OgI@E1dO]T>__>H;\PCC@^ENX^I=3T-k2D,u>4`EV'G4"M/WPo8A<8*TC^@[ZQfR5Q\k+gWe#[h'tj,70nq<*j\eplslI*/ijA=Cd\3 %2g?7](.b@$rnAVaDprDY^MVR`/#87PKJ$0789*mb>.Tf2^&JF/@_BL5`^g;SC/sC*([`g3HF7-.s-k"s69F %8#KZ&:e94/F3"F/A1;n!!W=VeNG)dr:QnlLVp;&tpR%rmMPK+#.RW6aG'GG%BuIrF*"So:<0lktNPq2V!Z2NTe=E/AV?g+;V$C.K %\fi6h\RXuGdoiuNj`cNKpL99862nVFO:\B/X6QgH+E?WRSdZg&/360-H:hYI-MXoT?h\5?i#pHTbS'q:* %TR?76g2;!<]4n,$b=^0e#*=]t6?`lI4f-C6eKNs$o;4rmb07H3J2bq<`dF,>H%rFHRh=CfM$q3>!:Tsa7=G"hK@etg\G5,=Gl7<, %@MLYre'Y"^a`4^8Nd&9D(K3"dB&a[Aq1r-Nqan-k7@AUZuZ,W4?`Lj>Pk9mL"R(.ZROC,1e@ %'`=Fm)B2b[jAR\P*gL@uX%3IgVL%lj3J&g:Z!qC2;:rBRR0tsL*@rZ<%j@N*`Rl`\&4cF,QGNh/JFaL9nKER`_E'Qtkrk(V7nUK] %QrWgF&C9&ra:\*7is;e^#qRn%%GuZ0QjCI&G]V?I:<%p430LDV.XupY@gM0_C&e:BY+-,W5D07g:neiR %k"5?JG)Lnn(^AZa%,<^ISr2iFBs;hFZh`t0Z\m@gG>>=oj8q'lYGe^^;Q(hAo8Z$*N`=Xh@D6<5n?`O_n'p?jkK"3bd*(Stij %iYi\,s/9)]F$nWMf,0n!"J4#W]bi<$EBt9c+YV'TaiJ_@@A)"j@6Mlj %Yq>MV0i=?Em.pSk:RI:!aL>.]Hc(Ml3e'i+EHqtO)6<#+,RrD;S/sL\g<&e'&LM"T^F?H[0#tCg3Bi+*2=Q,O'i\,]I\5hJne?KA %RsB]3hiNM6=<1YP)@%-2N\!1M%T,Vj#fK0!2@[$Re:<>MIcdB26/1Rr*K.>Zq#cnYQqI;B9Sd-"L!& %?kmGbl+g\a4hCrj-(*=(?o1!B_,!$m,SbR28$NQ4i.q#/![ABOCeqp9mZoc,W:%hGEcIglRW+oCMMD;knlH.JY$-.k=bY6"EO`JV$?+BIDNeWC5/;Va %kNQ7n#S&"DPNISWBQ[:)hr0+]n^E7Z9S_T_Cjo0Qd;e=D"b+&/"^&,b'W %-5uL69g&2bIWeO]I<49#=LlV>>D^-RB$hKa1tgBt\>=j"I"]dV-HpbU)TH28FDaKOEoW$lX^4gl*GU=]iJ_WaZeNSIR*#nPR`ZKdS$f>UqYq %YT?ZN%?ED.F[Zu,Q!<>?bFk_%8u01hp3Es,lW,(c#^$s#:*K5?Wrq8KWZip_btJ?-(BAr-M^%$)0S8=_cTR(Y %_l,J.3'=k>+YO_,4G<4659-!0#"Z*U'F_1cj_kHfST%]:TCg=[IR.UnKVcc]ZkSk#dU4.YR-2Z:h0-rIpW/BUb`I.La#YTfF]LQ3 %)7DHS0_g"+.S.%MjI,_biNg\M)/QSpN3j!TWVo0Sd3@VJ>t*+D62?$::=)e`NZR#h;?0K6;VnjlQm>-4WC=jM/0]aWQll@/)Rt.0'$V2MbG:P":_f+! %)aYbGqF,_iA$Bn-SfE_8am#g[C!XYmD?Z=o*k;kmC_nYIqE)*(WN[=s"I<._r%;#ZWcP %\:/6@KYT//Da)EX>SfF:KdKO9#Oj-9nE>He"'s_/1d=HVJIs?^+f#YE!,q^3 %4mI%7"S=9LLMOkG'raBs;r>1+&[uBT"kq03XgABLhdhJM$0eT.BhI9'=-)R<@)Daml:B_FaoSgkF+*N#Y&W@T%l?O4q@hPg6;oYM %#ZJ$t<]Ho;jbWA3k80GO++NY0EU>I5_ZJtaq>X'#fIDun]Jtq+X3oe7b3P-t7-.p^27kL1DDuX)YI^`J9U57S4Z:srOM]%tjV[L, %pRc"N'YY70J0,@in?L6@)u+#lYk+eJGXgkF5ChB4"2Kq7n4h-=P"tlcCRe)U3$C:p6AR"1OpbM'Y*Pe9WQZf$Vd7@eXG^%](#U_ %DAfJ7YC=O5Via5\U2Bg@mgt[gX5+ahD,KD(@7at6J.JYcG*n,Ulj?-oN.iHM.X`/ak8lmHaSW8p9RgNt]"h-;?-H&CW)=T6IH0MC %eF3rFRX\Lm(38WUTAK:=?KB$-+\t4XDChb";\4'rs3Mr1LCrSeCC^4=NWtkd[ckoW9-IAXM\NI-jhe^?47CD+Ji'jFNt-oI2;600 %P$;%PGq.cb?'4_@"oXpAZ\XqgDP0$:r%nOhL76Q*4HY\'6n0>7*ZSTD,40>$:jcNSXsgrrDAs6eN[kn[X2IO?V4;Wm)"&Q0d(`Rh %,`nqa/H=c"K6$NZ.NjB\*H`Opi_p'f9hb-B6kQgl-D#fV+J4('E=p,>"WZU6%X9MFZ]]Y:$/12h:K\jtg=;."A6)ec`47Au_*B_M %D`,utGjZDqC`/D**r^'.h8YmZ&`orl?,)E@nP9&Q:g %Pa_l3RG?`g,ltgt2+US&j)ZGXTl>pl(d'F8j$%Ze:f*9KI]8=NTR'6!fc`W6Ve33!>.KN.\-MaKi`WcFRtq'6@jMI`eg7J.I)MYJANd_Z9^7-[S\AP,o"I-Gur/5W'1cX=(0l1BGdaC9]);&J"nEZ;Y(jm&M>4bT>,oKp=/Xp`%8"%P`aNm"e2RT %EC*Ym(S4O(#t4,4VI(VM()!I=;I1IaDV=WL27JFulNR2!/hHWpZ5ToJ %I)BS9ru6G?O$U_kl=HZ?;LErn&'`0.X/\5_3@"+PM=okYLdXXN&dA+8A[?$IOB'Z9I$.(9lC$K^?[pk5Qg/?k:3>jYeJ::_s8$#DMNg8)T=(uO0MD7)pOHPU'M\/.*cP'/J^W?SIY3lmCO8Inhd/52VV-Lsgm459UcBAZ!?N#VSs:%^:A*3aYP\lG %p:GXuBY5&/*DH[ej\op1c@\_1JYJ#Sg7XRrf_DU=W!Wok4Fb-aZqh-Pe=uA:nBpJsao]C5D!sJ5bfe:(Msd"pC9rdS.gn$Y&I#rG %Y^_7CLqo5m#g7G'S-Jq0?>:EG5q"]$?i#hOh_aF10VK+!)u%Z2#L"c0RVpEah6071HBrO#@;k?,Z`!;'XBNde+ %S5o6[ZT;5#4_/Q+/@'a7!FVP3HP2Z361V?tniOi?I10_Vk`_bBDjR2"8dEL:qs'SUTd8erlgkgR_hWu'sqoLIbfrH17N4fpOp %Q;h3XS3FF*l0Ct%T7LKtLR=aM)$nb(;I>rolXmk%R/kOQU54s$hO\k?Q[OhP]^,[>U**Unb9e)NNCeQ7=;'^:$e&>g3p0s@aIaF1 %I%.1B4l(7Pc&sf6a7-RO_ci*8,6PpEK(]kJ3S-r^:s"Y9MR1h;)T7oR6`-5H5 %(Y^dM-jRD8,&C"Nd%PFNL4HfNIS"H-:H\A(!^Ik4A3em9?Dj`:ot^R1nbcQ]"$WEOej4uJhi/ap#C41<5K@a %4#f-Yp"pFPUk[@_]5(C96cBSt\O4)/rZS_4;1p3M=Xpf_%o_SWDRS[eC@B@jo!D:YV.s*leU'1!aG4/lHc0,12%+dfk %T6<`sCP%Ja=#-N9C[-:3`RtI;.MITa.mCqT'uXl^("l2g;-EL2KMittDI!F4R8RMR--meQKrb=*6t=o+ %2&4a9)Y7cQL^a@^7j2[uq)f7=>of5^+-L/h2,GH(/r"mD_6LSE#jFr1=^@H\:r?a[g/SEh!4fA9GS>u91*LkLWrh)8q,mr- %Q%NJ$mH2AK;'XT.u-<.BF9ghn'4H%_*\i!KoYFH8W/XXi %pWL:\M>mm;7AQ6h]iEFe0?t-hUZIV"61)?$2P:FToBNkh%YZnZ#*]b(O;1,;Y%roN^Y)IO3f^;W$U9;S/9tED2U$_E*-"6,@b&DT %LHiZ4F!,Ncr,5"j3mCB]*q$&79rDI?6?U87N#t-ZV[]c0D,:14eHndA44J"PK2 %=)[7P(K,i^Z^mAsC-[R$/U(fYNS!b1XRA@KKdlTW^7t]iV37?l4-Rb1)q\ub;\.0N:7IrK6d;ko4:?/X"]<[9+PH:s[ds9*H#rud %eVXFoD?nICB0uC8UMP7AFD^:HmeNR/l,;V86u73%Palf'h\'ff^:-#]g/ifh4@+m:F5)YrO-Gm!]$#kt`["]q7ClU"h9hs8BK$PTI!R-G+73bi5`O;*YnS-tXTe9=DPs&FJ=V;)4'aYTem\`0'>DE?);c)18fS!5cH81@ %_B82E$ml:cqJ&s&\!aL%#56VK7SJ]@U6hA<^bW4>kqRf".)_\=ZpOlN.%UQNKcLaleJ4*ZLTfFN1#Umkl=hVd@rm/;AJ,rm2a_DR %_)qA@O4W2trNL(BfF)9C,6?%9Z;@6/KqRu!cLG.FJ3j&FYRBM4iXH>_kEP9>6GNSa\aR\Y#NoW)/P$7"9j%RTLGa?.rMjLap#D.C %"u`N:]=*ZbJ`eC0qp`*R%Bd1T?W%SFK%C7?TNC/"fYSJKK'C=30Q_cGR.H*.uAQJq/tTFO&+f[IRL34 %0*X,]QuLHQTH1O*IuNQdFT8O.jMeM*'alKB7o+"^ee7:QXTSXmB`OU=uCt7695fOuFD_IUB.k>E'3RKD.YLP8884Q7J,sJ6- %S:]FtMO1lcRas*Lei4iEKF&#uGUJ.RN;IZ,W$-^kiUJR9?tA+;->@m*&9P=i:0e,JZ?ZLD8.M'.l:b8;1//HCH3g!4iJbH!9Oa>P %1e&er5BB[J2JXFE8(K/KGUmpLd"/'W$Js6l8(5C&e]=_$`1Q[923tJjcA9lu^^11efPWOhSc(J0?_87@$KZ?Og:4?k$Ei6.PNQQ* %pT>YdkU_h0H#6BBWjqqeZJ^J?EL-1im!fI_0]j:sV2G*HGl_kq1r]nZl5aomNY6uk`0k4T(R1.NMBI[i60Q-/%5$.DohC$-;*_(N %q0qT/HaX[E2X@UgXhJG6A`T]"b\tM>#'plI].1nPWbhIpnhdunLhkX\Rq!E\nU-ZWe_%pA!Y+Pa1HhBW''YRE5IfJq\XRs_C0W2/(/RH\c %9a2n'l"ZB^g`V>^-:eq=@nK.U4hlpEg/IaZ#I]NrAJBL^<'_^jbJfrqW&C//9Z4E]1A3bMj0TL^ %2KfI%A?Q1bi#<2D.aWJZ&k11dJG3aE1BGKERi+`/%UlkQ2?R%Fc-,Um+F. %T,o"HS]S\U5`p(eL?MPS?p.W5V4'4`C^VBoPLVq$Z@Q10)K6O##a&HSg3I>Z1L(A9m.I/RZ:9TanRY\>8k5H#VutNiWg%=3JRE9kH?*n8k4]WMYVVm_`(tp7-&ISu;XHs_:pcH:`)*S`!k2[(s"%-`^S6O8VXq[ %EbHgnJ'#1K])7)u1s>ZnPDBfRN`rr!?B.-]%58T2^10j3Re\YUO*iXZ-pZf4+e-!XUr9,_ %GGqd_A$>^'q1tqY8MMS-LTJ@(qrP!`*neRmg3]:HWo\hWf?qn1)M0MJSZaPLE %:hi]bLguqZ8/Z$tNk,C96Y/lng0$t@SWr51``bI?-b5u+@5PHf5MTi9e6!WY3Mek&N4E:B'^/$"cY %(]kAW-J$\/2D>&*UP,hP#FJ+rD'%17p<9%**2nt"gO0`OTJUgmos7Wfc&Vs3fi)FOXT,MV_"5IC1$6HY_(4$'m^[&&*?Z7[G.&Cq %.P*r=d*<>lYlkWC'r(N1Cue?c)0T=$GYAhR\V1i4Ra?@UBlU2J'.#>rdEJkGjd6<,Kr0Z?GoR3cd#G,u19o+4WTg1N#,N=;"lE-7 %,dq:k#HA*2i((;l6PVBu]h.qMdX1CQ6%e\2&"4.sprWVPps21(8,]#O+B %+UB`Yl4M7(\*Brj#?-As-XS&i$hg %Fd4?WpFSXZ5e*KhbW!QJYa12q0U&pccc83.<+ZR:PK0C%7u."kPI:Wj/dpjGL:,o^@Q6S$Qi#ti4'`LfO8$p9r>*K%G7dhX\TDj" %KEIlZ3sLi>.XLk:Ia6bOs2t-`efDc3>W<+Zndf"VOjRp&*C:,bFkfQLO$!oR+f7Q?!lGo:LCWaJ(!`IkI3]&G:&1/YVeX2K]$0nQ %>TI.]d9fg_Ho$fOSSF^^T3'MK+aHA(_23b2D3@S$XpuhG;>^d^j84`5_F^V[WWnV9^"$#SH`K0fRRAZmrMR2RBf;'=@mu.5t3+-Xf9YQmiR'aj&13 %I<"Q*PMAA-8jk[Q#UUNOE.Z+Rk_Uk71P-^a`Mh2E$Om4&Af`MCa4YpG"\^UrSEZOd9+pHm>)O3]G2Z8jaXN39#XUnbnPtOogtJ7f %RkU30H/Leu1JZ>nm')H4!+0_[190sN0h_E]kkb_UN`29MF9('qAWZMm2OkhS#L9?\'6aBKe!iD+nEN*YMm'g>(HoF.G!k:5L##1Z*Ga(Hbn)-h\Z'ieYe^22lM(S@>=K!`uYb\;?UV\:57)SBM4[ %JC<+ukEto^=Xs.Bh!"kAS^QQm"&QX>`lufu9A,$F2Bm^_kjljLfS&")%8=bb/Pd_@Z-sP":-@.PXTF,jV3lNr(Y?4ndie"<*5%$: %`6=O2b0W]>mQoIE,`fgK`o^['.c;Y'Q&Qs"19SD.#[LN,Xai64)qq-)W_V>CI]-p6U-R:=Yu%qZ]h7[h'29>_cTXF2J1O],C1/#L %.eTcX#bMhP&:)ZMkij7/GWGi:_9OG]p4hA3G,Tq`?H8;u/IgN=$4rR`nk9>FbiJ)Y3(_l\Mbd'[a^M_0Bc!6Zl#^#;1I_6"\HC`CQ_f_6S>l?*$J[2NeZBbBk09\r@*TO@-W@rX$Yk2hRlB>rr&r.DOu17XpO=2@qlbpCNDHgbs3bQuO5(L0 %M%>Z8^O>3:r:WE=%),r:Pj3/I$h;c'L!BV^cV>DAdBgmmGoSppV.uU(a1ehnqM.)ud+Am/+42rE_D[/qP0r@D;0D50E*\G, %+[PTuChcgkXJ]IR/S<.o$"5ofX=1,XV/fLEP*N_Lf;_Zl,=dtYAj\t)T+f^ND*+EHlD91(I\u93TfLNaYZ-SRHBR$<9"B;J&,:`Q %Ut5"qoW$UlX,/9'DPCa]XHh*aeH0^G1g1oqVo^,!o%Qr7V\ZSfW_/<+-q\mFWF1@o<'>/Y@pJ4Dr1-+*ZbE5ttR.WRB'KU.;4PoFDlXXR\QV.Zps(Zjg9(MeU6ZE@5K,iSHJsc";^1!HXp:2=];OZ[6?A %e%tjHVh`f](K[(1)',N*?EnIit[Wc3oCCd6UN_Dc8r,$V=l,4Wi[N)@<1@g]E[RZKWH/=qqCn\_O7g\4l.)?73/OJ\r"XX7JFNQ)uVLMSX9th[42L"KaHXI/+!RkO+;$[b=Z;qK-Km6is$O]jMNgNCN8U\Gg/J/(j(A/A&(m6pQ81]/0(D6EMpqme1?2%Ld)WF/ %0noK9e^^G_>E0Uhgc9SU_6O8j\MS9O<_78OFdOmFWWnU-of+X0RkGJtXK %]],?9P:2:%M#^44meC31^J'JE9]6#Y^pA0I,ibTd0U3L\S5DRjVDF#0_0Fq$A\KDbp_t'Na;?XY<@t=EUq-f_@fXaG6&VJD/?%6j %#oe_mdk\^?()bgg@ImBscVb3Fo5UWE_5]9sHmNC%LoSuuLIC^Eq)1Q6n,koG %5g?AXEn6aq.C,U-N\g^5Q.($rpcn9rXXMRr?)'gci$5-/*rCb>/PrJ^@]Ed`"S*D7?TYZP.\N>dUmrf`KCjtanE^^6A4)_rV'_1/%ZI.cpi\7GT:_0Li\eI*N%p-&O-QQhZJoLr@FhoO7hbFQMa^,aoKuI>;ee[>=apAc;F[F*orO"4G^S:lm %k^74U2;4XCr'LZs_7MJ>hICL5XTOOQgT_]tNT\i(C_O.Y13tW-n%!e#9h:c+KI*qEF6Gmk.ZB$4oru@QSdbsf$(:e`]T.HAUBp/i %3U#soKo7u@UG)S?1/_]AgR-%F4I^eS=Ra@#JbK(Qcln-5Cc\",rP!%*`p(X3?T[\LYZH`b8eQ_oiC*cGC_#:o>JqXF&#L"t)A^ri %'^)Ee3B"`1-7"Z@fEga;+\%6>9078I>2305,h214^\`W"WB(MAX6H9#WOpW]A\;5i9hs\A$MEHbit9+#BY,%(S/$7L)di5NBfp8/ %0h?1m[F:7cT7l1/.dpd*84**>&4neEni-BN>SI@s$Cd'MEhs^V/"e.(4D%<@cY)YuGO$5q+)2gdApY@D&LY?:Eh'mn6 %/+FPr!-\^&Le\d/"$)(gSnhlDr'1@d1Jh2n,+tne4@d%-e'bC;"2i^WA;Vf),(_bcEC+?BT47dj4D5> %ndqd%/QN,KDObSGHk0%4q:UL\hd#-H6G#@b/AjN84XaWI_%!K5X/?7$]5Z_JF=8^=.ZoGQ7l*05$bUq.i)<[m;J2Xk]$,!V[)kgH %4kg[$)oX5o1?#)%ef_#\X!m#F0KZK[0IDj)LX&2,fFrG:*scl5,QO9<5=M)^)?FsIR$a[o.@'Ggf#eM:_EAVb:2.QqOFm"LZKF&P %p3dO?0.4De"2"iPLiDT>F[O%"/m6gDAlc>oJpm^,j)0J\Rum[Uh^ESaj[A<1Ji.LPcOQ0H^SPl1eWnQB6LCAk+$HhE[9GcEC,!LH %N;"oefsn6D6Sb4)l5uaSk(%.bNa$;+14\]0RR7oOT]!is]T1qk#+<5>E-bS!1l2NEfcaXsN3r[mo__2RbKh/-"E8SuBsa,#@Q6k=I$F-S6B7M@g^r;;42<$Rtp9*MgI#.=Hu7e'AQTmg]C`rp^L`NSc5Lr&Np;09/$<7Hf_VNK'UgmZBN=,=h'^^3u5, %Xa[WsrWS52*7iE],U(s74g]_u=+?)rn6fe,Sr?!>]?t]\Q.t]=hfGk1)Q3T&Li$dtAh32BR]+.2VhX'LK9r6F_V:f#8]" %N!?kB54GQpcgqriMuC5kQ_8\EYm3[&lu;A(%Q!ufkc?3d5N$i6c%U'0O8f^9%TYa2R^kO@!ahb`H[jS5FE_ll$cR %.>6@ClQL-]l#G\XN,8.7&DC,'h\K`_nb^B!5<\;p@0h3lUS%D_)idXLW-lhO*#P,bof+p??!-J&Ldta_F.kDHL9QECio8GK+?b]b %/PH@WAud"8n=._8F'ciN1J^-rI4!6ZE:nn2MK)$CnsN5=C"kgpFaOu$lAZ[Qm90-teifo<)lhgf:KS*p(T-tR@-uW(3!j0#o.=BY %UH6T!YQ+W4A3CID`NsPl*u?X-[a$?]:#'=7X*/INE>V_64VkYGid4r3q#C3>/DFS/l#%YqU(-(dI$Zm,&;8"=P//K7KV$`Y6KWVt %[J"!NF7DU9@q0`h5:u5-Scn`u[U9o,0YCmJp)'6VK9,FDll=*3cM;>qqs7@aR7I)26nB%10qed0k)*467]U^(PlY=g0;Dh1/M?`P %bMFan+hGm=/$Yp`_\]Q4C!9ba.ln6PBlWT,eC3RY:b7hD_`C,$H&,NI#):d_"[e(j`Ip<3#`HN$@T8FSlJhF7S9/`s1\De^Bh&W` %\;Q:OeR^r.\dP99K?eXG(^[P1ju!D%iu7d=QKJ[,"89XT]');4'PFb-@pE'ZW-QICci3IrJ+&Gec[5.t2dfAdk8GGOfefi`@n;SK %!M+7NbIsZV-P:Nq8*!qMfXhO.D"`VlgIRh?UP]<\J8)nE`9;f$*t9KEm>`Y1nSH$eB1`)JicCU.[Ts_)/KZUkRuSki5.c&)"^2MO %LTp?Fg9%fU?]Ol!3g[Ph@iS<'e\r&_#NP-(6UU'g^(;o>mYe:7]40Ef'Qj\$*BB9___^=p"_<](1]o2%J^#7#Y&;3UEGN6[70AiX&ds(Ud0t]Q6=t#1mR)rA9%7hd0p1 %JIl]V&8ne/ci?%b>)))'H1PT]5ZeHV&Aj#6'&kP6g3RopDW,\j>Gk;# %EL@ZZ0QTB=A0ZbM(A,''dt=WRMk&)VmGKE-[1)*-#+qH[?.fd^:M[,8f;I=V1I4bW:!UusA=S^,rVDg@O#@OH\ZkgZ#(j&/KsN=Z %.2X(1]GDNc)9]6kHS"qF>j1XqHDMs%cPA.9]G_%@bkEF]U'FtV("jr/Y!#!$_ljkBdPBU908$-D0>ht8j4(A`5Ik+iTuZr^T%rrL %RMUsLKYrB#[j+**g^G?J2H_ke8JuLLSQkFc)VA*11qkE6T9c5/nF]X@h1Yt.@RceYoY;<:fn85TE1mMD6g/W7/p&3Me7*j?Z#Q%L %[0pE@.dsf%KOrJ&1KFUfnf8ffU(rf8FD?",4"iKN']S;aSiO)4@C.SEd7nX9]0:n2qL %03c\d"qu<"`H[dS-N=k-D@>T:_W,Sa`ZLLk]WEk*MO-\D:G9o]`4;nBeYQn+lr<;:H"pToWOA2(R"s/`^Xg7[[kWt-#1LhPMqc4; %m#RdQGk>R:?bcV0?XJ94QQs;.?/`FT(kX!lqXnM-O4#gB=*uH:>IiAu7VHnd`A>D3n9"tB9\7IEI9Hcg\mR]RY.t#$X+g=haaUM- %Xkg^qQY>+f"8H\IcTRgbS9,g>'A+\F(m$YY1X!'2lcdG_npk\=\>,M3n/$c&;Y7U&b@cA%4!I:/6::XjZ/#N6r"'bS:5eT+EW17d %IF1*D5e9(2_lDn=EUYr,@;!n#Z)qSdb+8;6'C\%!VpH?Kh[COBLDo-gjWtmn#^uOF+KcJ5O,/h5&*]rk %M&s^Lh2hme0&.Q"r!F[QW.s;!4@:n2.kHHJ2N.!_%5>b27%B_ZDmCdKJ,AG\@pJfqOTLjDpj9Em7pf*+;d!Jc:PaS20ok-LWAhM0 %;6Qi-$N?b;6?aZ#k?ABKr'T7LLYCIM[.52G'Ma=e,NomP:r=fI?* %fjQJBYYrFqNlFA)*PBWuX=&>0U#<;:=-YeHY.#+Z<(ip]3abS@^g,3UfRjpYkH`H]`roRaM]9I47,f^L3.o0GWYhS+dBX_((aKd4 %"hij7J4XLm[epE:c6bA_=QtYi]f#qWPbnYZ?@dUnC2Tr<)M^f0ObXtA8Ea6I0:ran^]FoV7 %i?+MJVTQg+V]VZdIR/un=r4@W#HkB\CqM8=$OXA4%FuNcJF9^3m#_[h#'pQSq4qt\Ks5`H?$=!hUKto5]+??jNsiTQRjY94QT!AF %-],tW;pB=%[2@OA)pYeQFZ(@2_8U84BG,_uHi7(nbV;9KE(ITOPc8=Qqs?*kK^: %`UEXtHl^C-D#*%8?$[-ls!f7MN:m""pI^]d'U!"-_g2P6Z8b %.hVX4W+quJ)I*P[/OqkNBQeSQ4uR&dMVu-db\l9YMpp;\>S((EI>mOMi`V?%a0SSUNkZn)HDQq3u_HpDL+O#&ZKY\/d,T %C-]Aa1()-AY<4:as-n:Lm&W"`$Z%J@2Z7$aFB+PN6b=Ms\.h"\mf@O'&+5n+/*Ah_%!KW>f"l+Np9^#hA#,fH*%M$m&*l;MNu:!3 %5CLE#nac^SiV2u"MRTAr:H$UK6nZ!?g^(!Tm',, %4&@sukZs!p9Q(Lh$)(T%0'ps(9T$W:8Niio3''bQC_4#\>ne^m-EIC=csfM6lR-$:\46eJ.X/#F6*(ZY.#TfoK?`(()%E[_dC=FI %B!^l-qQLBl'VUG?XEM?nq@)a:IW+F=5H0JLI0cn0-%<0=m:u"W=YjPk-JXaKq@FSPj_cOhH49[QLWU4]J%jrUq %QaIfYOtQ+5K[=i=N[L6rq[hAX=R'AJSL2S0=,V'Y["s>o-I)*&/qT"3m]&c,G'<# %pNFP\#+b@ZqNJ(r4bUiE=S7"G*;Q?n0I@cjG]mN5*&Lkn#uB]?$d$=Mqe@-'%*T8l?!H;IerXJ@LO\1(@dg9#*ifsL'i=F6+Lr-W %&43eq[2O\!0%="Ds`BERsl&!H4G5#Bt %5/\\IDhABE1f3FlmTjfk'8G\e1@d^6)-`uX^c[?rA$deY_?QMS/VL7r8\(Kfll0^jj(/h'f3_E06S4C=@NBd2=#>Lk;"JX2(jfcW4?]99>,A8RbLnQ1\.m>EL+VN+3W;3I3"-JB#^+HO*]Zu:-#kg %V>,2CqW<6C(_e^iaI/0EG[YOYKjB.3!34%MF).OjWYl7P+;-)dbmPR!+*o+3EAU(_!Z-;b'Y/#Gug#e3T&T2gbdVF:0Z03ig;RC93p.R_q%m2!;n1JdYOH/"AE`(!$k@qI;*DH?uuNYM[,. %>U"Lr-q>;Z+A';P-24jRm;U%=9TB-_UL';seaZ7Tb#I:CocmQB8u2)P/NsQK*L(U/[RFOZnKIJ-QCO(OTVQZ+V2"oR9J<3)HSLZD %%s=5H?22U16$l\.c5sU'*nPdC\jCj=dJ.J;<`0eUcI*ee>rs(]df$X)KSV0e^u6N@LA<<;Z,KdaXT'ie?"q!KrOsS"8YVUqi9"kh %;9s_C>^9PDT>+[`ENn:Q4%$N9K_s#*Dn>:F_2``m*Q+F)giMNS3S_g<>sCLqDJ)O_lGNp,E0c3UhW9D!:Xegg]q!L/H%%dL6SBU' %-n_+3`CgM#R_\[.pdplR3AG`h<%0[u:!JXOG?)_a)D-$6o4%3\a;0Z[P/\++FT %^Dm`MK-WEs0#uH&-jpNub5iJ%VW"e,3MJ1Iq>8!XE=tTn,'5sL0BN)f=u67ZU`_&-R]5N]]-RJ7,i&=o&,+VaO8Jb-FWuK;jtaWE %R2AZOBPtkK+C6Xd!$hhN/n*!N":E#B0X/+m@:?qeL3?uB(l!uXE#FD(@DEe9[b!2m%%5#k3XisETKN_Pj%R67Bb7'V/uaX\D%S*S %Y/ubZE>#-N_K=!GaAc%r*Qb@!iZ2b:86(K/]:7lV/?;"C]hV#eNSAo;'!e@jh";B=Z>V#B:fEQn($K)PW_LP+8u3@K,K=ZS*GRN0d1p.=aF#ggra_9"$J1GbC\%agfhuZ" %@n23^"r9G%^n5l^P4hSnF_X9*]n*Q,.I&C?`1I)LVTb4'eIM+I[]Ld"_c1%1/8.a$%c\MLBGr.'7NTQY(^)Q'_Mj.\TCE!#F6J6e %?8]IjbmC.Fm5e1Pn=( %cVs)mL8ju(/gS7:+4IJ4:D':*>b8"^BSg,P_/n]BL*E,helcm\$-.ndjk+IR5A"\+M1(A-79l_B9hkai>-T"tDT6EL$AB\2(U(eJ %<"0nlegaW?K/alM-/Sn_:+E10f=Gr@1tpaE76&$r[EXOMm%!o-Af_sJH,3#_^k4=noh%rWgC(P+cL>RWg$WT1#527/492>mAR%5=<2QH$PpN^,GC^LW/LF>)`ps[p %98&kZ[4#Boe>DkAm>1D.>TSQh,?qhd7Xp#Tf-0p>bb-#m,(K"A3XpPW5pg)!R'4^Y\Z=OO1(,'(Q"qMi\d/5S-=T)+:5e9E^,G:n:t#aaY44TR)+3_lD,S*7VCcj\;iIb?p)1(CY/P!K4EOPR0D;r;?mRucgCF.7Q-W0QeOKiQ-mZ3*]_JY_L7]?KO.iHO1'M5Z_YfC-e`!RomcJI&*+p&/A'r/el %_$9gcE]+)$:jE/f\(L.bUF85?E[P>W"!gc_'W^(0Y3\ir-nHB=8YJmk]68H#2'3CKi[9iV15SoNkP35\nLLn.?usHG6,o*MHkqNm %^-F+MT'/rf*4VA4V:bj^.?\V=)!P+DLFHIX-;\\/CO(4?E2o3Lq$[G)gDKs:R&mc"JJOGIIH%,@h&k,P/<(L;dnhQ&I>2^,U(K0)c1%YubFZ0."qcK=*P:/cN2h^]Ku0s)$[o`7U%`"og4VBJ4Y"c8EfT %7tdbD"@U,Rp?/GV967Qg=Ht_`kRQcH`I;Q>.1WZ6P/hQg<9h)Q?p0OuiXe:F.F*q7 %P54m9;m]6_.*c=;![[5im7?T+>!Fo2fadQM9b,VO_8YYtSl5aiFjd^TjNKjQ+eA(._$.jP@\AU-TJ`kH@2LD>t`H7a2o)rePGA>W'*@l,#g %:?^I0:?iJmBe@&B9)c2PSs2FqE+kL$DYZ(B+uoe4(s[$0_SAcM@bOMa.c8.,^_5=2c9qD8-7[CR9Na*LXS[)n@$MediTP#c^htjN %^U(RXBq-rhGuBDCD5msu4f9Jo(%lrs2fg!Ui/@2jCmnAM[7oV?=[1Kdi.'6D;i9:9CBE/kKJBi`=]3hj:mW*QjU %K:_>]!dE+GK)C>hJsH\.itEM(pNC(^cP*9U7FJG@"]g.6=Ps['M#9\O##A7#^;,/i9%N0]-ogk=( %&]FcFkk)kNb3H(6ia$@kY-n,>U)e4n<215^p`["DVlt1>$cu6)FA0:-$qs.alrCJfJK;'1?N&i68;rnH#7rlB2`DOoTj\$49G8<8 %r-e+2!N@oEWh^4mM4k=9/2E@q**S,9CDj3Aak;EH"JWfk]<33WKQ'HgK)#@&qRNcZe<''cX %Xs/\309i_J[V!7;%!Js?:lGCNm,O:Q%2#h&QYMroP4&(-$^Zt=oj_@a0$^Q\3OXE'gVmMhm@e1-7=sTDoY@cV^>31ZYqK]^nqjCT %3p2o4D4!A2<[P=j&,A3Q\neU.i#`>Y_eg6F+u4lt %$ECnsC7-d/G+@\/:ITGo@kY=rWsn36c[5o4mM$(2Rs*kKER5ZWLj6nKR$)$%FsX`JI7q;3LrB.$(N?]*b#mAkD,'aO4iAN5]`eaVTEV@L_b7KiQAB:1iU0s@[iQokt:(FQ;1JlSFdkkQH$k8k*+&VPdF_=J(iIMOdLeTWkHo2+@CrY %K'p1'1'1W$Y`H@X`L%:9Q'Z9Nm^p!jm/`30A[DT!.YstMaI>JT7QSbU&tuh+fq0X?5;deWYGe8("pfopPO&LH6K*`NRROWJc!h<5g0@2U'r,TaIj!8O %L:Wc,TOcJ!DT$fKgu?URlQMoF\HI4#.WkT^on,D?J%Vp%qrA!cmM&8@n]!r=7>MF=Bq"1I?$XF4]2+XK@$hh.SaBrBOlZ^GG**Q9 %XfD.##okHW%bkU/"uO_V,[dG+;tpP,Jl#=Z`+U_gFL%;bAoD6AAu69Plg_\kDsE^Ee"UY7!WsU[E44so!-\!&F^28jG@!E`EG$se6hMmYf`_u_DeNegI)eH40$8[\&[GS("6mn9-#CfrG?,F8'Ok@PHmf$ %,7:uH>."@3naC8I*7P!T`(K+uH2*BX/'J1>OJ%06.HXbs<6_QZVi;hC\1%:[OFl+)jf0mkm*Hd`e?^4/?BglK"8:f#gZ:0b,hsa:pIMeh`JUgqG/hT9c`,P)^+A&=1"N-t9lHrd./*np6m?9e %7Z%dh3!$3$6r?f&$bV/WZCZ)@cr_gZm*uA]A\kMN`Meii8W9sD>+?.,ODD$m'X^EGr]dGMa %`=rOO!hc(l-B0D_8a`"g2HI*0l['n#FJo5[bWN*$p%uZZI9K\//0FOO):eg4F='4YJMocYBBn*iVhP=A8*Q-l!4$,H&,9cR^`CGPQE]DGW8pWW]*cILlL@;N,,!bXItsfE(qUuBKkO=h[D/,LTi`T:f>54?'JEp$AuX$!/]sn %dSG%=mX%D]\>1!>8Up53,jj@]))W0("#kbS*?.rp%Vugh$r8&^;jsB'*5MS*XF0>agQItVXQ"RQ+IsgDMIFocXtMIKXFuK9V5GR\ %[1)u8/Z8EnD=J#J:ne71b337;.Y##fIM7A5.#b*gRH&AqKp2Bk>.a=_,TSRa`:`_lteCOu*u(l%M]M"jUSniqTl"/B\$^Grn6ZH3/d5JVnP=[\-_8`bs-0p6)=JeH!/) %F=?OZQD%72phWbed'T:uTNPaQbiUl7&I"8n`Y+YJ]oc#(.MNtt]'IdL_,p1mL,K\i(6R+P+_T0On(&p9f$#_tMIg6!D-^s;8d3h< %WZ+#i0L$C\epL_^MH@2QK/i$fkXM`dh-[=gg&H)N"9/X2Q-DuH&u?Pi&F`']p5+O_&;<]Y^2oYeM/bQ<.o?!WjKP'qB4cn %1.b5 %24,Ms5dbBuGUtM`M"s/M+k!n]XGE[hd2Z+B/5OSD*Zh.?QIYBAfWERFkRS?u'-fVVrL6Q\H)FWLZ3Y8U$AtR>6NDqXe?<'V-TJA_ %*)N&jOq,3VPl$"d32.#fR0Ng8jDhup#aVkhB6.o0]oPXqTU_IlHc^h/Cn[48TbBC[6o`Q!guH>6@hBS-Kh!LJ$B?>EOFb1a@$9c' %j+'7MJM'W6*.J@aTu/5"4Ghp"A)'rDnnCln1q.faSi5UgkDe:QFfD1l+5MQ)SihV+;1?q0NPE[Y\D,`P$$@6!u;d@IF#'I4#u>W&`>CRXP?i7hc3^ %"#_@8FSEO?el%S[<\0aSp^%mj$Dd]2Y$jGuhH"EZV",>\O&B+mkA$kD3h>3EuP"]%?%6WRQp,b()4PCXRVND7\p!@Q9> %i8bF#Fh?P);Nr,QFhB!9e@1;_5b10D"_&0=j9)(kTiM]"IcJg/M[7PbKag>-'na"7o>04Rm0:JVDfu3miq1hCQ94ri+FI@E<6bQC %h^t,W_\ZAuhM7pT/3&tD!"h[5+dRMAM0s:1Q2*^#>C*)*7EL7j-"-pV;jg(u3D.;J_WdKRO4k/][]q:LBnd)_BKkHFq5nL3Zc0>N %Unn0Hpp.MgK"^'+H$)B5VT5d&0-Q)k3mr!m=]_*QVb//:S*Y9C`1,1\U[nLEGhg^\aq?G83&t3S7mUXefP16gZ\DLF:pY^];IW?i %N!AI-XCF,-AS;QUehUCo`0\"UP^V[6P4"ij6:_n;P67<)^l*[bCJ'$<9)bS&!=+a(&`nZ+AZ^gWdEL?sn07T1*_;aAg\7:Uj/C)X %Ch8_85LFAq%&J3>ku`%FQe>s*iZI`'V_pZd.brs"cXnX,B]Q: %?=4]oLS1n]3)3D&_k.d%E&`SW*mN(Sg+@!S8amc[R869:(8h2uOGZ5VEarR9Ai'U*g?^0]V4K%Go7YI,".Qtp"s6?^6]@QE/M5KK %#TWb=hb=#jld*#EgP=lmALk"^,aaG73\+2raVe"C0BN6@>0XPu?G/%0"dcKsjOc6]JJ2i-Mf2T^l!2V&g6rIeE.-uip^U$bV-G`8HCRM=tVoWj&&UC+YXVJZ%P>!c: %,2[8<"V+[*,?ZHn%\6ui>WK/7',3mI4W.<+YbokD;^n*F\3YZ1^_+/$k"E%5n %+;eHqf#,2MNX(mMI;GEOoe`%k@!gQ4@kgb-^=ZmT5=\;@jB9o %nhaLqSZ#TT]OO"UTWO(MKOpPsnXKq0*@?:8iVe,)HE\g,a0eA;"$n_QOgX7M$g?'8("J0fl7*A0?k" %/STU^E3!d6MK9,HYR#ARa^%AHXFk.7f"XJha)(td"f8j'4:i8h9U)iS'T4[]M[=uJ#=BRGc#Nt*0nP'0)/i.6$X]f1)4B,ROlTWW %P^@IGUiq[oY7'-O9mZVW\K*C+"?4qrZ?3Z-9]&3p=&Ge?!Mk1fG!C'CnK^FC##h/"EBP^?5ibJ6"B30:oM4dUmVJ:mS'17295nkh %Ya8s7/1dE:>M;QPl]`(](K[mUo2L.2<-R%gAgRdlLd+Eja%PlU2Xj5GMW[d(cZF %pEh*`(,*pkVTR&lTji,PbdorfZ>/=JC-CiL0o%0p8>cX.h5'2'q5BJtM;%SK'\+[J*t!>4q(`?$HO>(Ppi/24)r?*`Rglf>5DE_( %b`5S>RYjIG;447Wi$95Y-/V5b#1cbq`F$To/WA/'V;Wr57A?dDAIN*"GYm0Q'<]h\(QL$P#,6c,OdkoGOG/ue!R@E-7].M0d:">h %k@/pj%LkElou_1.E:#2n`!m7(cF+bnp=Fq;/+QTR2MqpH]>P_oho3SLl6[/ghp;+cS_k]C(Y_Jkr,!>;KaC\S-3orOG>Y/QUJ4#h %[hr3LA?.++BjjOBo2Dth)nlI?*HLNq("8%J2p4N2L/SA_Y(`=!--^%LiEqV %X`A<@8V>DFZm@BCJapmCZ(6Tu3Vh7_'Pl:_ci?6TnZQs,1h&:#E=*,W@;S%X9/[,=crBK8CmE#iO$mt!I[/.m'3Z`qP!/>> %oUht0bk-])n2bCd],>TL`-*UKP`[LL6ns"Z:)qt.Kb:cq2Ybn>,ASV;cTd84Q/spV"=BPk+sZJCJ[nHEOLfqe$D;Sfef^DSCi@uqs=g5dF$nT@7rjUA:c-FJ]fcW"j*e(`eo;jiT3ip7iJ)1`ST$K6Vr.>fU!a*oOKapDtb!Q@"(sr2"rX$;F$+j"nsbE.ltQ@A\8n %J)F,EBpYu!P>;\/:$F"e8D`TGjMkcc++ce>:*/=C0R)sS] %4baBeO@slX?%s?DONi&ZIKh(FOA1%2Sq\fHOO&77^'6^QOAU@9hhFh\JCAl(s+X5+J5L]&+,#:2'^W&\8$#ra``@6*]G[4:cII00QL#8$'\(LNK[HS,udVG'NQhi/>6rS,k,j%JpCFW$.WU)8i35V9rMuOdD?34F$bSOM]0o1 %\L5o%$2&fml(CRVkc.)d-l7RU7oqjL83/3H=M!]NL"]8i)G_/,W)u&0e %M^mCK_(=(s]BGuC)JYu"g-qD]<,i<=hQGROJW=!23#@M%`B&19in[TT03$@-2"rX!Hl"BL5kXT?&/_DRL:W!RNP\630[r7uBI&=Y %MNRJh7A]OOkSS&!L,tG5:!$4[1/t7^<@pT:bDTD5W2gdcE*h$T0?Tl;#&((S)JY2M.\mm"dYk\NW.Q![VM=B9Takihfc$m&L,uOT %c.Gj"2A2aD2/>R-gK4dVU7*#Nm"S]V(Z!q?"H>h@=GkfqK(2`%2gFu8@\S)s4F+cUc%V9-5h\s78P1)>@;4Ub\lJYHfrL!$U;*ST %ra!ui^WZVf^\ju1FPh?dT.l%jOcWjh@A:D59UcI %_?Gj2@j/VR_F9ArCE^I[_M,Vkk!Ff.`5W1QHSNS0_?Z$uK-A;)b!ulMM`6r3`/'AoP9J+)A7U#WN2AE&L^[be1GQ1(nkP2XKN4NEJ1>4Tu'VnoZ %4d&XPjJ$Z-$)3*q.2S87:m!&eDRl^Y"F;bqDTkOZ-ISXqQ"t7U2h;lBW1.kYfEq4q!p-#cb"j,c'IX2lPnj4qAMsaoEd2/hY?'P@5Ohadf %n=i$i;(2qH$mY/W:a[tu^f*p=GRhdcCi`MH$J+$U;)q=a/uM;!%7R%eHEbGuNCTof*'@c;<[[Uo1fQlVWi&G$M=q$BYgW5eldM@Gmu%=Q88+lP*8$f)B[BKM=Hhc^kCo/P?PL#0O)o&J07=S7]]<>@%FSZi*^;K"ptY!k^YL?_Q'60c%%J& %KM]rjd1YBPOHj+4NiZtH'@/^O?iC0j7(X35?pnVMFUcj1OR>0_WMM#bNbMJ!DhHP;)&1l1dE7uKM*[8_f:Xe9,=dh\&<*^pa2din0Tq.m.ko'c.0[JRn6'c[@old,@m*fe.AqCi(K4\LMVB!F3r@EV>eOCUU$0b11dd(0D %j[nrIA=a`c6mYJGi86\_jMarF47)DO\P\MX;%*."%p[ANj/?5G(>ZA8j`gImaJPIi&=],-(LBFP$]X7M.A %lP["P9L=G(,['Y)HpuKh;.%UDc%b_IcJYoL]PT03_Soc/""Q$_O,=5o5K-g7\?fAd<&88plM;F_;iKX`3!6k]#N_u]aY0bZ$,Sc> %-<\R`@2M,E]h/g]rda.)Z6s,f!(b;ibodm$fo4&oduU/)mQV8J1&G9>#]@b3:;$Z?de.!BdO@('[0R@@EWAV#mSYB-q7M;ZVZ--H %OT\mDLuA%\[2Mh5NR!jm04)X_G;/$QK0W5h%b/u$B %1p?YI3Nq%:iaY!E6d3!T,X7Dan`4UL1bu3'@;.,tT7>/!+31BlO(XKB>$RUb.u6SrQh2(dAYC6@=>PI($(AuZ=PAEb?$##2A-XJ> %]Q@>*(bVmgfo:%sT@bm!`es_CA"-YIqNQ9iCFrtfG-aR4A^#L29HLk,9'15>&>W^IOM])9kk&;?j%4+$;e?RHQsi+qN0?Xhc8]r% %0e-Z!BN+KKm*ddM>b]0urj&*`LW7c241>>Z6hZaiqVF9XD)+nj#Y]p6W.j@$7Z=cTE$eAJMUPO8,\Fm:+E]bWYOuJU$fVW2``:,?(G"G>;ESHTSEnUS %)I]mB!N^H868;1a>Kc?mfd-nr>40pPij,El\:i=m/XaNfaUNF&EoZXUFu@p/=8\.^W2I)X%?@9g!9U6&NqdVJR2Z\n6h:E>gK:2G9qtO[-+HfuBpfFoX&$Ocm %MG_UE/sL.FVip842[=[9?>a_)m62q3ZO)e[9<$FO=D/6fThHrWK'BAhr->=A#l`s4V6#Vr&e1]%a]D%*bN#F@,P@0E2.h5`8U1#MAs)fSRP[?BrM6giP\!/?QGbGZ,TmZ9;]pd-44L %^pi3NJ#B#SS0D[o,dY/JRr*`D$jl:8raYCCV&k.1L5iCN=#k]0jLZ:UWCR&q&buIPAn?+3h3aRQ0rNmdg(US82`Pa^L]WhTi3nE^ %@6(1YApOmZ[",cFE>['!S8b/B+g*T5?Ig-r;`^Dl9>Fu/@PJLCKL`EhFN;<.!7:D:7ORiD2SJhsr;L7k+D"]l_GWAH-d5Q/lJ.+o %9XBqLUaM]N2eWuE6I7sh#'(CmP(fQ"g-G9c37iZtAZ*hQC9UTR9N^/(bTK/J,\^OTDR:HI@Y8?jA?K0UY>%eG*[ltnrfg&Db#jTn %/uT7cipSP(5"u9A#b??>"OGUT4V]T25sd^1> %Zes:+1VZ57g"BQ.*BdBOPa&Rg40tle>01#7KpKoG.nL8R`m!EOOCB9j=kaXhL01p5WF01lAn(kF9%eJS0F-CWb+q?($qIUHR)rE.;3:Mk;Ugped=gg#T]PKTs>Ck<(Y'j__EM/2mjZal__2?hSBq"Ltg`6g>dZp%K` %Q2sk[Dr38$d0(!`/[oINgckA+YiDhJS'Hf)=W38DW72"b&M(-ejB?6@'fHFuZ.2Q'$R44K'iUA&[H'MGP[Nf2cYPPeb"]m:BkIB4Z.O=T9QER&fF<^,'6Yr[Xjk/u)orYtXX-RW:4hQG]/%I*4r/fG)hEu( %.`95;!K3++%Gk)b,O*`\VDXNY%A[>a,-di7Cb._rOf?#bg4nUrThoVTWZ0+L?DMm#ZG*"4n3no' %9ia6<+218\LU+pn!:iQ0q')m[8h`bUc(VLc/-:53N4t*@LGI@LXdXa/I0TS*/Gh!KDq2*#2kXQF)BSR-["6HM:RZ.o8Q,hoa+t=T %YTZaP2lc %,.UMf3,=N/eC9Wlks4hD*;neKj%u\?[r)8=An5BM2=6jq%)A-mLk%=&0dH;<\oYNmUo]Fm'630'Z8/1J2lkV( %"5QonBhU4TGcO;TKGnrpGm!7R8l.nG?T#.NbK!ncm\WH`YUF$p;Q_mHk02"R=f,78>sfWi&c7.-r%+iBg4DH#TmUVP,tLG)Z/Ok; %JpRFs_,o?]bH1l'nB!dn2Fnb?@)LVQC/CJSZ/J898=A-J%5_O2";m']<(E'F^ZNq\S6MAO]4CJaXC%>:]]KjE]]1;*).k[g3U`7[ %V'[jhd"gqX'(MQVcXi;X"kbOUS,b!:3'Nd$,RB7jS!n@ks$AGG%X`;f1,6(hQRL@a_eKLmSrOAZITWg*ZGC5E\PV$SI[9D1X]-hb %ff@:f?8l"]fo4#*M31u^QV;"YoaLGef3BeFQ'mnJV/FMoA1[9_n#PApWE>!"@l5aQj:gZen4uojUV(@4SYNbQM:<1iRGOUp_9rAY %NoK7oJb,?Y.5ud?X/N`B5(PXRO__cU'JoLe3K[:kgXaMUijrU>!?JH7!=0YnuYeWWfitI\<,QTt7r2 %gR*@"j#1YW)I5?hX12aEn%H6rSU`1elRu*)2P[-!l*XPU07uB%q0"A! %>8f4!Xk9tQRV5Zrf#m1T;J$$*@kj\Ga$f%Se==$%[5t.*=H5Me$\/+F;og:'X;aJFW]/(WNC%u5R\1.UOU/nX-mLj6 %Rb]"kAGH9Th6t-b9FIsLjsKmp4-?orMj%L1<@TJ_9K&;Lkfu"Siu0XIgq`aQD-6+o+.V)Tf7Lgh7\CCdBapi7._qM1OLkj9afF;7 %$cjjJdP//hB/ZQDD/KHtdiSM%PhP*Rb7d,VUF^G-g2Q"00j5JdmV5sfR/upo1MX%';lNZR5WO]3X%[fqTs$$k9pj(rWdZ;H!A^=O)CH8(9:>V2dfC",P9fdGsB)K#$_eu-r^X*C$5c8Rg(f)5gJ1B)oW!TTt %F&V=/BFI?qD$VQ7L]i.l%o@HjbSmLQC*`ucM'I#6;8X3S8ECY$0#(^/41;-!*%e*_,B\L&1#-.V'PL[/96:e4A9^=FTilhHB`rm] %,0UM;PF-%sZahVr4KB58Ehsa`%#,dWH7JuTPD>dG'I.( %BK*.\W3I297cQ!WoL\h/2h3^9JBkJUj=s`,EZh!t<5P#S[uW52!GL"\XF^R1ikPIp+VG&eQi<5uI(W+,?L-n.Lp"]fQ)`")V$99C %%3:u%;\6MN(KVi'90rmGip;>Y;<1&t %cIU5l$QZa8ZhNStL@/Pjd!n<5Ik_t*J`[R,;oOnodu@^1oKT2'*)*K\hlbE^S?UnJp('jaAX[6%k7l*,_\7+!!5qrAq218!1W$d* %!-t[bKn0cR=fg8UbM%2^o\UJSkAStk*c;@(>K@=m+ZRW%6QbV>#Y(.,eGmJG9";\\fVl?u-hW\A.Iui6(qr?+SfN5_bX7Z"q%I?s %5A1:QD(RC!\JFOBaiNHkkHQsC(n?ISF,tBh@Z^Fj+;c:E"Z5C"f^&.'5GKj[Riapq'T`(:J)>2 %[Sq16F@!PAn0BXpPj7nd_XA]\TebIY&VeHtkq^MgF0g` %pn'6Y_`"mi$D`iE1I[FLpe49ok4s*e5c*TCeDg#c%Z3c:&qj#c4!69*XQX+P(rR##_T(gMh)$hI\NAFJ;V0[k+P5ciUe^*ii9&b] %_lc./o.jQNo+i[dO0m7t3-q#o\+;aG*+ikYM6Z)_CG*+:SSl2'$,\PT3aY\ZTb,c2]OQoqE9J[BTN'cI&_fPF@[/YM:oe>! %`iM4uqgAbL"C8D/U[@Z^?Q=^WJU,-`^1/*L']]]W8N_.mo(N^+>#)<38l/Tmn %'K#qskMdMp+7='lZThk.)f5g3\M*?^01&[r*IG"%< %Zd>jT6mE"[M,['_3=TGob\"!0Pf7.i>P==S)*nVal-<=+"KUqr2lHs7f-[l&7=[$WOQdkNH^0RWjRt@!R'#'oFHOGT:PmSm$ZZ+f0X,CTSNIVr:t]Sqq%H-`)mnERu@0u7M+r&Dk?kSb\2=#B(tA+Wf%JF458ce;g@NuGs^0_B##\P%A/+f^Z"3SR*?3!)H.$P#)3#-I:f'(#,fFBn[;[u,WO=AeP?.qK)="?;#C/iZ#XHA[*,iFduDqY6=ZCT-SRMZ,Q9hL8TYPUukB0E8YD*+]h]8>!F"5WLRJ,kWj,m?Pf.Tm@_S,2j3U, %&?8jl9f<)8^%^jp,2JB=mt2I:FSA?.e[J>A($]BrDI?_)GAULU^5.&DOlFEHH-'[uWU=/dBdQ_qY^% %mij7E:BS/(5YG>?h,U$/@8j2ZG%Yu\J^MD/ls_I]8h@T)7$.OpNEI %kS,^Dd7tE=r.-44Q5>YD;[0JSET-JnYj9!;6M-l(FU#H4M*>@FHe06]V90blTKl!gL%(s6kGY9EO,5-sWXQD/2PN0N\$`\ %/q/HGE9'SsdjM)5j1/[7^I%F];fP:rMD\-&#rAk4*S$GdeIAE`[&g7]LFS6]"*Yedr992#"BgTgp-i[!/7L?^?\PMWh*;#kWhhCF %,Y]jrD&00s2P1K.E8pTcbr%Vm8VVY\oX_HL;nXj=RC`mWi%Sl?`;YTR1(klrCs!iV(#]F0U5:hM4*pVO.R%Nq2Dl!+F#FS %;_+#f&4*?4a@Gr`'D+_St\]IeU4*lU+\JdH=Ul(GKHjTOr:)?l^T( %CWkq&5qmGcD2d88hVP#'PF*fpN::(Zef9E^*-1$^uZRmqIr5J?P(K!KsCaW1rp-c['a0)DF8.l/k(_+25FPuH`hDQ^(3IHs*\ %5bs$<-fU<5gn[87^l8=tc5fVs%di*<+sUPk/b(.c]0!kiHAeI8q"e$Ru` %)L]^Y5_>m78m9f>NeQPj#fW$q6\p3JP>1tB7bsH[+J0qr3X,$RId/W!l@=LIs(n1ESegK@VT4Rq3Vf)bj;^8KML(pjPfL\7u/q? %Djg,kR#r>O/G_VLIWDWT6j.$PKXYaQjBH7=M@UF=b.sTjQRn7Agp1U&KXcnM@.Ic9H^'`a`O7%:$D9+"??IZ7*L"LPN:3sU_dOTH %auM-(QaWDKAeu^Ss:ff.s=7Q"VPEk\[-KoZq*UP,.JDHZNVOj(V.#51gDFQG7g>Q`9BT+];t!u/<:SSl!6^O6@ljIatK(Z$RGiV0u8e; %i'jFqPV]sC+,2P-TqGjC^).27L6@Q5q8\CmA1/oFktac@Q(b#8ap^]r"9$J8W\Y@^]]aj";PBe[kXBkU'IjP;9eZ(8eYVN] %l+Ys.T3,FPT(7:HdNAEqC%Ye.>E$]'mi!5":12:21![d0gB1Gm$=>36mS0C1VuN+LdVAMhC6M^2@C$mmfpJ*D]o/_h]6B\g?sVc) %f/bPFB8N%&c'qS$p8ZF)o)LKQC\CM;mZORE[ZV#TDsOlL`b>j)(!JSKKL?Ph?t;FQe0`u-6\>fTj\/;BjQni9SM/a,rB+2DB;H^g2t_0h,i=*%n=1"=5_slJQJi)-4'[^gXWt`l(`-$ %AI/_7j6nEmSW+D>)aI1`UZITiFIekufgrd&G#jQ0#e#q@SK>_/jTF]ZOa`h%9R)3b'UZ._-=Ts'I0(r8$l:u\88O7/'\[;iOX`jk %fNG_rM%rO?+F!u8+fb!@o(-f`f]?N^/gPK/S:GFi;+\XVftOD8VMR+1Mb,rWERrV7WEM-e@pl#qMAjlI9%VeZJYDKAQf':)_8J($ %M%s*%!pW/*e!o7qeUug-!&fe'RfP@C9+-Of.&)"P_sP!m%/+D$q.Fs]h/Vr`m*VjqdtX@U@?m4ZqcQI:(1W)2HZ:$jm!"G:gu1H] %*3R4]$jm>OAf:e]DbCb(7Y&P61^=TEErEXmaPk;D(fWJe\sAY1&NT(cmdbi5W1F)+X!I= %AgF0.CYL-s$^4/f/1Y;l,Y/%_M:%X^E!h+FI'Od[fY0-eb$0\lcr@"..RFu3L$VCe`Snd(m:t#DpW0m;PQbU%V"&<4C;sr!0*0`p %$1k+l^=YnG!!E9mNVWAJdu`QK6O%-@/kX`]"0oe01YL94,VZpZ3LE3,eg>F:^`.oS^gi\==(bX28&O9 %7]u&F"R)>Ob(P$#=r2?APk^TXd[afh"ZE"]u>d9_2kB5VD0sXeK$>!i?4`W-C&D>OA=<\'!K8NGAi<_5F*.b,'4HeGPBOV[pukOpNh$D %=IFd)kUphL8T]a1K/0MTVa=8t)%ehg?^mL5TmZLi$ZQPZX&#*eamS(&Sq8c')9P^O8\L"&bdRaNFu35Q@k;9QX\(G]SN$$RWp9]3 %e)s2?aof?ue6jBD`h6_ieMFg^EIklKnI7.#ADhG3hWae'dS6Q9rjTW@:;4tXqL>nX^AVQo_fq2tQ..$D8.6NL8s=raAte/973$/* %2OtR$fb2s_7[Mm+b(uHYARf(=H'0iCUq=99D?oaE2jt*_/7jS?2(O] %CT4Ud#MOj(S.NF+#5.f(1P>eUN9o;k(siP'dfXIbpu7R@k,"aJ4^]bT3dWen?#4e#FlUf#M+F@OLhP#pn`?,!mk-8J\; %FPR[+?2E4ZZr''Q(tl]uGls%e %[F\AM[9iT#VIGmE!UVgJm\-]lp(ke,Ue8/ZP`&cF)\9E'\V5FW+OR %5d_,"k?qe#RF.7'LYlQ6Joli\Kc\NgC/Z^Zhj>!*nFAjl7_`r:&_+rB*2I9Ql`2+8\Em"T:U"-HVhr/t2ipuoAa$PgCoa#M6o+&B %)36b*.R`S0@W$IL$P[Pk[t#=7FocW?f1aXfI")sW3JUAa0!HS$/lNG=2'EY17-Zt.M73)@5UJR)TQ]2]&i/OUDLg[W>^Sg\Ig7P) %rLV(,^_/OCI"_!1>s<*b%5&=V2S#Q=(eiW+oWGna/bVS00W&]hm/RJH;r]Wm_?orp3T!\tD`cV7DjS-ig(Q.:B=u]J4*%iXkJo[e %"\cV0WE8%C<&jArC4$$XhPg'4H:r!!%\N4FngFf;rYZmD'>o+]=k%]W3C4@0C_$)s>RU*S$oo$+,3bXF?6^f)4O+Jj3SmpNX/MPJL)D3tQ-HZ\,!chnE%)'Lqc"gAOi/^_NF5#S\`aV).gH:'K$D'\0W)MJW^pb-sa/2Ya9NP)giB%V`9!7%sJ7:@FBSW*1 %=_'lc4@Gm]W_=>t3=lMR4LQ0HQH_r0Y\D'=m\S/F!%Qj?.DEI!lV3Fp,eh555:r^Ha2(]iM)6T26!/]:H.-UjGWN2kVWHV5^j-,X %p%)@*\1GY[j+$[`04',J*X&0)(jJHN/2b_^ik0e5rCebX$Z+9S?6.*1C=("M" %Mq_IPO4]l&=KRtoFY8R[$SFc8`(8nc+sU?=qf&<4-C\F&&C:](]*-E;dO%`UAY/4C$>$Z^&5Sd2faTu(^,IEhM1dC$eeZ6ZY3'E1]L.>]]"X;c-%W6Ajff-,(pA"'0n7ZDFT;SY9WBO;VD`UN0pK+Y62+RG3lS %&nijDE,$@NtRmfcR[$]7(ku(9Gu>K %<(_5nHYofqX;fu^.,cP:WE'V#!X5^W3"HI)[d+?*tq]dbX!iJUo%gL[SX %9\-Ok25+Bh(;8sR,LoS&J/)R#`_e]sr3U_IYqK8SEE.+edICeOm^sT:0T#,;bPRhXf-Vo&o25XdUH4hSqL*T)_o.QNb+$m2?NU;= %`(af\'t8;Ba<_6fnk5l^j$X:*9':4M5C+7Q6COq8a[;9o+JKg0IUppCPVsr6Em0:A8Y58PeP9cN4<,b2Le#R>B[ZUiFli&D=`L5+ %!>PprkcS#>3B)-GOQ53<:M'UT,h"91\[':07\bIT]]-RF-NDC2J@tReI*@jm@[[tXr; %KraPL5.0()8RB+PQ4(.3[,eh7Z$h3p[l@>HITJo9"5?@Q'+ep$\]U5'WOuif^0YpV1nWksXZ/s-72&8;c-^O1q2t7fZN&[e*%uRj6Q=PA_H4pT %%_I:"2OOe#E&1K,\Ibr4l!Eg'`lo-80Kc^fke!/*;SiEkWO<%#D@F9GF673-B#hG"$_+\*hl"H",9LLVK3SR3C!`1aiAsZiEomj:mrdM#."4/.c %4\e?^_8:fi6a9?Q;L9q_"g4RkoN/Ssb(ng94NCanUL)[qOJl>q/C$Fk*#7n-]CF>/hE&9jb7=OVXtZX8WU;Ou*ZT:-kRt^11'[*0 %.BBUR^GbVbbG&,+mS$K(O81^\EkB.V[62ep^M'-f)]Z5'^TlPOZ0d#].LYDD;Q2=)`5Ldshc"_"$U92C5FImVe%iN4WJ&,8V9!MGtjLFFgdKqLG_0f+7Fng)oj@dqimB8Vm9RZs)b.,C6QTmDt;H7i,W0dHW` %:FWu(G)1*2pokJN6P4X&h=o]Glp;dd^ASCA+fQZmc!U0Z6!*Z8U#="`[6Ye9/_RgU-9S)E]`.'9,"YPW$i5Bb/hf.&S?JtR_^`h(ORp:B%FlI4puc#K>pnnalF-5%8?Rf"MOhg3Ip@LJGqY*5MuhNKS#SnP %&5XVr.`I*bEMI3#A<%&f,I]IV(9^;2?_dD;=3d20Rl]4bK`(c^;tJ7;"NpL:);8j3Jfq.rUVGZHIkON6R1;KR;g#kE %:)=Q3/gNUSg8@FSfs/`HjCD?#Ij(_FdqYSgWL2(u>PLiK %\b7Y#@Dh^F5(4[S)s@E[MS`Fm<(N[.Vcqnj=kIKm6gR_4I2`?lYm-l)C,-ZY62&%HmBgPF(-e/uDS'SmTO&m0e>*(`Stu@!>)aQe %g#PQefPDtnfurLE)as2b_Q("7ZUfhoi8Krd`GtNU]>OZ',:=0YD`GS<+1P",QV#b!AeWB?nhc[1f>$e(X*p2/rOC&'`e(\)3%dJ> %!rB8&>5D3a9,59K@e1NtJME5.f[T#U:6fe5al'5lojn'g>[Y2m3!X3ETe>u._\hna6Y9lMU@^4(R";E*o<;'GR%hK:ZQR]@IDaK_ %_E94C8u!?#G3JI3&`a33T'`Da5.a!%3_Z$0#==V6$Ch".+l;eu,lEKp;*e,+Ht#7Xr5i:G %fjiBUKT;+Do[Q4kFt!S1]c0g9AG-UT!UL"&D]iR-gt2lKk!Hk'\F:Y.mR5.%#T+HJJu5(m%ZNs_H?BMQ5;CSQG=OB^&>G]PnOk=S %MsP!tOEhGe%#$W-M9[X45GSNP4G&Z80H=rDO&5FmYj[ZLquu=.+@q/bMC\)Rja(mja9SfB4O.F+]s%!'A@]rU8O#JB)Y %hY'F#]/V-['4ha!U1gR?.K"Y3gmiH.#eajM"JMCknn-`=#uV<"OE2Fb+m0mL!TR7ZJN\^VPi:6j6uZ?>c4l@T0s4L.`<[8F92572';FKKD0oqD0-'8%g.g2=,9*7"h/Q?706M)$Vrq2tB(s.iAC40:/!l$FPF4Zo_u;i(l35J1jbe(j"2S`,s'[qK+A7NLA2c5ZV2uQAcd-&^-%D**b3[HHV!0`miUbN"qrSpPI,Z=?X_<:R.K!'MRN)NB;0N*r`9sX`n29n9QhblQoJI:! %"^BPi$H!-Y,B">U1r_Gp7eYmW?M[#4+2.6J%_H_F\3um)'>oU^m#SCa`(?h_-)EYmH_$3IWqoa\-JSa87Oj*bl.@FD(j9AX=J&hV7Y#%O[TAPG7rr,smRY#(I#SEZqCL$G[%bH6KBY$3:Rn %Jg%Af$:5.$M]oIt$A/a0P9IFk#%E=[bo#;_JV&W\d1B\(@o4n`eI^Yb!Q,,WfaqV>J`DL3h%8Xo"U'V=i;dJ;JL"U\b9>4m!_%kE %l548aJRsTJmL\`5!JZ@PndF7N!_j26liH&C!fdeBoHE9Z!-!?kZ!IGZliJn<`!_4fNTk]H6q7*rOD/uMAVLW=R-Js*Kt\3k6`0+%Po;D[,HC'`'cR`u6`07)PoDK'6a#m3 %(E@IO"1I`RR=&EtLOA882`g:>'D.LqqTlg>VNl6?$f:.Q-YD9P67_fVb;/,LMi5`iO\iaUi1$E^F]Op+TN1Jdb94_1U %1qh)"QlDZJ6CQ/C:n;?;D!]S;@]$m%;3"D(\91e?X^i*N?I8\grZGp"gdAN2")]D+$mUW/u^nLo(ec.ZRB3kO(R!Y]pMV*m7W%XAD?A4^+J+2+^IWZ3INT_R\HR%a0YHQVbr868EWmP=\9g(<./Oc]k"+Epi2rIU_6JFg9H%SLqeoLS0 %0c+:mZkQ=1L:ELD')^Jq6sZXH?doPLprS%u:5gn>'FD&no82MqIG$K"otG;0PbQF5pn$2>Q(_tP\IZ-L1#jtO[lcqu%#D[363R21 %Up\94$2'p%9"fIFD(98>g'9;`kS(/`jMjnk1Q)$rRe#1&Mq7`PC!j<`Zq&ocm9m>=fu&]U)-tBd6:sj:\kSh:kVDUF&-5k%mm-2i %VNV?99%VhH2P[Ud=8-a>(nld4H9W)Oe93r)iIK7XmFNl5sQi.:#5jgr6;k9 %0$@[W6h'9#S/6Qs['Q#(' %9QaTCP[dND/^[rp3IL?T)/imJMI?rLXB&XWS+FH8K\Dg!i(8q63:RfDq1r8tZLBN+rNXF.R^Q@uEKUm^=srF(nA+"-D^bcuGr=+# %C]M&)9McXTq/5$b.=t*u'*kq4TmErK'*Pp%IQl+=1I3ob"TeuS-t%.?f:#`^i1qb-E&]eu\PSkM'XA*7n,APOq_#q0ao*jJ(Q/.H %"T_!\^d)N$;YIhhaFdsuAV#Mm.9q&T!Y&1N\E%RSKK&;88EK>8&M_^dqmM:hTFje,>f8HciJg[0,EhZ.8:SQ5+ebRMS+m8-5e<@F %B4@[bD^T*]*Xg&);3:;`!V0i6@!Nt0gf^U4"j?Fd##ogd=Tdj"hpqJ5cU=edj;plGrh'2@cVRn`]IWNR9b*M6i87@N0O4_/#p;W>3[gRGcba#g+ %p3,J.rIGgd*f67]cB2glQ-sq/?Y.&?$*drQMAnZ/UgNI*S.VbK["_j#Q:'-`eOjuRunWV"'m+h`aK`S9XhbQ-q'dsLWY./SJs^N %n"&Xo3-B5RQZR76qVh6"0b-AI:K?Y*4no09=d;@Y=Zf[kZF!!3EB5$)Jm=gHh$q9=^L)_]H*i9lhqHR/jJaOj&N[(qkmRRdJ7a4N %D6R"+=H/"Dd2.-5BqP)k"cV\WfOcr_Hrg;#S!/K41&%D^q]qbV(9&209Jn.\/X5F`5sK#c$5`:CZab@[6LBCpT1ntl1D5ht%mX0^ %$tpSd&AY-6=C:F7X0Pp82(4m?k>a8Eo@5PQ&sO%3A@Jr_4?,D1R^[H](\4'Ve1$Jn[JmSK[M!*N(>?WEY0[UFA,$C %PD_Cm.&:kq>m]RpY'L\BZp^iYnYTCXkD7X#bq:J6KJP?MZ^:K9=UX2g$!5dK4fVY"lg*#oHMPb[*Nk*(eH@BRP1',K(jt=+_4>K# %n3_@>PgC]1!T`36$R4#Y#Se]SC(rtWd]g:HV%IIp1c9*QqUUPs#86IL],DfV>cRElIo_np)..q*S9aeqliu"*n%*#CjKYfXRKP'! %dXQ8.]H'/o)0Isc/n\O98mY9BpX;&`Vf-3oI/JbK6Kh@$r^Z1O"CB?FiGcM\>?57NGnA8gE-?q0J\QC=^,-Z:Rh:EmMrP;fkc/$? %^UuohJR)p-Wj2Yt;K9mk[RAeW&M:nC-nV%(@7Gru`.UO*lI/[qD[8+A@k %Dr9]L.HD/"Q,KsT(C?=&/g\qG\Os)&p2>4&?2i^PU?&B]'6eC3<@A:uJ@icCk?HdC]e[P4+Q6lDh%j8*1o"V%0)=8a&FUiP;t[Bn %qVP>9R>);-]Y_l,8=PQ00D.5T %J'Jr,^&gK,#!H0SJ"pfp-#C'.->%VoLpa[*Vb"/lM(R\FO3e+)eBRf[+HXFqB\h@Ii& %^N>OP*@/7[9L5HEj;/76uQp4&?3t>VP]]/>0%rj8M22e)6/A/'U(^[q?f)8'o!V;8ZbCO %7?Hf3njqQl)/^_^>km+DCo$a:C-A'(e'U4*S$-VqNp2d#YKKp,^t?30<)e=NYDEdQ=PPah=>B_M6)$C(>J8=)G5<2A:]Y/M$j[H< %C@pW\s-?s:r\EYCd,d)=R3f%93sDGjnQYZI5#_mpqi0CH2(k]2Z&a"LclVH_8Qm/!O'"C)j/T?tMXcA:4`P9!YQsbYR4B5-8.dA: %c?b]-ZG4.2V[hH`LFo]n,>YcLPjIG0_PE2!W"=O.R,1)ieVcgap:M2e^I0u)#4V372`th0*qgemoIZ,-S;4f)htj59htPCFWNL4l %+/mo7X((cqMKV)O]aau:Eh1clc!"p\,!-r\4J]Sg24FicVLuC/96Tu\kr2/9BRmTuG5t\O;;@2f?l3Y44:2L(N;(d %JPM,kO0CETB"D>$([2,l:"9S$7?PR4Z5ZaR,?uaEC<^M/HfHXkeRRs4aje=Z?lK9%;S4rG&8&B+:hcqG?U9]=rfhImV^dI!LC0+k %0nKM.:QXc.iCTdsMaBBW-[c/D\=n"No,Q"Z>iou9@1nipF! %r(fV#^V`9q$^j^o@2Y'W#])ifm48VV"dPOg9s7:I@=:__F:A^:\NoE;mAH9k;`E9pH.ACA1"&>894l\mGT!dI[:D2:DC1*:4IB1I %"ri^%TU;NP:,C)nVXP?X]AsG#c=WE6W\KAjguM@#@TK'#:Xqug;lk'#"%Yb2FlNosl#]>A3ZF:kBq"gqDYU.Ppkfu'0#P@;2I;-Z %jo_-A>^ %XlZ_MMBK;=-:*5KPLhPo-g"Rkq*ma]Zn'*$!VY(d_@Nb0ZDs+V,0&5FE8"3!Dn<>Z*nHi0^I!LMjtPGWIBf,7M_SVZ,rs%IJ5HKc %VNr9*FQd.k&YsYGR5F1?&S!gp=[6n%pB/f9(mrNB^QoIZeAgpKNFi[Tg0GWTrV=_/hD%>5b\c!`.-snIp,$e-3Q[bc8tkV^W$=&O %8T0F>&=jd"GV>HA&0Dl9M>nntm3;\M&XrVN#K-N"g4*/pVEY4bo=ak@7QUS?g@$[I%<)*VpAB(LAb411(,*b!Og3l+_fp_YB`Ccmi@8=gIP$^UaJomb,0BWqnMdoHLg,(.C)mnm+:cb2ujm^4dMU-QTWY.85Ein@"%[?sokI])*g[bX3TPNp,g=-1Aa=m\AU17u82(:^a %Gj)u*o39;H=thoc1WjY+\nGT$1PSC`:ur?XZraD($1BdOUSHu&nJiLT4IL=j^!B]X!ua;<%tCr@oB$=B_n.r?#J#::EhNM!(A]fj %Z+F!r^44F:%D?:%Vra-/gM_(Z`$6n(^BOuc2>]bJ>faf^KkN8G.&k563.5./%N`L9>-^U5'u4/d+9-etp3ZQ7*1fam+0YZs)&e;$ %Ia.]WQGm&U0E$e6Z^*g:&t$fUm=Ec!n[M=6X;,a3-M@i! %:_iS8(!Ap:]0GgjflH[n#,,,>re$E.nAjAip;c'Z$S"YVB%).8QWpu+ZZh2(?lUD`(j\sR'\u:":b>of^RP_MpJ08IpEt<5b*Z"o %48haW*KReAF*7*+HZ0:92bf]''(V0[h6rXEo^cYbMcGYjpA?cCota._`EB-U/gPB,#/tBcCjO^T>nN?MANas\4(i)]H!umd._PQj %GH0tV0eD.,A,(XLl9\h*#f:Rm0W8qU1Kq_(?N&b67a3' %iF?Q#n0cGqE6=us2C6AUHndP-huS\$Y=Y[KZK$/P4C]"BJ:,g4/]NaBnh+cG1]^0q&i,DW0NsFM@DP3*u1As1O1`P)Z(p9gBKJDV>Oj %WHUJ&2EGoSC(J.so8Wj>h(?"7RPg6>Plg;B`PdYOan1s3NN8.DA?g0m(4Go.+9(??@rc]!CuK#O%r:sb?Q!I#UPr= %KXn0jGT&Drs+<<_ZdL8=C\\;PUcJMgF*k^5PZU?%'9JFGM(S=Nti %q-'j7mRl^]q'G>$MA_p70r'CM`lt@?N09kl]U0PL`#u02X=u#cLN3`rmFo!YS1jkYd[Z`:h;(q35A*p'^+IZJV_HZICH65EVp/b!/\/=e%>N1?FNm\WhV)bY562j#,(ot5Ql;B- %c,H#3:.]L%=iEYI?tHi+BkLnq5lG`V8ZWO7DW#loA$LZ7`eHP+=dN %:=TS_HGbNS`Egh#qdk.lh#4L3s1f)jn5a%tarA"+m/<<&Ad$lQ\R0)Vlo/4B/M+ %db"+P[&TTBpBY!sCNj:4EGA+=h8rGQeKCP"KpfMS&k[jJSh&Ccf*P.6X@sF.'tsE8-Q"k>Qa%'N/./?`5-)NK4hXso8][W-lm9$W %6FP)ACIPWSl"_*$`EcDW)$uZ#8:bf?rAe*05kbL"RK^C5F\1c\G6AXWrYk'<>6Md*LZT8YF51QmMLU\A'C+=UDnGBd%!mS9UZp9L %P-7Ie(2_FIQZ%)%8i+#ccI64,(QbLAD7YqQWAcg&Mi1=enp$Cl6&HMiX&XeCE:\UCiZi9qh;Yg7N/ZgiJ#l_-eGTTT2o%3.)g$rU %ko6ik:iW*M;=m3!+IHoaeVRY%P@"\;/iCLQcR*/?^XnX2RN'RN&`p3`.BQcm.GDk&CNra>ct&5d+-FCFM7)"F6fnr[4XiNL)m3hC %m'O/pX8?^')]H?WZAa7TPc@_2rcHXU$j])qd/.fGlq6W':/:*2,fG8D!Fi=/VdO_[7EP.MnQ-&2VAqA?-9p\U,M"l_>WlXfUPAl;`#pf4 %3O3%Y@FeA/7XhFcQs5PJ,Y-1P?fP:C50O?M[!Q_;eHTr6=OF9B7)1TK_)8Td3JdB8HXsn-XGi?7C(b0Qorl)Li,-gMH$cnoRM4S\ %AUh*GE+L)U[q&u@8`YU!kOXfbsni*Mq?CZJH"*`k`:*4dVESS%aIBsZ6/UXrPSdshi"g@q*/9lA5\1(B12@`7V9m@ %Mqq*O049^FS'2oD$*&F^;Hg6&"NF)-j%A9#?h$_PtGfY=1q6R6>@d![NjC;_dXb?P7 %0(\-VYI!h5HkUmg4:Lgpc<(+f5'N1.QV\!)I>Mp3eRt_m"$s3I9QaNu]?p)6Y%EM>6$@Fn^e3;Z$dN'r<'8aCa.rYPFM9("/hW*s %8!_@Qo:j>(M9K-PS?4p,Z3u>#%-:bg1-&QBnA9fhGB>-$Cr?Rh61]Dj+O>=cf?qQ6"[IaBJ//?Q!4:hJ2^iiNhLH2F0t,F6>)RW> %%"P/ObiBei<>JPQ_:fNop*Zph$`lT>qV7lQl_?X4 %Z)(]"RemL&DkOlrRpaUX&S%])8-*l#&]Bl25L'eP!^oq./T*akeH(E#=_91uV:I*u!4qa@#f;*P.EtOX=,j %_+PMoacm1bc))1$TN3fN^-]et!Dj!e:DdkV4kk21/p\-$0bnPt5<0,$B^FH:>h7Ccn#LieolQ%ef@0G8%alD=?PY;7bEf %hepG=kTZW7%qcNM&Hm?AF:=eJ1iU.*$`H]r(J%&o[%=215J7E7NLs`0aXVR0FLU4$7Lnk=h-Xq#ZJW`-j4Q %*Xp6#E')Duc]%5!ola^Ai$,jh3Cit_9r,B*@ceEI[E4IU[d716q",j9-sEmiUJMX?rDM`E!iqn/&`'OLnuokmeAX*kD,FG+?:D@cS#Di=4'@*s7n,YoNufCG.Fi6#e.2hU@HY\mAR1'&\h %DR.M+1fY7fo,0q,HGs-W/'i/M9/91u)'R;$3+(!_Nq<"i+Q5'Ym+rsj-XQ@NrW^"+XD3HlHkBZp+WY6DX[qQm3\\/N(!dDtPCU%6 %5;p4&Y1noZ2)WsI[21AD(,'/XJ'W%8II#6Qq6"O_+g$>CF1=*>&8q2@P5q3\PR_"L5J/::Gk:C37A[P]Op:lAJXu<+RY1S1VBDEH %.7EN#>&o7]\G%Va1_DN/"_+To=.nFsU8"):WQsWJj3C:>Y+K#HF`BCjrV$m?.m0-IqXP<>If-4VahCFet]a-dQo/iND27 %H^oGlbiu)IY#8Y&IrGrs[J_W-_D7^kq=Lk1gjQ]f@a%4N:3qV4%tI$Bj9HSkru9&t.hD@g1?OWK%Zf'a+lh.nEY*SRSa&I- %dHCJ+p^BJu[=+hg51nV(Xat-9R]@<%M2(+;+a1nAjB>V %;u)`C]H,Yj^C@@?]j\"%W4eJ\n;96r^(C-ffL4?>k03]&Eb%V>\2(3>e6XQ?$fQr`^9pD@%sY17K=\]Bo[r&0@;;rMZ&#%6mi?3I %^mu;Q/FE'rP&#u&m;5^d*7>":VP@)DoGl;S"tjM*OCuP!l"Q3Big21m!J1)r^>*:bm'-:iAPtBaOYCC2oGeGrMLadF0@(FJC0q)q %7=WRoP:m.CeOOQQZCcrVcJIP1."*um1NINrkV,J(LSVJkf-3%U@Q/6AURn'e_)!f4 %5)OG7Fq5T^I5=)SF#:h8P(d>iM"A5jCNsYSE6hA)Kk3-ZfU8#/^(VjE@MLM"i0\I`&0BW]29B=:/It+3(;K7Noaq16j]>T0>TV*3 %fD[2^W+0JLmCl+5Lhoq[04&-rW`Y_&qeslgWPYR1&*-k(&]?VZC;'#mVnnU"&VRO0"A-h]dhUKfnEfC+ikG0a5_pDW*hRV17U[..'E72 %8(#0pD(U-.BLnI/dLfDqo1$@76b8R^Rnlr7_nCdG?f>Z5]:F,Cmi!VH13X4Ee:^!Ip0N,*Q^6i1jqQd%@j0K:EG %^J64R7#AQ%^YFMV;>O2TBi+&#nEP]153tS0i"$@"=g2Eq35qh.VjSDu@=qI\,C.\K>'5W[?u4_+&lEu7qOD)t0(SUnO/8tKoEN`l %[ec"u:$/el!cn(\%o1M+E\-;Oa54E\f9'>$Jkpo@^`Q"d*eC>mb"J!]k(a(B%SoofE6C:_9MBQ$2plB1!toI4Cl*W;a`[D[Y,i'h %5jVOX8FAH-')`ttJ1qB]_e3XpSKOjfA"tk+[ %"3Pm0d"1<]pDr&B/'/%iC)A0IQ&`,XC)ElDDmO#kH^1Td:H2YBeOf8'NkJ;RAo[(!d/nYk)/2G"?0ImApI+Li90&SA^g]TG;"dfl %,0<>MG:C.;lZSHAV'cE_VhI5DP`KO`4d[@M:dQ14,:BSDkk8fA_T.n'B:T&3\CGCNrHgd#I=U* %7+GR]Nl,UTARR[Q",8-]MjZ'r`mmf/fF`aiGr\050qX4,V`;t?A+'0TjAY$jgl+(5L40YNdV4(E %G6U#b7lmU+MGRu$A0/!_d.`pb\hJ9(,=M%S&+FnahMFNe*1H7#6P+:+7nQ$)R>?[;7F]o,njQIcnT#N/RmtTA1I/EZEQt$GV80SC %eOBs<`!?QK6*mnd!u?#@:WE#ZZgCjIFr=9B'?O(85W`VJm6&8k.A6SiSV6-B"bd+kZVbZ/+Ml$0RO8B-,a_ao:+.eRX1Q`"KC+i& %GXJBV%++UF2g85]TP^*&?$#n`IY7iTm.%-r!+E1KMqFA1*"If\?-&dM%2$(Oji8$\&$qg/P %e*u/TH:QW/t)r3qJIk_kRe\S^!Ph%GM:S'2a%fqSW2?kdNH"X?JJ7XQWfBKqoo %8#MQuFM!L-1kHm$ohPW9oB'_`%"a[cTX$N>eAB3bcpbR79pHdI&O,3Q."rk0b$=-FDnaAhb9BFE[5f3%<7[Ar!]Hd52.5)Y*!;@: %=F;3AG-W[4FrAQk'Mq;O&u/\-#P]PX^G=_YK.eokkq''[_7,nL%%-k#(jD8s-F=1PD&k/Q+]s"#c9#7-If1[#jp^cEcQ]3P$l#i\A`9&8s]\>GfZV<>k6mu[n)D):U6u_22a[`[-0KVLO5NNFhL]_4) %Z!0f!+]UHU8'Bhr7+nC?l(oSM-4_p6SJ&q7,-Z?uTYfcKFjB"$?q"[_,V>/1q&A`_qtdPo;TRd^2OL2-BtO"JiJC@3F+F8BKs^29hL9@"8QL&e#$7mVkB7 %.=?Y2!&GM#>in3"4I)EEVI)$6^F`+,YY;'t\q%%6AcO-%_Xkm-nQ[pXCq:?*V`o#Z+P@n'1(n[H/+o%iPplHR.)n>`!Y9mPC72c> %Sc^mN:sA6l$OVO;=K0F)rB?[MBE*$i*35YcN\]U:@bF2rklC,/XD.1l3P5Y9gZQt)JT>&=ma]nifJD+BjW,$6"q%ZT'Q4-n8$8VC %LO7G@O*O&L(@#'dJ#U*@JsUsQ*bTA+dMT"'F0Ats@:@q5_7:"LMe%GM?tbqc`6j`EoP"BGH#gI,pA<3^QY6fR,fuf,c`^F0Za]:B %Kqh6J)JOZ?[990XV4^TB0rYqO3ScO(@*'/e*]9o.=$9GsHo0uT$GNIu,e9o_V(m3lZoD]'D?[s/+o)Ta,?'4qPX=ie!N!A`.KcrO %-gS)UK,0H1U$Qc66quYEH,^Tai$K#ScV4&#!k;lKYQ]3E4Bi(Vi]$=b$dY(@8J&nt>g1MN3[Z;,(G$$cRa2]X3J<,:VUUOh5,][6 %-'sK%_hVPA?deC_7'abOaq@BOYqoV.PZ+Ai$RgqY7m/e,kU=AM5ckYV7tdXLc%%7\MP`ngQJ3QTeDqM!3eSKPb:Oi=GHEAI*@*(i %5[RE+6>geWdCdDrke`FcfSD3*'Snd5midg(qUM6/!3XFhZ8$V.,2G!H]UpGYMfdmP;T)^n=sc?h(4q[D1Dtb-Uesj%`C!BII8)J1 %bb'gU2>F`!8Stuo'\cdB2PV/nS[R`f*n/ %WpJs/%#Mh0GQhI_]T:"qT#,/eT4#Jm_5,er/QO4tcm,H,V7h/b#0$QJ-n*aJJ>"_"^iRu^oLp!H2-5g,9E"/P#o&^;+ %,-$IGgVj1h?Dt.cC^75t9@9>E99i%edko%BQ+_bWc,b.FJn.?F%PT)3>^/nXI7)&W@1BG+K9$4M1(s_3?9Rn3K6'(VP#T-BkY-^Hd+cFlNC:1 %.o&\1%(!;*F3Tiq(JpjKM!@0i`-"kd&bTO)cu[Y9Crr1HHL^I&g1hLp'J#>Sn;_eYKP,d&)Rn!egB3fLeSTeU\rR18@Vo@`asl41d'H %^!qYc!mUmqd&bN_VjGDu&8J,un[3KP""`#nq[G6N!qjD74=<6GE%%HlEgd@jR3ng_W22KNFQR-h>tT=6.hcZ@6!.RY5rQ?E0id1* %`i_WX,rC8+6=__#BXEPMBZm$UD0)76a_iR2\/5IK`/1Pi)9Zna3#*$fC,iS9l7PCD9G%qB7&NZM8n'MP!7["&-4=]K_C=WpES"64 %:m8i_]HCD&Sij"T'>=36S!(bXc]d`_&lZC>IPMjQ9.J7+"jgo#GXH*.)+I_2AHM.[`6V`9*G7a$J9YMDGWiM+Sc!uY[j:nq[iGQ' %UqYYKeM;Rl1ehi,\nSUhBL2Lle>8:uqU4\hj4FX!*LMPEER5\V'('iPiJ5Ja=XK$.I`B_GA!k1;.3M$7jEr]U#PNP1E;Qefh3V#$ %&bsoFDdND4p?L1tX&jd63tmu;D>QPfr;JeS9,Q_c?iKlYIX?3C]/f\`rU]Yg:4E#*h`_#N8&([MFa6i!S\(>O>1Qu\"!TWQ[nb'lebMV/_rqG0Yf^BlM$mf38`ai,f %mcX6-mE7`\hHYG(XabR^j#1N0#M`,:op`!@]5R^kFoCf7?JU"NNOLX=DW&;)Tr,S,;6TS\Qf$W3^3[+WicXqZTl'Sqk3_R(o&"=< %^AIV=[uJ)2HF5q;=0M$Rq&:Sa4P5,\2r@ot?G*gok\7_[]7/`g[.->!(#JgQ5"r;4[Z)TcUXFYl=@W;aouR/Vp#=5EACa3lL96DA %LYL/6gWQY4Iet8^ZCOQp]IQ&:ih77flJKAQeb+.D?@3Kr0b52m0CBAarq"[jRg5S\S$2kdjmLBsDr/3S;&fK1k.WA<'@3YI_%.0g %?iK3YS's$N!n32_0R\"h;&RI@hqq\P5)N%g&t(XEG^^op.;iWR7u?IY1&W>(l(c1=PaFZ,&f`3p%lO?]`'b6e7\9IO`3_gel/+,M %^4(KQn`n`XDh!Y*^Gh:)S>>]JrM/8'V"%RDM=9ag-F1rX]mfS42j`E/?-r%)''Z,4npBodJ,&/qf9[!g]FA5))]o"i>jII3@Vk4B %n)&p;&$hiI\Hae]=O7ipnt92)qVU3%idU^ZjmMO/`U.a+Rd0*dngF*k2cm3>4F[Kpq*Ct"K1GX:Ek]GqNQls&alt?nB(1/ae,MNi %pi/Ags$&`^_#Cj!lZKnUIs?V#J0gYH,lh#>LS^:dl(q31Dl4T*a"hVN^&Z+KpSGOb1P2WFP^%s^#QIDc'W %n))s6\pX/VA]7.$Zo@EbkB27FlLgX)8'GaQdqZf"FO^/Z&Q.E7,bAP7fV"Pgo.a'hEgQY!lHLD(Y3r.'+3CYa<32*!UJ=V!f,(nt %Dn^XFq.;.HiU=7Jci:OO_9o?'gR%sMF>`^fpnH"B4mWW+qFGip)X(r"%pn4s%"3NL\*S=*[t"?*hQ]/V9)n&i?dOScSZO?nYMRmJ %nWC$T[^_YoXT"pNpd_j8S;gbCEd329G;E`YU74j3b4lKePM+/*%WIX-p#Yq7f3`uRn`&\LgBoV/q#!^4GB%j^:,%aqYc?LYlEb:5Q3D %^"SP;jPIs\HOUeZpNS15afYPd(U_XXG0\>>(b^APoH0--Yn7<8a\U_^0#<_g]oB,lraWbHGYh]`:@\?Zp\l&AIr8bfR+6O\Wh27< %JH,D`X/hT]/)EK=Jc+ZqqYFV0biRsdCde"Aj6cTl)Z?6tr.'.b_pSKKnW[(l?_,s+S!P4R];?"E+9%b!O$rG'"'m@0+!_La:\R`; %T34?qSf=8.'NHi*C$&""u?ip5,ak`d1\C,R_O>eR]ErkZ/#?Et&Q,L`n`n+!8n/oDd)7(WBP %`Oh+7()ug:q+W.l*b:Kn1'\idLC%esH6X^4acaYE\Flaj)B2iVI7`IIZ79^E@JPkg.d].""eVJ-`)`3'8T#+22TC2fK@msd4C)%! %gPBG)=Foat[s92Z^7upk7\>[<4F%mVn"6d.`,6gNQ)F2")a=324$mcGpcl_0@OihhkQl1SZp#d+LlI3,7n8@G^'+`I(E66?4o))3 %$Gh,tUUQAns3Vf0_U/s)WuULr`9o![o;u8_Vd/hQXSq="KfJ5,H:#?BboGRfmInT4m[Gq:IV.o[WN68Yq^_TS*Y4;;r7stOW2J., %fZ;F3QrbhTAa)GR]OL%_2qPh$O;%,g!oG_Bg5l5.IMDUe5G_%6"1_rHJ4t0BsWS[kYGUFnt)L6up$Aj5/nM;@9-g,f0jl %8W7XS-Ci]F;(eAU9]MKHV^H<$9K:'d3-W]b1?%kPn_N%\#s&N\GYLSec"%EJ+=VbJU`D,rEjK?#43dCZL/;bL,Q@IL\^[_ %6l%i!^]45oj``Yen#&o&_4BFk$@d<4OUB-):-#\PC[mW3oM&LRp>XIAC]:hf]0;nTj7Bt:)i:A:E[]f,B[d&AHrJ80POJ7bmF@\E %?XCJ"$E:V_`qb,P1J'DhBc@_YJZa`VhlY_id)4_en+5Vm>&5PqF>`[qYOPYJ5/-3LFppig8hfQ(?I?T-F5>Z'DEq`cq>2oJ=1i;;rEFV19/:U(Ap\@oBq(S#WEZDgGd(qnL.JGg&XV`XMofA+6b(&o&N`OY(gWRcA?dtQjq*f_oDB2WjZWr;F*V'+n//#\DaXiq#/$[5s)[l(m3>L?c5W1-NVCI'0mfG7qa+E_ %D61](l+m%d]Xt-p\3o>*Hi$NcgqS51Q&gnM!q(iV@[:T5cYm,E7K,i*2YKVRa4o+%o;F7paFq,:pQKler3[/6[kXlTaPVnEq!u&? %?0/qAO4ooG=50I\("'Igl@kKU7r?FHgN(fPllEI.[cN-;kGW5X4_e2]g6VJBBHEHGYCBsD+'^!P.Z6J-[Jd>PU=UlhCaPV9;cFUI %O1lof":>qbRXb;5GEiJ]KZ7RRF4qT-h=Gs"->=\]A:NBiW*cPm\rCDEUjMn?U38a=g:XtQI.e_qa,p30ICZPbhYcp'lJ=J^,IuKs %9N:P8]=feKh(]Un47VZ5#fY\W4mjbmpfgno-\UJtAa&S%MZ4!rAK*Z):OUHqocucd*SV^7I=03r6^j$LANl9dCb%k;VNpr`d`QCm %p&$(5b1q3Y5.IIBV0eE:m&u(e9Ia> %Y(hBI=0T6/s8=?=r8V@FX\t-K#Siu]5&Ae&p//tT?[d@lioY1"4JDeb3N[tGUE"B?K8t!!Fp_Otje0k<1nUZc1iHmf:Q^:<1A%=] %FHhElXfcC+GEef&M+XQ$4/Z+mrAU5DFU>*ac,iF[)^(DdWL;St>BmFq3>#g[ %c0j=N?!TZWR9)=SEoV"1W>kX0=tXu&Z+o`47Qm\2fZJ=QNPTu*IlAAgpkU`4Q$#;AXb?M6CFMH0ZJ/T?69*QP%b!n3U*$o5p8/0, %I\*;,VRGCm55dX%L2Z-JrD:aX?0t.Kf&"E*p-sIs8'^/[\o2(Fh2(sM]O-rn^O<_^YkWk9KR]s9o8YBQ@4]tfNl$pr3c\=6rjGi7 %o2F_U4u"AfBBES$rnYi"b=?M#)ke/Hj1]kH*uXg\5O9W8nk!Mu58i1f\VV;SE&X`'rk'lX[`YOug4!H@hsG8p\W54u[o63'$.[rm %_A>D4)Z3W:IG,Y:K3*:J6\"!.nAi"S,B)8DB(;[0CkI]?nL<3$AU;3l[[!ONi@3O(/,Y'uCb%l&hl#gCK^/r,akQKFHckc+]_eqP %kPoLZd!P-:0gWpI&sPMg)k5cch^_FCVj?(W.sA$j5>TC"P`d-[;p*D<^UpG(*f@_d/1l>H6_jZpW:7RP&\S)DZi)5,nA@1oCQHTO %Ee=Vd0Z?0qo`*b?0130&8PJB^DZ6Prn6gUkb[C^Y%8Gmnn"O=OJ%>">!n: %"hF_ag.Zh/Vr$HnEOnq$Ir1IZI_LhGT*@CCDtukSA=n1m[n!Y4@q`b\auUTZddfIj%dAJS]m05HRh(Tmn$d4BmJ^URp[^,.VDf;u %DroN\9@:\qqt$T4)rp0P1s4XAh_2*04\>Zs4@pXk,X!ZU_s'X&EmRtcp$jS]n?Wfm7^DXsA-N!2TBP0=h/6bI5:M0Po@"b:K)+Fk %:>2*GeK,_/$(p.r[RHq]@sPDo5DeLHr71K52V+Q6f,o2g*k$!?Xji;Ss,nV])>b)*Nhie9s,`s"S!h1q77[@/c-;0] %hHk$[=<;0RWPsY?k>m&V:W=?iBudeK=+93![Bi^q[V]ld[NcLQgVFVg\',^3o\Gl^R4OgU@u+?bZO.3q\]qoN1]M %J,.j@g\O-a3#S=,.E']o=UHJ,s-`2&VNMVk:Wc?/TKYA:\3h#ESL&#:@bOZ %Cm[\>XJ@Vp\E9d990P7hbUq#E<5QQq>O'PO1.5h\(P\F1!K8I!V`EAjO\VgE7KUVCH)br=l!S")C>6*HcdFd"*c,[jnkR#0X?Cl>3;L\hui`GclCYdD7O"76XbHXME\-mnUTj*p3=20TPMk876@HgAt%2KmI2[Y''W#9MbR;.4la;1IO"I<\/T!I]N)O#]X %dC-^WcrUDqc>Q@?Nie7(EL=iL=2V`=e6cEa_Q[@;Yi52r@+q&?"05Q2kkJ"VKqHF %:RsebLnVRrFh&hFn,?)Ej]NU4P(Pj\A1RHsUL*S<./N/'oRaZ5d/?P)qq"lN$aTnGpI3DtZ:CCChi\@&ts.0FKik"-5LmBnrdjQBtGd%_>tT.CqoiWm;Qb:F3b31u'D'dR11( %-3dbc+jW3P;NdW6S;LXf:`l\"rOIUR,`4s;,CoJV`CRFKOi?36A)N/*p0l@aHI)bO`c`PmCKN%;_NVH$h5 %acnq:odU>";0T@*K@80fQR:2'_XMI)/>BpH;J4K*,`[lFXB9rfdqT=-H9*F9LgjY-VE7Esd?OhbK9Ob.i+V\t-mVt!4aO#R;Ssi3Qqd7R;[=]2s]UbG3#(\ %/B%'5A)(?#&pNr1-eX8!2dt[CE15n:R?1G@E:O/a+?U[gfD54L-95q2<.LLYJOtOc_FgV;qh4H43/b+_!@4b.+>;nn/:?uDc^tu/ %V7`^"eE[2IM46,(8IDAK&JX@t(nBYF<0.EXJ0]6Zbj*X+LKrcJ5Up>k_bX9\F,HRNH4hS+Va\R_K`hst9pOq?&@7sg=ST/&e#JAA %*#[`KRASTT(e/pRQ;I(NOBaXt@o$s>.-jc$\9_W2>mrQX'`Hp`Z"_+;P,P.oM<\@i)i`Wfu=Y1qVFcc9JNMGt^6W)6CWRSDK %r)#J7M$:/%5@lWd?)BIh+WP*AH8U@_TZIsP %K*moQ$G$J#r#Z?J-AD/o%VQJO.87/1u?eijXM2,3r)=M&jOH#a$!\/*"('kiS:W0k;6S.*ScS %`.C?`iL".i8=-51dsf'`I`",L);$\sEk^j*ZaCh:3U$:AZlfYl(:t]S?(C^CA4QS6V5Xl\GXl.uHpJ#`U+A+<_a(hPe=AEe=APA9"?D4-&m.\1/r-C.6gA=9>[ %=4WSEO/H2k#4%Zm+c5jP8uHfq7"n2[g#S3J'ZDkfMZcCm"F0t\1Lkg9KL6tQ:rK>7_,'"3nEP`_X:.Q0Nk,k.7?eF\IcVGLAu9&p5gg1CKd'r:Xs/h1`!`.Z;E6.`7-sZ`HUFj5 %o-3=B8pUs\PU_rKMh[\?227j,5&ol!#k\9LaB#%VcOhf3=OL;Yn\QIY&NZ(<\R0qE%VR"+/b_=q4EqUDI<-4RC_(g)%#]!uK^t2E %4,MHj+1u;'fk_4.JP?ISMe[r[dL^P3qHWM7!7_S*,%Jqg)+(>KB*P&%.YC,n`HiEd8`/ciNHQ6JQBi$rYBLiLHLn'J1&97\:7Xop %FHTeD0D)c3E(Mg<0Sr3.Lc7:p,nu^q!Wm&K*i(Qa@b:j,(lgM(^7)Ns]lXE8M)!&b)epsjO %P6D_9.>g(tL$N!:aVp-&+=i2j?k@"jRE"Z3/oF\*S-I#%D%5NH[#SJZ/=EuZYlB=1Y %ej7cr`'qc6=:'sWZraM'i(]CI^mrH&jNR@?$#7aqmJ+mF %@!ud`2B&OX;:220Pt!U2c@F6KUh*YOhaJm[5"R;7hK'q.ALf5&8##dTgD78gR7koL"(s"`[\GO5b1Gb]eTrXTgWauD\ei" %7&Z[]]UCXUJV(2.">>t]+tPn`3(/labudZQWd9#hX\1t\W3*e<"Aer_&m,s].&b/BB`R`n+:3r]!g6@am6Gs&8fm9?UP"rWXMU49 %!PA1B!D9B2&Y!,5g9QmiO>=]'iLmqG,%1BgH+s--TSh=fK?r3P`S/+Yu %D$9AQAmeGd/eZL:!1]g9Cbl\8@O=5k;c"/p?6UFY`3I:!'#4=-$D`kWg5-5Y?iXi1)=aZ"(8/]O`LA@)lEqkV@6b(9!7"8$8P,LB %(os=^M>Y0)S %eRSRU+R4T*%gQMH$>D"bd4r^*,cs3cn9!0\j:e@5$`\5Ke1*^QjYA7/WTPQB?>974Q4E+uQ=kRdTn+Ca70V98PY!qZQutq&K5=UC %A#XV1RF'P)'u3?F/"FJ%r!_=:4a(dd+] %_b`Kom-B<"X41HFLqL*Cd%)_bGhBc^qP&^:'se1OPq3U9Gc>a/&PUp)"`"rT%U;[07'E[S^!s<4r_*F4dm?MY\XI"`-FF>-&:u^t %3FXmNhd]PSW.84\'m7G'!sYm]OMn&S$tt96Sp8QS=-,#? %s*=1--U7LnQbU+[dlG)>m&Ro!ht=b`q/-)6Zb%3L?Lf0JFFB<)%WQr\d2h4_L1rcqh+UuojDZG55/cRLB4$'cs$IQE*mVJQPA\Z3 %hFuRk"8p38Mh=.5XG]UEO@ebj]ZBTY"8p5NHd;'MD8O:4jP@a[*9Q.3i>pj?AmIOT.h,cHc7_mq+68iE/e7AFZd%>#QdX,Ab[ZOB %365`)#'#`gRWS(%2`5;tOJA7\bTX-(D-p'Dru.2X03$QSpDNe",3gLP+C9\;S6EgUN/o>hccD %_joKBFrfZ##"!fiK:@tjK3[2jMg`1#S$c[-TLAM+?)9Ja?bi*OSSWUiRWL'JhnD-oE3n-A/#8/`(:c#\AZKE+64+`RsgB&*-ZCi %@iT]4OD>j1E0,.2oPfn=*-ZCiK:I%'OGb*&EL;r[m)MD0EcSAoEg2b?*pY:'Qf53pEp3B#G<*n:!/ET!iZORJUEWKXRKG-'^hjPl %p&U1p?tl8$3X=d2!R>b2)%LVX1JQ6F*U(j=/n2W?@TsF62i1$.\^4'gEkg6XIu%US+7tgDJ%0&diB<6S8D\]rF^WH)EioKpG^t,] %ZmQ)RB#e34j_-%$mNZ$)UmK+_gI^_O]%]gBV`W\Aom;Y@S[:Pukmf2M"5N<3K0eMtLHOh\&=5LAVGDEYK-'h`a#s:Y!7s>q3t?;VP:d>bc]]C[ %ER9mj%W]r1G5WO24`k[oS"=_AOJA]%m]\(&4NM)0\i@K>:HEa3gR^"CP9'DOe\8qH:]>4EjlnCH %d-Vh2j9Nrp!H*@ld,aB!SGrGY:B0n"lG*>o*k/mMF66>K\^MQFS::A#`Tc],0>>%\IE<@9Io0Eu;?'Sps'Pc/qHr#9r:/dkS'0Pf %IsCkQqWcVmDf9O.r9j:5>,u;L/SgH@jf@.g-KYVn1``^&`a[T-hD8!'JFHD_q-$Ti-aKIG4 %*eVR_C^kEgk8L4q-750H*g2D*KuN9PigMX)4s`Q.cS&2/N7pQ-iY#)f5t6*]8b8a82Zd-jm_L/4"%]Cg+1580OqQIU'dYQ6&48%g %O!mDie'c&8#FPp3nc0=WQ;QDR*lBYu`3+"=*)u;!bjdBUAlVH_C3aC"1FTjrOHc?(JU"q%>91MXc4CBgEMd3kT;4YLbT9keOTk`L %=\g$^?qT]V2%*4#k2R$r$^6s0YU8-`lc7(Z#K%bQn2h(sAaPGLZ[@XD:K/,qQ=YMHZQTcAR8t %%4s^[RhaSL/0pE(QX&$a%k"L^=hf`*YAo+p0H75qN/YVb/5?-`@@JRtg5II7djgmQ/36`67<_tP6!`SC3`'_tnmOm$)"L7'QE4pH %aq'MQBZOcRkB.:h*Em9kKC=aYF-\oC\.b`&H\Ctc.j4_,S2THq3U.m1)/1Vnu%,%4%H %AbOtbK5=)qYh5]#?j12Jg^^1fV?+V(NMrV+`m-C$HZB*)1Rs`2<'';P8br0pZsD)_TmD<.SrGuDL8(!a)&=ne#KTb!WrnWYNehVQ %:(Kia^j0&QhDt-\bHa8jM[FJ6Ao\9e&O]c>3ZZ2Z.\c1UC^B^[b;A4sVY5@ZENK14`F^6Af`VLBRu9>ZZ^QHp=Q^Us3/AXVrE`5M %\WqkOXn&gPIqa!R1e`Ac;798jYm3Q7q*?200sU]Jm5:MVE]Q_]Q`ea)EZK:)`-VA"5k/E`-c40o]RRFeLkgl;?4rO.b.(fb0YL]@0r<2:-NY%-<6o$<:&n4])1B]>i"1G0(!5YM\0WU,UOJC&Y %MM"'[BZI%l^r`U4!?Q#1MO[G%KnFeI %!`nM=Wm7H^q_-m+6>V&UQP&6tXP4/s&IU'%ZuNsl&/`?"JOhWN:Nq+bpu!sP-gZdt03#3uH:BoG`8$25RbfZC%!I%Y(+Jk)SV!s- %F&Z:dN[!Wh1+!81_`UfI]D"D&XV=rm0)0-i4WcC,!1=Z8Y`,C[1+eb@^,6>,BTpEogiFu>&;+r\'f,pt8P1a1Cd:p9f[b)$0+\%Y+ %J==90$BGR:"_KGuWttg;KaJbMP@EZT4?,fQ:,)D_b*k([#]hNS]SPIpRiO=FUk4f/"U3+I%%*4ajKa@L9!M(6X!k-K1V):C5!'/M^&(p?:-aWl98#AXL]+05`4&/m(%XFUi/!bilW^'^Q!d1 %/L\&0Os6_)'#Fi4W2O2^kt:N>[e`E4V$LVDY#qdIWtQK^&jf-+Mg@aLd(GS>71kZIn+cr;kWpO4\t^GjjC]HA_KT2=HIN=R?+jBk %aR!Vs%f""C(Edm:;_W9[?(O:iB>3UCUS3m29Ct(k6]g110?/V %PEKmKo(+,5n;OX\oU357AiYTC4OaKB=[#6R?KB5q@+@Y&+c\g:5m:5;r%q%0&sCVG^9YVn1GuM9"f@_&`@^A64X(+#n"Ru_bUk") %/2(p6_Ysqa$j5As3#0p"`W&&_0AW^VR$'5)eAGH[>GZX-cc?0P %e0;iJ:(`0ofg/R?R)F>X5[j!2h;&_)8)dL*#/KfT&4dS[X:]Ymr&A2_+?Pd#+S3tN&@(CT_i(b!oK&R>5R_#T#T1Rkm=:!B+^#)`K3-cSWT>X/ekUI+=L7gjXbVPE-377b"Un_BHk)g@c_PjH^"sVhqKe&3H$&hAt?eg!P %i].0oUYJ5q'@;;]FZ2.'n>),%_loaG<4D46\B,j.3)MT28dt)fI$t2E>tQejiGi&JCeXZ %8-$W3?m%L,YPl1P"5O5$36kG9\])+T)Ze?'=`2jWXO00610'&O,'iql(=lHg6'uZ!g"guhD6NZE*^PAJcEBOCZ4abpRd":U6.RH) %%ZO=76Gjl4_,s6ZA.[E\82-\"*c)'+,FI9umL,*!"aAanI&)LpEPI?m.nUp_P;4COUl>i4eq.T>j*rG[;.G %`i`\>1[LVhc=se>%*9HpR=]368>;nRtYd[0lt^t?kJPM)uA6b %-I5'N5p4no0JP+F6N!Y:L1hd:lQCMm79cu&S2#R=Tb5@#kO21B/k1]flURVV%'Pa9h>B%ka[V2VW?u!'5a,9&?ij@4UY_G9qQ>:!2dRaItMek %q]g&f)_6R(rUiOmh1=u[$"Gn**AlD/+34c1M/po3>4P)L/t7XnMVo^#HU7qjc*' %/s+7m0Eps:+F6c!X.QRJG,``/6HnNfGlcY//IOSH)EZfNp_(6PQS/Iig%8l1DH) %''hA*)>\SuP+hsIcEWB-2R\pX=P%`pHg3"O[X:i06M[-69X*XAUs^?[HSbkqkIc89juVt*VYVa#/RM_Rf8nlY!\=_"lkY]A:qCce*ns2"d*/VUAC(;ZF:;q)Q$[2fM9^Bb5sC!/VHANH2)lSZ1G\m,[i %f@(VZ05\NpNE]Y?gfD3n*'qq%3e6bFI;D`ToKD,I":]N!^rJKTA`o9+@>BSNJ=+=3;/Dg_Nidrob_k.B^MAp$nGQZt/5:I\HVcA* %2r/XsqmHsPF?@iDfD!H.m@upf8oinoNm_&XFu?g=?`<.(_;m(;`C9S+,:C-eRYG2mSNslWoWjR5TMc`[&*2qN%0PoW:<9Gi$+JAM>#DnW[9"_Mn%`FRW+7kl;>8Z+jAN:*]Z,F+A2_JO=Pp!!2TOS %T@$;*]b1d2c$\<:0Kk_<",2b;76<.%&]9>)liZ)#A;baNIK=I/=-$PFeAE.X/Ar_RSo9L=]#;.=3 %.A1%u.\Eta&aLE`rGr_9U8W/k-^.$0>]\i`^cj%cN:?<(4,@?MDBG'W=Hc/*pL>&jfZt>-TQ-1\ %U,$P"R3pgE)5<'FcI)^=AH7-[hGX4*I@%oe@41.muOF_?)^e"S0f-!:60QF&MK7#,) %+*bN*]ML/Xg7HN-!`NMjTiG01Y\J@:'e#!. %Qo^7@/O8BqKRc;SCUDWV"@4@!BPSh]@jjnHF0L:3B %K8ni)qo&S$F6]q:"aNQHQmSHMQ>m+?^H:(aV&iTs.KVX(Z%;,3Y)J+-ipA!!XMg*^Z^S2Ic<<:SgjT^qE(AZ]E<<:EmiEJukKBsk %f?Dn$^o>:F1m$q%l[XEP(oA`;JW.[(-Mb:'@U;X)KE->AE0iF6A@8)!ELDd$)GN_0<:pXPgI9Y5;8^"3Ha@(niE)a;9T]@rpFIWK3:.NKnl+tf#MJjU@Tk&9kSLHkG@[:_"k0Ogl'LYkZ*Mq6[;n1)N %eh=EUaKecj,YT+j&=$V!LfCd)2NWO!B*:hG+<#IN[:NXkF+lJ;2mc!T,)c)(%R&8b_/-2'@\+S<[^N8=P((NeSe7J:et5$?k5BO) %"gl_b-T.8DipSL-0aSd:=suX-CkJKP$)<+WX'1:E>f'gd(7IJnYgl %UkENLj?($ecId2(;KhjQ,P#iA_S!@iR)18f/*A9q(f\%t&okVe0sB-<`AX1Add9@W8eEH`-d=KcTjuJ#8=qDieC]T>Z5>;k#Dc&& %i_i2]Z+19d0]126BK+UsB!-,NB)SiMrpN;u)C\Jo*H5,%(WTHg$.9ZZSUj$4([`gU^9(;8kFOr,6,6F)Nog@A*BcHSe]a\tJ'd#; %(E"A\Y,uEe4b6UM3p83;nHeRuhmU3'NPb#!Z$oIQ8W`-B5Ni"_a0GcY)L3An,1it"pS-L.(Y,+qD!mtiU.Lr>ADU?3,(A25C>FGf %W`o]\Js(06E_n;7gGd_@H`AO)8#>4r[V$B&1,iEbc^BFu^1G*cKR8/tZA,,hj#YQ^V$8[V_UoGChW@ %!I?`g\DNTW+/)fHb=T!JOD()MV,G`V[Cu'?P!6\M=/)GsAS7R$l,:%s69EbmA!9i^n7_ASAAtlMbZ1&Di\TLSgGXns".Spu6,m5/ %^=2n"hbb-/>NHPPX3WEE(=I]CQI1n,]/H1u3inbS`&,l?,b-l7m=h(^.L;pSC"(3mB'7fR3q>7#8=AJD`GP?HK\,k;W9CW2)_>ZN\""!RBl1[]S:^67=]grf/(W*4*V3<$G<6ARugpgLHB)(^(9kM^\!E#oX`4-]s(QZgX

f7DKbBo;JPlG(f"5Sq[377q^E"`;tB!r&5QGA9LT_a0n]*3pIuiiE?B60g.c'nbCrS_>DM %j)K"G5la'!O:&<@$?)5pSJk3^H!5oSA6D!($OoF>JgGHtk]9KYS:VTTV1XA)U&JQ.V"=#j]taf=Y3l^=ctmg\51<2,\hIpS='I=j %cg&;X;/71o0JlRL#%[(ijNt^`JK=j&R,-V>W`P#u;+mU)J7/9"fJk'nW&mOLD*[[dE=to4RT"7M@J'%lB.\73I736JJ@MUSoH %$hP"7k[jMNCh;lh>7Lh`%7()(OBLMeTU<@OB/8ae^oT(pMFh;u@,IYW3L]J-M2$DmL^'e6qbW#1M$*>bC]b>rpfdl`FTD3^?JfJO %/-V"'+?@'[-s>e1(]N_LE1PjJYdL?'aS<2\3+:`o9-K@(+I1J:;J(2^-aBm=V<@L]J0Yp/q %`2FDF)-%qNM$OS!(4/Og'\]lZ150.eG)F0XCLUC_ %:8Epg0NsK:QAK@*$%SCm%T+`#fj.8AWq7O?>X\X:g42@^gcgN(L^mImg7/.E*GDi:@cip0@kajd4O%'tWc^!Wo2l6%#KbL0Rl*QWbP+DC\nSPY %etdtI#K]kR0,_CCM7lu:,R8)b?,*V%3Cu))'im:`aFn+SX-NsJWgP$H5Wa_#KYf`E$-MRU^+K#in?-JS0LW`;^.a34[2^H$"N6rE`i5ZX=2IgU;km*/<]S*DX?nmE %8$d:(JBMBodRci)S$WG/FOj#W/,.[#>@!')Ns;B5qb/IC"[CDfQdkjf$;@[eM`G*9Ua&YC\P"BhaD&]5"1YVrCi(#Ro@AelB3`JY %eUL=hT^p&XSAUG*T`^^ST:`2nGcc*2X-j)iX^i6K:SisOe4ahD>?Z`KVL.=0k&@25Y()A7B9_JQ#]6Gb.c[>=K9k#81bUBpp8!>_ %1m!>XHp9huG6*hIR1L01gTS'_%LdO3./S:]7iX%)b8+*lG+Oji'NVEP!XfWQq85r6k1,19I&T-"qk=olna_$!l8,Fa!!Zd[7kP-2 %ZkZCf\NmiY%N9.@^KUp`3/pRMTWA.T4q+I7J6%YErf1d7>,kl/3F09UKeddBikVFOTsA3*bF,sp-&NSi'mXQ6(X=*IM4U2/M@5Q- %:e@WUM9DU=:e>Y"FF^g"XaA?t<>,I^`YiR":7qh:1'[kC57r-t_sBS]>iBL6.Fj^r\1C5%LoT""F?*Ug@QiZqQM%rohq!tN-7%%B %L^lD(Eo/dM0Mi9phQX]r[33c?=.OB`(%plO^NrWbP[eka6'd8r/rX,S.c;_c]mU-4T3>%,SXP5u4s"OPcum\ndZeu]]1l00[FbP1 %C(rcp=i3.OJ995Rf-%%=k0Ah@TA-N$#20?]kYDP4M`@)r\9;i)#MU)C(CoL]V%)3o#:b`/Jbc`l?ql!n54.Q!9,_f89+cn-V%`$0 %oa9-dlMH-YJ0m,*FmoCPWml+W+K2$IBilAV\d*&kJe!Mneq&k8[SJ?^SjM$E[*B7a8p>sH(Isl4gi^t/,OOQ9Ph0i+h_CUP56ibZ %UH>,$jM;r#Xt:-^dJG!GXhb$T+1&D.Mf*LO_Ei3Xi")!QJT';78EaH4Y:m8LS:c8(C-iNT-]jbd%AEDN*NAu3Vb]r^/)XB)t %)mkr/62\I5i)q)QN,)C,;_:@XbKNHF4:LgfgO8CX"$P,f_)>I-7a2;,5,BA=!A:UjDVIG?kpn-4QjmsJBWR#&`f06QS6na*bFV?` %AdI,bl][?O!k\`2^@+*gU&buQ6-KQ!Z?on< %ESB`Lo%HM6S^[_tZd3i*0sn,C<,Lo+O6Wh7)#_r^0KVJ5RHYMpMA!pY-[lcOKIe.Bk@Sd#&29!(fSQu*bS_];=nk-EkliS[JQRPd %F.K\7;'b?j4eHcD9&'Y\=IS"@r1k:!q\UV5/n`0:'K#b7H``RfgXqj=[*qd)H27jtrF>-5[bKP6$G&PXFfQVjAFW+jV!hS#T!s>$19RC'G#J7DE %SW;HWlrJfMTGqrFfG'Q%lH"rmBW4=F(qLlgN-'4a>?N`KRrYLm#G'>XJ^.Z0 %33qCpN/XZ6/;o^s/Tl$Z^+:\X#4J[\/(c;Zm5DP3.!KGf:%+$'J'QNd[4Nt9^TBj>_;o"U6+^Q#K0;<0\3#];@hEE.*:^QMC`P?) %LGRM6blOq^3Ep+pLYB0c1dVLf79#i*U?T(5Y79hf&Bnb8[8jW!++_*`A4K`e<'&[_TG>(T2mNP=CkWJ.J[n5!kK8"q(<09!#9-N_ %^Md/fp,%A!6Oh]+'NKNqUJ_cg]D`\E_#!obb"9!X:ftM18iu_h:6L2GK-lEYZ0B9dhDY+i/%Aacs1UEuJm>"(YQC#u=T,'-Kj:![k\[H^49iP#0/Lkm[S"p/TV64C7JfO/f?;NqILe_a@'F'I'#4,`]MG.I:(X[kQ&PXtPMeF@)EfLI"OBjOAFhI>j %NGf1hVlj)KC\bF,@qaU+$_L<.]7@i_mUN[5?@$>kaZHkQYR+;NKR8d_]h<3@Z[8AqR87^ag)eGW8a;d4!&^/\]jm>Gp);^,_-6d[R*$f=TSNQn;UIHYT!r]-I;iDVUeaiN1"0R_\!dTT,6%bc"5IEsBt1@C6r'#-&OWlqM9\ %El'aHKu>!]j9)b0J#")Ihh1Ca_G%DXIs-t7Nq7=M?js.*[E1o4%a9%q:m^MFP;Sk7N?8S1"\Q:5XmGlA-sbTIHb*N&\4DI824s1- %ENb"=-iGN:")HiUB@^HYE-.jt+I5m@2$`R9jDAVb&U1jf*;FCt:q(6CmYGX_E),fcJ?sahP,VuCqZM)bZ29GY&FMTPfW]W-mSgVk %9oq*__Ljc&4d"o!Ssh9j5s6,n.a7h"E)kSSTd,&D9,#a:V0"F**X8t"JKWZ!"\Y2sA9)eLJhEo^?3hA%TPk/*KhFhoi[ZS@iBGTl %>t"FY=`t^ADfBl819)2gd/9EG[`iJK?VNS3M\BQ.6.K\,p\QmVFkg.aX\6N" %S>Q'(3X`2#RnuK*=dSGf?(p$)VBI %#N#ot5aSX+(?j2SeH-9\FSV5M5g_m`f+,,/!J>mY)m/d[cP5f;DN!h#D;1Ag7;N:h])1+m_R5aH#J)@/Ydnb`Ibj.JkWQ,q5t`6M %Fl;$Fa.Ap)>MC"KDi&);gY$/Cf.q71fO3d_nDp"#tM:Os;C<`47aIaj3 %<00#@m&3&Qh]kX.`T4Qkl%sZVBZ^GBD>O"(V:8F(HMq/lD%TRATZ$cR;BNJglTkgDj9mra]')??@='"X#arH3[VZ-fW/1tqTVq\@2ULGP4if2Aq8mqjf%.\iS_B__2XJoc%+m#pK+%[bdnhX`q&/[RWtT%V=cXG0$AE]LTsME^O](bHgRls$b:nGHhQ(=lU.lF@C`/Hifs^/E5@:i>u71RL/I4n1n*4%2VdpN2J8s(bO-$K4.F<5c?k-YZY^FdR)jB&f*HAj:q&6%3`+AndQpM8fOM%544W<6@>6.`:iV>:L?+GR(/0a@'Ic_rs=mJDgln:Ok+X)iIAQJKg9.IUdk5Zd` %44at./>Z%P%TGm_4##+3k=RItk`W'Tf4L&_4gp-"%*q,"Y!*YPq[PY`?P%ag\$9l+5idjf^ucWh*WWtr:%fU7Kh5_\fU_XBhD3Zl %Q#.sggbpVfieQlW/SC):,*SMoh9ru--6J=%TIh0m#J/gY!<]jt8XF@2jM^fHE\A32\pE43*_![kH4SS5T9aDnTVQnGFBkPe!&1t"-?%"'!8YR)VJT[kH[^d_KD1iE`?29PpJu+gqN1.P23O3 %UC.?O*ucej[KBe?!(3f!g\7`P!*f`]AJBluD`KgB2:q;-9T\Q_UAB1?6VUgB:"8M_aE#u&=11HcY%;d=e1KDbi-l!?.!N.)a?I&d %`!V.KE"c(;?+4"?KQq9J))Zap3*sK,B(23]b]>Es(#8Qo[QL+pPSm5IHZ^0R48mb>L>DqR-N]M5b43f/:['GA7E6+tDak6u2#?t-/ %9ClEIAd%gD>_&QlmAf4F!H>EoLl8f/FRYi<[0C"L>1Lk=%O6"r+tp!*/u*,2f]\NPqN_RX %1iEV&c-\_/CfYGYA`*-XXX0S*EdG/>Pu_bHkEC!:3EnC6]pn14CY8'P#OQF*?EO-mcU@+*6.3si?2Dg32Rt&eaQD+e38`:8A-6+o %/Di`-MPDCm.^kILRuP"-0HBdfK!a6oK`NlUS`ZG_fKs3PUu$X((Dm87\l)I1RHQG[U>qiL22d"IRI>L7nG %UW+g5a7=O$!`I,8pA?>+"GUIlOI(BaJDc,dq+`O;CTN3$_PoSu`Li7)a"#3=e.8ZK6s.(Qq,'q3Vc(1_ZtCA\4ss"K-65/i3#9"H1c\;[UcSX)KBR+@.?End%QeK:80Pf87/K1hTS>kGbEE$]V!92h5-? %=4-JCE3e!7>mHR)6,kgo&Wer7C1W3dp;M7&7.b:%?CflDS_'VU6)usG71[?F%XWgPjWG2[2r.>r %d.tB>2et;fE]4#ajk&C^RutR?a<9ZQ$2UWdp;_U*9t#3&<#fsd;b6L(dD/4M+,*9'Pib/"T9APrI>2bfjR9CB0D`uaBJk&GNF6:. %lV]!!%Ea2Lfmg67IG8WHS<%EmL^n;ITIH,h+(4!3J!K9:bXontddRi.%?nNK.@X@RM9p+;+]i#RKBlK>Hh3M!V(>1=*W1k %TS!GEXbP7++>X#+#0I(Z!]9Qi`1Y$qjb'jB3THP:[A74".%Nq;1n*:>s,Q/>Ht#h1Cp@I@`30=j*4pO^1H %4V/9.**j783JcCLeon=jg6)f.5k+FqW7--$?%K/"PgRe$XriUEcOrgI@hi.R*s'%bPD9=+]GE=,1Nl>V>4-NL"esZF;OZ;PZ5Q3: %AEBXU&M>.Tme^]L%`\*EVEHVn@C`.cXJ071ChAp=2pAj?7\j"V@;op)5V"]jQTJA7G-3@4@*4e`*Y5B1e+Tg-#jP!"NtV%DZW'M7 %lY=CVQiY#XP)LacZ,t.qj_<.X3@MQ!p_!aMN9]rQBH'BV8&J:UFQjR+a-Ti^B[P&+I(k_-?`Vlg38=BEpH7l:jj,$eDT/glDpA[S %mu\guW]7fW#JD-QT?u<#6P*tjYuJP[!j[&cf5$+M;@8ucn0KFY/_#hq-1W`noc:#6deJha)mcEqM_;)KHdJA1B98c\?E;pOTE,5R2"^pmAe]F>an3/OhPA[6#$MT-KpQ %R]bFVK%1W2+.K(q3TZb>o4h^tq&J0UN)@")aK?Et9hA.=4KLON<&f)gRG2>#P3@L<`ba3fCO?sJYa261kif(N8;_J?3AaOIU'9@G %j4T;FZ^lQQ6_R/$(i0O[\%/YYgY/Mb2eis\)e.F>Y\AmIDE7+TU<,DrqJG-@eC+kKe@^3$CW']_&t.iRa*UX*iG6f>rpOQZa`bA+ %&ObV^N#_-I[Q=)1[9X#;@LA_6V,+MXKI!EN,*Pcij,.'>:[<(rj)5M?kD'FjL9JG0udhWb;SqsFWkhpUr3Y;&7c.1]_;NPV_\0CnWZ\=o:l,!QR7SOLjVli>L"h_\RY&@1O0/*_bGPE:OArN+QECL3 %Z9.5$Q<&@O^I[JqN7Wh=3/uUT._hmjIaf_[X//QWJuMe@4Kn@LIBp55hb1guDED(i(Zt$$Zuq)K(kKDEH;Hf2)!.TMWgLT%5kgb- %Pitfg5u*WHbE18\,sukC6#j,5Fc\F^LrO"TU#jt%$kRI5Rd56;9IIUR3-\QAGu1qa$kji!,]sNH;om?e&8Y@R\pgVA16F^1"I"Es %`n/?$4e,C6r^!c.Q53cgfiSVUn>rUq2/'0I5tJq]B;@*bK"r7T+@232)BTG>MPSnsr4UYQ+UJ63(lQZ&CU0*@-94p"S;":dG#MMjflZQCta:tD37STG#& %4(k*FF)kE43Z,gJ#TRHa?s@cp?jcBabW.Rui3^:'4d\!$).?-/%/\K0nt"C?eW*XF`O`XI.hL79BV!@7c5@VaU%u*Hnk`Pub\'jC %&NI\,lkGf[p#PJ*#3NR9H]!'EoL[ %2FaTpD]YR^.Jm7<,+ur^mZ6:2K-eUM+ZFt#*aTa%oHp7Q\?gfeE/JWGA.+S19Z3`8ZDq2XCP'-BTN2]]RT9bU>7_mIBFogGC//Bj %[?%b/=Rt#:)r/S7b.3clR:2k[rjgi)(e#5IOM]8aHpS*.\\M`9FU9&BI0rif?l:Hhm\"B:=;Gt`:?^51a_"PLnk<0^3^re9_`c/dB3U@:4@eZmBKEd6V#&WCJ`gMkER:>FpNZ.b=e31@,&QB>%,=Pp_X.&G].%4ZX"_]T&?*n&;lf1G^djBc"I'YX1fuPUs,JuI8R/JI=ZYB2@8_r7`=O9ke"RT]j(/F> %!Ke@s4ERpUL?SS)#5HkK>>iW-BN7.Z.-'/&S@]#.\k&n]`nIXH6_m,p-(:9,EGEO9&FG(jK5klakTibKooIMt1JS:oNj^kH;#R88 %bS&EcOf>f1$d(rrVBr29]1b\"VEDXB5^[NT1Qc:B;ZOA1DOg8DIJIIF;/EPKP@mEV'AtJ*dJZCYA %[hWOWZtX\dQ_IZ>!-t'L%'[FQ:qd_8$nskSR^HuPD;-f&@[ZQ;aLjQPO=3iNGec!sJ--p2i*q]\M]-5aCM`tS#\qGH5a'X3_lW0@ %raY6tfO#JiFMm;S.m;DS*Ekkq(B0n`1N,#&BpBZt2mmaY7,l6r78=E0WG7.l0ngOn&X %-4i'3+L+opRtc]DiM^B1FX1Z5<)6'D5:1:tZc(eO3f#4OTa$6Z0Up*r/)r%Pf5`V-=VT0/S,joJ*RCa*]rMm@V>9:ut,mL-p+=GWr'V2!a %K]WAq0SCX84?P-.EOK2@[uaePbV[.fO,(-a@mjS;>=ilb\0tGAlUb7L9GGJV"L/]q';@f^Y\I]D:^H3tid0-oem>NMOfRVpg)X@E %?\;M5het6P:8DlXqNbi8c9a,PF\IeoB\VaMDZc?Q3%)uSl_@dFr=a!1VZ,0VD%X5D4(GQH^UaEfGEkIY==Y+biP^;BK?mXO(kmNP %kB,\#b6WiTKNQ\R((KA%0j*a`O7IAuLhcBHQiuCr!C$ep2gP]pDatle8$C.kl&SE$^M6El7H[\#P8.'c*S[].TY^ASZl-ckf7A_9 %>44YPgNM_:\+^J4VP9tsm2"Mm`V2Seb8HD,GmF*H5IWE: %c-5V#QZ:55EG)?YPmeVEI6S81,02O1\Y%?LW %VRUNo_@]G]j(sFWOV'iDX[;G(E7^8TRQKn%.f_XDmQPe)(b@P/KA.X151Y;[eDQiqmV@/^Y73%Ks17M=`aC[.V.@,``i.`R4%o57 %?n:X#GL/eeRsaN:Y:E)8rOR@iXk+WDHJnkM:Y%54nljFR8ti>h's/$j`sK8:\[Hso2?LXL_0h3sTlY!7m+YA15cnFPXZ9`/AR4fg %-iLU-f$@F"oe8P\CWegZT5p==M=*q]5e83`>>YR[rn9j&??B8UOhqkF@ruo`2E]2IJnko0)@f_][Q@X0#i)Xc@Kjo$@UT60F>Oo> %?UoI<3oTfOh$un,Xq%h:_h0P-7L.]&A+b7sE3Ru](1:s_%l!E:IOTsN:0OoW?WC)mPR1eZ7BrO'E]s2KNVc'S(Xnpu0Z9WC!NZ)# %$k%)i+>pYD5.9+RF6u68)>fLU.t$-W)]iO5IEh+D.!BE0$W!R_CL!:WQngDT0(;^1iLCsrE)$qL4L&+5:sA[SZD2_!Gfu-4Pcj>\ %YWh3g+uJ]jIFprmF9SK6`J+mIgW?\LV.cK.4m+ZRMc=)en)?`LXsp&%V7@)+hg-i9Ea\',qiEYdPfen5JoOL<'ipZW$DS6GS)%J' %ROre9m_dM*f-D.GHRm`_WnFZS*ANlu!*c[8'Lh"dJD=3c.FGhJno<8o#);UE/2?j"j4p7!e`gp]D'`,KXGlb.s_["i_J9 %CJ(GSjWu&W3o\s0s&%o!e=O#H`oALh&$K`Ik<\,u\1R!`2pf;Ao,q(JL/k'F"'?Zn,0/:6'>NZW7LPoh/$LE*/`q#ZcT>SB)k1O% %g,#aQ0V9lX=.Ir)mPP=j.HEuVZU>PIW'EYa(89!KC/ACo*4-)NU85774sB<0l@%Bg/n?l2=pa\++_.arfb9a2g-s\jDT>R@E%3;: %4$S]sgQ#krX>GpCEAj8ogEVSN=oo"S@Z^m94\>$+8J>u;bIMdMW;RA*5L-#PH@uJ$':/M8R!_%YD(X2ddtcAGg"-!n"QW3hp\C`n[OZ/1\l-7P;'sh@>d!$k<$\qmelseKAPg#En(GT>(b'3u=)emb)r%U`obr2_>cj+n#'4>s %nOPX_Ep&>*_`HC:$qpG1nNuT95-#F0W)o4)E:;T%K12_5@X9/9&4]uJA!)JMFSP"<+uUMR_t2_7"fsu-TD5os%THQ[UYjK.'Vc0. %)3Vl^iF%m/;LVmjW`MbKT=]c\I@"3c7B%[`^X#Gk)-TXePi4&1SDRfar^c%XZodO2CfrN-$VO?`+/F+VD)'Y4jp+:k;piQR3WS#< %FF]J&/p&8F@O-:4%;X="+'Rkp2ZhmfJgXaVBJP4*T]dVY*Sa(jE,i?E\-g?^;eRkJ/lN4:1?f&e-X.%<5-fDt/>NMT>R].d;ND[; %0Kn>W)seChMese;o$pTN1:TjsQEoS^FT?YAVh)egs,mNn]+C@joM0*dEiobI!>R">$OMe-C%0k7ne4R#V/r^klY'^+XHB&"@O`N. %WeG%fg>WSOZ^P4,ATKCS+aAT//B(7VO:eJMMr+8=\_p@B&t>B\eIlq;C`&,_%CNJFUDCc.VO1BT1[.$&/:eNu[KP*U<$#kJl=baF %lbX)qF7sP,Y4\\rGWKL'JBsU.e-'1_KTr2$6EoCq":tMgn^C&]&Bci3B_'O&nn33>_Ss[Nctk!]LSqbZnW]6!g9])$8TPt]#,8nc`0>S^VM"8G*]1@MBO5Z6 %'V\6/iAuLI@5if#Q0#ZlU/iaS(k/$`"8+2Q/P=$4b'A>&kRWJ06jif:W^6o&\6gT'g(kckR$>'!RYU9`X>@f!(Fq#1RAWUbTSF$? %Y`)H4;[\4!+V@XWP]uX]@r[@M&Z,;i3KLYgaWY>HVCq: %,]4&lXUrrq(FVl].o4qEGGCIf1kDs'BL_@PMtf?$U"rVl %a:hVuhYj`!8T:)I>E$)<[a[&oG1i1M^;74Z1c^VsE3L2P(1?5]6"pC#,s<[saf$gOFB50IT]:]9Vei8D5tF-ffHTNY8qZDPXP2-6 %HJU&/`=B$R*E)r0,JP3'.(\$me2:pdg#Te6>N4.(Zal5l6HrOB[eH9IYh,C1%l#N?-/7S4mD=r!1,_k?)_*5h@#/B&S0OnJH>q:\H@/k^8aoAJ-8egrQF1,hB!LPNQg %@dHmo=atYOrgDr1'tbD3(m%t[%.YZe3KrfH5:hFu %?WT.[:!ogA^Gr?"Yrh4/0#DL'X%qjC#@Bo,%td>Jd!!/N9Ej1?!,V:-aX/=pghjD<%7*UQ02no3QdeXM?YXCS7TCB_mR>"H"WaO00G9%fm?KX"W"`+1AcZa'e@7Sil171`7f_:)&BXGa9\>ZQ` %[RS__"uF'Ye'=O8@;HIM(3Q.:1"^>&A[G[,>3ei99Q1()m^WXa`8lK6N&)LIkH6F76rclPLu*$.HIKB=4[ES-#qK%XJEWmGKcQj`*).Vmml_^k.U^[E$1s&uE6KLDBcf-&U;WC!id!MBbsGJtXS0b`#// %hhd8tPN,bqW^p%7&6@;@9A1?1iCY3tOmQ+B+nd"0"2_q`$J`rnij=DMTbs2LTO_2,HY@+^OuiIRBY"9rn3oNN;eh9ZPh?_6I)_gW %84!ou!t-YqV8*;tq/MJ&p_p`Wo36!lPA"D*.)&/jEgWqA-Tu&f/es#UPO1]L/4T1%_3X$jkRs0-L1VrOBN]_s+jhJI(u(5;0Zj4! %EU!.L'on;%(mR/rguQP]!eHP9Zb4N-4/dejOOf`/3$tDOMqIreNfI">E+r`!GCil(%3V5d^iPF?L`5U);eVChCUk2&kZQVL.+,R. %a'_dS8m0GO4*"^pl@Y,6(RJHb?4pjK8neoaX2S4hdY:=GG9Nsq6#"caLpPcE>1HE-hfKj>IA5V'l7mXDfk5!<>HDu1MC(qQ(i %Xr=3J1I&I1*A+/8._!jP9R%eg.-$/ILo@eo5M[+E.s%*l2+4bGlf&$8ra4 %_PD'5g_:!odEs*11AeaInh_u;aLBt4/[9p5LF*h]WpEEuZ*,#_&:C2,B& %:gk&R+?$(!n7Y^@-ZrgK\AaTl=^8/8MkcC*>g2l:>n6EaRB;)Gnu(uMn2&p^+D[Ec/s;+HPslQ>T?8M8'KO_Q]5o7c5?'_pb]7P0 %'O:)nf=$70L$^`O>(UHiSN40DLTQSX#GU@%f7A]/#uI[bI1OC>i$:qof'[%S6[&!>PYXjTQ`B?>LTeoK)S2"*=HHB$c`NVJK!^,P4A[+d,@4PX+B"57*5J-HqEC]TO`"7YcEmV_0)*buL92)pAe<@lJ;aEVt)_u-:Ga'F_T%D4Os'p.UC;&OdX %FSI,?k]I83LqU\/0J8$p&&TpA@6KXANWQ(35K?a#+cMH.rP4F`7jp=S,Mg'Eka*+kPNe:)#78flHJMGtHnSZ%\lTmT?b5&jel_^Z %j[NheJrHp6E+_Q@S+c$?J9sK;6RoHW/K0ac.kPqdDgoH4FLF;].r/(+^qtcmU1<6l!:K;Z-0VZZ<3K`&NcT[P7e;`Xa%(*G4$UCJ %L.t`<#3.+RKS'D.g).`^XkgL%#S6 %pB->rM//jmaBQ*,2P%+rcUjdM^juB6)98=G4hJs71So'kTDRIt0OAOO[T@G&rK&E:"3X_D6VDY,8[mG>AYTYp+%'0:kQ-+;qQDQl %;hfW`7=K7jR=2X#Zt3q2(?QKaIg-bB>kB!O"21L&oRDWDBD9='?l\*9;/u@4(tF99eZijOl4lT)(K-GP9\Lg.B7D7hjDOhu)pO,< %7?rZ^Hd6UYO%H4PoXaQ1I\#s6dR;Ku8f4f4#Qd-;/'kOLgUI5_VeTTgVA?+Y/OrlO4\RkZr$cLV-%I*Am.%?VD'g75*^1]Fgik`0 %"n0[EqF@c7j(bq-\'b0bXHYFQE9*Dn?/S,:6(IDBT4u>Y=R7X6+\hs5KB0.k;->:4alMal3.%?j@13k4/8AQ&CP%>i&=R@>*d=5r %p'U5+[s29qZ9;]-OK!40`DTs^)L7t_=r[YYDf&Y#dU5#Mr<++JHM30QKS25L*62=7*Qdhdi0!(: %-5O2IS5GW]^P,D"ioq<\'1)BM!-^&G:F)27SimkMsR8ApH'?ugidZY')nTIZCM0JLn,8I(16*^Q8?Tbr6+mFF[*2lCT4]9 %4dB*C=)_:CN%;4,M97=niiQc1Po@doUf\[a$u+&JnT4L(S`I7OhV4(=r.:et?)bEr`#q0o,*egt=0oD,9fTT[M$]++Tille/o@rI %Vj>$`R1]5\m290)?P)_NFbT>uTfkHI4mJgu6Y/4RHUTm1;=$!36gT]h_-6hPcAP0o:=!F-3tO=aW&+^rf>sL;^_kdHb*.18N-N+J %XISi8\XjI/Q?LZ/A+q8?W@u03Ssjq=4P&RZZ&@U^;(6[!A`!:robul2)]5.:cMJhAb$Zoo8BR$I(c9g_cO\@c:%3obRHaNFTET47 %jr3r0lRi^n*V4r%#Nj)r[3/SA&M3@^i+7IkH[cRQ/;K,3S3*& %j=[^9Qu!ii8p-^u(:U@:E>p=;^+CSWe*_UZ.bjZiejE=[Rj$C;.s76pr2Gq'YI?tD@m#T>oumYZG2@9@7q`tm3&3(8&2)!sOmG;F %533iBl+_Y%e[qlM\2@RWpO(CJ@)`m%)eSm[2XI>s>XG.DkL_Nl!+kg9R0R9Z9C)k)>e7m58!:grB#]fIp,7 %ppaJhp09HQ*=Ps!(=lNs7EF[5a=N7Q<(mEPc_fLE!hFGC^mafPeh]`69a1]*K9hlZ/'b+/e9Wk)`L?#MHCZPK0@kE%Tn9rWGa[kE&=;'4eZT(Fi$9$1S(qg=>YR@=no?)EmFo5pui\(Rn(i+aqamIC/%K>+Xa>fqs]n>pB=ka0K8ZXSLW*2Z? %;"E!a)_I0phH[Gt:9oR*!kp>\1_uoZo/*%0T8?]ioD"2`U$@&j]bV`?mr\XNhRR)S`ooP`,PbuXKQU@q3E)WL*4:fM:cYsC./fjQ %J^Mg#&AU+>T9;:u*5d>b.\XD2mGg[seQMmIilSK%M_e0a2rR73mbA,KIW@1BLr[9?KT'k#K:@if,&GDTnZ[fiZak^ZXE_>Q/?"=A %&_Kc`/OW!@&!ChI!\>l'.XEcn][K5!OG@jNjBe!WN$;#3;'SP&2+:>A7F,<^;iA')Qs!j>RY/R?"K]F')$)aAm,gY+1oITa5kV;d %qpU^:'?-5Z/]lsQ@pl#d0;75r"lpI5YWb%_cTVl@0=c(Qg!2:78E;li-ETsf[I:c`]>+G6't(O4/tJRe"*5Mi1`0OlZKN,cg3R14 %08*WS#cs0Wq1TE"UJ8RA)OZ*o(>NB%26M@P'66#IbkH:'a+&KM??C^`#d\nZM&hhL&3N'rV_!BC4LQ %p\BPoUq(aiIg2[1_^o(uMsCG&p]ro<#=jl.[3]=<9Ip51'*.)S>2kQbD/#L6?"&]XP>;1?4Wo.5A_\%Y@OUDLqSuV`U'm%&^/Z#$tE!7#h(f\^l>eF!t=u3nr,U@)ghQj %RZa:D&Q^tjRs5Y4?(0=Yp[5*;6T0Q@5fEe2ECZ8hF*aPLEE8XAL80WeJ^^uHHfojU^TY1k;Q5i`Gc'Fj)IDrPr2^T9G-I1qKj<("%s#) %pe;(pE4_\(&I"L5\TP(95?+Z!A?8@o.iKL<6l5j;,jJ2-_5*O`M(/'U8&>YO.Ln4r>Ik6\"@+Er/^NF#H!i"d$0iiq%H[f6G07b: %T$QTG@4di21\Q2mTG<$Ofi\h$\oEg4=dI!7V:brb?]g_>&^r/aehW-lNXDDE=bO3M>s4;$`/*0TralXNWY*-C`HZ3T@FHam)/g7*S:m9nM5tgnO*&*Nq-Hn<3E)pL">5^qsGS\%Orrbrsa+\_Oqu+c# %6/7?OG6f<3*[pC<`SZ[a)EkB8Q[=$MD3J/*)XRZYs]=*][iOj2"0Of*`)i8+f@m2$?2Uida2uZcd6>Z0D[s8."?!Ng7VC];2+RjAXuaM+h'7Q0]RBdcEPub.b&FZM:!cr/2&<[ %_R>Y%(S7kr+:EKg[i2`GKbojpSoeVI#FTCir"i?BE.iKCBEAHO,ZB;e&?pdYmrZlM1^,=`;TgNQY%GBK7n+=j^B$@KVpt5Mpo<;Y %'[i1^l+0O!P>4M)kJ@tV49[MhYs9<2V\<5g"=+;X]m#AcfJTt:oh2KoHjoiXR,B=pq"k!( %/M:eOj[Rs%K?i:%)TXtHns0Hp2DrKU[!IGH$D(L0ZHW@HOPdVf]O9WD9nur1XNS>O$YHT8#]"ROW&t1:m6g^!=fn4&**W,LAX]]eeGU(daM=pTk9t$3Ic_-rb %%43P==hTe"/[W8QCBEBL;kfh-/@H&kTmb3ZeNCU+Kk*6\Ee8j"-B*kY0IVQs44iX*QB[(MLYJdg8=d2BH/bEqk]m9^XE,Zh:0]HC %UEjlcDqe#?;MUo]ipEP3.l\ri^eY4qOAXuTUF4b:aVOCUkkS7d+!Za(CgCe-eUoXds3ZIi%"`Z87I=FcV$@dA43o+9!dM66d(bQ\ %(AtcRgq`3%L9E@]?>uc$F:dS.Q$QEGmbS`4b8oAi"Ob*I+E+63?P!3hWnt0LO]nFM^e1^MgE<0)SY'.mY8'p/s\/ljYBE!ScD9MZg;QC%Oh4fFMSN%VgIP6>$_5>-i %KQ3TbgEJ4:_"B)k$]/"O[j5go?rW2Q-VSAY(qM+i\K!2Ae]HYqaolm_T?DMQ1[_E$WB,X5, %P?AAbQQKtU'h=.s8GanteHA$+6I[^cmC])a=R_>)?1@UH&hqc]l7ADn1nljGW)E^@#fnR*=b>_kR43/pO[S\SOSeBM#fgh"R8teX %=/ei(#2F:SU+JOghgtCcOe%^T!j(\27Vaj?)l2kiSlu/]0[9.4$>*P>86mFr-,:a7G0NK@Z"iTq8T08P:o"jT4XbR"8dP!l#1gsY %a;uI?\@8SqaX\JF@=3c\V(JN%E0*Zm_pFA#!Y\H6Vc.oWLWpF#hRb)l8m79.?tF5Wnadl"V?qJT]%!pE&S?c_\NM,Zr15\dgjDNZ %bKNfqKKZ9B//0;AI1$rN-$*0-I"J+a*nJ-*m?o)D:bYfDmtCd1pVco$KjD1.FiEAUAUNqKd]Zk#n-rVXmERnDA3sQ:Q?6>-K5X<4 %(%F^u^_Q!1$:%E:i=Qb)"]j?Jc%p?*B\Sq$._Z#`;)&7^Dt(Y'W<-*2QHU=bnCtDB?GdV-]aUXB/Pr5YfQqLD5tE9)RkmFHD9b(h %gL2O7NO#**&K?d=[7a:-:sL)P)uZ"@k#U=,fZ%'!LPP!_1&&pfW8MGFp8U[\Z._A,"q1tmUI[I<;C/C-M?I/M%hhb94X)oT-*%)0 %TN@MA]kh;6KrGGOe4&e?"!b#%p2fX3VN6hPb9Os>TE^+`^pdg@NSX-5jaMZTEeUNHCRKcK6fa`=,RQD*r2VXA,8LBni2$#?$0ouJ %>O\A&Tujj.I2m3[,/V4""N]**@?'9;N1.kNG7l-_?/XOlX2Vm4[L[+5A.RD%(eG:AYH56"]1!pJ\n`OE_N^ENIiWti"6!%#6TTKAZJ$qW?<.dQ!\6f?.kGa"k-?4AL6+!HCJe:sji44u%%Z6!)8ed6p %6`]GooH/K;d?X?4WE3fC!<+kJG%J&4]rYb5.&C.EK"QS\fM92dIYYQFkSH=\Cm;d\TK`2nT'O/fUo0#G/tAmji;B,X+?I9smdmL* %7%bdu1:M0\9P4=j8\l"CKWSf4R:LgPZ&co1%D%i2YQ/i8@raD2Hl`]Y9]a(2?3ZGIF?l %ohk?bCY*S8UQ@E]lYTHR1t-uki3V!iXZ2TbjIouI6-5\^*j)\IUIt\B`ptXm"EBVXV#cMU:[msE!)5k>Oj;fb[kZ!mYZ/]2P0A6Z(UeI?p^>\3+4:]r26%+RDGdb4K(!<;i+[Y*AE4o"lchXY(ajIB/dBPU8aC2;!I %'3Q/Z<6W5H'3siYI$V'0bKjV1rYdhY[_IPlU%PTtIC@]GMgC1j]SW;p]a6+AI-\``9H[WVpTH;H\^lB7V$@14*kZ3f %".<&&-(lPK6lb7PbE-9cmoA9X"baTR7Mo,&\eH)#gNS7A0*:>K8f^u]1pX$O;7rkYPNn_WogQpI(AgbED %0cA\c>Zd_%#@"n0%=V.Uk01fqD[:;Y6[Ds3Ql1"Ag2KfA#MIAEl!N309S81161mT]d)&sZm*OWtA>`6\A"-Gn]MC.\X)52XDT.:L %!>1Cq!q9u-6*2`T2Q4Ea\3ueHX]@;]@Ome@HQZ]KF<88eKh$g$EZPpR9Y:j]S]8F!8U$KFUumUAW.?t(L=1$c;JnQ-fs,^Fnkh7*"@p4.l\[M/h-I2YTRCah+r,Se %s6#;?-$:9%m0G=6-_pg+1\NP1Qh,:V'P6)aoC$^h_X_O?L+2Ro0FF %T^V2bHe3PaBlH/3hri$>3C$3hVoDbl%%]rU"_cd1VHgMDWR]EEgujTGD7#`?;Rnmio'k`BOgYUoe5T3?/5TFO&@(p'k.$d-@?@fW5Opk"@u^`;)aAoq?5R %frY>GW6^MW\$je9#(<9GH4ds[[lmDM:V\#HOB9!Q^^)oYm+:-C"b*`M'aebaJYhP*[l,Z[UbXs_%!2q@5[uLS5ja'uT-*ZCs67E; %chuN3l$86>%NC')ESnt2O4Aj59ojcY+.eIGsjiY#Ar2r"bt*NTe[ZW]TK]='pT4rcF$*MZV6C7d!DfG'/51ZgFiO3W!%Bn %bup)t\SDF0Eps.#!?MZbD;^:.L+pOt>6&Q(6JlPIZCROUc_?M`gNZC08`%7?3k)\Hf+.R::'s8KX&IEk^du*Dnq6`98a7Ek\mdYWRCp*= %8QcMXUWSMVN\KM@_k?`H%Enn#k#L5'cS^h8_EG,E/=AMss$OT=O)S]STuZXLiA4)rH"?C[TAZ=*^HI[FB*65%[Pb_=Pm]VopZg%7 %nuHP@#3@n\@-!!s;jM?B?Ls,T"fXopoI_P(m%eY>qRWjH(`QPr1bXfg1J54efXK(mE9]K31Eq"1GI5&&7rR=V4s(/s]aq>B:-lV[ %i(hQhYie'WcM2_"nUplZ2]P"2pbg1u46`Rr%L+nDi,T4UJHBH1a)7kR=F)$]SO'OpSN+dgE(2Ei#A>*fL^l(34_bbs,.; %4YC2V<jN,?k3s`I5%t>[sAk0]Vn&=I7IN#sfsXg8>inK+KN,k%SQm.9"uWWRMC2QpXM]5578FB@VT4h3qDGV9ff>RXT^M2/a^\Q'c*P[XSi8h %^a`l-j<+!/WYNHL)Zr0cYf"7%oedS6VR$h^-VGKPP&r4T*cf^2n^()Rn1/B[$;4IU-tZBY.[6r!WK,MXj(DQ#*e %1eJrk.@]Do`b)]n$@")/BWDOGMp%V:6uHULHYp9&@h3a%m\!r-"gDK:>g@q.U(3*q6@ha5AKc,g[MTepWq+kf%I.+!6&oe:g]s7; %;Bt[%`R(KbA4NnMH*[u%3EnW$/`OT3]_.+M\AcZGIO;er(@/e&1)\Xg,\pA\@O,+nN2[h?G:li$)aV5_IIRc@q?5dI@C`qMX9$KG %K,fIm0pi##,46%^T;,H64)cHG7c;3JZsuah %C16^31B:D85^@BG8!d=2+4qBZ]cQD62'K/6,J3>cQ9):6bML%1Tt.L=O$3JG\HIq(a0X>A6i8qFp#QPbpJbLP=)oS.$Wu%rC/d8F %n6T,SaclgB`Dr2SEbM0uR0?hC_7PtI%Pr\C!4.N1WT,="f9C"c'V\V0[jJ.Ub6?jKI=@+56u?FlJt"*?>gLNs?[@mb$T9RclAB]q %[DM813AOIW#)'7IjDhOHXDH(#.1SBb.dJ4t/)28t82rli"7-Gj\p\5@q'$U,\su_GB">ucbk7.PL+$b$W[lpZE>,^XCKUNe;@?`4 %4-D6*_mr3.WqcP4Y@umYYRjq_ouZ.4SX3A%)-n,$4Y:FQ84S'6I3jPO9j(fJoM]'M&('Ga,o,eLYj%:c.R9ruX?I[Jf$'+_URs1@ %^fmKDCEV1e6&ksqmb0fM38+6kNed#d@CCO?:;X:g9pHK##Qh-&BWEl*?^N>%HGZUfCQHHYBLoqBp;AM)$*\%nP]QF9o( %#BM*WdS($dD6]L%7;i47,l!?[UQGV_k@H8T`%C?Zlq%Cn9l`J;o.Z!KK,1nC+jo`=/pE4_Z>9%qZ %A`P@J+=-6jGO:)Ai-]>8l* %`/L%gQr--07196Z/5bJE]a%KMSS_(8K==lC]KHAZE'A1_N8c"(2J2EO7,-`]2FN,AYf_>s'=k2PkV %36ZI\1K5nJX^c$GK#o51"`s3]hi#9,68RI7V-M2Oh0@.iDo(.;i'7kg0=rbDG"l2!Nm(*I6j9[VcB1VJK8UN6W#Fkkr'BRa@$(cW %+J'"dZM8,02'6o@A&H0![TgcaW4m[0@F:I27k-GQ#0Dfm9?tGB?#@S$8c+gdGBGA^oaqAWZ3-M"Zt3!YG&%2. %<9#utF87k.J]&EIJS=FI"3G-qQ(K..>LWZG>cO&lhP_M1VK=RaMLa,+:@_tRQ.sQ5fV;%r3NAUO)l\nN\dm/s7@)T7EKaT4;W.ZO %3?5(]D>^Djm?p@G41CWfcau+-2065_qiA+IF)lg,rI&$A^J#pqn<>c(A_U*:FmORUDDD)[!P%p84_EeM)`L8[QTb'u2XpVH4G'OV %.sOac==[:PoDmJGm6TUN]8j"4.Mh[a!nO+HIX[5c.fq[aU*A23[W?k`FDMh6cYs0Zc>SW!$8hgP4UXI>@CYQD&>e;(+g)(^*?]:8 %$C8[8rG]7qhclqiQHD\95]s,58eO(Majc2BC%nIF^s[OYPIEHX\6;@7g!0t)/m6rG(*:7-[utk!=N1e/BeJI9pfT[EDN_SH["D+> %hp>:ZMMS;YSTAEcaS=g]iQ]El?.MAFFV8:gDZfU$;pa\U"Y^^?b=K[1Fc.g???@t6XLOG,OiePnKo<]CgEt6U#ENoB*iL^Z0_Wa9 %8*e55<&s,8V+1D!B?1/-,[fhU1W^0DfBM33`'RQ#Rs6EH3Uk7kG6:,XCWsX3O(tl%kMVpl7jdWU`Z?OaC(La+p$o\$FK7Q]dd1E> %KQ0TX+J&5ZKC6o!qF/pEPEo+S4(6]>L$)jg!7_r+8DQlAbc!!/\Jh:+W?*>DVtP8"j>H1h*CMhnQe_]VBijGOoG!7%>Km.\4?_B/CV#fksu%giLg]ftf9=jH[Y\n.^SBRI/V\n:;-b]gF0_"/.QoiLohF77,Ru&^hP4RcV2bt;; %=LVRfgl2ZTmqEIiB0r(MC6$Gn'YoaR`Gh4!);C1E+6M>eYgZel:3b&p/_e;GD+6*\bP5HW'Di-q&N"aqf!T$fl'a^9),=hT)1K?] %/Fk7OD0*RqVurQ,gH6h(Q#m.uhn7Q'4sGKp_>=5MmYSN((2B9R=GujbFs^k[Md&I8c?rBP&OQ^,p^Hor!kP5ChN\-d+Kl6*K(HR6i"khs'JLc=G%38hS,YO$;1im#YQ_e!_l1mni4L]gG$Ro3aOm3mEZT4D(n8f.S-cV) %CjFIeW1"MobnM"m0fI-f+_>I,heM347/k%BloR:Z/!2X=])C)j2iL&n&[n^Zj'ND/+`"1u.lY8&VJ4kQ@2`OX^+bV6P9Z:OI4"4G %7Si:9;:V3-169^7[Q$r9K_^97g=mh.:K@O/kLZpPAC>o/7ZGXqfn66bk4"@\eWW\sF+q4DG]J+CVRN6?TuY.e`%V+:;jm=-GG@X=_PS=1:l=&8o4gUQmpM/I.R2e3F1!!Y@qqp>U+YBoV %Qj0/V+h9&4l;:@._!0naEtpU*\nsnA/7!@)L99N+3.*mtms;B),DRCM`o^Iks3)c6i,t2/g-H(u63/e2BR%i3S1Z@\e94gVb[R39 %#!;?GieasC'#6O%*luN6+aub.QQ0h2fj_mpa7^^B!jHH;^lF2P)*;b7NsdD#HY(f6$VsbeJ$TC,6It3!p6=BkD%Y"FHJlu9!nc6g %_O$Z/TBXl3>[:skAF/&bUl$^gcb=KAJcG--YO*,Tq"aH#cM>HU]>Gb:R+Lm-cQ!_4T.3J$!m..8EnX^b\]mi@XTD& %j/-DNk']aULnf@GL&06#c*,p6Z2%/hn*+q-ke!/LYW[L%55jH^;3\e)'*u\^j.YM7GECHP2gMQ8jN3[>'^1ACaa&hgYiX#B'O=gZ/$W^!F, %)dpVN\:k!;)DfP0ej]M;T3#L:WmcQ:`ub$K4u[hID4*cVFSu\C^1l72#lb@T*Xi,*(?XbW,-sYJhR""r1?+UQALSKE[gCEDB\4DoSR`-tmkPOQ4Pm5iY"_?CX""S9,"tHoYND^5()5bMgJ4(HU %H#7:N#BbOJn,`dXTP7ef?.@`Vg22-?PeUN7)@76okhDtQ_=I?DWE*@uNlh-pZ3@7\9"$u&mFhUl*%!%57]:E_=oJ;uh@C`DQtp!F %%Q![PFc/BoFTc(Z5Xi*f!O7+Fh8i9NEfi434^qhh&?pKfO8Q\Hdmqk=e"GaF9m:&2MEM@KhOQc8K9gs,0Z4'AIIr)mJ;7+K)ot`) %_7kX]&2=]XN-ajJjc#2bF*N@9m5k!%K=`O36Ji2;N,7SuRMXo5>Ur;"#r>hKncMk]Hfk`.63qRM`q %\uGZ[cmZ(d*])mc(aWL3J:ii^*!NQRAO=PQ;$-@]bDNK0hf^FeNZ,#.%BO-f"W4lnjPU9$Kl)0.M+YMAg^@>r61&V([]++"P-T8@ %(,8\;U=PY,H%otq[ai6`rPj@f4-;0T0/82)mA0/Y/agTmpr!a/R?koE(^E0Z42!5YS$^7SRI_0t:26R%#Sh<]TTi:HhSp2;R.[C9 %*G2ehFe+Y=?5$Y>oAc9(0kPp<]78n(H>n9r+2`DqIkRSr1a*!Z9.NO5_!q %BVYllXH]f]%VClia$=)Gm@)d[R(R&CpD:brTJ;$39?L4oQip0"i`Lp_&[]S/][OV8oljG->o9<,iS;XTqtb!"hcIfHB\RW+GTOtM %X9,[4aSB6?>eC,u&jGZ;L.Yce__a?5e#V-ZW1jO&ei$>WKd!nfGQ4Aegn'&jar^eOpSA^\.fL*q58@O9?15S736ZQVDH:,*/q2n %s6%GpgOK'5_7.WGrY$t%RM88e;qnX1RFH#TNsu2]d4cUR]:[/g7NdA>^>a*+l4+>QNN2ORhIe.166!=KA&_WFY&q%a(oPQ1es;W7 %_X$=QOl_;J@",XAj?::7_5m,-B-c^n=`2kki5gVa,lblA5crd6%i2H)fbbndHHH(l8aWZa06>(KI,Xfse^E38hVdYb^*)J6AhBlP %?%c1+"#-QVUh]GGPmQW-%u57,B]BJ:Z:=(WeM2a[]FHQ3Q*n(IX]4)&2>>KGUZ`V=iQ-e9hTYmg>Ekt!Xc#W2a\C'f?5S!-@ioOIFl[3%G`0` %EZh4Xqa["-g4El">,!M-#\I9>2ZcU4PZP*:hfUmXqYkUF6p/d$*a*tMUH2Rs)/55k+!2^Y]k,5&=P]u59chm"/u=$gakQHDn01"q %AL^7^'U73DC,0YLGY9'\@c6OLC8oj+!ahZVj]TiIio+,qAQT(G!h!d=9N,^&SYUCn0%`H%:gc%5r!1ree:7LCgP<&C$.aH3l&W$[ %jo*qWV40OU#W^aXlZaB^XS)_M%D`[W)J=k#f'V#BYtaRV6)R+[!1Z03N)Ti*`ZE=tSJ+lP11K6&Mf4Z5?'hPd%N@rYcTt+)7ukbJ@LZVQ1g( %"t5Y5%_=H90_V)b2#-ak*s[#ndiV_ccpW#Dlu_g&#-q_=a,Z_\Nr@_(l3cHd"%6#(r&.:uGd!t2'jc_/4OgK?n5X?$`>ZgYH\ks6 %HB>4%C2J9OB]TlI('FE0_1_\[9/u1Y!XrnL+A5?3_\u"a\r;4tnBNL,!meMQaKF44LmMpG;&+s<4AS9_WqqPnfV2(d+Y)I@`1Qc, %.2CW4?QUNZ9)c"[lY(KKl8!WXl*%='J<+Ac1('ij-E35ET4!0IqWPMjOM]T$2NVG'"QVk6*+%b+m*hf.`\c5n!VF%B!:d,92o=tS %q$u2d)H.YJ%m6VQ;$Lep0Kg9VLH4,D(:\r8Uk-X)-50Wc>`PM03PG;?jHn9Gc0N5N&4=W@;b\oE=ShI[QnJTq!N8*6G"^,oDnmpT %WHXHff?]N/==27=N)R@'FRN=5Lo)S,"2kMFi2P8E[j]EuY>>DskE[upW*d%.jc%%+LYE)NX\T?]#oJEtA5CqfpB&(#Ii(-!I#-,c@%#iB9Xr,]Pqa7uR %PU5/S/c:%5,\.[a%HR*]Nll?IOp##>'i;^m)9LW89beMaOfk0PBe(o7_u9C9IV29:%\F0F2uPCs;(?D_?6YpQjJ:]:OLDR]e`Bdh %]gh?qdh6lYT-%QY;Bj3+DBRP]?A_C:m!ZYn3pn8AW?.Gij@GbUp4.,JJR8&XV;1B:Y/BW_IKtaAT`eVcs&6oTYq2+WV[:FS6JEuW %4]&B"\Gf&blP;u+()%0%H[Aa0=)L&>Uj]5-D,>I+>7ccXbs9354JGO)mQ+AZ&o\5B@S@ar9Dr8bDEUYXS[^aKS!O"eRNT+NjS'%Hpd/(>?L25@6BJYTGl)\huSY-IQ>LhJRqp!:R %V>'YgEcRq"=f23;[e@0-.A1Ml'QA_"J%22QM7^3r#1fs<"_,JW.8%PN[uHOYIG$pKE4]\jqJaV^PlU=;%N>#&oX_UPA[lNq?q2,? %FS`ZbbR\%"9 %+6n#bOW`b@'(rBDkX6d5E#BK*+WrYeMI@1sZ'Zo4BZAA^:9q8$@Z,r3s21UTm];+>2iL15:(Ns#1@YA5eh8e^'Ju4[e6;7uiABEB?BMsVR9`a#lg?R[N072(3Y/0qV\QtLmGqW<@2$_kde5q`eeQ6E,6;1O8LP&]JmTU%0*VHUsZ"(/Ob%GN55IoKF)k7kI %K"b+^oeJAGR9O%"Jc&tl.VlXTrR%qDXfN#^_5n9G`sU,(3.QU>:i0dcA]W>`B2os\e[!K3GNYtgrnS/kkGKBOKr%YKpu9Jo<+5$k %;e-^SFf"k]#2N*Wq>$bcLpDZSHAPOuBV_d_.85Y[#\[VF:r:>V!g4/m)g1I`&$i9FJ(P^>)/%L&M@J^MY^rN';DfG?&.DdfWg,'3 %#*=q!0?mSJ=UWNUU4RYj<)B`TWAU`6Sj$nskYr;=G&u#nRArIX,"VP't@5&f=D#:=sTF+D,!9em1lNTsf9#Se:Q%SJ@rhA0Z=J$drH5^l/qF(:1XDbe4Y %73^h(!_BNlR2T-%S/*#eCj%3UuH5V=eHeKcD85UlVuMijWo!g$R'if>>*ku%m>*iNTqB($+C8T&"cGfG.5ai`5.&@>MC"J-:]qg:b5]d%a[)Lio@YU^*9TR*i5WiFs:D4Cd"3Xq%Y94?S:]qJ7?CE3"$VL=A %kbepDE.'Gi18i]KWC'Rm+tXcs+XA6l)XP1]fB'**Q@G$K&nU$Q8:,@.`72`QKK*Q!e^7XU3I"b*mD5 %<0Na*UpB!j3m&@7T9r=+#4bUkBl&I);idF560XS:Z/&DZrZ67)<\^/kc_Qj"S1RGQ\S\\Y@>AR3/hE2r)Tl]j8[Mp>O+Wj#D[[qt %DN4cbAc2HCgZDA*RjJ:Ip,UYaX0(T`\J_k;CR7%Z2=Kh] %'!q[l"^:?J9`QisdKA]lj"!C4r&(#1U=#;;n."Sc39=&sYVJd/Pp:Nj*[MbjaVBJl:$nt7;B[\fN,&?!h+gQSTjbh5\_@U?&&qPH %mU*m#ceke,cp\lX1[TfTSaYM2C/(B,ZKVXd$k@.W:u3LsL>)GC;ni2iM<*r!o4:P6A6B/)"4Y-ocL4r;Goi1_:s3eLW;kZ79Bcb+N?cXq]ephgC24(2L)12\nr$[VnIBqir*>D1@"nI:29Ih#>HAQ:gYUYJnkXgbm#AVc]3fWV^?J5O:&fpQMY/\d2ln_:n\[d<;'-J=%mi]#h?k=J&c_Oa_eu %fLXh+:5\Si-?DUAR;<&<6^RqbCWUmJ4'Q&mf'@X-,9T/"g/8p^.Q?2C]"6@oY'YoueTH4P!n]F0hgH`30usuaq?gAM;5Ile7eYaR %!`77+n0fDd6!JZN61c:FAL\`l.U?)*L(N!NR[Fl*e@&NZZ:cL"DQsEMb:B58Aq,O1g5_N'TWe5^5ThWcFCDUB_@T$@u5eO^ejOfWSTH3/qnCU$V5%Donq051?)KgB\=G<4f`!:G6nJ1EgqX!V^rCbc'5%ibq4&m=$;Gd0NGUs %UKsbsR`6+[=kIi`"#ah>'Um$bm8<]g[I[kEf,%.oS.:CgI>t3CA`U1^"^XEN.$6ME\m\3>R'1':WjPGbq1(K3e;0sWK!@nZ,u+Tn %DDMBjK;gZY(gpak.9&?Pc*mJ)3nW[#l#;*id_iQOV7o)f8i=oX#>["ZIdk"-kVNq7(7hXSEU%CL5Yt9?pi777Me:Z.j@Yku%WCul %BhePOW@N*&HIXEoD<:Jpi5lA6Jk%j)9=*C/0&*SPqjE,8ASp+[6T&YKVnHY+Zb0/g7S\TQ'u_hWB6@4RuO %U>$EoWC19_T``W=1Cc.aq];!&,KN3'@T3C'"a;(OIh,4.k40nf7rfB3kE,g0iK-H8QjQCIjhAcu$kU-KJeV%#^-_\.T,n9s.X\7E %%+;hm!\ur)?_Q8i!#b8+a*)B*i/.S1%GZuEJd+hbp,64B*JA4!+Q9"4J_.5T7XC&l2;lQ*TmZjHFCV'miC='>KUNYdqX\KRt-7 %OO7,M6pf*"SlOMnP@k_@nacqXekLgPBI#_]_0FjpU6E$N*;3Vu\"+Z5^^q[Z#m!^CW^B5/QBe_+A_(a<`h6>?;?O`M5`e-:>DYWr %WT>gqpO[_ap!JOa64muEOiGqcDW`jW3'>R\NqB`Z4i$:0R`k.6R,&mUS,@\DU]YEfT* %n@hSHaX\kC1.+AMKpM'+qH@-1#-KFfZ+Y\^\fEP-i^0M]dPD\a(2a"DRSG2kK`HhC@:\;FSZkj4"0I44Ooi(' %;t?CXUC+3#";r%VGZtY_LXS:qFP.IHKP@lAmPrr??bo?LF"o;4I8,Yc>?HK\Q=97+h8,_b/u(8!]a%ckOMY^!86]K@Rja)'CDn7& %?fMI_o:oI@e@:WA::\3=H**Q@dV>Ygo`F4Z?A8cC2=GLm/YcALBuF]:rA%*S[^9nICs2*Mo!2K-(c5s5T<(je#QNa5=+3L\4 %g=!&H7Yq1d&KBNo]ZpCOLNXKLXu6;pmnmR^JKd@q,muiYlUh]1/gF9;#h3bLg,6,E7*r9<4>7_gM(5N=8BJtr- %c0S$j0!QE+AA#u!*7J9!i\9A&/*cB)fEbTV)(UieH?3PcJ_D&D)!'7l&8Cq+f&oPAgIsd:i9i`n^*.jmC.Lqtosuoaos+R3aa2^- %VC[)uk%E+W-5N*I3+;t="'qD(ouUcoI08&jEFU$neGMoX?WdlR!F$)Wb*Ygi5oMhRku$#+XbO:V\O\#gWg5I-!aL!*V:rZ,0[:*` %dO7p`B':q3)&/TDTWWnb.G!n/a0a=J9Y5ISeJ4>,+[)",gg-6=9X`>Y:,8r_D4_%03gK<6Y&9%23)b87;,'Y9BRU@>(6Srrr]p"8 %Q0XQ-Hmr&^:G(Cm"fGj6_=W;FDV+gJrm7+eF"Cq*6iji].f0#NZ@D?tQ\Pfpj$D0[FnO/4d=H2Y=;25u&Pqs1#"XM#D; %:;t+ei,VP:s!5_;+\7W/*NOne`,/>3=NKR*k#gYE=EN+@@%P]@KCW#qj'(OkRC-@Y76o\.d4O4i$O4e_hR+;);Nn!TgU;%:iDI8) %_ZJ3>Y-Ds];0[$DPs%SU5ZUVD,E"#o3f$ZZ7P8qC+c'u9eBhgjIq]G'4B#IEj#:)45<\4ZhbEGJe:H/=0c@n54_DrY7t\1O-;5c4hal94W\]_CAn=_Ch`L:rP* %#.50o0ib/S4sJaATIA7rbJQs;)\@Fo/rG`Plf's(Qc7ak2qI5YaL9jIEDm%R_'!AfcU"5&D3#%haf%LW['CiWR[(Mf7!)\ar)OAo %`$q?eM+]H.l7:nf#b;Q0%F7uK;F_"#`8W;4ffS!EP@*,IFn0EfQr(K:/tVe92Pq&W\f@eRV-RX+B]>+PaWbBBbf1X %nblltL%iE4fg4ENm^j*Y,nA,"PKPjp*d!KlI4h;l;$-Ns]8YVCYd4BIlVT:m'0"CMKH=_JA=+[HWs2n^_SEjhT,qUgRpUdF%^U(j %h>V]0q17,6YWj1H^=XoP1+rIChMb?"]q\t(01"-WeEk(U^9h,cZ.dhIp`(U/TLU@ZbMS>9T#D)RKq^15llJp+W# %)!o4/e`<-8eSLC#?NhG$dBhL89L?5jbo]$6%5@.JKudFtlY7Vd8us'W[k2BosA0FV4nFt7+GmGQ)YUh)_GE%PQVA'#-kEKRWD %)0h7DO1)X;X4&Aa8@8X!2ddIm'-)AGg(lZC]L`5(E_6?YpE50ap0aNdqrJPt5W>J[VtR'Y\%piTBcHSahguXtZJQ!3\5_!h"kWRM$Hlj$[dgq*_'t3pCg]gf8^$6M%r#6B\1^[Hh6e3/PsD7%_+FN, %>L+AVVseYq3`9ag[,dIq=Gb\a_i;ep_o'BpR(G;ds)=VWgs:Xl^agoP1Zk%fLrmsNoW$5E0@*GZ!M3X&Y34@2%'jG/!"GNe42;N: %SR4KF%G\G)r0;8V-eo7+>8%?11WZ>SH44p;3Nc#=&hP<23`L"\$Drh33_sIRhghk$;3reXA%cE$R"0-/'-+[m/M8,srO)"YtY3aU#fA[B@G[XLb??JZ\YNq*LmFSq=([Qh1+m.DBV:hR %`\B=%hKHUqlj^IY.<0`h19ei$p]biX&P]$VK@72>`3]e6`.sTaZh9ucQ8Uc44.&n\/;mPm97rJ]@5iqDlY&k$nD73)Qu=OFC5"7? %T$2-;6&f]K"l!uh&%(_(YJ?9K.f^pR;*Z!GAL`V[[jF7A`ZQ=*8R2bS):_9)HuGEajnft>g5lYR0i%*OS.FY#%cZj3fa?8/RG3/' %oO"2SiKs1Mr6Ts`Jg!B(5i8p`cU5)Cpk^%SF)19/#Uk.b)V/N[=#dsg$4rY?4Sk75_C.$D>(6`_3rY %)6V\#6/h0I"mejj8h.X&O0NQ)U^WXXh;Y3ZADQ2!39jo]]T-KIfoBg_AacZ@aF70N6;.%1fs>VMlFR$V'^B61EX^g5/MN53(#\"0 %Lh.\.B2D@SHJ"p2f6lCm^p:O1!D)V)YE5W+RE;-jN,)9pEc,&W`]d)V_"\'nj3qPqY``+U55SX/rg^]4l*E1%>$BL;V\jVI(kQD%Y"*!&\oJ5bNE3/5W'045I/o+mpLYE'8bL5^^YC4X\]^\WcfpYL?$\m'mjW#rC%;NW!blXN?/l[E\Sk>n.,F\_-l>3Abrnc_9u73511g,P!5LQ6hU(77Q$k= %RQ?)0/<"MCfU4JY%>OWSdE9agHWbfp/aQU"3OSh"X=jfFje'X!=&RG/!quR42n3e%(?fi1[0O8!'@b",rB?XsXJ-%g^nV*0)na*: %&d'3%P;PgKS%1.iEa:2#^?5anfO6KT$06R(q!mqP\R.$GdILi"cIE_gH.IVUdD4kR!:C_)EEQ3("d@RCgXcN[;1$ZA0!7"-`>$/& %%\E%"Jp/'R"FI!N<+a+,@Df7BPFE_5,JaojT7u&h^8]`u)jk2!%GpMeH"fpU4P:M+([7q&7ff`/JTPfhY^G\0Y.+?9G`EJJ0q^Fd %B%[h=o5[QtE9]851n1>CC8BEcMrD>2@sEY6F:\'NqVn<$I>SnbO_X^_/AuDp9$/nI[XVoq^2_Y`IHTT3Kr5Zh`9A="gLO0-(>AMZ9[>-L4:-_Id$]X0I\+SIo"\f"$_a.kliT2TpOKT&]<u"?8B[N\U=*R4KSfO,8Xc!oQ#CI^p@*c=07&.FK;/n^akq6lMOU@]r/QQ/$)YNMZ;8cAN9ao0_$"kJCAQJ4kM!r6=%sheeu!o %lPB8c/21?J[JT7ggW>&XYs^0:dt/kc4^pc6R]S`MiQXLE#[L/n]B;*P.,A=\dE-;WkfX>X0gNi4mnVmT\msOhuPq`Nfka"q`QOFL@Ml^p,9!6=$8jIA>Z!i2^b\E\8+%p1,/' %@306*ACk7TiF1:mC/QkMCco]TM5G%'Hd$VjcU!PhVPS:Fa-Ps`-)=@\;^GJrlf#ri._fj^d(*CK]S%\&d&a069jSaZi:RF7hQi!H %(adYIT$p4t!;Z5-<8do,TSV+I')]\/YB/T.1r)oq^JuG`Le)I-W/?h.i#bHk<+A+n?j;3@E%S&_`$Y6c!S>$p %;5^-X2l3.hH+O4p/=.1Wo+Ih-L8:LtfX%*&$d\_MXtX8Z)7oG*,9%[i[*oQj/%6T-aM&\6o$c@U'sBlU=[:PZk@1HrPSdXrb>75Cai'IrJ6XT;gMUcbVj3unnHmc0`qt&p(NL#lE[kYDTgkQtA%*mMqDsRH1cGgs1s&Lj6Hog"_'TT_M %pD@JB+0j6Z^_!+%:Ue4Rg5i%.[7d8n4:,CR %S9UE^l4;3PU17Z5X!PE<1KUPs-9u#% %68m2#4beAS6U9pF&m/$`f-1i)\It>$%>_?Fi39=u+APW?M%?UPCe;_G?BR!J92L5+'_DC'EOf,u\3.MMZt`R)LFh=T)8l"Nes-,< %ekGN3lj'SSc7-8hJ-,]+4K(Y7pf.].Giq_`-?[5!Z3irb.42o!2],%94BEjY#I0Cr#u]Pb6]Q?cbV %V%?d8cNc.AnspRjg(j]kg:3CJ/<'kU%8JGNJVqXiif^_QTlDXt7hWhg8eU7tW=,e*Ma8mg*6Csn*mF4@3\+*db-ikVaa(cFCn38m %9L?_WGOP)(')*TV;HL"81*D7doPoI<+P^p_?]e-.+e;=>@c[L@OYH&st9 %&ulAfaZi53r<45tYY+j*_nC#.Q/On3-=1,12RmUO(bOeN3'=4qh$mrrW4YG!_ee1#]ZRsh]hK07YZg9B'WUI/KDhc#Mu"/,-khHd %\>E[dJg?29ALOtMA8N(/[5P-e5a,ZPd[(]PX%7_i+GN7T,dk$k`=(e"4=j((oMKH?dtQE-.[X*ACd#iK:1#0Rbq9!cVUcRP0Gq;] %.,?AP>K4)$^=rgq>7I\.b)1^t]X"Z"Q]liY@"m`#\L>t+4+FMeaa!rLY>B1Ug^<0Z?\]&MK?rLE.gE9Ao\66g)\*`hD2/4MG2%27 %V*S+B6s=G]qY+(#8.U>[Te.4i>#`lPVUjbJJRFO>W>P3DQloI]flaWW;7O'tXaSb;kRfU7(n9@7=7^8\F1M@\ %jj?,U=kX(i\m`]aSp>hBStGiXnXS-!LA>%]dh4AM2fk*'Cc?k-K0>EDVHN\F=23o:]Yco*J?q=b$s[X)s7+N\`>igSZ:qI[ABNp[ %"<]2UR30[:V"9i8`LD:K'C5`-COL;lG59Bp %cAYkh'/?KrgbraiDDq/g`,@3W2NkB1Zo[H3sd9a+`-*r%JT]r\:F1mjHKJRK)9Ym7uZXNru:BHPq+N\,4" %[NZ7\cJ]66cY;Jqg"Q-#QRU$&:epG(e?f/IgQ&K,>W;6JP6Y:7/?1n9i>3L2DgQJo5k;(d^Ma7'69BF)W9e]IPkJ6R2lI",e4JjN %osNs7[f+O5Z)tnET'fmh-*ruR[^Y$S4@THEOe"1r_(98H7Q&Q$rO.1A)p,+q-rZO>$OI`]_5q"<&/R;^fNYfaD?B+gcVY120G97.Gh %m3$(D]huR_>2Q]2odG%17u]i`c'#V>K[;j\\eM:PgH@'F/HbT@aPkaW\N[IY;DHO22_=2Zp,O<_*M"BLoYK\M)#C#po[t9jg4'"a %)4pCIn,6XL'.U4lr;&E&Nb.uRqf>`lrDPlkphe_th]F0+S;2C]J>]_HWqO!l+>iOCG=Q>hfTopI8[C0Ia#Y]2%H^Q*@&^a)@9aDJ %*=Hi>Q^;8-Ye4i[Gig^8%(fXJejX3=f\;kA],`ErhgoRo&q588BR;bcGkT_(dr(kj"o3U[-;FAbrH4`,E8&@9T\st?7fC-KgtQ0W %$U7M`?i-G0cc)C\K7(jOmGg4\76/@8sT@4qU6>^`@Xdg6;k@!4N]RalR-4;Y)I+pVUa($g,drh'5if5L]D"8uU,qt#=;p-52LZi<2'?Cr25I.1l])o\HBLP6+S?%Z>(5p")7 %$R'cS0O.la9*sb^Xi/I0!Bu:tcLi0@f"gUeoQn)Y@nRDB$F)f88Ae\N(bL-d+_+9_4"_0\@AJn3.=VWmNdQs!T)4@i#7=IgGZnUV %h_;i_(@8R`C^n'c$@>9nLYEnVKO<@JmbuLIqC+C"T^rXtLP'r*B7W0^^a)l'pA7SM/O^W_f#+r.M.hBHpEm+*fcQ4f[m?M`':)/F %n=DX'`U'0@[[".XR``s$>;pWZre$'o!>"t&2KRJZboCUuTR^[1k6aQbgiH2]Q4&,^)qIWV"C"cWR:am'K*obEduLK7K=I3$IE)XH %%CG[A'X=,VC5Y;m(R3Jq[=Z/#O!3NMlMY=c%su0+MAZ&KTCmtT`IQf8lb.W%-dBT)h&S![E?Zdacas:JeB(BI %gNVRqfiN%js]Od!G;snHJ=^%T/WSHCpG\dL3[MpCUZ$Zs1'-9"(mWH]8[g@hijntSJ/qnauCZ: %iPp[<^qO:95,[&Wo\9/or4FKc*]G0j5VfC:oh?r`HtRiD]khrPAZg+1>&P3f0:WZ@nT;#.Z89R2SbX>5/5b`PFWH]0E?pis_9ajZ %mX(.*8J09AF,[9KeK45467mP-l$FW\\narBN$=B-_Lfc)Ho$B,':q]ET"?05d)2K)S8ZhD+l^,0d^SJ=6`MV)]M33jRf`I6>rG*P %TT66@OLrfT)jZCMZZHu;4qPBD7SC<5,2uI!fQs9-^(P_#j1J\`A.;JSgDo64fuS(eQUA\MH-U=aU5/+"'#CZsk:&L)I.*K##2c;/ %du9%I]'*oL48Q0\rg5@VaF=:XUA*UJBs3du!KRmLh1I\rfA,'9bL9,e7,/,FWG\)hQX*jp9/H`t=Y)7e^U-oDP(dHpUi@SibpKS\F %Da_6Hj7msb&;k^D%sc>So#aN*&cY+(nrDqPo;MHU\*PP^Gue62=X`8K#+%8R0*<^5"h`rXH-8!"E70u$[gY05\8GVtE@>9h]'(RW %NW>D+fVYRN8HFdC`!_gj,so-#.f&8[GApt:]@%'O:l0G?-?PdpEfs6T_8qSDLa"Z2UJlKDZ[egY/k2YrD-HD(idB^0U540-q$4EV %%:%5M,&W:JpDjdne'%c1bjl"?4!TZ@%Er@(^)l>XJ&YtbL8D.YD:(LN;fcj&:3UhgS234f8B*(4(pdIq-qk+W.`%HJ&c.^gZImjn@ONFGLEa0Z,1^D`%_/PipU=R1<$CKGZ]o\,fFc<#$lLQ0/0 %VgB-bi5<=RXR\^QI90\*)j8DZ&c!'jqHDSK3A]%DQ)Q?:jCQ$h7)scmIWM&7`qI!>=I:de^/0>X`8;2^^82T>*^GTB;#p-3;bf;. %(0bUWddQ^]0qmb:gd9mZLbcR(,8k/Q5mWOg2SBPVCpnC$W]_T*>f;na;U?2(2F!C_B7(u]<769DK*UGZu`[D-8\G7%A&2^Wi0=@s=mEg^-_YC4"i@Au:M5G,IDbI_m_Flc,Y[cRoX2[,Y7_S1,uE*7l>Xf$4.T?34d"o9Mna,+*Lm?L%)X`1&5? %DsI;6W=9Oc^8WCM[cYq0I3ORDVOGoe\jo,I,`6i4*23aLJ+UpA&6l#Bh8p0#C2toB-_PAd.=D4KI=?"PX>SW)Ak$KmM(R0ZF#"n %h,,YtrS`L7"Fp4BncrBR;$_"rZTe=Z9;k#-nr1MlQgS"D@$F/ckMZ2XpC:*QADk%SaSrEH@B88K&%:/6>Uu=#G@]Pp$IQ0t0Of0q %CQ'#:-TL#b3D^0%1#(!*3*K@.>E5)d^*^cdNnH5>$/qVdfqUSHo)raK

&W<&YZX./O]f+0]F(]:`YGWg%D#pdu5rXpjLh/^mgJ@bJT/#-RHB,.2>3`gpE,+^:b<$s>_'Z5e( %mW[M_@c4SOm(+k;Msq78h&(V'+/&&n%fdgbHN;[X'_#$h>d2:Uf?Bg#2q\dl8Up+jlk;rBQ@j;91tD"6%MHN&2,-c&M`b5Jk_@kHl%[HrK6t/a]uM0`iECN^eU6SY'1>fH=NqRc,4qUU6.u$#J._C?i#gW5'H6uRC<.;QT=hTp$3EKmf)YP=))P6XB%G.)d35hBHR@VO#oc@"!1PaTu68g&j4oU]cc3*%6ImI^(E+8JQ'J$V:YDN2UiqMsp %CVE?=FD'o&a9i?G$bS-Yc7t$Q6nJ'@&aQmf`d+aA(r.YIRr4K%o12-l$$0b*OI`<[.NDUSuaH`6bk=oi0FD[To1GD!.Z0<@;rX-90>3^7MWi$Jie>7!aaTe8HM#jR0I9%P!B[g;FVPfY,W\4 %qY+g>/Jh##,0%[>q.ArHrqk#YVS.ZsO=Y^b&/e\2(7UNj'Q>f(pa*I+)i]nHAnXk)jX736&X$(@dG!2h^F %bVSqH2o$^Pb!Fpe`n %^V.^8i!#5ts7=JWAmUnf(`CZ<7l77g'&i@i._cC5(j+)hOg6o_0EIooIYSFlJ2K7GRP1g8qB(aZi8fd/a5WA9XA3D5:_/?^i+@mW %>;t._UXni.(:,c2eQYEZGbNi3E/@A"AGITK@J?LeF4gG6[On<:3Yp"ul#[Za(n[t$`?7`!pc;jH0TV29_J^-Y8Er;I`5Fni=cUH0 %+j5V))'o?BXGFgm`!/NM:$]-%'Ppp-^73'!Tq]_)3Y#s$BFos+PYL@H_30pa#)eU*7n1Fa(cYJK7n<&['^:R- %:2o@V2!9>ZUr6\7_OHljfOBDuR:l43qPZjW66ETKht(IhI!!J'P_mHnp"&(J\33Xa"R%sY!BOYaKC_"#52tGCkT4UuVL#c>fKa\+ %rF&2-c-5-L-kSFnq$0#9\@'$QcX7*QM#)bYL7o?Q,a8C*S[JZ(;>"Cha^59f,6OR-9IHGghYOA&ri]XW\ek,EE):?_rS8c-E<;QE7YOF]*83#KkYG;Hf*+#]3Y*Ci827aDRIdK\!k/2?ADs'RQ85>10_DcMm7 %i=tj%05!&P_K'MOS=FH;)l)c_&,Qig[,lh\nUP7MWSJk0EYXT3C*d>LU2p,sk-j"a.p&rb4WpV[?-[%i*^rF&;t?G!OmF+H\t*M_ %*0fad;1XQUI`?(u*.C-D%njj]O9dPU8-BLH^tT:>'<1rcP""PnrdiWQ"2iDl?t=gJ\?6YT4o)0Cbabu6WlmO[\D'8-L'8EN'&L#= %>RM,["6YUb0ALOOi\kDUI;dtPq,:)nKuil?rS!+Y%Nmr7+AB(&js`f>!`3[-jKp4r,bfH4^1#H*2c!r(74D1QOoYct5A86HQL %'d`nL_gQNK"Dr98&eku>47!Q\1Uc.*/%MseGAl^gHgtpC@4\aLBj@dbr!m=1&b53sgOpC5ipS/pEFP6)D3+[aY"!VVefT@N@hR>m %"eRr%M:Vr&flJEBYpTAt+@*=FR5fc9S5[&Sg0T?FG@g,e]fs)_Sp/$R!Z*D/#KN7NM/&J:(L_]kcIpa6p7=PS5 %CION\PLa2>So4";df)qn-&0(?L^@R`hY9/%g=244j+I#qN3j^d<3GKnY66YA2\[6:2>&)eqr0 %bJI`\L_tTV*Q]91FH)#!p5#i193B_mLN2+4JED9qQBm==(..TU+Uuo\\dr,((dsZ%i6Qc:a/#EfW3p&P%3cs!b?T^":-]\$A'Vc2 %'`j)Y[3c!gGu/n7YmV9@Utj0O&X3P;$]t[bnsS1KAh/`Ufk7I,=]_!iZ,O\S+tNcLPric@PbQ?;(NFB#'\R"HFAGKP_5Sd4'UuYn %a^kF%`sN,U!7quGTB3=#+sL!=A#g,Lp5IWY[Z!2W=@CE%3.otI,3C\aG8?ipOW;aX+gIWAKCmrt8n9lL]94T0%hX54XRljEil/Rh %ro8)qhrIo!p_"0;qZ@nLo7?]]ca:7)M<^c>'N''to;:ncp8k=J\uas3I2#V9cm\/M %@O/O'P!MHS>0mI>6i_Jsd!^M`F^'l!6p1@`NB_rYg;*N=Lb*@d=m\'4h]?<8+ssCGR5P6Sh3T,m]U8,/T*JPWS_!fPWg3Nk41"U. %Z8H*]9eLUu3PqsmKX4t\*uO'f)F`/GXQP^-DRid1Kd06.k?\H&(]4T+$-0o)Gp(6<+S\?aC:lOY^.9%#&R,M>J8'-o'Fhj93J,ngp*eds&oKU6Vegb* %$RL=Q3QoE(=J<&KZ`CG*:\hmhb:aLXGPS-Q4AYH>?ZQuF36lmfB\EZVOeSd+S@&*HSUrsUV^9j>Qp?YTdO:HM`7`nF,+c+C,/E#F %72O5WNL?hUi-qDoQZ=V`Za3gqKD;aV[C\@;4KC4\fVlEVD)cER=(USZg;t,WR`*g,.s9'96N2G/I?Ek,!H-AFb5uCHKKm+V=bHhr %M]tF7YTLu9+I)7r2]tL&_0k:P-U%E7=hDY+hsXlSdaS0qQ[tGpW9]oe9#*lV,4lDU5BdYtiXTj'p6Qu#d.HTE)Wb86o*+2!kTUMc %$79"h)>.mtM^)6BDT'bXY:9lP<5bJdWhZe3nR&(IFc`K(3F$+#H^[/CPG)q1nDZF+\(91G3F+\ku5")ah;c:?a5B4BhZi"GiX#ua"um!`Q` %\n>9s-`gR^CTU^!c4@cUm*rZ&7N)*.J]j"8+jBF7m^A&3;5Qn]K.CbTSI1`%1:H!-^2a%JJ.5BS=mmKK3@nNX,Mt;a@CS1a+m.\d %3PWS&g/67:ljGD8_l^KLiCF$XA_NfCo"_R\IBn<]-6V%b[cuor@Zr](dWAS/-U9S=2#f&jN;FYPhd*S.J'>]KnGGGsQfOlJ@?_/5Ng0!O,<]l_DsYON#Q>*EpKW$65>fn6"-i"7pB %^!Ufc(1k4taYe!V#jmq+E!"h'fQd.IR6KG&k,cMQI``a%E(:Mg#&Y0dTmm'c8q=9#_-lfNq4WC_W.QMB8J.n&@XknR %C`O!#%pYLtEbG/X:@)U>iX5YLbfD@@2ckYqUuET^'e.->%N0UB$W(30_EaX_.r9nJ(b$'i#Hm\'ZFlQTLet(maXE!\^#Ojp8e0>j %XEnn$&c?BIqon8/_u".,qs^,sP%M'r/_$GGe9V8+[6tc[_10dJQJl0Z,jH3`IZ0XON'%@_Wbo=dcGBe^($&_?>4]VrS?FKrk8*dl %pM4C!ePQWjHNrMVl`f9ud;ieFMh6"`/73Z`eK;Gm?otZq=OdIoK:>-hA0<'p %AN-t-]rdIrCP.dZO'AIAQ8,Lb(=o/>Zp3f[2r9;L-NA+;cEe1WVZU4-*4/*VG"J]g2NX_?!^c>,IoHR:Xu=Xpk?^SfQ.H94^u6g0 %cskRE#KgR&_*i3ikNAn36i-1^\'W2LXWm6=3j56@K7JEp5ighKOl9@cgu8r\Z7nXjCDQbiNedZO:o#4(\jYIg.0\9+/979c[ZdYt %7ZO6r2`!5OP)FqD[otPq['Q5DNE%6?PM_c^MA>]4@70aAd4"BL&U#$X)CS8h#!tT#bT2o%1I-((=4U:F;lo-"''V5G0M8)$m!4Bh %\^L2AQl_Ze1f)L[HleTZ7#DXlfdXYD%4A8*314LCkK=s-)UH[OFI<)qVpcE80e:_Z":#B(k(]10rW7aa5Fa5FKi8>eD2`KAb:3m7<.+ %K$X*ZN_Y*D7@Z/LR7MY9M0;O#eA8ZA(2S#W&f<>c:)(>n+Qq3Ak1,^;*M'gZ1%/M3lcooo1fE6?(i'3)t8f^M'f] %AEKG(\$A^>i=$7`DnPoeS3NYB,"PS.+3MD5Us:L!f[mD'XFW-.bO)3qB7W4hiQlPgC^14Lk$t.C_37)'Up>@lBf604D%Qbdi0lj77iP+jl?m2^>F4-UjL/BBIb29*eb@'5k.t&IefU49om6VASLf!iUU5Rp %BJV>O69OJ)r&,lGU/NUl!LH_8D7rF0i0(f/02aq8/A#]5)qnndmta_MJ)@tnHlXG'fQ_:?24Y/"ROlKVHd+f/nEODd/@Y_;fV]'! %:8/5F>0nTuGq.0*N*WCMH(Icuol(<71\"j7p7"TBi]S!6.o#GRE6Mr/cZKtBENore9OUrbsOe`h"guTpT?TH**7=I'D+B9:Ju@5EPELRr*]8D$lLpg+aMdX(kt9jgCfLK %-:*dDiS1![H`sh%^.XUE+b %Vk,\^(XUe?pX\Vna1AbRQj_YAAp0_k[));a=!(nD:`"$9_n$E$ETsaW]oa"*d[3Sk[rYfG>YosR259_2$D*S'Hc;E8,7=.^e:U$> %o&(=c3`(*!i7UWL%h`c5g=Tr:=.)tGf\Hq^;97Qalq=7F8PiiPke3QN_Y/AD6*1C,:r^9oUR2KI)Wk3AOdfQh&N8LL0$GY%]t6b" %'Jc;*4g_ZD_\:tJRYM/M.8V9dWjl$bm>B^a"(=Lo>RNY5[#6mL5d8)PWX/"c'cXKN&e>>)$qPF/A1Mqp$oV"]+Y@i-oCL %Phj!HH*WBQn2aC0qVg.^%K0fs!(in"7o_^(,W[QFS@jH9U3G!7m`lBbpc2;Rn@G"rW<[,?W$XRWqrN`PDoojEFZ-XsLFX/Rk\[0) %.Lc*Vbdoo3?E_kJ]K;4o+)2hUFH8^'s2SXMVN]nIqiqX`#H9n01,%Nos,\$ZljrDKFk68>`K6X9`L4H+`4@l[3(4>a(LZ-'^H&X* %;:YXQ)a%Dm$ZaPu^L1ke7XtidTb7#`(P(gaWD]i*I"k(`fi\ojNJ0Km="$Q"&V'J0gf(`Yol&]:J+LeF^PUq3rgS[]^\Qje=#YX) %o9\@K]m9D8X1+_Xr;5NWs)@o1pqJK]h=3^UDu?eGIfKB$n)"*Os7Gg$Dr0IQ %J,/e6?b]+S-SKsopuAuq2_X(&rU`Ogq>C$V(Opl'_sre;3<&g0(\K-3"T?X_59145q=pCAu7@FD#&gPJ;W&l6cZ;)(Wn@J&,l>\``4j]YHGTWh3KXCem\eotp(GGg`,%(CXrqT!qq;e1*^]3l`m8l5rqX2P1^4(EVs"Q^&bFd=S)/^^rIk3k<:usB27.6*> %mV_)bPUW+pR>1@Xno%eJ94%V^`N;rE#VWEDHO6rr;UbI:I_lo^j(iUL*T)&3nj+P3DdL/j5!_CFpi/>QO\]nErVQ&uqtg8`DE`@A %o(2bU+!,n*c1bSfXZ#?k^&R'9YQ)d)huE-3rAWV^FhFSVrn+^Up$^adqWfn%\neh:k/qkLgV>39KTE?_)V-oRUAfiEI/6J9`K'Vg[-A0('Ko@I@SkfI._?>'Rs[Ok7'W"??Qt+\q3p7jN11$-'@B66;AWkn(1or)IWgA9 %g[pg\,4enfBU6kI1_o,K?Qu:SR@K-1;u-XVK/M+-)Co?diM%b_,#D\a6gu8j^Z^d:b._pYAcHK?fZrS#i[0IYEW#EMjrA!QiQ4WE %7-YL0`8gHF.3^iFPj/_b#74Q)c)jC//:MsAK)]T/i$7.ADnQX`J!?Qi%6je-^&#>8njU&n,Vudn7.Vh89"O!L%HL2sRd!hOeNm\C %>7t(o4#-q3[1^;@c6>3sLu:3D*.m4eTCgrAt1TQ)uGpkh55Cq`I4iAd[0G3@MT %<3]TPXMa^BHA2"tP%XRLiIt`TgPql9O!hR1(BY;aqGNL=IsM(!5P+H4In"Hf0s]k1lB>T3F5MfKliQ9%%1"hj"b/LKPp/9i3!GU] %P^/0f6&Pe@:l@ftr[We5pNpOb%V+gI2<"XQoCc36X$e:WFXk&i/B.,a@&%nL*d5/>^"1d#`<^k4mN9=O(nLJ)eAi&ZIft8TfXGj' %>C!`i'h/(dPKcW@"Vl,?MPks>RaUpeUa^F?RXlP42U@9F@&gGc*L3A'=#_n?'s[3J$rTej&L@STKPrP%i/(GXeNSp&PJRai,Y)AZtCb5PLh$/ln/A'n]U^"R5oehI[Z+NNhTaIaf,?4*=>ZnEQk]_PG %;a5?#R:t[$H7so*PlYA\_4'J.X7[\G![fYl<`!l`%4=C-1`^+$2%RTBgfbSS&gj[C(.5IVF``:2"r0^d1JTbJ/:i>TMgg;",=nMj %;$;f9<*l5Oe$&7^oAJ97;N(P[kCIO2k8s$Jp[kBNl07B$W*AeY"oP=$q"Ksm*C$qioQ+),l7B%78L,)uh>VBIXK&'Sfc!gVmHj9> %FBHn%T-YAMeUFDGL"3L^=!N3dJI45pA=BbNSZ:C@c_nP(7P7b)l?;WBWNFdq!I0X&-2s_=V;XBDX'"R_O&I2kU9cJ_u91mL>8 %6l`MJJBlGL55-_?59)!@(_G*)>qC7\rZ,gdkkA`C6FB=0S]*j79'@7[`Z.a!NTJ\XkYN[nW/<3&kOFN4Aq"a;_ojKQ9"JUG+QlNkM5fm&i %/_#QDRSV#"b[<@/hcI[iLVo=naJ*>Q1rliSbQmp-e`a]b!<>AWke0m0F@W30B[3u$hWimnZHaC6*9,$P8cgAK=Q5+dl;!kQnr8bo"2H4h5.DR:l`?nEHXicN@jMTPcQ@gS6!>>rk<01)R7P;a>=b5W_Ypk7nch"[lfb,GDPb<"G;P\cOXKiV[ %C(nP#ZG9+I`=uG5Z($/rU0i19.$!=.s7I/Fa1fpXHndb@;JII@8:5r*f#2jEon)B.a[E)hM\)5PM$ %.EP[FBD4]a>\0-ST-q/V7D7DG0U:.*-GZX %HRiY]&j[(;,_=D#$Ea$lGQJ#"3-@R]<@*h3,5B-0r1-.(Z7pMoDWUHX"C*P%,8Z8s]tAjKcb97\T9F@rBD&?>3NNMRUWYA6e)ZjJ %#ajpjd6sH<%%Ri;Cj7pTY"/tZ*auAl=YfTaG*$H`/iMQ2C=KAsGJ?(%"`3LG2"UOh4j*qVV.,8g%A?EeQ561HO\NJVbpd.ZQ'0^@PU*R)C6T4B3pIhFJAJNpd;PS>?mmbBmX7I-2-(o$S3c)Q0sK&! %h#\nOC@(`ei5D28&XPi"$.r7%[J%cEG]_n:-:Md+8Jo5t/kTG]-BGt+KT=+;(;f2OHp@"ifK7b2o[.#_'`:4%M/1tWJA %kP,bf+,9NWWT[C?O)FmjUKsncOA>/K(=2P'F;Anh2R_;)8V4L$)[R+#EQhQ`n9l)9Ob9=,Gmq**%#/13qEcO$i#+Qh7$.>GsP9J5rhn#]bVC3,V?k"jg.(X7'))>!uneJsgDck[GU&`k0;rJ7hL: %PGBT!mmSJ=aM=%>\PW]$WI@]5H+9D'2O0cQF;eK5=9'GTF.Zo-BDL9nWKmdJ(_L^H:Ser?+f')6E931m]oscVgK+ %<-T9:Z5e2m]=-nd`]C6"(`W_p39_tW9T\fZq2QHJ#S186\r9L"KLP$qa_<(Kn472/eV[u-?^s$`7"!f]RbWBQSFR=eA.+<8Ceoi\.Q5^Nf>mfG1KVKqV:\lIm\UP.qhMSVj)hUWjUu*@[TREqV]],\W&ih9 %IS8*Le(\gFVlHhfEY&OSOj*9eRO<,2*_3l9dbC$O5'EMs/93h`.!A7d=m,PnIeDfXri1G!=T^RS+kY@Q2@]o?R-V)<_iOa#Il$uk %K=AW0Ha00]F&YYo'A7g4ip(SDi8"f0NV&*-rJZYko3qio??DEcaYXi)iN4Nr%9_9DfPr1`;(CY)&)11hj,SD,HleDD;^L^=/KM#? %""2s-BN"NVI#Qh<(tT9hQ`5f1SBpqp55L9crd>gb9@P&? %XI2qr8;9*g[05!s2@<<&:kcHLS1<"[SSVW1C24q@dAJRIC?51+!'l*cYTFh3Y=9'gXu.Y"Xi(`P!L441nKpq<:K@JN%L2s6"&6b& %8]X@,Td:]@[[9'D"G?'/=uq-*je%_kc;BMM>-J.qagB0F+*;`m!nqI"AVi,oCI%V1a\do*.:G%V9p^!A]Kl3mm+X&i.kZI8I%S1H %.erdlnV)Oi1XH[A&u)h2+C;9^,\"NFU>gA*UJPVN6e4mEWdkU]GZt-]!r`?sU238L$8,8*-Cb"` %[.Gos!Ij")dc$5`Bs(:mLjY3Mg[oEVeQQA1,Z\2O$]=9J;p>9De^[?g1@F9)gnRbU7"r0B385.AQ(1giX%a62:*Qj'/A5!H3,JgU %(3Re-kg#^%6"aJRUiO'eKBH?+onku."6/d?9N&,SB@Wm^-'99*qkq4_4nqI=pdhdP+YK(!tg4I<4`mYZOm2Ohtb]s'N3JhAB-:OdAmIg[k9qV %IZ:MLfWQp,?*7)@>bd5)D_%(RWoYVg"15i.Be*FfM982lS>r7KltQ'oTrD0p'a%GUWGAk.DbgX&OR'SXYeX8nCF7,4h7_HrTgl$7 %PX+I7("%<7VJ,8)&6Li1OdKG's2-VNcBJ.T>e"qGS8:/lmmH[)Hp(HURepuEqjJ9hRC&b&F5^^I"oOkZ+OGA^Deam\K$6.W`2b17 %cEE`NlAq4t("angHpgR37YX5;Xb7TZA#*d%\H)#JXeo'JraVHUZHdOa^imsV>%9&3o:]!7(.%7;dN[m$YahK>-'BZ1Yol;Q6cWTQhY$Y';rL\W\G,!QAW.lALL(/jQ$V\TiX)F$h6W=._A$3[lF.HrI)(C.\%=S]tM" %@66>-kc<'D@`LuKh5"QA!Z7)q';]B17R0[n"n4@:4L)=D:H*WVcC,^]JRFH`l-!qf^sdK=@5mD./77Y`SfP%MKsOMHP[#mhKDq#gHDHID#f&IY(t*QJ$1mQo.1%0.gpaYd@@kgi'B:c8[QD$tPnH %XLLH[]\X%1:-6:hJ[2-1].ZlO@72fI6TH/"Pn$lD3V7d(e7%*g]@sl.\'\l.!tcH+EhQ$@fn(0OO==DlZFhq6KDL,OFfq[+H7cru %6KcO6`++X^M^6@&KN@XUPXa %R*h$gNE[Xt3X1L&\T_pU2Mo7QNPPU)7%/[e7c@!sbl1k'U2q6O;Lgns$7h'Cg,q+>Bo*(/b+"!*K;u/YA@!m7(Lb0_K!lnE;4KpF %+T$f0IQ=`K".Lj_RWNJ=?XVbal"tN>\cX*K%q_)k!?FM1bU-JEi*#,tEb %YRTV4[`9k-6BAGlc(FW3F+j0N:B_+tI]QYd4DgTh&'2uuc+SMEC>/dV-`p+` %1.h\T*TsV\ia2_'M%U1&[C]4*/\s\%H7eFl&_Tu`MqCV4'd#ap"K5WED&Ncr/.(!@6(2]fp@fbBB#5gYH9V3f#rF3pZc6\4JS4F) %^^BEG,5[ZV9L4O<:T;YY@r&FiO/"YW;/Gt:f=bM(DN4N,m*4(E*+Fl*d[-Ca0p-d;haOmf7s7cXU)>-u^@GC-MFbTiEo+=n,^XTV %V($C[9[uH,8E`ssC3X6pIp+5%'SKGmRAR;%Jsu&JN2@D0]tstP]_.6_$HZ3:&p'hE5"UkZp0+W['["40U616-1_QnghW(k7J:9?< %.@$pe5u++O-

@5nHJ8)/=f^&-m6I_72N?u=TA1rDL$`h`T<%MCpUB9oG/m1X)TrP% %:V]GHK&Lj3gV)&Ci%3X08:nt+?NG1hctX#]ZO3##r2BZV08\Ss:'4&E";<:-q\:k'?sSs/-tm&`9L/lNRWP/I3ZcGpkcbV_L95eK %Vq!#s[NM!q)F^]]a+nNTsYPZ_f"G#Fj4 %G.#tVTt+]Ic4JBu(nrGX.GL7_7N+Y.1adP"C)d=$1Bn:pMNLD]9KPVnT:)\"po@rp*M;[T[ %XdJ)WVRK^qE_^2/(/OPpD5.W`DS>tU4*qB)'4H.)mP]g&DHhaB$Ou1PiRodM-f<@oKH!_WWKJ+n]jq(:$$)I:&`WE>H@q?YVDVhc %MhLrJn#2,!`Q28;5Q/]T[oCm4NCc?iEGM+\OXhZ7/,'.keg %Se2[\NIR\RaJ[R-K!NUf8SKFVjqVF%gned$'sOW)2'bEtTN.>V!o-WS7TJ9HcttPN_E"JAIEQH4>WYbb;Ii+hZXfX;J5&ut1/')e %>X".^Z4>D!@%'pfa$PO!N,OI!SMrM9NQ=k"8bLC$;]ZTA$^&s)Wt?XL(I.WucVaX>+;XX#$3?p6d;bB!o*tp1]dCB$82)o?*Gc', %4n&Z0%W-B"BbUH`Mk@n.W/FkoL<-(YJEC8*5^"n=n>,b*:UER6b"R[lW[4PKf0#TE1$Va`+PB4Gl`\m(7FBAaO(EF,8nIF#uJ`3 %N?pP5)9t1mJ*ub&3BH<\flLuDja%CS9DN=8cQPc@R@i5TW21Bsq/c&gn/O_VW=DQkXaA@FgrFVEdkbVPf4JM'[]>2al5#k'ggqT\]*j*5YOq%uY4-6EcXR9\6G)Ng)D %kVaA-A%#iDRfotg$RmP[qGEq&._2s`^ogeh5pA8@b3O^1(,gb$B+q\B:6$Ui+G:pArS=!(^RP.i-8>"2\9,Wr*$5#nSem]XMja7( %B4CpW5a,2)FdnTL8tpY8\?_FE&5!I$B8'!gA'QP1JAHQN]olrI#;79j*3DWuBs(h@R`q%(rNkN&UAd[Y;m'rn%kk)'ollH;$Wm&o %f8o>!=+9Qpb_-@NJBA=6#Q!7$8,oEJnG6"7ipt,r@s>Ic+cih(bGF_)`RTZ`pZNg5r&Hm[jg"Q!rK+[=oRsh=%:;>GEaJ_bT&Xhr %I=/N;gaZ[G\@Ss%4h:r,rnPJ6n3hR"oXR(FcCTXnc.R/SLXP;1@?t5gc4AONm(5cIj9p>2oqSDYj_o.<>ke[kj',c5#53]4DT(Ak %*ll7'i@uso,Vh$DD.%RKlucAfWn3;LC6u^/g(2!*;tT%r'DM'>IXV/G^O,Sq^AL!:NaDp6?1er!Rb]d*6gWg3q&uVTT:@(1%\Aq1 %,$sFM=X*1k=a;4Wi`VZn5/f>&m)']@t5!s'WQUg6)1De'kN-Z`f]4=bVtp(1$A*naXZ.t;Y!Xe(\A %ihUfg%`u;,j+u/,S;*moNW"@MGMPF=V&j$-_677;_grJ6p2cm6o<@KZ:Y7C4X7/K(O8J^agu^tDM^%;N9h0OJnO/2 %-t)q2%$O'.Ssj/0WSj[eR1(22X?7.nDGSP7Z%H]MR]ME[AXeL?HUb`k\p-uiamJ;ik+"Ds:X;)T90=`nUg76I4Lp:EdrS=7V7m?? %5HOQ+#D-Y(5!9P(JrZbL_V)hjUZ"C)f-6N(iE7m.pAKrKV02=0\0[40B1+A=`q`'kMAk[(a^4MEI!YdLcg^Q@*fl\$,k:kN^g>p4 %I=Lka\)4n]f3/.@APDkDd&p8U!nmBZ+_7V?MTW31YA;qC9GO&-9kSi$MlfusW2El+m$ON?XS&#Z!83d;UC-^/SPO,M>];O*0QS/[ %]6-rP;Ga,#XR)HDS#jF,jmnlt"]Z(Xh+8Ym%5qm@lBV;9lBl>QK*A/NVlF_cg%A3T?mZ6#i&Dm?:@-hJCMUWOBqsV?=kp\J-fYb+ %@qqg[7^9nn=('U1;/T5G/X(0@=c?Bq,lXAt]*7C$m;L8&Sce#2/rFdkX+C5UIYmXW]n?&o/0nn;Ks7+Ylse"5C]iO`5/BB[4m9AW %%O@ccN?'6lg,QMg=O#hOn]0_Wn(?@H_>5V65<.l4@A6o5m?T^9dpD"#6(%gR[RP`Mj!89.n)S]s^@'RN`.9:[;JcuKYhrZuKAoZ\ %MJYY[On7`+?7EcX@p=qL+'_j$5=,$0SEumlGQM"GQ)FT)+ReG(k:FfVsk[8hY@kk5inWCJ(lbJiXXo>[o7uG=#3k/:OZM]D24\sW` %I&?g762jsH5bX]E>i0+]p[E]EN;>1N,b<%;aNY0X&0Z8dj*L$I)pVD3W%jgi[(>nME:Ki_>$N#C3/djGDR'7O='@RLec71],Vku? %;+$?)2D"!!n[:SM5fa %?)=QX(hFSQgb]pqbdA#+a,rl.%>@f<]W/=?1hr4Fgf&\(/F8iuXVAp$IK$"f$HkR8@i%'MDNYupDY0ck&j1)s+iE2/=.sVq5C5ldL\MuA8.lAd].'RL5T@E$<$jF1S1?2M;J9Pe=O*kda&,$76NNni*^01l4gPWoKhDf8hmSoCorr*bmMKDqiinI9RE`GrD\&DHq8*Tsh#,RNch""OffBY_a %D2q0VY&Pg;:he>4IRPDBS3QuE/3&lZL(%#;=AEE#$TYC.OpO0")&o(SG%"qSiX=tj4"lBLpfdn`@Y8iG,V,hEk(.'6(3l=l)XWcn %Lj2rH4u(t8:+Z4F;0;ZUKLb:;qU1r]JJ?TgG@R_]2-l>V.$^oOE@kSU4(`]b^%aRFhZma9,g^K7YpUiQB %AGr>M0CT6>Eu;3VPWO42*fE+@GW^7$Rn\B`T>pU %Y2@r,/)$$o,a9d(V8pM2e_ee\%r21*JiiE%$d^)AD+:U2G'V?]>+)USMcShAMI+#?Fe)&XW?P$TBsAoi[+O7HiHdA)q>cO3Mgc2: %6j?:d=GS4KV?+[L\ANVo)=^k=7Y5sPTF&p-1q>rBYq93d",)+FVrR")[We<0P1DB(U[8XMYXcBlL=$cnGiOXIbbWm7AeoTcGHkZq %"RX1.SMoHh%bZ@V+[6!g0r%#i>GHHPfaJ_&C)KaL%!GY3ZFs^71\>.lP\&MuH^!PWiKK-0&5?\a=Q8oe>Q`(U_DORa\qpobaid(a %rW^V>2;.csH?,I^=^dLeLl'Nc)$:8[cT],p#D(2B_(MPrk6KYnW7':B?fc1*4:mgLYqVRsg51K-g'U\V28(`i[ZL*B+],)`%PF$& %DkMkWI_s"q"dG?cJ:B+=%fIk.Vg'L)[.d2Uik*1/As1 %J9Agj.!@4hP/>Rb$GTt6S+!5_O*o/Q05-THDU$:4SsIT63:)&G9-h3t!iTEfh$j=VVknkafgdS(EQn=0Qnbh<\"8lW#%S'21XtEY %eE\H4V74mnfH-\f/sY"SD)9QVYS[0h]eAtHR1`fB*8`EYS:eR/; %?T.$>cblm:j4FP4:bS-JPV"u+;p:plR[UG6=u*%`?:3YG13@a,(-6rQdHTBe^h30:EfP.s;/R6l^RAE'ctksk*cHT;j^+ZDLcj8A %*#=c1Gc[9seRedCqD>qXq5qlQ)J=+448#8.9j/W?+?('O']L+P)B2FV0cIH47QYs)>`osHV3nO-jE+%4aXI2:TQf?BOk?4])sB,e %&2bgupNh5Fd`ILsJQ7#c*6PfC,XIgOkrO5g;I_I,,F7.T5+5t%aE$OC[RPkGVKi>'LdUj[%&M^j`sbWq;9"Ol`o9,K?;)2^g.m$2<&*4I4p?(4],Nmf1,f2$P$1S^_"1C[HCk=T3"H4`28=!@ehhcV2Q!?i^GF.P>SS^2O1R)hIOjfp*59WuGP]-t@![JB1ZZJ@*&"*DO&V_@[LI/3r %4i.%D+-.u!T##3/pf7)<+r()q&"gFZ/6"G'[cY_GIK<^M;>) %1OuVG9/_4%RTf#A+O %1d=O]85iSMhtk9h?Ggg %Zl2BFZQ^q4%"uV+KH\+3(2ok'd8(8nLr,n3%d6TL&`aX3fh1*=,>^-a]AB`uai#&08-@\kT#oda,g8r-56G7e[gC(QMUWG"r:%6J#_f5R"WuM8T6-VOA'f0;L?_X\J+k\F\dJgkKa([gq;GnR%Jj7`"j%J2nKHm;Q %a3iK5%tZ#S6^PWpPbB#:@^+bKme$uL48 %*(RfXLTf-r,6XjfJf)`$U)MN82*j9J>kH;[An;7.(n%KdQkP$?oD6C;8Y)LdgLkVfL#Mo[!Sf52E"(aCFDnf'%>sR/H!M.ntaNej^TmDm_#Z,ZHCH&Yn\IuMFbRe'b=jl0ZX#A;:@#UN(YN8;5&dEPMa!&sgaH]1Me3?#=kT`GS*lT(rlK:K8D %B&"i6FVmo3C2/:)41)XFN!u.arctrhc'VbR9YfB8l9Wm>_`FDgmYjgk8kLCQAE$O2LKc"r(4'K-ZSD!cpEqA(2:K7&%U@SO`nP/2 %KO0Y^Np=`+HLF&MhWr,s\A/#OBY$l7nj5B'K1uki[XDC*:EsmU0\r=tLmYK"D$;X+Q#63<&3qFp_4(ZfEXg\)`*9*L.qub#admT! %$.!gU?U;'.;b %@bq1W!j]a\b"KT[qWH,sZr\XCrUp!1Xf6jY6Vgkd`d83G!7R+Uapts@4[I9^A51NsE5M6m1_&CPrY8EZR[\gD2l@P[(.G@dP1AR\0c`_ObZtLgXeuEdS)F_g:lS7bj[D,//m$O;Ld1U%*Li[c&nPFBX4`^ebt*!(`)r`=1TP;@k8Y3.nGVT %T>n`N)LrVqL-%<2@d8+ZZ+6W%UR@&=Nd"-hf;9Bfn=,'gNh7qp]_5T[h)nX`cP67grT1gZ)'i1LuGeQYf-/J9)qBa60%JSMQ90FLHeLN-M#*^+'2'U@%46"-B@qH!$FK6h:`eDAC,<[>h>8fhULLtEm.(YON(6s=$ %pckk-8m/ii':R79Tf<$fm$$U;i#])%.mn*cBNLbp74JGWjf:-Q&/b[@[\Cl!hBa?X3hYQDlKs"V/MiOj1erSdJ?V^%$&VEr!rT` %A:u6PKIp0_H+Fbj5,FXc-0ZDrk9N\EE!t4d\)us1Gsa,Uj$6d8)D0IrOU:Lee9IoqNnj//!Det^_IE!_Pjk;9Lj;P?d.5U:F_lqN %Y9XpeO?#B,hnVY"Cq/,f/[]SRk(lg!c)A1jf)a!K6kMkrj5"9f+ur`o`(pX3!Tu"SF-WB!3!mthP?o>*P.EQj7OJ%8AuL:4AV0^d %m0kOe`2nSd0bqqIkK/&[jt/6&5(PPRjWlM>>FO*RhFCY5Nd;r993tn"pXb`LCrqNs#9=_:C-Jj>T2*!*G2eqaQF\ %EWbX"lsnf+nqGb5gdG&nU9<-16mBjtTHcPA+?*] %H:8']6f9B?=T[!=DOG_4=5iOm[r00/\=5QTh56!Yq@"c(OYlo?S_o#^gC(3WbHe-.%R!d5i1=et(XH&D7(+XBWI5"FT^6(bmD,E9s*\n%u=F,T:)G-"uiXJ=:I`3N=Iu1']%_QZGLID86+80E$K=qb&TbY7(We&FOD]O,C=^'Wa2oqAW:q=.8M6j4$"EA=cFF`W1ZXS %Nae>Eqd*/4+KP-)g^?"CBnd8UogXdk)U]KH"!A$oB]E-Ck[D>X^fc,%Oi?*QCC%X2,h.b'-W)3mNXGd-Ls*nH&TciuYua1=&m\W" %l?@kj#&[-*Ddn(+6NEQ^DKmUsKQJBDVBh%d\k4)VN*j<2CM0HO"FZ^[e]+X97A&,?#'sYt:i"f?.2C<$$R->RfY\u:kCa%PK#?Us[]RCY0ma!9t]f@l-jt-T;2d;QYR[fTosI0(sRe[bm,FA%ZKVX#H`c$H1'< %T3>u!l;]87\b:3o1;ptc]nFi\Ql1.0,REP,$:Ye38F\\-bC#[XfVqnRF)OE]Zmp`RHOVn,;o:]ol/V^^WhuP1@IsXt'==*BAa2*b"G=PsV0bc?ZX! %Jk"n$dNZB4."Kk19(a>Oq]5p>)YNF>NT\F2rTs`HfF#d4>sEGX0,SYckl1.hqKd`b]3Z_8!09qM]%WH>R$6 %A$fO'0iK,W/%Hdi+kr&@g%@nEtFP,`AW\e_m8Ho!T[j"9kYLS4fe\=9UBG/4')I>(N9)&V1N %0p`ReZrQc+M!Bbg!7eUfS\RSB]UE%Dk8D!'0^Qj5NlY;dEg<6A&X"%+'%U@kR`$V_r?dfp')V %#6;$041,[$9('Waq%bCE-FR\_a)YY3->A0_1+hVCp^qK[ZFfrNToh5@RV9>_;.G:PI)oAE.^tjt#_0;+c?X.G;UD_0W'qH!6XhLu>(Hki7k_WHC4,!8W,n>d0J3c;^+3lQ> %!u)0Qi,YAjGd0S\9kdtN?.Z&2$hbb2-)QsJkY?d$3LL2M)cEOMc)`KZ %pi/pX`MuNjp'0i2oN8Ng'2FY+CI.p\NCr?KUMO`&Eg<&T1YKQX%qN\38)4W3^"JVG(TmC0E,:c3@NqbUrE/a&MVO--['%M]P2tC7 %h>CEZ:`S+1!onNUZ5J$_$XE+ra-D`V3pV<.$@[jQ>Wi><)W+Y76P>`o^!e8S/\[[o(=F8ZCp7%K?ESH,+\+>2Fr*\@^2,PQ-U-0> %)Ikk2S$umF3c'[3[QpHc;b*(1Vd>`cZQ,Mmf$se;-)kIV/"_RD'cnc*qP;'[L\1d8i^=>l))3+A"n?`f'FUfNQ9/]ia %/8,:=RSmQ%U[H^Q5K3nTE[O*$8V^qcn,E/RI=6_[>)7FFh/0m3uYFo'/pG/rEPi6 %_>G2:TF0tH*^39HVV&Ut[OhRr%@C77>W-pB9&U-#dNd5oj&hM>*N*DO]S7/?B(LjXG1scI/3X7cc!Gn6pDTBrG4lZr4Y8MNWsP#u %0`KcgXBoQ%TmC'8YgS+4Aq26a:a_7pofR> %ETAlephAdA*4WaI2<^TD+N>\^Umnc;kE,mAc&#jT?3S3NL30Bu1]U5dm]uN.dn5jigB6Dfj53>o%+R&9KXr\pgc!*_Bb9MeL4`]= %n/VNu1BrLZceqX5DXhTnbtBsTEbZ7+%k\i9.to,BofG&#FKNG&[C]p#W:6d-7bH)q_qHfN>2H\*8VK,Y4^V3t6=]:ft8H<)#F*.J9Q)iDBFS&jprN:$1?">]?b\6FA9""p32RlOt*8OI%o'j=Sg^-q0s>,(0qWI0j24.C-Jeha"!j+7+f %8\fjMPD&d`YW_=Tn9[e2!u3+d!,S+.M.5"F!J5\!n8J)*,[Qf5<\rTLcWX:/gI0eucRZ8I5RrK[)V#P]"0rD.P(7%M8(9!2,TuE) %U%Mn+7^+iZ7W(/TVep-r$gjW/+&;_q]Pp238CFlNbqS.Adm?S0qXF>c1gDs)7ErY7?>Q-nsI.t7*4 %OsOb`+MP.,?>jBd"I#7DC85_UT64^"]?fR%ahD7^JY#MENVN)OYb?fn$k"C?_8pSJ=R7;1"3Y\D^?#mDmmghTSCc[K=pWDq03Pei %o_6u3!neiJOaZ3oX\8Vpr9q[,I=CEKh^Nf,V$u=8?\gEHg&T6IT98d1/6NRR_)c!iB_[3*idjBS*fMPm)LLD@N"Tel<9JXj %ENK\)#ad(6)m!.Hol$*lCo6@_VEIg[e6-',.tJ[J/ps0?@KXkD>qh0BrRdgD_&W-p\m#U-,CmL(2kG-mS<@p/,]G:n>#<7"Z%%WU %'\V,m'4m@hBn99V1GT$3(gh.@NZsHCTFbmcDeV^U5k&N6kr*,f6BQ/'!_0&H<C#h"ERuPE'#/dLYZ\(uEeRZ6VmpdkUGGNL>P5bQ2l!1#909hkICM`5^(_V-uT11$5nu %;PD4I4[lB-O%+5V1bt;$XA[Z^B\p`#Q'bam1/Om!?"A>9>2mXk,WqW`DlrJd0Uc5XbPKLc@k!$V<#5&1SZ@rJ-[-'@d>1AjjHrRT %J1%[*'SWU^0]6(J\HrD0IR8KjfbM20IShZ[Ho4$*[+YD^>mMjF-EDt[VHDO8+f;RL\X&GN_RRCC=pU+).(Ibrn$[*1aMlWaiH<3c %j=+bG9b6Ok.X\97%G"Wn@[."24L+2;A3n)r<.!'q=)a?g4%mb$@qV&.MNl)amgXL+Sqa-Z[R'DS*+&ujotiRGioCd-F:^Y+cKJco %`-UL]`]+)S9b%8+p"?>%*$IBq9Lrla!,;ae2K=TB[L4\X_J"Ba92k?slH`XDbVUd^\c"$(7=h>(":.QqC8IA %mW'tFc0MVZb";7'TZ^)N%Y[G0B$boMmRBsYLlZ.C"M2(Zd`2@@L1)rA[i0]U$oK0p%@9H%+dVgYVl:>-npn"I3`Z<(W!.sF0VWe& %*F=h6+E)FY)llEt16ukVm_5]B\"i!UK$:gL$c3276CE#DkQup1YKCPm\r'Z"[-3=+DiD<9#^>rI)jQD)AatAJrM. %fd)Fe[jL+eRp`1V`bUlN2RAR5qnX7HS4@R'gZ`1L%O\ %_C5\B4)p=$T0[F/WoY"ud5F'\5_sR&n"7;!):Xgn(Dh`bTp>"3L]MT"'/Hpu1`XRf)Pa>XJ1(QBE=Q*FoVB&@G('cRcZnN90%qc? %1TX;Z5H9Xh.baa)0nC=7BF]8NKb-3i%Sq%2'EYb8,.:,CMWsUo+;)QfNep)6C0&tF@LVWDMdmPm/Sf$`9:H5-.P#58BW#s[Q>aG, %*bGhj=XB9_0[H.KGH'^oWrOZ0DI*Z=nfVT@iSR-FetJ13K-MjrZ>G157h6Jj8>RbA))Y6i(XoE$h?;"_XVjpob\2m5el]`-)9jm^ %]k1e_WD`fkUf+BlctS_]`oNLh3tn0(8A8mo;U8A.-Wu^&)?X"O&J\o#2Jk'E\fr[A%i.ifo!`?OK!\ZsF+ufM]DH$dc23Xh)g5iuDHuZ&\45Y"%ZPS3&%f %Jl7tIO$;"#=`794$FETO %"]sD,D:(c:Kg_uB's;E%6oG."Za#LlE@lG+*1bkJ4FTU((YplLSJmHoJR+43noeI!)FC.:PkI6b2`IRFg=hT4&Png(?sPkZ;KTfu %/a]kffmGcQ<,W?j>a_Z8eqG!W$tBGTCeo%Kp;C'[BYB-lH5Ms=MUY.kF#G.Q-E8&%_S+:h.HGrZ>E`>V'%!sH'3\NT_3#l@$d%U4o'Pe&s)Ejl/k!+4)/1^J`8KSoc0es*$@]F()IotCCTa+W1RYbOTIuP.B?H7)J4rJD(-U^@cs/t %!I*"N;IA4u`9`)ganuS?XjWLd2D4OM[FJq3VVjcd>.LqBJKMnO"1]B4``iqd>c;2N=4l82O=$Z82TaSn>PA<-1eqo30F)3C*Z"'n %DL$E!`r/5@AG]cU8qmLLn!dQ\,o$T7BjK"-Mb-J6P?rUlISC#h8>ZU1raHn9Kii\lQUjrLq_LFdE>Y#Lusr[T'Yhp"!KIC %M\i`#/"g+CRR\3`o6Y?/LQHlmp8#eA?KfmEf4ro/Q89-u/P]2([":MQ?e_0BE__W_3:CG=Rrrp&X0f]u[&oDi9sr3t=P/6cM6Bqj %M67r*68a+sAFYFj@mp_1]GKEn@?+,pNR1cP:[>ak4[%P6/j0j&l\g$`Qo(i7VlCum4"k-JZ&4KMq2t3Gb8*B9=/P&H>Q3-s[lj;<,h$VHm2ilo#9i`G;Y;oiP(H&XBiY<503>I93; %ZE\MW,h]XTY"X))T9'kXcYc=jf,;muho3X5=hC2T@:3+\!Y`'bku2,b(^` %N+fZSfWF@6)p\-+HJ:&k7Wfs!Yf9d,8>H`:`nAC?`Ck/p/`C3!QL$/!/r.BDatR-RCXa5>mimPSMQABfI--$W&Wu^j]+VL.V^]-W %V`6k=[0qg%bV8haXD18EY;V8ibBeg_.gVKQh^`q:gH*5!pC\['Oqg3h`V*3Hh'taB09oIGUJ&K?;[/I=_VD6j1(&=uqp_XVTasl8 %XUBlEf$9a(d$UO'M]NEN"!TUXH^;,)S.e=(*P0^iO9QmQDg_@_+euklj/jBBc\=qK/+NtjIuNR]Y_G\A*,c]l4O %YCn/7GA?'peMc/R*Toh9a4c'c51f$IhoFnND#6iY6lX9V(JR_)Gik<0Y.ht1(d'i=,bXJGk-it_BGm)VKoOCIjB/0-UO.!SLFYN0 %hg"lW=01WFiQeMFYsZBk*#T,`dTQLJ9Y8$TB`'nGn3-o-`?Bo4aTr]2mXb;53h;\5'g+5t+'eURI&ZTE1'M@R.'SV\FL3[="X2\S %P7Z/uBRFk^l01OC'A+G)H%e@0d=Ecu9L*,[9M?9q@u@9(,5J^VFBS*QJ(qNJG9,PD!>OTct:8?J7/NKt+VPTE7Uh00k;!;PeH20iZ7>,DXE@ %pE4a;L7=::OtJduY*@"D4a%-s*qq(1aTPmF+oU_+I1FnIRVfUY;J\=f71IN+<:RMgW<-448>OR0cf15aT]$a"+Q*F;TM3RaDTIqk %NIg(\<3R7)$IlPf.hStJETG);(0PEh2>Frj2V-H@:/6)6CCD>5on%($lgYCL+;`OW5iN5-?9!", %E,RFNVAC"#@"9ZQg,FtQ4FJSs>aFI:G%$Kt23/IiO:*k^TMqDs49&&en2R>_P?'D!ruuE?eD`?6N3Fnb%&gfM1[;-#I<'LQ;5&%_ %BJi^mMnt?WmMIIG3m='_FdOmt.bA-?>9^a$C58mGADoNX@3Lf/)\Fj[ToaurCgXq:Yn\YF:^Rf9H<;![oF(=cqO3DI\%>5Waj"%8Y(\h`:?"_8a+a#eFUiC]m8QS#P%:UiSkKRr*`l]8ole.!A&_jNm2O^BEYGOA,.gfPrLOc@rs`)'GL=s5`dmU\$BrLJVB*V %7`ds"#tTK#[^=g()2i?cR/>>oNLB^,\%Z'6U64b2];<'1.[*61.!H\OUF[4Z;ZRin%W+8Qo5c>V5Z!bn\%SdWRCupL?>CB1Q1LfoCZ4oE:e@4[JF\HZ!dV)CYpUR[/NJ(I8rP9[B?.^+f&G2LTogq83a_&YU!P5-$SWdobYk[e3c!ub\P21k#,es\P]W?P %'$4E%;$5V;Kt*0C:"/1Q/s$IG_>D`)BT7e:S9^c?,5ng.1aip:$_bnL#bE``V1i%eN1*A!.?-rJ2E@sB\4SB(&[s<'<(UuGat==G %NM*F&NIJNtrJ&Et:Hkjb-q#i?[K=it&aNK8D:u3$KA$\F&MaZ-V9IsZD[fF %\Des1boq:?O/mHf/c4497oZNYBo7m$a*29'F5\N:-g %;eNp"/>/;Da#/OA'X"]H(_[K<'dL?^^S")^59md6FmgU)B"IQ&*tf))?;Xt/(?rXgA.ViX@joAUCirj;U/U4V-M:KL[/2@H):1IS$8(P##0r%dt,K'Y_WrOa1\AAJmU5LI!8u@trO2N![.M1Pae`Zu&W1 %^#8Dd/Op`!&LW\u*6n^k(!6k1feR^O)bitdW9OI9:3*D'LG4S8!%>_#Y@ %7$=j\MaT#7MdU')A97"Z"`u/SXY((c#i(s2nVE14Djo\i*D6L)9F2L#HAG&81MN12J@fqIAanj-3PA^]HPsfgWY,CPMI;BE6Z9Dq %ZQOiT>K+)\,MD0/)3G9%-cHT;pj%O8C %GfTZ.>&I7mU8j9cAiQ%.79ZR8,ZQE_PGOMFSfO:mr/?e?0LK>Qg%=V:WN:fP'F_JO)Y$Cf/\rG7OUbHAZ[A22WNfJORm;mO5<,X/ %`E\\;2(!NiUbK\/=t5^YJ?#m8bs*)37-r$HN"S,gNM?i99*-B,,bS?6[^o"aRdM\#V_O]rC$liZ!8Km-(Xpq= %^f)^-2uNuP)P_Z#8<6&@Y&fi0LL\jnm`'Wg?uf7n[ka=n[V]A5.F[LJ4)2:r#a4]V`1'X-G_.MQa.&/9@5^anGA]9+dg<)h,Lu(% %,Tg,kW,FS$X(GZ<4[gJOo?,mTL"?^_mr%!k7K8U2*,M_/QW=C?Je`UJa9^>"6DMn%Vs6J`I5E'k]n]m;EQ]P7[K4!s]=s_?[FM\]fd&,*GY/.Y %HV=(WT(9\S=NYVAnf[H"W1:@REHd=UNoKqbD%A7d?rHG>X;ICkb(kRXKAfD,+iBB&h7KpYq95TjC7W?#Z$n"]9Hh."In["5H %8jre.9Ae#QN=Q:.L_X?`'Ea+&o3@-JS3qi[$Y11cT;<3Vl=,VHcb5Dn8:c%D@^sPbWXrL(J]47E6eRK:!q2b5bNB$9#*cWm12:FA %?>n5R"EFUjB'gF>7rPm3')nN4)+>8k4k^'"Z"ZT %Akq:?\cB^'AiALh@8ug<:u$#q=Ml!;F`.P?"1+sM\X\pH9pAJ1SuKs@jAE'Zi3F\mIGXPpH3R7)6",q#l[hED[7m6Sm/kQd`@joJ %6-Msm2_IctNRin2jMJhLWs_!A`%?Dd273ZUG7A'M\CqGT0/)OP6rdeCfK'fSROY?ju!V06HGP$c+O9r0A]I:m:#Ep=;ui@,6U>LLBrdiP.#'N3-1joQ",Zs2aRNe498=]n!so(ZMGmUBF%mjiO]CHgEd[, %">@H,V%E\RBiHQdCK/3$#lXW-3bn&OnOa.IZe)mVp^ %q/1Cml.SAch+itS8UZ9)!/Z>F+QSNJ3ACS667O_lKDK+)//P-\CKP7SRKqG1\Kfi=UP2T%dU9[fP5t;1[Ip["8`Ws30`LBqY%Nnf %af2Q(9r2C>&H,Qh6t80VAts#j(1G_4/;Xm\;97lL:D[&ki!Hagf`f94q#tOjosU((l@LnnieXcsR_NOno9==])k1ai<8I>gb^+%=(` %?cf=)'^)rA&g`(qe8ZZ.Z`oTn[]3dPKnRd@mj6`<:bj+%.LdNcIFk;`"Y,9[mFFo9AY.arWOtNA`'=i`i69VtL %Ji?!q/>FB?^gjrmehL4!?0JG^l_h***PC&HKK:k<.^F@d"f7)`e@f$Kc@dLLl#O_f7]iqjh:MHF-LB\se,b"ZK\+SlYl\<;]1?$[ %OO3\R)B[;+ME?YcFLW^'dV%Hf5)F^T&HZ9GnX'i96)TTGJEEXIItKshVFq.;^="RlYU39>\).Ia.XWeP>c/g/-Zq5PS8EDb'b.p% %=WY`=XV^]::BgHP5soo88?)a,fqN1k1a_W]).Z"!6h4t2Y@tQa3p.5WcLGpqU^g8nm@YF5+Nl/jP^g)7\(2Y2"T%XB#R/N1p=a2o %e8YL,fa_1:CRkCjTeTGj;W][8^-jWQ\@=D^P`SND@#RtR0W$%Y;fHl!]E2D-(GE?R!m&+J.6I$\[Y+;0O?Bs-gN#6B3l/:hMTP3* %)#]hR/3AP1:lhYQS,28<*iB7u:9D(dS>mE7=#]QeP&cK';#m[rU$hU7V(j]'OQt?aQ!ksgV_H>aB)J%D %G*^[tC_`flZHjH6TT0&PQ))e7Xi6Ok@?%L1f[+_>Z12BcU!cIG$8u'0\Y*LXHGQC.rPHVeL/<-K\hF]jg1H>EI_a%J<)HPNJc[_X %Y,Z?L]1j7mV)[GOY_=8Z-s*?HNE!R;g^-2u@[SM7bZLojr#C+H5dlCRD'VX^0)K_`V:s;9c"5oiK3iIa.c %-p.8B),5Z%k/,prgd(_[h&B-sA37.D*Z$'pnfWFeP--4=;g+KnSE8_C@LWe_Tuai#!'Ia"']^P;jlsu%>8!Z/=7OF3HpGDJ*)`7B %Xd\:28!eNj46kO-9rH&6ou_Lc2E%7!:cu=Lp]_D4eYQZhTRaY6g-^soLf2f=BH?bko^ofj/p`@nL/RUb7'KPd.hGn6B)@TGp/NVM %`R5XfU;B?_MT?@M+-37(?1h,CK;e5-77>pX\r,AjK*J7u7*Gr0Xh)1mnB4/)QmX6Ee6;J'2cWZ*RGA":$r!t.7inG=/Ktu#]l!/Y %M2<]Wg$s)Pb`YYA,]PKkX<^#tqDDJLZNHohU.(qCXDMh#uTK&1:(D(GH.[Wi_ %J@R1eW_r-/,fB:`,eL;kp0iE"T8VSm1oUP>020$875l[""PG#COc\%]*dgug&ta^i;r&!Mg:3o5A<#Z)Y']*OI8]X"F`.n%,^XhO %JGfAS_$/a#2J^Z):mr)mAH?YE%?IDTWYlb5]'#PO>,X*QR?f_sTdF*-1sL3;:h1tJ2i5>I-kg8?i3X?H>[a1+E=WA-,>g,(?CR7- %9-Y[@Y2?+4NI1\@.U3+^Y\4tE!m)+OOiNJEQpru?qrG=^E>btK!KP2l@]NA3l %8CS7;+L#5hY+fGPgH@W2k2k[:SpQE#E/)Z[Zm+.Xm=L$>jsmh+e5W.pi76(sgInYr9.nR_3,'XD[mXtN.*\m^nD`CZbKN473Xd7> %&;$?jZ%E0!O-?u@\ejJ4d#AA/IG["#`url+$E%#Pf9ouG;YWM]I=RPPYnaYMMD;Br"=\RQqOt0.#0E45eHD;/"mjfD5"sL%"3UmF %)Bl384sQ;gfVDOU5qN@Hl%a/+f96NI2PCp9"L?qu"i2I#r$mJ_WX*57oOd#50>T81UoS %GM5d5Tj*YOm!](M-5uE;$D3HgHm'6C0\,^.pUQF_JO5>&Xiak59=Cg*kJ&4%V;'L/qi8((+EL)P`30Jd5#; %HNqA#FTGN=fBFU0l55(-0WW0,He@%4D7&*cDS*\cd"(35Q(C%R/_^7a'A5XG8K+OF?/E;"kNn3-Kak\5NK`:A%P8T+XU[+M9J4:@ %8/++H;7=J&IIbWD[qBBF\Z60`Y;3Q;\0f_q.G9E.dFM5=Trs-toP\:u`G@B"F`"8.jGM&SKJTOn6c1eBY0Fjkp?+lJ;/9"8,E6P&X:'laapfU2 %SXi6X`LtKn_3876ZpaISTVUJ[4@itSO%"ENS!ac9FE1I?DG6>O^65/Y;H6hAo3qK0VC %Lr_s92A+A\!QcUdV):nLd$CAn#,:m1PB**0SBBKc(?SQ)0tlLSP)\>/f#%Xm %6+KEY9,?r_:JJ"uLbN`hiq*:Y^Ur,FPX43.]2RVnf!4u/P-W.=>@Zof/Wi"kj1nUDe0Q00$DW@S<;S/K^?&b+SWc(Pm=HN>m)%0g %SAst\"q0"XYoD2:5`FlTI@O%9kLfj(Y9$j1YZ8(?Ribmd=5F&3=r"n;fRqVtRUm2GMk&T'&k?YY@HCXhJ3:k1Fm+.[cVS]2;"8A1 %+R3$nScXmsgIMMV3%,SXNQjkmL0Gj]qhAdljXQOP*F$ZeX?oJO\;j1G5W#)-"0$+KGaso`QL<,e[o,!n'pZ3T%k-%C %1iIMfSDsU9`S0c<)J\Ea;E6I#<#S?tjRq00dM9#uN,D/s)2!a%Bfr//jDlfJLcGPdE]]EcVHbK@>#\%P%Q9]UaVqg^-If6YoE?pP %,Fr/??M+dWV*YnPR^#,dap%9T.tN!N>;8d\Ke1kAcRK/SQ6h^Y\1GUDi3LjX&%ePH\G=+lg0sEk/a%/S09f`>\Yus# %fuV5&i^$O(g_u4gMm60q3I`hG%'_4!g8^=e\$PP0$rb-A=\)@OI_#rMU1j_'`n,\6nBFjVkZ9\F)Hh237qlBEmiGdG4q&a1NFadA %*e=u.GF5N$^qR4bHR!/>a",P%"^VTATNX3=L$UP69?T6MD'BC_!Dp %8L"ng?qt;Mfb'^F^/UYK$`E8D_=3I]"ju@C76]eLa?4/:A<97de;BH!iRBBLb;jlA$Wfr0TL^9B%t5\GaU9uXh0q_[\Z]jQC$Bn& %A3\iOEfb^ij^%]0<>Va&R=S:I%9+\lfkP>Fc^:d>!].Q\r3]A<4M0d[=f_55CAuir00l1:aH[PWW'ZJMb:\Xn;:=$u)*)QcSSe6+ %/!ndg:TE0'&e_'pB%GN:'Z.qF]fN&&!&&!KS5b*$&<[u]g'/(DMEapAgs!4`r5*Q.Qk<'=J#eQBkW.29MdnP%F"jY80(W6!>Th9a %>=BJ9Cu-a;BdH^E)sA;"cqGX"bVbINZo23B#=0GFk)44.Kdl[5p6W->0bEUOoiPHGan9Tn[$p&KHcGK+Ad5B_qNQ>ZFq %,a4p"/@_8rcL"*9B"Fmp%=7=R*U$\ON[ft"J&Xs=WMWKkWp1SE>ENE4dVNEaMj8q86`LbUk?4VkN^ %'8P]9"n,7D5+>0F3(6.9Yhjir[7Z3EZaaH0)l9,bSiL%'(M;\PU'sdJZImoHUmY8lG7:2'+EM`W;719mXbP$NGdYf`83n1TNgeE^ %WNg'/.`D3lfbl5o7U@Qs]-s55NHp*Jo`Eo&'gUg(ppj/LOZ"CGNdA?L0Z"3`1QBt[Q"e^BUl/RQ2$H+$>hJrbWL:t$cmt0elkP\/;Y-U@-05Ol=$i)EZ0\_H6m.b,+aYc`6uAa$U:=LJ8o:P-X1MZV$^FCV %)Gr:f!%n)A.mXpPCKlqDiIrhqf1/SCS`++Y'?Ci'KbYGj$c1iSXaAVSJE4"6TaNd\&d\<8op[r,Nq[Ns[n%W1",cO3Zoq2fb2=BMd%e;-nj<\/M?Y\c %l"R`,=rc1.9X^6A"#Z^WN(GGaG,3:-BNPEec4#QZ3QAY6NOb?l#&5ldIF)Q32:K%`C;7PS4+!*,j3fSD0pW_MkPB>bRX>QbI %B_8SeOaUp<7LFY'jt&O=JhOg6>/thh+C'.io/n6E(UbZkZOn@(m_;4`aZe,Ctt\4Ofk%&j9XPA+OjCM!&Ze- %d"&M_MQo+>/W'PVNO!5sj[*M+Fg(8!$])J$bu_+BR%1M"651mr)@=MaarY>'35&GR_J;$O?4#54oXg+>Q]/21];inL@\4/A/A^/lsT*gYeGS)LrO%`ld;Xi4b/W.uX#'a=&<]VaH3-gRV72%X?Sb$-12kSf(r\LnQ]PK,1=AY'd5[Y^/]oWDi1\ %M4,L`_K#!3]:a+5gc_UV(es`r:G1\,:$T+W>6tq]nt"&E-B6(QbdU"IeCP %#3)YeYZ-C\&#MjQfb]0/L!ciJs+6%JHU!/3a9RNc'4UW2lEq]i"Y55KY4CCLbT,+?+F;R.X/s5DDjIaf0,*/@D=p3ui3pI`f5?Gu %e[$>.J`B^3L:>-#r*[R&\Q*LKl/`;eGd:Ba5j"27ACf]._C[#r>Is#W>,]2gl^0Y3M.bWm8p,_?^.PE8,7IM%'Wfd-<87"bh*2.e %5*RFdHZ-='Z^"p^M)(5#hNS[[$^k%_Diikio-q;I'/dpbq/$CTWC*;1C\V`!>je+Kj_Zqi7K(,=2Fj2#V<`)j&2)Sqee/3PSg@sd %lA=U:AMD:@duh[E"ho5Q^kuYV)[gG;phhj,#ok7^K<,,.A;pbUOaEL$NR$!(P3A/Kj:72T&L];rcd::[XgE9UCDk:?+t+C_mh*oG %P8q?NXZEh)mt^G2KQDBk-1%3Tj^VX+85%(YokbQVVC^fFnF%Z5[lQj*82cpj,:)>5[V%p_CV %.eB--7:n@d^>-g=]"X`=Xdg#k>)C=g>CLQW&'q2n.N$++9SAJ5ob`f25=o't!ZdT(JPK"oetr2-4R %7GGt\@#]T=jI7k'>.j./RSG1G^p&oVH:bn/W%An;b`M&u/K59?d)3EU':bgKLShg6)f0``Rppr+[PG9pj_BnQH6W/5n6XUflkM?L %@Zjit5[Aq7f2kpFHRI941L,VR#?'?!mp-dJXZbHMjTU`ch"f?OED=R#5?:5B!3%YY]^Tee,e!&%]>J4N>.2euHG;Qi0'k]$_K9Nl %0JWrBe;?h7F028b;EsQBZr&?\3<>]NW:mo&:LR?$L.A_;9h$^'57,m+KhB(u[`E\^-+P_^6(Sih8M1$D50AJ"FbZK#+]Te-,Xaii %U)Ud2*Yad)S__!#2!dQd0!I(.CQ3\UpKJG8mp>t$CJW@3k#Ue:!u/qtYejj^(Js'7NMQ?u*9ZYTBa1;%3X+sLJo1d9@7*CQ6-GWD %QV?)A8K\+(NI)E?on_:tgV`1MQ@ug:.]qOdin?qWA[0C(_6h\+XT4,>QBcPZ,fQQ]0>t %)VX2\2K+P2"X.SM&a^D*%f_W2ZA.^,_+:SB&.#@l7BD>N@b6liCjS9tWghUi88oIaK'(4)dYKsU1PqR:i`I5'YUWm="LJk4g/q-A %*HG]2DG`MfWK7cZl=luZ:]YDYSkBVJY0=Ks7:!]Aom4JZ&<(_p@-L;F@5uWtKR#n*@ZN%5^:'@30=BLhpYt(HH#hFW+"-0eZ2"R, %.0]CQ2Qfs=f&P>khH\IHFs4GU)ra9>aC>L[6ttEJ7.krmm"+FoO_hPe%%u`fCD#bFX4dGdXfP-);'Yj[gBH=-RVu@G:qJC#-nCH) %)/!JoN(b_8R3p^,4dsuDUD?K[-CdFV6>#pNmGKUYqo)8"bu9i7`b1sDU;X[oQn^7"I#g]geEoqle01V=KK[^R_W:5`5:4#QQ:b3M %=^R[R*AXb*pfF_E[q[[65@[Enl4A(Bh(bS8kIbCGlS%24^iWUfg[nFKb'9/4C<%S@S.'$LkCjSJ.^.VE[H@Kt %^G*,)[j]gNhln`p;lmBCTTOB0E@5(!LU%m(GR[D*.?0Nd90&sR#=IH#l9Gn`0BAZFG.QqW %GACNGM8"&/JHGH0r9,ERS.8Ut_?>B+X3&<8P-4n%I95s(K.LS=(go^1;CU@k4*+Tjl5=>XJn1/_5\(@+`Gbn%S&66D6,Sph5qF>0 %(&lNZ+[.\.`;BiRnN<7glI89-ab3WQL9d/_GFT89XIm(`gJG6lo+tpP9`e&Bhtq(6,:/G7[HJmXVN[bg-Ji"`d]V>l^QSWkf:RQe %rBG[Xs8CR,]`7Q7T5OWMh&CkBS+kgtI.I)O@^ruKk2G'5IX(nCc!UJJjgT/H*kqI8mADoCrj_8Y*r/]\Rs6H$/J,f5S %pV6[cqfcD^J,>;aI/!MV^\dT"\)2&sqi=D-J,#)n^\[n)%tFN>*WH)*Du]J&HaJ1k?bZNgT>//:rV'ZJpZ[TToD.q60E1h-LZ9Jk %4oT6sM>Eht^3l&\KM99%^\I''rh#7$q;96#^YY3EJ%GFts"iGX,oupOL"XKr]/5O2a./0F(Ur=-+@8I"1@CsK2Cg5\k^HEI`7)?! %rS-."hr=TV"(%Gh^"O$tGFNUBk4(YfVhU(:V5MrhJ;HMEX_AC]_nNXZ'Tr(7duUk %IfKDjLUUXHr;Z,s#IIN#Q8\Yihh:Eh)5jCE=1>;K^jn0iG]HW1,Y:`@6'0il"Zag3]">7)5I/lX_3_$/P=!+(uAI %#c5UK;cC7N+o6anh$h50"r`(1&rAq\6sM5A)59//9#\e5$Nc5BIT#S)%I(hf&7DTF+GC'i8(5R(,gnGY."Vq]q,&8$$-Yl(KnIE" %!/rXDV-Q.,2t<[]';Jj-Ko%O-'*F)pEEbiO@=mSZ_]Sr"7S16V>)3Yb)6c\C.APA1ri^KRQq.I>_BZ(f<.p]85eB*L1*pV4fdXb% %Ro/,bLCaFP5gP#^SmVs^YGJ39Rj$7QRaV6$TX;)KK#3E6i')h*4sFd):C5ZcMiFN %.0(eqh)d1[)penp=OB5>qA3jDjhR)FjWW%mW>p<8AV)$qdq:[t0_?e%?h4(*L&sn1'FfofP?'-.LQ_$AJUJU/J63"s!MS'3)2(IX %RgkOVA-*3"YAjWd6r>Jg<,K8ZjXZRgR9IjGNG:um %*R7_?Q&A&8(3:6,0mSQs8A3b%Z;!l"hA^FiRJ\\^Wsr#OSk&#r'+rl#Xs)EAVAL>9k\G4^5[E;ErKsAg\1E<,+=o'B&Lp@d9ekt4 %/9&?G]:7W+QuBco#VB0b.olp7#l&!Y\he08=b*%l%1aoW9cALfL@#*CJ8tAZKWU0(CK71s4[_l\M?+@;Ss,kl*YGjE(%h,RF%a#N %dT[UC%IO_N`8)KRai1uL7ghc>f7Or62B73^T-C@G]`Qai,=<8Vor(uB@k($_@j61s=s"6qV&/IfI"E:V)Z^tFVi;tQP)>72&CeOZ %,8B;+oYDL[=[d/f_nfa=a6/8?_d/E]M@c3F_%2.ONQOWhh%(bB8D"T-h>hs`b5)+-2/n/WSH:c'0+?:2)Xp-@1F %M1IBSVk"_Kgh"%!KS:dqJ6d>oP!'YnN&8p57l^OTq34`41IHcS`,*juE_L6!CIk0&BsoYLis%g)15=Qm2Qk_fL'(0RbU4rZ\/S#8 %`SD56jtSPZjD2h7Qu&7-.Y=#kS)T_W=kD;Ul,ng,BIZEWLW$[D=njPp-[$!$Ce]k8+pZl6F$8H!:YoqDjW:[\W==^Z>T>r2mp=oS %;_+o^%OcEDoL[dP62qL;9l^ajH4qBfo8X4TSe37'=$Y)%^6/1c%_Ak!3qBuq3kB+4]7>'\Jmuu9c]Y`/%!=dgXn0Ld`6noS(0Dr] %<3`LS3TTgS:%orq#QJOW$q&gT'"_g'4dt#E_^&[U]CV,_S7B2+:^A`Xl$ND+80OGl'7u=u4C`"1JsF^)E:Nub*I.b;3<^\Vl(^;e %#\De1iqrn-5^893=ou%4`YJHBBb_=;'cMFtO)lo0c.nUKZQTZi/Pe!OY0.`:Tc[W49e$=9F$_FK@NCh8 %=4dVRYY!91RT8@PQmNL?-F+ae2:$S>)ogKcC8J<_e5]e_G.!MjGXY`X)j`:NiJPDj]IBm3)Cg1gAo %U]?Z\$6LMAiapD34-qfKPAL=PB;W.C`\o/q!WF8hAJU+EPb]>sn6G&E^dJR(GsZ['P[n5]CU_=m@@J,kI)unNgEVcJ<-I@cgKAEk %`8)ch/+?(3N\*U1\(P!n-(h>Wl$NZ7;gUaUcJhDnDA;&OgN.K%h.TER*t2B1/_Kt&U%r=nIt5,g%VJk4"a2e1:mdadhD7G*$=&3^OKEfE#W9LM\5t"`=$J %:*^`-g]EmcrP[N``)p6LX$J21\9G4maF,E'-KtRkF`\TuAFHeQS?s!5^Mmf#"odF6J#@NX@Bosn&)n[IQ\.;mNL5nXM9R:\a`?&3[+=9tj4N18clDp4[PT\d8jO`SqA8>TmTAB)ZgkDo`$afSIV3Bjar\\1oZ?N;@8L&'jufs"$DEM/$b7Tn_p=W7 %DV@&R]VN`qUQ9/R#scHL+IsM_M:u0+W?l*'+;Qe6NZUS4CGQQKK3/,-jt,aY9$VC)^s[G\I#'s8-U)TDf2cp`Q&[P8;H=8`D>%#e %[DZ=R>]JK?TU^2Z)PUJaM%rN@"L[noGn.6I9_fP>l^lJA%,CV-$2OFK_s=;@=g3;d?[[@^V2]-H16nVH[g7b'84J@oYg=Ae(f_[e %)X2;hVLFXr@,8@;d_-QK+ZX!h6V4h*'8DZjnnNoBEX-B7P&_Tk$mk"MedNkdPh$6hjhac[Y0,_*)7msJXpa;_5C2+6<_dk`fN.Ec %bq)rAr.GZc>lU87Y&mGYG5gVDc$E9\8[1obeYq]0*#]1NYn.OH0:SB9OgI$\6co.'p[@qG!'uhK'8QCQXD+gq6,MM9] %+\`SRAVEe)2V&5OU2@^]hBfF8=6LK\!g64%@]*"#K;*JZ'8;<%(5@?n3p(56L$B/0eq %PrQS,!)r0m7tXjAK-:\['gG19?sDpC8HX4:j!b9=M]ZME^bKuuV*W>T!LX-_dgjiKn,M&#$Jc_ZP;/6j)^u;.H/]*R+Qq4nR!t<<%gQU$1[c.(_4dck@'Vj-XQDNjuEb?6n0m0qU5.F0,3ut5S %ao^STf_/mco-@=&&FXc`A\epudI""h/IRb%p %V\nANJbUcJ#LDEMj=K?DI$UCT(YV(5%L"!Y-))L`6lV;Z?[=lpQ1U/c)tp7n0r7mua5C%(eb(r'ct.52Bf8Pj'G9i1aZ[L?at[9j %8K]pV$>57501oRYTQKk+e<3p(=\7U2Q7/$`6V%/T&UW_3#`#'e=mtYWp?B90KBmH5.a<-@>\pb9&J`*/XPINeK=WOCD?\#c>>EF$PFlg0@%?dhOTn*[fCe=Ic:C\qOQQ%Yq_WXKbM! %"@4J-Ae%5fZZA';rBe/REWo,7CEkY]S<=:o8aDcI?WtmS*J8*iemf-;R:o:-V/=f@(%,t9km+"6psP7;D1!XDi$j&JNU28Xm+*?t %@i.sTdZQRM*-*hRq@9IJN#5=Dh#bdP",iG\ZMNkb,)%,WNff)0bf%0DIB\R+Y%jB]ZYfF'q:rJ[S3Su-)B5DVtXDepu:Mk+hLb-Cs/INT3C?Z:5%I2*4 %J8T2!K45K/dkMPB^a0k&IK&d'U\Ol8GHAQ/!`>0sQ0$#lnKQ12%&`mfY,]dZsm*A9AFujB45GO'X5' %6BfsHX!iuV64Nde@TkA"`L6eEU>#mG:UWB[&-SMtKT;`rS"hEb=TgM6ggE[lM1N?oOPg>tVE1!XbI!_;JH+m"5^56JGXT_""?armk$H4V+o;7U0l+)Hn/TJ.CW=CafUE3*_2HC>.\VrUYi,'McY1 %M+P'3?mU=Z(h_!H4Sm<9/+Ltg7_>3Ii&j*'P&/'\\D&KKHoFAlT2#^#Gr*oF5RsL23EYerR,1g!cA"Y %:Gf%H,_3/>:KBid@XnPTos<6?#<\i?ou`B5U1:kq,c2pT,RSr=&m\M=7tjA!*:%rkoW5)LPUM@"m+29V=1a;$OB)moOpPg'Vab/e %6Gti@&B.1r)qk!3&eb"hg6;\Bp_'c+DGO[;\%VQ)QB&,mP/YV#`Qa4m9iONaV+ED`ai,KUZ8ELYX5e1OaeTnHmj=TUqDoetLlP`) %Ur%-RHE4S#WM)/ADB.**!J'!"MhbaULCKWelS-O6)L[+VFVOnQ_W5jI'C39'V"7j""uL"_NA`hc%Z\b!=U7X^8`>"r75JG)EPJ09 %#O.N3H7DKkl%3RFOmADIBIdBcEC_]&e>ECn#rW?Mq\$\0Zdf[B@V+4!2n@tgm6KWZ2e?6W<'q>haOo2bb$V[P9sTia:H-f64\JU5 %`gfZBJ8PX*r'>>r]kjTYV0Un"@,rj&u]S",RRV&YpVDO<3PamE[u'#BNN:Q(qa>pkV,AAcHS=09Mu920.[4G.1:bA'D4m<=9?KS %Ba5YNCt`kHTIZih!q#V)A1@(7MZ,X"o#fCd@#>_l=@M7`@,#(6*%;=)qB6;I)Bcb]:0&Vj\mXg$1Dkm5HAROC4ZA,pKbGtr\=F+j %i-.f31bo+IbV#,jpn#FKLd['>UrcA+4RfUH'JT_mKi92-H)ruM!Yk*bC%1]?@!tl6A(3QNMZd#tlOg=r:\$k2&p(*G %H58$Z4%/okAfU^Q[K8/#r+%U(gb\V37gEY1O&b-O)C""'>s2!]3e8lu"j<)C$"m,.CW9PrX(W`])3bY4"]\!LKV0m4hTlR"5Y;.& %?8%T^PPj)\^hqRn87^h$aC,4;beds^[r!H-M0*u)CCo]`?mS/J7346c6a'uB"\jQI:n:eKb"dg/_W<"Z!(%"5kpDKGedu==<@,W3 %.U`[#94f=JoieF/,pgA$A/Y_AJM]BC[LEcOXG`9C%D@eME+7UU1&sZe:DC;F)%Ird'>dI'.\[9TjC.s:q!8OcBaJCX&Fi45TFtg\ %>$r$9h6Su>#S'uX!oXBm/TWTtcGAGW6p3;oo7WGJQ$X?hUIf][nml>Z]VC&OD^AKG4Q-+ZZ$Q3@tAaNpPa^FM1BK(Pd<_H:]S)3 %4drH@VS`lMk0kTplqi;'/VYd2/f0s*Vo;42A+k"b+?Yl2oUnks4\s";![$fS1(/f3p(ZpUGlrEq9ViSep%u&!R`K]dBQ&%76,N2_[3hS0r:UW=uLRh>8$CuVQ=\\9KYtk_6^[fHgH8;A0MNc %i>W+TmV=j7PP*lSe/_-(+cs?snQP-6P\r_j#V$'bA/@lu+b9c$B(?YO6]ZeR%VifcR%e&o(0MJ0FMj=_2hjthNq?dO:LYLb,Q.l/ %.j]s]*3)Q4b;cFT;8\@,kkL+;I(n=IQ5AI6:O&[D"VM,U160a@4J'Xsjj,j&oJp-#^DYd>.IX`A0P7^.UfAWLC`mX[iuXK#h*Cp] %/`96o"@>`Acn'a^PcKZWa9>]LT`eOK4suEN`l+Gf'1i62(/?(YNUV<*-5.)tS4+j4+REB;4lV_PkXE?N&3p]8#a=\2Doq6*5_2*K %U*Y_2><6J`KuT"k_IX^b@2dS\0UUCKjXEN\=&g*&!)I\?TloS@/3IWiR%0PB80!@O(`50:'F`$)(nkY82DJcf)866&qSX*j`Z:uj %ZQjMKRgIjp9K,ImBKWS3A$`Tm-%$.nMLsb+4"Z@Y2:B;S'%"Q4ZU.[V5Z4/7NU1gM,T\`i-rWd-^8FoYd?6#cORQ/dh$?AQTh@b0 %/ral*d52NWUAB+Z)[!2hC6<\nVr2:%q,%mWd&LV>$IkP4DtYKYH"SK)DS.P/rAY)66C)q%_FI$1 %.L91>pj'tES:\hM;Ti,m-)uua8lV9d%DN1\A!uI&_U?9l10$So7`KIV&7lh=91VKg,>:<5Y#0&*&HV-9(+(CUlCh3U_g?.],W[j5 %j%@aEIB`9%Ra/&a`glQZjR@7#ZcFN-_2@i\ViQ.H`nE-Dhgj.tNJEX/8Vj84Z-WF48*Y*\fec(lR(j1/RW]C4p?Ag8[uGV=KIbae3!58i'7P0;KslASn1;kP,BJC]"Q0CoV&_\A_@UBkgC;MWN:-B.\1_=rU:gOn+F*-6 %d$.&*@43^&b+<>:]HfP$CQbS(_g/Hl6AZ(7/g"qN!FY#Fp:ujP`TQ_1Ot"H4J:^S\1LR@"p(;F8Ncr^TZtO?!UtZgW1FO@ %$4\.8m?!!`7J)(8#002r:insEp;d@'ZYp8r<`<_,=\KsrROVR*&kuUh@YniC&/l_Uh#L#Q %?\SVO)_5>=)]/g;mg&']7BukD*XbIB%YqSe#[o-HIV:(O,%>MX*4)f*q)6kZ(7I!(T]2[N$pEa=:E9Y8b8c0G3K!jg-Skh<+\NSb %M'5>`0pOZnB0DjUdIMK8=.ZceLB3BZ%gh[bVZi2U=E$Y/"S3old]O/popWkU"fu+m(g!b++JdXM7"i=@I"/f:@-tE)g3.JsM!(HE %S_3\aH6O&/;9]m;CLPplADikX6G3Sc_($ZKTL5C$h8c7,`(%a?qtB^-'f2fk=h#'50Ip*],['&M#'<[O'2QLb_bu.<17))G %?,oJ/bebbQCPd>P0bd?p3&j:]HRiXSg'e`nQ[B@US)Ji4J?5O9@A'>*MFiL*@/704AH8#lkb->I>sO)AQ"Y>J@A+uI!6uSbdc:`l %?!%)%]U85Qi'b#/8noYUhtQ#*JP)0JClpobs1?)HIC:?ha"6W'E-7- %OqnbN/Cc/\d0g-%W3?'leLL;HWP;eZrNBT!?,,IDrqA)@Y(-;g?g_5"o#p^]IsLO7?iO$mqK&?^J,"_(p%rFiIcqSo=2AA-MA?&# %?M/:-RWYV7J,CU!og$pY/Qt%\o@P_dY30T/mFnC:eO%$dWu`nNWqW08frmR5$bXZ"fQ6iOTq,ut!q1H2Eq\6$-4K?Bj6<39>u"GX %n^Ai"h7if>5PqK&WgGqYg<9j*Ref8GX&;COoc?>=qWP)s7+V_%(d*)`U]GCur:uiO_+G_<:7XF$Vt/k4qllEtNYT_SJ2hY@[Hfd+;Hi0.]I'e8+FH,Hp`jE]oQr`"gNhk)ZrUT45H %W7IVjV8@N7q@C@;M(a5*H,4lYrdO(ml?0,?r0KP7rTE)9UmKnU'ef!rM>cZo2/?96nhf&!nR$d'q0g"\Z.=,!Rg,7%,M0Zt:ds9iDkA[[rY>1!bb%,QAZKHi<@V"Uh5GTl(/5n#U0-Q=p2oPf[B"uTn?UpjV=Sq3b%a+dn_,Ws0,ge,-eDWJsKbCSHrQ@HS3s`J,eYbIFE7hX5_lL %TF#P/rG#B6[!DZ(L')$?q.O29XZVZbI\g7P-/Mh2o@U$p)eO<8e8([l1M=`=;73PK?8X^E0SO97T"8IcdQ)Lg>lSo;VCYlTI.;m8Q1MBJIe.pBc78A8dVgbn\p8c)MD=?Od'KieD`\p2N8(6h]Mg-HgLIF1 %Sb0b`[EI_C]#.[eIJ$#ljASQL+@,4f26GM+//m3!!g7eRKP2^D[&^jT[A&#]iK'NMF[C`p<;2otKmC %Z$65Ne^Lj3Nj4>s5R-[r-"EdeT1(?pn+q3F2e?L5+6O'"8[Y8gY)XH&goMt[),Ru@'AB\qArqb:pVNI'*_;qJ1Eg,u@CQIBd#G"D?jqbf.Q1U3Nf %3pDQ4f>VA_Zi/]4ncYu8aL+OAe%9Y(*F1n+Q0L@_p\Nh6$b(&HffYt>K7a=H!qCaoA%D3dk9s1Jdq3M?dEaSBCNu,!#ZXTS$n>@1b?2M>1@^jX#TA/KGfnB5Ta]IT\^@9t4krIk)e!1ueo)#B2(\c-f %W:Ko[_bWFu:D7\1;Z*pl%:0KCa1"+RgOAi3I^/!N<)e2@ZbtDF]5hgq4Leg+^\ZT,ap_R(oEKE*O7b-sOPrBmfH:(^Kj)`*AQ@/> %:rUMa'tsLqWQeA2$a]g%`\b\8bq:*o\p.>CGZi_/f,T_*FmJ\^l-7^opon,2\iJQjBcO %dl3o1PoI?<*oHe@W$V_^$OUq9]+orKWsGW,KWmVPFu.S'Q$_oJY)c(0Ng><<_q%'l %7NZm%p>IBmW;)rp2&j$"7]qY&UEe!n/b1KmKOiqSMO]5k*Ig@aFO\cl$ohu6;O4Ls((Dj]CMD>?DL %[9BqOqJ)-p`LQd1#7c0_X`bcRFF8#I3U#E7`/c]p_GtF5@:`kkF?/G@S>l?26mIH %*7h`I.FkjAL9;.b?eN3$B/)q*d=)"S1W`+FIQt>c@f*0bL@S;h)ckW=1p]>N[8"t2SK!j@kM$6b[-B_fbhHE02e:@CDn`jL4FI/2 %bPI+\oVnpsT,kG+p9&(H=ZEWOeK,*AT;R?`HTrBKs!c+"AadJ64)3Hcf;RGP`:u%h>*W#]ek./NLMhM,d.70LEu+((GLNgtBeR*. %n)M6L;mjVnaWofbl(*b/cmn?moboa$DsO]T?[SfhRmY1k*7:mK1,5Bh\7jc2Gh7fRpoYuZ%pH:!eFhn7XrL\1Ug0ofhbSL1ah;k6 %j,DRAMM:A<+#.AP\(WS&hJ(VhoYe$5>A1X"RZk1M(%n;FV2@)Lp<``B)%opmm5&oq>B!G(M %,F(:u)*_P3a%E?D?Q$.1)P>FOl;rj@MDQ3aCsSM;a1leB`LtYY<9<)>E"7l1S#%IMnX!NE\?'&EX*LDfI-r#Z#co"G:J=,no0JSPR$>>N^4TCS_n.G-cCYJ+Ja/VLVs_8k'%DLiZm!bO.AIK@+2VOp1T_]@H0lPW\5==m.'?7f5LVlD5t=O7s!4j)Z[6i3I[\\LljA;V@?Xi %^:=ALNDE[ETC+pfjmorlhsT=,s2[3hE,H_$e%]SUcB=q]EXbE$porp3Yg;0K %NZ7]7G>!9j %V_2/drVMM^@s?_BG2_eAX'4619k.mb2i8rr_6%(%="F,N),(id>s5T.p&#\k-dS1[nRl3Hhgb9RCROWif9qWei:nq]I`.J-K:9Eo %C414cA$qsI0-&`]C]!grh]+V%lMQo(__(hEl6XIEPBHasSipXMUU]?Wr4pN`MlrON/tP:Wnaa(,\+@=(];"a?VOuiga1o)kg06EV %d9lQ?b8FOTXOb'ld=.nmjI.t(rD,VIhCX0t=1\DZhd*sC*r3LP*r_s21eoOmIJ:'jb@boLVSDDqVGfCE]Qs66npB1V]7"jtBR%j- %[se/=R2oeqLmP\+rqbX1ZcN/hrV2]3IE$]Fot0\eYFk>sX;b1[[e`O`iV/P=CFAjoqWcg6(X=,U0X[=/m!H&6Zn5q]f>I0-h7Rk/ %_UY-bYFjT00t'jPS`]COE;.D&b]WgLQAO/aG89GMo\7,i08s3"[nWiq^T1?6:Cj=@$N<*1[FnOK8g%rPS %.g(77GMP6aWk[t(.,"'Q"$]j+hEJVeXEKm3Vb-c7Y.g$FEUWgAmGQXAIW*iaeE=Zn=Zrj\HIihTVJ\Tr=!#QU\p\J:]J`s^W&3kI %_`q5caLun5je)t7gtQ\nT(>0J`GV7BCA+-3s7K@BKQTe6[Ye?SY^AiEA^He1\T$`"^Z#;1]5F.k1qQBaH(Ip8/l1;KchXtEM+\T9B*&"pLiUH!K,?gD_c0QV`LG%8+o[7*WkMO"" %k1^=Q8$l%,JI4=S\mXQl$\-^`Gl3EEY$\karlg5:qmNV23dXhuQBdBjKgaCnB?S!Yete!M^>/8' %GDD5!4)sQP&!sG(^N&Sjm>PtsIJ_TTCR:g*I"1(D*LkW^=>FZ&c^%RhjZ?A6;!B<4#EP@fki:d*eu\ah9=1IIGFh!H-N,uRqW*L. %L\C,jZu4DAMs!bR3O&B"*DM!Z?I4>>h]i&f)_!(.7F)$9C8Ot]4-HshVjk('D_4\t@+GTLU/#[.K\h")LbfL;eFSWlE2qB9hs %]h>4'I?d*\pS:$0Zo;%$/-.Xa[L'qgT2`io+Nn0,=2BfW6];"7^k0mq;*a\Q_d>T*SOJ$SaRLLTALL:VgC\fu&E_:iAj@Rd83!?L %0^"@W:'OT"Uocth"t#RU;=k$M77?SeY_8MsWW5V6nk&T$Li^ %%O;/[i/W,-nANn4X]Lc%Pocj5LG?JoLhJ28Q*$3FaaL_;j[C&eGr'V:?]1Poeb$Ob*(!OJPo@M,j?0`@`-SbIqZbq_;3kT<*@$p4(rOl43d/Rh+'![M4_,_%&Ch09]J_"j^T %P>kJe8]f..@ZtQ7/='q1E!k(&Gckm.AVlO#JS,%*ODKQr'J_`c:fNgJCdd=n"F_'5Ad*o,&+u*[D@5AU3F#Z*AWD/2TQT8IC,H9I %f`JQcJ3D=8,pLhQpbhJqfQ(6cc0+$e[C]Yd]'cKore!GF;O(((-_>-MeiP;W4Sfkj9[\"<:sq %-#uZ<4L8uu10BJKMFCc"9[&dC^]bS\08N]G[:tYQ9Pr9e"_DQ*jT8P[(C&>+a^>.3)KFQ5'a7.[R)FnTPsoO64*DN;0JLJ>KPX[P^D:)(n %G_q+'5k]q+KXQs>@m>r5-f9XT4-r_A\9,4tcliiBoE;/&H3IQK5\MY4S@icnFM&Lks/nIE:,K``%FF26l`]aLM0(03h6))7TmQR+ %aXHM=pUXogrd(!Eh\<[PFD,fXJ`/K_%=J-2Su=G[C6-"PAhlP)mep!?mXCXKeTba+Uk\X9`/D=l://UmmrC9*5HF7dL$TWE2g&fa %]AKJmbsi5HG5&W@X6uXPj\ik>hlQVRRJL6F%C#"#Pcb:>+LYJ32p %]q\1M^it$7meDqm[:R^'`* %cPF!A59>d(%^]BMrJOOLnaEptkMG(FSq$";k3L@359;HhH_SBaD>QNbJ:Dds))^kZqP!V<8'Yre"YQ_X]a-7T\`*GAdkKdTk,N4- %5CA"K;gulu[r1Ts$@b7ANii<]@IS1d5B1MY)ji>B@d]6#pjLkFIO-ps]6Hgh[F"j^+r&2G5C.cOBCYFoCZ2>g&q:FNRek#.0kikM %q(KZa4RB]'Hh"]Wgm=M"HZTDg=o#rWEcZ_4.%Kq7eiqB\[c)/Uf+n8,@54W2u&b;Th`<,?di`;8p:%D[/g,,I75tD%So^)=A.$)D[*%9m5EhF %^&:qi\EhZtDt;[p2/WF*pY$(c*Vs._A#YM_/"5b62`LKT+rJX7a*t-.h=PH[p!=aQVd,eHVPWu?,#$C\"eLOon,&W#HiO42Uu9]Q/#=0@9TZgHHpJ!lSa$$<&>tEhk%d,STqVae3turh^^l[ %MeR80&ifN[[q:T$PH+-/WPelt2Kq`hZ9C9tH8Y>VUA`u?hND2BA(80=2,^R.?Vf2Kke(Tg/MhJBY$',,CQ=fIJZDXdm-MG>V7Q") %[se"u%W^?3q,2Tn?E;]ML]99"0Xj9eb11iOI+6,^m"*nd://.QN_^X`+\$=hAY4f,)GQUGJj4LN&Yl(tlLd$iFtahYMhG=3i[5SW %QG%=^HpGq5T/]Fe_-\-B]E(7eh8!"7254%:m>J`&q;UTJBWJ:WhNl>hjT38gVaPHZHI^AAG>Z!lX3#nXZfh1Mm8HN8q/":eg!aA`m`C7P>7!]^JDV)3XT8u@jfPB=eL@pRZ2U)7]Pi&nH"]R4H(o(9l7geNRondkh65$)l4I6+5\L>l:2-D@jL6V01U/a %T#t5_>(3)lK@CQ5k![\JQkP<_p&2%YocMr"]C?_+pKR(Bpdq*6bkp3;))^=/Ki'\AAK+'U8k5]g"PF3k0HdNCU&cQ1a2jh+?R1-?\*=SC*1laQ98 %ZY-JOp?^YDD>g3f4ko+1l/S7:GOF=o(L929GA`r[AGJZs^H8Q-:?rfiXd=u!D*$C[?.(\EkJ+.@2dchRWC!nZM,D2"%2)P1Hmo6e %U#;/shD-)8>B!:0!X.Rq!s)@/rPBZt9UZ\[Hhef3o@Z._iR'Z322S=SoIWa96SkQt*dB5l<8K/=RUKJI$o((=XZUg %/PBt]E,pZ6=t0B&HseVG$d`fZ$5Z%`'0i6n,kN)%eX#39inLb+c:>Dc!6D"qqUMaJ]$quH)mQ]Tp+sTsO %[A9%eM3S/0(_Sa4Mb#"J!/)C)Z=$+Lf4Q:W+`WIp2'bHu6<@ToF@/Z`$f![W(33ua0_ie,!dtmqb'jHo\pmPCfjSFoBPPj9eSX_@ %+S8D7Of5.c)cEgkHAVff&`j?Z-tEnq:^*+k\;sHg.DQu-8ma!4"DTFU;+o@/2G/?))-=O0E("&aeg9Fh^u[9N+&\+"OST<=/M&69,Z8LDbrDSi9b.SJr>M`rToi@]Q0%&p+qA-%KAW_Lk5]j]NSWe]229Z=/;Q9<)5c %M4Wg-.n+lU)@oef8[P#[WUZ05W%&"(__`3djTH'QJ'3`gX<_Am3qGN`,>mc2kQcjqJNtN#UVkeeJQ,YNobrVXFaR(q&TYr@jQA!Q %9CV$^<%%dO@Eb'0oa2CFbidgJQ`=VNTV<@'9W?f8iOi>Dt^ubC71U)'9Eki;N%MHI:Ko:Z!Q[f&B*2Dl@VH=*i_T.e=b/2>^+<]QRfj<+X"Uuc7 %FS+ZW*naFh^=5IX)Hh,&K+GqqML_PEAs&(o2HkV=/1-f6;sh];:%T61*I'3F]Bi"c2%,+L5[UmIqOD6*-83.K7@.WeM]<%:8jLk2 %e99=P$2b$,W`8$g&a82*j_C1)$s[0)qh^=K;PNEu6jq6Lf>FG8#I>_`!!-n&[LhYsU7NR%FUX!bOsT6OROJh+&LfJ(ahHp_<\se6 %>'`C>8jW`:a`(D;O;W^&-0Q4+r%O6592W$OZ"FhI=]K,8qhg*Cu1XW1T/T=C_N<[Ta$k$:(a%#857YUn-]NILG=%?c//?^>.?A/fTSOB?IqW %lPFt;"DC.1LMTl(2m>aFN3Y3P,e,+8-Uo]V$Tom1)\lNn!1\TR#l>ua,;8[,3Gu[;N"Si69+Hf=OR72+OCS)V84Ji7'-M$,F1'@! %L_:p7d%k.(BWa>k`\+9PB8TRHK!$d#6T6-Y7jnC^jJ[qo@cX7OJ]5P9?tU[t%9.n;=D2Y0TIP2"fgf(i,iG %]S*m8!R+!LTk*X?"le42;'[=W=^^GgW-c=(>sZs@j@M)<>Ia9P);Z4jRQi9:hiOEPXr-=:chHfq16*)mU1@C) %*,.q&,%JMS%)2dm`=]r/M7bdAYH?Ugj51K=.pIk7_CeMa]XEIU;JjRcK>T,J)?UcGG*=ctgO012hjR %/]*Td@At%cUaj54Tht73&X)C?$7dCV+j'=:Cd?W*D0Q%Cl3VSmBNEk3#VSM26V8[?>=^#]F-J))9aGEiIF&2>WC5YK%,$ZP"t?m1 %^p"snl6=WN>/BV6mgO3.`Ym,0"Xki)W5i_\($X@!)N'BCJ2ResBO2*814GX)CsYXFLc".Xcgc:-#`0^BqP3!rpW&pJD$C1RcHnu, %@FO7BK54%dYt.:Y9cKemQiZE`#1BNV3!5N0&XSP#Ki#0'Fr5+IQ3(Y0o`upQ_[MN/5UY!]k?>O=&VAH)pp/<.,9nKWfgIQAQp*WX %0:17&JRA1-Zq(3#fU!m<837CL-/,*rZIa2O,otf7V?Z6hdqKZ#-d^YS&b0G:?5S,VeI;qVN[bpNCr-ZL_W_.mIRW!&]aG6_6@qSG %"+G5c.W@]T=;WplM?[RS6!P>Q5gYujH!6?oo+>jsTnZMu([Ynn_S&E1b(*6:K_VV6(=35a"mXj=:M]NX&t#)kg2J"b(0c/u8=^MC %7#S*!Lkgk9qn//bfF(>nQ?8@hb,O4WP5)T>IDW %+lq\@^dgEQ3jI_.Yo/3?iX5M0q(6E"EK_:J*H8)Ha8n+a.NKm2rLaph.5iWDmHL\c?:N+p0-`g% %XQT15=WG:k0u+hG2do2)W;t.hoX3Xh%^iCYp/bem$E-)5VN*+F2lQ^rn3iKk*nZ*Z9J\u!84GEU3jDNb?dVADF.Wt976#lLVJ(bs %#Ye'XK"42fQRb>Y(1M.A`:).MVh=#`DFBCR*8l.slgXs-+R]Vj3&h*_TTGQB92o;<"H^GI*>"k&\9*07of$,:_*;GY@4uKeK[WJ> %(%E>A/0=o5q,K6GSK#)>F[HkQR9I,#UfDnYD,1ZY2I*+b_P'G3DgJMVX3>,-&B%RrQeqQLa^?m?("&*B[_i/tLI)TAS`) %$=CfB_8:'CW!"-H6oH==$I95UqB3%1t="NAr+Z@=/UJ;>t<^Ni.QNf,GU:&YWG9k4`#]4-+g/5YBV^812_:K=m %hPadO'1VV$LcTWcDMXb;VN=3uhHQfLCqsZO-`T>eX]YVPYq#Q_ftY4.Q%3@@%+&dM\i)t1A-u@oh[&Ik1]ID[K2l1*&,lcbsQ$3*Ts/JJ4?4T8a+,,k>?OrPnns$Q(p[tV/[tojP?V_A1W^Y_?oiS3!)/+-[nZjX0a]iF3^R&$`V0hZHaTo[a?V:9# %@,(,n/5+SLpiVg2d9=Lf.8UBIO*cs%e!3?e5G1tVePlkekmunU6iToBX1A8f;lNB[HdjPL'Q]=!T=<`cr;+keRMsu[:I[@q*&_Z$ %:_A$#8ltH&F?NU-TO)U=Z#;>hUUcphL`:U,/qIKaRK['&oFaAc'LFXFcX4Gc>u[iE;JpfYqlN%Pr"2m?MGu2E.r`o$&.mB#`U9!3 %UJb*jqH>Z$les45D3EDd&#E1M^"sqK'31ho.mUu]gid/]^f7=1URX7VOW]^=DN+S'i+(0Dbiu1O@AHM<):1.(C:=&aX])9hV,FFN %oh$@n]Q0VCc\Lndc)M8D3(/f`X#+q7q]j+^"u,/,25>rNR6@3j/fsJ8E %p>W#$^JM\J*jbIZ9.rI1&T8%hF=s#.YRjR.O/;\jerZ*YGL("H+8FklgXL!7p/n218RdoW3!sEN/H_@*^?Z2.b/SfTe?r$mu#OJIa6H^Z^OC6e=O!lo.3&q`eG"1Do/Sl@!@&; %-GsSn(=$_/Q%qW>QW>qqSS?( %.s@JoSU5KHNg@eNj^0O)lG)T6ID98H#1Kq^FlLo: %n\Z^@_)AjDIXZ-\pJco"EM2fp)3n)gMAK#F?E3!"0(#)Q %OhFOjHbD7Xd^Sr?Y=HU0`lDQsY&3Nq8sQ=rVV82:;!a+PVPnaeTQUc!Mt`L)h"Z'Wr\uh4gu>?5,5%Fj89N_3,s8YRZ8N@1COf@H %M!q`1a'1FqkW>bCfoDUQUcL5$s5_n=HJE8'Q6L.AnRq+G+S%QR/sUa2d"#jdP98BJN6U),hAXcfVq]SKa\X)X]!D0l<2WmZlD/I/ %@U-s);5r2JGOi%>CU`)QHh6$IfrMl4[rJGH7YJbLknDC=g&%95*5!eWpU,)*%P;O\C.=KFd64'mp4jSGD#Gt.+So"Y2,':5!2o3i %@sM#l]401'\),e`GP(lkfqhWH+U9c5o&aW9409PVo/[cc\*WRUG+mug,($%sVta.SZ&IJ$:&/j47FnGJ$? %.hqJef[O1d*qg)q%>%'A^^P0DE %mCWATr.n#V%o36!hm<>K7Wt]3q1pdu?AG8Ym8d00Us3!>#fbRsP>^L(G#T%]j^oLDqa8Kkf'\ra(/Lk^1J-\Ep^sU2\'CPspL,#+ %8VPhfn,?.+Bj!3HkuQ9>@XsInqZ7d?X\+?/o_KY3Xtne@1g:8XV:pmP%4F0#sQom1V5HeYhOW4@m)% %m%'G;,SB-Y0APJE&&"HhN8h80Hh(O=)b3*:cB(OqQH@nM)@MAQ[Bk4G%P!_uP>nrpCCadbbJJ8bd`MGL2gdHb9ceRJh^EjJWpPSe %?d1C%X%0V%IWnVtp'j[XQ%d;V7F0Yf2K%9SF6>0eG(4r0oVH=^Dr/-Ujii9uF8E8DGc0a#.c7U]:?O6OFm[nbfALqtf5KHWH,J@4 %;qgE6,(%qB9TsYQ3?>H\B&+tsaoB0LpZSPDFB$8[(+T!L"eMo`h**;]JO7nU2epsO7'!2%RT+-gh7QuAHu#D_H/;H49=q'87Cue% %'tAI(;n+/jVatJ_Sqt,_^F-iAli8&:m(=/&AB.$G:C]DRI:PQa4N>BqVU(W:5TeYl6:$DR(S%T1";8Fi_^EG\%#4htWFmsiVs.;) %]7,SSe1>'3Su5iV'Kfn^JeHp/;(@,?*GoR/%63"*r$2$E0b^q#"B=4G&dH,kQV@?r(sO %$*H?e1!`5"L`md,;%$K^AVOGAh]c<\!9?^Q4[O]&C`1Xli$>XrO-"W`6NEoaKIdQ6NHC1)e%>Z*70qh(k]K.;]-al8;-A& %HYQq2$2V/:$@aca3.h'U`:R_Q<#.R;":$!Zn5XQOH/nt=%RDO(*6EuP0&Vj"D20-nIcr,m!lTkeV\*DCfr+-\jqaW09F;*Y15%/; %87ot$nB$)-!9NR3A5An[.$IcP!16@)1%c-gW13l9CGC0d$OA.3$pYpq'XAPM5!'*gLI:c/"G))-Q2R%%A'_\hgp3G%N=bL_-36+D %]FGO>5%@LoeRP>^JAC?o.%_7\3>ej2fRT))pP0C>ld)ROA(W,)iOO-F4#!an+ %l,$F3bimN&Y"-`*i%74,)FSBjBa-`9;_Yp%_B+,VAeqnoO;UD;N'dUsORFm)c_Ji_qD'%uBHkbUO8N*(E!c[e.OT\K(>9nF\7I!V %Zc-V?BTn'=eM,A5-uMp`JQE!m@u!kV'VYciKEu&j8@TPYkD:5oEoM=/ %:PM&"KWr](`g1"Z0g&Pn9&sEWHj4Ggn`:)=RZ;bLhY2KjH*QHfi-pc<,W#6hU!u]Mp+EGJ^?tg2uX`YhKUUSaO=)W,rGaK\knf/C,-rsgYX`PP>joBLiMeM5a_=&@R,TqR+ %*cH"+"oMYh27mn6Fp#_c$d:jQT/^7sa)DCuB4>hI*sEnb(<0p,R%EI``O\]M4c%Omm!pE").!t3B\0/DeE$3%ii''][UBbq8DoqX %')25V1"*1q(K/&(LlZ$iEA-CLP'N`%i9'hLdD\s=&8UG6Y-uP.b1[.gMN?r:+`auI1n;HS<+,g3C!-nd%P;c;r5P(#+967([V7>5 %M9I@XI3QsSTU&[,?_1ucRW2;/KIBup!"ner_@-h]m#TCE&Boc?2^f'.o`Xl5kj)aZN)]OOYT&QTF`2(bLiW)@9F50Q>`R:-G]D&B %+JaP!gUqn_(2PX3ZkN)[i%Yt'8HIDHjq5Tm:m"NhKf@%( %A-g#F-n,GJV-"Xoj51utQ.qC&(_BJY0_;n(6bEGX$),4RLSffS1(`UE:7E^PWXOqUr&JR4?[,i?L %Q#Rnn!iC8[$!]GX=W\SU*7.S#V,&d!*.iqkR>_EP'NTa76H\O8E"!)%iSYpcb9B8s"S*T]`/k'=Cf=Jg2M0Q"_$b"KIT`0#6U$r"e.cXOADQPk'1cWuPcfo_nSpE($k\QZqh7>JmTP>!>3d#Y*"Sbd=B$R/LG0fO,FGs@29iq(G %+NCtj>aU?cgjH6C)m@r"PS3oH1G=tA=]k^gq=:]p]]u-gW+B2G9%>[Ma)4OQ^>BBj=;DeXeb5r5f&ZlN@3d(DN,@t13aU+fUNu=+3:U&io3U[H[QKn,1 %I%XRm?GTH$p8OMRU[S4lK0!92b(HRPWL'2Fcu\.^CR7_#\T>gN*\HZdD"*%2GqE)ZqU`&r>1]K';.8DLaj&;@82Zq/eWJmI:RjWJ %ou^FT]/L4o:I'HTVdHP4be[:?Zm)uTf4Ff[hAM^Y?QQ`VjOMGop4%SMWt0un"r,NR">gRgQ\DVH0rIr%66k)#5%eD\R\Zt.gNWA, %Wp--n>W\deGf?FK%:?V;7F;Dlk2b$H:A3"1lPVL*^Q]n&hOj7Aeh,Eenm"Mn!6?^&QE=3rb?VH-?sEU@(dN6$R5_igL+GA=>qr3c %lD;e$HR$&dn]+O]b-gTkY.Eh27\dDq(PtW1PCT6PWV;p,#GuiP9+:^e]lqeQ96TXY>+eidH9>35_m&+e&bK5/FlTDts'fKaXZL^r %m'kE5SP<^E4AE1[US.d@"8EJ;@&hAb)&)Q3^!NViJ@1to)&_"4m(;3)pNe)q$!nL_I)YSan5k7I;n>C2Jb-arWG9?.T+*)>3GmXp %!;ShQ$@U,&PF&JAg,,Bi];=7_F:j![S$D1J3[ptIdHE(hT"fLQOMP!?5"B_9a!t')rq00m7A#&j.`N-/F7.XMefemFVo>:RkgAV= %2_.@gW;Vqkh]3R4d:1tT\`00Vl;u!iU[3fulTaU.IG(pdG$Vbd%G4t0G'JN(VdnG&)`@iGVT!l,>IJ'E[8c&0G:aI.SC5[J&X]K\ %h"@:8f+=oAlRq8\*gcpucrJgZcY8\[1j8!eJ01-F^\H"&$R`,BIVtW_5H`_?+i/2WpKP6!j$==5pY%q6p"\1]Fi*]t-]bDN<%:mh %go$d)D\Baf_W6^R^Yeno3nr)Rgk(LPBoioV`>pBeV5c-n$njlW.:&@MJ[_q+2-3"r=LA_"8F%j&P@?W-ao%lVO>$QL5jM-1pk^2`GukTrs$0-4=Z %eURI]ge2u1pCKJ8VhSF>Oe7SbqgMP8f6D7sM:If9sf@Cu9U7_W?DCY]mc9 %qabVkg-6$s6>msgc2DNrWli\.h4WHUI_9n%9E5a?d,Y(ahk.Xn\?9mW-R'FWf!5G>jiZ.\;=^A.M]7#?^H6qH(ceE^0E49kf@HM! %Q_5I6^7*Um!RRt"-8?k1fClD5RL4#D)oq]T*fT"UNG2<[`ETH4(s'+;/)R=lH;YRjXk0EN9J1e#qYgAKW'%DVOKR-k*\4P;hB2f_ %(O+0h=>'7_1isXaE^#m[DXLNMp<5j4PRVu"*s="acJ,!0ITZVF[$3]>ikkW9]G'O4aQq=imKRURR+E_^VVQI4)ntM:&W@S[A3U/QoK:p)\Te32s3`'cbjncgu84h*K.fo %07X#H[S=rb80ahgg3\Ttjk`29pVS'#jsrOeSj?Z0Flpm+g(aPOjPBP3`Y-n"*TLZ)T:46D^.7,rg0XPJj[Z-/Uc6<%mUR(:0G2_0">IQD&CgT3: %HgRn0G@R0rft>q<:Y0I;ZLo_fD2YRa4*L'SHN*K3F5O-IpT7J-mui738nYQTcKWiHY:a+loc,r0jl`6hSXBB9O^tFjq'N4J2n1(L %mXP644,3)l0l-r*MO;M%U:Y)5N#`+b8kE=p;sGDc5UYW^"RpH!`WTt_!Wn!7bZtLU=GA1@;Z_a"J-1ie:Sq"-[=jmcQ1tq^$qPd" %P\^H;,N>J&cUD_0k2n?o]2CW^88C%i9F./$Rj;`#(cRO-ap#:WaJ,3C!Wd0]a(Bu?E>AWs%\,70^e-^9?uD.s61L>Q;J=OD8+&Vs %&1SS%*u26\]GD(#R8QkCWNZ^[Z.jjTLj2#_=bH>R^ur\$$%VA.au'taM'_=OB[]g@ %_&NU.3jJql%9[@#eN+9s3'Is7Es>$A"fLc0agaCUH0/4lXV(UqLs0jDCe[+M-MAQi>9[\[0T%*oSSLb4"n6(HUs:7i?-L)mi0Ogn %b^i8sksX:Bm=cq8[`;-M?g0*H&dW"\7g>amU#5tQ:DbUZKCZ82&QgAjn=@CO]VnrV>6:upmMa\BY,2, %3mB!dAWoW@TcSf1#mi7JPHcHpmCB7$Ko$Aq+[2PqEbk_c[;#G?T.>jOdHG$EO/`9.6m%$m9;//0"/0B0*;Km'Ti.SbbTjW1%`(I7 %M@I[^==kIG/:eHfCt/2a*+%-)q->7Bms<(CO5L0[T>GS>gr[>V,B_cVICR*m/&7Fg9^N#s,U+h(,\.CuJ;AXUM$;A"&("[9J-8Um %qNMsdOI57o&CgQZ8O*M:A<\&qI0'9HkNJWD"L]a0Sq0PA3nsj#n]8ubUsCsl35o2*(_k^M='=If4F8p%4<0ro2ss=>FiQdf!etHC %kTY4UFL`/&QjD:[">C>%oEl7S*nGl*Xr'4X,Q!!^HGgU_:s[`XW!\/g;mSkmYoP"@#jk(=3^ch?SQ;$%Pu."1DD1u;^:^4Qat=FNNH&#Vudn2 %L-]-]9.$+-@8+["!@Oi\:Nf)p[q_HA+BScIoFTatcTkQ5LM#^9,Xam%5W@EGa4BkK]TeQj* %$Ee9!k;^kCn6I`-)t^f]9*N8Q`'=a<&F^,3 %nbC1m/b'p=Wf3eqVK`/'B.3oM.Qdg\BY0uLEVVa&-[A&t)doOs$k3inQ8u7R?Ds->4u\'3*=llSnP77mhH7a<-]f[K(rhSm&-O$X %U:]*0i]m,SWa^=D*X'j.U\"e1L5#tk"GV>6gpCUdRZ))f!sbllcF,$'F!16%6d1h+=@"28TpE.,(CU %5A1$=^"A>g1qSBRTUB2c6I,mI>4hX^7KX?ZDAu;@((B_H%PqB-ZrR2M;T;!&Q3o6!;*e&ErVo;;5e\3-D[?g0Z&:j3M=h3De#F'n %`WF(s'Nb?T1]ID[YlM4Ds'LZfaO;N/n*;?"8_jcT:ZguZL[KUe`p7!Ap5f,Bp*Wl6!fu1%^:Z+!p;`f:dsZLH^XC=)Ujqj?:VZiq %.eT/s?Tdn"d@_o'.%d]H;A6$6@]s_>^cm]p6i^][,01q]aSc#ml`=U1VS<;>]/KCqRqTq*aLs %"/-)sL\-^TJu)e3Eqg/176KU&PX3Rn6eY&P"\g!no8$a%b!C7p?g9XXWQ:ENmA6`_nE_rgSZKZGKp*HGaY+C\\>.8Wd0D'FEi:p/ %ehELZq79"i*Wj8UO-V9?YACple(Tr';^o>!H24EHQ7X,bb;4[?-pMh14@u/EZ=SqBLSoN5rKjQ=-D\PJmggtpMOphEY<&^?$_jhh %;mUXJ]@$(#R?EOOTL?*e_qIRkJ$oL8pI]9,+Um"GjjM.Td2tgB[&APi=/4.^i)=s)g#2*&Q[LX$&"^X>*P$F6]ASp#m$4Ll6'EY7 %0Sailo'XcrjjH@!f:9++H6Yqa.9%42HPhrY$D7W\\VLR"!r'0lofP2;'7\B%]8^OX.Lm@k.h#RS'`oA4WRg@qqm8p:UabNM@\3E`q"?$CYN\')"OW7,MniXLDKXJ %d]IAgniYX3LiV_3fMnmDe4E3ddr>o]#O9eUn1U^?)am'<1q'F/4P %>if>mR<%MqOdmUS:)uE;C^nMrQ^mj$h?AMuVoteq=3a)N*M3QWU>ZI$c#IH7e'uQDom!Vh %1J;Ak\?Vkh,kfooq.QsKko[=s!q!EPX+lZTe>=WqU\@O>UO.00eFZJ$`TW^BI5Q;el=7EkkhOHpj',':obP_\\"?tiIaZpQaij?U %-PJ,C'5IhGe5Y^uZ$TqddOV4jhVJ)&rPE0H9;QC9J'WKaB0RJ7;Tg5KZi3^[l1F;mkq>QFh,`XXCsAmKZ+)D-=?\S+pT$&pH[[!P %2pNLM5GMLFImWhUWt&IG4$h/obMRfW@VWsSC!X[%kqHVlSeIIYi9QGMeqr4Tc0YBu\P1>-^=heR\LTW-3HF(^7OF%_(QNl'YA]=\ %MW70o1s>,B02?#^C\QHsYZ/;^J+ku&^Z0CZA(N3=V9a5t7B@^4^KL4/Gbcej %0*F)C$,K69jU\0e!L3$uAH_2j[YV+$RX=71&l(dCd6i'+Ot$^g+=;?ROX`,CpXP5jrbpLIRfuFCZg"2Y<34:V:Dq-E1'gBY(7A.! %nrTV=PHMbBi(V1h+>O^8!f8.\mK5(^&laQ`>000M"eI.^#Fl#'ZT=1'0a*Q4'+SOWUi)5\U0>qPCg5)u[K@.h+J+'F=UU$QK>X]E %Kj\=H1'VQ+%.-Xp"61s'#T?>=R+7LHB+.;R(q>ljET8%e"6)(jcD?clq4:gTY6GR2o,-&ojirAIa:9@=@3o %(ZCD[@qIj %#tb4_LIpb=6H=he!3-$"?m&`\8.08MWrW-fRe#U>Kh*rME]E,5FDQu7jD)aB73#86SKse(.(hY:s4M`4n@5Xe0\GA[M4c8ZU,GX_ %;I%!@i7f'N!^VDW8<6l=GMg+.gjAJ"kFNF_LG&d!+t&JNTV!JM,f133=J= %Bu2-l+1d!C&mg7>l=ptEVp&c9EJ5WY0M8oQbIOC;V1@1`N6=P1dd^)$f1io+n&m^m"]. %Q>86TMS(qB3"/TdBd/Kea\*T]'amIm9"BD!9gfh6P,^JgduAr^&CrT?.%8[cA!)#P#?GMY9KK7CJo,4CG!Z?WOJ!]sVIk]Z(1+E` %!H_a2+XAK/!&gok0U>\"!Tm>n^JjbXArS<%q4U*7_MfB]*ZXH-:"%T0FY6MSR&ouunfd&saT4DapR3h0oTf=&YT0@6hT!d_UnBk\ %CAW+3dY#VSb(7LN>c;:N+sYWZF%YYtjO)IBG,jdB8ZA0l=DJSJbYTqGZL6K_^n7[r#';NDgNDtG-4kS,8Rt+K]YRtFm,8-#g"!e"mBHl=P3VFb*6f@_ZktK,;kVV$kG@Eo#0t"4f:$WSB[YP2n,1\Xg)@'^(L;:bF%3pa/Z^bo73H8m:1Fpm^!O(aMKj\l( %Ypa1UB&Z!O]H#8!56dQcQ5<[(aWV^\bboF$S>;7uK8p["2FI[hmBAc=:'Ilm\.7J_.ll*R+WUo7;X,ZXaX2d>X,0es]8ZGs5Sp`6 %6B%n;9e%^OjWhrWlU\/rE29=$gtR1>-KGej&5)(293Hn'Jn3rJPA+_5P338Pau/o-nue#B0sMW`_E(l*e0Gt;*1[_CgE?029&UJd-K %f0Cp,b])F^m8<3Nd&^2!4bTE8>*)p(3IlinBSA01U7L& %A16Lc0J0d\[s,t(cU7:`a(PTalSYX&>BIq`VJOBFR)DqAeE\IWUrF[$3<#O.JbW!63?qU":br/WShmdnm#(5* %XsUsnfo@u]9YTB %-#09^h&P9$Uj-Y0">X2?8Y/Dj6O4tX(tph36oZNc]'H0S(baiQmdY!e'BFEOP#R%uA`aZV=j+lMR[L(\3Mi^l+9I<`N^ecUMIX&' %$[DDTC0Fu^rDC#u?8IelSRgWfTXdKI$QiO?rP^P;O0mSP,nMj@K=d2p"#d3)-f/($fhA85BS`aG:&i %J]G")84+E"h%80`U%XK]M2dbAmYFa>*3kUr+u):%j4"ld/4((_023E>Hsk^Q?;c<\QjX"np(Sk#[knR&nuCCH#*\SrVMf+X(E))H %FbC*1Ilk)Fm@#6;n3%'e*Fn?\>erQ\bJllpdb&>9(l5.-RHs-<$g:"FL_1LIR&@E<9=%LEa@2f@:C$XGG4535ggdJfFBtrD1l[-q,eu4)H#o?2lej,Co %GDZ95W.`_tAEnWt]dM_\_e9):]@);,0ddi_W'U;/Y#VJ*Rl1aRHf*I73uX"-M>=STTtkJ-=]0Hj6r]2mMGXRFZZ/<9!sP`B/p]J\ %_A>i&5=IL;6AAo0?/HdT(E*`,F`+W"er1U0q2[ahWd"A0Q2$:3mIFiK_Q/8K))X4)=Q+ %^c/,nOfO&:7C[l%$+#?s@`ObDPn`YI\KSM@Opb5?AWEN"021RVPfq;fM3.L:`Q%j4iBskHjSaYb;gV4PP-6rTpD#<=*O!"Vn[QG& %'ETSD(+XQ^^/8![J_=%H>4+p!bL)f\SscY!2V-*4Y;V@;*LgVW7XKXLmlCQ.!7E:3*hAc?\PY/ %c(LLT&ZssnQ[N_-f+cOd@^fL3a&W*qhejMNnt*N6Wj.(j&%RYWP-Qf40M'MfCAUlEDqK?$s-1a*m'HZ3+Wj3V-p'?* %!RYXN0di#QRYW.l*i),d9-F&_2Pc<>D:,DI#WC'6_*DQG-9?FR%cs'N6:.P./P(KC.#AZ[%4N[qT4=i*QAD!s5\8J4CP^1Ahe!a( %(tI;4`5lkrG$HC0O7LpR%#(so^%Ok/RB(CGuh*s6`#o1A` %N\:o:%MJ-Tej;ALRZjBiqPT::.8B&,cC#0]@hroD>Vj$CjT?o.PS5FaF%.N09W:*M.cQ9[Lsc.=gbl9j/uT%J:q[U>KV]Gs;Fm9= %@%eA@HHOr2"4D]b8djqOj,A[mZZXKZGl[2]=HFrF?uQB3f`QASD@W,kCKg5[BqEa;Lg`nSIqgsO\V8:tQ.pJ\4FsAR[Zr@B`l9Nm %jl'GRo/5XL.`94d.mUN>4(R*do+MeVC3a3-U,6%+p/S,Fj44(8@Pq0CbQkS9L5:K6`eGrhq+Y0r;UTi&#*rX2Z'JJn!=u?I*0q7(3:IFCGrt6pg>dn\'o&`8*t?-IT^#?4D/=W@`_a]l56P!89f=]$N5nW\?cEM/M^,Cdpe\4")QEa'pE^M\iCO#`Dqlh;sKbo3"DS_+8fKE\#*p7He^6 %#nJG<#S?EQ$._n_,1qh0A*f.K_?4n8BBS1)Yr/=>`ohP[QcR,?`&<=@Wh=?DARa!r7&COIJ>X?0H88^-B/GJoG4E*qV-FVGLdrA- %>]/1u!^Xa`IOpL96j&lOLn*3g`]B>9/RJ4spsP(\T1Eam*,6d:LG9=YJf`kri$0mRkds/ja:MuX@RE,8Wp1m?#Uon(5N:]dL-$2f %h6-HUh9hcV@,@E':'FN)M_3"G:IrZJ][*f+EXuU`X#CR"\S$3N\F@9BI)F=J"k;e#K7HlF&1`#^dMWS^b'l %BH:SeeI2M^+/?9ON#5r1o1b!R*J;?0&gAN?"3LJ7!?*A''hcLi20QdC"Kk$ESt\.88i._RE^U'\pO:Of"gM/JP3!W!H<)$:*@tGH %o%FetU&loG1j1b8SW/@`Eh37r)P8B6`BNTlj_0kF'kdY+10ph3A/B,V"Tta8BIoRA8WK^m3a6">YhULTJA^V>0KXra!]a^fqADm/Kq9!iR\u+%RIJ0jP'%?/1i,2aW#CFYAU-K.Ek6\k8lR@rM*0X@Td?QJ^03#% %eh_UH**F121uVVo`U`eej-Z2Z0e-SJW.+2)'Tsr/ZR[eVD1#8@+[:FWPQiEjdXW-R.$9>1?QD;[6;nlq&^GJUd#0X3ed3t_W_bu9 %Q*tIr_A!Ll_,6oF5sgiuD7AV=+r2#X)lbk,Kp%Ja&=8RF8T?$,3iIM'gC[]uR>"+YU(sIq*5qD)(YP64Z[nN.I7KDUF;2>e?]W0dCR"T;3Z$/MW_&@J1FU<^lH+^LNQ"pM\:f7SN_uJh-uqASBA>I89FPqS-cuK[%%6(Z\W,Ve %NtFbUa?7:qKY&MI;I'C842r`ta5ul$2)3SPL.NQJ]8:j#PU8-JYg@ED$^7Z.e5=:9BfL/[ZZ[2]`RZ#mlt1f68NKLD3jUTE-#;XV %h@d3l$lnB)/M@Z<3kNe$-&*.L7P`jUi!3_oA8B%-68urN4?$]a7Q36Id\MtV'57Q_D),YlAI8ecgR"R+'!hjV-"_XWOR,D]&)j(G %f/<&W$4]Es`IS/E;We_>cjM[D8Mf1+m&.sh8aqNkJJ<5="tNAmb\KSHWPTe.5Z/R`#+(NSj"OsG>0%pBUJ995i(CE249l#s0Opu]N\e`@Hj5bS %#;5OK*W7h66IRpN(E.g\Nm^BEU.>^.-la8rIe8e"f-c>JFV+tS<+1mDD=qj+Ka$0/^)+t&,?>>:+:cZH&4Rg7 %r`K&NAaD]Ja_\qL%3#aY3uOn>F+5jNWJn&dY:ph[ed]X/h.R1q)KFdM'D&NF9nS[PburK2a_;$G6[jNAqWW %7_`$u^"iM\V]5Hc(^-9Iq1-lKk1*1+s(me_M`!*!AZ's\uoI8*/>DGf7`m6(0kSfBX_K* %gieLRO8e3k)]7HeG-/SIa"g?&;pPcHmRc3PFkr9a%s:$Z-+,CtrG>+XAZt..`(aL_NN(e(Guf,9C'"o_n^t+r+!#R%"KEg;LsR+c %X>2#[R^)WX(4g=qe7_%chd^,!d8[C?JL1m&\LlI-T1icK-Z_;fc#:1/fMFq<--H)l1@Waf!1uMIa4:E!/ %7R5jQ%FujmE=RdM<@'LQY.9Aa^4HCKVDOdNF@1>fD(?D8o1![D_[;.Ml %"'g"8lXG^$98;MLTk7kmCRhCqSS]q"nB_fA*GP$ajk\"\R85TKk[pArgk;GZ4#-K;ChX-f8Ms.!jUN(*f5ee9_=NioYq\9q7pp;d %.$lj,D2WUi\iF?Wba%*la5(!iR/QF-kbMj@5Goj6DWq#V]'eeEE-!#(HmMQ%.25j-f9fiP+bqmEp;BaCnsZs=1;)r%]%B`<%Ig39cAM5=3mXH[&/D0/>l)*W^i2S.tar$#]*_)d7k&D"H@5-.[(SCi[7['8%CI& %il#duB%t628l-"Cdi_8']`Sq(FWFtPh7OK*P-Q'%-8D7!mF,*g\\fGD9Hf/97Qn?#O)4__gCO$oZ3-BV-SKbX7'_(Y,6N5-PIJ&> %*Fp0WFs31Ppk1UJg(;\eY^KQ/1$6?ENu4?C":0_rpO$u$^_"3Q+5N\j;BXuM9QI4P6K1IGt %d,^1Q$_9_#6fT1`6T(R^4[j;(s'M1[-+\=Vua*\!8N)PON@XP!XaZ)>Fu->M@,Zd+\3L]A347\VI4CQRCY^qHX%S. %;N/(=c*2dDs3QliS&H_K*+_Yt_iY[JdLi7M,#^fL/cO3DlV:DFq'HZ1'EUou(fA@Zn^7m$r9363qY1'X1Mh(iOU7$SS%M:'9Xr7c %$M6_:KI02jL#b;]2\.tsQ1]^aQND78't5iT['Wj1r#V4a.?r7rEuiA1,6Z]Q5_Q45m_7p %"$7T>Fp:(uq=4sq?/DcjKeQDr:K>)icS++W&^t::2oHMRYh2gj!%;1` %=k)]1.=Vt7Zo.A%N&ZGZ8Z %7@LFU752XihSm(I86"'0=W5Qh%D2D.6n_l\_e;@KHD6IVlLFY*#`U[c7[#-U71kaG<$Z:!BSoQ?_E+XZ %h.KOG=Q0FfbQHL4;.$8Q.*>G$8Pli13g'LO)rRJI4THkHn5+-SV3Sbu2q1)[_m-3f<5VqcD2*Y%a9bjdX&kWE=?'*X'sUUOBSfdm %REJq&i!G>fXI"V*iJER??6I7sZ6NL;N!AO&r4te<0oLWsB8i`FP>'VG$U^#%*UQ#OD7m8l=9B3@#CTl%$#>W5`BrnhaHZ`+)P\fP %,oq?k>AA,EJZOPEF`?B2"8er]_/Sqa7(jp:GB(FD>J+X,SN]Osd,hZOaA'&bDW9?=*B`1oe %N3<2P-%Z[h+W2##3K0pi];uQqZY32DH)rF#[%dE.0S27kU\YS\V+L15:K!=;r%8IZD\mGmUsogG"PHdlAAcX"GPEAL2Q,G!+%u6c %)A=gD%?9.X6qiGPDbJZ<*1dS+i`Qra]p]>f%+.q`NiFW^2j=;8DX8Z!DNC"l]]Z'kP\7O)-s?"P-i9T>:f-pAe^&uT0=#mq5=Go_ %d9(..*sZ^:JI::E='rF),t#Wq77:Vp6(aC7Sg)KL.B&JEW23g^.$u"`MBkU5&OT:u?1&`$JQVMV+^>#5'Pd[idT;+]>9Gi@%a$Jq %:tI!M=KV2[WsXg(`.9LM<=<0H3='mtN(O[a$!.^KGa"6TU;):3?4_9&G%sbH_Ai_g%%mI-?RYoF\l*e>P9%7TN0Hi+;)6Ot?1QJ' %Lb0+b'0D&63&%pn40eKEjDZA0WKG-W1qKbd^lZ[C_&4isPVj]NcQ[g;T"A$j1r'='j@(UlH*l"09L'H4:e'cO'79)A[F]/@l^5&W %Uc&QK@q.9;,.MSHE28&@&VT;i;r^+t\S7X>VTB>*`^P\$+:CJ%9JdJR.ijjn\u>DM?qS:,.>BFRjMlk:Ad4`FVV*$lYm4.]7FmG!7cb2*'(U]'AM`H&<'_g6cVm*8^ea_loHWBX25W,t[n;r/ %KVE"P$[h;Te3M#nA1Tm#",e'E09VecjlYSR)q5-"1+1KZ'i>[I= %U?#KP#7>'lP?U0b&kP>e,DdZ!]Xj%V*em3B(df.'6Qlm7X^FP-r6#k7@BBit4q_.HCsXpag]Y7HU7teQ";`ku`#,&J>?=85'1iIJ %f7[Xj4UnW[e`(.ZQu@MDbsV6fVEcQr%;[2J'"sRi %la[q2;Za@ME@3+Em9,_[?ZmV,`'EpV,'R!YSICt(ts+S=fgZ0n81.CcMbZpPTa/5OZY9-B,:ia!UF$^:B'T5XiPP1-f %$HZ@c,jM)-]-oNI34*D!W/YpgJZlY+$52UGl:B?/Ehs//nNdqi+BP^B\AqDdmZCq$m6I25;,OBa %3QhdjAuhc;.)!a@)D?nuW47il%?8V7,nqtie`82Jd8Fe32:._CZ$6AU=.c\<[P?WG,QWl^>aUMfe4?](6F"0mnNI1R%T;I2$ACJi %X(A"k:r[Pl4CLj((=nV1#n'@A;&pE5qXcb'W4"?fQe=[L;$.MsIu5'S79UBC&.,G`,7/6N0B-3MaC6kP/%L;mF^D5\W>!-9*_W=J %k[GM$)<%"!?.>,m!e$'+NV8Wb6D3CEh'JdlcL-5X8I%h99OgZ^;MFo;<4cR^QCqU4gZsbDX[RqoLl%8Y75B=sXi4(M?6IUHP87Hj.D%*MjL)#O0U@,?B*`lklR66D9&5jQl^-de^:J!*a %K4W9-Lr;X&I1\4j6D8MA6orFRX0dDO[`#408JH-CajNeH'H@DuMrg+_\Ai.gknAI,P"=Tl#rA<1Z4WSi\6N%^K95[R$&UH08>I.I %p>Vr4kaJ"^(oWmTqZ.'3FMPgqDh(J_!B^tHDq,Xf!7-OY\4AB[al4496;;h`H8_M*#]ku#\,%4_`%;<,l`88qTRqC;61?Kq\grAV %,SP2KUNEh_&kdIFBp7-d`FFH9=^1#6Ko;0bTCn1t[,ia?j_4'e6j_G4Ok1eg.Pg^C5qLX^j:"DmD8d,5?3q5Jl=VEKce-QC8e-)= %_AO+eZU-,Y$0d#/.5XU^,l@s;[A$;?C.aSg.qDFuWD1Oo1!`Fae(H`._AAb(7mhJF3>'FQKE81VP]B1O8a7625Wh5!gm-ro7m>$m %%jt`16tH&p-PjH^h:i]3[%sM.Ef1GE9%Ni-LAT(0Zc9oL/F!mJQ'QVZ63%C$@:#R@Pk)m/AeuC#M2E9fddDp9UqON_-6:o.2 %DUo[4GE%X5XIda=j>SOdPG#,(-3DHS"A-PW-JO/H,D@\$#+g-G-r7?T2t3%>[:6FQGC;C*j:0:0cu:J9<%8o1o4(mm,l@nZl&/\u %f[XR@7G*2I;hU;[ChX[/-m2Z%S7[nEk+E$F=bIf'e=UEa:5hAS_n]dtZ'679*+Su*%t*pT_ZqLm=0+-d:roI6Zsm(];^#j%$YJD> %L7!^3H*LskOGbnMAWk%[9D51q(UF&C._$d*(/eK4WZYjkLNJG@_t6P\9jPIEc!DUN-"7QaF"]P)@`D1r$pqZPH5sU\M79E,@?M$c %`3T3%(mig5lBtYKHUm@#[dX4H"s0bkTdK4Xd/%$B\$/JZtJV\RrtBeqBK3SR\A'.MU'H!G[U"m&M@'Y_=D!?OO*^@qDD/0S#U:pj0&mQg!2H;3q`.QuJ'WrC9WgG. %EE2d)`l[#='fft:jN.1+`)6.D?Y+sHE3CZ+ZRc/7H>nW;5c1ADP>sp^d]LWG+[^sb+l+mgc5EYH9Jn_h3E,15V&aL*UN6N?3qjE4 %q$'9:+X)'<-Eg5\%@[9BZ$HY22iEAm?NSJc&Xad7PYN>2,[k-r)S(a#_<)`Ba2kgrCM5aV@S*u(@:CVr?K=aO\hK3o`M'*813@IR\fD_r0akd-9;&cdp\!\^P.-06'kD%(h@>e6A`nOF$N(och@O$=es_P0q<4"n=ktlib>7#!-B9AdRcRr %^_FhU39E>^$-OT^btou=An=]fNlnCZ)+XBZ5"M)>Af=re)//S+Hk?OFd=;Qtd6ZG%Oq.9Q8td7b&mgfc[jip]bL$$UbRpV+RC54$ %rim[l%Z=VP+q@(PR@*F[:fs7oHVIC#ko$\J?Anidp6Tc/NqK:SQqAiZLhPY %9W$Al9>?dhMrW!E#1LKR]-1*Fb"YIe3m*'4)O"\d0_'i'8FBiJd)T',mL6FI)02U6I?Q[?;E;X>5L[h@_^0i&aE/QGE](pY9@-=3 %V@u>']0hm""HObUOWr99,/ZR]KIh"]k/_ZAaDql$8O/S/8Z(fFPF%06OR:KEjSj2&WHR8PPNc,3jaq!:&2stDa34X/-R&cPEg>(+ %S-kM+U0-g#3@mB0#"e`"e9o='kj*$Z1MVN%-$"9kD3G^^U:V;Cb4&H(OIoYIa<@GiiBkRt>sK$94VAE9('rp%+_egaI$#jm\5Wn2 %C8i^@`Au56Mpt-P>.](O60-F\6&8Eh(FLu'T(E2nB"$S6(pe5a^/@coE %>.>k9;L9&o$KKp%np7`(PWPk+9BpT!a)YIX\'4bkX,!5DR0=^S'?hC*a=Vu57ZHnto_4BCn'-XX %`WMABs1IE>a8C4*hg+hSdBo"L_%9'L6M\o2Zp;>5nLN]/;SY&TR?686ct3T?6Etdo]I!&Q1iMWQq00]"nbg#_HRF:Z %c!S$f.kG:o%AYRVo7fMsL1Q[$d,=@r14Ru?"W^5P/76!HmQ25d\81%dr*:XV."QD`g9G/hJ.+(t$O4gK(p=0*!uJ=l]mqY/'47jbm0s^%hRAM]]S:^.TNq0DpJiGQ`0W-"*(s\R=)'CllHVL2hC`0k^ku#gOFpQ5K_o!!2Z;]h9DQ\`BkCQThuql!sH> %?*jCQ[J/SSp]G`BUG)NIIR52?H=YRSL[QNs("0]#9YfBc`p3UY%2uSX.g9lH:k1>-$NP2pi`-qJgrY'H#jWSFCZ@e*3Zh\:l)btq %+6hGSBLg[LbI\k6DqALB[m%BNb9J%sBZ!3\eiei)k#UC8-p\3b65M=u!$_mS`WH=TUE3-B!1e#11ha*kYTmNo!MWR7!XiBMoKG,T %>6kc?_9+@=fA>nr^"[s_KthLoY^T$NrZ:uT^d!Ho/%io(^sd/2])c#cFP4ZhQ`VW++2)SAoEB;\pRM\#,VUJj33rT==h$;%LjKNu %m9$mpmR=?FDdBmV&WC+Kg"r*"OYe2P!-1lBiLY;S]fS:Dh7;e,?(4p`hQh1JQBb6^=[c]qp[69Vi=XQ?8Dt;.f3WO-[H?oFgi?NV %c#;tL0Q[!E$!VQ6Z:-In0IdoGRonBpR1()eguA01]8o40XT?TJp]IQ!PDnG$+]rDH#`sBM&/[2iZ#s&Bf;cO?X7g\n[t!.\IF`fO %m+(Sg8DaO#lFq-0_5"\LX.]%/9e3\k]JngRV6<\<$GaO.Xab:-i!Ed$9Ju1$Keirf%38+Sm'Yp`g2^=RfFb>u!#fqab641:@t89+ %E1Y^n'#rVZ]ug %JA[gnb:NreKu!a`"1m;8J.9+$?@`oDMc`a$_0!M""41GB!GGblORD.Q"#b&SGRm.H#hEW3B`/(cn_aG&j])0)C%uRqkY17L5Ggij:l8/XMRX3`9!JDb6Og[0GE"ITS#hrj[H!se4!&h`^,tims$!dL@434V+$)^2#H3R-FWmaC[0$CH3`oE9X[.5!MBHu9L&S0bm#p"cAW!00Z<&t!"gW6NWCu`dFt^WI1#EurA4s=FF^iN%g.IqcmGCje:[i&$GeV'4pSM,YY7_]B*9?= %(EcO>VP"Ng.j4fk*Lp&_.PaTQV;L+?=]4Q6=:4@"3-gh*1sdCXH8si2gAig,6*i7T1iM"M1^3)hOJ"D.%MJp0#joOJ_DVNH#8@\D %r+8:L#(Ur2!J!$r<&&QCrqu?o5cK(+Jq\:j1+g_52%UKB>7l6lE%0(k/ %TH#GsCr;P>2@0\(HRD6#_"e2MAIG1DBF:+6QsT.2\dtYY(?c;M?2t6F!`1RAR!`3AhNa&)N+5P&@+?+C@,u%c?nZkKbVB+7/A\qp %!VS9B%O8b,,"dBdcmd0d:iE#f^cT@<@@T%*#(CDm!.fg?!6#HNA9[Fs%0/^J-Zp6C(BFpcJ9%#?+JcdR_FXbQKQ/W55B$O;!JEq8.@;iW2cr9!'I!0#";!!92I&WMLPH3EiSh=CaOZ3[M6XXQ %%Xn,9%m,;i([en^QmHeq:Tr^!\eQJO$ss#(2us;%6=jO\kU7\Vq'_a:J/ndN_olEf0Q/Z:4KITM"*gLNO/G]a/QSYX&YZIW=Du0r %3k]C>G8bp(Q6(=+9e1KB,^WA6:"[+o&ae8W$;_Y$6=:Va5O1*+>ZhR[bT?*PVAN"i)Z[g7^cK"KUtJTlZfs-khG)(4o$MtmR@ZKp %D4j=nj+aM]TE5BpTaP8@q5f>jk]HsZaT-3%!!,R-_YJ=R0(ETcW9l4Z5W3MZ&qN'Q9VN7*qTr3!pTmR %$YMWXbO0/8R;$:;&*V"Te3/Tm)=U^3"Q-Y+9HF(ZK>>=,1fkj2*t`F*GVE[G/7Cqn#Z@hSgP#cfaVq6$oZ.%'=V#oZR[GicD#n=P %k4rQOB_b]p"c(]fNr-!?:;g+c%o*$)rS0n^$#0'o-%J3gjQ>6C_SF6/"7kgi%/A&j+Fntc1M(0q"jg(C^>nk7=[pTDMV-sS]/M*) %8tQLRd,ZicSQ>KsE]BY`krPt'`biR,mF`tj;6R8pco#/k#XDp4*hN`p1Goniefl%8CV_%]8G:L5Yt$`JO&?1P"?b6Wi/nNQEc0kB %q(bK:%6)QHP.):"XgY;Uj/QPf@-nFa6IW@VJA<d7WqoE%mTUBDJ9q*4UQ^ %Y"lKP%?.uPo@P_S$(r^($6O#PR:ui__^gG)JOs>]5CHWYF=F68d)#Kkn1o$q+3>Ob^Ln7`F7A!Sh\;$(Iul9\FK)`RmN"Q'RK8qI %R:uu#n=n+":$+-VM,l;N+DSY(8cWp?jr$41,rPJ,T%f[gQ->R:4dGjNN-pVZMZupdlM0;OR)+CW(PiK)-l>3XAnD0RMV3`-TJ^DH %\S-%cij/W8"l]W*c9/mVL2PV\:XtLjoDA/tq*)2*J+AJh&f?nl&2T@p.@mK_^&l^:nn?'I,VlZW1BfI\>lnaLV^aC27`!c#@\aV3TAd5K(R:4a,4$36RT.j5lYCZKS %9Z,DK+`q<.@<)?;+ZOMlb.cUrbS'D!E:j3i!o!Y+I7n!nZN?5,oI@.KK`W.M**?a6^*Y+001+*L+Qr(kh#5fFAi"=Sa=p87*\fSZ %"+Xe[7_ou4Le(#PkW(U)!*LYtZ"*m>l`^g!).4&g+'T5](X]&uBR#-!+^Va60Ugh,Hfe[=5pf3]W93N_$HVIT!YB;Wn.R\i:j?BV %@230%g-5i"U/Kmf6qC`*!ZF0n;Dm+Yp=d-0SJJ1krJef.J,/N$q3PILPD.:YF6hoI&%3V]#kJJ2SQh)Zhg7GHfks<1T*CD=U'hd1 %$45ggb88!'!Aap]0UP#5$3>ZB^_o?AlD6,2\)2]h?]IZ.r4k%Q]FgG2J0#^BE&@.jK_^E#i8U.,#l)VG$F_T3)VsloSel@8#&4>n %W"BXtpGIJ.'I^4+HT#5ZSXN0HqKuW95nq!K%LA^3E,rX7jjO#s4d";M9qgsV"&Q6:L"dla#>tXdgZ&h"$.hind>Xnt-jR^B[!qJY %&RWu-fI/N2cO,R^.+8A5C?=B(=9dslPQC!#Cqp2l>/D]g9X%Jf9j59E`K8Q.Hn=POX<%&oU>)-]I$3g9Ho9?A+`s+P^*R?G %NJ?<3q"SPlGVuB?j>rsacn^"Sh]m7G1+1*s7][mJ;\'4#9YJUhJgl]FZc(^%Vk.t[or\:JI[#+VMk:]rI %E7(E!M\e$MZuA<`P'/0H/7,u"l(*#MlWAW1h01O@\81><3&IOIl])`TgqD^=Q)dqMnBbA]H/u(<5B,LC*PbsfBIfL.q$SsIGVo0i %qTd>kgMGX0g9g:1eLU&m1r$#hL-]?-Z),WaK6ZRNhS)?INZ?cf-eQ$(JJCfo2@KuITf,RPpTD04Z&'iS%idcViq/ENo#6aS7PEqs %m,)Z^?/;cqITUg<>Hhe_S]d=g5s2S&Z\d)7k9o-[*WPd/rn0BinU9:t/Y(J,ooXTe/k@pDa8CWam^dc,r=;&S>DlEg3F8*+`&liO %mXP0[msjRh+8Lap?[g=Zf*_Jm])1o!3%mFlKhIc9H>(RC0&)G+.LmO@3-k@*7MA#VnXog1Vgn^'s3bOEqof$.CEIr/p>hf>%s0?p %2)Tj+mXAiup7iEShsp[6r)Z,R5%rn&5OmIRA2WnTJ+hF-pri^/=+C0- %J,L15oNT*$Z$23Ko,bMVao#+:GHP32*kXK."$c_+:O_ll_GpHUJ,J)Ob&$'U^\5(=J)_JtpNM,]NPG:q0E'U#^\dhj_4#^L:!HnP %m/Du+:KN#'"/#A4YC-n]eiKqnN.9r-\*O?i=@3j_+S;jQZI0PppO:\#A>\Xh>PNT-+'N0E:leIJNVV.fSe\Z^^a) %o_HOWr4i:$NPGDi?iTbFY+==Xrk:Hg;g6GiI.pjS*PD$X0E8Xks3`"ffjEZ:r9`+MT%SdGTW.t_#QOJ[hu=]5p2mIOCS>HWro1O3 %EVc=)_2nML0E0p;r6<_Lfhhu;""Pm_FeDL8Ymh!(.8Fe=$6?N7XNrqsKU&42G!d&onA\`ZZqO@?HQTtN!miF]Ug,ZKVMK[:[WhjpbXIEt]3OR;':)&^u/9kPXidJ*G"gG."4dY5S1bHI$B!rJf_2 %h(O2e^!E$okDR+S++F&V^@U%V>mT@/b'lIWC!W!N(LMLU1S=Wrci%$oT?mK$B0Z"A#CiuSjR*]m3H*k^pT4i"$eJ^4cRU+9peQ=4 %^!BK&r1gGPEOL'B=F/:<>Bc\fe@t8G?[V%KgAS\U`U@a)[p]S)o@@f"X("^idnLAK0B)B+$DO/mcW6M %_p*Ch46A3-F2dE7enkKFhfW5.SIa4k12]d0baZ@\Bu`C24n.qcO2C(bG!9$uOc4W,['alCd_"GW\7-eWbhFH!i8F;upXkm]ZL>Hg %8i_OM<&a>/B)9VcjT^+`YMW\.`jdH<:EJR60(<'h\/ah=F$8QR\@jp#q8j*uikM,Pkt(c_#4EUfT?lVhg^>,80e8msBc,JQOp(.d %4?K;$@9VGn=,\:j?&Yo;0A0^kXt'5S]EnMeTA=[?`t4!4):*299_/m*fQ%=W(-<:dLteEt@'!AcHR0%j6rA%\0V'"nI8$7[ajHbc %N#sG7#FH3o+s_mY#Nm"h\FZs?9!Tl^"3G$NWPW4*b^Z4A9WT:l_1f-L0iGCcToHn[>`*[eRm>M-/*s^W\q23k[2*/Q%B8;aaCG_T %D>A@>H7cF$Y6DXp9W+82?'MVF%4SOu`gh'/TbD$ETI>i_l0b07;<1,S-+Q>+,n#U?23%;cf+b %P308AJ0q7/A\Q1PQ"]2U&t'T4(k:6Rof!XTS>8O\@L\Kj'I9BV9i:j^'\t^L01\.uPG8&r,&KgWCt"Cn8D4B5UAi.VD+=pQduGkJ %g51uerl-.!7g`MMN[Z[L"E%,ehcM/kBS!)K,R$b$@8bV4=JW-SN=CY;isG[]nK^OAptBWd1b%omJ^YP#-Rk4%[(o@_;NO9Y[@>_t %.?\k]^`YsA?ioOq<[7U>MRXZY0Sl,H8D8o`UAi.VD'u@@'rcd1TPnRp8NRbA3RgGmZ*,#g--W;t]5ajh&.gE!0fh@NQ?=1hf7OYg %!tP;P'5#%?8Ac&f7K&37$B#TDYaC"FpT10h^Tg=,c)P\AMmi[gg$-sV`\_&:ea.!PgAMZEA8baCtXt$a#(l2ln,iPF&T%%Vg+l6\d:p,@?Bo#)kIHl-?] %_(M3*LP70R>nc`=s4ht3UW^Xs=EmqXUf-IX0f91M_6Q%%J-UEYnqctKWnfLfYu*<=btjEQ)/-Ua!@cQ64li`-XUD#]`QV"]YgaMa'GGQ'1,WGY`gF,PoeC$EK`T[*b[ljqb1a4&_H#,Vi10RL_G5A"SurK\)437Ds@=7,e80;3gt3[fAB5j^#-J_VX=>*f5G37 %[sPmGq^q(/QM:B5%H)Eu[sNVb#B7LNB_?/P)KgU?ipq#T94hIf"0gV(qdhV2c3L5^D$".7o3g[BHGen-l'Rl/8F4I/;=LI4UU.J,M_>moA,OQ%sk]POBoLhkr^;?&(@W3WJZnkLZn>Z>fKPHf$o(hjk^XHhE.)R@:1:IINI# %UqcEAb>5@db7:Y?JU?s3]NqoLg8grSW'/R3`eFT7$TmhYi@>GdV_gr:dl'qY-R'3&YaTH[bDG^?<@en,Cg0"02iRb^]-Ka8YZ`I-*Bf %i4o6WbHJSX`S^[6=5X&7pV-S%J,eu@^[fOnIK%-`Re'Q#J+X2aoVl3sm4Z3Qb0*$Hhr'3T>1Hl'j9*0l_=)X=k?n7\o4MjBIc2*W %kNN#rq^4UqWX0gHi2>I2\FS[`>hJ[^:j_T[B0%,ZT_$#NY?]_mq8,en4-lnWAE/r9^0E-Tc-D*R%_ql#(K*+TptetE!9s,+T6f*" %^&I9bIej3>$@`Kn4T4*?XO-i?^$"n-UaE2+H[k#;?3f81l$Y3.M?$':pFEG]rg=ib91/jkhtFccIf(QWo(!%Bs+-M$Jq)2*YPe1A %rn>\_bS&;g+5?P^cqpDiKHL!tr[sFbkk,IY0h]GBH_8Fk21:5"hu3DpWC_]1bO!Xf^%ZsJTD*inQ&kn1YPdRMNi]=cH0&E2-p<(K %H[h8EmsY4ks4qVmiW&o%+7Qe2Z>@DpaG4]Rbup$V.cL\dpajWr!k2a'SZA %Dg^U>55OX+MsIGFQ`N@IcTgu!YIm#)0qYG_MV[b!NPG=FJ,$)%pua`*f@=-?iuOcharc-'K84$abe*VjLVE?(J,I?*IcWpemS-W` %H2$rZi6,L-]0H9dSWf?sU!4Cgn<[M^b(k+7mT@1:$GQ>\^\ks,%D=E$F70!6q"!Ts:lDmB.pr+hqp2CDKBOoYQ?AdGnH85>D2P=N %_]O?t>j&Bs,!1;-RN6fM5]& %NAZksgb1-OgU8D(\EE[(@g1A%pNI%GU5R51WD-&.Ce6\?#kQl4km2[ZnuKb)Eor!/l-'VpM7JTPCUJW?.)o6Ln+_nk %4Yc1]%usFUf0]YLf.D:t/A(DAa]3a+#1CoF%GEl5mN[8A3+:LfH,u.:U/M#r^5g0s %*B]SYP2)pO;-)Q#mLGu4fD[L5XqV)S1]V$F.3gAYH\!#C=Uq@"`)[%lVAVX)Co.5--Yg1D4*9IV\SZs4e^j'tW4b^c6fZD9( %*p]\^@UrJL(mMcp8/=jU@#e7_d' %'=^rB2U)7tnC/enJ@1hh[D>mU/BNi7.r-"\GIoJ#+Z3o&SZRtlP$NjNclBC]U''Q;YtFgOm"bu#'O=un1PPIRNaq,E,iU2l99\l. %^sI/A_F-n,cZ!HoR+ki9XGu;$k0*SD`G0:`3XgY.qH8h#p?##EdEC)! %<;!4?9QEVWe5V>BI!fA\C;)NAgCCYd:!m@GXm]GQ9`o\MP[S,nW#dgmQ$Z$lV(9*m6?RB`W)Uui60mq@gcAEKP,^oEA^lBi\3,@[ %).#T(iNW[$fGY)8amN?%=S'PPV9jP6_.N/ %#2?Xt+2>ODhgiGb%c$i>$$Q\mWFP_f0VlLVGeQLl_n1%1-9C=ZBo_+)*6(^Al"'B7^`L<3=u,F;9`d>lLf%S(1Rr6ei8I.4UOk7m`(9.dg(M)WaR0h)`o)5A@lh^gc'C1E\>_$cnH0:-`fqcHXk+H %F9"0,/uhD_cZ+@\T&HV[]FAA"!^e$!\5k*13jp%X='d<(&)[[SpD(lH@rPF.#"&MgDHdW*McYi5G[%@*Ljc$E!"N?9,T&,r\,r"7 %U1%u(.U05c)P"mdP0NKm2L=)HYDj<\2gBTP/mYIl-P-YT2US$A06Gc.gW$RX7^E/F_t-g%'.'*41_1%:3h$'jFbTl?7Dp4I"rhqfdDD;<0Tr?454BXos]/0-"`;cI92\ri=$/_!l<4BY(ZP/.Z+.*74T),`kr& %)rMu\,RqCP2!2e2]&hs-q^D&(QPnPQ9o(D?h6n=.\EG?R7K*tOIL[q*n\LgUr&FVa3)0VK@dcje[u&TiJ%m.8,I?TN7]!PLY-0*n %3'WNI*.9n7Zu,91f'XFB4`i+CpV@fdf\$$Xn6$^#lgNa%p>42&DC>G?!l)4J:O]M%EG97fRH4+rn(\B$6!_]XAkl)88kh*_Z8aRB %Qn4)53+Gu-.br5cR67kH;?Ci>YkrP:k2c9pY0PJkrmV?^s,?SNCX'n?Dm`KDNT;Gofr&lHj-r"I\GdihBK,9+Sp$\us+]]Ham[9J %SW3?'[Mqn.gER1a,,$%3p:m_3R)C/p"+%H@DGcgTMgTQ?T*)Q]2kI!`QSQmS24>CI2!7Xt4,T-]Zoqc.X?30VmC@2OnNGl22.*Ll %W`7$-aH_%6gRiCMZ;N?b8$U9O-hL,qCXd=M?'2Zr<3?uI?9CD;`HA"iZrD03jiOdab4oYT-C5>p*$6aSYDebpl=L=5*3P5,RC'?K %.Om-1(\\Xt=,Y%$et\H)iR'cKd+1^p6G\E^,g"Nf2d+U %_!3"SoN>8Sc,c.Hb`o_]$0I-P?'0QJPMN*5fegjrUf$Ps)KhN=]ub!<9dVg0LA5b,1i<%H\=6GJj5Vhf_3&2LW&To$F_uLY?;RLq %3&U,=W)WLN@rIhdWQdTDqi-lGh6R7+obcIN:5k[LBs":s&iV9b'/R7KUUBVirYkg4JK5REHL<&cZTZq4es'+F/Zj5L;09s^&WN\% %W>G5TUMi*`,"7L^,pe1YC,PqEA8Pd,+nsF%A/Q,:V+T^h$_t+=qUt-'g?CU^-)rs>H-')Pih&/Yi55*"$1YkKjt$R1GcnE %=ZhL&C$Y8nF_4*g&I`iC<2sl7&p"B[NM!/Er;!$iV)120e0Dr>PqNqCl3]#)oVQ=P5Jj=ER%,o,X)&*o`erR@ZXQBo_qlQhnP-if %Eiul#QWX:=`FGX(6T8@_HsimpZ3a58j:b)XFu.[Sf>62p7A4%HED[3mgr(gf$m@j%*DhXHn4JT^@g02 %KDEo0DJpSajuLHiI!Z2NDt_0,F(;l'#HUlnRA1ilUgrEtg[RiELEVrG(+9*9?hN1_hTlY"DL2#8ms.i:o,8_$ht$-5mWeGA/pZ-6 %N4/u#.cc@80/QCCh6W&CY(,c)>rH&CB8t?R7OB/YoXfiQ%8ZIV.4"utOA0$0#W+UfEptEgO*>q]5_:@d(jY`a4QKr^V:r0h %7kHCYmOYO)A?jqP`LQ7CRp="sTTJ"Mi,qB_]$f>"qAUr\^YtNn+;G1W``pR0!Kkg#3b052nURl#%iBX/#L!XlhZW.[T9p3O*&CcY %KC0<"]th&=(>Wlj5'bALNa9-9j-t`bg2@07i`drm2`F/M2E+9W'?'$)j0qj"hAnU/a`Y6mmEHUoM.G5S/Fbce; %%Y;q3ms;F+e&`a%/b3TF,;T-bTmSB[]f.hD]_\5$^&ajsIJglIn3aR:D?^"j9IAmAp]6qsh%o6]&:?\blUiSGVs)sd$N/i:)uT2" %%6bI);"d*?!Fi\&_"7#p%]T7K`p=n]G:53Ri6Z8kS;bad`6gU(AejDNZGLhHEqBFf'.Y-\7L-\35TCHmg]1+jaTBCE-1U5$gI)UfJ]<&mDO/gFg]j/WC`b%Xis6Jc1Ct-6?CCcA?5?/:C?!DMf@l5/ %El7QqSpTLSs/fi3k+5l;\,JAtZl]Aq$rulKiONolho<5H`6[6&UFW6SJG*5gA=\?*N3*Lm'4:ZL%n:WYAU#oK%F8YI_3j_Qha253 %[o"m'`-MWTR"Z5k?t+@DR-9"",2t1r^s,?e^<*k!rEAW&^=I[kUIY27>q-U:1(gdpR%G3E[d>5L(*!cX->U)UeZb=ZY>m(c@!+8HAl^SNODhV>V[SZ(I(/p/0aKTY_O/#0u+0gWI#'MNcd39imF7P(:/!-M+u.c",1_9K5cH?4$' %gW.*hgA>qhQTYSVo&'9[P#J-`g*DdHr&BYG[o+^;07TH0dbYc3[cn0Q6/mkEP1Ue3Nm_LXV1tF/F3HWepLoR&?)er^NYY>\]^`ELhepB,gEP#nk#fV2Z$80_jV+,0Mmip/8)<;WDA.n35Ua(e3C4>56pgE5_@bV( %q_&;M`[[=UUR+GAZh\H_o-M-Yp*Oh4)DYb8pc;&m^%d_J8X=FO`qf/,l^(Q,La22Edd1DD-odbCdhX$8136pN.rd45b#[,-^EMsH"5.s/\[id.u$D^hr0HIR\b^,s^tA]X3WT=l\*SD6.Ko[?X*T.E]A8=dMJULW=1 %F8iVp#.,(rbGMk`%]AY]Ibr3OA5Q:9!BPDMDOsqa\\KPcgfojn\Md_j;`.?umLZT$dgO'Dnf)R!p5t!#=ohS7Dp#lJ'EI=,K-*&NM;4hN.OMNI!0UTJd'!ko]Oss*u(XuSm_O0<*4iPT5=II!7^2@!$\%FnmWc38*K,c'k81VS,dJ/jXVX*B?E&UYS#i1W"f@)9'@6p7gs&T)/GWC8.YN"%1eR-2"%<&RuRXH5bbFnIX;FM8>U8/,Bq#Q %?)c`S/eK$l*C^);=2=:lSKp#U"-[5;DfW-e$$`2g[Z$ZQ.-+APA>"ZHCX8JaF9qV(nbM1`ZC1KD[`ZMWFV6oi\&Y=S%QMg?J$C\: %[O@oI`;:=_Z^DHJ0;2$,R%t?+XSbE.2B"*8 %<_gN:3J=bWb1B@iV"\?/2@5lcOn5Qa:=h>k*uu@Cch>a:Z0iR_c"k2mSl9 %5XjMoZ6n^ZJY*'H:jq)aUaG8p!0 %]KqO9+P.)>-b'Dhfgu&\fZ<%LjiMnXXgb\f^':'V[&o\),/,fd4u!DRL>:_Ycq9c0DL)O,)B9j$.QU>r^/i5):/+b:9#\5Fe#H,Y %C?L.GAI-:ca:sa0.if(qm;nut+u>l$XeiSVBfSP/8\)`n[^):?QAhHMUg.7o>BS.t]6p$\/::>_PA0H!3\Et\&P?3XNY9=!0Lk21 %jGFl11Rq?Yc9pn)f?qr3RMVBHj3^rV>Yd_&9aoEkI#!!0(llVe&h[^,>_G"cS4$;V>Zf#^nEhJFreL&eXJ$?PgGLU!\Nt %0UmV<[BjAT"9mie'A(ZX]][qHJReRu[dE7(V7j?\1_rH2a7l$\YhjSf)fYXggi7/#0@BD[YL3;f!D$Si>?IIS$09R/6lOinPfZ\^ %6th^G0-)=D_5Fh(_0A"j:QmVc^mJ.FO>.ca`K(5,N=Al[fZ[RhYfdOlM+PZj4\Q&b[DtcephOmY#IV$sNt)0*^l"G.d*[d`)9DK0 %O4.bQNK"%^8+q>;L6HUno^^'+S:GmR]P;#Z3&+=$XPj\!h;PqI*QHhJY\0_4@IF"BV,$ta+pL/.KR?>`_'g@d"QtBPmGO&emHXMIPjp6$s&0Q_O,d76/b0#l*d0u %24l`-R'o-Cq6"oAp?W!&'tk[i#mQ;95J?`B\E.4F,A1FT;Pu3(=rOOZb>P5=D,V2@'@?R%j9/,3n^5p"=LQiP.+cBhnHLX_gE>%- %(uLa1R%52=[>P22:mJ:+/Lm[i'>mEuBOliaDT7LS)d`ub=;=IH6+ML3a`@nsm?5NHV/%ajrHD!Mq/mi4XdCRGFa[*WoK;<%=. %7mM?((+:hT]TR!EYlcq*k8603BV^n_O@G+PGFKAFf^8D"GciW]%_`g^TumN-L&Jt`'*He4b8AuR\j]P=LcGN?1B;LWP_DKh9n(1? %\/oktpf:O^'T$1Ook)NN_-c[0&QX2XX730h,@d[4cD%jJY_kRn@U!_gsJM%ja#A!82P4pm>7 %`02)i%89NU:JTtGk#&'(8KW"$M\JY3]OUh]mi3q17](IKW`stlV;*KK6LFR[>"hLYY*P?VP_#1)^u-hH.uIE!:EM.uO%t_33kUR. %q,uq7=$fPC%'`E<30?j>HlBGH>2dBU`h$p.(QUYa"7:R$,MPf(Z"HMZ#PP[nsTj5q)7)dBA$m\LXe[BLbb_WOBE>(([o:Q*_A]$^Nd.g %P,8mt^!^ucGeOM8LW1KiP=)R9I2-Gd,i[^DijF(f;mPc$=A`VX/IoM+ %ZY-LE3gcN>/FK\Ung26*)ElD-VbGo6QuM`F^3%Wlj&7?d`*W,a[Zp`#_giZM,H#s[m([DZ8[>HZ>ci.T/?J@Odo7o+/lr[%jV;^6 %Uo7:oeLt?P`Q<./ROZ*=^k<-*79%\g^MUVFiB=JMLC0=:iQ5d`e>@#T:oQYr)CjZ_S@V%`N5<>UCJWWMe4bu4^I:jVg?OMW*@4iG %X,StGI;>c`8's(nI[o#u@^S1U7Q+E0CACc4qeDVn7]&F4XAu6+f!_HW,OK"RGcWZ,WJsZ4A695jHX*m] %['!E.@P!1HE4/TCFrQH_LeXtJWiIN/G\(?A9nP;:;O8E`:.6&"g'd:J98hK#BP^ib!gSp+$_qMf%$a<&J.1!L"b%G8LY6="WLl3ZCo9@WNG$j$B0d/k4M,'C&;5&H %Wp(B.>.9lfU+@4:gHq8I*>J9B$&\\;A_;VkPZ4i#I'5&7B,&col[ %,61+"WZJ:495\4f>ch2s:$aDq1!NIs!\7BT'sY/]COi[%mE4WPd)tpEl0''A"(E8(%,^$dclld2;U?_1/Z?&VpgA!45o*9ENKQ?d %?'srW:2lpRPSd.EO-6s^BW)nuM^;?)/g9?tQGRH"_r?rpXi)_FF:jk0aqUr,f,8BN;W2B(-qrk?@EQ^!0Vofc(:GoN:s2VW!6^Wq %r/r!NP6;+dj=C=6],,h$.'63c_d@:?*h18o)suu!E7[t9k%S2+4"d#e;n?_X1]`B92l#*pN+tF1Wbo6%Hg/\J[DLQRfiDE+b?NT* %-7+3.>rKf"f=k395!Om5?s39mE4Ru_MrgB><_YMp37Z%_rJ9&pm1cC:VlO\RSo,C^TX?+Sl,n\C;\?:1ZI9/+eREs\pY3\oB1CP> %bQrQd).B^)'C9l,Y]or0;okGVqaf=V5[O*7SaMa\@'A%0]i1]$dtk\?ZB`#dD.9\IO1j"BScSQ=Xg$FP(JidNgZWG!#^u(XTs$U( %oX/=`^31Ong/5?BHL\B0-V/'oduL:3M6ei;O*'Wt'bL]A(B9E7;3Z!t;W,0fYQ/K,J($eUYJ7USQFr_:(=!-3d[1_-edQ_,G;9L!!rZW7.+i5?,@[6`6%>mrtmF\i`(M^J)%9L)`g>M:&hk%kKUF2pi[9qo-8 %^7UA=nUi:I4]'C1_mff$`^VG9qb>[;9obSR)0Bcj^!tu1WD4:XXnAK%)c1([4-Sp1J$[sf,ZJ]3-E6iXVR#a2G3>%FS*a`E]KDD2 %Cj7fTmZ^4U^,Bu>3-8c>pqlZgYnm8nB/FX-/hRKPo+T)A,ElV)jnrek%4\+M?&F>(gKItqHLp05@6:K%ldT_,AB4rp/NaUdbcmZ7 %XGMp2il0G04(Aff"HD3353nl5dj:EELUZU[]%0#Ag[sR\I7Fb`0(j'BiUf8&r8)'I]fcJDmLIRSf'n^Zp@W"n\`6MgEiJN\rlL.J %CUQ?B23_t2F(T*Tjch+iSs-)K:-Gk1r'DAc'oY<+Z$p?;Z[ER'%/S^UlPZ3Th:Y^J\m1GCG!A4BF6)]ea/dbH]7tX?NZU@\`0%R< %4$'nCCj07J.IYL[lM7?ZI8BO,44Ug@B30ZP9gCdq-hh`oN9mWH %]mZZA'hg486[_9LXBYI>o+lgM %n"p,(kDAT([d6$mN)VH4[@Q,kJ*_")I:1;(YNF>p_J%4_h:l\l!AAbJa)g`kdjAjT_mt3gSY!#k3-tQ,FUC*/h^uJ[53$QGoLsI@ %VpDG+f&*d^@._Nkoi[i/XKPZKY3E%=m.Jm[=DQ<(qn0DhftKJIe(VgD8%VrHlAp&L2kJc"ST_)QK%8UtI`kLLnqkRcfChAf4aq^i %e=Y9je[P:o'3UlLXG:\Ga4HTWRs&@=Y]oLQX7+KA_kD3iAoTh##>0lo_]Qe?dZ(]t%chJ,QC=Xe)0?h2e,p %BO905F7.L'HP:MT[5I1_H=9e<\+U01a#@mPkg]@I/rmF+oO@L18GQ5C:7oT4@Ga,X@sp_RJkCB]4kZjaKBq=<*Tsajh7;Z7mI?=u %abEQ!mrPrcH8k5?Ibe+UV3E&->45c7Xa,Gb965F$0NP^3pD %_^iWQca;tZT658IKfH]n6dK\#ijn?ZPF7sOmaqg.9++jSa,^o>?)pDl:Noro(H8J@me"T:ij#DRg=2O4$E%"Sm?rsqb:Pdr*'*QU %:od>%=D*YQn'(4,hd,-ErcI$24*P8QH=m*Eg6S;$\ThNL7&s&fXL!86lq9Ci':HHq\pOIrB22^AOP/lPJLcLZG5BuSJ%2[NVrrV7 %=r1qMY&%4$4Z>P_&4^VMV\]kdQ!8E8>sGi1:!tJ^@d1RPg=ebPFuZhWkZHHj2,@K@g(0ach2Rn9nmZi@3ZW6"2/J_Aop_QW@q>A^2\C8.SlpLHAE,2k)HM8?EoSI1KFJqhUh.\fi$8]-N %i7`^nh.%PkC*847a1Yu1d^\VOpE$=&FBu;C+"CcuHQ+-1p(T$7]mBe#)NSq=\a=Fcm+Hi^]4$c %4f&hF5BuUL4a*^QgEY:cB@fqfHjZZnhhDnB@0JQ*l!5sldOIF^$lbcCOaU*I?+U_,4tVhsIBqt`nG&^EkEDf]k(0rdnBDgm>Xns%M+k05!?5jbEZi5Zt[P* %XrlB+VWHQFcgTW&X6%fCf09qObBbWop>!UVnUiFN^2h6HH_TWNYq(77T5!s4VWu)0hoo3oo>?TtqoP."$g"(ur`2fRXP%RVr8uQd %[UF[3d@k$m[gtQIf%R6tp8i8bD;*ie`r(J?r`u!.lKt-()YWfh;^Z=,jCrQ,cA&6pSisM`<2hW!6jHh*"LQVJ(bS3"(W/a-laQ5_e;bhd*UEb*k.YmuGo0c_$FkkX)L=-O,[b+U %:M?F*6ALXfkhhp+F0>J*A:olHYmb0F1UAG"@Z8".-11\JJZJ/c,j-ACOS0Cq1T`MVok<`7V4kY^-p %*<0,G-P-(%>o_jGbePZd.`de9B(E3iLcif4n@d7u.H6GrjN231YfKHV!]\,pbPJZ_k*I;GPW;r!ZFjsQXqM&k(d#./q)T"2WRO"N %iZ1`om6:gEJ9&gjf151?0_4,OV]G0#rkH@>*nVo30799:"I-DQS`D%Q=S*$^?I6Yb,>1tcY73M*.Tj(DaK0o&1O>(/!E%GDBsrE %S?'O"iG-ld`foi1V8C@8MqLXfQ>dG^i'u/$;C@PnAo'X&&l-3.JELGuU-HRpgms.PA5A79+!k8C!,he/_7TaQWK'!R(lN=oYu9J< %gCs:1-bP9o[,=X?;s^7@*eRTQ)NTAq)a$OGe\*r/r49Gni*R;L2jV\G+0i132 %D]/@m?omVO=4N29C<.48a",o %NgY,j7(@S@n<2,29'kI#'oQTn>c<&3h2CDaErRmmL6]]qo=!0SH6S\X4+!R=a?D=r:?AaHP!I,'_pU:Q%$q^QVd5'o(t$&RLSRYZ %1KFla`'@BLY&b3CQa8Qc%itRoT0<^4bs+9h1HcK%[EeO!m@cQsg0&^1oBC_rB(2bn/ME;I>q)V6Y+)\/:MfI%lSsmoC`t:_=[/Un %HFlm]]_]Ra@k>H[(AeDRZ(C_Q[.=)ZC=U1jdkJA*'?apKB#emEcK=4]s6+_7)]h-q@4^k:c+J_\#+skE@gX2k<*C%kP8GE[7lEg+ZnpUoV814@`P;<;XbbD?D/`[8o^/ %S)KVZ$;7O0OOW#omJV):>L'1=AL*6"/+Km.LL#n2Vk,BYa2Z>6n5JWu]"9,Nr!I&eF?[I5Nl`43ddO8ar%pqfAn[.u:,o6hP$$#c %h62D1ckn'RP*+_FG?3g1*Jr5^A]WUVQmJd)T#OKbX5'oGG-FB"VQa?N")R%[4+eD;PDo.r6p\1!UG#q@`,%\["lu%k&.N,nK-r_! %\s\')`U#,CmU].A#Yg%`kUJ]0DEXAnZ$.1,D;r1--CR1#`[$uYXHS:d8]_Z0-U^90oRu>(+VCLn\B"W#gR1fR1j!Q[Ln\qf*iqW?WbE*IjR]dccAQ.:1>;lRAOa9E4L'7+ni.Qtrjf13]^b`P=Ys3q[Zh8u>>.QpaDoGp.#pm_iEI(@ %r8$SMbjaI5!!#U>VbL*UUpEah,#R@UL.d]NhhOU*W*@qgXL(-=2Leo0N0WbPP)af\\GC1?kbB=0SX3j2WpJ^+(,2VZ:Z-?`YNkj]A41$muU3X9/4-,JR&ROA5\6BeFU4mgHmTsCh %Mo<-DMU:9r?h?bA/=lQ]Ji+m;qtSrOa^(aD^UT.rA&M2dE;")AUmk+CnemF%7&EgIAA[M\rM#Z0<-k9,:]oF@(>dWi(sf=T,`i9D %b\_o.514gK:(!0+p[4$sO+MmDX^p52#S7"$%3@JE)3YV!gcWSt(KC?B:0$5N$Tj!VO0Quocb'52J(YPpj=d+ak"1fTA^GP6eXWd`ZM?4;d<@NPK*SBB]nM,4kYGV>[e7--/07U3Y"cS5Z4bH1+\VSmmf?Z7m;=nQbO(C5]PMW6"nchB]/qk)-8<%eGo0 %[!K@Be#A+g\6B`RRqWnXjdsHtdF0PHKCjV-*P$-H"&A$r/Zo!;]*A9piACg+Xcj$/%6I,!aQh)lRMn'C,<1u'6tEai61q(i=LK(a %?8Xi"oT)?E;:IeT;IT[XV+e"UZL,:O?IK+M^PCLld#kg@gV1ZXr*3O+KE_+l+_A-pLi"O'6R!'%oejJkVu?g>5i.mR/.:Nm3=EZfGaoW3fj`??7?P*1?G?dd3dg'q*bYD% %LXBEX!6D^r?uBRVX'q*&.SRRraroo)LcF>+9&eT4b=rE%\Po[RBoIo!(sda4o&Q'S#"Dgh?%OqgNQ6cem&6qNC5dc7_gXt^][URC %YqP3*$\`1:_AELt%;[XGn@PhM@e5!]55RKSZ]:U;Rj[%mf+'j(M01*b_]6+Br]]c\aBS.3:/f9APUjYEH)j]6EnH6UUV+AuT)3tg %9VO4L.ZYL]#cHSl-g)e@9G^r7#-,`W#:7Rt@-aBcITjVIU;b3"'eWSP#of4`LZ,qR$.UVmo*fQZ[)/jU#=8q3Z>9]cC^d(k;Gn'G+7WWV %'AKrXhZr`)@S$R[R7tV?0@&_A;Z#640?R">eBSGnaf9)^n2^TL5q@lB<\Qj\:NIk=<`V[FC"-ue9]K-sb#>cpWD/#s'*s5US.,Rg %WL/*5b=Wi)F<-RDg+hL"Co#Q'O*_Tl_V6+&rJObeb,qq4BeR.0Af4T$a/PuZ`U%4k"e;-k0)EM!?Zp3+3@<]Khs-3USE&k!F06t+1P%$Gk-mJ>[(pTS3APVC4$;)0@:*trqP8o8Is;u&=1h;(b0`1Sh7 %45j7+d$W:X_1]pJ`*T>ki^B4/n*K^F;mka8GTJ\_E;RL$iO=X2hCRPm5sD/f"f&1h\1#m26dYBU&KhDKL6]m6lN0EOE(*f`A9T.& %]m'^dN1nQSQWs@p!u88S/-@1MfW5cJ;^DOlC_)Mf6YC^c4#nZNGBX>[**MaP?aq2eiHd6TO/^jhi/,T"1^uW0dh)&*>9)FOIKCKf %J7RU`U%.G$P[MPa.#dI4%NuJ]&\p#Y&JB59%4Xl29F+?][hI`ujURWZ&?aNoSZ6OllEm#N8ONgj`Ph=T`UECW(,H=K,*!dL%o.6[ %Ft87@Hgp9of8ZeZU*=-NCb#X2=J#GMFj*`'1Fe,d0p0h\\k,pOCnE##e7'&8+^rG#TMA;91(Ja\KCJ7`@"H>1` %(HrEQjt!FUfsb2fID7.Afom$'A(*4DNfR7`-bV1fJ`(mLfJ$G_h8EKF-Q3;=]K-![=o:=*SdW/KO6dOVnEX:->NaMl'LGbP@TZO_ %!ip\OW_#L6paBQg_\qJmElQC`5dY=cE215oK+u&D[G2&Uoff6g'*9go`&FMCm;_(-at98sa2^c#*kn]]8@iqb->@&W0#MA&o?%s0tYRQ7'F^4m>NN*6F%o09+= %)?MR!;9P]ZP=k?+)qFLJKET,X+/G2-]&J?':EjC"WFb;^X$_=;[]*`HE@l_R2X/f9c_L5b3 %A8p]CkL:]']cT!+*ier8Kg,cH]oUS6)e-N]i'&kXn_P%rLfXfTai4)f^)n0eM2hC[HEMUZpV)MWf<_F5E$pP>STtt^b5/oP+$hd) %#K<:P.SE>Vn6;bqJKQ`mhlo@X=U]Ma@7BPNF0.rVT,[4&_hpG@$Bi]-MS5&U=]XAI6@P*J[O]/GqdB*SgTH(UqlJN2A]%06lm40_ %`.2"oo?3NG9n,cOMpjuBQUarC.u#079NNBH\tCcm*?dpKnt9`5N==Te:poMSC5qaZ%]U9b;iN(&it&.*h5<",a[+IOA#c_njlV2q %A]OAgK;qA\<5VHFIrJ5le4JPY5H%aRSAt=O#?BO(O/W=nq29m*7Dtl:m,JVV(*->%`4eD0TPDk/eZ_[5%h>TT]bI&url+dOn;f]1>&EB*!fU%>TPBP^<;IRUtI8DdZ %AGQ.jCAE0Kgr1Xd:pk>Wjh1n!9/'39Ui2O;j4>.SHZigTbJ`3Z/#b=JU_%_%%(lk:.!5hmE-ne)ZQG_!Ob%.T`9f0PP^[$?4V[[J&7$p=D&N]j7NXpCPG:KE^4B0W'S"p:HV5n]WQqr$-Ei+tE6h&*M^!GlQp`Yg>Mb*3nO,h4U6HEl$-sBg=ugQqQ$L3"B<.Dd45eeT>Wg=i4Chb4X^@@,3i1cf %pRf6]"4+t@2Y^4=DMDe6J?ss_KR8jLo&/lh\sf8-ZS>Q2=.cPqSrEcr$?PMPY1SELnmtWmHsE099LRc`p\Xp@j:7-KP)ffZ\>gInB %j)T`CKX&B?:Z^9_8sT+23BN_^aO6u!h`MijB4k^ud_"i3Cafbc)NG`ZUq%>Fm+LT0G`>rBJ`mA.NVr_oid0n8cBdhIM9S:J6O(uBa#VQ*I`/`cU#>,hM"/XqU;&sP %T+H1/@,ja#`d+A!&9FW&Jf)8q$p/Tfn`q0A'Oi'5-f9rT_F9EAF0C(G(mdYA59)DBmB7)]f4metLDX+CHgkXc\Emp4 %%n2FA#+)-=(fu8]\cX[9;$6hGM"(_O0au"1#%.8aJJ^UU@t04M=*&!Pm>,bM1[?-A(e5T4$/Fn4Xb^tVnaaoqa!8SGKX"E?N!iZA %4u>tk@[rGNadG8P6B&8%L%eG\PC]U1a1^>](mg7g4;osR\2AGtbJ*=+W"PPr&i$Odjgs6)(`2r5qA[A_I&GOc,0!FBV^Lj1CH!BU %n*+tINu6JV*-cnHZ#Mn6*!=W0#@^s+>b8t[`ilSN9>n>DI.pcf+NZtm*etSfB5gMo90X1HcCU/EJ*kg0`4/pdr!d+?UE#,8!+PjO %@6?U+;b:mmN8N8,8gRsE8qc8VLiHg^T.o;TJf%!m=oJPc7j>tK'0oNe's&<.Nfb3)!+K3M9DSb/31>7u3:WaTir[^dDSZ)Q`;"0i %%b2cCS1-=&9KlBdfq`1T:s/JD"plBquo-O;[JB8!H@DOd,DWGaE^@,Je"-JJU]43>\(bM&NX/: %;u.GTpu>,l]7pg1!AATu3rJ:-V%5qKo@WOOC3m/4iV[X@:X++q3aADRq[_'4Oqld`7u-\MC^$?J?0H5V0Blp/n0@CtE#*qR%d07R %;-Zo+UVe`=]RPMCa/^;o(EG-0,5=6Apa,5$0@8\0C(qbF%TggB4pE%QA&B%]D=9fHbAlmRk\qR^N`.rc.lpq4HLSc7E*h.;BT>;C %L\$H?oi65b3h.imdMVuo*A0F>LSD\3Cq+_L4VAbfDo4[M*A42-*fgfG1+s/+L\'0fa3KUudG9#jMi+:AYBYG=UVloLQE^0,L(tY`D%u4Khc$r %`Hu(Hr,AGJ[6&?'B/[MXV_2oPa3F6WcI1$rr:ITs@8:+Dct"Cd*np@cTVHPe"!AmB2YM"7B>37"?B-HUpkKZpK]qY*SWT@.(#Sc;N?aT39"h&^[:8Vs1!XlIZH$F"j@Zd%Gl>qJ;,>Te %1U*?-?JEpadA;!b`[Yok(p#[qDA.5E\Rh3Rj^V=jWMU/,]gp69g['ZTds:TihQe,J[QK4Qg*9qjc9geY7M-NpM4]m.HYU.r3PN.* %Cu[uKM6]V&ZTLiL5(p*!PQP[M"#SS1$5Oa@C0rFGbPNsVM*pVeVP8=Jq?pl?9H4WKHE^f4b)24OrT^S&4!aK5Ce17b(R^/h %V;R2N0G!foX)2u97Z8]e@T0D)s&fg7o.Cn(\NL`9e0Kcpe)9R%5W=>%pgaL$QT,?q!-!;2?t!!9AEgDoi(`^GqW^+"oka=:U"Ip8 %h'Z&^)6Jq>?rJ6HqA:cs=2.#M\hZ/YGE#$E$7*PUUh^\N12#02aA$Xs"9U&r8rP!_I-f;_ph5pE(A4Ia8K=X).cqj6QFa(s=]Z3S %QtP#[B?bu(qp6C.O@FBk*otX;Y,giSFWH9d7+^;OUd;.O8^cWt53`!2k_%C\Pn:ER;q!9HAkDYmPR%9$c7LXD' %\=?`?n7l)l>%4MncK;]A)O %Wn(9LZ,)'O>/#/lrSuDu777`b?1"q4):8/=j-khSZM[gnb%_e5\]T7j]re#;F`HQS14Gd=[,17g+0>2]B&&+R`j8@u'mT]GSZN[R %4n5D,5R@*P=l,"P+;h%iAMjealcOPr#Ji#)p$6=q7K%sm6O9iAicn>8C!s!=,JlF!9Zr-*OQJ3mL(!/Z\/L/lRd&C5)c0#p_k%=\8rIpH%!X%aJ^]4d\7[!/tDD/(/CB,NAns0/Qcpon2]U\SuhD7@HDe66M>ZHH[8R(SEQTC`A) %].a$nQD!(M[ckf! %E&6qWMjp\'(jB/uH?H.C?GEr'H/,YfI(]Mo\U1Ws%\;HC3'p[=ZR5l!#NP-G*5R6k3u!W$o@+sd[NY,u(hp)VBUF`q&e,X&l5\HE %e/0K9/m.7oYh$8PQ/V&Br6gQ9K;W`6k/d="5l25&WCZW*iUKp_h@5rki]$A,0kqZ2H(+kn%Xk7kC,.\?L/;tX),&M%m\sR<55W3o %@K;@EdZQK>0Fe-S2;>I\d=B.='@H72K$Ke/EHF6bX6`U3K>$YiQIEI&E^rn0]86ib?,i@jaLW<(7Il"g/8eAZd*'rqLm>i %U36C"4'LC[)2@MIPEf>7.5c3;KBV")L=\S#dFdqqdE-%c$V900)2q00KAD&6dk3f:DXHM*gWbN!d7 %qBgO`epA]1p@ZRoW])`lk,&X$cdmmHk5"fRq0N5P>bqJ9D=0 %L#mDn)7(RqF# %Ye1r9-<7.&(p1Kg0KmTL5-SCDQG?bEm=5bM3PFm`LL=(U+-amXK.RZeBOP7RX.IW"1I:MG^%:SNk,78#cs&L!*L!!Q4t*''f7K=( %EDE"CjHh)QcKLh=+@"1kn+X.L5lB&?U[?&'A'SVkO]Ui;6"dM1'7VSp,?d<2k5BMA^5k7\*+4k<*Ig_T*VfUV/(<1;T"5?De4BTQ %8$;u(!!:\A1/hCgeuK,a*$:P\Pjgg>=6m6>@7&'O_##N.;q%^A!i\;Qas3 %ULt?I!G[gE_1;+DoL_CH1UG2r=T_Un;,1phr&_LUBA^iu2[B1;`7PI?qqE#A;GL'PR@@o*L5bbMLqUOt9 %[2)"a2>?1$a&1qFB=ojlq;lLfL6G#RqVD2Ror13A>A6$*#$PM80S>X%Q0Dfd'Cm_H[HN!=>JKrBk0B[72U>uj]cUo&h@n,r`6b6b %$em0p?#hB$\r;C%eBHQ%3,n0V(JA93'$Y-<)SBZ4\5]SR^ %.1;tArk9[\?PLrd/d^+P+#WP#3FH=\O#.JXkZ[%i(7dtXT:m_/_IM^d+a?/sQ';%/,Ag+u^/MpQb0N9\a>)sCclB.QBTh>;XO<<0 %`I%I6VgaG7m88":Sm]I&0stt$Cr#f0>/7P1$*82T$LE34,i0hK?Z/ujmlGp:R)e)+WPQ@lIL0YD(!G*9VZ)e3VO,)5Y^DaNB4XK( %DpL$6,a?U1jQrqu"84SI/8;pi"Mo%"RWLff^)I^4eZqWWm0C8e,\$[_rN>L)2.cW<_\6Ar^gH+Klt*LkdP@X(k$mg/@Tj@-?k.,? %$.n$+gVSDH%/_WA9=T023;B58UCW"*)u/DQc@cXlEO)(_B9672X?1MmVI).`\PV=TFRiWLg+Yd[!Kr:,C=I]%.^9%s=)87gjW)Q3 %(0CQC08`lII9o8[/JoKc*MWF/2JZ\=GlAar;aX&!MscKu1G7lo]XcW_\Brm/J]#nt"EV;V+c?KriW=JAR7(XP^,1,36u %5-s6qG(md`f9EB)f*=(g[Y3#e6e>^a>BmRHqpS+G:"EY5\`7P27e#0P183t9gPBZ$3Yhe'ZkQ(*-: %To<"pfX#J-b6'*h"["8.!*s<.ch'JK5NT]YDG7inBpm)c@Vni!IPtVBpQ,m[W][TYf[p#!`9_?P_pJ+-9qXB(PurYnS%A4@YaRePC]u2Fhblp):\DD/=*DT<)4GtueH5q>F:V(&2f3fUN&oA.]4F`s2S(If0+>E4 %@k#YI[[1AbPO/E+u>I_%s81Ide_pQ-W35>/% %YW-5"L0R47a.>f-\+;'N29s(d.;hJ'3sJ#[]#>3ad"4Ce"4*0\9Dq7g%b=(9-VYg<;FoGg"RT=SgppJ)m59.k8_8>LaEd+US)7^O %c4WPF24l&'HZR8<2a8ZPUIlZPrsZn!ebnnrQ433cnlldP60'ofl2\FJjuV23)'E@"[dFL)jJ,DWlBCgFbno0G?nYR2]H6oS5; %+.,\=b$QgjU"&5lW.uIQ^P/j9$RV5NZ`Xu]!TWS7nZE$`$8[F>`![Q2&a9+LNj5r`_":8\?BC.@erk_Zb2.PhTq.(tr+o\-k@!Dq[##6k:Va6fa(*WM$q3O"cdgNI %?n;[,7fJQ)&5j9c)"U53%,eUu^-q&T-VV4=eoNOdLl(dTF\,JdW.oVjV0c5Y]oP_8L;%.WDWDfml--[)[%%fEEoOZ,*eWIR=N>->*C96.Pf(*X3/k9Xd\%EP&h<>craAtXMO&]udY8F@'&dLRAdG;q?GJFBP %S]651+6l#pH2B]_T@jp(-ZGm`#0u\AL+:9@jM(]G,?:TB7Rfn]R]>hsDqj68mHoa$Ce#'N6SWN\*2GAhjPC'3+,<%BS[nPA7JNuKHXf6$WtfA`'7"^RH@\H&gCT@jqQU4D@Vbr48\PopD:)"mY)Et!nnI!p %!aiR;:IKAd($r8iK5@[30qDmUj@b1Y;s>=f#KsE<^14$%1/(tR&Q?MM,hS!oa0YI0V9]97d[o\'$Z<=5qpt!kOYfF`$V:8TjX!@F %[O+)b[MZ]Y?6^oX7FG)".$%:p'HTi$G7dEn;Gog1N?k3BZ7Jl/hR+)L09.=P^:Z_B/rnkh4W16,c]1G.otrA:2Pf,$]Bk8'>GE4] %:HRinBo"Cu?NmuA_1mVs1cG/X%^oVLG+[Mud:J$&rU`955qbBjrTNIIaN]/d4HQ(?8^RX`#3=ArfQsd]mU;S\G+HNC(#bl*4[u-d %Y2ie&'l['#MAQC0pgR.mRqPpU;L/]HjD":-Ra]>%8M,1gg_R]Y!%1s4*"tO0RT=.1Y<=e:2cQ*]V\H6O,;*orW#]8^=!7>#2QYDO %of*@_O3DbVkg<&"[O^8QZ3E)'ek#A:Bkh.?I4X_%?BUQTDPimh.<$&h'X3a#IIi6>=dG[r["hAl*Jt>]bTo5[Abu(Ao$6-#'BorR %^u6lMP`>`=9YPKfZ>24D;f'82`0pU'I`)C"\YrkkAeM/uZ(Br!ed)-32(YFO^cDInM9=??V9AdE@7!m]P8QLol?uUc`RXu:e;qtc=j1uJ;[YlP$tY9`DWX:Z^!_5M,;a0b^0:%i!^?YidB9\JQg"])TAe\YKLQCa8]>%MBj %pe=jDN7&-QplGta3iF48Q:/)\fj0T5,bs$u^CK%aq!tNG%P^Vkd8n_36S*0p28dH`fGJZkBH;[bO*'II64rZp/Z'>-49."#nL"pN %mRrchoPK>FL+ZULY,=tQ4Y^UGiGP"V.o?e?c;Q0)C3Wj)iE47\M/GIN]fL#I\iob8:HH#*b^DgP)#.&BCtVVmA#u7?q(l3oE\I[L %"Js.5:Qf)1nfBskP1KGhNAuK).uc8dpoTar7WD^FZVFR.opWPPS82FLclW)N3TRG8hSNU)hgIr$E9u;'fk:V$f_)T6$_>RF@G>a\H/^c=kfWG><:'GZ_"79l]QOYB\kGed$&O*/Ct`BYE#+' %#)[+&f7r?Y2PB^"Ohm$R+=E0T3CVkW;!;([;1J?k1j;m4"6F]%p'I*0Z<,+^HMe6Ge_:9t'qA;a05XAQ.qh)]l)lc'cr^[iGL#/W %_k'OG#'S+?3H.Q!kH9-D-*_uOZQ*)Thfa7MK:QLoVJ`.+Q@S?BNR$Xt/f16G#.QIs`Or(Y+UImS^;d6T?"tUX%'P1a2R;WJrdgca %CA<.VrBLC/2K6aXME]pP;g?JI/)WPces>:sGAe;?!;6&,&2Vr)>1'cBj714W4(tSrqFsC3sZ;XmTHJjp1p$R#gp^ %'&*u;;'QG&nl<0V`X)ge,(050$8akNj!-9h??jhu)%/Zs8-ET--_r:fl0_+-?)1q@*0l\0qq3F.^_3;-4]=q'/F.rMG,''Db^aY,XOZG., %BetKS.7A6Mb2SfqW5!_$``9<8a^7h%j<\)&BMd5YWR4U\Dt]H4QL?[I&fA1TG*JKXJ[)!NZZ(A$_GBgN0_3goars]4tdE %"n`Q%Qqo"c^u.g]4sd*[B`g&ZbZVC.U6aQc;'LQ#dN=C"2Uq(I86DnMCqe([tgkUbdZ&\L[M#\1to6A]8/a;IGum-M%uC %c/X7?V+b.R9jB2+W2#kOIZNdQO`bZTM$DDOBp5]D)B3j-)idk(X'#pi8.)Kd`/a\fT>$=`oqqne4o6WFbF%=h1th7SP2>BU$cb0@ %K\4aknd4WQ5,k0KbokMe=`"U>(im$5Y4@iRa/Z+6*SN`(3;SK=B'5p2+&TUHOq@3`I$5[/[KQ %ZVu38XCA3&/@;'*&QVV'MbZ6P&n1!-=/ss\^A\+\Z#sSJeroK#C(\mL:-28WG?Z4&?+qSF[7a1$jgpKpQ[Mi;^fA/R>UJs)Cl-Z[!:\9m!.R?L)7u@kV %_>3#fQ<.AUK[O,MZ=U^92(KU*n]pRb<9<^n<9doOFR=i8iF-N#pFdIfjV&:A'G9H,P=^.NCeloY;4n15Nl95KFD-VI,NG>iLG;u5 %ZgIHE,$pX?S$9=&?f:QG/K&<.*:&-+&iZ>Hf8b8Z2VU(8;\uhaX7jC;n4EMr_57=`+S70Yeu>;j.-H)'*/fE#/.s[B1<$+u!I`8= %mLq\$XHa^Q`o$+LmmLa7;.BPlrTdSEK_;2?C#!jGq-1:O:(QC %6''*OW&_s+>\Jb"0^Vh/FSKOd)VPL_WEHsF$IrYbOn4+1jsa3JZ0HU#8.:jfk+ghmW.0r:cgh'@jV6XN0r34'jYr %aeUijT09k+*L;oHrP-E<(KjH6[16`sBJlB3gX.o5J2Ps.!K1hPjZtjg,!]^Jicuha40WN'kmo.oK,4Zb3s^9jK6a*VpgQ^qPjr>S %RpOUZLK)#j-;"*K=Mr7^g-22,;qk(%9t-NkNHlkC7oK!KJO3I- %s/j#J'C(%<'WLXuhp=fgLeIkMFsa*T[9#*skeCSlGNODK.&6jL]q@4u2?W>#O28]:Vs*1j:kJ05J/1ZV3!;l9/2&Yr2_!H/*KXQ-I*8>k2BFE[K\r %,#[KK_.Yb\EI2(\39OP.g0oH8">E*mAWl'ueUZQW@k2aoE6Q]dfW>g?$H:i9FNSeKD(L[j*8X_!I1c %\HHUhYG(>WG<=qXE`+L&?[=>V18Lq7l_?1(MM#r>'eoPZ2i?oP,6$B:JAn5PNUYZMr5=sm*Tp#83>oEXFpUc.U&1Ye;mq(.\<02f %RK_Y+4""d9()+iS=MCo\>Qr]c(`%?q_"]jn:e@?L>%dtQd/AS>.ZjH74C-CM$:2I(!*UN6^bsp#'AN?(E[6_$dTNHL4+<,KOddsC %ctHo_Y77*6Nqa9lkcGCEUGsN'#n7!MloDkoBu4Fs(mCeD.S$RIQ6a-DPJPu*0]m2XEgiLBLVe'WZH/bk^*R8/*.<^unAGgWd8eTf %OJ98g>bEaA1F[t:X!*&Sa;o\iNq3Z2=J,rlgJ2'N/2_bj?O6IUQlmQD/A+83@*%*\H^ %KD/G8d9LGFS6uWu2HR.D`BFdEFNQfN?0'5GC0$++kWN[(>p;t2:k=tZHYeoGe[0)[D7 %H]N'tRtBJ$)?#:WDa6_2&\Mc8+=a#ZP]2O*XN]8PL>_#!-c4fLaiZOD]<\meIg^jI-g+5C"bM+4@*eE*_P's^e`B":%41s#SC8`7 %`WS1.paY,'X#ddRiB_uq+0]&SP)`o1:<1_aN_CGng[1cEJSM6.8i*X^DpO\`W=d-3J<"/4Fbrf[K+o*)/Y/!@3 %kh1\1hO)tdqT%jp`+D(-4n^"f2tp(U&^oGUYsIhn7Fi@]CT8IYO3jFQ?(h<(=C)K&9]-j.:0Z#23rNJC4i[nkO)\oJ*"U$:)=WJH %!i7J\Trn'!:Hpe8aTN%I:K*S*_$oP\g+LpIlqL!P3Ai-mrpMkK:j5$E!Bnb+a=Qlfq+pr50nZV0MhLRH,(m`cp!k^=W&`PqVhX'INk(L3oRuN>ipU,h$EM;'>MZb %]XHE/Oej3-)?>fQNj5t"#a"r,`0df"Cs]N&JZpdpL7W)1G.<;sM0^a8?rE]hK^D1FSA(H.3HkQ%618I`_1[Vg#5J,-.ZY`\o3C8V %N3CS$0irEnYg,_@^Jhi"^72Fq]V^ku]3:3.9?://+)B7o-D<(>!\B.blJ_!tjf:iJFUYb]=%/q8m`iB07JuRia6pls.ia;?NG,+A %1FaI3b0#eMrTEr6?]Ad46oCe!0X:)C,,p!Vi>#gn""1,>\/Wk!jRrB]`l)QM9a+2/Rp?=b.<\'A/ga %Jh"fcS:,Koht@rY_kRD3KDL7H$bkfP3GeS-8Z8Y@:_>kl^EiHa+LHC,)Z+iGlHQ0Of;hmJYIIs?Hmh8'%WnOpH!mjcH+d)sR#dLX %CCUT\FB2@H$+j!i"9pirI7]A9?0G@i!s:)(lKdl!BOOkY0#^k9Ph=fWf3g/-g?\VdYN)50:5YiW?11eG#KqtqEc=lIlZJAD*OLMg %78!FrOXO*QSQDa?&g^JM?=3YOOEGl5%ohVb50h[+M,fb5%3h %S5;S^/?5ksA,G8N.Q&"7TWS4O3j!'H2c)#cr/a84M9oM5\@qn6*mOhTHjquZ.mai>X7N/\0@tjm@GNu`G_QA;$`.3H47eP&Rssm_j[_/FB`$^!ZY-V]6/>H/bX9%Ksk302r2n!1"pNu %mVTOhC<2XnDVa,j$YJ92gMYj'FA#`l-/3V/m\X1o25J`FlgCWS)C%`+Xh1'?Tfs&\D7=?U2Vit10u^S*G;n=ZDc(DaA\5G9(@8&r %fQQTKVH[FZb&+WUDRp#MIC6c&e2Q2E7XM;Hh7C5_()VsMgTA)WDXe_dYI*,s]BL*tW5Z1#P#/9ur!?b4&2gl./?OT(."o/c>NUHj %A:lNaj!nqT>c<#+\LL3a8'gk7i\S$=/4/"IG4Z:S^-lL7Z0;n#ah@$UE-TKilapT1Jh%qrp-[&`SnCWs4.d.),r>)o/Fok%M0k8GVcmS0W22!u0j4Z!8 %BZKtVR+jjL__*)M8!5PgpM&f!f*'g*FuXs0[Ze+`BoXZ.l02-dbF%lHDaIP>Od$5E:hgh[D9F-G2B4LjNFAP^#pDQDR@E)D!edTf %LD`UrkO%Pa?SkWaN3XL#0D.CBerja+7W>1bfcOUG^oY:@9kO"S_Vi1mXiBsnrN@1<(]Fkus*9FI5Jljo+8kVC@AkoUHiJ@BrsHLZ %A'[S]p[ij?Tfu(d2]sfaYikfS&Xh("l4`Z1[q(>5555o %i4lY=bu"]5r\+&."98/qkPt:KJ%gEOIihtj^G1+4772=Tc@F78cPm?R_dT2#hstm27sLOf0,P2XFZY!P0=^$53!heM`oqJuh#[!/ %_FR#s_bRBg']AEdLRk":i=S37GieQMn?^TO+Q;ti6@aR+#C69$1[$-4r7atJ_!d:/nTPuYEdEglA0]>q@m*'u6H1%D%C'RHf_HTu %YWSF>?\e\H!IP%M^BBl/V^Lg8:C6ifi/-EBn>:.Ylj$V-RscH!+U$X(B&IoBV"&a:B>EmJguIpU#DU&Z69_;+9RrTqIV6Fuh\?JX %I3(eJf*ebWdEB%8"`V`P%#,%4T?$29"#bH35N&FM4R6,D %cbQ#;5(E'ocOIn[%=-@&q:n9qT+CG?'*t89K`#5j`s[E:,31$)ILgphcg;-qI:;W4J.ll(;!e]Qr>n`G]o35Ng$o9;*Y73mn[ia# %"UiQhbRG"`)KP]1m+Md@!e**f*^CSc_[YJapO^e>K$LS:b`!&r,Y3H0H+`'@DD-JC]G+%@fF=4lhZ\`Qo(dn$8Kgk0nD=\0(dM&> %DbFCL!%G7gZRZC0k6&WmqnqWE^F+sGoRYWk+BqSdqKuZ\d*'7o#5gnkJro%)3ut4mY(_RcgCBpK3&6_rX.]qpfZ5g'&3XMis%"O4:'.pYk>dH%iDk_NWOUi$c$?@on*:!4h`_X %_!2=(]YrL2Mco+RR/l,iHpP[Xpimo0$+CQZ#Smn9!89g0$%sr;p)TBMn%l:LEJe^2ZR4D`"V($DL_HZRNLs9-l0U_qhSVk?3B3*/,C\+EF?f!B@fO]Kj9_h?=pR=4at-VaAFW8p`I[D=*;9K %s3CV3.>f)G9j7La%(63p"rR3>$3)ecr\YW[Pl^%Dgjhes:0AY6_4h"c#=ooN0-&uT'nk2SFptn>>(WIu(kh0Go%N?;E1_f8_6D-@ %+K7`B+M)`j7Htfc>CL!G)&E_V"8r%_)RtuYI\5e^-BH1b#^AIFo*(2Q;+c>ua6JGAm8c[H8*!KA=F:%6mNVkgJ8A)fQGNg+X,X9ihR`IZA9:epclY]H,!&01]6F$X;b[J[@O\,"roEe>NU %\",])DaX:#B^:4lm/H1"-j#2O!/hP>)D!8hhsocWf[&+HCAZoKkGUjD=b1%a6XVDg)pSJsG[kGAS(+m!q#]3+ZeaR>:&YTNIolN` %I^018r0qON47LbA^YRN,5O]$TamjO^FhTT!rsoOub:E~> %AI9_PrivateDataEnd \ No newline at end of file diff -Nru xen-4.2.2/docs/xen-api/xenapi-coversheet.tex xen-4.3.0/docs/xen-api/xenapi-coversheet.tex --- xen-4.2.2/docs/xen-api/xenapi-coversheet.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/xenapi-coversheet.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -% -% Copyright (c) 2006-2007 XenSource, Inc. -% -% Permission is granted to copy, distribute and/or modify this document under -% the terms of the GNU Free Documentation License, Version 1.2 or any later -% version published by the Free Software Foundation; with no Invariant -% Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the -% license is included in the section entitled -% "GNU Free Documentation License" or the file fdl.tex. -% -% Authors: Ewan Mellor, Richard Sharp, Dave Scott, Jon Harrop. -% - -%% Document title -\newcommand{\doctitle}{Xen Management API} - -\newcommand{\coversheetlogo}{xen.eps} - -%% Document date -\newcommand{\datestring}{10th January 2010} - -\newcommand{\releasestatement}{Stable Release} - -%% Document revision -\newcommand{\revstring}{API Revision 1.0.10} - -%% Document authors -\newcommand{\docauthors}{ -Ewan Mellor: & {\tt ewan@xensource.com} \\ -Richard Sharp: & {\tt richard.sharp@xensource.com} \\ -David Scott: & {\tt david.scott@xensource.com}} -\newcommand{\legalnotice}{Copyright \copyright{} 2006-2007 XenSource, Inc.\\ \\ -Permission is granted to copy, distribute and/or modify this document under -the terms of the GNU Free Documentation License, Version 1.2 or any later -version published by the Free Software Foundation; with no Invariant Sections, -no Front-Cover Texts and no Back-Cover Texts. A copy of the license is -included in the section entitled "GNU Free Documentation License". -} diff -Nru xen-4.2.2/docs/xen-api/xenapi-datamodel-graph.dot xen-4.3.0/docs/xen-api/xenapi-datamodel-graph.dot --- xen-4.2.2/docs/xen-api/xenapi-datamodel-graph.dot 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/xenapi-datamodel-graph.dot 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ -# -# Copyright (c) 2006-2007 XenSource, Inc. -# -# Permission is granted to copy, distribute and/or modify this document under -# the terms of the GNU Free Documentation License, Version 1.2 or any later -# version published by the Free Software Foundation; with no Invariant -# Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the -# license is included in the section entitled -# "GNU Free Documentation License" or the file fdl.tex. -# - -digraph "Xen-API Class Diagram" { -fontname="Verdana"; - -node [ shape=box ]; session VM host network VIF PIF SR VDI VBD PBD user; -node [ shape=box ]; XSPolicy ACMPolicy DPCI PPCI host_cpu console VTPM; -node [ shape=box ]; DSCSI PSCSI DSCSI_HBA PSCSI_HBA cpu_pool; -node [ shape=ellipse ]; VM_metrics VM_guest_metrics host_metrics; -node [ shape=ellipse ]; PIF_metrics VIF_metrics VBD_metrics PBD_metrics; -session -> host [ arrowhead="none" ] -session -> user [ arrowhead="none" ] -VM -> VM_metrics [ arrowhead="none" ] -VM -> VM_guest_metrics [ arrowhead="none" ] -VM -> console [ arrowhead="crow" ] -host -> PBD [ arrowhead="crow", arrowtail="none" ] -host -> host_metrics [ arrowhead="none" ] -host -> host_cpu [ arrowhead="crow", arrowtail="none" ] -VIF -> VM [ arrowhead="none", arrowtail="crow" ] -VIF -> network [ arrowhead="none", arrowtail="crow" ] -VIF -> VIF_metrics [ arrowhead="none" ] -PIF -> host [ arrowhead="none", arrowtail="crow" ] -PIF -> network [ arrowhead="none", arrowtail="crow" ] -PIF -> PIF_metrics [ arrowhead="none" ] -SR -> PBD [ arrowhead="crow", arrowtail="none" ] -PBD -> PBD_metrics [ arrowhead="none" ] -SR -> VDI [ arrowhead="crow", arrowtail="none" ] -VDI -> VBD [ arrowhead="crow", arrowtail="none" ] -VBD -> VM [ arrowhead="none", arrowtail="crow" ] -VTPM -> VM [ arrowhead="none", arrowtail="crow" ] -VBD -> VBD_metrics [ arrowhead="none" ] -XSPolicy -> host [ arrowhead="none" ] -XSPolicy -> ACMPolicy [ arrowhead="none" ] -DPCI -> VM [ arrowhead="none", arrowtail="crow" ] -DPCI -> PPCI [ arrowhead="none" ] -PPCI -> host [ arrowhead="none", arrowtail="crow" ] -DSCSI -> VM [ arrowhead="none", arrowtail="crow" ] -DSCSI_HBA -> VM [ arrowhead="none", arrowtail="crow" ] -DSCSI -> DSCSI_HBA [ arrowhead="none", arrowtail="crow" ] -DSCSI -> PSCSI [ arrowhead="none" ] -DSCSI_HBA -> PSCSI_HBA [ arrowhead="crow", arrowtail="none" ] -PSCSI -> host [ arrowhead="none", arrowtail="crow" ] -PSCSI_HBA -> host [ arrowhead="none", arrowtail="crow" ] -PSCSI -> PSCSI_HBA [ arrowhead="none", arrowtail="crow" ] -cpu_pool -> host_cpu [ arrowhead="crow", arrowtail="none" ] -cpu_pool -> VM [ arrowhead="crow", arrowtail="none" ] -host -> cpu_pool [ arrowhead="crow", arrowtail="none" ] -} diff -Nru xen-4.2.2/docs/xen-api/xenapi-datamodel.tex xen-4.3.0/docs/xen-api/xenapi-datamodel.tex --- xen-4.2.2/docs/xen-api/xenapi-datamodel.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/xenapi-datamodel.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,20245 +0,0 @@ -% -% Copyright (c) 2006-2007 XenSource, Inc. -% Copyright (c) 2009 flonatel GmbH & Co. KG -% -% Permission is granted to copy, distribute and/or modify this document under -% the terms of the GNU Free Documentation License, Version 1.2 or any later -% version published by the Free Software Foundation; with no Invariant -% Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the -% license is included in the section entitled -% "GNU Free Documentation License" or the file fdl.tex. -% -% Authors: Ewan Mellor, Richard Sharp, Dave Scott, Jon Harrop. -% Contributor: Andreas Florath -% - -\chapter{API Reference} -\label{api-reference} - - -\section{Classes} -The following classes are defined: - -\begin{center}\begin{tabular}{|lp{10cm}|} -\hline -Name & Description \\ -\hline -{\tt session} & A session \\ -{\tt task} & A long-running asynchronous task \\ -{\tt event} & Asynchronous event registration and handling \\ -{\tt VM} & A virtual machine (or 'guest') \\ -{\tt VM\_metrics} & The metrics associated with a VM \\ -{\tt VM\_guest\_metrics} & The metrics reported by the guest (as opposed to inferred from outside) \\ -{\tt host} & A physical host \\ -{\tt host\_metrics} & The metrics associated with a host \\ -{\tt host\_cpu} & A physical CPU \\ -{\tt network} & A virtual network \\ -{\tt VIF} & A virtual network interface \\ -{\tt VIF\_metrics} & The metrics associated with a virtual network device \\ -{\tt PIF} & A physical network interface (note separate VLANs are represented as several PIFs) \\ -{\tt PIF\_metrics} & The metrics associated with a physical network interface \\ -{\tt SR} & A storage repository \\ -{\tt VDI} & A virtual disk image \\ -{\tt VBD} & A virtual block device \\ -{\tt VBD\_metrics} & The metrics associated with a virtual block device \\ -{\tt PBD} & The physical block devices through which hosts access SRs \\ -{\tt crashdump} & A VM crashdump \\ -{\tt VTPM} & A virtual TPM device \\ -{\tt console} & A console \\ -{\tt DPCI} & A pass-through PCI device \\ -{\tt PPCI} & A physical PCI device \\ -{\tt DSCSI} & A half-virtualized SCSI device \\ -{\tt DSCSI\_HBA} & A half-virtualized SCSI host bus adapter \\ -{\tt PSCSI} & A physical SCSI device \\ -{\tt PSCSI\_HBA} & A physical SCSI host bus adapter \\ -{\tt user} & A user of the system \\ -{\tt debug} & A basic class for testing \\ -{\tt XSPolicy} & A class for handling Xen Security Policies \\ -{\tt ACMPolicy} & A class for handling ACM-type policies \\ -{\tt cpu\_pool} & A container for VMs which should shared the same host\_cpu(s) \\ -\hline -\end{tabular}\end{center} -\section{Relationships Between Classes} -Fields that are bound together are shown in the following table: -\begin{center}\begin{tabular}{|ll|l|} -\hline -{\em object.field} & {\em object.field} & {\em relationship} \\ - -\hline -host.PBDs & PBD.host & many-to-one\\ -SR.PBDs & PBD.SR & many-to-one\\ -VDI.VBDs & VBD.VDI & many-to-one\\ -VDI.crash\_dumps & crashdump.VDI & many-to-one\\ -VBD.VM & VM.VBDs & one-to-many\\ -crashdump.VM & VM.crash\_dumps & one-to-many\\ -VIF.VM & VM.VIFs & one-to-many\\ -VIF.network & network.VIFs & one-to-many\\ -PIF.host & host.PIFs & one-to-many\\ -PIF.network & network.PIFs & one-to-many\\ -SR.VDIs & VDI.SR & many-to-one\\ -VTPM.VM & VM.VTPMs & one-to-many\\ -console.VM & VM.consoles & one-to-many\\ -DPCI.VM & VM.DPCIs & one-to-many\\ -PPCI.host & host.PPCIs & one-to-many\\ -DSCSI.VM & VM.DSCSIs & one-to-many\\ -DSCSI.HBA & DSCSI\_HBA.DSCSIs & one-to-many\\ -DSCSI\_HBA.VM & VM.DSCSI\_HBAs & one-to-many\\ -PSCSI.host & host.PSCSIs & one-to-many\\ -PSCSI.HBA & PSCSI\_HBA.PSCSIs & one-to-many\\ -PSCSI\_HBA.host & host.PSCSI\_HBAs & one-to-many\\ -host.resident\_VMs & VM.resident\_on & many-to-one\\ -host.host\_CPUs & host\_cpu.host & many-to-one\\ -host.resident\_cpu\_pools & cpu\_pool.resident\_on & many-to-one\\ -cpu\_pool.started\_VMs & VM.cpu\_pool & many-to-one\\ -cpu\_pool.host\_CPUs & host\_cpu.cpu\_pool & many-to-one\\ -\hline -\end{tabular}\end{center} - -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}{!}{ -\includegraphics{xenapi-datamodel-graph} -}\end{center} -\ -\subsection{List of bound fields} -\section{Types} -\subsection{Primitives} -The following primitive types are used to specify methods and fields in the API Reference: - -\begin{center}\begin{tabular}{|ll|} -\hline -Type & Description \\ -\hline -String & text strings \\ -Int & 64-bit integers \\ -Float & IEEE double-precision floating-point numbers \\ -Bool & boolean \\ -DateTime & date and timestamp \\ -Ref (object name) & reference to an object of class name \\ -\hline -\end{tabular}\end{center} -\subsection{Higher order types} -The following type constructors are used: - -\begin{center}\begin{tabular}{|ll|} -\hline -Type & Description \\ -\hline -List (t) & an arbitrary-length list of elements of type t \\ -Map (a $\rightarrow$ b) & a table mapping values of type a to values of type b \\ -\hline -\end{tabular}\end{center} -\subsection{Enumeration types} -The following enumeration types are used: - -\begin{longtable}{|ll|} -\hline -{\tt enum event\_operation} & \\ -\hline -\hspace{0.5cm}{\tt add} & An object has been created \\ -\hspace{0.5cm}{\tt del} & An object has been deleted \\ -\hspace{0.5cm}{\tt mod} & An object has been modified \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline -{\tt enum console\_protocol} & \\ -\hline -\hspace{0.5cm}{\tt vt100} & VT100 terminal \\ -\hspace{0.5cm}{\tt rfb} & Remote FrameBuffer protocol (as used in VNC) \\ -\hspace{0.5cm}{\tt rdp} & Remote Desktop Protocol \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline -{\tt enum vdi\_type} & \\ -\hline -\hspace{0.5cm}{\tt system} & a disk that may be replaced on upgrade \\ -\hspace{0.5cm}{\tt user} & a disk that is always preserved on upgrade \\ -\hspace{0.5cm}{\tt ephemeral} & a disk that may be reformatted on upgrade \\ -\hspace{0.5cm}{\tt suspend} & a disk that stores a suspend image \\ -\hspace{0.5cm}{\tt crashdump} & a disk that stores VM crashdump information \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline -{\tt enum vm\_power\_state} & \\ -\hline -\hspace{0.5cm}{\tt Halted} & Halted \\ -\hspace{0.5cm}{\tt Paused} & Paused \\ -\hspace{0.5cm}{\tt Running} & Running \\ -\hspace{0.5cm}{\tt Suspended} & Suspended \\ -\hspace{0.5cm}{\tt Crashed} & Crashed \\ -\hspace{0.5cm}{\tt Unknown} & Some other unknown state \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline -{\tt enum task\_allowed\_operations} & \\ -\hline -\hspace{0.5cm}{\tt Cancel} & Cancel \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline -{\tt enum task\_status\_type} & \\ -\hline -\hspace{0.5cm}{\tt pending} & task is in progress \\ -\hspace{0.5cm}{\tt success} & task was completed successfully \\ -\hspace{0.5cm}{\tt failure} & task has failed \\ -\hspace{0.5cm}{\tt cancelling} & task is being cancelled \\ -\hspace{0.5cm}{\tt cancelled} & task has been cancelled \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline -{\tt enum on\_normal\_exit} & \\ -\hline -\hspace{0.5cm}{\tt destroy} & destroy the VM state \\ -\hspace{0.5cm}{\tt restart} & restart the VM \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline -{\tt enum on\_crash\_behaviour} & \\ -\hline -\hspace{0.5cm}{\tt destroy} & destroy the VM state \\ -\hspace{0.5cm}{\tt coredump\_and\_destroy} & record a coredump and then destroy the VM state \\ -\hspace{0.5cm}{\tt restart} & restart the VM \\ -\hspace{0.5cm}{\tt coredump\_and\_restart} & record a coredump and then restart the VM \\ -\hspace{0.5cm}{\tt preserve} & leave the crashed VM as-is \\ -\hspace{0.5cm}{\tt rename\_restart} & rename the crashed VM and start a new copy \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline -{\tt enum vbd\_mode} & \\ -\hline -\hspace{0.5cm}{\tt RO} & disk is mounted read-only \\ -\hspace{0.5cm}{\tt RW} & disk is mounted read-write \\ -\hline -\end{longtable} - -\vspace{1cm} -\begin{longtable}{|ll|} -\hline -{\tt enum vbd\_type} & \\ -\hline -\hspace{0.5cm}{\tt CD} & VBD will appear to guest as CD \\ -\hspace{0.5cm}{\tt Disk} & VBD will appear to guest as disk \\ -\hline -\end{longtable} - -\vspace{1cm} -\newpage - -\section{Error Handling} -When a low-level transport error occurs, or a request is malformed at the HTTP -or XML-RPC level, the server may send an XML-RPC Fault response, or the client -may simulate the same. The client must be prepared to handle these errors, -though they may be treated as fatal. On the wire, these are transmitted in a -form similar to this: - -\begin{verbatim} - - - - - - faultCode - -1 - - - faultString - Malformed request - - - - - -\end{verbatim} - -All other failures are reported with a more structured error response, to -allow better automatic response to failures, proper internationalisation of -any error message, and easier debugging. On the wire, these are transmitted -like this: - -\begin{verbatim} - - - Status - Failure - - - ErrorDescription - - - - MAP_DUPLICATE_KEY - Customer - eSpeil Inc. - eSpeil Incorporated - - - - - -\end{verbatim} - -Note that {\tt ErrorDescription} value is an array of string values. The -first element of the array is an error code; the remainder of the array are -strings representing error parameters relating to that code. In this case, -the client has attempted to add the mapping {\tt Customer $\rightarrow$ -eSpiel Incorporated} to a Map, but it already contains the mapping -{\tt Customer $\rightarrow$ eSpiel Inc.}, and so the request has failed. - -The reference below lists each possible error returned by each method. -As well as the errors explicitly listed, any method may return low-level -errors as described above, or any of the following generic errors: - -\begin{itemize} -\item HANDLE\_INVALID -\item INTERNAL\_ERROR -\item MAP\_DUPLICATE\_KEY -\item MESSAGE\_METHOD\_UNKNOWN -\item MESSAGE\_PARAMETER\_COUNT\_MISMATCH -\item OPERATION\_NOT\_ALLOWED -\item PERMISSION\_DENIED -\item SESSION\_INVALID -\end{itemize} - -Each possible error code is documented in the following section. - -\subsection{Error Codes} - -\subsubsection{HANDLE\_INVALID} - -You gave an invalid handle. The object may have recently been deleted. -The class parameter gives the type of reference given, and the handle -parameter echoes the bad value given. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}HANDLE_INVALID(class, handle)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{INTERNAL\_ERROR} - -The server failed to handle your request, due to an internal error. The -given message may give details useful for debugging the problem. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}INTERNAL_ERROR(message)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{MAP\_DUPLICATE\_KEY} - -You tried to add a key-value pair to a map, but that key is already there. -The key, current value, and the new value that you tried to set are all -echoed. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}MAP_DUPLICATE_KEY(key, current value, new value)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{MESSAGE\_METHOD\_UNKNOWN} - -You tried to call a method that does not exist. The method name that you -used is echoed. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}MESSAGE_METHOD_UNKNOWN(method)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{MESSAGE\_PARAMETER\_COUNT\_MISMATCH} - -You tried to call a method with the incorrect number of parameters. The -fully-qualified method name that you used, and the number of received and -expected parameters are returned. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}MESSAGE_PARAMETER_COUNT_MISMATCH(method, expected, received)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{NETWORK\_ALREADY\_CONNECTED} - -You tried to create a PIF, but the network you tried to attach it to is -already attached to some other PIF, and so the creation failed. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}NETWORK_ALREADY_CONNECTED(network, connected PIF)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{OPERATION\_NOT\_ALLOWED} - -You attempted an operation that was not allowed. - -\vspace{0.3cm} -No parameters. -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{PERMISSION\_DENIED} - -You do not have the required permissions to perform the operation. - -\vspace{0.3cm} -No parameters. -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{PIF\_IS\_PHYSICAL} - -You tried to destroy a PIF, but it represents an aspect of the physical -host configuration, and so cannot be destroyed. The parameter echoes the -PIF handle you gave. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}PIF_IS_PHYSICAL(PIF)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{SESSION\_AUTHENTICATION\_FAILED} - -The credentials given by the user are incorrect, so access has been denied, -and you have not been issued a session handle. - -\vspace{0.3cm} -No parameters. -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{SESSION\_INVALID} - -You gave an invalid session handle. It may have been invalidated by a -server restart, or timed out. You should get a new session handle, using -one of the session.login\_ calls. This error does not invalidate the -current connection. The handle parameter echoes the bad value given. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}SESSION_INVALID(handle)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{SESSION\_NOT\_REGISTERED} - -This session is not registered to receive events. You must call -event.register before event.next. The session handle you are using is -echoed. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}SESSION_NOT_REGISTERED(handle)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{VALUE\_NOT\_SUPPORTED} - -You attempted to set a value that is not supported by this implementation. -The fully-qualified field name and the value that you tried to set are -returned. Also returned is a developer-only diagnostic reason. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}VALUE_NOT_SUPPORTED(field, value, reason)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{VLAN\_TAG\_INVALID} - -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} -{\bf Signature:} -\begin{verbatim}VLAN_TAG_INVALID(VLAN)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{VM\_BAD\_POWER\_STATE} - -You attempted an operation on a VM that was not in an appropriate power -state at the time; for example, you attempted to start a VM that was -already running. The parameters returned are the VM's handle, and the -expected and actual VM state at the time of the call. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}VM_BAD_POWER_STATE(vm, expected, actual)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{VM\_HVM\_REQUIRED} - -HVM is required for this operation - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}VM_HVM_REQUIRED(vm)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{SECURITY\_ERROR} - -A security error occurred. The parameter provides the xen security -error code and a message describing the error. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}SECURITY_ERROR(xserr, message)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{POOL\_BAD\_STATE} - -You attempted an operation on a pool that was not in an appropriate state -at the time; for example, you attempted to activate a pool that was -already activated. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}POOL_BAD_STATE(current pool state)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{INSUFFICIENT\_CPUS} - -You attempted to activate a cpu\_pool but there are not enough -unallocated CPUs to satisfy the request. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}INSUFFICIENT_CPUS(needed cpu count, available cpu count)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{UNKOWN\_SCHED\_POLICY} - -The specified scheduler policy is unkown to the host. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}UNKOWN_SCHED_POLICY()\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{INVALID\_CPU} - -You tried to reconfigure a cpu\_pool with a CPU that is unkown to the host -or has a wrong state. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}INVALID_CPU(message)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - -\subsubsection{LAST\_CPU\_NOT\_REMOVEABLE} - -You tried to remove the last CPU from a cpu\_pool that has one or more -active domains. - -\vspace{0.3cm} -{\bf Signature:} -\begin{verbatim}LAST_CPU_NOT_REMOVEABLE(message)\end{verbatim} -\begin{center}\rule{10em}{0.1pt}\end{center} - - -\newpage -\section{Class: session} -\subsection{Fields for class: session} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf session} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -session.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt this\_host} & host ref & Currently connected host \\ -$\mathit{RO}_\mathit{run}$ & {\tt this\_user} & user ref & Currently connected user \\ -$\mathit{RO}_\mathit{run}$ & {\tt last\_active} & int & Timestamp for last time session was active \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: session} -\subsubsection{RPC name:~login\_with\_password} - -{\bf Overview:} -Attempt to authenticate the user, returning a session\_id if successful. - - \noindent {\bf Signature:} -\begin{verbatim} (session ref) login_with_password (string uname, string pwd)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uname & Username for login. \\ \hline - -{\tt string } & pwd & Password for login. \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -session ref -} - - -ID of newly created session - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt SESSION\_AUTHENTICATION\_FAILED} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~logout} - -{\bf Overview:} -Log out of a session. - - \noindent {\bf Signature:} -\begin{verbatim} void logout (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given session. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, session ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt session ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_this\_host} - -{\bf Overview:} -Get the this\_host field of the given session. - - \noindent {\bf Signature:} -\begin{verbatim} (host ref) get_this_host (session_id s, session ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt session ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_this\_user} - -{\bf Overview:} -Get the this\_user field of the given session. - - \noindent {\bf Signature:} -\begin{verbatim} (user ref) get_this_user (session_id s, session ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt session ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -user ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_last\_active} - -{\bf Overview:} -Get the last\_active field of the given session. - - \noindent {\bf Signature:} -\begin{verbatim} int get_last_active (session_id s, session ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt session ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the session instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (session ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -session ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given session. - - \noindent {\bf Signature:} -\begin{verbatim} (session record) get_record (session_id s, session ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt session ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -session record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: task} -\subsection{Fields for class: task} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf task} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -long-running asynchronous task.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt name/label} & string & a human-readable name \\ -$\mathit{RO}_\mathit{run}$ & {\tt name/description} & string & a notes field containg human-readable description \\ -$\mathit{RO}_\mathit{run}$ & {\tt status} & task\_status\_type & current status of the task \\ -$\mathit{RO}_\mathit{run}$ & {\tt session} & session ref & the session that created the task \\ -$\mathit{RO}_\mathit{run}$ & {\tt progress} & int & if the task is still pending, this field contains the estimated percentage complete (0-100). If task has completed (successfully or unsuccessfully) this should be 100. \\ -$\mathit{RO}_\mathit{run}$ & {\tt type} & string & if the task has completed successfully, this field contains the type of the encoded result (i.e. name of the class whose reference is in the result field). Undefined otherwise. \\ -$\mathit{RO}_\mathit{run}$ & {\tt result} & string & if the task has completed successfully, this field contains the result value (either Void or an object reference). Undefined otherwise. \\ -$\mathit{RO}_\mathit{run}$ & {\tt error\_info} & string Set & if the task has failed, this field contains the set of associated error strings. Undefined otherwise. \\ -$\mathit{RO}_\mathit{run}$ & {\tt allowed\_operations} & (task\_allowed\_operations) Set & Operations allowed on this task \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: task} -\subsubsection{RPC name:~cancel} - -{\bf Overview:} -Cancel this task. If task.allowed\_operations does not contain Cancel, -then this will fail with OPERATION\_NOT\_ALLOWED. The task will show the -status 'cancelling', and you should continue to check its status until it -shows 'cancelled'. There is no guarantee as to the time within which this -task will be cancelled. - - \noindent {\bf Signature:} -\begin{verbatim} void cancel (session_id s, task ref task)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & task & The task \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt OPERATION\_NOT\_ALLOWED} - -\vspace{0.6cm} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the tasks known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((task ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(task ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_label} - -{\bf Overview:} -Get the name/label field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_label (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_description} - -{\bf Overview:} -Get the name/description field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_description (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_status} - -{\bf Overview:} -Get the status field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} (task_status_type) get_status (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -task\_status\_type -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_session} - -{\bf Overview:} -Get the session field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} (session ref) get_session (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -session ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_progress} - -{\bf Overview:} -Get the progress field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} int get_progress (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_type} - -{\bf Overview:} -Get the type field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} string get_type (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_result} - -{\bf Overview:} -Get the result field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} string get_result (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_error\_info} - -{\bf Overview:} -Get the error\_info field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} (string Set) get_error_info (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_allowed\_operations} - -{\bf Overview:} -Get the allowed\_operations field of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} ((task_allowed_operations) Set) get_allowed_operations (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(task\_allowed\_operations) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the task instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (task ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -task ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given task. - - \noindent {\bf Signature:} -\begin{verbatim} (task record) get_record (session_id s, task ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt task ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -task record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_name\_label} - -{\bf Overview:} -Get all the task instances with the given label. - - \noindent {\bf Signature:} -\begin{verbatim} ((task ref) Set) get_by_name_label (session_id s, string label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & label & label of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(task ref) Set -} - - -references to objects with match names -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: event} -\subsection{Fields for class: event} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf event} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em -Asynchronous event registration and handling.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{ins}$ & {\tt id} & int & An ID, monotonically increasing, and local to the current session \\ -$\mathit{RO}_\mathit{ins}$ & {\tt timestamp} & datetime & The time at which the event occurred \\ -$\mathit{RO}_\mathit{ins}$ & {\tt class} & string & The name of the class of the object that changed \\ -$\mathit{RO}_\mathit{ins}$ & {\tt operation} & event\_operation & The operation that was performed \\ -$\mathit{RO}_\mathit{ins}$ & {\tt ref} & string & A reference to the object that changed \\ -$\mathit{RO}_\mathit{ins}$ & {\tt obj\_uuid} & string & The uuid of the object that changed \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: event} -\subsubsection{RPC name:~register} - -{\bf Overview:} -Registers this session with the event system. Specifying the empty list -will register for all classes. - - \noindent {\bf Signature:} -\begin{verbatim} void register (session_id s, string Set classes)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string Set } & classes & register for events for the indicated classes \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~unregister} - -{\bf Overview:} -Unregisters this session with the event system. - - \noindent {\bf Signature:} -\begin{verbatim} void unregister (session_id s, string Set classes)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string Set } & classes & remove this session's registration for the indicated classes \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~next} - -{\bf Overview:} -Blocking call which returns a (possibly empty) batch of events. - - \noindent {\bf Signature:} -\begin{verbatim} ((event record) Set) next (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(event record) Set -} - - -the batch of events -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt SESSION\_NOT\_REGISTERED} - -\vspace{0.6cm} - -\vspace{1cm} -\newpage -\section{Class: VM} -\subsection{Fields for class: VM} -\begin{longtable}{|llp{0.21\textwidth}p{0.33\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VM} \\ -\multicolumn{4}{|l|}{\parbox{11cm}{\em Description: A -virtual machine (or 'guest').}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt power\_state} & vm\_power\_state & Current power state of the machine \\ -$\mathit{RW}$ & {\tt name/label} & string & a human-readable name \\ -$\mathit{RW}$ & {\tt name/description} & string & a notes field containg human-readable description \\ -$\mathit{RW}$ & {\tt user\_version} & int & a user version number for this machine \\ -$\mathit{RW}$ & {\tt is\_a\_template} & bool & true if this is a template. Template VMs can never be started, they are used only for cloning other VMs \\ -$\mathit{RW}$ & {\tt auto\_power\_on} & bool & true if this VM should be started automatically after host boot \\ -$\mathit{RO}_\mathit{run}$ & {\tt suspend\_VDI} & VDI ref & The VDI that a suspend image is stored on. (Only has meaning if VM is currently suspended) \\ -$\mathit{RO}_\mathit{run}$ & {\tt resident\_on} & host ref & the host the VM is currently resident on \\ -$\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) 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 \\ -$\mathit{RW}$ & {\tt actions/after\_shutdown} & on\_normal\_exit & action to take after the guest has shutdown itself \\ -$\mathit{RW}$ & {\tt actions/after\_reboot} & on\_normal\_exit & action to take after the guest has rebooted itself \\ -$\mathit{RW}$ & {\tt actions/after\_crash} & on\_crash\_behaviour & action to take if the guest crashes \\ -$\mathit{RO}_\mathit{run}$ & {\tt consoles} & (console ref) Set & virtual console devices \\ -$\mathit{RO}_\mathit{run}$ & {\tt VIFs} & (VIF ref) Set & virtual network interfaces \\ -$\mathit{RO}_\mathit{run}$ & {\tt VBDs} & (VBD ref) Set & virtual block devices \\ -$\mathit{RO}_\mathit{run}$ & {\tt crash\_dumps} & (crashdump ref) Set & crash dumps associated with this VM \\ -$\mathit{RO}_\mathit{run}$ & {\tt VTPMs} & (VTPM ref) Set & virtual TPMs \\ -$\mathit{RO}_\mathit{run}$ & {\tt DPCIs} & (DPCI ref) Set & pass-through PCI devices \\ -$\mathit{RO}_\mathit{run}$ & {\tt DSCSIs} & (DSCSI ref) Set & half-virtualized SCSI devices \\ -$\mathit{RO}_\mathit{run}$ & {\tt DSCSI\_HBAs} & (DSCSI\_HBA ref) Set & half-virtualized SCSI host bus adapters \\ -$\mathit{RW}$ & {\tt PV/bootloader} & string & name of or path to bootloader \\ -$\mathit{RW}$ & {\tt PV/kernel} & string & URI of kernel \\ -$\mathit{RW}$ & {\tt PV/ramdisk} & string & URI of initrd \\ -$\mathit{RW}$ & {\tt PV/args} & string & kernel command-line arguments \\ -$\mathit{RW}$ & {\tt PV/bootloader\_args} & string & miscellaneous arguments for the bootloader \\ -$\mathit{RW}$ & {\tt HVM/boot\_policy} & string & HVM boot policy \\ -$\mathit{RW}$ & {\tt HVM/boot\_params} & (string $\rightarrow$ string) Map & HVM boot params \\ -$\mathit{RW}$ & {\tt platform} & (string $\rightarrow$ string) Map & platform-specific configuration \\ -$\mathit{RW}$ & {\tt PCI\_bus} & string & PCI bus path for pass-through devices \\ -$\mathit{RW}$ & {\tt other\_config} & (string $\rightarrow$ string) Map & additional configuration \\ -$\mathit{RO}_\mathit{run}$ & {\tt domid} & int & domain ID (if available, -1 otherwise) \\ -$\mathit{RO}_\mathit{run}$ & {\tt is\_control\_domain} & bool & true if this is a control domain (domain 0 or a driver domain) \\ -$\mathit{RO}_\mathit{run}$ & {\tt metrics} & VM\_metrics ref & metrics associated with this VM \\ -$\mathit{RO}_\mathit{run}$ & {\tt guest\_metrics} & VM\_guest\_metrics ref & metrics associated with the running guest \\ -$\mathit{RO}_\mathit{run}$ & {\tt security/label} & string & the VM's security label \\ -\hline -\end{longtable} -\subsection{Parameter Details} -\subsubsection{PV/kernel and PV/ramdisk} -The \texttt{PV/kernel} and \texttt{PV/ramdisk} parameters should be -specified as URIs with either a \texttt{file} or \texttt{data} scheme. - -The \texttt{file} scheme must be used when a file on the remote dom0 -should be used. The remote dom0 is the one where the guest system -should be started on. Only absolute filenames are supported, i.e. the -string must start with \texttt{file://} appended with the absolute -path. This is typically used when the guest system use the same -operating systems as the dom0 or there is some kind of shared storage -for the images inside the dom0s. - -Note that for compatibility reasons it is possible --- but not -recommended --- to leave out the scheme specification for -\texttt{file}, i.e. \texttt{file:///some/path} and \texttt{/some/path} -is equivalent. - -Examples (in python): - -Use kernel image which resides in the \texttt{/boot} directory: -\begin{verbatim} -xenapi.VM.create({ ... - 'PV_kernel': 'file:///boot/vmlinuz-2.6.26-2-xen-686', - ... }) -\end{verbatim} - -Use ramdisk image which resides on a (shared) nfs directory: -\begin{verbatim} -xenapi.VM.create({ ... - 'PV_ramdisk': 'file:///nfs/xen/debian/5.0.1/initrd.img-2.6.26-2-xen-686' - ... }) -\end{verbatim} - -When an image should be used which resides on the local system, -i.e. the system where the XenAPI call is send from, it is possible to -use the \texttt{data} URI scheme as described in \cite{RFC2397}. The -media-type must be set to \texttt{application/octet-stream}. -Currently only base64 encoding is supported. The URI must therefore -start with \texttt{data:application/octet-stream;base64,} followed by -the base64 encoded image. - -The \texttt{xen/util/fileuri.py} provides a helper function which -takes a local filename as parameter and build up the correct URI from -this. - -Examples (in python): - -Use kernel image specified inline: -\begin{verbatim} -xenapi.VM.create({ ... - 'PV_kernel': 'data:application/octet-stream;base64,H4Zu....' - # most of base64 encoded data is omitted - ... }) -\end{verbatim} - -Using the utility function: -\begin{verbatim} -from xen.util.fileuri import scheme_data -xenapi.VM.create({ ... - 'PV_kernel': scheme_data.create_from_file( - "/xen/guests/images/debian/5.0.1/vmlinuz-2.6.26-2-xen-686"), - ... }) -\end{verbatim} - -Currently when using the \texttt{data} URI scheme, a temporary file is -created on the remote dom0 in the directory -\texttt{/var/run/xend/boot} which is then used for booting. When not -used any longer the file is deleted. (Therefore reading of the -\texttt{PV/kernel} or \texttt{PV/ramdisk} parameters when created with -a \texttt{data} URI scheme returns a filename to a temporary file --- -which might even not exists when querying.) This implementation might -change in the way that the data is directly used --- without the -indirection using a file. Therefore do not rely on the data resulting -from a read of a variables which was set using the \texttt{data} -scheme. - -Note: a mix of different schemes for the parameters is possible; e.g. -the kernel can be specified with a \texttt{file} and the ramdisk with -the \texttt{data} URI scheme. - -\subsection{RPCs associated with class: VM} -\subsubsection{RPC name:~clone} - -{\bf Overview:} -Clones the specified VM, making a new VM. Clone automatically exploits the -capabilities of the underlying storage repository in which the VM's disk -images are stored (e.g. Copy on Write). This function can only be called -when the VM is in the Halted State. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) clone (session_id s, VM ref vm, string new_name)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to be cloned \\ \hline - -{\tt string } & new\_name & The name of the cloned VM \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -The ID of the newly created VM. -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~start} - -{\bf Overview:} -Start the specified VM. This function can only be called with the VM is in -the Halted State. - - \noindent {\bf Signature:} -\begin{verbatim} void start (session_id s, VM ref vm, bool start_paused)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to start \\ \hline - -{\tt bool } & start\_paused & Instantiate VM in paused state if set to true. \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE}, {\tt -VM\_HVM\_REQUIRED} - -\vspace{0.6cm} -\subsubsection{RPC name:~pause} - -{\bf Overview:} -Pause the specified VM. This can only be called when the specified VM is in -the Running state. - - \noindent {\bf Signature:} -\begin{verbatim} void pause (session_id s, VM ref vm)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to pause \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~unpause} - -{\bf Overview:} -Resume the specified VM. This can only be called when the specified VM is -in the Paused state. - - \noindent {\bf Signature:} -\begin{verbatim} void unpause (session_id s, VM ref vm)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to unpause \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~clean\_shutdown} - -{\bf Overview:} -Attempt to cleanly shutdown the specified VM. (Note: this may not be -supported---e.g. if a guest agent is not installed). - -Once shutdown has been completed perform poweroff action specified in guest -configuration. - -This can only be called when the specified VM is in the Running state. - - \noindent {\bf Signature:} -\begin{verbatim} void clean_shutdown (session_id s, VM ref vm)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to shutdown \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~clean\_reboot} - -{\bf Overview:} -Attempt to cleanly shutdown the specified VM (Note: this may not be -supported---e.g. if a guest agent is not installed). - -Once shutdown has been completed perform reboot action specified in guest -configuration. - -This can only be called when the specified VM is in the Running state. - - \noindent {\bf Signature:} -\begin{verbatim} void clean_reboot (session_id s, VM ref vm)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to shutdown \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~hard\_shutdown} - -{\bf Overview:} -Stop executing the specified VM without attempting a clean shutdown. Then -perform poweroff action specified in VM configuration. - - \noindent {\bf Signature:} -\begin{verbatim} void hard_shutdown (session_id s, VM ref vm)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to destroy \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~hard\_reboot} - -{\bf Overview:} -Stop executing the specified VM without attempting a clean shutdown. Then -perform reboot action specified in VM configuration. - - \noindent {\bf Signature:} -\begin{verbatim} void hard_reboot (session_id s, VM ref vm)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to reboot \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~suspend} - -{\bf Overview:} -Suspend the specified VM to disk. This can only be called when the -specified VM is in the Running state. - - \noindent {\bf Signature:} -\begin{verbatim} void suspend (session_id s, VM ref vm)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to suspend \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~resume} - -{\bf Overview:} -Awaken the specified VM and resume it. This can only be called when the -specified VM is in the Suspended state. - - \noindent {\bf Signature:} -\begin{verbatim} void resume (session_id s, VM ref vm, bool start_paused)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM to resume \\ \hline - -{\tt bool } & start\_paused & Resume VM in paused state if set to true. \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~set\_VCPUs\_number\_live} - -{\bf Overview:} -Set this VM's VCPUs/at\_startup value, and set the same value on the VM, if -running. - - \noindent {\bf Signature:} -\begin{verbatim} void set_VCPUs_number_live (session_id s, VM ref self, int nvcpu)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & The VM \\ \hline - -{\tt int } & nvcpu & The number of VCPUs \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_VCPUs\_params\_live} - -{\bf Overview:} -Add the given key-value pair to VM.VCPUs\_params, and apply that value on -the running VM. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_VCPUs_params_live (session_id s, VM ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & The VM \\ \hline - -{\tt string } & key & The key \\ \hline - -{\tt string } & value & The value \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_memory\_dynamic\_max\_live} - -{\bf Overview:} -Set memory\_dynamic\_max in database and on running VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_memory_dynamic_max_live (session_id s, VM ref self, int max)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & The VM \\ \hline - -{\tt int } & max & The memory\_dynamic\_max value \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_memory\_dynamic\_min\_live} - -{\bf Overview:} -Set memory\_dynamic\_min in database and on running VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_memory_dynamic_min_live (session_id s, VM ref self, int min)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & The VM \\ \hline - -{\tt int } & min & The memory\_dynamic\_min value \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~send\_sysrq} - -{\bf Overview:} -Send the given key as a sysrq to this VM. The key is specified as a single -character (a String of length 1). This can only be called when the -specified VM is in the Running state. - - \noindent {\bf Signature:} -\begin{verbatim} void send_sysrq (session_id s, VM ref vm, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM \\ \hline - -{\tt string } & key & The key to send \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~send\_trigger} - -{\bf Overview:} -Send the named trigger to this VM. This can only be called when the -specified VM is in the Running state. - - \noindent {\bf Signature:} -\begin{verbatim} void send_trigger (session_id s, VM ref vm, string trigger)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM \\ \hline - -{\tt string } & trigger & The trigger to send \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~migrate} - -{\bf Overview:} -Migrate the VM to another host. This can only be called when the specified -VM is in the Running state. - - \noindent {\bf Signature:} -\begin{verbatim} void migrate (session_id s, VM ref vm, string dest, bool live, (string -> string) Map options)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & vm & The VM \\ \hline - -{\tt string } & dest & The destination host \\ \hline - -{\tt bool } & live & Live migration \\ \hline - -{\tt (string $\rightarrow$ string) Map } & options & Other parameters \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VM\_BAD\_POWER\_STATE} - -\vspace{0.6cm} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the VMs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((VM ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VM ref) Set -} - - -A list of all the IDs of all the VMs -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_power\_state} - -{\bf Overview:} -Get the power\_state field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (vm_power_state) get_power_state (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -vm\_power\_state -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_label} - -{\bf Overview:} -Get the name/label field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_label (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_label} - -{\bf Overview:} -Set the name/label field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_label (session_id s, VM ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_description} - -{\bf Overview:} -Get the name/description field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_description (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_description} - -{\bf Overview:} -Set the name/description field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_description (session_id s, VM ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_user\_version} - -{\bf Overview:} -Get the user\_version field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} int get_user_version (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_user\_version} - -{\bf Overview:} -Set the user\_version field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_user_version (session_id s, VM ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_is\_a\_template} - -{\bf Overview:} -Get the is\_a\_template field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_is_a_template (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_is\_a\_template} - -{\bf Overview:} -Set the is\_a\_template field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_is_a_template (session_id s, VM ref self, bool value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt bool } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_auto\_power\_on} - -{\bf Overview:} -Get the auto\_power\_on field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_auto_power_on (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_auto\_power\_on} - -{\bf Overview:} -Set the auto\_power\_on field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_auto_power_on (session_id s, VM ref self, bool value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt bool } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_suspend\_VDI} - -{\bf Overview:} -Get the suspend\_VDI field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (VDI ref) get_suspend_VDI (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VDI ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_resident\_on} - -{\bf Overview:} -Get the resident\_on field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (host ref) get_resident_on (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_memory\_static\_max} - -{\bf Overview:} -Get the memory/static\_max field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} int get_memory_static_max (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_memory\_static\_max} - -{\bf Overview:} -Set the memory/static\_max field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_memory_static_max (session_id s, VM ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_memory\_dynamic\_max} - -{\bf Overview:} -Get the memory/dynamic\_max field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} int get_memory_dynamic_max (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_memory\_dynamic\_max} - -{\bf Overview:} -Set the memory/dynamic\_max field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_memory_dynamic_max (session_id s, VM ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_memory\_dynamic\_min} - -{\bf Overview:} -Get the memory/dynamic\_min field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} int get_memory_dynamic_min (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_memory\_dynamic\_min} - -{\bf Overview:} -Set the memory/dynamic\_min field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_memory_dynamic_min (session_id s, VM ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_memory\_static\_min} - -{\bf Overview:} -Get the memory/static\_min field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} int get_memory_static_min (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_memory\_static\_min} - -{\bf Overview:} -Set the memory/static\_min field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_memory_static_min (session_id s, VM ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VCPUs\_params} - -{\bf Overview:} -Get the VCPUs/params field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_VCPUs_params (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_VCPUs\_params} - -{\bf Overview:} -Set the VCPUs/params field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_VCPUs_params (session_id s, VM ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_VCPUs\_params} - -{\bf Overview:} -Add the given key-value pair to the VCPUs/params field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_VCPUs_params (session_id s, VM ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_VCPUs\_params} - -{\bf Overview:} -Remove the given key and its corresponding value from the VCPUs/params -field of the given VM. If the key is not in that Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_VCPUs_params (session_id s, VM ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VCPUs\_max} - -{\bf Overview:} -Get the VCPUs/max field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} int get_VCPUs_max (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_VCPUs\_max} - -{\bf Overview:} -Set the VCPUs/max field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_VCPUs_max (session_id s, VM ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VCPUs\_at\_startup} - -{\bf Overview:} -Get the VCPUs/at\_startup field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} int get_VCPUs_at_startup (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_VCPUs\_at\_startup} - -{\bf Overview:} -Set the VCPUs/at\_startup field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_VCPUs_at_startup (session_id s, VM ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_actions\_after\_shutdown} - -{\bf Overview:} -Get the actions/after\_shutdown field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (on_normal_exit) get_actions_after_shutdown (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -on\_normal\_exit -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_actions\_after\_shutdown} - -{\bf Overview:} -Set the actions/after\_shutdown field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_actions_after_shutdown (session_id s, VM ref self, on_normal_exit value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt on\_normal\_exit } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_actions\_after\_reboot} - -{\bf Overview:} -Get the actions/after\_reboot field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (on_normal_exit) get_actions_after_reboot (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -on\_normal\_exit -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_actions\_after\_reboot} - -{\bf Overview:} -Set the actions/after\_reboot field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_actions_after_reboot (session_id s, VM ref self, on_normal_exit value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt on\_normal\_exit } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_actions\_after\_crash} - -{\bf Overview:} -Get the actions/after\_crash field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (on_crash_behaviour) get_actions_after_crash (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -on\_crash\_behaviour -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_actions\_after\_crash} - -{\bf Overview:} -Set the actions/after\_crash field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_actions_after_crash (session_id s, VM ref self, on_crash_behaviour value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt on\_crash\_behaviour } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_consoles} - -{\bf Overview:} -Get the consoles field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((console ref) Set) get_consoles (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(console ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VIFs} - -{\bf Overview:} -Get the VIFs field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((VIF ref) Set) get_VIFs (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VIF ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VBDs} - -{\bf Overview:} -Get the VBDs field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((VBD ref) Set) get_VBDs (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VBD ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_crash\_dumps} - -{\bf Overview:} -Get the crash\_dumps field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((crashdump ref) Set) get_crash_dumps (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(crashdump ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VTPMs} - -{\bf Overview:} -Get the VTPMs field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((VTPM ref) Set) get_VTPMs (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VTPM ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_DPCIs} - -{\bf Overview:} -Get the DPCIs field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((DPCI ref) Set) get_DPCIs (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(DPCI ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_DSCSIs} - -{\bf Overview:} -Get the DSCSIs field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((DSCSI ref) Set) get_DSCSIs (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(DSCSI ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_DSCSI\_HBAs} - -{\bf Overview:} -Get the DSCSI\_HBAs field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((DSCSI_HBA ref) Set) get_DSCSI_HBAs (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(DSCSI\_HBA ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PV\_bootloader} - -{\bf Overview:} -Get the PV/bootloader field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_PV_bootloader (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_PV\_bootloader} - -{\bf Overview:} -Set the PV/bootloader field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_PV_bootloader (session_id s, VM ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PV\_kernel} - -{\bf Overview:} -Get the PV/kernel field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_PV_kernel (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_PV\_kernel} - -{\bf Overview:} -Set the PV/kernel field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_PV_kernel (session_id s, VM ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PV\_ramdisk} - -{\bf Overview:} -Get the PV/ramdisk field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_PV_ramdisk (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_PV\_ramdisk} - -{\bf Overview:} -Set the PV/ramdisk field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_PV_ramdisk (session_id s, VM ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PV\_args} - -{\bf Overview:} -Get the PV/args field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_PV_args (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_PV\_args} - -{\bf Overview:} -Set the PV/args field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_PV_args (session_id s, VM ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PV\_bootloader\_args} - -{\bf Overview:} -Get the PV/bootloader\_args field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_PV_bootloader_args (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_PV\_bootloader\_args} - -{\bf Overview:} -Set the PV/bootloader\_args field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_PV_bootloader_args (session_id s, VM ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_HVM\_boot\_policy} - -{\bf Overview:} -Get the HVM/boot\_policy field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_HVM_boot_policy (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_HVM\_boot\_policy} - -{\bf Overview:} -Set the HVM/boot\_policy field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_HVM_boot_policy (session_id s, VM ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_HVM\_boot\_params} - -{\bf Overview:} -Get the HVM/boot\_params field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_HVM_boot_params (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_HVM\_boot\_params} - -{\bf Overview:} -Set the HVM/boot\_params field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_HVM_boot_params (session_id s, VM ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_HVM\_boot\_params} - -{\bf Overview:} -Add the given key-value pair to the HVM/boot\_params field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_HVM_boot_params (session_id s, VM ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_HVM\_boot\_params} - -{\bf Overview:} -Remove the given key and its corresponding value from the HVM/boot\_params -field of the given VM. If the key is not in that Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_HVM_boot_params (session_id s, VM ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_platform} - -{\bf Overview:} -Get the platform field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_platform (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_platform} - -{\bf Overview:} -Set the platform field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_platform (session_id s, VM ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_platform} - -{\bf Overview:} -Add the given key-value pair to the platform field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_platform (session_id s, VM ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_platform} - -{\bf Overview:} -Remove the given key and its corresponding value from the platform field of -the given VM. If the key is not in that Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_platform (session_id s, VM ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PCI\_bus} - -{\bf Overview:} -Get the PCI\_bus field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_PCI_bus (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_PCI\_bus} - -{\bf Overview:} -Set the PCI\_bus field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_PCI_bus (session_id s, VM ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_other\_config} - -{\bf Overview:} -Get the other\_config field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_other_config (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_other\_config} - -{\bf Overview:} -Set the other\_config field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_other_config (session_id s, VM ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_other\_config} - -{\bf Overview:} -Add the given key-value pair to the other\_config field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_other_config (session_id s, VM ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_other\_config} - -{\bf Overview:} -Remove the given key and its corresponding value from the other\_config -field of the given VM. If the key is not in that Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_other_config (session_id s, VM ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_domid} - -{\bf Overview:} -Get the domid field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} int get_domid (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_is\_control\_domain} - -{\bf Overview:} -Get the is\_control\_domain field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_is_control_domain (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_metrics} - -{\bf Overview:} -Get the metrics field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (VM_metrics ref) get_metrics (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM\_metrics ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_guest\_metrics} - -{\bf Overview:} -Get the guest\_metrics field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (VM_guest_metrics ref) get_guest_metrics (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM\_guest\_metrics ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_security\_label} - -{\bf Overview:} -Get the security label field of the given VM. Refer to the XSPolicy class -for the format of the security label. - - \noindent {\bf Signature:} -\begin{verbatim} string get_security_label (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_security\_label} - -{\bf Overview:} -Set the security label field of the given VM. Refer to the XSPolicy class -for the format of the security label. - - \noindent {\bf Signature:} -\begin{verbatim} int set_security_label (session_id s, VM ref self, string -security_label, string old_label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline -{\tt string } & security\_label & security label for the VM \\ \hline -{\tt string } & old\_label & Label value that the security label \\ -& & must currently have for the change to succeed.\\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -Returns the ssidref in case of an VM that is currently running or -paused, zero in case of a dormant VM (halted, suspended). - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt SECURITY\_ERROR} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new VM instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) create (session_id s, VM record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified VM. The VM is completely removed from the system. -This function can only be called when the VM is in the Halted State. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the VM instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} (VM record) get_record (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_name\_label} - -{\bf Overview:} -Get all the VM instances with the given label. - - \noindent {\bf Signature:} -\begin{verbatim} ((VM ref) Set) get_by_name_label (session_id s, string label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & label & label of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VM ref) Set -} - - -references to objects with match names -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_cpu\_pool} - -{\bf Overview:} -Get the cpu\_pool field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} ((cpu_pool ref) Set) get_cpu_pool (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(cpu\_pool ref) Set -} - - -references to cpu\_pool objects. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_pool\_name} - -{\bf Overview:} -Get the pool\_name field of the given VM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_cpu_pool (session_id s, VM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -name of cpu pool to use -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~cpu\_pool\_migrate} - -{\bf Overview:} -Migrate the VM to another cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void cpu_pool_migrate (session_id s, VM ref self, cpu_pool ref pool)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline -{\tt cpu\_pool ref} & pool & reference to new cpu\_pool \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt POOL\_BAD\_STATE, VM\_BAD\_POWER\_STATE} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_pool\_name} - -{\bf Overview:} -Set cpu pool name to use for next activation. - - \noindent {\bf Signature:} -\begin{verbatim} void set_pool_name (session_id s, VM ref self, string pool\_name)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM ref } & self & reference to the object \\ \hline -{\tt string} & pool\_name & New pool name \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - - - - -\vspace{1cm} -\newpage -\section{Class: VM\_metrics} -\subsection{Fields for class: VM\_metrics} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VM\_metrics} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em -The metrics associated with a VM.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt memory/actual} & int & Guest's actual memory (bytes) \\ -$\mathit{RO}_\mathit{run}$ & {\tt VCPUs/number} & int & Current number of VCPUs \\ -$\mathit{RO}_\mathit{run}$ & {\tt VCPUs/utilisation} & (int $\rightarrow$ float) Map & Utilisation for all of guest's current VCPUs \\ -$\mathit{RO}_\mathit{run}$ & {\tt VCPUs/CPU} & (int $\rightarrow$ int) Map & VCPU to PCPU map \\ -$\mathit{RO}_\mathit{run}$ & {\tt VCPUs/params} & (string $\rightarrow$ string) Map & The live equivalent to VM.VCPUs\_params \\ -$\mathit{RO}_\mathit{run}$ & {\tt VCPUs/flags} & (int $\rightarrow$ string Set) Map & CPU flags (blocked,online,running) \\ -$\mathit{RO}_\mathit{run}$ & {\tt state} & string Set & The state of the guest, eg blocked, dying etc \\ -$\mathit{RO}_\mathit{run}$ & {\tt start\_time} & datetime & Time at which this VM was last booted \\ -$\mathit{RO}_\mathit{run}$ & {\tt last\_updated} & datetime & Time at which this information was last updated \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: VM\_metrics} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the VM\_metrics instances known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((VM_metrics ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VM\_metrics ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_memory\_actual} - -{\bf Overview:} -Get the memory/actual field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} int get_memory_actual (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VCPUs\_number} - -{\bf Overview:} -Get the VCPUs/number field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} int get_VCPUs_number (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VCPUs\_utilisation} - -{\bf Overview:} -Get the VCPUs/utilisation field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((int -> float) Map) get_VCPUs_utilisation (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(int $\rightarrow$ float) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VCPUs\_CPU} - -{\bf Overview:} -Get the VCPUs/CPU field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((int -> int) Map) get_VCPUs_CPU (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(int $\rightarrow$ int) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VCPUs\_params} - -{\bf Overview:} -Get the VCPUs/params field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_VCPUs_params (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VCPUs\_flags} - -{\bf Overview:} -Get the VCPUs/flags field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((int -> string Set) Map) get_VCPUs_flags (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(int $\rightarrow$ string Set) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_state} - -{\bf Overview:} -Get the state field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} (string Set) get_state (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_start\_time} - -{\bf Overview:} -Get the start\_time field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} datetime get_start_time (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -datetime -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_last\_updated} - -{\bf Overview:} -Get the last\_updated field of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} datetime get_last_updated (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -datetime -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the VM\_metrics instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (VM_metrics ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM\_metrics ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given VM\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} (VM_metrics record) get_record (session_id s, VM_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM\_metrics record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: VM\_guest\_metrics} -\subsection{Fields for class: VM\_guest\_metrics} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VM\_guest\_metrics} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em -The metrics reported by the guest (as opposed to inferred from outside).}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt os\_version} & (string $\rightarrow$ string) Map & version of the OS \\ -$\mathit{RO}_\mathit{run}$ & {\tt PV\_drivers\_version} & (string $\rightarrow$ string) Map & version of the PV drivers \\ -$\mathit{RO}_\mathit{run}$ & {\tt memory} & (string $\rightarrow$ string) Map & free/used/total memory \\ -$\mathit{RO}_\mathit{run}$ & {\tt disks} & (string $\rightarrow$ string) Map & disk configuration/free space \\ -$\mathit{RO}_\mathit{run}$ & {\tt networks} & (string $\rightarrow$ string) Map & network configuration \\ -$\mathit{RO}_\mathit{run}$ & {\tt other} & (string $\rightarrow$ string) Map & anything else \\ -$\mathit{RO}_\mathit{run}$ & {\tt last\_updated} & datetime & Time at which this information was last updated \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: VM\_guest\_metrics} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the VM\_guest\_metrics instances known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((VM_guest_metrics ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VM\_guest\_metrics ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given VM\_guest\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, VM_guest_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_os\_version} - -{\bf Overview:} -Get the os\_version field of the given VM\_guest\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_os_version (session_id s, VM_guest_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PV\_drivers\_version} - -{\bf Overview:} -Get the PV\_drivers\_version field of the given VM\_guest\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_PV_drivers_version (session_id s, VM_guest_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_memory} - -{\bf Overview:} -Get the memory field of the given VM\_guest\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_memory (session_id s, VM_guest_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_disks} - -{\bf Overview:} -Get the disks field of the given VM\_guest\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_disks (session_id s, VM_guest_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_networks} - -{\bf Overview:} -Get the networks field of the given VM\_guest\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_networks (session_id s, VM_guest_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_other} - -{\bf Overview:} -Get the other field of the given VM\_guest\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_other (session_id s, VM_guest_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_last\_updated} - -{\bf Overview:} -Get the last\_updated field of the given VM\_guest\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} datetime get_last_updated (session_id s, VM_guest_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -datetime -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the VM\_guest\_metrics instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (VM_guest_metrics ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM\_guest\_metrics ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given VM\_guest\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} (VM_guest_metrics record) get_record (session_id s, VM_guest_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VM\_guest\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM\_guest\_metrics record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: host} -\subsection{Fields for class: host} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf host} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -physical host.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RW}$ & {\tt name/label} & string & a human-readable name \\ -$\mathit{RW}$ & {\tt name/description} & string & a notes field containg human-readable description \\ -$\mathit{RO}_\mathit{run}$ & {\tt API\_version/major} & int & major version number \\ -$\mathit{RO}_\mathit{run}$ & {\tt API\_version/minor} & int & minor version number \\ -$\mathit{RO}_\mathit{run}$ & {\tt API\_version/vendor} & string & identification of vendor \\ -$\mathit{RO}_\mathit{run}$ & {\tt API\_version/vendor\_implementation} & (string $\rightarrow$ string) Map & details of vendor implementation \\ -$\mathit{RO}_\mathit{run}$ & {\tt enabled} & bool & True if the host is currently enabled \\ -$\mathit{RO}_\mathit{run}$ & {\tt software\_version} & (string $\rightarrow$ string) Map & version strings \\ -$\mathit{RW}$ & {\tt other\_config} & (string $\rightarrow$ string) Map & additional configuration \\ -$\mathit{RO}_\mathit{run}$ & {\tt capabilities} & string Set & Xen capabilities \\ -$\mathit{RO}_\mathit{run}$ & {\tt cpu\_configuration} & (string $\rightarrow$ string) Map & The CPU configuration on this host. May contain keys such as ``nr\_nodes'', ``sockets\_per\_node'', ``cores\_per\_socket'', or ``threads\_per\_core'' \\ -$\mathit{RO}_\mathit{run}$ & {\tt sched\_policy} & string & Scheduler policy currently in force on this host \\ -$\mathit{RO}_\mathit{run}$ & {\tt supported\_bootloaders} & string Set & a list of the bootloaders installed on the machine \\ -$\mathit{RO}_\mathit{run}$ & {\tt resident\_VMs} & (VM ref) Set & list of VMs currently resident on host \\ -$\mathit{RW}$ & {\tt logging} & (string $\rightarrow$ string) Map & logging configuration \\ -$\mathit{RO}_\mathit{run}$ & {\tt PIFs} & (PIF ref) Set & physical network interfaces \\ -$\mathit{RW}$ & {\tt suspend\_image\_sr} & SR ref & The SR in which VDIs for suspend images are created \\ -$\mathit{RW}$ & {\tt crash\_dump\_sr} & SR ref & The SR in which VDIs for crash dumps are created \\ -$\mathit{RO}_\mathit{run}$ & {\tt PBDs} & (PBD ref) Set & physical blockdevices \\ -$\mathit{RO}_\mathit{run}$ & {\tt PPCIs} & (PPCI ref) Set & physical PCI devices \\ -$\mathit{RO}_\mathit{run}$ & {\tt PSCSIs} & (PSCSI ref) Set & physical SCSI devices \\ -$\mathit{RO}_\mathit{run}$ & {\tt PSCSI\_HBAs} & (PSCSI\_HBA ref) Set & physical SCSI host bus adapters \\ -$\mathit{RO}_\mathit{run}$ & {\tt host\_CPUs} & (host\_cpu ref) Set & The physical CPUs on this host \\ -$\mathit{RO}_\mathit{run}$ & {\tt metrics} & host\_metrics ref & metrics associated with this host \\ -$\mathit{RO}_\mathit{run}$ & {\tt resident\_cpu\_pools} & (cpu\_pool ref) Set & list of cpu\_pools currently resident on the host \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: host} -\subsubsection{RPC name:~disable} - -{\bf Overview:} -Puts the host into a state in which no new VMs can be started. Currently -active VMs on the host continue to execute. - - \noindent {\bf Signature:} -\begin{verbatim} void disable (session_id s, host ref host)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & host & The Host to disable \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~enable} - -{\bf Overview:} -Puts the host into a state in which new VMs can be started. - - \noindent {\bf Signature:} -\begin{verbatim} void enable (session_id s, host ref host)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & host & The Host to enable \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~shutdown} - -{\bf Overview:} -Shutdown the host. (This function can only be called if there are no -currently running VMs on the host and it is disabled.). - - \noindent {\bf Signature:} -\begin{verbatim} void shutdown (session_id s, host ref host)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & host & The Host to shutdown \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~reboot} - -{\bf Overview:} -Reboot the host. (This function can only be called if there are no -currently running VMs on the host and it is disabled.). - - \noindent {\bf Signature:} -\begin{verbatim} void reboot (session_id s, host ref host)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & host & The Host to reboot \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~dmesg} - -{\bf Overview:} -Get the host xen dmesg. - - \noindent {\bf Signature:} -\begin{verbatim} string dmesg (session_id s, host ref host)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & host & The Host to query \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -dmesg string -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~dmesg\_clear} - -{\bf Overview:} -Get the host xen dmesg, and clear the buffer. - - \noindent {\bf Signature:} -\begin{verbatim} string dmesg_clear (session_id s, host ref host)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & host & The Host to query \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -dmesg string -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_log} - -{\bf Overview:} -Get the host's log file. - - \noindent {\bf Signature:} -\begin{verbatim} string get_log (session_id s, host ref host)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & host & The Host to query \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -The contents of the host's primary log file -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~send\_debug\_keys} - -{\bf Overview:} -Inject the given string as debugging keys into Xen. - - \noindent {\bf Signature:} -\begin{verbatim} void send_debug_keys (session_id s, host ref host, string keys)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & host & The host \\ \hline - -{\tt string } & keys & The keys to send \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~list\_methods} - -{\bf Overview:} -List all supported methods. - - \noindent {\bf Signature:} -\begin{verbatim} (string Set) list_methods (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string Set -} - - -The name of every supported method. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the hosts known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((host ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(host ref) Set -} - - -A list of all the IDs of all the hosts -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_label} - -{\bf Overview:} -Get the name/label field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_label (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_label} - -{\bf Overview:} -Set the name/label field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_label (session_id s, host ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_description} - -{\bf Overview:} -Get the name/description field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_description (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_description} - -{\bf Overview:} -Set the name/description field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_description (session_id s, host ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_API\_version\_major} - -{\bf Overview:} -Get the API\_version/major field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} int get_API_version_major (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_API\_version\_minor} - -{\bf Overview:} -Get the API\_version/minor field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} int get_API_version_minor (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_API\_version\_vendor} - -{\bf Overview:} -Get the API\_version/vendor field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} string get_API_version_vendor (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_API\_version\_vendor\_implementation} - -{\bf Overview:} -Get the API\_version/vendor\_implementation field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_API_version_vendor_implementation (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_enabled} - -{\bf Overview:} -Get the enabled field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_enabled (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_software\_version} - -{\bf Overview:} -Get the software\_version field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_software_version (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_other\_config} - -{\bf Overview:} -Get the other\_config field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_other_config (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_other\_config} - -{\bf Overview:} -Set the other\_config field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} void set_other_config (session_id s, host ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_other\_config} - -{\bf Overview:} -Add the given key-value pair to the other\_config field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_other_config (session_id s, host ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_other\_config} - -{\bf Overview:} -Remove the given key and its corresponding value from the other\_config -field of the given host. If the key is not in that Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_other_config (session_id s, host ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_capabilities} - -{\bf Overview:} -Get the capabilities field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} (string Set) get_capabilities (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_cpu\_configuration} - -{\bf Overview:} -Get the cpu\_configuration field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_cpu_configuration (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_sched\_policy} - -{\bf Overview:} -Get the sched\_policy field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} string get_sched_policy (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_supported\_bootloaders} - -{\bf Overview:} -Get the supported\_bootloaders field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} (string Set) get_supported_bootloaders (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_resident\_VMs} - -{\bf Overview:} -Get the resident\_VMs field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((VM ref) Set) get_resident_VMs (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VM ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_logging} - -{\bf Overview:} -Get the logging field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_logging (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_logging} - -{\bf Overview:} -Set the logging field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} void set_logging (session_id s, host ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_logging} - -{\bf Overview:} -Add the given key-value pair to the logging field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_logging (session_id s, host ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_logging} - -{\bf Overview:} -Remove the given key and its corresponding value from the logging field of -the given host. If the key is not in that Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_logging (session_id s, host ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PIFs} - -{\bf Overview:} -Get the PIFs field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((PIF ref) Set) get_PIFs (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PIF ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_suspend\_image\_sr} - -{\bf Overview:} -Get the suspend\_image\_sr field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} (SR ref) get_suspend_image_sr (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -SR ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_suspend\_image\_sr} - -{\bf Overview:} -Set the suspend\_image\_sr field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} void set_suspend_image_sr (session_id s, host ref self, SR ref value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt SR ref } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_crash\_dump\_sr} - -{\bf Overview:} -Get the crash\_dump\_sr field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} (SR ref) get_crash_dump_sr (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -SR ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_crash\_dump\_sr} - -{\bf Overview:} -Set the crash\_dump\_sr field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} void set_crash_dump_sr (session_id s, host ref self, SR ref value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -{\tt SR ref } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PBDs} - -{\bf Overview:} -Get the PBDs field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((PBD ref) Set) get_PBDs (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PBD ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PPCIs} - -{\bf Overview:} -Get the PPCIs field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((PPCI ref) Set) get_PPCIs (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PPCI ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PSCSIs} - -{\bf Overview:} -Get the PSCSIs field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((PSCSI ref) Set) get_PSCSIs (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PSCSI ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PSCSI\_HBAs} - -{\bf Overview:} -Get the PSCSI\_HBAs field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((PSCSI_HBA ref) Set) get_PSCSI_HBAs (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PSCSI\_HBA ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_host\_CPUs} - -{\bf Overview:} -Get the host\_CPUs field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((host_cpu ref) Set) get_host_CPUs (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(host\_cpu ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_metrics} - -{\bf Overview:} -Get the metrics field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} (host_metrics ref) get_metrics (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host\_metrics ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the host instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (host ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} (host record) get_record (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_name\_label} - -{\bf Overview:} -Get all the host instances with the given label. - - \noindent {\bf Signature:} -\begin{verbatim} ((host ref) Set) get_by_name_label (session_id s, string label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & label & label of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(host ref) Set -} - - -references to objects with match names -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_resident\_cpu\_pools} - -{\bf Overview:} -Get the resident\_cpu\_pools field of the given host. - - \noindent {\bf Signature:} -\begin{verbatim} ((cpu_pool ref) Set) get_resident_cpu_pools (session_id s, host ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(cpu\_pool ref) Set -} - - -references to all known cpu\_pools. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - - -\vspace{1cm} -\newpage -\section{Class: host\_metrics} -\subsection{Fields for class: host\_metrics} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf host\_metrics} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em -The metrics associated with a host.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt memory/total} & int & Host's total memory (bytes) \\ -$\mathit{RO}_\mathit{run}$ & {\tt memory/free} & int & Host's free memory (bytes) \\ -$\mathit{RO}_\mathit{run}$ & {\tt last\_updated} & datetime & Time at which this information was last updated \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: host\_metrics} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the host\_metrics instances known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((host_metrics ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(host\_metrics ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given host\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, host_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_memory\_total} - -{\bf Overview:} -Get the memory/total field of the given host\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} int get_memory_total (session_id s, host_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_memory\_free} - -{\bf Overview:} -Get the memory/free field of the given host\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} int get_memory_free (session_id s, host_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_last\_updated} - -{\bf Overview:} -Get the last\_updated field of the given host\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} datetime get_last_updated (session_id s, host_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -datetime -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the host\_metrics instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (host_metrics ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host\_metrics ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given host\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} (host_metrics record) get_record (session_id s, host_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host\_metrics record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: host\_cpu} -\subsection{Fields for class: host\_cpu} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf host\_cpu} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A physical CPU}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt host} & host ref & the host the CPU is in \\ -$\mathit{RO}_\mathit{run}$ & {\tt number} & int & the number of the physical CPU within the host \\ -$\mathit{RO}_\mathit{run}$ & {\tt vendor} & string & the vendor of the physical CPU \\ -$\mathit{RO}_\mathit{run}$ & {\tt speed} & int & the speed of the physical CPU \\ -$\mathit{RO}_\mathit{run}$ & {\tt modelname} & string & the model name of the physical CPU \\ -$\mathit{RO}_\mathit{run}$ & {\tt stepping} & string & the stepping of the physical CPU \\ -$\mathit{RO}_\mathit{run}$ & {\tt flags} & string & the flags of the physical CPU (a decoded version of the features field) \\ -$\mathit{RO}_\mathit{run}$ & {\tt features} & string & the physical CPU feature bitmap \\ -$\mathit{RO}_\mathit{run}$ & {\tt utilisation} & float & the current CPU utilisation \\ -$\mathit{RO}_\mathit{run}$ & {\tt cpu\_pool} & (cpu\_pool ref) Set & reference to cpu\_pool the cpu belongs to \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: host\_cpu} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the host\_cpus known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((host_cpu ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(host\_cpu ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_host} - -{\bf Overview:} -Get the host field of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} (host ref) get_host (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_number} - -{\bf Overview:} -Get the number field of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} int get_number (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_vendor} - -{\bf Overview:} -Get the vendor field of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} string get_vendor (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_speed} - -{\bf Overview:} -Get the speed field of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} int get_speed (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_modelname} - -{\bf Overview:} -Get the modelname field of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} string get_modelname (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_stepping} - -{\bf Overview:} -Get the stepping field of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} string get_stepping (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_flags} - -{\bf Overview:} -Get the flags field of the given host\_cpu. As of this version of the -API, the semantics of the returned string are explicitly unspecified, -and may change in the future. - - \noindent {\bf Signature:} -\begin{verbatim} string get_flags (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_features} - -{\bf Overview:} -Get the features field of the given host\_cpu. As of this version of the -API, the semantics of the returned string are explicitly unspecified, -and may change in the future. - - \noindent {\bf Signature:} -\begin{verbatim} string get_features (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_utilisation} - -{\bf Overview:} -Get the utilisation field of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} float get_utilisation (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -float -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the host\_cpu instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (host_cpu ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host\_cpu ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} (host_cpu record) get_record (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host\_cpu record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_cpu\_pool} - -{\bf Overview:} -Get the cpu\_pool field of the given host\_cpu. - - \noindent {\bf Signature:} -\begin{verbatim} ((cpu_pool) Set) get_cpu_pool (session_id s, host_cpu ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt host\_cpu ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(cpu\_pool) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_unassigned\_cpus} - -{\bf Overview:} -Get a reference to all cpus that are not assigend to any cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} ((host_cpu) Set) get_unassigned_cpus (session_id s)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(host\_cpu ref) Set -} - - -Set of free (not assigned) cpus -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - - - -\vspace{1cm} -\newpage -\section{Class: network} -\subsection{Fields for class: network} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf network} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -virtual network.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RW}$ & {\tt name/label} & string & a human-readable name \\ -$\mathit{RW}$ & {\tt name/description} & string & a notes field containg human-readable description \\ -$\mathit{RO}_\mathit{run}$ & {\tt VIFs} & (VIF ref) Set & list of connected vifs \\ -$\mathit{RO}_\mathit{run}$ & {\tt PIFs} & (PIF ref) Set & list of connected pifs \\ -$\mathit{RW}$ & {\tt default\_gateway} & string & default gateway \\ -$\mathit{RW}$ & {\tt default\_netmask} & string & default netmask \\ -$\mathit{RW}$ & {\tt other\_config} & (string $\rightarrow$ string) Map & additional configuration \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: network} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the networks known to the system - - \noindent {\bf Signature:} -\begin{verbatim} ((network ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(network ref) Set -} - - -A list of all the IDs of all the networks -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_label} - -{\bf Overview:} -Get the name/label field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_label (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_label} - -{\bf Overview:} -Set the name/label field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_label (session_id s, network ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_description} - -{\bf Overview:} -Get the name/description field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_description (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_description} - -{\bf Overview:} -Set the name/description field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_description (session_id s, network ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VIFs} - -{\bf Overview:} -Get the VIFs field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} ((VIF ref) Set) get_VIFs (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VIF ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PIFs} - -{\bf Overview:} -Get the PIFs field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} ((PIF ref) Set) get_PIFs (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PIF ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_default\_gateway} - -{\bf Overview:} -Get the default\_gateway field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} string get_default_gateway (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_default\_gateway} - -{\bf Overview:} -Set the default\_gateway field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} void set_default_gateway (session_id s, network ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_default\_netmask} - -{\bf Overview:} -Get the default\_netmask field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} string get_default_netmask (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_default\_netmask} - -{\bf Overview:} -Set the default\_netmask field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} void set_default_netmask (session_id s, network ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_other\_config} - -{\bf Overview:} -Get the other\_config field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_other_config (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_other\_config} - -{\bf Overview:} -Set the other\_config field of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} void set_other_config (session_id s, network ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_other\_config} - -{\bf Overview:} -Add the given key-value pair to the other\_config field of the given -network. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_other_config (session_id s, network ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_other\_config} - -{\bf Overview:} -Remove the given key and its corresponding value from the other\_config -field of the given network. If the key is not in that Map, then do -nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_other_config (session_id s, network ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new network instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (network ref) create (session_id s, network record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -network ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified network instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the network instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (network ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -network ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given network. - - \noindent {\bf Signature:} -\begin{verbatim} (network record) get_record (session_id s, network ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt network ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -network record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_name\_label} - -{\bf Overview:} -Get all the network instances with the given label. - - \noindent {\bf Signature:} -\begin{verbatim} ((network ref) Set) get_by_name_label (session_id s, string label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & label & label of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(network ref) Set -} - - -references to objects with match names -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: VIF} -\subsection{Fields for class: VIF} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VIF} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -virtual network interface.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RW}$ & {\tt device} & string & name of network device as exposed to guest e.g. eth0 \\ -$\mathit{RO}_\mathit{ins}$ & {\tt network} & network ref & virtual network to which this vif is connected \\ -$\mathit{RO}_\mathit{ins}$ & {\tt VM} & VM ref & virtual machine to which this vif is connected \\ -$\mathit{RW}$ & {\tt MAC} & string & ethernet MAC address of virtual interface, as exposed to guest \\ -$\mathit{RW}$ & {\tt MTU} & int & MTU in octets \\ -$\mathit{RO}_\mathit{run}$ & {\tt currently\_attached} & bool & is the device currently attached (erased on reboot) \\ -$\mathit{RO}_\mathit{run}$ & {\tt status\_code} & int & error/success code associated with last attach-operation (erased on reboot) \\ -$\mathit{RO}_\mathit{run}$ & {\tt status\_detail} & string & error/success information associated with last attach-operation status (erased on reboot) \\ -$\mathit{RO}_\mathit{run}$ & {\tt runtime\_properties} & (string $\rightarrow$ string) Map & Device runtime properties \\ -$\mathit{RW}$ & {\tt qos/algorithm\_type} & string & QoS algorithm to use \\ -$\mathit{RW}$ & {\tt qos/algorithm\_params} & (string $\rightarrow$ string) Map & parameters for chosen QoS algorithm \\ -$\mathit{RO}_\mathit{run}$ & {\tt qos/supported\_algorithms} & string Set & supported QoS algorithms for this VIF \\ -$\mathit{RO}_\mathit{run}$ & {\tt metrics} & VIF\_metrics ref & metrics associated with this VIF \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: VIF} -\subsubsection{RPC name:~plug} - -{\bf Overview:} -Hotplug the specified VIF, dynamically attaching it to the running VM. - - \noindent {\bf Signature:} -\begin{verbatim} void plug (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & The VIF to hotplug \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~unplug} - -{\bf Overview:} -Hot-unplug the specified VIF, dynamically unattaching it from the running -VM. - - \noindent {\bf Signature:} -\begin{verbatim} void unplug (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & The VIF to hot-unplug \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the VIFs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((VIF ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VIF ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_device} - -{\bf Overview:} -Get the device field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} string get_device (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_device} - -{\bf Overview:} -Set the device field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} void set_device (session_id s, VIF ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_network} - -{\bf Overview:} -Get the network field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} (network ref) get_network (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -network ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VM} - -{\bf Overview:} -Get the VM field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_VM (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_MAC} - -{\bf Overview:} -Get the MAC field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} string get_MAC (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_MAC} - -{\bf Overview:} -Set the MAC field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} void set_MAC (session_id s, VIF ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_MTU} - -{\bf Overview:} -Get the MTU field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} int get_MTU (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_MTU} - -{\bf Overview:} -Set the MTU field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} void set_MTU (session_id s, VIF ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_currently\_attached} - -{\bf Overview:} -Get the currently\_attached field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_currently_attached (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_status\_code} - -{\bf Overview:} -Get the status\_code field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} int get_status_code (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_status\_detail} - -{\bf Overview:} -Get the status\_detail field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} string get_status_detail (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_runtime\_properties} - -{\bf Overview:} -Get the runtime\_properties field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_runtime_properties (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_qos\_algorithm\_type} - -{\bf Overview:} -Get the qos/algorithm\_type field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} string get_qos_algorithm_type (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_qos\_algorithm\_type} - -{\bf Overview:} -Set the qos/algorithm\_type field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} void set_qos_algorithm_type (session_id s, VIF ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_qos\_algorithm\_params} - -{\bf Overview:} -Get the qos/algorithm\_params field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_qos_algorithm_params (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_qos\_algorithm\_params} - -{\bf Overview:} -Set the qos/algorithm\_params field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} void set_qos_algorithm_params (session_id s, VIF ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_qos\_algorithm\_params} - -{\bf Overview:} -Add the given key-value pair to the qos/algorithm\_params field of the -given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_qos_algorithm_params (session_id s, VIF ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_qos\_algorithm\_params} - -{\bf Overview:} -Remove the given key and its corresponding value from the -qos/algorithm\_params field of the given VIF. If the key is not in that -Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_qos_algorithm_params (session_id s, VIF ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_qos\_supported\_algorithms} - -{\bf Overview:} -Get the qos/supported\_algorithms field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} (string Set) get_qos_supported_algorithms (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_metrics} - -{\bf Overview:} -Get the metrics field of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} (VIF_metrics ref) get_metrics (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VIF\_metrics ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_security\_label} - -{\bf Overview:} -Set the security label of the given VIF. Refer to the XSPolicy class -for the format of the security label. - - \noindent {\bf Signature:} -\begin{verbatim} void set_security_label (session_id s, VIF ref self, string -security_label, string old_label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -{\tt string } & security\_label & New value of the security label \\ \hline -{\tt string } & old\_label & Label value that the security label \\ -& & must currently have for the change to succeed.\\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt SECURITY\_ERROR} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_security\_label} - -{\bf Overview:} -Get the security label of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} string get_security_label (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the given field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new VIF instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (VIF ref) create (session_id s, VIF record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VIF ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified VIF instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the VIF instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (VIF ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VIF ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given VIF. - - \noindent {\bf Signature:} -\begin{verbatim} (VIF record) get_record (session_id s, VIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VIF record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: VIF\_metrics} -\subsection{Fields for class: VIF\_metrics} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VIF\_metrics} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em -The metrics associated with a virtual network device.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt io/read\_kbs} & float & Read bandwidth (KiB/s) \\ -$\mathit{RO}_\mathit{run}$ & {\tt io/write\_kbs} & float & Write bandwidth (KiB/s) \\ -$\mathit{RO}_\mathit{run}$ & {\tt last\_updated} & datetime & Time at which this information was last updated \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: VIF\_metrics} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the VIF\_metrics instances known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((VIF_metrics ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VIF\_metrics ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given VIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, VIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_io\_read\_kbs} - -{\bf Overview:} -Get the io/read\_kbs field of the given VIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} float get_io_read_kbs (session_id s, VIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -float -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_io\_write\_kbs} - -{\bf Overview:} -Get the io/write\_kbs field of the given VIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} float get_io_write_kbs (session_id s, VIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -float -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_last\_updated} - -{\bf Overview:} -Get the last\_updated field of the given VIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} datetime get_last_updated (session_id s, VIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -datetime -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the VIF\_metrics instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (VIF_metrics ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VIF\_metrics ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given VIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} (VIF_metrics record) get_record (session_id s, VIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VIF\_metrics record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: PIF} -\subsection{Fields for class: PIF} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf PIF} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -physical network interface (note separate VLANs are represented as several -PIFs).}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RW}$ & {\tt device} & string & machine-readable name of the interface (e.g. eth0) \\ -$\mathit{RO}_\mathit{ins}$ & {\tt network} & network ref & virtual network to which this pif is connected \\ -$\mathit{RO}_\mathit{ins}$ & {\tt host} & host ref & physical machine to which this pif is connected \\ -$\mathit{RW}$ & {\tt MAC} & string & ethernet MAC address of physical interface \\ -$\mathit{RW}$ & {\tt MTU} & int & MTU in octets \\ -$\mathit{RW}$ & {\tt VLAN} & int & VLAN tag for all traffic passing through this interface \\ -$\mathit{RO}_\mathit{run}$ & {\tt metrics} & PIF\_metrics ref & metrics associated with this PIF \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: PIF} -\subsubsection{RPC name:~create\_VLAN} - -{\bf Overview:} -Create a VLAN interface from an existing physical interface. - - \noindent {\bf Signature:} -\begin{verbatim} (PIF ref) create_VLAN (session_id s, string device, network ref network, host ref host, int VLAN)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & device & physical interface on which to crate the VLAN interface \\ \hline - -{\tt network ref } & network & network to which this interface should be connected \\ \hline - -{\tt host ref } & host & physical machine to which this PIF is connected \\ \hline - -{\tt int } & VLAN & VLAN tag for the new interface \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PIF ref -} - - -The reference of the created PIF object -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt VLAN\_TAG\_INVALID} - -\vspace{0.6cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the interface (provided it is a synthetic interface like a VLAN; -fail if it is a physical interface). - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & the PIF object to destroy \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt PIF\_IS\_PHYSICAL} - -\vspace{0.6cm} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the PIFs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((PIF ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PIF ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_device} - -{\bf Overview:} -Get the device field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} string get_device (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_device} - -{\bf Overview:} -Set the device field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} void set_device (session_id s, PIF ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_network} - -{\bf Overview:} -Get the network field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} (network ref) get_network (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -network ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_host} - -{\bf Overview:} -Get the host field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} (host ref) get_host (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_MAC} - -{\bf Overview:} -Get the MAC field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} string get_MAC (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_MAC} - -{\bf Overview:} -Set the MAC field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} void set_MAC (session_id s, PIF ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_MTU} - -{\bf Overview:} -Get the MTU field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} int get_MTU (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_MTU} - -{\bf Overview:} -Set the MTU field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} void set_MTU (session_id s, PIF ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VLAN} - -{\bf Overview:} -Get the VLAN field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} int get_VLAN (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_VLAN} - -{\bf Overview:} -Set the VLAN field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} void set_VLAN (session_id s, PIF ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_metrics} - -{\bf Overview:} -Get the metrics field of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} (PIF_metrics ref) get_metrics (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PIF\_metrics ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the PIF instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (PIF ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PIF ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given PIF. - - \noindent {\bf Signature:} -\begin{verbatim} (PIF record) get_record (session_id s, PIF ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PIF record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: PIF\_metrics} -\subsection{Fields for class: PIF\_metrics} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf PIF\_metrics} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em -The metrics associated with a physical network interface.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt io/read\_kbs} & float & Read bandwidth (KiB/s) \\ -$\mathit{RO}_\mathit{run}$ & {\tt io/write\_kbs} & float & Write bandwidth (KiB/s) \\ -$\mathit{RO}_\mathit{run}$ & {\tt last\_updated} & datetime & Time at which this information was last updated \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: PIF\_metrics} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the PIF\_metrics instances known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((PIF_metrics ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PIF\_metrics ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given PIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, PIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_io\_read\_kbs} - -{\bf Overview:} -Get the io/read\_kbs field of the given PIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} float get_io_read_kbs (session_id s, PIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -float -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_io\_write\_kbs} - -{\bf Overview:} -Get the io/write\_kbs field of the given PIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} float get_io_write_kbs (session_id s, PIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -float -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_last\_updated} - -{\bf Overview:} -Get the last\_updated field of the given PIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} datetime get_last_updated (session_id s, PIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -datetime -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the PIF\_metrics instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (PIF_metrics ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PIF\_metrics ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given PIF\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} (PIF_metrics record) get_record (session_id s, PIF_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PIF\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PIF\_metrics record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: SR} -\subsection{Fields for class: SR} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf SR} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -storage repository.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RW}$ & {\tt name/label} & string & a human-readable name \\ -$\mathit{RW}$ & {\tt name/description} & string & a notes field containg human-readable description \\ -$\mathit{RO}_\mathit{run}$ & {\tt VDIs} & (VDI ref) Set & managed virtual disks \\ -$\mathit{RO}_\mathit{run}$ & {\tt PBDs} & (PBD ref) Set & physical blockdevices \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_allocation} & int & sum of virtual\_sizes of all VDIs in this storage repository (in bytes) \\ -$\mathit{RO}_\mathit{run}$ & {\tt physical\_utilisation} & int & physical space currently utilised on this storage repository (in bytes). Note that for sparse disk formats, physical\_utilisation may be less than virtual\_allocation \\ -$\mathit{RO}_\mathit{ins}$ & {\tt physical\_size} & int & total physical size of the repository (in bytes) \\ -$\mathit{RO}_\mathit{ins}$ & {\tt type} & string & type of the storage repository \\ -$\mathit{RO}_\mathit{ins}$ & {\tt content\_type} & string & the type of the SR's content, if required (e.g. ISOs) \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: SR} -\subsubsection{RPC name:~get\_supported\_types} - -{\bf Overview:} -Return a set of all the SR types supported by the system. - - \noindent {\bf Signature:} -\begin{verbatim} (string Set) get_supported_types (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string Set -} - - -the supported SR types -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the SRs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((SR ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(SR ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_label} - -{\bf Overview:} -Get the name/label field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_label (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_label} - -{\bf Overview:} -Set the name/label field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_label (session_id s, SR ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_description} - -{\bf Overview:} -Get the name/description field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_description (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_description} - -{\bf Overview:} -Set the name/description field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_description (session_id s, SR ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VDIs} - -{\bf Overview:} -Get the VDIs field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} ((VDI ref) Set) get_VDIs (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VDI ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PBDs} - -{\bf Overview:} -Get the PBDs field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} ((PBD ref) Set) get_PBDs (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PBD ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_allocation} - -{\bf Overview:} -Get the virtual\_allocation field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_allocation (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_physical\_utilisation} - -{\bf Overview:} -Get the physical\_utilisation field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} int get_physical_utilisation (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_physical\_size} - -{\bf Overview:} -Get the physical\_size field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} int get_physical_size (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_type} - -{\bf Overview:} -Get the type field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} string get_type (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_content\_type} - -{\bf Overview:} -Get the content\_type field of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} string get_content_type (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the SR instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (SR ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -SR ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given SR. - - \noindent {\bf Signature:} -\begin{verbatim} (SR record) get_record (session_id s, SR ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt SR ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -SR record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_name\_label} - -{\bf Overview:} -Get all the SR instances with the given label. - - \noindent {\bf Signature:} -\begin{verbatim} ((SR ref) Set) get_by_name_label (session_id s, string label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & label & label of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(SR ref) Set -} - - -references to objects with match names -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: VDI} -\subsection{Fields for class: VDI} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VDI} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -virtual disk image.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RW}$ & {\tt name/label} & string & a human-readable name \\ -$\mathit{RW}$ & {\tt name/description} & string & a notes field containg human-readable description \\ -$\mathit{RO}_\mathit{ins}$ & {\tt SR} & SR ref & storage repository in which the VDI resides \\ -$\mathit{RO}_\mathit{run}$ & {\tt VBDs} & (VBD ref) Set & list of vbds that refer to this disk \\ -$\mathit{RO}_\mathit{run}$ & {\tt crash\_dumps} & (crashdump ref) Set & list of crash dumps that refer to this disk \\ -$\mathit{RW}$ & {\tt virtual\_size} & int & size of disk as presented to the guest (in bytes). Note that, depending on storage backend type, requested size may not be respected exactly \\ -$\mathit{RO}_\mathit{run}$ & {\tt physical\_utilisation} & int & amount of physical space that the disk image is currently taking up on the storage repository (in bytes) \\ -$\mathit{RO}_\mathit{ins}$ & {\tt type} & vdi\_type & type of the VDI \\ -$\mathit{RW}$ & {\tt sharable} & bool & true if this disk may be shared \\ -$\mathit{RW}$ & {\tt read\_only} & bool & true if this disk may ONLY be mounted read-only \\ -$\mathit{RW}$ & {\tt other\_config} & (string $\rightarrow$ string) Map & additional configuration \\ -$\mathit{RO}_\mathit{run}$ & {\tt security/label} & string & the VM's security label \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: VDI} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the VDIs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((VDI ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VDI ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_label} - -{\bf Overview:} -Get the name/label field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_label (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_label} - -{\bf Overview:} -Set the name/label field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_label (session_id s, VDI ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_description} - -{\bf Overview:} -Get the name/description field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_description (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_description} - -{\bf Overview:} -Set the name/description field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_description (session_id s, VDI ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_SR} - -{\bf Overview:} -Get the SR field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} (SR ref) get_SR (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -SR ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VBDs} - -{\bf Overview:} -Get the VBDs field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} ((VBD ref) Set) get_VBDs (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VBD ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_crash\_dumps} - -{\bf Overview:} -Get the crash\_dumps field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} ((crashdump ref) Set) get_crash_dumps (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(crashdump ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_size} - -{\bf Overview:} -Get the virtual\_size field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_size (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_virtual\_size} - -{\bf Overview:} -Set the virtual\_size field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} void set_virtual_size (session_id s, VDI ref self, int value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -{\tt int } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_physical\_utilisation} - -{\bf Overview:} -Get the physical\_utilisation field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_physical_utilisation (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_type} - -{\bf Overview:} -Get the type field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} (vdi_type) get_type (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -vdi\_type -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_sharable} - -{\bf Overview:} -Get the sharable field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_sharable (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_sharable} - -{\bf Overview:} -Set the sharable field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} void set_sharable (session_id s, VDI ref self, bool value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -{\tt bool } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_read\_only} - -{\bf Overview:} -Get the read\_only field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_read_only (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_read\_only} - -{\bf Overview:} -Set the read\_only field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} void set_read_only (session_id s, VDI ref self, bool value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -{\tt bool } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_other\_config} - -{\bf Overview:} -Get the other\_config field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_other_config (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_other\_config} - -{\bf Overview:} -Set the other\_config field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} void set_other_config (session_id s, VDI ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_other\_config} - -{\bf Overview:} -Add the given key-value pair to the other\_config field of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_other_config (session_id s, VDI ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_other\_config} - -{\bf Overview:} -Remove the given key and its corresponding value from the other\_config -field of the given VDI. If the key is not in that Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_other_config (session_id s, VDI ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_security\_label} - -{\bf Overview:} -Set the security label of the given VDI. Refer to the XSPolicy class -for the format of the security label. - - \noindent {\bf Signature:} -\begin{verbatim} void set_security_label (session_id s, VDI ref self, string -security_label, string old_label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -{\tt string } & security\_label & New value of the security label \\ \hline -{\tt string } & old\_label & Label value that the security label \\ -& & must currently have for the change to succeed.\\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt SECURITY\_ERROR} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_security\_label} - -{\bf Overview:} -Get the security label of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_security_label (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the given field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new VDI instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (VDI ref) create (session_id s, VDI record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VDI ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified VDI instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the VDI instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (VDI ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VDI ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given VDI. - - \noindent {\bf Signature:} -\begin{verbatim} (VDI record) get_record (session_id s, VDI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VDI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VDI record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_name\_label} - -{\bf Overview:} -Get all the VDI instances with the given label. - - \noindent {\bf Signature:} -\begin{verbatim} ((VDI ref) Set) get_by_name_label (session_id s, string label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & label & label of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VDI ref) Set -} - - -references to objects with match names -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: VBD} -\subsection{Fields for class: VBD} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VBD} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -virtual block device.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{ins}$ & {\tt VM} & VM ref & the virtual machine \\ -$\mathit{RO}_\mathit{ins}$ & {\tt VDI} & VDI ref & the virtual disk \\ -$\mathit{RW}$ & {\tt device} & string & device seen by the guest e.g. hda1 \\ -$\mathit{RW}$ & {\tt bootable} & bool & true if this VBD is bootable \\ -$\mathit{RW}$ & {\tt mode} & vbd\_mode & the mode the VBD should be mounted with \\ -$\mathit{RW}$ & {\tt type} & vbd\_type & how the VBD will appear to the guest (e.g. disk or CD) \\ -$\mathit{RO}_\mathit{run}$ & {\tt currently\_attached} & bool & is the device currently attached (erased on reboot) \\ -$\mathit{RO}_\mathit{run}$ & {\tt status\_code} & int & error/success code associated with last attach-operation (erased on reboot) \\ -$\mathit{RO}_\mathit{run}$ & {\tt status\_detail} & string & error/success information associated with last attach-operation status (erased on reboot) \\ -$\mathit{RO}_\mathit{run}$ & {\tt runtime\_properties} & (string $\rightarrow$ string) Map & Device runtime properties \\ -$\mathit{RW}$ & {\tt qos/algorithm\_type} & string & QoS algorithm to use \\ -$\mathit{RW}$ & {\tt qos/algorithm\_params} & (string $\rightarrow$ string) Map & parameters for chosen QoS algorithm \\ -$\mathit{RO}_\mathit{run}$ & {\tt qos/supported\_algorithms} & string Set & supported QoS algorithms for this VBD \\ -$\mathit{RO}_\mathit{run}$ & {\tt metrics} & VBD\_metrics ref & metrics associated with this VBD \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: VBD} -\subsubsection{RPC name:~media\_change} - -{\bf Overview:} -Change the media in the device for CDROM-like devices only. For other -devices, detach the VBD and attach a new one. - - \noindent {\bf Signature:} -\begin{verbatim} void media_change (session_id s, VBD ref vbd, VDI ref vdi)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & vbd & The vbd representing the CDROM-like device \\ \hline - -{\tt VDI ref } & vdi & The new VDI to 'insert' \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~plug} - -{\bf Overview:} -Hotplug the specified VBD, dynamically attaching it to the running VM. - - \noindent {\bf Signature:} -\begin{verbatim} void plug (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & The VBD to hotplug \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~unplug} - -{\bf Overview:} -Hot-unplug the specified VBD, dynamically unattaching it from the running -VM. - - \noindent {\bf Signature:} -\begin{verbatim} void unplug (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & The VBD to hot-unplug \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the VBDs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((VBD ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VBD ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VM} - -{\bf Overview:} -Get the VM field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_VM (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VDI} - -{\bf Overview:} -Get the VDI field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} (VDI ref) get_VDI (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VDI ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_device} - -{\bf Overview:} -Get the device field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} string get_device (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_device} - -{\bf Overview:} -Set the device field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} void set_device (session_id s, VBD ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_bootable} - -{\bf Overview:} -Get the bootable field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_bootable (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_bootable} - -{\bf Overview:} -Set the bootable field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} void set_bootable (session_id s, VBD ref self, bool value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -{\tt bool } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_mode} - -{\bf Overview:} -Get the mode field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} (vbd_mode) get_mode (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -vbd\_mode -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_mode} - -{\bf Overview:} -Set the mode field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} void set_mode (session_id s, VBD ref self, vbd_mode value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -{\tt vbd\_mode } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_type} - -{\bf Overview:} -Get the type field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} (vbd_type) get_type (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -vbd\_type -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_type} - -{\bf Overview:} -Set the type field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} void set_type (session_id s, VBD ref self, vbd_type value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -{\tt vbd\_type } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_currently\_attached} - -{\bf Overview:} -Get the currently\_attached field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_currently_attached (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_status\_code} - -{\bf Overview:} -Get the status\_code field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} int get_status_code (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_status\_detail} - -{\bf Overview:} -Get the status\_detail field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} string get_status_detail (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_runtime\_properties} - -{\bf Overview:} -Get the runtime\_properties field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_runtime_properties (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_qos\_algorithm\_type} - -{\bf Overview:} -Get the qos/algorithm\_type field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} string get_qos_algorithm_type (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_qos\_algorithm\_type} - -{\bf Overview:} -Set the qos/algorithm\_type field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} void set_qos_algorithm_type (session_id s, VBD ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_qos\_algorithm\_params} - -{\bf Overview:} -Get the qos/algorithm\_params field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_qos_algorithm_params (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_qos\_algorithm\_params} - -{\bf Overview:} -Set the qos/algorithm\_params field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} void set_qos_algorithm_params (session_id s, VBD ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_qos\_algorithm\_params} - -{\bf Overview:} -Add the given key-value pair to the qos/algorithm\_params field of the -given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_qos_algorithm_params (session_id s, VBD ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_qos\_algorithm\_params} - -{\bf Overview:} -Remove the given key and its corresponding value from the -qos/algorithm\_params field of the given VBD. If the key is not in that -Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_qos_algorithm_params (session_id s, VBD ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_qos\_supported\_algorithms} - -{\bf Overview:} -Get the qos/supported\_algorithms field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} (string Set) get_qos_supported_algorithms (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_metrics} - -{\bf Overview:} -Get the metrics field of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} (VBD_metrics ref) get_metrics (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VBD\_metrics ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new VBD instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (VBD ref) create (session_id s, VBD record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VBD ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified VBD instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the VBD instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (VBD ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VBD ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given VBD. - - \noindent {\bf Signature:} -\begin{verbatim} (VBD record) get_record (session_id s, VBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VBD record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: VBD\_metrics} -\subsection{Fields for class: VBD\_metrics} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VBD\_metrics} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em -The metrics associated with a virtual block device.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt io/read\_kbs} & float & Read bandwidth (KiB/s) \\ -$\mathit{RO}_\mathit{run}$ & {\tt io/write\_kbs} & float & Write bandwidth (KiB/s) \\ -$\mathit{RO}_\mathit{run}$ & {\tt last\_updated} & datetime & Time at which this information was last updated \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: VBD\_metrics} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the VBD\_metrics instances known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((VBD_metrics ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(VBD\_metrics ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given VBD\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, VBD_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_io\_read\_kbs} - -{\bf Overview:} -Get the io/read\_kbs field of the given VBD\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} float get_io_read_kbs (session_id s, VBD_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -float -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_io\_write\_kbs} - -{\bf Overview:} -Get the io/write\_kbs field of the given VBD\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} float get_io_write_kbs (session_id s, VBD_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -float -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_last\_updated} - -{\bf Overview:} -Get the last\_updated field of the given VBD\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} datetime get_last_updated (session_id s, VBD_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -datetime -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the VBD\_metrics instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (VBD_metrics ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VBD\_metrics ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given VBD\_metrics. - - \noindent {\bf Signature:} -\begin{verbatim} (VBD_metrics record) get_record (session_id s, VBD_metrics ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VBD\_metrics ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VBD\_metrics record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: PBD} -\subsection{Fields for class: PBD} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf PBD} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em -The physical block devices through which hosts access SRs.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{ins}$ & {\tt host} & host ref & physical machine on which the pbd is available \\ -$\mathit{RO}_\mathit{ins}$ & {\tt SR} & SR ref & the storage repository that the pbd realises \\ -$\mathit{RO}_\mathit{ins}$ & {\tt device\_config} & (string $\rightarrow$ string) Map & a config string to string map that is provided to the host's SR-backend-driver \\ -$\mathit{RO}_\mathit{run}$ & {\tt currently\_attached} & bool & is the SR currently attached on this host? \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: PBD} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the PBDs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((PBD ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PBD ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given PBD. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, PBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_host} - -{\bf Overview:} -Get the host field of the given PBD. - - \noindent {\bf Signature:} -\begin{verbatim} (host ref) get_host (session_id s, PBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_SR} - -{\bf Overview:} -Get the SR field of the given PBD. - - \noindent {\bf Signature:} -\begin{verbatim} (SR ref) get_SR (session_id s, PBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -SR ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_device\_config} - -{\bf Overview:} -Get the device\_config field of the given PBD. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_device_config (session_id s, PBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_currently\_attached} - -{\bf Overview:} -Get the currently\_attached field of the given PBD. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_currently_attached (session_id s, PBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new PBD instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (PBD ref) create (session_id s, PBD record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PBD record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PBD ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified PBD instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, PBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the PBD instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (PBD ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PBD ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given PBD. - - \noindent {\bf Signature:} -\begin{verbatim} (PBD record) get_record (session_id s, PBD ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PBD ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PBD record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: crashdump} -\subsection{Fields for class: crashdump} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf crashdump} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -VM crashdump.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{ins}$ & {\tt VM} & VM ref & the virtual machine \\ -$\mathit{RO}_\mathit{ins}$ & {\tt VDI} & VDI ref & the virtual disk \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: crashdump} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified crashdump. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, crashdump ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt crashdump ref } & self & The crashdump to destroy \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the crashdumps known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((crashdump ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(crashdump ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given crashdump. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, crashdump ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt crashdump ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VM} - -{\bf Overview:} -Get the VM field of the given crashdump. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_VM (session_id s, crashdump ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt crashdump ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VDI} - -{\bf Overview:} -Get the VDI field of the given crashdump. - - \noindent {\bf Signature:} -\begin{verbatim} (VDI ref) get_VDI (session_id s, crashdump ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt crashdump ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VDI ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the crashdump instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (crashdump ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -crashdump ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given crashdump. - - \noindent {\bf Signature:} -\begin{verbatim} (crashdump record) get_record (session_id s, crashdump ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt crashdump ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -crashdump record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: VTPM} -\subsection{Fields for class: VTPM} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf VTPM} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -virtual TPM device.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{ins}$ & {\tt VM} & VM ref & the virtual machine \\ -$\mathit{RO}_\mathit{ins}$ & {\tt backend} & VM ref & the domain where the backend is located \\ -$\mathit{RW}$ & {\tt other\_config} & (string $\rightarrow$ string) Map & additional configuration \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: VTPM} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given VTPM. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, VTPM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VTPM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VM} - -{\bf Overview:} -Get the VM field of the given VTPM. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_VM (session_id s, VTPM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VTPM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_backend} - -{\bf Overview:} -Get the backend field of the given VTPM. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_backend (session_id s, VTPM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VTPM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_other\_config} - -{\bf Overview:} -Get the other\_config field of the given VTPM. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_other_config (session_id s, VTPM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VTPM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_other\_config} - -{\bf Overview:} -Set the other\_config field of the given VTPM. - - \noindent {\bf Signature:} -\begin{verbatim} void set_other_config (session_id s, VTPM ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VTPM ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_runtime\_properties} - -{\bf Overview:} -Get the runtime\_properties field of the given VTPM. - -\noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_runtime_properties (session_id s, VTPM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VTPM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new VTPM instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (VTPM ref) create (session_id s, VTPM record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VTPM record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VTPM ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified VTPM instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, VTPM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VTPM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the VTPM instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (VTPM ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VTPM ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given VTPM. - - \noindent {\bf Signature:} -\begin{verbatim} (VTPM record) get_record (session_id s, VTPM ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt VTPM ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VTPM record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: console} -\subsection{Fields for class: console} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf console} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -console.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt protocol} & console\_protocol & the protocol used by this console \\ -$\mathit{RO}_\mathit{run}$ & {\tt location} & string & URI for the console service \\ -$\mathit{RO}_\mathit{run}$ & {\tt VM} & VM ref & VM to which this console is attached \\ -$\mathit{RW}$ & {\tt other\_config} & (string $\rightarrow$ string) Map & additional configuration \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: console} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the consoles known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((console ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(console ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given console. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, console ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_protocol} - -{\bf Overview:} -Get the protocol field of the given console. - - \noindent {\bf Signature:} -\begin{verbatim} (console_protocol) get_protocol (session_id s, console ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -console\_protocol -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_location} - -{\bf Overview:} -Get the location field of the given console. - - \noindent {\bf Signature:} -\begin{verbatim} string get_location (session_id s, console ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VM} - -{\bf Overview:} -Get the VM field of the given console. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_VM (session_id s, console ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_other\_config} - -{\bf Overview:} -Get the other\_config field of the given console. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_other_config (session_id s, console ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_other\_config} - -{\bf Overview:} -Set the other\_config field of the given console. - - \noindent {\bf Signature:} -\begin{verbatim} void set_other_config (session_id s, console ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_other\_config} - -{\bf Overview:} -Add the given key-value pair to the other\_config field of the given -console. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_other_config (session_id s, console ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to add \\ \hline - -{\tt string } & value & Value to add \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_other\_config} - -{\bf Overview:} -Remove the given key and its corresponding value from the other\_config -field of the given console. If the key is not in that Map, then do -nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_other_config (session_id s, console ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -{\tt string } & key & Key to remove \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new console instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (console ref) create (session_id s, console record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -console ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified console instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, console ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the console instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (console ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -console ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given console. - - \noindent {\bf Signature:} -\begin{verbatim} (console record) get_record (session_id s, console ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt console ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -console record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: DPCI} -\subsection{Fields for class: DPCI} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf DPCI} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -pass-through PCI device.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{inst}$ & {\tt VM} & VM ref & the virtual machine \\ -$\mathit{RO}_\mathit{inst}$ & {\tt PPCI} & PPCI ref & the physical PCI device \\ -$\mathit{RO}_\mathit{inst}$ & {\tt hotplug\_slot} & int & the slot number to which this PCI device is inserted \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_domain} & int & the virtual domain number \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_bus} & int & the virtual bus number \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_slot} & int & the virtual slot number \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_func} & int & the virtual func number \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_name} & string & the virtual PCI name \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: DPCI} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the DPCIs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((DPCI ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(DPCI ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VM} - -{\bf Overview:} -Get the VM field of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_VM (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PPCI} - -{\bf Overview:} -Get the PPCI field of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} (PPCI ref) get_PPCI (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PPCI ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_hotplug\_slot} - -{\bf Overview:} -Get the hotplug\_slot field of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_hotplug_slot (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_domain} - -{\bf Overview:} -Get the virtual\_domain field of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_domain (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_bus} - -{\bf Overview:} -Get the virtual\_bus field of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_bus (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_slot} - -{\bf Overview:} -Get the virtual\_slot field of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_slot (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_func} - -{\bf Overview:} -Get the virtual\_func field of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_func (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_name} - -{\bf Overview:} -Get the virtual\_name field of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_virtual_name (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new DPCI instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (DPCI ref) create (session_id s, DPCI record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DPCI ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified DPCI instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the DPCI instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (DPCI ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DPCI ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given DPCI. - - \noindent {\bf Signature:} -\begin{verbatim} (DPCI record) get_record (session_id s, DPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DPCI record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: PPCI} -\subsection{Fields for class: PPCI} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf PPCI} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -physical PCI device.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt host} & host ref & the physical machine to which this PPCI is connected \\ -$\mathit{RO}_\mathit{run}$ & {\tt domain} & int & the domain number \\ -$\mathit{RO}_\mathit{run}$ & {\tt bus} & int & the bus number \\ -$\mathit{RO}_\mathit{run}$ & {\tt slot} & int & the slot number \\ -$\mathit{RO}_\mathit{run}$ & {\tt func} & int & the func number \\ -$\mathit{RO}_\mathit{run}$ & {\tt name} & string & the PCI name \\ -$\mathit{RO}_\mathit{run}$ & {\tt vendor\_id} & int & the vendor ID \\ -$\mathit{RO}_\mathit{run}$ & {\tt vendor\_name} & string & the vendor name \\ -$\mathit{RO}_\mathit{run}$ & {\tt device\_id} & int & the device ID \\ -$\mathit{RO}_\mathit{run}$ & {\tt device\_name} & string & the device name \\ -$\mathit{RO}_\mathit{run}$ & {\tt revision\_id} & int & the revision ID \\ -$\mathit{RO}_\mathit{run}$ & {\tt class\_code} & int & the class code \\ -$\mathit{RO}_\mathit{run}$ & {\tt class\_name} & string & the class name \\ -$\mathit{RO}_\mathit{run}$ & {\tt subsystem\_vendor\_id} & int & the subsystem vendor ID \\ -$\mathit{RO}_\mathit{run}$ & {\tt subsystem\_vendor\_name} & string & the subsystem vendor name \\ -$\mathit{RO}_\mathit{run}$ & {\tt subsystem\_id} & int & the subsystem ID \\ -$\mathit{RO}_\mathit{run}$ & {\tt subsystem\_name} & string & the subsystem name \\ -$\mathit{RO}_\mathit{run}$ & {\tt driver} & string & the driver name \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: PPCI} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the PPCIs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((PPCI ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PPCI ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_host} - -{\bf Overview:} -Get the host field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} (host ref) get_host (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_domain} - -{\bf Overview:} -Get the domain field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_domain (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_bus} - -{\bf Overview:} -Get the bus field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_bus (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_slot} - -{\bf Overview:} -Get the slot field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_slot (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_func} - -{\bf Overview:} -Get the func field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_func (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name} - -{\bf Overview:} -Get the name field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_vendor\_id} - -{\bf Overview:} -Get the vendor\_id field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_vendor_id (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_vendor\_name} - -{\bf Overview:} -Get the vendor\_name field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_vendor_name (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_device\_id} - -{\bf Overview:} -Get the device\_id field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_device_id (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_device\_name} - -{\bf Overview:} -Get the device\_name field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_device_name (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_revision\_id} - -{\bf Overview:} -Get the revision\_id field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_revision_id (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_class\_code} - -{\bf Overview:} -Get the class\_code field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_class_code (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_class\_name} - -{\bf Overview:} -Get the class\_name field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_class_name (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_subsystem\_vendor\_id} - -{\bf Overview:} -Get the subsystem\_vendor\_id field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_subsystem_vendor_id (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_subsystem\_vendor\_name} - -{\bf Overview:} -Get the subsystem\_vendor\_name field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_subsystem_vendor_name (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_subsystem\_id} - -{\bf Overview:} -Get the subsystem\_id field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_subsystem_id (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_subsystem\_name} - -{\bf Overview:} -Get the subsystem\_name field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_subsystem_name (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_driver} - -{\bf Overview:} -Get the driver field of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_driver (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the PPCI instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (PPCI ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PPCI ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given PPCI. - - \noindent {\bf Signature:} -\begin{verbatim} (PPCI record) get_record (session_id s, PPCI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PPCI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PPCI record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: DSCSI} -\subsection{Fields for class: DSCSI} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf DSCSI} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -half-virtualized SCSI device.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{inst}$ & {\tt VM} & VM ref & the virtual machine \\ -$\mathit{RO}_\mathit{inst}$ & {\tt PSCSI} & PSCSI ref & the physical SCSI device \\ -$\mathit{RO}_\mathit{run}$ & {\tt HBA} & DSCSI\_HBA ref & the half-virtualized SCSI host bus adapter \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_host} & int & the virtual host number \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_channel} & int & the virtual channel number \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_target} & int & the virtual target number \\ -$\mathit{RO}_\mathit{run}$ & {\tt virtual\_lun} & int & the virtual logical unit number \\ -$\mathit{RO}_\mathit{inst}$ & {\tt virtual\_HCTL} & string & the virtual HCTL \\ -$\mathit{RO}_\mathit{run}$ & {\tt runtime\_properties} & (string $\rightarrow$ string) Map & Device runtime properties \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: DSCSI} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the DSCSIs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((DSCSI ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(DSCSI ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VM} - -{\bf Overview:} -Get the VM field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_VM (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PSCSI} - -{\bf Overview:} -Get the PSCSI field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} (PSCSI ref) get_PSCSI (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PSCSI ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_HBA} - -{\bf Overview:} -Get the HBA field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} (DSCSI_HBA ref) get_HBA (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DSCSI\_HBA ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_host} - -{\bf Overview:} -Get the virtual\_host field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_host (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_channel} - -{\bf Overview:} -Get the virtual\_channel field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_channel (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_target} - -{\bf Overview:} -Get the virtual\_target field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_target (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_lun} - -{\bf Overview:} -Get the virtual\_lun field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_lun (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_HCTL} - -{\bf Overview:} -Get the virtual\_HCTL field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_virtual_HCTL (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_runtime\_properties} - -{\bf Overview:} -Get the runtime\_properties field of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_runtime_properties (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new DSCSI instance, and create a new DSCSI\_HBA instance as needed -that the new DSCSI instance connects to, and return the handle of the new -DSCSI instance. - - \noindent {\bf Signature:} -\begin{verbatim} (DSCSI ref) create (session_id s, DSCSI record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DSCSI ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified DSCSI instance, and destroy a DSCSI\_HBA instance as -needed that the specified DSCSI instance connects to. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the DSCSI instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (DSCSI ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DSCSI ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given DSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} (DSCSI record) get_record (session_id s, DSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DSCSI record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: DSCSI\_HBA} -\subsection{Fields for class: DSCSI\_HBA} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf DSCSI\_HBA} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -half-virtualized SCSI host bus adapter.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{inst}$ & {\tt VM} & VM ref & the virtual machine \\ -$\mathit{RO}_\mathit{run}$ & {\tt PSCSI\_HBAs} & (PSCSI\_HBA ref) Set & the physical SCSI HBAs \\ -$\mathit{RO}_\mathit{run}$ & {\tt DSCSIs} & (DSCSI ref) Set & the half-virtualized SCSI devices which are connected to this DSCSI HBA \\ -$\mathit{RO}_\mathit{inst}$ & {\tt virtual\_host} & int & the virtual host number \\ -$\mathit{RO}_\mathit{inst}$ & {\tt assignment\_mode} & string & the assignment mode of the half-virtualized SCSI devices which are connected to this DSCSI HBA \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: DSCSI\_HBA} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the DSCSI HBAs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((DSCSI_HBA ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(DSCSI\_HBA ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given DSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, DSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VM} - -{\bf Overview:} -Get the VM field of the given DSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} (VM ref) get_VM (session_id s, DSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -VM ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PSCSI\_HBAs} - -{\bf Overview:} -Get the PSCSI\_HBAs field of the given DSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} ((PSCSI_HBA ref) Set) get_PSCSI_HBAs (session_id s, DSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PSCSI\_HBA ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_DSCSIs} - -{\bf Overview:} -Get the DSCSIs field of the given DSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} ((DSCSI ref) Set) get_DSCSIs (session_id s, DSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(DSCSI ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_virtual\_host} - -{\bf Overview:} -Get the virtual\_host field of the given DSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} int get_virtual_host (session_id s, DSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_assignment\_mode} - -{\bf Overview:} -Get the assignment\_mode field of the given DSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} string get_assignment_mode (session_id s, DSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new DSCSI\_HBA instance, and create new DSCSI instances of -half-virtualized SCSI devices which are connected to the half-virtualized -SCSI host bus adapter, and return the handle of the new DSCSI\_HBA instance. - - \noindent {\bf Signature:} -\begin{verbatim} (DSCSI_HBA ref) create (session_id s, DSCSI_HBA record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI\_HBA record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DSCSI\_HBA ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified DSCSI\_HBA instance, and destroy DSCSI instances of -half-virtualized SCSI devices which are connected to the half-virtualized SCSI -host bus adapter. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, DSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the DSCSI\_HBA instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (DSCSI_HBA ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DSCSI\_HBA ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given DSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} (DSCSI_HBA record) get_record (session_id s, DSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt DSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -DSCSI\_HBA record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: PSCSI} -\subsection{Fields for class: PSCSI} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf PSCSI} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -physical SCSI device.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt host} & host ref & the physical machine to which this PSCSI is connected \\ -$\mathit{RO}_\mathit{run}$ & {\tt HBA} & PSCSI\_HBA ref & the physical SCSI host bus adapter \\ -$\mathit{RO}_\mathit{run}$ & {\tt physical\_host} & int & the physical host number \\ -$\mathit{RO}_\mathit{run}$ & {\tt physical\_channel} & int & the physical channel number \\ -$\mathit{RO}_\mathit{run}$ & {\tt physical\_target} & int & the physical target number \\ -$\mathit{RO}_\mathit{run}$ & {\tt physical\_lun} & int & the physical logical unit number \\ -$\mathit{RO}_\mathit{run}$ & {\tt physical\_HCTL} & string & the physical HCTL \\ -$\mathit{RO}_\mathit{run}$ & {\tt vendor\_name} & string & the vendor name \\ -$\mathit{RO}_\mathit{run}$ & {\tt model} & string & the model \\ -$\mathit{RO}_\mathit{run}$ & {\tt type\_id} & int & the SCSI type ID \\ -$\mathit{RO}_\mathit{run}$ & {\tt type} & string & the SCSI type \\ -$\mathit{RO}_\mathit{run}$ & {\tt dev\_name} & string & the SCSI device name (e.g. sda or st0) \\ -$\mathit{RO}_\mathit{run}$ & {\tt sg\_name} & string & the SCSI generic device name (e.g. sg0) \\ -$\mathit{RO}_\mathit{run}$ & {\tt revision} & string & the revision \\ -$\mathit{RO}_\mathit{run}$ & {\tt scsi\_id} & string & the SCSI ID \\ -$\mathit{RO}_\mathit{run}$ & {\tt scsi\_level} & int & the SCSI level \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: PSCSI} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the PSCSIs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((PSCSI ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PSCSI ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_host} - -{\bf Overview:} -Get the host field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} (host ref) get_host (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_HBA} - -{\bf Overview:} -Get the HBA field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} (PSCSI_HBA ref) get_HBA (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PSCSI\_HBA ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_physical\_host} - -{\bf Overview:} -Get the physical\_host field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_physical_host (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_physical\_channel} - -{\bf Overview:} -Get the physical\_channel field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_physical_channel (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_physical\_target} - -{\bf Overview:} -Get the physical\_target field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_physical_target (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_physical\_lun} - -{\bf Overview:} -Get the physical\_lun field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_physical_lun (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_physical\_HCTL} - -{\bf Overview:} -Get the physical\_HCTL field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_physical_HCTL (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_vendor\_name} - -{\bf Overview:} -Get the vendor\_name field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_vendor_name (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_model} - -{\bf Overview:} -Get the model field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_model (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_type\_id} - -{\bf Overview:} -Get the type\_id field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_type_id (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_type} - -{\bf Overview:} -Get the type field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_type (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_dev\_name} - -{\bf Overview:} -Get the dev\_name field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_dev_name (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_sg\_name} - -{\bf Overview:} -Get the sg\_name field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_sg_name (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_revision} - -{\bf Overview:} -Get the revision field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_revision (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_scsi\_id} - -{\bf Overview:} -Get the scsi\_id field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} string get_scsi_id (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_scsi\_level} - -{\bf Overview:} -Get the scsi\_level field of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} int get_scsi_level (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the PSCSI instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (PSCSI ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PSCSI ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given PSCSI. - - \noindent {\bf Signature:} -\begin{verbatim} (PSCSI record) get_record (session_id s, PSCSI ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PSCSI record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: PSCSI\_HBA} -\subsection{Fields for class: PSCSI\_HBA} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf PSCSI\_HBA} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -physical SCSI host bus adapter.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{run}$ & {\tt host} & host ref & the physical machine to which this PSCSI HBA is connected \\ -$\mathit{RO}_\mathit{run}$ & {\tt physical\_host} & int & the physical host number \\ -$\mathit{RO}_\mathit{run}$ & {\tt PSCSIs} & (PSCSI ref) Set & the physical SCSI devices which are connected to this PSCSI HBA \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: PSCSI\_HBA} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the PSCSI HBAs known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((PSCSI_HBA ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PSCSI\_HBA ref) Set -} - - -references to all objects -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given PSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, PSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_host} - -{\bf Overview:} -Get the host field of the given PSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} (host ref) get_host (session_id s, PSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -host ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_physical\_host} - -{\bf Overview:} -Get the physical\_host field of the given PSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} int get_physical_host (session_id s, PSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_PSCSIs} - -{\bf Overview:} -Get the PSCSIs field of the given PSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} ((PSCSI ref) Set) get_PSCSIs (session_id s, PSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(PSCSI ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the PSCSI HBA instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (PSCSI_HBA ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PSCSI\_HBA ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given PSCSI HBA. - - \noindent {\bf Signature:} -\begin{verbatim} (PSCSI_HBA record) get_record (session_id s, PSCSI_HBA ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt PSCSI\_HBA ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -PSCSI\_HBA record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: user} -\subsection{Fields for class: user} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf user} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A -user of the system.}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier/object reference \\ -$\mathit{RO}_\mathit{ins}$ & {\tt short\_name} & string & short name (e.g. userid) \\ -$\mathit{RW}$ & {\tt fullname} & string & full name \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: user} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given user. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, user ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt user ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_short\_name} - -{\bf Overview:} -Get the short\_name field of the given user. - - \noindent {\bf Signature:} -\begin{verbatim} string get_short_name (session_id s, user ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt user ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_fullname} - -{\bf Overview:} -Get the fullname field of the given user. - - \noindent {\bf Signature:} -\begin{verbatim} string get_fullname (session_id s, user ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt user ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_fullname} - -{\bf Overview:} -Set the fullname field of the given user. - - \noindent {\bf Signature:} -\begin{verbatim} void set_fullname (session_id s, user ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt user ref } & self & reference to the object \\ \hline - -{\tt string } & value & New value to set \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new user instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (user ref) create (session_id s, user record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt user record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -user ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified user instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, user ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt user ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the user instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (user ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -user ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given user. - - \noindent {\bf Signature:} -\begin{verbatim} (user record) get_record (session_id s, user ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt user ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -user record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\vspace{1cm} -\newpage -\section{Class: XSPolicy} -\subsection{Fields for class: XSPolicy} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf XSPolicy} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A Xen Security Policy}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier / object reference \\ -$\mathit{RW}$ & {\tt repr} & string & representation of policy, i.e., XML \\ -$\mathit{RO}_\mathit{run}$ & {\tt type} & xs\_type & type of the policy \\ -$\mathit{RO}_\mathit{run}$ & {\tt flags} & xs\_instantiationflags & policy -status flags \\ -\hline -\end{longtable} -\subsection{Semantics of the class: XSPolicy} - -The XSPolicy class is used for administering Xen Security policies. Through -this class a new policy can be uploaded to the system, loaded into the -Xen hypervisor for enforcement and be set as the policy that the -system is automatically loading when the machine is started. - -This class returns information about the currently administered policy, -including a reference to the policy. This reference can then be used with -policy-specific classes, i.e., the ACMPolicy class, to allow retrieval of -information or changes to be made to a particular policy. - -\subsection{Structure and datatypes of class: XSPolicy} - -Format of the security label: - -A security label consist of the three different parts {\it policy type}, -{\it policy name} and {\it label} separated with colons. To specify -the virtual machine label for an ACM-type policy {\it xm-test}, the -security label string would be {\it ACM:xm-test:blue}, where blue -denotes the virtual machine's label. The format of resource labels is -the same.\\[0.5cm] -The following flags are used by this class: - -\begin{longtable}{|l|l|l|} -\hline -{\tt xs\_type} & value & meaning \\ -\hline -\hspace{0.5cm}{\tt XS\_POLICY\_ACM} & (1 $<<$ 0) & ACM-type policy \\ -\hline -\end{longtable} - -\begin{longtable}{|l|l|l|} -\hline -{\tt xs\_instantiationflags} & value & meaning \\ -\hline -\hspace{0.5cm}{\tt XS\_INST\_NONE} & 0 & do nothing \\ -\hspace{0.5cm}{\tt XS\_INST\_BOOT} & (1 $<<$ 0) & make system boot with this policy \\ -\hspace{0.5cm}{\tt XS\_INST\_LOAD} & (1 $<<$ 1) & load policy immediately \\ -\hline -\end{longtable} - -\begin{longtable}{|l|l|l|} -\hline -{\tt xs\_policystate} & type & meaning \\ -\hline -\hspace{0.5cm}{\tt xserr} & int & Error code from operation (if applicable) \\ -\hspace{0.5cm}{\tt xs\_ref} & XSPolicy ref & reference to the XS policy as returned by the API \\ -\hspace{0.5cm}{\tt repr} & string & representation of the policy, i.e., XML \\ -\hspace{0.5cm}{\tt type} & xs\_type & the type of the policy \\ -\hspace{0.5cm}{\tt flags } & xs\_instantiationflags & instantiation flags of the policy \\ -\hspace{0.5cm}{\tt version} & string & version of the policy \\ -\hspace{0.5cm}{\tt errors} & string & Base64-encoded sequence of integer tuples consisting \\ -& & of (error code, detail); will be returned as part \\ -& & of the xs\_setpolicy function. \\ -\hline -\end{longtable} - -\subsection{Additional RPCs associated with class: XSPolicy} -\subsubsection{RPC name:~get\_xstype} - -{\bf Overview:} -Return the Xen Security Policy types supported by this system - - \noindent {\bf Signature:} -\begin{verbatim} xs_type get_xstype (session_id s)\end{verbatim} - - \noindent {\bf Return Type:} -{\tt -xs\_type -} - -flags representing the supported Xen security policy types - \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_xspolicy} - -{\bf Overview:} -Set the current XSPolicy. This function can also be be used for updating of -an existing policy whose name must be equivalent to the one of the -currently running policy. - -\noindent {\bf Signature:} -\begin{verbatim} xs_policystate set_xspolicy (session_id s, xs_type type, string repr, -xs_instantiationflags flags, bool overwrite)\end{verbatim} - -\noindent{\bf Arguments:} - -\vspace{0.3cm} - -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt xs\_type } & type & the type of policy \\ \hline -{\tt string} & repr & representation of the policy, i.e., XML \\ \hline -{\tt xs\_instantiationflags} & flags & flags for the setting of the policy \\ \hline -{\tt bool} & overwrite & whether to overwrite an existing policy \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - - \noindent {\bf Return Type:} -{\tt -xs\_policystate -} - - -State information about the policy. In case an error occurred, the 'xs\_err' -field contains the error code. The 'errors' may contain further information -about the error. - \vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~reset\_xspolicy} - -{\bf Overview:} -Attempt to reset the system's policy by installing the default policy. -Since this function is implemented as an update to the current policy, it -underlies the same restrictions. This function may fail if for example -other domains than Domain-0 are running and use a different label than -Domain-0 - -\noindent {\bf Signature:} -\begin{verbatim} xs_policystate reset_xspolicy (session_id s, xs_type type) -\end{verbatim} - -\noindent{\bf Arguments:} - -\vspace{0.3cm} - -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt xs\_type } & type & the type of policy \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - - \noindent {\bf Return Type:} -{\tt -xs\_policystate -} - - -State information about the policy. In case an error occurred, the 'xs\_err' -field contains the error code. The 'errors' may contain further information -about the error. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_xspolicy} - -{\bf Overview:} -Get information regarding the currently set Xen Security Policy - - \noindent {\bf Signature:} -\begin{verbatim} xs_policystate get_xspolicy (session_id s)\end{verbatim} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -xs\_policystate -} - - -Policy state information. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~rm\_xsbootpolicy} - -{\bf Overview:} -Remove any policy from the default boot configuration. - - \noindent {\bf Signature:} -\begin{verbatim} void rm_xsbootpolicy (session_id s)\end{verbatim} - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt SECURITY\_ERROR} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_labeled\_resources} - -{\bf Overview:} -Get a list of resources that have been labeled. - - \noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_labeled_resources (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -A map of resources with their labels. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_resource\_label} - -{\bf Overview:} -Label the given resource with the given label. An empty label removes any label -from the resource. - - \noindent {\bf Signature:} -\begin{verbatim} void set_resource_label (session_id s, string resource, string -label, string old_label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & resource & resource to label \\ \hline -{\tt string } & label & label for the resource \\ \hline -{\tt string } & old\_label & Optional label value that the security label \\ -& & must currently have for the change to succeed. \\ \hline - -\end{tabular} - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt SECURITY\_ERROR} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_resource\_label} - -{\bf Overview:} -Get the label of the given resource. - - \noindent {\bf Signature:} -\begin{verbatim} string get_resource_label (session_id s, string resource)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & resource & resource to label \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -The label of the given resource. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~can\_run} - -{\bf Overview:} -Check whether a VM with the given security label could run on the system. - - \noindent {\bf Signature:} -\begin{verbatim} int can_run (session_id s, string security_label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & security\_label & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -Error code indicating whether a VM with the given security label could run. -If zero, it can run. - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} {\tt SECURITY\_ERROR} - -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the XSPolicies known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((XSPolicy ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(XSPolicy ref) Set -} - - -A list of all the IDs of all the XSPolicies -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given XSPolicy. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, XSPolicy ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt XSPolicy ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record of the referenced XSPolicy. - - \noindent {\bf Signature:} -\begin{verbatim} (XSPolicy record) get_record (session_id s, xs_ref xspolicy)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt xs ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -XSPolicy record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\newpage -\section{Class: ACMPolicy} -\subsection{Fields for class: ACMPolicy} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf ACMPolicy} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em An ACM Security Policy}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier / object reference \\ -$\mathit{RW}$ & {\tt repr} & string & representation of policy, in XML \\ -$\mathit{RO}_\mathit{run}$ & {\tt type} & xs\_type & type of the policy \\ -$\mathit{RO}_\mathit{run}$ & {\tt flags} & xs\_instantiationflags & policy -status flags \\ -\hline -\end{longtable} - -\subsection{Structure and datatypes of class: ACMPolicy} - -\vspace{0.5cm} -The following data structures are used: - -\begin{longtable}{|l|l|l|} -\hline -{\tt RIP acm\_policyheader} & type & meaning \\ -\hline -\hspace{0.5cm}{\tt policyname} & string & name of the policy \\ -\hspace{0.5cm}{\tt policyurl } & string & URL of the policy \\ -\hspace{0.5cm}{\tt date} & string & data of the policy \\ -\hspace{0.5cm}{\tt reference} & string & reference of the policy \\ -\hspace{0.5cm}{\tt namespaceurl} & string & namespaceurl of the policy \\ -\hspace{0.5cm}{\tt version} & string & version of the policy \\ -\hline -\end{longtable} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_header} - -{\bf Overview:} -Get the referenced policy's header information. - - \noindent {\bf Signature:} -\begin{verbatim} acm_policyheader get_header (session_id s, xs ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt xs ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -acm\_policyheader -} - - -The policy's header information. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_xml} - -{\bf Overview:} -Get the XML representation of the given policy. - - \noindent {\bf Signature:} -\begin{verbatim} string get_XML (session_id s, xs ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt xs ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -XML representation of the referenced policy -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_map} - -{\bf Overview:} -Get the mapping information of the given policy. - - \noindent {\bf Signature:} -\begin{verbatim} string get_map (session_id s, xs ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt xs ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -Mapping information of the referenced policy. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_binary} - -{\bf Overview:} -Get the binary policy representation of the referenced policy. - - \noindent {\bf Signature:} -\begin{verbatim} string get_binary (session_id s, xs ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt xs ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -Base64-encoded representation of the binary policy. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_enforced\_binary} - -{\bf Overview:} -Get the binary policy representation of the currently enforced ACM policy. -In case the default policy is loaded in the hypervisor, a policy may be -managed by xend that is not yet loaded into the hypervisor. - - \noindent {\bf Signature:} -\begin{verbatim} string get_enforced_binary (session_id s, xs ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt xs ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -Base64-encoded representation of the binary policy. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_VM\_ssidref} - -{\bf Overview:} -Get the ACM ssidref of the given virtual machine. - - \noindent {\bf Signature:} -\begin{verbatim} string get_VM_ssidref (session_id s, vm ref vm)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt vm ref } & vm & reference to a valid VM \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -The ssidref of the given virtual machine. - -\vspace{0.3cm} - -\noindent{\bf Possible Error Codes:} - {\tt HANDLE\_INVALID, VM\_BAD\_POWER\_STATE, SECURITY\_ERROR} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the ACMPolicies known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((ACMPolicy ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(ACMPolicy ref) Set -} - - -A list of all the IDs of all the ACMPolicies -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given ACMPolicy. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, ACMPolicy ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt ACMPolicy ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record of the referenced ACMPolicy. - - \noindent {\bf Signature:} -\begin{verbatim} (XSPolicy record) get_record (session_id s, xs_ref xspolicy)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt xs ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -XSPolicy record -} - - -all fields from the object - -\newpage -\section{Class: debug} -\subsection{Fields for class: debug} -{\bf Class debug has no fields.} -\subsection{RPCs associated with class: debug} -\subsubsection{RPC name:~get\_all} - -{\bf Overview:} -Return a list of all the debug records known to the system - - \noindent {\bf Signature:} -\begin{verbatim} ((debug ref) Set) get_all (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(debug ref) Set -} - - -A list of all the IDs of all the debug records -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~return\_failure} - -{\bf Overview:} -Return an API 'successful' failure. - - \noindent {\bf Signature:} -\begin{verbatim} void return_failure (session_id s)\end{verbatim} - - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new debug instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (debug ref) create (session_id s, debug record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt debug record } & args & All constructor arguments \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -debug ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified debug instance. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, debug ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt debug ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the debug instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (debug ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -debug ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given debug. - - \noindent {\bf Signature:} -\begin{verbatim} (debug record) get_record (session_id s, debug ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt debug ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -debug record -} - - -all fields from the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} - -\newpage -\section{Class: cpu\_pool} -\subsection{Fields for class: cpu\_pool} -\begin{longtable}{|lllp{0.38\textwidth}|} -\hline -\multicolumn{1}{|l}{Name} & \multicolumn{3}{l|}{\bf cpu\_pool} \\ -\multicolumn{1}{|l}{Description} & \multicolumn{3}{l|}{\parbox{11cm}{\em A CPU pool}} \\ -\hline -Quals & Field & Type & Description \\ -\hline -$\mathit{RO}_\mathit{run}$ & {\tt uuid} & string & unique identifier / object reference \\ -$\mathit{RW}$ & {\tt name\_label} & string & name of cpu\_pool \\ -$\mathit{RW}$ & {\tt name\_description} & string & cpu\_pool description \\ -$\mathit{RO}_\mathit{run}$ & {\tt resident\_on} & host ref & the host the cpu\_pool is currently resident on \\ -$\mathit{RW}$ & {\tt auto\_power\_on} & bool & True if this cpu\_pool should be activated automatically after host boot \\ -$\mathit{RO}_\mathit{run}$ & {\tt started\_VMs} & (VM ref) Set & list of VMs currently started in this cpu\_pool \\ -$\mathit{RW}$ & {\tt ncpu} & integer & number of host\_CPUs requested for this cpu\_pool at next start \\ -$\mathit{RW}$ & {\tt sched\_policy} & string & scheduler policy on this cpu\_pool \\ -$\mathit{RW}$ & {\tt proposed\_CPUs} & (string) Set & list of proposed host\_CPUs to assign at next activation \\ -$\mathit{RO}_\mathit{run}$ & {\tt host\_CPUs} & (VM ref) Set & list of host\_cpus currently assigned to this cpu\_pool \\ -$\mathit{RO}_\mathit{run}$ & {\tt activated} & bool & True if this cpu\_pool is activated \\ -$\mathit{RW}$ & {\tt other\_config} & (string $\rightarrow$ string) Map & additional configuration \\ -\hline -\end{longtable} -\subsection{RPCs associated with class: cpu\_pool} -\subsubsection{RPC name:~activate} - -{\bf Overview:} -Activate the cpu\_pool and assign the given CPUs to it. -CPUs specified in field proposed\_CPUs, that are not existing or not free, are -ignored. If value of ncpu is greater than the number of CPUs in field -proposed\_CPUs, additional free CPUs are assigned to the cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void activate (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - -\vspace{0.3cm} - -\noindent {\bf Possible Error Codes:} - {\tt POOL\_BAD\_STATE, INSUFFICIENT\_CPUS, UNKOWN\_SCHED\_POLICY} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~create} - -{\bf Overview:} -Create a new cpu\_pool instance, and return its handle. - - \noindent {\bf Signature:} -\begin{verbatim} (cpu_pool ref) create (session_id s, cpu_pool record args)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool record } & args & All constructor arguments \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -cpu\_pool ref -} - - -reference to the newly created object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~deactivate} - -{\bf Overview:} -Deactivate the cpu\_pool and release all CPUs assigned to it. -This function can only be called if there are no domains active in the -cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void deactivate (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - -\vspace{0.3cm} - -\noindent {\bf Possible Error Codes:} {\tt POOL\_BAD\_STATE} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~destroy} - -{\bf Overview:} -Destroy the specified cpu\_pool. The cpu\_pool is completely removed from the -system. -This function can only be called if the cpu\_pool is deactivated. - - \noindent {\bf Signature:} -\begin{verbatim} void destroy (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - -\vspace{0.3cm} - -\noindent {\bf Possible Error Codes:} {\tt POOL\_BAD\_STATE} - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_host\_CPU\_live} - - -{\bf Overview:} -Add a additional CPU immediatly to the cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void add_host_CPU_live (session_id s, cpu_pool ref self, host_cpu ref host_cpu)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt host\_cpu ref } & host\_cpu & CPU to add \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - -\vspace{0.3cm} - -\noindent {\bf Possible Error Codes:} - {\tt POOL\_BAD\_STATE, INVALID\_CPU} - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_host\_CPU\_live} - - -{\bf Overview:} -Remove a CPU immediatly from the cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_host_CPU_live (session_id s, cpu_pool ref self, host_cpu ref host_cpu)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt host\_cpu ref } & host\_cpu & CPU to remove \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - -\vspace{0.3cm} - -\noindent {\bf Possible Error Codes:} - {\tt POOL\_BAD\_STATE, INVALID\_CPU, LAST\_CPU\_NOT\_REMOVEABLE} - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_all} - - -{\bf Overview:} -Return a list of all the cpu pools known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} ((cpu_pool ref) Set) get_all (session_id s)\end{verbatim} - - - \noindent {\bf Return Type:} -{\tt -(cpu\_pool ref) Set -} -A list of all the IDs of the cpu pools. - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_all\_records} - - -{\bf Overview:} -Return a map of all the cpu pool records known to the system. - - \noindent {\bf Signature:} -\begin{verbatim} (((cpu_pool ref) -> (cpu_pool record)) Map) get_all_records (session_id s)\end{verbatim} - - - \noindent {\bf Return Type:} -{\tt -((cpu\_pool ref) $\rightarrow$ (cpu\_pool record)) Map -} -A map of all the cpu pool records indexed by cpu pool ref. - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_name\_label} - -{\bf Overview:} -Get all the cpu\_pool instances with the given label. - - \noindent {\bf Signature:} -\begin{verbatim} ((cpu_pool ref) Set) get_by_name_label (session_id s, string label)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & label & label of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(cpu\_pool ref) Set -} - - -references to objects with matching names -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_by\_uuid} - -{\bf Overview:} -Get a reference to the cpu\_pool instance with the specified UUID. - - \noindent {\bf Signature:} -\begin{verbatim} (cpu_pool ref) get_by_uuid (session_id s, string uuid)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt string } & uuid & UUID of object to return \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -cpu\_pool ref -} - - -reference to the object -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_activated} - - -{\bf Overview:} -Return the activation state of the cpu\_pool object. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_activated (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} -Returns {\bf true} if cpu\_pool is active. - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_auto\_power\_on} - - -{\bf Overview:} -Return the auto power attribute of the cpu\_pool object. - - \noindent {\bf Signature:} -\begin{verbatim} bool get_auto_power_on (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -bool -} -Returns {\bf true} if cpu\_pool has to be activated on xend start. - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_host\_CPUs} - - -{\bf Overview:} -Return the list of host\_cpu refs assigned to the cpu\_pool object. - - \noindent {\bf Signature:} -\begin{verbatim} ((host_cpu ref) Set) get_host_CPUs (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(host\_cpu ref) Set -} -Returns a list of references of all host cpus assigned to the cpu\_pool. - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_description} - -{\bf Overview:} -Get the name/description field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_description (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_name\_label} - -{\bf Overview:} -Get the name/label field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} string get_name_label (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_ncpu} - -{\bf Overview:} -Get the ncpu field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} int get_ncpu (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -int -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_proposed\_CPUs} - -{\bf Overview:} -Get the proposed\_CPUs field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} ((string) Set) get_proposed_CPUs (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline - -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -(string) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_other\_config} - -{\bf Overview:} -Get the other\_config field of the given cpu\_pool. - -\noindent {\bf Signature:} -\begin{verbatim} ((string -> string) Map) get_other_config (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -(string $\rightarrow$ string) Map -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_record} - -{\bf Overview:} -Get a record containing the current state of the given cpu\_pool. - -\noindent {\bf Signature:} -\begin{verbatim} (cpu_pool record) get_record (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -cpu\_pool record -} - - -all fields of the object. -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_resident\_on} - -{\bf Overview:} -Get the resident\_on field of the given cpu\_pool. - -\noindent {\bf Signature:} -\begin{verbatim} (host ref) get_resident_on (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -host ref -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_sched\_policy} - -{\bf Overview:} -Get the sched\_policy field of the given cpu\_pool. - -\noindent {\bf Signature:} -\begin{verbatim} string get_sched_policy (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_started\_VMs} - -{\bf Overview:} -Get the started\_VMs field of the given cpu\_pool. - -\noindent {\bf Signature:} -\begin{verbatim} ((VM ref) Set) get_started_VMs (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -(VM ref) Set -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~get\_uuid} - -{\bf Overview:} -Get the uuid field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} string get_uuid (session_id s, cpu_pool ref self)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -string -} - - -value of the field -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_auto\_power\_on} - -{\bf Overview:} -Set the auto\_power\_on field of the given cpu\_pool. - -\noindent {\bf Signature:} -\begin{verbatim} void set_auto_power_on (session_id s, cpu_pool ref self, bool value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt bool } & value & new auto\_power\_on value \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -void -} -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_proposed\_CPUs} - -{\bf Overview:} -Set the proposed\_CPUs field of the given cpu\_pool. - -\noindent {\bf Signature:} -\begin{verbatim} void set_proposed_CPUs (session_id s, cpu_pool ref self, string Set cpus)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt string Set } & cpus & Set of preferred CPU (numbers) to use \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -void -} -\vspace{0.3cm} - -\noindent {\bf Possible Error Codes:} - {\tt POOL\_BAD\_STATE} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:add\_to\_proposed\_CPUs} - -{\bf Overview:} -Add a CPU (number) to the proposed\_CPUs field of the given cpu\_pool. - -\noindent {\bf Signature:} -\begin{verbatim} void add_to_proposed_CPUs (session_id s, cpu_pool ref self, integer cpu)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} - \hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt integer } & cpu & Number of CPU to add \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -void -} -\vspace{0.3cm} - -\noindent {\bf Possible Error Codes:} - {\tt POOL\_BAD\_STATE} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:remove\_from\_proposed\_CPUs} - -{\bf Overview:} -Remove a CPU (number) from the proposed\_CPUs field of the given cpu\_pool. - -\noindent {\bf Signature:} -\begin{verbatim} void remove_from_proposed_CPUs (session_id s, cpu_pool ref self, integer cpu)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt integer } & cpu & Number of CPU to remove \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -void -} -\vspace{0.3cm} - -\noindent {\bf Possible Error Codes:} - {\tt POOL\_BAD\_STATE} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_name\_label} - -{\bf Overview:} -Set the name/label field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void set_name_label (session_id s, cpu_pool ref self, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt string } & value & New value to set \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_ncpu} - -{\bf Overview:} -Set the ncpu field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void set_ncpu (session_id s, cpu_pool ref self, integer value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt integer } & value & Number of cpus to use \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - -\vspace{0.3cm} - -\noindent {\bf Possible Error Codes:} - {\tt POOL\_BAD\_STATE} - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_other\_config} - -{\bf Overview:} -Set the other\_config field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void set_other_config (session_id s, cpu_pool ref self, (string -> string) Map value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~add\_to\_other\_config} - -{\bf Overview:} -Add the given key-value pair to the other\_config field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void add_to_other_config (session_id s, cpu_pool ref self, string key, string value)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt string } & key & Key to add \\ \hline -{\tt string } & value & Value to add \\ \hline -\end{tabular} - -\vspace{0.3cm} - - \noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~remove\_from\_other\_config} - -{\bf Overview:} -Remove the given key and its corresponding value from the other\_config -field of the given cpu\_pool. If the key is not in that Map, then do nothing. - - \noindent {\bf Signature:} -\begin{verbatim} void remove_from_other_config (session_id s, cpu_pool ref self, string key)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt string } & key & Key to remove \\ \hline -\end{tabular} - -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -void -} - - - -\vspace{0.3cm} -\vspace{0.3cm} -\vspace{0.3cm} -\subsubsection{RPC name:~set\_sched\_policy} - -{\bf Overview:} -Set the sched\_policy field of the given cpu\_pool. - - \noindent {\bf Signature:} -\begin{verbatim} void set_sched_policy (session_id s, cpu_pool ref self, string new_sched_policy)\end{verbatim} - - -\noindent{\bf Arguments:} - - -\vspace{0.3cm} -\begin{tabular}{|c|c|p{7cm}|} -\hline -{\bf type} & {\bf name} & {\bf description} \\ \hline -{\tt cpu\_pool ref } & self & reference to the object \\ \hline -{\tt string } & new\_sched\_policy & New value to set \\ \hline -\end{tabular} -\vspace{0.3cm} - -\noindent {\bf Return Type:} -{\tt -void -} - - diff -Nru xen-4.2.2/docs/xen-api/xenapi.tex xen-4.3.0/docs/xen-api/xenapi.tex --- xen-4.2.2/docs/xen-api/xenapi.tex 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/docs/xen-api/xenapi.tex 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -% -% Copyright (c) 2006-2007 XenSource, Inc. -% -% Permission is granted to copy, distribute and/or modify this document under -% the terms of the GNU Free Documentation License, Version 1.2 or any later -% version published by the Free Software Foundation; with no Invariant -% Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the -% license is included in the section entitled -% "GNU Free Documentation License" or the file fdl.tex. -% -% Authors: Ewan Mellor, Richard Sharp, Dave Scott, Jon Harrop. -% - -\documentclass{report} - -\usepackage{a4} -\usepackage{graphics} -\usepackage{longtable} -\usepackage{fancyhdr} -\usepackage{hyperref} -\usepackage{array} - -\setlength\topskip{0cm} -\setlength\topmargin{0cm} -\setlength\oddsidemargin{0cm} -\setlength\evensidemargin{0cm} -\setlength\parindent{0pt} - -%% Parameters for coversheet: -\input{xenapi-coversheet} - -\begin{document} - -% The coversheet itself -\include{coversheet} - -% The revision history -\include{revision-history} - -% Table of contents -\tableofcontents - - -% ... and off we go! - -\chapter{Introduction} - -This document contains a description of the Xen Management API---an interface for -remotely configuring and controlling virtualised guests running on a -Xen-enabled host. - -\input{presentation} - -\include{wire-protocol} -\include{vm-lifecycle} -\include{xenapi-datamodel} -\include{fdl} -\include{bibliography} - -\end{document} diff -Nru xen-4.2.2/extras/mini-os/COPYING xen-4.3.0/extras/mini-os/COPYING --- xen-4.2.2/extras/mini-os/COPYING 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/COPYING 2013-07-09 10:46:56.000000000 +0000 @@ -1,3 +1,16 @@ +Certain files in this directory are licensed by the GNU +General Public License version 2 (GPLv2). By default these +files are not built and linked into MiniOs. Enabling them +will cause the whole work to become covered by the GPLv2. + +The current set of GPLv2 features are: +CONFIG_TPMFRONT +CONFIG_TPMBACK +CONFIG_TPM_TIS + +Do not use these if you do not want your MiniOS build to become +GPL licensed! + Copyright (c) 2009 Citrix Systems, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without diff -Nru xen-4.2.2/extras/mini-os/Config.mk xen-4.3.0/extras/mini-os/Config.mk --- xen-4.2.2/extras/mini-os/Config.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/Config.mk 2013-07-09 10:46:56.000000000 +0000 @@ -9,7 +9,7 @@ # Try to find out the architecture family TARGET_ARCH_FAM. # First check whether x86_... is contained (for x86_32, x86_32y, x86_64). -# If not x86 then use $(XEN_TARGET_ARCH) -> for ia64, ... +# If not x86 then use $(XEN_TARGET_ARCH) ifeq ($(findstring x86_,$(XEN_TARGET_ARCH)),x86_) TARGET_ARCH_FAM = x86 else diff -Nru xen-4.2.2/extras/mini-os/Makefile xen-4.3.0/extras/mini-os/Makefile --- xen-4.2.2/extras/mini-os/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -22,11 +22,15 @@ CONFIG_TEST ?= n CONFIG_PCIFRONT ?= n CONFIG_BLKFRONT ?= y +CONFIG_TPMFRONT ?= n +CONFIG_TPM_TIS ?= n +CONFIG_TPMBACK ?= n CONFIG_NETFRONT ?= y CONFIG_FBFRONT ?= y CONFIG_KBDFRONT ?= y CONFIG_CONSFRONT ?= y CONFIG_XENBUS ?= y +CONFIG_XC ?=y CONFIG_LWIP ?= $(lwip) # Export config items as compiler directives @@ -35,6 +39,9 @@ flags-$(CONFIG_QEMU_XS_ARGS) += -DCONFIG_QEMU_XS_ARGS flags-$(CONFIG_PCIFRONT) += -DCONFIG_PCIFRONT flags-$(CONFIG_BLKFRONT) += -DCONFIG_BLKFRONT +flags-$(CONFIG_TPMFRONT) += -DCONFIG_TPMFRONT +flags-$(CONFIG_TPM_TIS) += -DCONFIG_TPM_TIS +flags-$(CONFIG_TPMBACK) += -DCONFIG_TPMBACK flags-$(CONFIG_NETFRONT) += -DCONFIG_NETFRONT flags-$(CONFIG_KBDFRONT) += -DCONFIG_KBDFRONT flags-$(CONFIG_FBFRONT) += -DCONFIG_FBFRONT @@ -66,6 +73,9 @@ SUBDIRS := lib xenbus console src-$(CONFIG_BLKFRONT) += blkfront.c +src-$(CONFIG_TPMFRONT) += tpmfront.c +src-$(CONFIG_TPM_TIS) += tpm_tis.c +src-$(CONFIG_TPMBACK) += tpmback.c src-y += daytime.c src-y += events.c src-$(CONFIG_FBFRONT) += fbfront.c @@ -126,7 +136,7 @@ ifeq ($(CONFIG_LWIP),y) # lwIP library -LWC := $(shell find $(LWIPDIR)/ -type f -name '*.c') +LWC := $(shell find $(LWIPDIR)/src -type f -name '*.c') LWC := $(filter-out %6.c %ip6_addr.c %ethernetif.c, $(LWC)) LWO := $(patsubst %.c,%.o,$(LWC)) LWO += $(OBJ_DIR)/lwip-arch.o @@ -144,7 +154,9 @@ OBJS := $(filter-out $(OBJ_DIR)/lwip%.o $(LWO), $(OBJS)) ifeq ($(libc),y) +ifeq ($(CONFIG_XC),y) APP_LDLIBS += -L$(XEN_ROOT)/stubdom/libxc-$(XEN_TARGET_ARCH) -whole-archive -lxenguest -lxenctrl -no-whole-archive +endif APP_LDLIBS += -lpci APP_LDLIBS += -lz APP_LDLIBS += -lm diff -Nru xen-4.2.2/extras/mini-os/README xen-4.3.0/extras/mini-os/README --- xen-4.2.2/extras/mini-os/README 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/README 2013-07-09 10:46:56.000000000 +0000 @@ -19,7 +19,7 @@ - to build it just type make. -- to build it with TCP/IP support, download LWIP 1.3 source code and type +- to build it with TCP/IP support, download LWIP 1.3.2 source code and type make LWIPDIR=/path/to/lwip/source diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/Makefile xen-4.3.0/extras/mini-os/arch/ia64/Makefile --- xen-4.2.2/extras/mini-os/arch/ia64/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -# -# Special makefile for ia64. -# - -XEN_ROOT = $(CURDIR)/../../../.. -include $(XEN_ROOT)/Config.mk - -include ../../Config.mk - -include arch.mk -include ../../minios.mk - -ARCH_SRCS := sal.c -ARCH_SRCS += efi.c -ARCH_SRCS += time.c -ARCH_SRCS += ivt.S -ARCH_SRCS += fw.S -ARCH_SRCS += common.c -ARCH_SRCS += time.c -ARCH_SRCS += mm.c -ARCH_SRCS += debug.c -ARCH_SRCS += sched.c -ARCH_SRCS += xencomm.c -ARCH_SRCS += __umoddi3.S -ARCH_SRCS += __udivdi3.S -ARCH_SRCS += __divdi3.S - -ARCH_OBJS := sal.o -ARCH_OBJS += efi.o -ARCH_OBJS += time.o -ARCH_OBJS += ivt.o -ARCH_OBJS += fw.o -ARCH_OBJS += common.o -ARCH_OBJS += time.o -ARCH_OBJS += mm.o -ARCH_OBJS += debug.o -ARCH_OBJS += sched.o -ARCH_OBJS += xencomm.o -ARCH_OBJS += __umoddi3.o -ARCH_OBJS += __udivdi3.o -ARCH_OBJS += __udivsi3.o -ARCH_OBJS += __divdi3.o -ARCH_OBJS := $(addprefix $(OBJ_DIR)/,$(ARCH_OBJS)) - -GEN_OFF_SRC := gen_off.c -GEN_OFF_ASM := gen_off.s -GEN_OFF_H := $(MINI-OS_ROOT)/include/$(ARCH_INC)/offsets.h - -all: $(OBJ_DIR)/$(ARCH_LIB) - -$(GEN_OFF_ASM): $(GEN_OFF_SRC) - $(CC) -S -o $@ $(CPPFLAGS) $< - -$(GEN_OFF_H): $(GEN_OFF_ASM) - sed -ne "/^->/ {s/->/#define /; p}" < $< > $@ - -$(OBJ_DIR)/$(ARCH_LIB): $(GEN_OFF_H) $(ARCH_OBJS) $(OBJ_DIR)/$(HEAD_ARCH_OBJ) - $(AR) rv $(ARCH_LIB) $(ARCH_OBJS) - -clean: - rm -f $(OBJ_DIR)/$(ARCH_LIB) $(ARCH_OBJS) $(OBJ_DIR)/$(HEAD_ARCH_OBJ) - rm -f $(GEN_OFF_ASM) - rm -f $(GEN_OFF_H) diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/__divdi3.S xen-4.3.0/extras/mini-os/arch/ia64/__divdi3.S --- xen-4.2.2/extras/mini-os/arch/ia64/__divdi3.S 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/__divdi3.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -.file "__divdi3.s" - -// $FreeBSD: src/sys/libkern/ia64/__divdi3.S,v 1.1 2000/10/04 17:53:03 dfr Exp $ -// -// Copyright (c) 2000, Intel Corporation -// All rights reserved. -// -// Contributed 2/15/2000 by Marius Cornea, John Harrison, Cristina Iordache, -// Ted Kubaska, Bob Norin, and Shane Story of the Computational Software Lab, -// Intel Corporation. -// -// WARRANTY DISCLAIMER -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Intel Corporation is the author of this code, and requests that all -// problem reports or change requests be submitted to it directly at -// http://developer.intel.com/opensource. -// - -.section .text -.proc __divdi3# -.align 32 -.global __divdi3# -.align 32 - -// 64-bit signed integer divide - -__divdi3: - -{ .mii - alloc r31=ar.pfs,2,0,0,0 - nop.i 0 - nop.i 0;; -} { .mmi - - // 64-BIT SIGNED INTEGER DIVIDE BEGINS HERE - - setf.sig f8=r32 - setf.sig f9=r33 - nop.i 0;; -} { .mfb - nop.m 0 - fcvt.xf f6=f8 - nop.b 0 -} { .mfb - nop.m 0 - fcvt.xf f7=f9 - nop.b 0;; -} { .mfi - nop.m 0 - // Step (1) - // y0 = 1 / b in f8 - frcpa.s1 f8,p6=f6,f7 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (2) - // e0 = 1 - b * y0 in f9 - (p6) fnma.s1 f9=f7,f8,f1 - nop.i 0 -} { .mfi - nop.m 0 - // Step (3) - // q0 = a * y0 in f10 - (p6) fma.s1 f10=f6,f8,f0 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (4) - // e1 = e0 * e0 in f11 - (p6) fma.s1 f11=f9,f9,f0 - nop.i 0 -} { .mfi - nop.m 0 - // Step (5) - // q1 = q0 + e0 * q0 in f10 - (p6) fma.s1 f10=f9,f10,f10 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (6) - // y1 = y0 + e0 * y0 in f8 - (p6) fma.s1 f8=f9,f8,f8 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (7) - // q2 = q1 + e1 * q1 in f9 - (p6) fma.s1 f9=f11,f10,f10 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (8) - // y2 = y1 + e1 * y1 in f8 - (p6) fma.s1 f8=f11,f8,f8 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (9) - // r2 = a - b * q2 in f10 - (p6) fnma.s1 f10=f7,f9,f6 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (10) - // q3 = q2 + r2 * y2 in f8 - (p6) fma.s1 f8=f10,f8,f9 - nop.i 0;; -} { .mfb - nop.m 0 - // Step (11) - // q = trunc (q3) - fcvt.fx.trunc.s1 f8=f8 - nop.b 0;; -} { .mmi - // quotient will be in r8 (if b != 0) - getf.sig r8=f8 - nop.m 0 - nop.i 0;; -} - - // 64-BIT SIGNED INTEGER DIVIDE ENDS HERE - -{ .mmb - nop.m 0 - nop.m 0 - br.ret.sptk b0;; -} - -.endp __divdi3 diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/__udivdi3.S xen-4.3.0/extras/mini-os/arch/ia64/__udivdi3.S --- xen-4.2.2/extras/mini-os/arch/ia64/__udivdi3.S 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/__udivdi3.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -.file "__udivdi3.s" - -// $FreeBSD: src/sys/libkern/ia64/__udivdi3.S,v 1.1 2000/10/04 17:53:03 dfr Exp $ -// -// Copyright (c) 2000, Intel Corporation -// All rights reserved. -// -// Contributed 2/15/2000 by Marius Cornea, John Harrison, Cristina Iordache, -// Ted Kubaska, Bob Norin, and Shane Story of the Computational Software Lab, -// Intel Corporation. -// -// WARRANTY DISCLAIMER -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Intel Corporation is the author of this code, and requests that all -// problem reports or change requests be submitted to it directly at -// http://developer.intel.com/opensource. -// - -.section .text -.proc __udivdi3# -.align 32 -.global __udivdi3# -.align 32 - -// 64-bit unsigned integer divide - -__udivdi3: - -{ .mii - alloc r31=ar.pfs,2,0,0,0 - nop.i 0 - nop.i 0;; -} - -{ .mmi - - // 64-BIT UNSIGNED INTEGER DIVIDE BEGINS HERE - - setf.sig f8=r32 - setf.sig f9=r33 - nop.i 0;; -} { .mfb - nop.m 0 - fma.s1 f6=f8,f1,f0 - nop.b 0 -} { .mfb - nop.m 0 - fma.s1 f7=f9,f1,f0 - nop.b 0;; -} { .mfi - nop.m 0 - // Step (1) - // y0 = 1 / b in f8 - frcpa.s1 f8,p6=f6,f7 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (2) - // e0 = 1 - b * y0 in f9 - (p6) fnma.s1 f9=f7,f8,f1 - nop.i 0 -} { .mfi - nop.m 0 - // Step (3) - // q0 = a * y0 in f10 - (p6) fma.s1 f10=f6,f8,f0 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (4) - // e1 = e0 * e0 in f11 - (p6) fma.s1 f11=f9,f9,f0 - nop.i 0 -} { .mfi - nop.m 0 - // Step (5) - // q1 = q0 + e0 * q0 in f10 - (p6) fma.s1 f10=f9,f10,f10 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (6) - // y1 = y0 + e0 * y0 in f8 - (p6) fma.s1 f8=f9,f8,f8 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (7) - // q2 = q1 + e1 * q1 in f9 - (p6) fma.s1 f9=f11,f10,f10 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (8) - // y2 = y1 + e1 * y1 in f8 - (p6) fma.s1 f8=f11,f8,f8 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (9) - // r2 = a - b * q2 in f10 - (p6) fnma.s1 f10=f7,f9,f6 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (10) - // q3 = q2 + r2 * y2 in f8 - (p6) fma.s1 f8=f10,f8,f9 - nop.i 0;; -} { .mfb - nop.m 0 - // (11) q = trunc(q3) - fcvt.fxu.trunc.s1 f8=f8 - nop.b 0;; -} { .mmi - // quotient will be in r8 (if b != 0) - getf.sig r8=f8 - nop.m 0 - nop.i 0;; -} - - // 64-BIT UNSIGNED INTEGER DIVIDE ENDS HERE - -{ .mmb - nop.m 0 - nop.m 0 - br.ret.sptk b0;; -} - -.endp __udivdi3 diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/__udivsi3.S xen-4.3.0/extras/mini-os/arch/ia64/__udivsi3.S --- xen-4.2.2/extras/mini-os/arch/ia64/__udivsi3.S 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/__udivsi3.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ -.file "__udivsi3.s" - -// $FreeBSD: src/sys/libkern/ia64/__udivsi3.S,v 1.1.8.1 2005/01/31 23:26:21 imp Exp $ - -//- -// Copyright (c) 2000, Intel Corporation -// All rights reserved. -// -// Contributed 2/15/2000 by Marius Cornea, John Harrison, Cristina Iordache, -// Ted Kubaska, Bob Norin, and Shane Story of the Computational Software Lab, -// Intel Corporation. -// -// WARRANTY DISCLAIMER -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Intel Corporation is the author of this code, and requests that all -// problem reports or change requests be submitted to it directly at -// http://developer.intel.com/opensource. -// - -.section .text - -// 32-bit unsigned integer divide - -.proc __udivsi3# -.align 32 -.global __udivsi3# -.align 32 - -__udivsi3: - -{ .mii - alloc r31=ar.pfs,2,0,0,0 - nop.i 0 - nop.i 0;; -} { .mii - nop.m 0 - - // 32-BIT UNSIGNED INTEGER DIVIDE BEGINS HERE - - // general register used: - // r32 - 32-bit unsigned integer dividend - // r33 - 32-bit unsigned integer divisor - // r8 - 32-bit unsigned integer result - // r2 - scratch register - // floating-point registers used: f6, f7, f8, f9 - // predicate registers used: p6 - - zxt4 r32=r32 - zxt4 r33=r33;; -} { .mmb - setf.sig f6=r32 - setf.sig f7=r33 - nop.b 0;; -} { .mfi - nop.m 0 - fcvt.xf f6=f6 - nop.i 0 -} { .mfi - nop.m 0 - fcvt.xf f7=f7 - mov r2 = 0x0ffdd;; -} { .mfi - setf.exp f9 = r2 - // (1) y0 - frcpa.s1 f8,p6=f6,f7 - nop.i 0;; -} { .mfi - nop.m 0 - // (2) q0 = a * y0 - (p6) fma.s1 f6=f6,f8,f0 - nop.i 0 -} { .mfi - nop.m 0 - // (3) e0 = 1 - b * y0 - (p6) fnma.s1 f7=f7,f8,f1 - nop.i 0;; -} { .mfi - nop.m 0 - // (4) q1 = q0 + e0 * q0 - (p6) fma.s1 f6=f7,f6,f6 - nop.i 0 -} { .mfi - nop.m 0 - // (5) e1 = e0 * e0 + 2^-34 - (p6) fma.s1 f7=f7,f7,f9 - nop.i 0;; -} { .mfi - nop.m 0 - // (6) q2 = q1 + e1 * q1 - (p6) fma.s1 f8=f7,f6,f6 - nop.i 0;; -} { .mfi - nop.m 0 - // (7) q = trunc(q2) - fcvt.fxu.trunc.s1 f8=f8 - nop.i 0;; -} { .mmi - // quotient will be in the least significant 32 bits of r8 (if b != 0) - getf.sig r8=f8 - nop.m 0 - nop.i 0;; -} - - // 32-BIT UNSIGNED INTEGER DIVIDE ENDS HERE - -{ .mmb - nop.m 0 - nop.m 0 - br.ret.sptk b0;; -} - -.endp __udivsi3 diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/__umoddi3.S xen-4.3.0/extras/mini-os/arch/ia64/__umoddi3.S --- xen-4.2.2/extras/mini-os/arch/ia64/__umoddi3.S 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/__umoddi3.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -.file "__umoddi3.s" - -// $FreeBSD: src/sys/libkern/ia64/__umoddi3.S,v 1.3 2003/02/11 20:15:11 schweikh Exp $ -// -// Copyright (c) 2000, Intel Corporation -// All rights reserved. -// -// Contributed 2/15/2000 by Marius Cornea, John Harrison, Cristina Iordache, -// Ted Kubaska, Bob Norin, and Shane Story of the Computational Software Lab, -// Intel Corporation. -// -// WARRANTY DISCLAIMER -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Intel Corporation is the author of this code, and requests that all -// problem reports or change requests be submitted to it directly at -// http://developer.intel.com/opensource. -// - -.section .text - - // 64-bit unsigned integer remainder - -.proc __umoddi3# -.align 32 -.global __umoddi3# -.align 32 - -__umoddi3: - -{ .mii - alloc r31=ar.pfs,3,0,0,0 - nop.i 0 - nop.i 0 -} { .mmb - - // 64-BIT UNSIGNED INTEGER REMAINDER BEGINS HERE - - // general register used: - // r32 - 64-bit unsigned integer dividend, called a below - // r33 - 64-bit unsigned integer divisor, called b below - // r8 - 64-bit unsigned integer result - // floating-point registers used: f6, f7, f8, f9, f10, f11, f12 - // predicate registers used: p6 - - setf.sig f12=r32 // holds a in integer form - setf.sig f7=r33 - nop.b 0;; -} { .mfi - // get 2s complement of b - sub r33=r0,r33 - fcvt.xuf.s1 f6=f12 - nop.i 0 -} { .mfi - nop.m 0 - fcvt.xuf.s1 f7=f7 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (1) - // y0 = 1 / b in f8 - frcpa.s1 f8,p6=f6,f7 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (2) - // q0 = a * y0 in f10 - (p6) fma.s1 f10=f6,f8,f0 - nop.i 0 -} { .mfi - nop.m 0 - // Step (3) - // e0 = 1 - b * y0 in f9 - (p6) fnma.s1 f9=f7,f8,f1 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (4) - // q1 = q0 + e0 * q0 in f10 - (p6) fma.s1 f10=f9,f10,f10 - nop.i 0 -} { .mfi - nop.m 0 - // Step (5) - // e1 = e0 * e0 in f11 - (p6) fma.s1 f11=f9,f9,f0 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (6) - // y1 = y0 + e0 * y0 in f8 - (p6) fma.s1 f8=f9,f8,f8 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (7) - // q2 = q1 + e1 * q1 in f9 - (p6) fma.s1 f9=f11,f10,f10 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (8) - // y2 = y1 + e1 * y1 in f8 - (p6) fma.s1 f8=f11,f8,f8 - nop.i 0;; -} { .mfi - nop.m 0 - // Step (9) - // r2 = a - b * q2 in f10 - (p6) fnma.s1 f10=f7,f9,f6 - nop.i 0;; -} { .mfi - // f7=-b - setf.sig f7=r33 - // Step (10) - // q3 = q2 + r2 * y2 in f8 - (p6) fma.s1 f8=f10,f8,f9 - nop.i 0;; -} { .mfi - nop.m 0 - // (11) q = trunc(q3) - fcvt.fxu.trunc.s1 f8=f8 - nop.i 0;; -} { .mfi - nop.m 0 - // (12) r = a + (-b) * q - xma.l f8=f8,f7,f12 - nop.i 0;; -} { .mib - getf.sig r8=f8 - nop.i 0 - nop.b 0 -} - - // 64-BIT UNSIGNED INTEGER REMAINDER ENDS HERE - -{ .mib - nop.m 0 - nop.i 0 - br.ret.sptk b0;; -} - -.endp __umoddi3 diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/arch.mk xen-4.3.0/extras/mini-os/arch/ia64/arch.mk --- xen-4.2.2/extras/mini-os/arch/ia64/arch.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/arch.mk 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - -ARCH_CFLAGS := -mfixed-range=f2-f5,f12-f15,f32-f127 -mconstant-gp -ARCH_CFLAGS += -O2 -ARCH_ASFLAGS := -x assembler-with-cpp -ARCH_ASFLAGS += -mfixed-range=f2-f5,f12-f15,f32-f127 -fomit-frame-pointer -ARCH_ASFLAGS += -fno-builtin -fno-common -fno-strict-aliasing -mconstant-gp - -ARCH_LDFLAGS = -warn-common - diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/common.c xen-4.3.0/extras/mini-os/arch/ia64/common.c --- xen-4.2.2/extras/mini-os/arch/ia64/common.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/common.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,266 +0,0 @@ -/* - * Done by Dietmar Hahn - * - **************************************************************************** - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - **************************************************************************** - * - * Parts are taken from FreeBSD. - * - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/* For more console boot messages. */ -int bootverbose; - -/* - * This structure contains start-of-day info, such as pagetable base pointer, - * address of the shared_info structure, and things like that. - */ -union start_info_union start_info_union; - -shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)XSI_BASE; - -struct machine_fw machineFwG; - -/* This pointer is initialized in ia64.S with the address of the boot param - * area passed by the bootloader. */ -struct xen_ia64_boot_param* ia64_boot_paramP; - -struct xen_ia64_boot_param ia64BootParamG; -char boot_cmd_line[COMMAND_LINE_SIZE+1]; - - -void -ia64_write_itr_i(ia64_pte_t* pteP, uint32_t reg, uint64_t vAddr, - uint64_t ps, uint64_t pk) -{ - /* The virtual address. */ - __asm __volatile("mov cr.ifa=%0" :: "r"(vAddr)); - /* The page size */ - __asm __volatile("mov cr.itir=%0;;" :: "r"((ps << IA64_ITIR_PS)|(pk << IA64_ITIR_KEY))); - /* Put pte into instruction translation register. */ - __asm __volatile("itr.i itr[%0]=%1" :: "r"(reg), "r"(*(uint64_t*)pteP)); - /* Serialization */ - __asm __volatile("srlz.i"); -} - -void -map_pal_code(void) -{ - ia64_pte_t pte; - - xen_set_virtual_psr_ic(0); - memset(&pte, 0, sizeof(pte)); /* Prepare the pte */ - pte.pte_p = 1; /* present bit */ - pte.pte_ma = PTE_MA_WB; /* memory attribute */ - pte.pte_a = 1; /* accessed bit */ - pte.pte_d = 1; /* dirty bit */ - pte.pte_pl = PTE_PL_KERN; /* privilege level */ - pte.pte_ar = PTE_AR_RWX; /* access rights */ - pte.pte_ppn = ((uint64_t) __pa(machineFwG.ia64_pal_base)) >> 14; - pte.pte_ed = 0; /* exception deferral */ - - /* - * Must purge here because a itc/dtc with the same address - * may be in the tlb! - */ - ia64_ptc_l(machineFwG.ia64_pal_base, PTE_PS_16K); - ia64_write_itr_i(&pte, IA64_TR_PAL, - (uint64_t)machineFwG.ia64_pal_base, - PTE_PS_16K, IA64_KEY_REG7); - xen_set_virtual_psr_ic(1); -} - -/* In ivt.S */ -extern char hypervisor_callback; - -static void -registerCallback(void) -{ - struct callback_register event = - { - .type = CALLBACKTYPE_event, - .address = (unsigned long)&hypervisor_callback, - }; - HYPERVISOR_callback_op(CALLBACKOP_register, &event); -} - -static void -init_start_info(start_info_t* xen_start_info) -{ - /* Make a copy of the start_info structure */ - start_info.nr_pages = xen_start_info->nr_pages; - start_info.shared_info = xen_start_info->shared_info; - start_info.flags = xen_start_info->flags; - start_info.store_mfn = xen_start_info->store_mfn; - start_info.store_evtchn = xen_start_info->store_evtchn; - start_info.console.domU.mfn = xen_start_info->console.domU.mfn; - start_info.console.domU.evtchn = - xen_start_info->console.domU.evtchn; - start_info.pt_base = xen_start_info->pt_base; - start_info.nr_pt_frames = xen_start_info->nr_pt_frames; - start_info.mfn_list = xen_start_info->mfn_list; - start_info.mod_start = xen_start_info->mod_start; - start_info.mod_len = xen_start_info->mod_len; -} - -static void -init_boot_params(void) -{ - ia64BootParamG.command_line = ia64_boot_paramP->command_line; - ia64BootParamG.efi_systab = ia64_boot_paramP->efi_systab; - ia64BootParamG.efi_memmap = ia64_boot_paramP->efi_memmap; - ia64BootParamG.efi_memmap_size = ia64_boot_paramP->efi_memmap_size; - ia64BootParamG.efi_memdesc_size = ia64_boot_paramP->efi_memdesc_size; - ia64BootParamG.efi_memdesc_version = - ia64_boot_paramP->efi_memdesc_version; - ia64BootParamG.console_info.num_cols = - ia64_boot_paramP->console_info.num_cols; - ia64BootParamG.console_info.num_rows = - ia64_boot_paramP->console_info.num_rows; - ia64BootParamG.console_info.orig_x = - ia64_boot_paramP->console_info.orig_x; - ia64BootParamG.console_info.orig_y = - ia64_boot_paramP->console_info.orig_y; - ia64BootParamG.fpswa = ia64_boot_paramP->fpswa; - ia64BootParamG.initrd_start = ia64_boot_paramP->initrd_start; - ia64BootParamG.initrd_size = ia64_boot_paramP->initrd_size; - ia64BootParamG.domain_start = ia64_boot_paramP->domain_start; - ia64BootParamG.domain_size = ia64_boot_paramP->domain_size; - - /* - * Copy and parse the boot command line. - * Currently only a check of bootverbose is done. - */ - memset(boot_cmd_line, 0, sizeof(boot_cmd_line)); - strncpy(boot_cmd_line, - (char*)__va(ia64BootParamG.command_line), COMMAND_LINE_SIZE); - boot_cmd_line[COMMAND_LINE_SIZE - 1] = '\0'; - - /* Look for bootverbose. */ - if (strstr(boot_cmd_line, "bootverbose")) - bootverbose = 1; -} - -static void -set_opt_feature(void) -{ - struct xen_ia64_opt_feature optf; - - optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG7; - optf.on = XEN_IA64_OPTF_ON; - optf.pgprot = ((1 << PTE_OFF_P) | (1 << PTE_OFF_A) | (1 << PTE_OFF_D) | - (PTE_MA_WB << PTE_OFF_MA) | - (PTE_PL_KERN << PTE_OFF_PL) | - (PTE_AR_RW << PTE_OFF_AR)); - optf.key = IA64_KEY_REG7; - HYPERVISOR_opt_feature(&optf); -} - -void -arch_init(start_info_t *si) -{ - efi_time_t tm; - static int initialized; - - if (initialized) - return; - - init_start_info(si); - - init_boot_params(); - - init_efi(); - - map_pal_code(); - - ia64_sal_init(machineFwG.ia64_sal_tableP); - - if (efi_get_time(&tm)) { - printk("EFI-SystemTime: %d.%d.%d %d:%d:%d", - tm.Day, tm.Month, tm.Year, - tm.Hour, tm.Minute, tm.Second); - - if (tm.TimeZone == EFI_UNSPECIFIED_TIMEZONE) - printk(" Timezone not specified!\n"); - else - printk(" TimeZone: %d Daylight: 0x%x\n", - tm.TimeZone, tm.Daylight); - } else - printk("efi_get_time() failed\n"); - - registerCallback(); - - set_opt_feature(); - - initialized = 1; -} - -void -arch_fini(void) -{ - /* TODO */ -} - -void -arch_print_info(void) -{ - int major, minor; - - minor = HYPERVISOR_xen_version(XENVER_version, 0); - major = minor >> 16; - minor &= ~0xffffffff; - printk("Running on Xen version: %d.%d\n", major, minor); -#if 0 - printk("machine addr of shared_info_t : 0x%lx\n", - start_info.shared_info); - printk("machine page number of shared page: 0x%lx\n", - start_info.store_mfn); - printk("evtchn for store communication : %d\n", - start_info.store_evtchn); - printk("MACHINE address of console page: 0x%lx\n", - start_info.console.domU.mfn); - printk("evtchn for console messages : %d\n", - start_info.console.domU.evtchn); -#endif - if(strlen(boot_cmd_line) > 0) - printk("xen_guest_cmdline : %s\n", boot_cmd_line); -} - diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/debug.c xen-4.3.0/extras/mini-os/arch/ia64/debug.c --- xen-4.2.2/extras/mini-os/arch/ia64/debug.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/debug.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,168 +0,0 @@ -/* - **************************************************************************** - * Done by Dietmar Hahn - -static const char *ia64_vector_names[] = { - "VHPT Translation", /* 0 */ - "Instruction TLB", /* 1 */ - "Data TLB", /* 2 */ - "Alternate Instruction TLB", /* 3 */ - "Alternate Data TLB", /* 4 */ - "Data Nested TLB", /* 5 */ - "Instruction Key Miss", /* 6 */ - "Data Key Miss", /* 7 */ - "Dirty-Bit", /* 8 */ - "Instruction Access-Bit", /* 9 */ - "Data Access-Bit", /* 10 */ - "Break Instruction", /* 11 */ - "External Interrupt", /* 12 */ - "Reserved 13", /* 13 */ - "Reserved 14", /* 14 */ - "Reserved 15", /* 15 */ - "Reserved 16", /* 16 */ - "Reserved 17", /* 17 */ - "Reserved 18", /* 18 */ - "Reserved 19", /* 19 */ - "Page Not Present", /* 20 */ - "Key Permission", /* 21 */ - "Instruction Access Rights", /* 22 */ - "Data Access Rights", /* 23 */ - "General Exception", /* 24 */ - "Disabled FP-Register", /* 25 */ - "NaT Consumption", /* 26 */ - "Speculation", /* 27 */ - "Reserved 28", /* 28 */ - "Debug", /* 29 */ - "Unaligned Reference", /* 30 */ - "Unsupported Data Reference", /* 31 */ - "Floating-point Fault", /* 32 */ - "Floating-point Trap", /* 33 */ - "Lower-Privilege Transfer Trap", /* 34 */ - "Taken Branch Trap", /* 35 */ - "Single Step Trap", /* 36 */ - "Reserved 37", /* 37 */ - "Reserved 38", /* 38 */ - "Reserved 39", /* 39 */ - "Reserved 40", /* 40 */ - "Reserved 41", /* 41 */ - "Reserved 42", /* 42 */ - "Reserved 43", /* 43 */ - "Reserved 44", /* 44 */ - "IA-32 Exception", /* 45 */ - "IA-32 Intercept", /* 46 */ - "IA-32 Interrupt", /* 47 */ - "Reserved 48", /* 48 */ - "Reserved 49", /* 49 */ - "Reserved 50", /* 50 */ - "Reserved 51", /* 51 */ - "Reserved 52", /* 52 */ - "Reserved 53", /* 53 */ - "Reserved 54", /* 54 */ - "Reserved 55", /* 55 */ - "Reserved 56", /* 56 */ - "Reserved 57", /* 57 */ - "Reserved 58", /* 58 */ - "Reserved 59", /* 59 */ - "Reserved 60", /* 60 */ - "Reserved 61", /* 61 */ - "Reserved 62", /* 62 */ - "Reserved 63", /* 63 */ - "Reserved 64", /* 64 */ - "Reserved 65", /* 65 */ - "Reserved 66", /* 66 */ - "Reserved 67", /* 67 */ -}; - -typedef struct -{ - uint64_t sof :7; /* 0-6 size of frame */ - uint64_t sol :7; /* 7-13 size of locals (in + loc) */ - uint64_t sor :4; - uint64_t rrb_gr :7; - uint64_t rrb_fr :7; - uint64_t rrb_pr :6; - uint64_t res :25; /* reserved */ - uint64_t v :1; /* The v bit */ -} ifs_t; - -void -do_trap_error(trap_frame_t* tf) -{ - ifs_t curIfs; - - printk("TRAP in mini-os:\n"); - printk(" trap: %d (%s)\n", tf->trap_num, - ia64_vector_names[tf->trap_num]); - printk(" iip : 0x%.16lx ifa: 0x%.16lx\n", tf->iip, tf->ifa); - printk(" ipsr: 0x%.16lx ifs: 0x%.16lx\n", tf->ipsr, tf->ifs); - printk(" isr : 0x%.16lx\n", tf->isr); - printk(" gp : 0x%.16lx sp : 0x%.16lx\n", tf->gp, tf->sp); - printk(" rp : 0x%.16lx tp : 0x%.16lx\n", tf->b0, tf->tp); - printk(" b6 : 0x%.16lx b7 : 0x%.16lx\n", tf->b6, tf->b7); - printk(" r8 : 0x%.16lx\n", tf->r8); - printk(" bsp : 0x%.16lx rsc: 0x%.16lx\n", tf->bsp, tf->rsc); - printk(" r14 : 0x%.16lx r15: 0x%.16lx\n", tf->r14, tf->r15); - printk(" r16 : 0x%.16lx r17: 0x%.16lx\n", tf->r16, tf->r17); - printk(" r18 : 0x%.16lx r19: 0x%.16lx\n", tf->r18, tf->r19); - printk(" r20 : 0x%.16lx r21: 0x%.16lx\n", tf->r20, tf->r21); - printk(" r22 : 0x%.16lx r23: 0x%.16lx\n", tf->r22, tf->r23); - printk(" r24 : 0x%.16lx r25: 0x%.16lx\n", tf->r24, tf->r25); - printk(" r26 : 0x%.16lx r27: 0x%.16lx\n", tf->r26, tf->r27); - printk(" r28 : 0x%.16lx r29: 0x%.16lx\n", tf->r28, tf->r29); - printk(" r30 : 0x%.16lx r31: 0x%.16lx\n", tf->r30, tf->r31); - - __asm __volatile("flushrs;;"); - curIfs = *((ifs_t*)((void*)(&tf->ifs))); - if (!curIfs.v) - printk(" ifs.v = 0"); - else { - uint64_t* regP; - uint32_t i; - - printk(" cfm.sof: %d cfm.sol: %d\n", curIfs.sof, curIfs.sol); - regP = (uint64_t *)(tf->bsp + tf->ndirty); - for (i = curIfs.sof; i != 0; ) { - if (i <= (((uint64_t)regP & 0x000001f8) >> 3)) { - regP -= i; - i = 0; - break; - } - i -= ((uint64_t)regP & 0x000001f8) >> 3; - regP = (uint64_t *)((uint64_t)regP & ~0x000001ff) - 1; - } - for (i = 0; i < curIfs.sof; i++) { - if (((uint64_t)regP & 0x000001f8) == 0x000001f8) - regP++; - printk(" r%d: 0x%lx\n", i+32, *regP); - regP++; - } - } - HYPERVISOR_shutdown(SHUTDOWN_poweroff); -} diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/efi.c xen-4.3.0/extras/mini-os/arch/ia64/efi.c --- xen-4.2.2/extras/mini-os/arch/ia64/efi.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/efi.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,218 +0,0 @@ -/* - * Done by Dietmar Hahn - * The code is partly taken from FreeBSD. - * - *************************************************************************** - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - - -#include -#include -#include -#include -#include - - -/* The implementation is in fw.S. */ -extern uint64_t -ia64_call_efi_func(uint64_t funcP,uint64_t a,uint64_t b,uint64_t c,uint64_t d); - -int -efi_get_time(efi_time_t* tmP) -{ - memset(tmP, 0, sizeof(efi_time_t)); - if (ia64_call_efi_func((uint64_t)machineFwG.efi.getTimeF, - (uint64_t)tmP, - (uint64_t)NULL, 0, 0) != EFI_SUCCESS) { - printk("efi.getTime() failed\n"); - return 0; - } - return 1; -} - -/* - * The function compares two efi_guid_t and returns 0 on equality, otherwise 1. - */ -static int -efi_guid_cmp(efi_guid_t* a_le, efi_guid_t* b) -{ - return memcmp(a_le, b, sizeof(efi_guid_t)); -} - -void -init_efi(void) -{ - efi_system_table_t* efiSysTableP; - int mdcnt, i, numConvMem; - efi_memory_descriptor_t *memdP, *mdP; - efi_status_t status; - char fwVendor[100] = "unknown"; - efi_char16_t* fwP; - efi_runtime_services_t* rsP; - - efi_configuration_table_t* confP = (efi_configuration_table_t*)0; - efi_guid_t sal = SAL_SYSTEM_TABLE_GUID; - efi_guid_t acpi = ACPI_TABLE_GUID; - efi_guid_t acpi20 = ACPI_20_TABLE_GUID; - - memset(&machineFwG, 0, sizeof(machineFwG)); - /* Read the efi_system_table. */ - efiSysTableP = (efi_system_table_t*)__va(ia64BootParamG.efi_systab); - machineFwG.efi.efiSysTableP = efiSysTableP; - PRINT_BV("EfiSystemTable at: %p\n", efiSysTableP); - fwP = (uint16_t*) __va(efiSysTableP->FirmwareVendor); - if (fwP) { - for (i = 0; i < (int)sizeof(fwVendor) - 1 && *fwP; ++i) - fwVendor[i] = *fwP++; - fwVendor[i] = '\0'; - } - PRINT_BV(" EFI-FirmwareVendor : %s\n", fwVendor); - PRINT_BV(" EFI-FirmwareRevision : %d\n", - efiSysTableP->FirmwareRevision); - PRINT_BV(" EFI-SystemTable-Revision : %d.%d\n", - efiSysTableP->Hdr.Revision >> 16, - efiSysTableP->Hdr.Revision & 0xffff); - rsP = (efi_runtime_services_t*) - __va(efiSysTableP->RuntimeServices); - mdcnt = ia64BootParamG.efi_memmap_size / - ia64BootParamG.efi_memdesc_size; - memdP = (efi_memory_descriptor_t*) __va(ia64BootParamG.efi_memmap); - - PRINT_BV("EFI-Memorydescriptors: %d\n", mdcnt); - - for (i = numConvMem = 0, mdP = memdP; i < mdcnt; i++, - mdP = NextMemoryDescriptor(mdP, ia64BootParamG.efi_memdesc_size)) { - /* Relocate runtime memory segments for firmware. */ - PRINT_BV(" %d. Type: %x Attributes: 0x%lx\n", - i, mdP->Type, mdP->Attribute); - PRINT_BV(" PhysStart: 0x%lx NumPages: 0x%lx\n", - mdP->PhysicalStart, mdP->NumberOfPages); - switch (mdP->Type) { - case EfiRuntimeServicesData: - PRINT_BV(" -> EfiRuntimeServicesData\n"); - break; - case EfiACPIReclaimMemory: - PRINT_BV(" -> EfiACPIReclaimMemory\n"); - break; - case EfiACPIMemoryNVS: - PRINT_BV(" -> EfiACPIMemoryNVS\n"); - break; - case EfiConventionalMemory: - PRINT_BV(" -> EfiConventionalMemory\n"); - PRINT_BV(" start: 0x%lx end: 0x%lx\n", - mdP->PhysicalStart, - mdP->PhysicalStart + - mdP->NumberOfPages * EFI_PAGE_SIZE); - if (numConvMem) { - printk(" Currently only one efi " - "memory chunk supported !!!\n"); - break; - } - machineFwG.mach_mem_start = mdP->PhysicalStart; - machineFwG.mach_mem_size = - mdP->NumberOfPages * EFI_PAGE_SIZE; - numConvMem++; - break; - case EfiMemoryMappedIOPortSpace: - PRINT_BV(" -> EfiMemMappedIOPortSpace\n"); - break; - case EfiPalCode: - machineFwG.ia64_pal_base = - __va(mdP->PhysicalStart); - PRINT_BV(" -> EfiPalCode\n" - " start : %p\n", - machineFwG.ia64_pal_base); - break; - } - /* I have to setup the VirtualStart address of every - * RUNTIME-area in preparing the later call of - * SetVirtualAddressMap() therewidth the efi stuff uses - * virtual addressing and the efi runtime functions - * may be called directly. - */ - if (mdP->Attribute & EFI_MEMORY_RUNTIME) { - if (mdP->Attribute & EFI_MEMORY_WB) - mdP->VirtualStart = __va(mdP->PhysicalStart); - else { - if (mdP->Attribute & EFI_MEMORY_UC) - printk("efi_init: RuntimeMemory with " - "UC attribute !!!!!!\n"); - /* - mdP->VirtualStart = - IA64_PHYS_TO_RR6(mdP->PhysicalStart); - */ - } - } - } - /* Now switch efi runtime stuff to virtual addressing. */ - status = ia64_call_efi_physical( - (void*)__va((uint64_t)rsP->SetVirtualAddressMap), - ia64BootParamG.efi_memmap_size, - ia64BootParamG.efi_memdesc_size, - ia64BootParamG.efi_memdesc_version, - ia64BootParamG.efi_memmap); - status = EFI_SUCCESS; - if (status != EFI_SUCCESS) { - printk("warning: unable to switch EFI into virtual " - "(status=%lu)\n", status); - return; - } - /* Getting efi function pointer for getEfiTime. */ - machineFwG.efi.getTimeF = - (efi_get_time_t)__va((uint64_t)rsP->GetTime); - /* Getting efi function pointer for resetSystem. */ - machineFwG.efi.resetSystemF = - (efi_reset_system_t)__va((uint64_t)rsP->ResetSystem); - - /* Scanning the Configuration table of the EfiSystemTable. */ - PRINT_BV("NumberOfConfigTableEntries: %ld\n", - efiSysTableP->NumberOfTableEntries); - - confP = (efi_configuration_table_t*) - __va(efiSysTableP->ConfigurationTable); - for (i = 0; i < efiSysTableP->NumberOfTableEntries; i++) { - if (!efi_guid_cmp(&confP[i].VendorGuid, &sal)) { - machineFwG.ia64_sal_tableP = (sal_system_table_t*) - __va((uint64_t) confP[i].VendorTable); - PRINT_BV(" Found SalSystemTable at: 0x%lx\n", - (uint64_t) machineFwG.ia64_sal_tableP); - continue; - } - if (!efi_guid_cmp(&confP[i].VendorGuid, &acpi)) { - machineFwG.ia64_efi_acpi_table = - __va((uint64_t) confP[i].VendorTable); - PRINT_BV(" Found AcpiTable at: 0x%lx\n", - (uint64_t) machineFwG.ia64_efi_acpi_table); - continue; - } - if (!efi_guid_cmp(&confP[i].VendorGuid, &acpi20)) { - machineFwG.ia64_efi_acpi20_table = - __va((uint64_t) confP[i].VendorTable); - PRINT_BV(" Found Acpi20Table at: 0x%lx\n", - (uint64_t) machineFwG.ia64_efi_acpi20_table); - continue; - } - } -} diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/fw.S xen-4.3.0/extras/mini-os/arch/ia64/fw.S --- xen-4.2.2/extras/mini-os/arch/ia64/fw.S 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/fw.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,499 +0,0 @@ -/* - * Done by Dietmar Hahn - * Parts taken from FreeBSD. - * - *************************************************************************** - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - - -#include -#include -#include -#include -#include -#include - - -/* - * ia64_change_mode: change mode to/from physical mode - * - * Arguments: - * r14 psr for desired mode - * - * Modifies: - * r15-r20 scratch - * ar.bsp translated to new mode - * sp translated to new mode - * iip translated to new mode - */ -ENTRY(ia64_change_mode) - rsm psr.i | psr.ic - mov r19=ar.rsc // save rsc while we change mode - tbit.nz p8,p9=r14,17 // Uses psr.dt-physical or virtual ? - // p8 == true: switch to virtual - // p9 == true: switch to physical - ;; - mov ar.rsc=IA64_RSE_LAZY // turn off RSE - mov r16=rp - ;; - flushrs // clean the rse - srlz.i - ;; -1: mov r15=ip - mov r17=ar.bsp - mov r18=ar.rnat - ;; - add r15=2f-1b,r15 // address to rfi to - /* !!! must be the same like in minios-ia64.lds */ -(p8) movl r20=(KERNEL_START - (1< - * - ****************************************************************************** - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ -#include -#include -#include -#include - -#define DEFINE(sym, val) \ - asm volatile("\n->" sym " %0 /* " #val " */": : "i" (val)) -#define DEFINE_STR2(sym, pfx, val) \ - asm volatile("\n->" sym " " pfx "%0" : : "i"(val)); - -#define SZ(st,e) sizeof(((st *)0)->e) -#define OFF(st,e,d,o) \ - DEFINE(#d, offsetof(st, e) + o); \ - DEFINE(#d "_sz", SZ(st,e )); \ - DEFINE_STR2(#d "_ld", "ld", SZ(st, e)); \ - DEFINE_STR2(#d "_st", "st", SZ(st, e)); - -#define TFOFF(e,d) OFF(trap_frame_t, e, d, 0) -#define SIZE(st,d) DEFINE(#d, sizeof(st)) - -#define SWOFF(e,d) OFF(struct thread, e, d, 0) - -/* shared_info_t from xen/xen.h */ -#define SI_OFF(e, d) OFF(shared_info_t, e, d,0) -/* mapped_regs_t from xen/arch-ia64.h */ -#define MR_OFF(e, d) OFF(mapped_regs_t, e, d, XMAPPEDREGS_OFS) - -int -main(int argc, char ** argv) -{ - TFOFF(cfm, TF_CFM); - TFOFF(pfs, TF_PFS); - TFOFF(bsp, TF_BSP); - TFOFF(rnat, TF_RNAT); - TFOFF(csd, TF_CSD); - TFOFF(ccv, TF_CCV); - TFOFF(unat, TF_UNAT); - TFOFF(fpsr, TF_FPSR); - TFOFF(pr, TF_PR); - - TFOFF(sp, TF_SP); - TFOFF(gp, TF_GP); - TFOFF(tp, TF_TP); - - TFOFF(r2, TF_GREG2); - TFOFF(r3, TF_GREG3); - TFOFF(r16, TF_GREG16); - TFOFF(r17, TF_GREG17); - - TFOFF(b0, TF_BREG0); - TFOFF(b6, TF_BREG6); - TFOFF(b7, TF_BREG7); - - TFOFF(f6, TF_FREG6); - TFOFF(f7, TF_FREG7); - - TFOFF(rsc, TF_RSC); - TFOFF(ndirty, TF_NDIRTY); - TFOFF(ssd, TF_SSD); - TFOFF(iip, TF_IIP); - TFOFF(ipsr, TF_IPSR); - TFOFF(ifs, TF_IFS); - TFOFF(trap_num, TF_TRAP_NUM); - - TFOFF(ifa, TF_IFA); - TFOFF(isr, TF_ISR); - TFOFF(iim, TF_IIM); - - SIZE(trap_frame_t, TF_SIZE); - - SIZE(struct thread, SW_SIZE); - SWOFF(regs.unat_b, SW_UNATB); - SWOFF(regs.sp, SW_SP); - SWOFF(regs.rp, SW_RP); - SWOFF(regs.pr, SW_PR); - SWOFF(regs.pfs, SW_PFS); - SWOFF(regs.bsp, SW_BSP); - SWOFF(regs.rnat, SW_RNAT); - SWOFF(regs.lc, SW_LC); - //SWOFF(regs.fpsr, SW_FPSR); - //SWOFF(regs.psr, SW_PSR); - //SWOFF(regs.gp, SW_GP); - SWOFF(regs.unat_a, SW_UNATA); - SWOFF(regs.r4, SW_R4); - SWOFF(regs.r5, SW_R5); - SWOFF(regs.r6, SW_R6); - SWOFF(regs.r7, SW_R7); - SWOFF(regs.b1, SW_B1); - SWOFF(regs.b2, SW_B2); - SWOFF(regs.b3, SW_B3); - SWOFF(regs.b4, SW_B4); - SWOFF(regs.b5, SW_B5); - SWOFF(regs.f2, SW_F2); - SWOFF(regs.f3, SW_F3); - SWOFF(regs.f4, SW_F4); - SWOFF(regs.f5, SW_F5); - - SI_OFF(arch.start_info_pfn, START_INFO_PFN); - MR_OFF(interrupt_mask_addr, XSI_PSR_I_ADDR_OFS); - MR_OFF(interrupt_collection_enabled, XSI_PSR_IC_OFS); - MR_OFF(ipsr, XSI_IPSR_OFS); - MR_OFF(iip, XSI_IIP_OFS); - MR_OFF(ifs, XSI_IFS_OFS); - MR_OFF(ifa, XSI_IFA_OFS); - MR_OFF(iim, XSI_IIM_OFS); - MR_OFF(iim, XSI_IIM_OFS); - MR_OFF(iipa, XSI_IIPA_OFS); - MR_OFF(isr, XSI_ISR_OFS); - MR_OFF(banknum, XSI_BANKNUM_OFS); - MR_OFF(bank1_regs[0], XSI_BANK1_R16_OFS); - MR_OFF(precover_ifs, XSI_PRECOVER_IFS_OFS); - - return 0; -} diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/ia64.S xen-4.3.0/extras/mini-os/arch/ia64/ia64.S --- xen-4.2.2/extras/mini-os/arch/ia64/ia64.S 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/ia64.S 1970-01-01 00:00:00.000000000 +0000 @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2007 Dietmar Hahn - * - ***************************************************************************** - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - - - -#include -#include -#include -#include -#include -#include - - - - /* - * Allocate kernel stack area. - * This is used for stack pointer (goes down from kstack+PAGE_SIZE) and - * RSE (goes up from kstack). - */ - .section .data.start,"aw" - .global kstack - .align PAGE_SIZE -kstack: .space KSTACK_PAGES * PAGE_SIZE - - .text - - /* - * Start the kernel. - * r28 points to the address of the boot parameter area, given - * from the bootloader. - * Execution reaches here in physical mode. - */ -ENTRY(_start) - .prologue - .save rp, r0 // terminate unwind chain with a NULL rp - .body - - alloc loc0=ar.pfs,0,1,1,0 - - rsm psr.i | psr.ic - ;; - srlz.i - ;; - - /* - * Initialize mini-os region registers: - * Currently only region registers 5 and 7 are used for addressing. - * rr[5] : virtual kernel address space - * rr[7] : directly mapped physically addresses. - */ - movl r2=0< - * Description: ia64 specific trap handling. - * - **************************************************************************** - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - */ - - -#include -#include -#include -#include -#include - - -/* General register usage in interrupt handling: - * r16, r17, ... are used for input parameters of sub-routines - * r29: used to access memory which may raise nested TLB fault - * r30: b0 save register - * r31: predicates save register - * p30,p31: used for TLB stuff: (0,1)=data, (1,0)=instruction - */ - - -#define FILL_FP_PAIR(f1, f2, b1, b2) \ - ldf.fill f1=[b1],32 ;\ - ldf.fill f2=[b2],32 ;\ - ;; - -#define SPILL_FP_PAIR(f1, f2, b1, b2) \ - stf.spill [b1]=f1,32 ;\ - stf.spill [b2]=f2,32 ;\ - ;; - -#define FILL_REG_PAIR(r1, r2, b1, b2) \ - ld8.fill r1=[b1],16 ;\ - ld8.fill r2=[b2],16 ;\ - ;; - -#define SPILL_REG_PAIR(r1, r2, b1, b2) \ - .mem.offset 0,0 ;\ - st8.spill [b1]=r1,16 ;\ - .mem.offset 8,0 ;\ - st8.spill [b2]=r2,16 ;\ - ;; - - -/** - * The function does a store of the current processor context - * to the given exception frame address. - * These are some special and the scratch registers for calling - * C-functions later. - * The bspstore will be the same. A clean RSE is made with the - * cover instruction. - * - * The return is done through a jump to the next bundle after ip (r16). - * - * Used register: r16, r18, r19, r20, r21, r22 of bank 0 - * - * @param: r16 ip of the bundle with the jump. - * @param: r18 pointer to the trap frame. - * @param: r23 trap number/err val - * - */ - -ENTRY(save_tf_rse_switch) - movl r21=XSI_IPSR // XEN !! - movl r22=XSI_IIP // XEN !! - ;; - ld8 r21=[r21] // XEN.ipsr - ld8 r22=[r22];; // XEN.iip - add r19=TF_IPSR,r18 - add r20=TF_IIP,r18 - ;; - st8 [r19]=r21 // store cr.ipsr - st8 [r20]=r22 // store cr.iip - ;; - //// r16 return jump pointer, r18 - trap frame base, - add r19=TF_UNAT,r18 - mov r20=ar.unat - ;; - st8 [r19]=r20 // store scratch unat - ;; - - add r19=TF_GP,r18 - add r20=TF_SP,r18 - ;; - st8 [r19]=gp,TF_TP-TF_GP // store gp - st8 [r20]=sp,TF_PR-TF_SP // store sp - mov r21=pr - ;; - st8 [r19]=r13 // store tp - st8 [r20]=r21 // store pr - ;; - add r19=TF_GREG2,r18 // Now first general regs. - add r20=TF_GREG3,r18 - ;; - SPILL_REG_PAIR( r2, r3,r19,r20) - SPILL_REG_PAIR( r8, r9,r19,r20) - SPILL_REG_PAIR(r10,r11,r19,r20) - SPILL_REG_PAIR(r14,r15,r19,r20) - ;; - mov r14=r18 // move trap frame base for bsw - mov r15=r16 // save return address - ;; - //bsw.1 // switch to bank 1 for saving these registers. - movl r30=XSI_BANKNUM // Switch to bank 1. - mov r31=1;; - st4 [r30]=r31 - ;; - /* - * On XEN the hypervisor has stored the bank 1 registers - * r16-r31. I must reload these registers here to get - * access. - */ - movl r30=XSI_BANK1_R16; - movl r31=XSI_BANK1_R16+8;; - ld8 r16=[r30],16; ld8 r17=[r31],16;; - ld8 r18=[r30],16; ld8 r19=[r31],16;; - ld8 r20=[r30],16; ld8 r21=[r31],16;; - ld8 r22=[r30],16; ld8 r23=[r31],16;; - ld8 r24=[r30],16; ld8 r25=[r31],16;; - ld8 r26=[r30],16; ld8 r27=[r31],16;; - ld8 r28=[r30],16; ld8 r29=[r31],16;; - ld8 r30=[r30]; ld8 r31=[r31];; - add r2=TF_GREG16,r14 - add r3=TF_GREG17,r14 - ;; - SPILL_REG_PAIR(r16,r17,r2,r3) - SPILL_REG_PAIR(r18,r19,r2,r3) - SPILL_REG_PAIR(r20,r21,r2,r3) - SPILL_REG_PAIR(r22,r23,r2,r3) - SPILL_REG_PAIR(r24,r25,r2,r3) - SPILL_REG_PAIR(r26,r27,r2,r3) - SPILL_REG_PAIR(r28,r29,r2,r3) - SPILL_REG_PAIR(r30,r31,r2,r3) - ;; - //bsw.0 // back to interrupt bank 0 - movl r2=XSI_BANKNUM;; - st4 [r2]=r0 - ;; - mov r18=r14 // restore context pointer - mov r16=r15 // restore return address - ;; - //// r16 return jump pointer, r18 - trap frame base, - add r19=TF_CCV,r18 - add r20=TF_CSD,r18 - mov r21=ar.ccv - mov r22=ar.csd - ;; - st8 [r19]=r21 // ar.ccv - st8 [r20]=r22 // ar.csd - ;; - add r19=TF_SSD,r18 - mov r21=ar.ssd - ;; - st8 [r19]=r21 // ar.ssd - ;; - add r19=TF_FREG6,r18 - add r20=TF_FREG7,r18 - ;; - SPILL_FP_PAIR(f6, f7, r19, r20) - SPILL_FP_PAIR(f8, f9, r19, r20) - SPILL_FP_PAIR(f10, f11, r19, r20) - - add r19=TF_BREG0,r18 // b0, b6, b7 - add r20=TF_BREG6,r18 - mov r21=b0 - mov r22=b6 - ;; - st8 [r19]=r21,TF_BREG7-TF_BREG0 // store b0 - st8 [r20]=r22,16 // store b6 - ;; - mov r21=b7 - ;; - st8 [r19]=r21 // store b7 - - //// r16 return jump pointer, r18 - trap frame base, - - // Read and save RSC, PFS - add r19=TF_PFS,r18 - add r20=TF_RSC,r18 - mov r21=ar.pfs - mov r22=ar.rsc - ;; -{ .mmb - st8 [r19]=r21 // store ar.pfs - st8 [r20]=r22 // store ar.rsc - // Issue cover instruction - cover // must be the last instruction in bundle - //XEN_HYPER_COVER - ;; -} - // Read and save IFS - add r19=TF_IFS,r18 - add r20=TF_CFM,r18 - /* xen special handling for possibly lazy cover */ - movl r8=XSI_PRECOVER_IFS; - ;; - ld8 r21=[r8] - ;; - st8 [r19]=r21 // store cr.ifs - dep.z r22=r21,0,38 // copy ifm part from ifs.ifm - ;; - st8 [r20]=r22 // store cfm - // RSE in enforced lazy mode - mov ar.rsc=IA64_RSE_LAZY - ;; - // Read and save BSPSTORE and RNAT - add r19=TF_BSP,r18 - add r20=TF_RNAT,r18 - mov r21=ar.bspstore - mov r22=ar.rnat - ;; - st8 [r19]=r21 // store ar.bspstore - st8 [r20]=r22 // store ar.rnat - ;; - // Write new BSPSTORE - //mov r21=ar.bsp - //;; - mov r22=r21 // new bspstore equal to old - ;; - mov ar.bspstore=r22 // the new bspstore - ;; - // Read and save the new BSP for calculating number of dirty regs. - mov r21=ar.bsp - ;; - sub r21=r21,r22 // r21 -> ndirty - add r19=TF_NDIRTY-TF_BSP,r19 // TF_NDIRTY pos in r19 - ;; - st8 [r19]=r21 // store ndirty - ;; - mov ar.rsc=IA64_RSE_EAGER // RSE on again - ;; - add r19=TF_FPSR,r18 - ;; - mov r21=ar.fpsr - ;; - st8 [r19]=r21 // ar.fpsr - ;; - //// r16 return jump pointer, r18 - trap frame base, - // Load the gp with our module __gp - movl gp=__gp - ;; - add r16=16,r16 // for jump to next bundle - ;; - mov b7=r16 - ;; - -{ .mfb - srlz.d - nop 0 - br.sptk b7 - ;; -} - -END(save_tf_rse_switch) - - -/** - * The function reloads the processor context stored in - * save_tf_rse_switch(). - * - * On calling the function the bank 0 must be activ. - * The return is done through a rfi. - * Used register: b7, r16, r18, r19, r20, r21, r22 of bank 0 - * - * @param: r18 pointer to the exception frame - * - */ -ENTRY(restore_tf_rse_switch) - add r19=TF_IPSR,r18 - add r20=TF_IIP,r18 - ;; - ld8 r21=[r19] // load cr.ipsr - ld8 r22=[r20] // load cr.iip - movl r16=XSI_IPSR // XEN !! - ;; - st8 [r16]=r21,XSI_IIP_OFS-XSI_IPSR_OFS // XEN.ipsr - mov r2=r21 // save for fp stuff below - ;; - st8 [r16]=r22 // XEN.iip - ;; - //// r18 - trap frame base - // Allocate a zero sized frame - alloc r30=ar.pfs,0,0,0,0 // discard current frame - ;; - // calc number of dirty regs and put this into rsc.loardrs - add r19=TF_NDIRTY,r18 - ;; - ld8 r22=[r19] // ndirty - ;; - shl r21=r22,16 // value for ar.rsc - ;; - mov ar.rsc=r21 // setup for loadrs - ;; - // Issue a loadrs instruction -{ .mmi - loadrs // must be the first instruction - ;; - nop 0x0 - nop 0x0 -} - // Restore BSPSTORE from interrupted context - add r19=TF_BSP,r18 - add r20=TF_RNAT,r18 - ;; - ld8 r21=[r19] // load ar.bspstore - ld8 r22=[r20] // load ar.rnat - ;; - mov ar.bspstore=r21 // set ar.bspstore - ;; - // Restore RNAT - mov ar.rnat=r22 // set ar.rnat - ;; - // Restore PFS and IFS - add r19=TF_PFS,r18 - add r20=TF_IFS,r18 - movl r16=XSI_IFS // XEN !! - ;; - ld8 r21=[r19] // load ar.pfs - ld8 r22=[r20] // load cr.ifs - ;; - add r19=TF_RSC,r18 - mov ar.pfs=r21 - st8 [r16]=r22 // XEN.ifs - ;; - // Restore RSC - ld8 r21=[r19] // load ar.rsc - ;; - mov ar.rsc=r21 // set ar.rsc - //// r18 - trap frame base - add r19=TF_GP,r18 - add r20=TF_SP,r18 - ;; - ld8 gp=[r19],TF_TP-TF_GP // load gp - ld8 sp=[r20],TF_PR-TF_SP // load sp - ;; - ld8 r13=[r19] // load tp - ld8 r21=[r20] // load pr - ;; - mov pr=r21,-1 // set pr - ;; - add r19=TF_BREG0,r18 - add r20=TF_BREG6,r18 - ;; - ld8 r21=[r19],TF_BREG7-TF_BREG0 // load b0 - ld8 r22=[r20],16 // load b6 - ;; - mov b0=r21 - mov b6=r22 - ;; - ld8 r21=[r19] // load b7 - ld8 r22=[r20],16 // load b3 - ;; - mov b7=r21 - //// r18 - trap frame base - mov r14=r18 // Save the context pointer - ;; - // bsw.1 - movl r30=XSI_BANKNUM // Switch to bank 1. - mov r31=1;; - st4 [r30]=r31 - ;; - add r2=TF_GREG16,r14 - add r3=TF_GREG17,r14 - ;; - FILL_REG_PAIR(r16,r17,r2,r3) - FILL_REG_PAIR(r18,r19,r2,r3) - FILL_REG_PAIR(r20,r21,r2,r3) - FILL_REG_PAIR(r22,r23,r2,r3) - FILL_REG_PAIR(r24,r25,r2,r3) - FILL_REG_PAIR(r26,r27,r2,r3) - FILL_REG_PAIR(r28,r29,r2,r3) - FILL_REG_PAIR(r30,r31,r2,r3) - - /* - * On XEN I have to store the bank 1 register into the - * global XSI_... area. - */ - // r16-r31 all now hold bank1 values - movl r2=XSI_BANK1_R16 - movl r3=XSI_BANK1_R16+8 - ;; - .mem.offset 0,0; st8.spill [r2]=r16,16 - .mem.offset 8,0; st8.spill [r3]=r17,16 - ;; - .mem.offset 0,0; st8.spill [r2]=r18,16 - .mem.offset 8,0; st8.spill [r3]=r19,16 - ;; - .mem.offset 0,0; st8.spill [r2]=r20,16 - .mem.offset 8,0; st8.spill [r3]=r21,16 - ;; - .mem.offset 0,0; st8.spill [r2]=r22,16 - .mem.offset 8,0; st8.spill [r3]=r23,16 - ;; - .mem.offset 0,0; st8.spill [r2]=r24,16 - .mem.offset 8,0; st8.spill [r3]=r25,16 - ;; - .mem.offset 0,0; st8.spill [r2]=r26,16 - .mem.offset 8,0; st8.spill [r3]=r27,16 - ;; - .mem.offset 0,0; st8.spill [r2]=r28,16 - .mem.offset 8,0; st8.spill [r3]=r29,16 - ;; - .mem.offset 0,0; st8.spill [r2]=r30,16 - .mem.offset 8,0; st8.spill [r3]=r31,16 - ;; - // bsw.0 - movl r2=XSI_BANKNUM;; - st4 [r2]=r0; - - mov r18=r14 // Move back the context pointer - ;; - add r19=TF_GREG2,r18 - add r20=TF_GREG3,r18 - ;; - FILL_REG_PAIR( r2, r3,r19,r20) - FILL_REG_PAIR( r8, r9,r19,r20) - FILL_REG_PAIR(r10,r11,r19,r20) - FILL_REG_PAIR(r14,r15,r19,r20) - - //// r18 - trap frame base, - - add r19=TF_CCV,r18 - add r20=TF_CSD,r18 - ;; - ld8 r21=[r19] // ar.ccv - ld8 r22=[r20] // ar.csd - ;; - mov ar.ccv=r21 - mov ar.csd=r22 - add r19=TF_SSD,r18 - ;; - ld8 r21=[r19] // ar.ssd - ;; - mov ar.ssd=r21 - add r19=TF_FREG6,r18 - add r20=TF_FREG7,r18 - ;; - FILL_FP_PAIR(f6, f7, r19, r20) - FILL_FP_PAIR(f8, f9, r19, r20) - FILL_FP_PAIR(f10, f11, r19, r20) - add r19=TF_FPSR,r18 - ;; - ld8 r21=[r19] // ar.fpsr - ;; - mov ar.fpsr=r21 - add r19=TF_UNAT,r18 - ;; - ld8 r21=[r19] - ;; - mov ar.unat=r21 - ;; - srlz.i - ;; - //rfi - XEN_HYPER_RFI; - ;; -END(restore_tf_rse_switch) - - -ENTRY(save_special_regs) - alloc loc0=ar.pfs,1,7,0,0 - movl loc1=XSI_IFA // XEN !! - movl loc2=XSI_ISR // XEN !! - ;; - ld8 loc3=[loc1],XSI_IIM_OFS-XSI_IFA_OFS // load XEN.ifa - ld8 loc4=[loc2],XSI_IIPA_OFS-XSI_ISR_OFS // load XEN.isr - add loc5=TF_IFA,in0 - add loc6=TF_ISR,in0 - ;; - st8 [loc5]=loc3,TF_IIM-TF_IFA // store cr.ifa - st8 [loc6]=loc4 // store cr.isr - ;; - ld8 loc3=[loc1] // load XEN.iim - ;; - st8 [loc5]=loc3 // store cr.iim - ;; - mov ar.pfs=loc0 - ;; - br.ret.sptk.few rp -END(save_special_regs) - - -ENTRY(hypervisor_callback) - /* - * Use the thread stack here for storing the trap frame. - * It's not wired mapped, so nested data tlb faults may occur! - */ - add r18=-TF_SIZE,sp - ;; -{ .mib - nop 0x02 - mov r16=ip // for jump back from save_tf_rse_switch - br.sptk save_tf_rse_switch - ;; -} - add sp=-16,r18 // the new stack - alloc r15=ar.pfs,0,0,1,0 // 1 out for do_hypervisor_callback - ;; - mov out0=r18 // the trap frame - movl r22=XSI_PSR_IC - mov r23=1;; - st8 [r22]=r23 // ssm psr.ic - ;; - br.call.sptk.few rp = do_hypervisor_callback - - movl r22=XSI_PSR_IC - ;; - st4 [r22]=r0 // rsm psr.ic - add r18=16,sp // load EF-pointer again - ;; - // must have r18-efp, calls rfi at the end. - br.sptk restore_tf_rse_switch - ;; -END(hypervisor_callback) - - /* - * In: r30 - trap number - */ -ENTRY(trap_error) - // Calculate the stack address for storing. - add r18=-TF_SIZE,sp - ;; - add r20=TF_TRAP_NUM,r18 - ;; - st2 [r20]=r30 // save trap number - ;; - -{ .mib - nop 0x02 - mov r16=ip // for jumping back from save_tf_rse_switch - // Used register: r16, r18, r19, r20, r21, r22 of bank 0 - br.sptk save_tf_rse_switch - ;; -} - - alloc r15=ar.pfs,0,0,1,0 // 1 out for do_trap_error - ;; - mov out0=r18 // the trap frame - add sp=-16,r18 // C-call abi - ;; - movl r30=XSI_BANKNUM // bsw.1 - mov r31=1;; - st4 [r30]=r31;; - - /* Save extra interrupt registers to the trap frame. */ - br.call.sptk.few rp = save_special_regs - ;; - - movl r22=XSI_PSR_IC - movl r23=XSI_PSR_I_ADDR - ;; - ld8 r23=[r23] - mov r25=1 - ;; - st4 [r22]=r25 // ssm psr.ic - st1 [r23]=r0 // ssm psr.i - ;; - - br.call.sptk.few rp = do_trap_error - ;; - // --> currently not reached!!! - movl r23=XSI_PSR_I_ADDR - movl r22=XSI_PSR_IC - ;; - ld8 r23=[r23] - mov r25=1 - ;; - st1 [r23]=r25 - st4 [r22]=r0 // note: clears both vpsr.i and vpsr.ic! - ;; - bsw.0 - ;; - add r18=16,sp // load EF-pointer again - ;; - mov sp=r18 - // must have r18-efp, calls rfi at the end. - br.sptk restore_tf_rse_switch - ;; -END(trap_error) - - -/* - * The trap handler stuff. - */ - -#define TRAP_ERR(num) \ - mov r30 = num; \ - ;; ; \ - br.sptk trap_error \ - ;; - -#define IVT_ENTRY(name, offset) \ - .org ia64_trap_table + offset; \ - .global hivt_##name; \ - .proc hivt_##name; \ - .prologue; \ - .body; \ -hivt_##name: - -#define IVT_END(name) \ - .endp hivt_##name; \ - .align 0x100 - -#define IVT_ERR(name, num, offset) \ - IVT_ENTRY(name, offset); \ - TRAP_ERR(num); \ - IVT_END(name) -/* - * The IA64 Interrupt Vector Table (IVT) contains 20 slots with 64 - * bundles per vector and 48 slots with 16 bundles per vector. - */ - - .section .text.hivt,"ax" - .align 32768 - .global ia64_trap_table - .size ia64_trap_table, 32768 -ia64_trap_table: - -IVT_ERR(VHPT_Translation, 0, 0x0) -IVT_ERR(Instruction_TLB, 1, 0x0400) -IVT_ERR(Data_TLB, 2, 0x0800) -IVT_ERR(Alternate_Instruction_TLB, 3, 0x0c00) - - -IVT_ENTRY(Alternate_Data_TLB, 0x1000) - mov r30=4 // trap number -adt_common: - mov r16=cr.ifa // where did it happen - mov r31=pr // save predicates - ;; - extr.u r17=r16,IA64_RR_IDX_POS,3 // get region number - ;; - cmp.eq p14,p15=7,r17 - ;; -//(p14) br.sptk adt_regf_addr // Check for region 7 - phys addresses -// ;; -// br.sptk trap_error -// // No return -// -//adt_regf_addr: -// extr.u r17=r16,60,4 // get region number -// ;; -// cmp.eq p14,p15=0xf,r17 -// ;; -(p14) br.sptk adt_reg7_addr // Check for region 7 - phys addresses - ;; - br.sptk trap_error - -adt_reg7_addr: - /* - * region 7 addresses are only directly mapped physically - * addresses. Currently I don't do a check. - */ - movl r20=~((7 << IA64_RR_IDX_POS) | 0xfff) - movl r18=((PTE_PS_16K< - * - * Description: Special ia64 memory management. - * Parts are taken from FreeBSD. - * - **************************************************************************** - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - - -#include -#include - - -#define MAX_MEM_AREA 5 -paddr_t phys_avail[MAX_MEM_AREA * 2]; -int phys_avail_cnt; -uint64_t physmem; - -/* - * These variables are defined in the linker script minios_ia64.lds - * to get the size of the kernel. - */ -extern uint64_t _text[], _etext[], _end[], kstack[], phys_start[]; - -uint64_t kernstart, kernend, kernsize, kernpstart, kernpend; - -#ifdef HAVE_LIBC -uint8_t _heap[512 * 1024]; -unsigned long heap = (unsigned long)_heap, - brk = (unsigned long)_heap, - heap_mapped = (unsigned long)_heap + sizeof(_heap), - heap_end = (unsigned long)_heap + sizeof(_heap); -#endif - -/* Print the available memory chunks. */ -static void -print_phys_avail(void) -{ - int i; - - printk("Physical memory chunk(s):\n"); - for (i = 0; phys_avail[i + 1] != 0; i += 2) { - int size = phys_avail[i + 1] - phys_avail[i]; - printk("0x%08lx - 0x%08lx, %d bytes (%d pages)\n", - phys_avail[i], phys_avail[i + 1] - 1, - size, size / PAGE_SIZE); - } -} - -void -arch_init_mm(unsigned long* start_pfn_p, unsigned long* max_pfn_p) -{ - uint64_t ms, me; - int i, j; - uint64_t m, n; - - kernstart = trunc_page(_text); - kernend = roundup_page(_end); - - kernpstart = trunc_page(ia64_tpa(kernstart)); - kernpend = roundup_page(kernpstart + (kernend - kernstart)); - kernsize = kernpend - kernpstart; - - ms = roundup_page(machineFwG.mach_mem_start); - me = trunc_page(machineFwG.mach_mem_start+machineFwG.mach_mem_size); - memset((void*)phys_avail, 0, sizeof(phys_avail)); - /* 1. Check where the kernel lies in physical memory. */ - physmem = me - ms; - if ((ms <= kernpend) && (kernpstart <= me)) { - if (ms < kernpstart) { /* There is a part before the kernel. */ - PRINT_BV(" Found chunk before kernel: 0x%lx - 0x%lx\n", - ms, kernpstart); - phys_avail[phys_avail_cnt] = ms; - phys_avail[phys_avail_cnt+1] = kernpstart; - phys_avail_cnt += 2; - } - if (kernpend < me) { /* There is a part behind the kernel. */ - PRINT_BV(" Found chunk behind kernel: 0x%lx - 0x%lx\n", - kernpend, me); - phys_avail[phys_avail_cnt] = kernpend; - phys_avail[phys_avail_cnt+1] = me; - phys_avail_cnt += 2; - } - } else { /* One big chunk */ - PRINT_BV(" Found big chunk: 0x%lx - 0x%lx\n", ms, me); - phys_avail[phys_avail_cnt] = ms; - phys_avail[phys_avail_cnt + 1] = me; - phys_avail_cnt += 2; - } - phys_avail[phys_avail_cnt] = 0; - - print_phys_avail(); - /* - * In this first version I only look for the biggest mem area. - */ - for (i = j = m = n = 0; i < phys_avail_cnt; i += 2) { - n = page_to_pfn(phys_avail[i + 1]) - page_to_pfn(phys_avail[i]); - if (n > m) { - m = n; - j = i; - } - } - *start_pfn_p = page_to_pfn(phys_avail[j]); - *max_pfn_p = page_to_pfn(phys_avail[j +1 ]); -} - -/* Currently only a dummy function. */ -void -arch_init_demand_mapping_area(unsigned long max_pfn) -{ - max_pfn = max_pfn; -} - -unsigned long allocate_ondemand(unsigned long n, unsigned long alignment) -{ - return 0; -} - -/* Helper function used in gnttab.c. */ -void do_map_frames(unsigned long addr, - const unsigned long *f, unsigned long n, unsigned long stride, - unsigned long increment, domid_t id, int *err, unsigned long prot) -{ - /* TODO */ - ASSERT(0); -} - -void* -map_frames_ex(const unsigned long* frames, unsigned long n, unsigned long stride, - unsigned long increment, unsigned long alignment, domid_t id, - int *err, unsigned long prot) -{ - /* TODO: incomplete! */ - ASSERT(n == 1 || (stride == 0 && increment == 1)); - ASSERT(id == DOMID_SELF); - ASSERT(prot == 0); - return (void*) __va(frames[0] << PAGE_SHIFT); -} - -int unmap_frames(unsigned long virt_addr, unsigned long num_frames) -{ - /* TODO */ - ASSERT(0); -} - -unsigned long alloc_contig_pages(int order, unsigned int addr_bits) -{ - /* TODO */ - ASSERT(0); -} - -void arch_init_p2m(unsigned long max_pfn) -{ - printk("Warn: p2m map not implemented.\n"); -} diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/sal.c xen-4.3.0/extras/mini-os/arch/ia64/sal.c --- xen-4.2.2/extras/mini-os/arch/ia64/sal.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/sal.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,103 +0,0 @@ -/* - * Done by Dietmar Hahn - * Mostly taken from FreeBSD. - * - **************************************************************************** - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include -#include -#include -#include - - -static struct ia64_fdesc sal_fdesc; -uint64_t ia64_pal_entry; /* PAL_PROC entrypoint */ - - -struct ia64_sal_result -ia64_sal_call(uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, - uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a8) -{ - return ia64_sal_entry(a1, a2, a3, a4, a5, a6, a7, a8); -} - -static struct ia64_sal_result -fake_sal(uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, - uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a8) -{ - struct ia64_sal_result res; - res.sal_status = -3; - res.sal_result[0] = 0; - res.sal_result[1] = 0; - res.sal_result[2] = 0; - return res; -} - -/* - * Currently only the SAL_DESC_ENTRYPOINT is checked to get - * the entry points the pal and sal functions. - */ -void -ia64_sal_init(struct sal_system_table *saltab) -{ - static int sizes[6] = { 48, 32, 16, 32, 16, 16 }; - uint8_t *p; - int i; - - PRINT_BV("Reading SALtable:\n"); - ia64_sal_entry = fake_sal; - - if (memcmp((void*)(uint64_t)(saltab->sal_signature), SAL_SIGNATURE, 4)) - { - printk("Bad signature for SAL System Table\n"); - return; - } - p = (uint8_t *) (saltab + 1); - for (i = 0; i < saltab->sal_entry_count; i++) { - switch (*p) { - case SAL_DESC_ENTRYPOINT: // 0 - { - struct sal_entrypoint_descriptor *dp; - - dp = (struct sal_entrypoint_descriptor*)p; - ia64_pal_entry = - IA64_PHYS_TO_RR7(dp->sale_pal_proc); - PRINT_BV(" PAL Proc at 0x%lx\n", ia64_pal_entry); - sal_fdesc.func = - IA64_PHYS_TO_RR7(dp->sale_sal_proc); - sal_fdesc.gp = IA64_PHYS_TO_RR7(dp->sale_sal_gp); - PRINT_BV(" SAL Proc at 0x%lx, GP at 0x%lx\n", - sal_fdesc.func, sal_fdesc.gp); - ia64_sal_entry = (sal_entry_t *) &sal_fdesc; - break; - } - default: - break; - } - p += sizes[*p]; - } -} - diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/sched.c xen-4.3.0/extras/mini-os/arch/ia64/sched.c --- xen-4.2.2/extras/mini-os/arch/ia64/sched.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/sched.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -/* - * Done by Dietmar Hahn -#include -#include -#include -#include - -/* The function is implemented in fw.S */ -extern void thread_starter(void); - -void stack_walk(void) -{ - /* TODO */ -} - -struct thread* -arch_create_thread(char *name, void (*function)(void *), void *data) -{ - struct thread* _thread; - - _thread = (struct thread*)_xmalloc(sizeof(struct thread), 16); - /* Allocate pages for stack, stack will be aligned */ - _thread->stack = (char *)alloc_pages(STACK_SIZE_PAGE_ORDER); - _thread->name = name; - memset((void*)&(_thread->regs), 0, sizeof(_thread->regs)); - _thread->regs.sp = ((uint64_t)_thread->stack) + STACK_SIZE - 16; - _thread->regs.bsp = ((uint64_t)_thread->stack) + 0x10; - _thread->regs.rp = FDESC_FUNC(thread_starter); - _thread->regs.pfs = 0x82; - _thread->regs.r4 = FDESC_FUNC(function); - _thread->regs.r6 = (uint64_t)data; - return _thread; -} - -extern void restore_context(struct thread*); -extern int switch_context(struct thread*, struct thread*); - -void -arch_switch_threads(struct thread* prev, struct thread* next) -{ - ia64_set_r13((uint64_t)next); - switch_context(prev, next); -} - -/* Everything initialised, start idle thread */ -void -run_idle_thread(void) -{ - //do_busy_loop(); - ia64_set_r13((uint64_t)idle_thread); - restore_context(idle_thread); - printk("%s: restore_context() returned - bad!\n", __func__); -} diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/time.c xen-4.3.0/extras/mini-os/arch/ia64/time.c --- xen-4.2.2/extras/mini-os/arch/ia64/time.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/time.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,289 +0,0 @@ -/* - * Done by Dietmar Hahn - * Description: simple ia64 specific time handling - * Parts are taken from FreeBSD. - * - **************************************************************************** - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -struct timespec os_time; -static uint64_t itc_alt; /* itc on last update. */ -static uint64_t itc_at_boot; /* itc on boot */ -static uint64_t itc_frequency; -static uint64_t processor_frequency; -static uint64_t itm_val; - -static int is_leap_year(int year) -{ - if( year % 4 == 0 ) - { - if( year % 100 == 0 ) - { - if( year % 400 == 0 ) return 1; - else return 0; - } - return 1; - } - return 0; -} - -static int count_leap_years(int epoch, int year) -{ - int i, result = 0; - for( i = epoch ; i < year ; i++ ) if( is_leap_year(i) ) result++; - return result; -} - -static int get_day(int year, int mon, int day) { - int result; - switch(mon) - { - case 0: result = 0; break; - case 1: result = 31; break; /* 1: 31 */ - case 2: result = 59; break; /* 2: 31+28 */ - case 3: result = 90; break; /* 3: 59+31 */ - case 4: result = 120;break; /* 4: 90+30 */ - case 5: result = 151;break; /* 5: 120+31 */ - case 6: result = 181;break; /* 6: 151+30 */ - case 7: result = 212;break; /* 7: 181+31 */ - case 8: result = 243;break; /* 8: 212+31 */ - case 9: result = 273;break; /* 9: 243+30 */ - case 10:result = 304;break; /* 10:273+31 */ - case 11:result = 334;break; /* 11:304+30 */ - default: break; - } - if( is_leap_year(year) && mon > 2 ) result++; - result += day - 1; - return result; -} - -/* - * Converts Gregorian date to seconds since 1970-01-01 00:00:00. - * Assumes input in normal date format, i.e. 1980-12-31 23:59:59 - * => year=1980, mon=12, day=31, hour=23, min=59, sec=59. - * - * WARNING: this function will overflow on 2106-02-07 06:28:16 on - * machines were long is 32-bit! (However, as time_t is signed, we - * will already get problems at other places on 2038-01-19 03:14:08) - */ -static unsigned long _mktime(const unsigned int year, const unsigned int mon, - const unsigned int day, const unsigned int hour, - const unsigned int min, const unsigned int sec) -{ - unsigned long result = 0; - - result = sec; - result += min * 60; - result += hour * 3600; - result += get_day(year, mon - 1, day) * 86400; - result += (year - 1970) * 31536000; - result += count_leap_years(1970, year) * 86400; - - return result; -} - -static inline uint64_t -ns_from_cycles(uint64_t cycles) -{ - return (cycles * (1000000000 / itc_frequency)); -} - -static inline uint64_t -ns_to_cycles(uint64_t ns) -{ - return (ns * (itc_frequency / 1000000000)); -} - -/* - * Block the domain until until(nanoseconds) is over. - * If block is called no timerinterrupts are delivered from xen! - */ -void -block_domain(s_time_t until) -{ - struct ia64_pal_result pal_res; - uint64_t c, new; - - c = ns_to_cycles(until); - new = ia64_get_itc() + c - NOW(); - ia64_set_itm(new); /* Reload cr.itm */ - /* - * PAL_HALT_LIGHT returns on every external interrupt, - * including timer interrupts. - */ - pal_res = ia64_call_pal_static(PAL_HALT_LIGHT, 0, 0, 0); - if (pal_res.pal_status != 0) - printk("%s: PAL_HALT_LIGHT returns an error\n"); - /* Reload the normal timer interrupt match. */ - new = ia64_get_itc() + itm_val; - ia64_set_itm(new); -} - -static void -calculate_time(void) -{ - uint64_t itc_new, new; - - itc_new = ia64_get_itc(); - if (itc_new < itc_alt) - new = ~0 - itc_alt + itc_new; - else - new = itc_new - itc_alt; - itc_alt = itc_new; - new = ns_from_cycles(new); - os_time.tv_nsec += new; - if (os_time.tv_nsec > 1000000000) { /* On overflow. */ - os_time.tv_sec++; - os_time.tv_nsec -= 1000000000; - } -} - -void -timer_interrupt(evtchn_port_t port, struct pt_regs* regsP, void *data) -{ - uint64_t new; - - calculate_time(); - new = ia64_get_itc() + itm_val; - ia64_set_itm(new); -} - -/* - * monotonic_clock(): returns # of nanoseconds passed since time_init() - */ -uint64_t -monotonic_clock(void) -{ - uint64_t delta; - - delta = ia64_get_itc() - itc_at_boot; - delta = ns_from_cycles(delta); - return delta; -} - -int -gettimeofday(struct timeval *tv, void *tz) -{ - calculate_time(); - tv->tv_sec = os_time.tv_sec; /* seconds */ - tv->tv_usec = NSEC_TO_USEC(os_time.tv_nsec); /* microseconds */ - return 0; -}; - -/* - * Read the clock frequencies from pal and sal for calculating - * the clock interrupt. - */ -static void -calculate_frequencies(void) -{ - struct ia64_sal_result sal_res; - struct ia64_pal_result pal_res; - - pal_res = ia64_call_pal_static(PAL_FREQ_RATIOS, 0, 0, 0); - sal_res = ia64_sal_entry(SAL_FREQ_BASE, 0, 0, 0, 0, 0, 0, 0); - - if (sal_res.sal_status == 0 && pal_res.pal_status == 0) { - processor_frequency = - sal_res.sal_result[0] * (pal_res.pal_result[0] >> 32) - / (pal_res.pal_result[0] & ((1L << 32) - 1)); - itc_frequency = - sal_res.sal_result[0] * (pal_res.pal_result[2] >> 32) - / (pal_res.pal_result[2] & ((1L << 32) - 1)); - PRINT_BV("Reading clock frequencies:\n"); - PRINT_BV(" Platform clock frequency %ld Hz\n", - sal_res.sal_result[0]); - PRINT_BV(" Processor ratio %ld/%ld, Bus ratio %ld/%ld, " - " ITC ratio %ld/%ld\n", - pal_res.pal_result[0] >> 32, - pal_res.pal_result[0] & ((1L << 32) - 1), - pal_res.pal_result[1] >> 32, - pal_res.pal_result[1] & ((1L << 32) - 1), - pal_res.pal_result[2] >> 32, - pal_res.pal_result[2] & ((1L << 32) - 1)); - - printk(" ITC frequency %ld\n", itc_frequency); - } else { - itc_frequency = 1000000000; - processor_frequency = 0; - printk("Reading clock frequencies failed!!! Using: %ld\n", - itc_frequency); - } -} - - -//#define HZ 1 -#define HZ 1000 // 1000 clock ticks per sec -#define IA64_TIMER_VECTOR 0xef - -void -init_time(void) -{ - uint64_t new; - efi_time_t tm; - evtchn_port_t port = 0; - - printk("Initialising time\n"); - calculate_frequencies(); - - itm_val = (itc_frequency + HZ/2) / HZ; - printk(" itm_val: %ld\n", itm_val); - - os_time.tv_sec = 0; - os_time.tv_nsec = 0; - - if (efi_get_time(&tm)) { - printk(" EFI-Time: %d.%d.%d %d:%d:%d\n", tm.Day, - tm.Month, tm.Year, tm.Hour, tm.Minute, tm.Second); - os_time.tv_sec = _mktime(tm.Year, tm.Month, - tm.Day, tm.Hour, tm.Minute, tm.Second); - os_time.tv_nsec = tm.Nanosecond; - } else - printk("efi_get_time() failed\n"); - - port = bind_virq(VIRQ_ITC, timer_interrupt, NULL); - if (port == -1) { - printk("XEN timer request chn bind failed %i\n", port); - return; - } - unmask_evtchn(port); - itc_alt = ia64_get_itc(); - itc_at_boot = itc_alt; - new = ia64_get_itc() + itm_val; - ia64_set_itv(IA64_TIMER_VECTOR); - ia64_set_itm(new); - ia64_srlz_d(); -} - -void -fini_time(void) -{ - /* TODO */ -} diff -Nru xen-4.2.2/extras/mini-os/arch/ia64/xencomm.c xen-4.3.0/extras/mini-os/arch/ia64/xencomm.c --- xen-4.2.2/extras/mini-os/arch/ia64/xencomm.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/ia64/xencomm.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,394 +0,0 @@ -/* - * Copyright (C) 2006 Hollis Blanchard , IBM Corporation - * Tristan Gingold - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that 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 - */ - -/* - * This code is mostly taken from ia64-xen files xcom_mini.c and xencomm.c. - * Changes: Dietmar Hahn -#include -#include -#include -#include -#include - - -#define XENCOMM_MINI_ADDRS 3 -struct xencomm_mini -{ - struct xencomm_desc _desc; - uint64_t address[XENCOMM_MINI_ADDRS]; -}; - -#define xen_guest_handle(hnd) ((hnd).p) - -struct xencomm_handle; - -/* Translate virtual address to physical address. */ -uint64_t -xencomm_vaddr_to_paddr(uint64_t vaddr) -{ - if (IA64_RR_EXTR(vaddr) == 5) - return KERN_VIRT_2_PHYS(vaddr); - - if (IA64_RR_EXTR(vaddr) == 7) - return __pa(vaddr); - - return 0; -} - -/* Inline version. To be used only on linear space (kernel space). */ -static struct xencomm_handle * -xencomm_create_inline(void *buffer) -{ - unsigned long paddr; - - paddr = xencomm_vaddr_to_paddr((unsigned long)buffer); - return (struct xencomm_handle *)(paddr | XENCOMM_INLINE_FLAG); -} - -#define min(a,b) (((a) < (b)) ? (a) : (b)) -static int -xencomm_init_desc(struct xencomm_desc *desc, void *buffer, unsigned long bytes) -{ - unsigned long recorded = 0; - int i = 0; - - if ((buffer == NULL) && (bytes > 0)) - BUG(); - - /* record the physical pages used */ - if (buffer == NULL) - desc->nr_addrs = 0; - - while ((recorded < bytes) && (i < desc->nr_addrs)) { - unsigned long vaddr = (unsigned long)buffer + recorded; - unsigned long paddr; - int offset; - int chunksz; - - offset = vaddr % PAGE_SIZE; /* handle partial pages */ - chunksz = min(PAGE_SIZE - offset, bytes - recorded); - - paddr = xencomm_vaddr_to_paddr(vaddr); - if (paddr == ~0UL) { - printk("%s: couldn't translate vaddr %lx\n", - __func__, vaddr); - return -EINVAL; - } - - desc->address[i++] = paddr; - recorded += chunksz; - } - if (recorded < bytes) { - printk("%s: could only translate %ld of %ld bytes\n", - __func__, recorded, bytes); - return -ENOSPC; - } - - /* mark remaining addresses invalid (just for safety) */ - while (i < desc->nr_addrs) - desc->address[i++] = XENCOMM_INVALID; - desc->magic = XENCOMM_MAGIC; - return 0; -} - -static void * -xencomm_alloc_mini(struct xencomm_mini *area, int *nbr_area) -{ - unsigned long base; - unsigned int pageoffset; - - while (*nbr_area >= 0) { - /* Allocate an area. */ - (*nbr_area)--; - - base = (unsigned long)(area + *nbr_area); - pageoffset = base % PAGE_SIZE; - - /* If the area does not cross a page, use it. */ - if ((PAGE_SIZE - pageoffset) >= sizeof(struct xencomm_mini)) - return &area[*nbr_area]; - } - /* No more area. */ - return NULL; -} - -int -xencomm_create_mini(struct xencomm_mini *area, int *nbr_area, - void *buffer, unsigned long bytes, - struct xencomm_handle **ret) -{ - struct xencomm_desc *desc; - int rc; - unsigned long res; - - desc = xencomm_alloc_mini(area, nbr_area); - if (!desc) - return -ENOMEM; - desc->nr_addrs = XENCOMM_MINI_ADDRS; - - rc = xencomm_init_desc(desc, buffer, bytes); - if (rc) - return rc; - - res = xencomm_vaddr_to_paddr((unsigned long)desc); - if (res == ~0UL) - return -EINVAL; - - *ret = (struct xencomm_handle*)res; - return 0; -} - -static int -xencommize_mini_grant_table_op(struct xencomm_mini *xc_area, int *nbr_area, - unsigned int cmd, void *op, unsigned int count, - struct xencomm_handle **desc) -{ - struct xencomm_handle *desc1; - unsigned int argsize=0; - int rc; - - switch (cmd) { - case GNTTABOP_map_grant_ref: - argsize = sizeof(struct gnttab_map_grant_ref); - break; - case GNTTABOP_unmap_grant_ref: - argsize = sizeof(struct gnttab_unmap_grant_ref); - break; - case GNTTABOP_setup_table: - { - struct gnttab_setup_table *setup = op; - - argsize = sizeof(*setup); - - if (count != 1) - return -EINVAL; - rc = xencomm_create_mini - (xc_area, nbr_area, - (void*)(uint64_t) xen_guest_handle(setup->frame_list), - setup->nr_frames - * sizeof(*xen_guest_handle(setup->frame_list)), - &desc1); - if (rc) - return rc; - set_xen_guest_handle(setup->frame_list, - (void *)(uint64_t)desc1); - break; - } - case GNTTABOP_dump_table: - argsize = sizeof(struct gnttab_dump_table); - break; - case GNTTABOP_transfer: - argsize = sizeof(struct gnttab_transfer); - break; - case GNTTABOP_copy: - argsize = sizeof(struct gnttab_copy); - break; - default: - printk("%s: unknown mini grant table op %d\n", __func__, cmd); - BUG(); - } - - rc = xencomm_create_mini(xc_area, nbr_area, op, count * argsize, desc); - - return rc; -} - -static inline int -xencomm_arch_hypercall_grant_table_op(unsigned int cmd, - struct xencomm_handle *uop, - unsigned int count) -{ - return _hypercall3(int, grant_table_op, cmd, uop, count); -} - -int -xencomm_mini_hypercall_grant_table_op(unsigned int cmd, void *op, - unsigned int count) -{ - int rc; - struct xencomm_handle *desc; - int nbr_area = 2; - struct xencomm_mini xc_area[2]; - - rc = xencommize_mini_grant_table_op(xc_area, &nbr_area, - cmd, op, count, &desc); - if (rc) - return rc; - return xencomm_arch_hypercall_grant_table_op(cmd, desc, count); -} - -static void -gnttab_map_grant_ref_pre(struct gnttab_map_grant_ref *uop) -{ - uint32_t flags; - - flags = uop->flags; - - if (flags & GNTMAP_host_map) { - if (flags & GNTMAP_application_map) { - printk("GNTMAP_application_map is not supported yet: " - "flags 0x%x\n", flags); - BUG(); - } - if (flags & GNTMAP_contains_pte) { - printk("GNTMAP_contains_pte is not supported yet flags " - "0x%x\n", flags); - BUG(); - } - } else if (flags & GNTMAP_device_map) { - printk("GNTMAP_device_map is not supported yet 0x%x\n", flags); - BUG();//XXX not yet. actually this flag is not used. - } else { - BUG(); - } -} - -int -HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count) -{ - if (cmd == GNTTABOP_map_grant_ref) { - unsigned int i; - for (i = 0; i < count; i++) { - gnttab_map_grant_ref_pre( - (struct gnttab_map_grant_ref*)uop + i); - } - } - return xencomm_mini_hypercall_grant_table_op(cmd, uop, count); -} - - /* In fw.S */ -extern int xencomm_arch_hypercall_suspend(struct xencomm_handle *arg); -int -HYPERVISOR_suspend(unsigned long srec) -{ - struct sched_shutdown arg; - - arg.reason = (uint32_t)SHUTDOWN_suspend; - - return xencomm_arch_hypercall_suspend(xencomm_create_inline(&arg)); -} - -int -HYPERVISOR_event_channel_op(int cmd, void *arg) -{ - int rc; - struct xencomm_handle *newArg; - - newArg = xencomm_create_inline(arg); - rc = _hypercall2(int, event_channel_op, cmd, newArg); - if (unlikely(rc == -ENOSYS)) { - struct evtchn_op op; - - op.cmd = cmd; - memcpy(&op.u, arg, sizeof(op.u)); - rc = _hypercall1(int, event_channel_op_compat, &op); - } - return rc; -} - -static int -xencomm_arch_xen_version(int cmd, struct xencomm_handle *arg) -{ - return _hypercall2(int, xen_version, cmd, arg); -} - -static int -xencomm_arch_xen_feature(int cmd, struct xencomm_handle *arg) -{ - struct xencomm_handle *newArg; - - newArg = xencomm_create_inline(arg); - return _hypercall2(int, xen_version, cmd, newArg); -} - -int -HYPERVISOR_xen_version(int cmd, void *arg) -{ - switch(cmd) { - case XENVER_version: - return xencomm_arch_xen_version(cmd, 0); - case XENVER_get_features: - return xencomm_arch_xen_feature(cmd, arg); - default: - return -1; - } -} - -int -HYPERVISOR_console_io(int cmd, int count, char *str) -{ - struct xencomm_handle *newStr; - - newStr = xencomm_create_inline(str); - return _hypercall3(int, console_io, cmd, count, newStr); -} - -int -HYPERVISOR_sched_op_compat(int cmd, unsigned long arg) -{ - return _hypercall2(int, sched_op_compat, cmd, arg); -} - -int -HYPERVISOR_sched_op(int cmd, void *arg) -{ - struct xencomm_handle *newArg; - - newArg = xencomm_create_inline(arg); - return _hypercall2(int, sched_op, cmd, newArg); -} - -int -HYPERVISOR_callback_op(int cmd, void *arg) -{ - struct xencomm_handle *newArg; - - newArg = xencomm_create_inline(arg); - return _hypercall2(int, callback_op, cmd, newArg); -} - -int -HYPERVISOR_opt_feature(void *arg) -{ - struct xencomm_handle *new_arg; - - new_arg = xencomm_create_inline(arg); - - return _hypercall1(int, opt_feature, new_arg); -} - -int -HYPERVISOR_shutdown(unsigned int reason) -{ - struct sched_shutdown sched_shutdown = { - .reason = reason - }; - - int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown); - - if (rc == -ENOSYS) - rc = HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason); - - return rc; -} - diff -Nru xen-4.2.2/extras/mini-os/arch/x86/ioremap.c xen-4.3.0/extras/mini-os/arch/x86/ioremap.c --- xen-4.2.2/extras/mini-os/arch/x86/ioremap.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/x86/ioremap.c 2013-07-09 10:46:56.000000000 +0000 @@ -35,7 +35,6 @@ unsigned long va; unsigned long mfns, mfn; unsigned long num_pages, offset; - int i; /* allow non page aligned addresses but for mapping we need to align them */ offset = (phys_addr & ~PAGE_MASK); @@ -43,21 +42,9 @@ phys_addr &= PAGE_MASK; mfns = mfn = phys_addr >> PAGE_SHIFT; - /* sanity checks on list of MFNs */ - for ( i = 0; i < num_pages; i++, mfn++ ) - { - if ( mfn_is_ram(mfn) ) - { - printk("ioremap: mfn 0x%ulx is RAM\n", mfn); - goto mfn_invalid; - } - } va = (unsigned long)map_frames_ex(&mfns, num_pages, 0, 1, 1, DOMID_IO, NULL, prot); return (void *)(va + offset); - -mfn_invalid: - return NULL; } void *ioremap(unsigned long phys_addr, unsigned long size) diff -Nru xen-4.2.2/extras/mini-os/arch/x86/iorw.c xen-4.3.0/extras/mini-os/arch/x86/iorw.c --- xen-4.2.2/extras/mini-os/arch/x86/iorw.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/x86/iorw.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,35 @@ +#include + +void iowrite8(volatile void* addr, uint8_t val) +{ + *((volatile uint8_t*)addr) = val; +} +void iowrite16(volatile void* addr, uint16_t val) +{ + *((volatile uint16_t*)addr) = val; +} +void iowrite32(volatile void* addr, uint32_t val) +{ + *((volatile uint32_t*)addr) = val; +} +void iowrite64(volatile void* addr, uint64_t val) +{ + *((volatile uint64_t*)addr) = val; +} + +uint8_t ioread8(volatile void* addr) +{ + return *((volatile uint8_t*) addr); +} +uint16_t ioread16(volatile void* addr) +{ + return *((volatile uint16_t*) addr); +} +uint32_t ioread32(volatile void* addr) +{ + return *((volatile uint32_t*) addr); +} +uint64_t ioread64(volatile void* addr) +{ + return *((volatile uint64_t*) addr); +} diff -Nru xen-4.2.2/extras/mini-os/arch/x86/mm.c xen-4.3.0/extras/mini-os/arch/x86/mm.c --- xen-4.2.2/extras/mini-os/arch/x86/mm.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/x86/mm.c 2013-07-09 10:46:56.000000000 +0000 @@ -845,18 +845,6 @@ } /* - * Check if a given MFN refers to real memory - */ -static long system_ram_end_mfn; -int mfn_is_ram(unsigned long mfn) -{ - /* very crude check if a given MFN is memory or not. Probably should - * make this a little more sophisticated ;) */ - return (mfn <= system_ram_end_mfn) ? 1 : 0; -} - - -/* * Clear some of the bootstrap memory */ static void clear_bootstrap(void) @@ -951,10 +939,6 @@ clear_bootstrap(); set_readonly(&_text, &_erodata); - /* get the number of physical pages the system has. Used to check for - * system memory. */ - system_ram_end_mfn = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL); - *start_pfn_p = start_pfn; *max_pfn_p = max_pfn; } diff -Nru xen-4.2.2/extras/mini-os/arch/x86/setup.c xen-4.3.0/extras/mini-os/arch/x86/setup.c --- xen-4.2.2/extras/mini-os/arch/x86/setup.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/x86/setup.c 2013-07-09 10:46:56.000000000 +0000 @@ -74,9 +74,28 @@ return (shared_info_t *)shared_info; } +static inline void fpu_init(void) { + asm volatile("fninit"); +} + +#ifdef __SSE__ +static inline void sse_init(void) { + unsigned long status = 0x1f80; + asm volatile("ldmxcsr %0" : : "m" (status)); +} +#else +#define sse_init() +#endif + void arch_init(start_info_t *si) { + /*Initialize floating point unit */ + fpu_init(); + + /* Initialize SSE */ + sse_init(); + /* Copy the start_info struct to a globally-accessible area. */ /* WARN: don't do printk before here, it uses information from shared_info. Use xprintk instead. */ @@ -99,6 +118,7 @@ (unsigned long)failsafe_callback, 0); #endif + } void diff -Nru xen-4.2.2/extras/mini-os/arch/x86/x86_64.S xen-4.3.0/extras/mini-os/arch/x86/x86_64.S --- xen-4.2.2/extras/mini-os/arch/x86/x86_64.S 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/arch/x86/x86_64.S 2013-07-09 10:46:56.000000000 +0000 @@ -36,15 +36,57 @@ .org 0x3000 +#define XEN_GET_VCPU_INFO(reg) movq HYPERVISOR_shared_info,reg +#define XEN_PUT_VCPU_INFO(reg) +#define XEN_PUT_VCPU_INFO_fixup +#define XEN_LOCKED_BLOCK_EVENTS(reg) movb $1,evtchn_upcall_mask(reg) +#define XEN_LOCKED_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg) +#define XEN_TEST_PENDING(reg) testb $0xFF,evtchn_upcall_pending(reg) + +#define XEN_BLOCK_EVENTS(reg) XEN_GET_VCPU_INFO(reg) ; \ + XEN_LOCKED_BLOCK_EVENTS(reg) ; \ + XEN_PUT_VCPU_INFO(reg) + +#define XEN_UNBLOCK_EVENTS(reg) XEN_GET_VCPU_INFO(reg) ; \ + XEN_LOCKED_UNBLOCK_EVENTS(reg) ; \ + XEN_PUT_VCPU_INFO(reg) + + /* Offsets into shared_info_t. */ #define evtchn_upcall_pending /* 0 */ #define evtchn_upcall_mask 1 NMI_MASK = 0x80000000 +KERNEL_CS_MASK = 0xfc + +#define RAX 80 +#define RDI 112 +#define ORIG_RAX 120 /* + error_code */ +#define RIP 128 +#define CS 136 +#define RFLAGS 144 +#define RSP 152 + + +/* Macros */ +.macro zeroentry sym + movq (%rsp),%rcx + movq 8(%rsp),%r11 + addq $0x10,%rsp /* skip rcx and r11 */ + pushq $0 /* push error code/oldrax */ + pushq %rax /* push real oldrax to the rdi slot */ + leaq \sym(%rip),%rax + jmp error_entry +.endm -#define RDI 112 -#define ORIG_RAX 120 /* + error_code */ -#define EFLAGS 144 +.macro errorentry sym + movq (%rsp),%rcx + movq 8(%rsp),%r11 + addq $0x10,%rsp /* rsp points to the error code */ + pushq %rax + leaq \sym(%rip),%rax + jmp error_entry +.endm .macro RESTORE_ALL movq (%rsp),%r11 @@ -59,6 +101,25 @@ addq $9*8+8,%rsp .endm +.macro RESTORE_REST + movq (%rsp),%r15 + movq 1*8(%rsp),%r14 + movq 2*8(%rsp),%r13 + movq 3*8(%rsp),%r12 + movq 4*8(%rsp),%rbp + movq 5*8(%rsp),%rbx + addq $6*8,%rsp +.endm + +.macro SAVE_REST + subq $6*8,%rsp + movq %rbx,5*8(%rsp) + movq %rbp,4*8(%rsp) + movq %r12,3*8(%rsp) + movq %r13,2*8(%rsp) + movq %r14,1*8(%rsp) + movq %r15,(%rsp) +.endm .macro HYPERVISOR_IRET flag testl $NMI_MASK,2*8(%rsp) @@ -78,6 +139,7 @@ jmp hypercall_page + (__HYPERVISOR_iret * 32) .endm + /* * Exception entry point. This expects an error code/orig_rax on the stack * and the exception handler in %rax. @@ -103,111 +165,116 @@ movq %r15,(%rsp) error_call_handler: - movq %rdi, RDI(%rsp) + movq %rdi, RDI(%rsp) movq %rsp,%rdi movq ORIG_RAX(%rsp),%rsi # get error code movq $-1,ORIG_RAX(%rsp) call *%rax jmp error_exit -.macro zeroentry sym - movq (%rsp),%rcx - movq 8(%rsp),%r11 - addq $0x10,%rsp /* skip rcx and r11 */ - pushq $0 /* push error code/oldrax */ - pushq %rax /* push real oldrax to the rdi slot */ - leaq \sym(%rip),%rax - jmp error_entry -.endm - -.macro errorentry sym - movq (%rsp),%rcx - movq 8(%rsp),%r11 - addq $0x10,%rsp /* rsp points to the error code */ - pushq %rax - leaq \sym(%rip),%rax - jmp error_entry -.endm - -#define XEN_GET_VCPU_INFO(reg) movq HYPERVISOR_shared_info,reg -#define XEN_PUT_VCPU_INFO(reg) -#define XEN_PUT_VCPU_INFO_fixup -#define XEN_LOCKED_BLOCK_EVENTS(reg) movb $1,evtchn_upcall_mask(reg) -#define XEN_LOCKED_UNBLOCK_EVENTS(reg) movb $0,evtchn_upcall_mask(reg) -#define XEN_TEST_PENDING(reg) testb $0xFF,evtchn_upcall_pending(reg) - -#define XEN_BLOCK_EVENTS(reg) XEN_GET_VCPU_INFO(reg) ; \ - XEN_LOCKED_BLOCK_EVENTS(reg) ; \ - XEN_PUT_VCPU_INFO(reg) - -#define XEN_UNBLOCK_EVENTS(reg) XEN_GET_VCPU_INFO(reg) ; \ - XEN_LOCKED_UNBLOCK_EVENTS(reg) ; \ - XEN_PUT_VCPU_INFO(reg) - - +/* + * Xen event (virtual interrupt) entry point. + */ ENTRY(hypervisor_callback) - zeroentry hypervisor_callback2 + zeroentry hypervisor_callback2 ENTRY(hypervisor_callback2) - movq %rdi, %rsp -11: movq %gs:8,%rax - incl %gs:0 - cmovzq %rax,%rsp - pushq %rdi - call do_hypervisor_callback - popq %rsp - decl %gs:0 - jmp error_exit - -restore_all_enable_events: - XEN_UNBLOCK_EVENTS(%rsi) # %rsi is already set up... - -scrit: /**** START OF CRITICAL REGION ****/ - XEN_TEST_PENDING(%rsi) - jnz 14f # process more events if necessary... - XEN_PUT_VCPU_INFO(%rsi) - RESTORE_ALL - HYPERVISOR_IRET 0 - -14: XEN_LOCKED_BLOCK_EVENTS(%rsi) - XEN_PUT_VCPU_INFO(%rsi) - subq $6*8,%rsp - movq %rbx,5*8(%rsp) - movq %rbp,4*8(%rsp) - movq %r12,3*8(%rsp) - movq %r13,2*8(%rsp) - movq %r14,1*8(%rsp) - movq %r15,(%rsp) - movq %rsp,%rdi # set the argument again - jmp 11b -ecrit: /**** END OF CRITICAL REGION ****/ + movq %rdi, %rsp + /* check against event re-entrant */ + movq RIP(%rsp),%rax + cmpq $scrit,%rax + jb 11f + cmpq $ecrit,%rax + jb critical_region_fixup + +11: movq %gs:8,%rax + incl %gs:0 + cmovzq %rax,%rsp + pushq %rdi + call do_hypervisor_callback + popq %rsp + decl %gs:0 +error_exit: retint_kernel: -retint_restore_args: - movl EFLAGS-6*8(%rsp), %eax - shr $9, %eax # EAX[0] == IRET_EFLAGS.IF + movl RFLAGS(%rsp), %eax + shr $9, %eax # EAX[0] == IRET_RFLAGS.IF XEN_GET_VCPU_INFO(%rsi) andb evtchn_upcall_mask(%rsi),%al - andb $1,%al # EAX[0] == IRET_EFLAGS.IF & event_mask + andb $1,%al # EAX[0] == IRET_RFLAGS.IF & event_mask jnz restore_all_enable_events # != 0 => enable event delivery XEN_PUT_VCPU_INFO(%rsi) - + +retint_restore_args: + RESTORE_REST RESTORE_ALL HYPERVISOR_IRET 0 +restore_all_enable_events: + RESTORE_REST + RESTORE_ALL + pushq %rax # save rax for it will be clobbered later + RSP_OFFSET=8 # record the stack frame layout changes + XEN_GET_VCPU_INFO(%rax) # safe to use rax since it is saved + XEN_UNBLOCK_EVENTS(%rax) + +scrit: /**** START OF CRITICAL REGION ****/ + XEN_TEST_PENDING(%rax) + jz 12f + XEN_LOCKED_BLOCK_EVENTS(%rax) # if pending, mask events and handle + # by jumping to hypervisor_prologue +12: popq %rax # all registers restored from this point + +restore_end: + jnz hypervisor_prologue # safe to jump out of critical region + # because events are masked if ZF = 0 + HYPERVISOR_IRET 0 +ecrit: /**** END OF CRITICAL REGION ****/ -error_exit: - movq (%rsp),%r15 - movq 1*8(%rsp),%r14 - movq 2*8(%rsp),%r13 - movq 3*8(%rsp),%r12 - movq 4*8(%rsp),%rbp - movq 5*8(%rsp),%rbx - addq $6*8,%rsp - XEN_BLOCK_EVENTS(%rsi) - jmp retint_kernel +# Set up the stack as Xen does before calling event callback +hypervisor_prologue: + pushq %r11 + pushq %rcx + jmp hypervisor_callback + +# [How we do the fixup]. We want to merge the current stack frame with the +# just-interrupted frame. How we do this depends on where in the critical +# region the interrupted handler was executing, and so if rax has been +# restored. We determine by comparing interrupted rip with "restore_end". +# We always copy all registers below RIP from the current stack frame +# to the end of the previous activation frame so that we can continue +# as if we've never even reached 11 running in the old activation frame. + +critical_region_fixup: + # Set up source and destination region pointers + leaq RIP(%rsp),%rsi # esi points at end of src region + # Acquire interrupted rsp which was saved-on-stack. This points to + # the end of dst region. Note that it is not necessarily current rsp + # plus 0xb0, because the second interrupt might align the stack frame. + movq RSP(%rsp),%rdi # edi points at end of dst region + + cmpq $restore_end,%rax + jae 13f + + # If interrupted rip is before restore_end + # then rax hasn't been restored yet + movq (%rdi),%rax + movq %rax, RAX(%rsp) # save rax + addq $RSP_OFFSET,%rdi + + # Set up the copy +13: movq $RIP,%rcx + shr $3,%rcx # convert bytes into count of 64-bit entities +15: subq $8,%rsi # pre-decrementing copy loop + subq $8,%rdi + movq (%rsi),%rax + movq %rax,(%rdi) + loop 15b +16: movq %rdi,%rsp # final rdi is top of merged stack + andb $KERNEL_CS_MASK,CS(%rsp) # CS might have changed + jmp 11b diff -Nru xen-4.2.2/extras/mini-os/blkfront.c xen-4.3.0/extras/mini-os/blkfront.c --- xen-4.2.2/extras/mini-os/blkfront.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/blkfront.c 2013-07-09 10:46:56.000000000 +0000 @@ -392,6 +392,7 @@ static void blkfront_aio_cb(struct blkfront_aiocb *aiocbp, int ret) { aiocbp->data = (void*) 1; + aiocbp->aio_cb = NULL; } void blkfront_io(struct blkfront_aiocb *aiocbp, int write) @@ -547,9 +548,177 @@ #ifdef HAVE_LIBC int blkfront_open(struct blkfront_dev *dev) { + /* Silently prevent multiple opens */ + if(dev->fd != -1) { + return dev->fd; + } dev->fd = alloc_fd(FTYPE_BLK); printk("blk_open(%s) -> %d\n", dev->nodename, dev->fd); files[dev->fd].blk.dev = dev; + files[dev->fd].blk.offset = 0; return dev->fd; } + +int blkfront_posix_rwop(int fd, uint8_t* buf, size_t count, int write) +{ + struct blkfront_dev* dev = files[fd].blk.dev; + off_t offset = files[fd].blk.offset; + struct blkfront_aiocb aiocb; + unsigned long long disksize = dev->info.sectors * dev->info.sector_size; + unsigned int blocksize = dev->info.sector_size; + + int blknum; + int blkoff; + size_t bytes; + int rc = 0; + int alignedbuf = 0; + uint8_t* copybuf = NULL; + + /* RW 0 bytes is just a NOP */ + if(count == 0) { + return 0; + } + /* Check for NULL buffer */ + if( buf == NULL ) { + errno = EFAULT; + return -1; + } + + /* Write mode checks */ + if(write) { + /*Make sure we have write permission */ + if(dev->info.info & VDISK_READONLY + || (dev->info.mode != O_RDWR && dev->info.mode != O_WRONLY)) { + errno = EACCES; + return -1; + } + /*Make sure disk is big enough for this write */ + if(offset + count > disksize) { + errno = ENOSPC; + return -1; + } + } + /* Read mode checks */ + else + { + /* Reading past the disk? Just return 0 */ + if(offset >= disksize) { + return 0; + } + + /*If the requested read is bigger than the disk, just + * read as much as we can until the end */ + if(offset + count > disksize) { + count = disksize - offset; + } + } + /* Determine which block to start at and at which offset inside of it */ + blknum = offset / blocksize; + blkoff = offset % blocksize; + + /* Optimization: We need to check if buf is aligned to the sector size. + * This is somewhat tricky code. We have to add the blocksize - block offset + * because the first block may be a partial block and then for every subsequent + * block rw the buffer will be offset.*/ + if(!((uintptr_t) (buf +(blocksize - blkoff)) & (dev->info.sector_size-1))) { + alignedbuf = 1; + } + + /* Setup aiocb block object */ + aiocb.aio_dev = dev; + aiocb.aio_offset = blknum * blocksize; + aiocb.aio_cb = NULL; + aiocb.data = NULL; + + /* If our buffer is unaligned or its aligned but we will need to rw a partial block + * then a copy will have to be done */ + if(!alignedbuf || blkoff != 0 || count % blocksize != 0) { + copybuf = _xmalloc(blocksize, dev->info.sector_size); + } + + rc = count; + while(count > 0) { + /* determine how many bytes to read/write from/to the current block buffer */ + if(!alignedbuf || blkoff != 0 || count < blocksize) { + /* This is the case for unaligned R/W or partial block */ + bytes = count < blocksize - blkoff ? count : blocksize - blkoff; + aiocb.aio_nbytes = blocksize; + } else { + /* We can optimize further if buffer is page aligned */ + int not_page_aligned = 0; + if(((uintptr_t)buf) & (PAGE_SIZE -1)) { + not_page_aligned = 1; + } + + /* For an aligned R/W we can read up to the maximum transfer size */ + bytes = count > (BLKIF_MAX_SEGMENTS_PER_REQUEST-not_page_aligned)*PAGE_SIZE + ? (BLKIF_MAX_SEGMENTS_PER_REQUEST-not_page_aligned)*PAGE_SIZE + : count & ~(blocksize -1); + aiocb.aio_nbytes = bytes; + } + + /* read operation */ + if(!write) { + if (alignedbuf && bytes >= blocksize) { + /* If aligned and were reading a whole block, just read right into buf */ + aiocb.aio_buf = buf; + blkfront_read(&aiocb); + } else { + /* If not then we have to do a copy */ + aiocb.aio_buf = copybuf; + blkfront_read(&aiocb); + memcpy(buf, ©buf[blkoff], bytes); + } + } + /* Write operation */ + else { + if(alignedbuf && bytes >= blocksize) { + /* If aligned and were writing a whole block, just write directly from buf */ + aiocb.aio_buf = buf; + blkfront_write(&aiocb); + } else { + /* If not then we have to do a copy. */ + aiocb.aio_buf = copybuf; + /* If we're writing a partial block, we need to read the current contents first + * so we don't overwrite the extra bits with garbage */ + if(blkoff != 0 || bytes < blocksize) { + blkfront_read(&aiocb); + } + memcpy(©buf[blkoff], buf, bytes); + blkfront_write(&aiocb); + } + } + /* Will start at beginning of all remaining blocks */ + blkoff = 0; + + /* Increment counters and continue */ + count -= bytes; + buf += bytes; + if(bytes < blocksize) { + //At minimum we read one block + aiocb.aio_offset += blocksize; + } else { + //If we read more than a block, was a multiple of blocksize + aiocb.aio_offset += bytes; + } + } + + free(copybuf); + files[fd].blk.offset += rc; + return rc; + +} + +int blkfront_posix_fstat(int fd, struct stat* buf) +{ + struct blkfront_dev* dev = files[fd].blk.dev; + + buf->st_mode = dev->info.mode; + buf->st_uid = 0; + buf->st_gid = 0; + buf->st_size = dev->info.sectors * dev->info.sector_size; + buf->st_atime = buf->st_mtime = buf->st_ctime = time(NULL); + + return 0; +} #endif diff -Nru xen-4.2.2/extras/mini-os/console/console.c xen-4.3.0/extras/mini-os/console/console.c --- xen-4.2.2/extras/mini-os/console/console.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/console/console.c 2013-07-09 10:46:56.000000000 +0000 @@ -54,9 +54,7 @@ NOTE: you need to enable verbose in xen/Rules.mk for it to work. */ static int console_initialised = 0; - -#ifndef HAVE_LIBC -void xencons_rx(char *buf, unsigned len, struct pt_regs *regs) +__attribute__((weak)) void console_input(char * buf, unsigned len) { if(len > 0) { @@ -69,6 +67,12 @@ } } +#ifndef HAVE_LIBC +void xencons_rx(char *buf, unsigned len, struct pt_regs *regs) +{ + console_input(buf, len); +} + void xencons_tx(void) { /* Do nothing, handled by _rx */ diff -Nru xen-4.2.2/extras/mini-os/console/xenbus.c xen-4.3.0/extras/mini-os/console/xenbus.c --- xen-4.2.2/extras/mini-os/console/xenbus.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/console/xenbus.c 2013-07-09 10:46:56.000000000 +0000 @@ -122,12 +122,6 @@ goto abort_transaction; } - err = xenbus_printf(xbt, nodename, "type", "%s", "ioemu"); - if (err) { - message = "writing type"; - goto abort_transaction; - } - snprintf(path, sizeof(path), "%s/state", nodename); err = xenbus_switch_state(xbt, path, XenbusStateConnected); if (err) { diff -Nru xen-4.2.2/extras/mini-os/events.c xen-4.3.0/extras/mini-os/events.c --- xen-4.2.2/extras/mini-os/events.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/events.c 2013-07-09 10:46:56.000000000 +0000 @@ -21,6 +21,7 @@ #include #include #include +#include #define NR_EVS 1024 @@ -258,10 +259,31 @@ return rc; } +int evtchn_get_peercontext(evtchn_port_t local_port, char *ctx, int size) +{ + int rc; + uint32_t sid; + struct xen_flask_op op; + op.cmd = FLASK_GET_PEER_SID; + op.interface_version = XEN_FLASK_INTERFACE_VERSION; + op.u.peersid.evtchn = local_port; + rc = _hypercall1(int, xsm_op, &op); + if (rc) + return rc; + sid = op.u.peersid.sid; + op.cmd = FLASK_SID_TO_CONTEXT; + op.u.sid_context.sid = sid; + op.u.sid_context.size = size; + set_xen_guest_handle(op.u.sid_context.context, ctx); + rc = _hypercall1(int, xsm_op, &op); + return rc; +} + + /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/extras/mini-os/gnttab.c xen-4.3.0/extras/mini-os/gnttab.c --- xen-4.2.2/extras/mini-os/gnttab.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/gnttab.c 2013-07-09 10:46:56.000000000 +0000 @@ -23,11 +23,7 @@ #define NR_RESERVED_ENTRIES 8 /* NR_GRANT_FRAMES must be less than or equal to that configured in Xen */ -#ifdef __ia64__ -#define NR_GRANT_FRAMES 1 -#else #define NR_GRANT_FRAMES 4 -#endif #define NR_GRANT_ENTRIES (NR_GRANT_FRAMES * PAGE_SIZE / sizeof(grant_entry_t)) static grant_entry_t *gnttab_table; diff -Nru xen-4.2.2/extras/mini-os/include/blkfront.h xen-4.3.0/extras/mini-os/include/blkfront.h --- xen-4.2.2/extras/mini-os/include/blkfront.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/blkfront.h 2013-07-09 10:46:56.000000000 +0000 @@ -28,7 +28,17 @@ }; struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info); #ifdef HAVE_LIBC +#include +/* POSIX IO functions: + * use blkfront_open() to get a file descriptor to the block device + * Don't use the other blkfront posix functions here directly, instead use + * read(), write(), lseek() and fstat() on the file descriptor + */ int blkfront_open(struct blkfront_dev *dev); +int blkfront_posix_rwop(int fd, uint8_t* buf, size_t count, int write); +#define blkfront_posix_write(fd, buf, count) blkfront_posix_rwop(fd, (uint8_t*)buf, count, 1) +#define blkfront_posix_read(fd, buf, count) blkfront_posix_rwop(fd, (uint8_t*)buf, count, 0) +int blkfront_posix_fstat(int fd, struct stat* buf); #endif void blkfront_aio(struct blkfront_aiocb *aiocbp, int write); #define blkfront_aio_read(aiocbp) blkfront_aio(aiocbp, 0) diff -Nru xen-4.2.2/extras/mini-os/include/byteorder.h xen-4.3.0/extras/mini-os/include/byteorder.h --- xen-4.2.2/extras/mini-os/include/byteorder.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/byteorder.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,36 @@ +#ifndef MINIOS_BYTEORDER_H +#define MINIOS_BYTEORDER_H + +#include +#include + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define be16_to_cpu(v) bswap_16(v) +#define be32_to_cpu(v) bswap_32(v) +#define be64_to_cpu(v) bswap_64(v) + +#define le16_to_cpu(v) (v) +#define le32_to_cpu(v) (v) +#define le64_to_cpu(v) (v) + +#else /*__BIG_ENDIAN*/ +#define be16_to_cpu(v) (v) +#define be32_to_cpu(v) (v) +#define be64_to_cpu(v) (v) + +#define le16_to_cpu(v) bswap_16(v) +#define le32_to_cpu(v) bswap_32(v) +#define le64_to_cpu(v) bswap_64(v) + +#endif + +#define cpu_to_be16(v) be16_to_cpu(v) +#define cpu_to_be32(v) be32_to_cpu(v) +#define cpu_to_be64(v) be64_to_cpu(v) + +#define cpu_to_le16(v) le16_to_cpu(v) +#define cpu_to_le32(v) le32_to_cpu(v) +#define cpu_to_le64(v) le64_to_cpu(v) + + +#endif diff -Nru xen-4.2.2/extras/mini-os/include/byteswap.h xen-4.3.0/extras/mini-os/include/byteswap.h --- xen-4.2.2/extras/mini-os/include/byteswap.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/byteswap.h 2013-07-09 10:46:56.000000000 +0000 @@ -4,30 +4,36 @@ /* Unfortunately not provided by newlib. */ #include -static inline uint16_t bswap_16(uint16_t x) -{ - return - ((((x) & 0xff00) >> 8) | (((x) & 0xff) << 8)); -} - -static inline uint32_t bswap_32(uint32_t x) -{ - return - ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | - (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)); -} - -static inline uint64_t bswap_64(uint64_t x) -{ - return - ((((x) & 0xff00000000000000ULL) >> 56) | - (((x) & 0x00ff000000000000ULL) >> 40) | - (((x) & 0x0000ff0000000000ULL) >> 24) | - (((x) & 0x000000ff00000000ULL) >> 8) | - (((x) & 0x00000000ff000000ULL) << 8) | - (((x) & 0x0000000000ff0000ULL) << 24) | - (((x) & 0x000000000000ff00ULL) << 40) | - (((x) & 0x00000000000000ffULL) << 56)); -} + +#define bswap_16(x) ((uint16_t)( \ + (((uint16_t)(x) & (uint16_t)0x00ffU) << 8) | \ + (((uint16_t)(x) & (uint16_t)0xff00U) >> 8))) + +/* Use gcc optimized versions if they exist */ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) +#define bswap_32(v) __builtin_bswap32(v) +#define bswap_64(v) __builtin_bswap64(v) +#else + +#define bswap_32(x) ((uint32_t)( \ + (((uint32_t)(x) & (uint32_t)0x000000ffUL) << 24) | \ + (((uint32_t)(x) & (uint32_t)0x0000ff00UL) << 8) | \ + (((uint32_t)(x) & (uint32_t)0x00ff0000UL) >> 8) | \ + (((uint32_t)(x) & (uint32_t)0xff000000UL) >> 24))) + +#define bswap_64(x) ((uint64_t)( \ + (((uint64_t)(x) & (uint64_t)0x00000000000000ffULL) << 56) | \ + (((uint64_t)(x) & (uint64_t)0x000000000000ff00ULL) << 40) | \ + (((uint64_t)(x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \ + (((uint64_t)(x) & (uint64_t)0x00000000ff000000ULL) << 8) | \ + (((uint64_t)(x) & (uint64_t)0x000000ff00000000ULL) >> 8) | \ + (((uint64_t)(x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \ + (((uint64_t)(x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \ + (((uint64_t)(x) & (uint64_t)0xff00000000000000ULL) >> 56))) + +#endif + + + #endif /* _BYTESWAP_H */ diff -Nru xen-4.2.2/extras/mini-os/include/endian.h xen-4.3.0/extras/mini-os/include/endian.h --- xen-4.2.2/extras/mini-os/include/endian.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/endian.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,19 @@ +#ifndef _ENDIAN_H_ +#define _ENDIAN_H_ + +#define __LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 +#define __PDP_ENDIAN 3412 + +#define ARCH_ENDIAN_H +/* This will define __BYTE_ORDER for the current arch */ +#include +#undef ARCH_ENDIAN_H + +#include + +#define BYTE_ORDER __BYTE_ORDER +#define BIG_ENDIAN __BIG_ENDIAN +#define LITTLE_ENDIAN __LITTLE_ENDIAN + +#endif /* endian.h */ diff -Nru xen-4.2.2/extras/mini-os/include/events.h xen-4.3.0/extras/mini-os/include/events.h --- xen-4.2.2/extras/mini-os/include/events.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/events.h 2013-07-09 10:46:56.000000000 +0000 @@ -37,6 +37,7 @@ int evtchn_bind_interdomain(domid_t pal, evtchn_port_t remote_port, evtchn_handler_t handler, void *data, evtchn_port_t *local_port); +int evtchn_get_peercontext(evtchn_port_t local_port, char *ctx, int size); void unbind_all_ports(void); static inline int notify_remote_via_evtchn(evtchn_port_t port) diff -Nru xen-4.2.2/extras/mini-os/include/hypervisor.h xen-4.3.0/extras/mini-os/include/hypervisor.h --- xen-4.2.2/extras/mini-os/include/hypervisor.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/hypervisor.h 2013-07-09 10:46:56.000000000 +0000 @@ -7,7 +7,6 @@ * Copyright (c) 2002, K A Fraser * Copyright (c) 2005, Grzegorz Milos * Updates: Aravindh Puthiyaparambil - * Updates: Dietmar Hahn for ia64 */ #ifndef _HYPERVISOR_H_ @@ -19,8 +18,6 @@ #include #elif defined(__x86_64__) #include -#elif defined(__ia64__) -#include #else #error "Unsupported architecture" #endif diff -Nru xen-4.2.2/extras/mini-os/include/ia64/arch_limits.h xen-4.3.0/extras/mini-os/include/ia64/arch_limits.h --- xen-4.2.2/extras/mini-os/include/ia64/arch_limits.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/arch_limits.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - -#ifndef __ARCH_LIMITS_H__ -#define __ARCH_LIMITS_H__ - -/* Commonly 16K pages are used. */ -#define __PAGE_SHIFT 14 /* 16K pages */ -#define __PAGE_SIZE (1<<(__PAGE_SHIFT)) - -#define __STACK_SIZE_PAGE_ORDER 2 -#define __STACK_SIZE (__PAGE_SIZE * (1 << __STACK_SIZE_PAGE_ORDER)) - -#endif /* __ARCH_LIMITS_H__ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/arch_mm.h xen-4.3.0/extras/mini-os/include/ia64/arch_mm.h --- xen-4.2.2/extras/mini-os/include/ia64/arch_mm.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/arch_mm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2007 - Dietmar Hahn - * - **************************************************************************** - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef __ARCH_MM_H__ -#define __ARCH_MM_H__ - -#include "page.h" -#include "ia64_cpu.h" - -#define PFN_PHYS(x) (pfn_to_page(x)) -#define PHYS_PFN(x) (page_to_pfn(x)) -#define to_virt(x) __va(x) -#define to_phys(x) __pa(x) - -#define virt_to_mfn(x) virt_to_pfn(x) -#define virtual_to_mfn(x) (ia64_tpa((uint64_t)(x)) >> PAGE_SHIFT) - -#define map_frames(f, n) map_frames_ex(f, n, 1, 0, 1, DOMID_SELF, NULL, 0) -/* TODO */ -#define map_zero(n, a) map_frames_ex(NULL, n, 0, 0, a, DOMID_SELF, NULL, 0) -#define do_map_zero(start, n) ASSERT(n == 0) - -#endif /* __ARCH_MM_H__ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/arch_sched.h xen-4.3.0/extras/mini-os/include/ia64/arch_sched.h --- xen-4.2.2/extras/mini-os/include/ia64/arch_sched.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/arch_sched.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2006 Dietmar Hahn - * All rights reserved. - * - * The file contains ia64 specific scheduler declarations. - * - **************************************************************************** - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef __ARCH_SCHED_H__ -#define __ARCH_SCHED_H__ - -#include "os.h" - -struct thread; /* Only declaration */ - -struct thread_regs -{ - unsigned long unat_b; /* NaT before spilling */ - unsigned long sp; - unsigned long rp; - unsigned long pr; - unsigned long bsp; - unsigned long pfs; - unsigned long rnat; - unsigned long lc; - - unsigned long unat_a; /* NaT after spilling. */ - unsigned long r4; - unsigned long r5; - unsigned long r6; - unsigned long r7; - - unsigned long b1; - unsigned long b2; - unsigned long b3; - unsigned long b4; - unsigned long b5; - - ia64_fpreg_t f2; - ia64_fpreg_t f3; - ia64_fpreg_t f4; - ia64_fpreg_t f5; - ia64_fpreg_t f16; - ia64_fpreg_t f17; - ia64_fpreg_t f18; - ia64_fpreg_t f19; - ia64_fpreg_t f20; - ia64_fpreg_t f21; - ia64_fpreg_t f22; - ia64_fpreg_t f23; - ia64_fpreg_t f24; - ia64_fpreg_t f25; - ia64_fpreg_t f26; - ia64_fpreg_t f27; - ia64_fpreg_t f28; - ia64_fpreg_t f29; - ia64_fpreg_t f30; - ia64_fpreg_t f31; -}; - -typedef struct thread_regs thread_regs_t; - -void arch_switch_threads(struct thread* prev, struct thread* next); - -static inline struct thread* get_current(void) -{ - register struct thread *current asm("r13"); - return current; -} - - -#endif /* __ARCH_SCHED_H__ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/arch_spinlock.h xen-4.3.0/extras/mini-os/include/ia64/arch_spinlock.h --- xen-4.2.2/extras/mini-os/include/ia64/arch_spinlock.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/arch_spinlock.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - * Done by Dietmar Hahn slock), - SPIN_LOCK_UNUSED, SPIN_LOCK_USED); - } while (ret == SPIN_LOCK_USED); -} - -static inline void -_raw_spin_unlock(spinlock_t *lck) -{ - asm volatile ("st4.rel.nta [%0] = r0\n\t" :: "r"(&(lck->slock)) - : "memory" ); -} - -static inline uint32_t -_raw_spin_trylock(spinlock_t* lck) -{ - uint32_t ret; - ret = ia64_cmpxchg_acq_32(&(lck->slock), SPIN_LOCK_USED, SPIN_LOCK_USED); - return (ret == SPIN_LOCK_USED); -} - -#endif /* _ARCH_SPINLOCK_H_ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/asm.h xen-4.3.0/extras/mini-os/include/ia64/asm.h --- xen-4.2.2/extras/mini-os/include/ia64/asm.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/asm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -/* - * Done by Dietmar Hahn - * - **************************************************************************** - * Copyright (c) 1998 Doug Rabson - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef _MACHINE_ATOMIC_H_ -#define _MACHINE_ATOMIC_H_ - -/* - * Various simple arithmetic on memory which is atomic in the presence - * of interrupts and SMP safe. - */ - -#if !defined(__ASSEMBLY__) - -#include - - -/* - * Everything is built out of cmpxchg. - */ -#define IA64_CMPXCHG(sz, sem, p, cmpval, newval, ret) \ - __asm __volatile ( \ - "mov ar.ccv=%2;;\n\t" \ - "cmpxchg" #sz "." #sem " %0=%4,%3,ar.ccv\n\t" \ - : "=r" (ret), "=m" (*p) \ - : "r" (cmpval), "r" (newval), "m" (*p) \ - : "memory") - - -/* - * Some common forms of cmpxch. - */ - -static __inline uint8_t -ia64_cmpxchg_acq_8(volatile uint8_t* p, uint8_t cmpval, uint8_t newval) -{ - uint8_t ret; - - IA64_CMPXCHG(1, acq, p, cmpval, newval, ret); - return (ret); -} - -static __inline uint16_t -ia64_cmpxchg_acq_16(volatile uint16_t* p, uint16_t cmpval, uint16_t newval) -{ - uint16_t ret; - - IA64_CMPXCHG(2, acq, p, cmpval, newval, ret); - return (ret); -} - -static __inline uint32_t -ia64_cmpxchg_acq_32(volatile uint32_t* p, uint32_t cmpval, uint32_t newval) -{ - uint32_t ret; - - IA64_CMPXCHG(4, acq, p, cmpval, newval, ret); - return (ret); -} - -static __inline uint32_t -ia64_cmpxchg_rel_32(volatile uint32_t* p, uint32_t cmpval, uint32_t newval) -{ - uint32_t ret; - - IA64_CMPXCHG(4, rel, p, cmpval, newval, ret); - return (ret); -} - -static __inline uint64_t -ia64_cmpxchg_acq_64(volatile uint64_t* p, uint64_t cmpval, uint64_t newval) -{ - uint64_t ret; - - IA64_CMPXCHG(8, acq, p, cmpval, newval, ret); - return (ret); -} - -static __inline uint64_t -ia64_cmpxchg_rel_64(volatile uint64_t* p, uint64_t cmpval, uint64_t newval) -{ - uint64_t ret; - - IA64_CMPXCHG(8, rel, p, cmpval, newval, ret); - return (ret); -} - -#define ATOMIC_STORE_LOAD(type, width, size) \ -static __inline uint##width##_t \ -ia64_ld_acq_##width(volatile uint##width##_t* p) \ -{ \ - uint##width##_t v; \ - \ - __asm __volatile ("ld" size ".acq %0=%1" \ - : "=r" (v) \ - : "m" (*p) \ - : "memory"); \ - return (v); \ -} \ - \ -static __inline uint##width##_t \ -atomic_load_acq_##width(volatile uint##width##_t* p) \ -{ \ - uint##width##_t v; \ - \ - __asm __volatile ("ld" size ".acq %0=%1" \ - : "=r" (v) \ - : "m" (*p) \ - : "memory"); \ - return (v); \ -} \ - \ -static __inline uint##width##_t \ -atomic_load_acq_##type(volatile uint##width##_t* p) \ -{ \ - uint##width##_t v; \ - \ - __asm __volatile ("ld" size ".acq %0=%1" \ - : "=r" (v) \ - : "m" (*p) \ - : "memory"); \ - return (v); \ -} \ - \ -static __inline void \ -ia64_st_rel_##width(volatile uint##width##_t* p, uint##width##_t v)\ -{ \ - __asm __volatile ("st" size ".rel %0=%1" \ - : "=m" (*p) \ - : "r" (v) \ - : "memory"); \ -} \ - \ -static __inline void \ -atomic_store_rel_##width(volatile uint##width##_t* p, uint##width##_t v)\ -{ \ - __asm __volatile ("st" size ".rel %0=%1" \ - : "=m" (*p) \ - : "r" (v) \ - : "memory"); \ -} \ - \ -static __inline void \ -atomic_store_rel_##type(volatile uint##width##_t* p, uint##width##_t v)\ -{ \ - __asm __volatile ("st" size ".rel %0=%1" \ - : "=m" (*p) \ - : "r" (v) \ - : "memory"); \ -} - -ATOMIC_STORE_LOAD(char, 8, "1") -ATOMIC_STORE_LOAD(short, 16, "2") -ATOMIC_STORE_LOAD(int, 32, "4") -ATOMIC_STORE_LOAD(long, 64, "8") - -#undef ATOMIC_STORE_LOAD - -#define IA64_ATOMIC(sz, type, name, width, op) \ - \ -static __inline type \ -atomic_##name##_acq_##width(volatile type *p, type v) \ -{ \ - type old, ret; \ - do { \ - old = *p; \ - IA64_CMPXCHG(sz, acq, p, old, old op v, ret); \ - } while (ret != old); \ - return(ret); \ -} \ - \ -static __inline type \ -atomic_##name##_rel_##width(volatile type *p, type v) \ -{ \ - type old, ret; \ - do { \ - old = *p; \ - IA64_CMPXCHG(sz, rel, p, old, old op v, ret); \ - } while (ret != old); \ - return(ret); \ -} - -IA64_ATOMIC(1, uint8_t, set, 8, |) -IA64_ATOMIC(2, uint16_t, set, 16, |) -IA64_ATOMIC(4, uint32_t, set, 32, |) -IA64_ATOMIC(8, uint64_t, set, 64, |) - -IA64_ATOMIC(1, uint8_t, clear, 8, &~) -IA64_ATOMIC(2, uint16_t, clear, 16, &~) -IA64_ATOMIC(4, uint32_t, clear, 32, &~) -IA64_ATOMIC(8, uint64_t, clear, 64, &~) - -IA64_ATOMIC(1, uint8_t, add, 8, +) -IA64_ATOMIC(2, uint16_t, add, 16, +) -IA64_ATOMIC(4, uint32_t, add, 32, +) -IA64_ATOMIC(8, uint64_t, add, 64, +) - -IA64_ATOMIC(1, uint8_t, subtract, 8, -) -IA64_ATOMIC(2, uint16_t, subtract, 16, -) -IA64_ATOMIC(4, uint32_t, subtract, 32, -) -IA64_ATOMIC(8, uint64_t, subtract, 64, -) - -#undef IA64_ATOMIC -#undef IA64_CMPXCHG - -#define atomic_set_8 atomic_set_acq_8 -#define atomic_clear_8 atomic_clear_acq_8 -#define atomic_add_8 atomic_add_acq_8 -#define atomic_subtract_8 atomic_subtract_acq_8 - -#define atomic_set_16 atomic_set_acq_16 -#define atomic_clear_16 atomic_clear_acq_16 -#define atomic_add_16 atomic_add_acq_16 -#define atomic_subtract_16 atomic_subtract_acq_16 - -#define atomic_set_32 atomic_set_acq_32 -#define atomic_clear_32 atomic_clear_acq_32 -#define atomic_add_32 atomic_add_acq_32 -#define atomic_subtract_32 atomic_subtract_acq_32 - -#define atomic_set_64 atomic_set_acq_64 -#define atomic_clear_64 atomic_clear_acq_64 -#define atomic_add_64 atomic_add_acq_64 -#define atomic_subtract_64 atomic_subtract_acq_64 - -#define atomic_set_char atomic_set_8 -#define atomic_clear_char atomic_clear_8 -#define atomic_add_char atomic_add_8 -#define atomic_subtract_char atomic_subtract_8 -#define atomic_set_acq_char atomic_set_acq_8 -#define atomic_clear_acq_char atomic_clear_acq_8 -#define atomic_add_acq_char atomic_add_acq_8 -#define atomic_subtract_acq_char atomic_subtract_acq_8 -#define atomic_set_rel_char atomic_set_rel_8 -#define atomic_clear_rel_char atomic_clear_rel_8 -#define atomic_add_rel_char atomic_add_rel_8 -#define atomic_subtract_rel_char atomic_subtract_rel_8 - -#define atomic_set_short atomic_set_16 -#define atomic_clear_short atomic_clear_16 -#define atomic_add_short atomic_add_16 -#define atomic_subtract_short atomic_subtract_16 -#define atomic_set_acq_short atomic_set_acq_16 -#define atomic_clear_acq_short atomic_clear_acq_16 -#define atomic_add_acq_short atomic_add_acq_16 -#define atomic_subtract_acq_short atomic_subtract_acq_16 -#define atomic_set_rel_short atomic_set_rel_16 -#define atomic_clear_rel_short atomic_clear_rel_16 -#define atomic_add_rel_short atomic_add_rel_16 -#define atomic_subtract_rel_short atomic_subtract_rel_16 - -#define atomic_set_int atomic_set_32 -#define atomic_clear_int atomic_clear_32 -#define atomic_add_int atomic_add_32 -#define atomic_subtract_int atomic_subtract_32 -#define atomic_set_acq_int atomic_set_acq_32 -#define atomic_clear_acq_int atomic_clear_acq_32 -#define atomic_add_acq_int atomic_add_acq_32 -#define atomic_subtract_acq_int atomic_subtract_acq_32 -#define atomic_set_rel_int atomic_set_rel_32 -#define atomic_clear_rel_int atomic_clear_rel_32 -#define atomic_add_rel_int atomic_add_rel_32 -#define atomic_subtract_rel_int atomic_subtract_rel_32 - -#define atomic_set_long atomic_set_64 -#define atomic_clear_long atomic_clear_64 -#define atomic_add_long atomic_add_64 -#define atomic_subtract_long atomic_subtract_64 -#define atomic_set_acq_long atomic_set_acq_64 -#define atomic_clear_acq_long atomic_clear_acq_64 -#define atomic_add_acq_long atomic_add_acq_64 -#define atomic_subtract_acq_long atomic_subtract_acq_64 -#define atomic_set_rel_long atomic_set_rel_64 -#define atomic_clear_rel_long atomic_clear_rel_64 -#define atomic_add_rel_long atomic_add_rel_64 -#define atomic_subtract_rel_long atomic_subtract_rel_64 - -/* - * Atomically compare the value stored at *p with cmpval and if the - * two values are equal, update the value of *p with newval. Returns - * zero if the compare failed, nonzero otherwise. - */ -static __inline int -atomic_cmpset_acq_32(volatile uint32_t* p, uint32_t cmpval, uint32_t newval) -{ - return ia64_cmpxchg_acq_32(p, cmpval, newval) == cmpval; -} - -static __inline int -atomic_cmpset_rel_32(volatile uint32_t* p, uint32_t cmpval, uint32_t newval) -{ - return ia64_cmpxchg_rel_32(p, cmpval, newval) == cmpval; -} - -/* - * Atomically compare the value stored at *p with cmpval and if the - * two values are equal, update the value of *p with newval. Returns - * zero if the compare failed, nonzero otherwise. - */ -static __inline int -atomic_cmpset_acq_64(volatile uint64_t* p, uint64_t cmpval, uint64_t newval) -{ - return ia64_cmpxchg_acq_64(p, cmpval, newval) == cmpval; -} - -static __inline int -atomic_cmpset_rel_64(volatile uint64_t* p, uint64_t cmpval, uint64_t newval) -{ - return ia64_cmpxchg_rel_64(p, cmpval, newval) == cmpval; -} - -#define atomic_cmpset_32 atomic_cmpset_acq_32 -#define atomic_cmpset_64 atomic_cmpset_acq_64 -#define atomic_cmpset_int atomic_cmpset_32 -#define atomic_cmpset_long atomic_cmpset_64 -#define atomic_cmpset_acq_int atomic_cmpset_acq_32 -#define atomic_cmpset_rel_int atomic_cmpset_rel_32 -#define atomic_cmpset_acq_long atomic_cmpset_acq_64 -#define atomic_cmpset_rel_long atomic_cmpset_rel_64 - -static __inline int -atomic_cmpset_acq_ptr(volatile void *dst, void *exp, void *src) -{ - return atomic_cmpset_acq_long((volatile u_long *)dst, - (u_long)exp, (u_long)src); -} - -static __inline int -atomic_cmpset_rel_ptr(volatile void *dst, void *exp, void *src) -{ - return atomic_cmpset_rel_long((volatile u_long *)dst, - (u_long)exp, (u_long)src); -} - -#define atomic_cmpset_ptr atomic_cmpset_acq_ptr - -static __inline void * -atomic_load_acq_ptr(volatile void *p) -{ - return (void *)atomic_load_acq_long((volatile u_long *)p); -} - -static __inline void -atomic_store_rel_ptr(volatile void *p, void *v) -{ - atomic_store_rel_long((volatile u_long *)p, (u_long)v); -} - -#define IA64_ATOMIC_PTR(NAME) \ -static __inline void \ -atomic_##NAME##_ptr(volatile void *p, uintptr_t v) \ -{ \ - atomic_##NAME##_long((volatile u_long *)p, v); \ -} \ - \ -static __inline void \ -atomic_##NAME##_acq_ptr(volatile void *p, uintptr_t v) \ -{ \ - atomic_##NAME##_acq_long((volatile u_long *)p, v);\ -} \ - \ -static __inline void \ -atomic_##NAME##_rel_ptr(volatile void *p, uintptr_t v) \ -{ \ - atomic_##NAME##_rel_long((volatile u_long *)p, v);\ -} - -IA64_ATOMIC_PTR(set) -IA64_ATOMIC_PTR(clear) -IA64_ATOMIC_PTR(add) -IA64_ATOMIC_PTR(subtract) - -#undef IA64_ATOMIC_PTR - -static __inline uint32_t -atomic_readandclear_32(volatile uint32_t* p) -{ - uint32_t val; - do { - val = *p; - } while (!atomic_cmpset_32(p, val, 0)); - return val; -} - -static __inline uint64_t -atomic_readandclear_64(volatile uint64_t* p) -{ - uint64_t val; - do { - val = *p; - } while (!atomic_cmpset_64(p, val, 0)); - return val; -} - -#define atomic_readandclear_int atomic_readandclear_32 -#define atomic_readandclear_long atomic_readandclear_64 - - -/* Some bit operations */ - -static inline void -set_bit(int num, volatile void *addr) -{ - uint32_t bit, old, new; - volatile uint32_t *p; - p = (volatile uint32_t *) addr + (num >> 5); - bit = 1 << (num & 31); - do - { - old = *p; - new = old | bit; - } while(ia64_cmpxchg_acq_32(p, old, new) != old); -} - -static __inline__ void -clear_bit(int num, volatile void *addr) -{ - uint32_t mask, old, new; - volatile uint32_t *p; - p = (volatile uint32_t *) addr + (num >> 5); - mask = ~(1 << (num & 31)); - do { - old = *p; - new = old & mask; - } while (ia64_cmpxchg_acq_32(p, old, new) != old); -} - -static __inline__ int -test_bit(int num, const volatile void *addr) -{ - uint32_t val = 1; - return val & (((const volatile uint32_t *) addr)[num >> 5] >> (num & 31)); -} - -/* - * test_and_set_bit - Set a bit and return its old value - * num: Bit to set - * addr: Address to count from - */ -static inline int -test_and_set_bit (int num, volatile void *addr) -{ - uint32_t bit, old, new; - volatile uint32_t *m; - - m = (volatile uint32_t *) addr + (num >> 5); - bit = 1 << (num & 31); - do { - old = *m; - new = old | bit; - } while (ia64_cmpxchg_acq_32(m, old, new) != old); - return (old & bit) != 0; -} - -/* - * test_and_clear_bit - Clear a bit and return its old value - * num: Bit to set - * addr: Address to count from - */ -static -inline int test_and_clear_bit(int num, volatile unsigned long * addr) -{ - uint32_t bit, old, new; - volatile uint32_t* a; - - a = (volatile uint32_t *) addr + (num >> 5); - bit = ~(1 << (num & 31)); - do { - old = *a; - new = old & bit; - } while (ia64_cmpxchg_acq_32(a, old, new) != old); - return (old & ~bit) != 0; -} - - -#endif /* !defined(__ASSEMBLY__) */ - -#endif /* ! _MACHINE_ATOMIC_H_ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/efi.h xen-4.3.0/extras/mini-os/include/ia64/efi.h --- xen-4.2.2/extras/mini-os/include/ia64/efi.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/efi.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,396 +0,0 @@ -/* - * This is a short summary of declarations and definitions from different - * efi header files of Intels' EFI_Toolkit_1.10.14.62 - * used for the minimal implementation in mini-os. - * Changes: Dietmar Hahn - * - **************************************************************************** - * Copyright (C) 2001-2004, Intel Corporation. - * THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO WARRANTIES WHATSOEVER, - * INCLUDING ANY WARRANTY OF MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR - * ANY PARTICULAR PURPOSE, OR ANY WARRANTY OTHERWISE ARISING OUT OF ANY - * PROPOSAL, SPECIFICATION OR SAMPLE. Except for a limited copyright license - * to copy this specification for internal use only, no license, express or - * implied, by estoppel or otherwise, to any intellectual property rights is - * granted herein. Intel disclaims all liability, including liability for - * infringement of any proprietary rights, relating to implementation of - * information in this specification. Intel does not warrant or represent - * that such implementation(s) will not infringe such rights. Designers must - * not rely on the absence or characteristics of any features or instructions - * marked "reserved" or "undefined." Intel reserves these for future - * definition and shall have no responsibility whatsoever for conflicts or - * incompatibilities arising from future changes to them. - * This document is an intermediate draft for comment only and is subject to - * change without notice. Readers should not design products based on this - * document. - * Intel, the Intel logo, and Itanium are trademarks or registered trademarks - * of Intel Corporation or its subsidiaries in the United States and other - * countries. - * Other names and brands may be claimed as the property of others. - */ - -#ifndef _EFI_H_ -#define _EFI_H_ - -#include - - -#define EFIWARN(a) (a) -#define EFI_ERROR(a) (((int64_t) a) < 0) - - -#define EFI_SUCCESS 0 -#define EFI_LOAD_ERROR EFIERR(1) -#define EFI_INVALID_PARAMETER EFIERR(2) -#define EFI_UNSUPPORTED EFIERR(3) -#define EFI_BAD_BUFFER_SIZE EFIERR(4) -#define EFI_BUFFER_TOO_SMALL EFIERR(5) -#define EFI_NOT_READY EFIERR(6) -#define EFI_DEVICE_ERROR EFIERR(7) -#define EFI_WRITE_PROTECTED EFIERR(8) -#define EFI_OUT_OF_RESOURCES EFIERR(9) -#define EFI_VOLUME_CORRUPTED EFIERR(10) -#define EFI_VOLUME_FULL EFIERR(11) -#define EFI_NO_MEDIA EFIERR(12) -#define EFI_MEDIA_CHANGED EFIERR(13) -#define EFI_NOT_FOUND EFIERR(14) -#define EFI_ACCESS_DENIED EFIERR(15) -#define EFI_NO_RESPONSE EFIERR(16) -#define EFI_NO_MAPPING EFIERR(17) -#define EFI_TIMEOUT EFIERR(18) -#define EFI_NOT_STARTED EFIERR(19) -#define EFI_ALREADY_STARTED EFIERR(20) -#define EFI_ABORTED EFIERR(21) -#define EFI_ICMP_ERROR EFIERR(22) -#define EFI_TFTP_ERROR EFIERR(23) -#define EFI_PROTOCOL_ERROR EFIERR(24) - -#define EFI_WARN_UNKOWN_GLYPH EFIWARN(1) -#define EFI_WARN_DELETE_FAILURE EFIWARN(2) -#define EFI_WARN_WRITE_FAILURE EFIWARN(3) -#define EFI_WARN_BUFFER_TOO_SMALL EFIWARN(4) - - -typedef uint64_t efi_status_t; -typedef void* efi_handle_t; -typedef void* efi_event_t; -typedef uint16_t efi_char16_t; - - -/* - * Standard EFI table header - */ - -struct efi_table_header -{ - uint64_t Signature; - // Revision of EFI table specification, - // upper 16 bit - major revision number - // lower 16 bit - minor revision number - uint32_t Revision; - uint32_t HeaderSize; - uint32_t CRC32; - uint32_t Reserved; -}; -typedef struct efi_table_header efi_table_header_t; - -/* - * EFI Time - */ -typedef struct -{ - uint16_t Year; /* 1998 - 20XX */ - uint8_t Month; /* 1 - 12 */ - uint8_t Day; /* 1 - 31 */ - uint8_t Hour; /* 0 - 23 */ - uint8_t Minute; /* 0 - 59 */ - uint8_t Second; /* 0 - 59 */ - uint8_t Pad1; - uint32_t Nanosecond; /* 0 - 999,999,999 */ - int16_t TimeZone; /* -1440 to 1440 or 2047 */ - uint8_t Daylight; - uint8_t Pad2; -} efi_time_t; - -/* Bit definitions for efi_time_t.Daylight */ -#define EFI_TIME_ADJUST_DAYLIGHT 0x01 -#define EFI_TIME_IN_DAYLIGHT 0x02 - -/* Value definition for efi_time_t.TimeZone */ -#define EFI_UNSPECIFIED_TIMEZONE 0x07FF - - - -typedef struct -{ - uint32_t Resolution; /* 1e-6 parts per million */ - uint32_t Accuracy; /* hertz */ - uint8_t SetsToZero; /* Set clears sub-second time */ -} efi_time_capabilities_t; - - -typedef efi_status_t (*efi_get_time_t) (efi_time_t*, efi_time_capabilities_t*); -typedef efi_status_t (*efi_set_time_t) (efi_time_t*); -typedef efi_status_t (*efi_get_wakeup_time_t) (uint8_t*, uint8_t*, efi_time_t*); -typedef efi_status_t (*efi_set_wakeup_time_t) (uint8_t, efi_time_t*); - -/* - * Memory - * Preseve the attr on any range supplied. - * ConventialMemory must have WB,SR,SW when supplied. - * When allocating from ConventialMemory always make it WB,SR,SW - * When returning to ConventialMemory always make it WB,SR,SW - * When getting the memory map, or on RT for runtime types - */ - -typedef enum { - EfiReservedMemoryType, /* 0 */ - EfiLoaderCode, - EfiLoaderData, - EfiBootServicesCode, - EfiBootServicesData, - EfiRuntimeServicesCode, - EfiRuntimeServicesData, /* 6 */ - EfiConventionalMemory, /* 7 */ - EfiUnusableMemory, - EfiACPIReclaimMemory, /* 9 */ - EfiACPIMemoryNVS, /* 10, a */ - EfiMemoryMappedIO, - EfiMemoryMappedIOPortSpace, /* 12, c */ - EfiPalCode, /* 13, d */ - EfiMaxMemoryType /* 14, e */ -} efi_memory_type_t; - -/* possible caching types for the memory range */ -#define EFI_MEMORY_UC 0x0000000000000001 -#define EFI_MEMORY_WC 0x0000000000000002 -#define EFI_MEMORY_WT 0x0000000000000004 -#define EFI_MEMORY_WB 0x0000000000000008 -#define EFI_MEMORY_UCE 0x0000000000000010 -/* physical memory protection on range */ -#define EFI_MEMORY_WP 0x0000000000001000 -#define EFI_MEMORY_RP 0x0000000000002000 -#define EFI_MEMORY_XP 0x0000000000004000 -/* range requires a runtime mapping */ -#define EFI_MEMORY_RUNTIME 0x8000000000000000 - -#define EFI_MEMORY_DESCRIPTOR_VERSION 1 - -typedef uint64_t efi_phys_addr_t; -typedef uint64_t efi_virt_addr_t; - -typedef struct -{ - uint32_t Type; /* 32 bit padding */ - efi_phys_addr_t PhysicalStart; - efi_virt_addr_t VirtualStart; - uint64_t NumberOfPages; - uint64_t Attribute; -} efi_memory_descriptor_t; - -#define NextMemoryDescriptor(Ptr,Size) ((efi_memory_descriptor_t*) (((uint8_t*) Ptr) + Size)) - - -typedef efi_status_t (*efi_set_virtual_address_map_t) - ( - uint64_t MemoryMapSize, - uint64_t DescriptorSize, - uint32_t DescriptorVersion, - efi_memory_descriptor_t* VirtualMap - ); - -typedef efi_status_t (*efi_convert_pointer_t) - ( - uint64_t DebugDisposition, - void** Address - ); - -/* - * A GUID - */ - -typedef struct -{ - uint32_t Data1; - uint16_t Data2; - uint16_t Data3; - uint8_t Data4[8]; -} efi_guid_t; - -/* - * EFI Configuration Table and GUID definitions - */ - -#define MPS_TABLE_GUID \ - { 0xeb9d2d2f, 0x2d88, 0x11d3, \ - { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } } - -#define ACPI_TABLE_GUID \ - { 0xeb9d2d30, 0x2d88, 0x11d3, \ - { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } } - -#define ACPI_20_TABLE_GUID \ - { 0x8868e871, 0xe4f1, 0x11d3, \ - { 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } } - -#define SMBIOS_TABLE_GUID \ - { 0xeb9d2d31, 0x2d88, 0x11d3, \ - { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } } - -#define SAL_SYSTEM_TABLE_GUID \ - { 0xeb9d2d32, 0x2d88, 0x11d3, \ - { 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } } - -/* DIG64 Headless Console & Debug Port Table. */ -#define HCDP_TABLE_GUID \ - {0xf951938d, 0x620b, 0x42ef, \ - {0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98 } } - - -typedef struct efi_configuration_table -{ - efi_guid_t VendorGuid; - void* VendorTable; -} efi_configuration_table_t; - - -/* - * EFI platform variables - */ - -#define EFI_GLOBAL_VARIABLE \ - { 0x8BE4DF61, 0x93CA, 0x11d2, 0xAA, 0x0D, 0x00, \ - 0xE0, 0x98, 0x03, 0x2B, 0x8C } - -/* Variable attributes */ -#define EFI_VARIABLE_NON_VOLATILE 0x00000001 -#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 -#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 - -/* Variable size limitation */ -#define EFI_MAXIMUM_VARIABLE_SIZE 1024 - -typedef efi_status_t (*efi_get_variable_t) - ( - efi_char16_t* VariableName, - efi_guid_t *VendorGuid, - uint32_t* Attributes, - uint64_t* DataSize, - void* Data - ); - -typedef -efi_status_t (*efi_get_next_variable_name_t) - ( - uint64_t* VariableNameSize, - efi_char16_t* VariableName, - efi_guid_t* VendorGuid - ); - -typedef efi_status_t (*efi_set_variable_t) - ( - efi_char16_t* VariableName, - efi_guid_t* VendorGuid, - uint32_t Attributes, - uint64_t DataSize, - void* Data - ); - -/* - * Misc - */ - -typedef enum -{ - EfiResetCold, - EfiResetWarm, - EfiResetShutdown -} efi_reset_type_t; - - -typedef efi_status_t (*efi_reset_system_t) - ( - efi_reset_type_t ResetType, - efi_status_t ResetStatus, - uint64_t DataSize, - efi_char16_t* ResetData - ); - -typedef efi_status_t (*efi_get_next_high_mono_count_t) (uint32_t* HighCount); - - -/* - * EFI Runtime Serivces Table - */ - -#define EFI_RUNTIME_SERVICES_SIGNATURE 0x5652453544e5552ULL -#define EFI_RUNTIME_SERVICES_REVISION ((EFI_SPECIFICATION_MAJOR_REVISION<<16) \ - | (EFI_SPECIFICATION_MINOR_REVISION)) - -typedef struct -{ - efi_table_header_t Hdr; - /* Time services */ - efi_get_time_t GetTime; - efi_set_time_t SetTime; - efi_get_wakeup_time_t GetWakeupTime; - efi_set_wakeup_time_t SetWakeupTime; - /* Virtual memory services */ - efi_set_virtual_address_map_t SetVirtualAddressMap; - efi_convert_pointer_t ConvertPointer; - /* Variable serviers */ - efi_get_variable_t GetVariable; - efi_get_next_variable_name_t GetNextVariableName; - efi_set_variable_t SetVariable; - /* Misc */ - efi_get_next_high_mono_count_t GetNextHighMonotonicCount; - efi_reset_system_t ResetSystem; - -} efi_runtime_services_t; - - -#define EFI_SPECIFICATION_MAJOR_REVISION 1 -#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 -#define EFI_SYSTEM_TABLE_REVISION ((EFI_SPECIFICATION_MAJOR_REVISION<<16) \ - | (EFI_SPECIFICATION_MINOR_REVISION)) - -struct efi_system_table -{ - efi_table_header_t Hdr; - - uint64_t FirmwareVendor; // phys addr of CHAR16 - uint32_t FirmwareRevision; // Firmware vendor specific - - efi_handle_t ConsoleInHandle; - uint64_t ConIn; - - efi_handle_t ConsoleOutHandle; - uint64_t ConOut; - - efi_handle_t StandardErrorHandle; - uint64_t StdErr; - - uint64_t RuntimeServices; // phys addr - uint64_t BootServices; // phys addr - - uint64_t NumberOfTableEntries; // Number of entries in Config - uint64_t ConfigurationTable; // phys addr of ConfigTable -}; - -typedef struct efi_system_table efi_system_table_t; - - -#define EFI_PAGE_SIZE 4096 -#define EFI_PAGE_MASK 0xFFF -#define EFI_PAGE_SHIFT 12 - -#define EFI_SIZE_TO_PAGES(a) \ - ( ((a) >> EFI_PAGE_SHIFT) + ((a) & EFI_PAGE_MASK ? 1 : 0) ) - - -void init_efi(void); -int efi_get_time(efi_time_t* tmP); -efi_status_t ia64_call_efi_physical(void *, ...); - - -#endif /* _EFI_H_ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/hypercall-ia64.h xen-4.3.0/extras/mini-os/include/ia64/hypercall-ia64.h --- xen-4.2.2/extras/mini-os/include/ia64/hypercall-ia64.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/hypercall-ia64.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -/****************************************************************************** - * hypercall.h - * - * Mini-OS-specific hypervisor handling for ia64. - * - * Copyright (c) 2002-2004, K A Fraser - * Changes: Dietmar Hahn - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version 2 - * as published by the Free Software Foundation; or, when distributed - * separately from the Linux kernel or incorporated into other - * software packages, subject to the following license: - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this source file (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, copy, modify, - * merge, publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#ifndef __HYPERCALL_H__ -#define __HYPERCALL_H__ - -#include -#include -#include - -#ifndef _HYPERVISOR_H_ -# error "please don't include this file directly" -#endif - -// See linux/compiler.h -#define likely(x) __builtin_expect(!!(x), 1) -#define unlikely(x) __builtin_expect(!!(x), 0) - -extern unsigned long __hypercall(unsigned long a1, unsigned long a2, - unsigned long a3, unsigned long a4, - unsigned long a5, unsigned long cmd); -/* - * Assembler stubs for hyper-calls. - */ - -#define _hypercall0(type, name) \ -({ \ - long __res; \ - __res = __hypercall(0, 0, 0, 0, 0, \ - __HYPERVISOR_##name); \ - (type)__res; \ -}) - -#define _hypercall1(type, name, a1) \ -({ \ - long __res; \ - __res = __hypercall((unsigned long)a1, \ - 0, 0, 0, 0, __HYPERVISOR_##name); \ - (type)__res; \ -}) - -#define _hypercall2(type, name, a1, a2) \ -({ \ - long __res; \ - __res = __hypercall((unsigned long)a1, \ - (unsigned long)a2, \ - 0, 0, 0, __HYPERVISOR_##name); \ - (type)__res; \ -}) - -#define _hypercall3(type, name, a1, a2, a3) \ -({ \ - long __res; \ - __res = __hypercall((unsigned long)a1, \ - (unsigned long)a2, \ - (unsigned long)a3, \ - 0, 0, __HYPERVISOR_##name); \ - (type)__res; \ -}) - -#define _hypercall4(type, name, a1, a2, a3, a4) \ -({ \ - long __res; \ - __res = __hypercall((unsigned long)a1, \ - (unsigned long)a2, \ - (unsigned long)a3, \ - (unsigned long)a4, \ - 0, __HYPERVISOR_##name); \ - (type)__res; \ -}) - -#define _hypercall5(type, name, a1, a2, a3, a4, a5) \ -({ \ - long __res; \ - __res = __hypercall((unsigned long)a1, \ - (unsigned long)a2, \ - (unsigned long)a3, \ - (unsigned long)a4, \ - (unsigned long)a5, \ - __HYPERVISOR_##name); \ - (type)__res; \ -}) - - -int HYPERVISOR_event_channel_op(int cmd, void *arg); - -int HYPERVISOR_xen_version(int cmd, void *arg); - -int HYPERVISOR_console_io(int cmd, int count, char *str); - -int HYPERVISOR_sched_op_compat(int cmd, unsigned long arg); - -int HYPERVISOR_sched_op(int cmd, void *arg); - -int HYPERVISOR_callback_op(int cmd, void *arg); - -int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count); - -int HYPERVISOR_opt_feature(void *arg); - -int HYPERVISOR_suspend(unsigned long srec); - -int HYPERVISOR_shutdown(unsigned int reason); - -#endif /* __HYPERCALL_H__ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/ia64_cpu.h xen-4.3.0/extras/mini-os/include/ia64/ia64_cpu.h --- xen-4.2.2/extras/mini-os/include/ia64/ia64_cpu.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/ia64_cpu.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,738 +0,0 @@ -/* - * Done by Dietmar Hahn - * This code is mostly taken from FreeBSD. - * - * - **************************************************************************** - * Copyright (c) 2000 Doug Rabson - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#ifndef _IA64_CPU_H_ -#define _IA64_CPU_H_ - -#include "ia64_fpu.h" - -/* - * Definition of Region Register bits (RR) - * - * RR bit field positions - */ -#define IA64_RR_VE 0 -#define IA64_RR_MBZ0 1 -#define IA64_RR_PS 2 -#define IA64_RR_PS_LEN 6 -#define IA64_RR_RID 8 -#define IA64_RR_RID_LEN 24 -#define IA64_RR_MBZ1 32 - -#define IA64_RR_IDX_POS 61 - -#define IA64_RR_VAL(size,rid) (((size) << IA64_RR_PS) | ((rid) << IA64_RR_RID)) - -/* - * Define Protection Key Register (PKR) - * - * PKR bit field positions - */ -#define IA64_PKR_V 0 -#define IA64_PKR_WD 1 -#define IA64_PKR_RD 2 -#define IA64_PKR_XD 3 -#define IA64_PKR_MBZ0 4 -#define IA64_PKR_KEY 8 -#define IA64_PKR_KEY_LEN 24 -#define IA64_PKR_MBZ1 32 - -#define IA64_PKR_VALID (1 << IA64_PKR_V) - - -/* - * ITIR bit field positions - */ - -#define IA64_ITIR_MBZ0 0 -#define IA64_ITIR_PS 2 -#define IA64_ITIR_PS_LEN 6 -#define IA64_ITIR_KEY 8 -#define IA64_ITIR_KEY_LEN 24 -#define IA64_ITIR_MBZ1 32 -#define IA64_ITIR_MBZ1_LEN 16 -#define IA64_ITIR_PPN 48 -#define IA64_ITIR_PPN_LEN 15 -#define IA64_ITIR_MBZ2 63 - -/* - * Definition of PSR and IPSR bits. - */ -#define IA64_PSR_BE 0x0000000000000002 -#define IA64_PSR_UP 0x0000000000000004 -#define IA64_PSR_AC 0x0000000000000008 -#define IA64_PSR_MFL 0x0000000000000010 -#define IA64_PSR_MFH_BIT 5 -#define IA64_PSR_MFH (1 << IA64_PSR_MFH_BIT) -#define IA64_PSR_UMASK (IA64_PSR_BE | IA64_PSR_UP | \ - IA64_PSR_AC | IA64_PSR_MFL | \ - IA64_PSR_MFH) -#define IA64_PSR_IC_BIT 13 -#define IA64_PSR_IC (1<func) -#define FDESC_GP(fn) (((struct ia64_fdesc *) fn)->gp) - - -/* - * Various special ia64 instructions. - */ - -/* - * Memory Fence. - */ -static __inline void -ia64_mf(void) -{ - __asm __volatile("mf" ::: "memory"); -} - -static __inline void -ia64_mf_a(void) -{ - __asm __volatile("mf.a"); -} - -/* - * Flush Cache. - */ -static __inline void -ia64_fc(uint64_t va) -{ - __asm __volatile("fc %0" :: "r"(va)); -} - -/* - * Sync instruction stream. - */ -static __inline void -ia64_sync_i(void) -{ - __asm __volatile("sync.i"); -} - -/* - * Calculate address in VHPT for va. - */ -static __inline uint64_t -ia64_thash(uint64_t va) -{ - uint64_t result; - __asm __volatile("thash %0=%1" : "=r" (result) : "r" (va)); - return result; -} - -/* - * Calculate VHPT tag for va. - */ -static __inline uint64_t -ia64_ttag(uint64_t va) -{ - uint64_t result; - __asm __volatile("ttag %0=%1" : "=r" (result) : "r" (va)); - return result; -} - -/* - * Convert virtual address to physical. - */ -static __inline uint64_t -ia64_tpa(uint64_t va) -{ - uint64_t result; - __asm __volatile("tpa %0=%1" : "=r" (result) : "r" (va)); - return result; -} - -/* - * Generate a ptc.e instruction. - */ -static __inline void -ia64_ptc_e(uint64_t v) -{ - __asm __volatile("ptc.e %0;; srlz.d;;" :: "r"(v)); -} - -/* - * Generate a ptc.g instruction. - */ -static __inline void -ia64_ptc_g(uint64_t va, uint64_t size) -{ - __asm __volatile("ptc.g %0,%1;; srlz.d;;" :: "r"(va), "r"(size<<2)); -} - -/* - * Generate a ptc.ga instruction. - */ -static __inline void -ia64_ptc_ga(uint64_t va, uint64_t size) -{ - __asm __volatile("ptc.ga %0,%1;; srlz.d;;" :: "r"(va), "r"(size<<2)); -} - -/* - * Generate a ptc.l instruction. - */ -static __inline void -ia64_ptc_l(uint64_t va, uint64_t size) -{ - __asm __volatile("ptc.l %0,%1;; srlz.d;;" :: "r"(va), "r"(size<<2)); -} - -/* - * Read the value of psr. - */ -static __inline uint64_t -ia64_get_psr(void) -{ - uint64_t result; - __asm __volatile("mov %0=psr;;" : "=r" (result)); - return result; -} - -static __inline void -ia64_set_psr(uint64_t v) -{ - __asm __volatile("mov psr.l=%0" :: "r" (v)); -} - -static __inline void -ia64_srlz_d(void) -{ - __asm __volatile("srlz.d;;"); -} - -static __inline void -disable_intr(void) -{ - __asm __volatile ("rsm psr.ic|psr.i"); -} - -static __inline void -enable_intr(void) -{ - __asm __volatile ("ssm psr.ic|psr.i"); -} - -/* - * Define accessors for application registers. - */ - -#define IA64_AR(name) \ - \ -static __inline uint64_t \ -ia64_get_##name(void) \ -{ \ - uint64_t result; \ - __asm __volatile(";;mov %0=ar." #name ";;" : "=r" (result)); \ - return result; \ -} \ - \ -static __inline void \ -ia64_set_##name(uint64_t v) \ -{ \ - __asm __volatile("mov ar." #name "=%0" :: "r" (v)); \ -} - -IA64_AR(k0) -IA64_AR(k1) -IA64_AR(k2) -IA64_AR(k3) -IA64_AR(k4) -IA64_AR(k5) -IA64_AR(k6) -IA64_AR(k7) - -IA64_AR(rsc) -IA64_AR(bsp) -IA64_AR(bspstore) -IA64_AR(rnat) - -IA64_AR(fcr) - -IA64_AR(eflag) -IA64_AR(csd) -IA64_AR(ssd) -IA64_AR(cflg) -IA64_AR(fsr) -IA64_AR(fir) -IA64_AR(fdr) - -IA64_AR(ccv) - -IA64_AR(unat) - -IA64_AR(fpsr) - -IA64_AR(itc) - -IA64_AR(pfs) -IA64_AR(lc) -IA64_AR(ec) - -/* - * Define accessors for control registers. - */ - -#define IA64_CR(name) \ - \ -static __inline uint64_t \ -ia64_get_##name(void) \ -{ \ - uint64_t result; \ - __asm __volatile("mov %0=cr." #name : "=r" (result)); \ - return result; \ -} \ - \ -static __inline void \ -ia64_set_##name(uint64_t v) \ -{ \ - __asm __volatile("mov cr." #name "=%0" :: "r" (v)); \ -} - -IA64_CR(dcr) -IA64_CR(itm) -IA64_CR(iva) - -IA64_CR(pta) - -IA64_CR(ipsr) -IA64_CR(isr) - -IA64_CR(iip) -IA64_CR(ifa) -IA64_CR(itir) -IA64_CR(iipa) -IA64_CR(ifs) -IA64_CR(iim) -IA64_CR(iha) - -IA64_CR(lid) -IA64_CR(ivr) -IA64_CR(tpr) -IA64_CR(eoi) -IA64_CR(irr0) -IA64_CR(irr1) -IA64_CR(irr2) -IA64_CR(irr3) -IA64_CR(itv) -IA64_CR(pmv) -IA64_CR(cmcv) - -IA64_CR(lrr0) -IA64_CR(lrr1) - -#define IA64_GR(name) \ - \ -static __inline uint64_t \ -ia64_get_##name(void) \ -{ \ - uint64_t result; \ - __asm __volatile("mov %0=" #name : "=r" (result)); \ - return result; \ -} \ - \ -static __inline void \ -ia64_set_##name(uint64_t v) \ -{ \ - __asm __volatile("mov " #name "=%0" :: "r" (v)); \ -} - -IA64_GR(sp) -IA64_GR(b0) -IA64_GR(r13) // tp - - -/* - * Write a region register. - */ -static __inline void -ia64_set_rr(uint64_t rrbase, uint64_t v) -{ - __asm __volatile("mov rr[%0]=%1;; srlz.d;;" - :: "r"(rrbase), "r"(v) : "memory"); -} - -/* - * Read a region register. - */ -static __inline uint64_t -ia64_get_rr(uint64_t rrbase) -{ - uint64_t v; - __asm __volatile("mov %1=rr[%0];;" - : "=r" (v) : "r"(rrbase) : "memory"); - return v; -} - - -/* - * Read a CPUID register. - */ -static __inline uint64_t -ia64_get_cpuid(int i) -{ - uint64_t result; - __asm __volatile("mov %0=cpuid[%1]" - : "=r" (result) : "r"(i)); - return result; -} - - -struct trap_frame -{ - uint64_t rsc; - uint64_t ndirty; /* number of dirty regs */ - uint64_t ssd; - uint64_t iip; /* interrupted ip */ - uint64_t ipsr; /* interrupted psr */ - uint64_t ifs; /* interruption func status register */ - - uint16_t trap_num; /* Trap num, index in trap_vec */ - uint64_t cfm; /* current frame marker */ - uint64_t pfs; /* previous function state ar64 */ - uint64_t bsp; /* backing store pointer ar17 */ - uint64_t rnat; /* rse nat collection ar19 */ - uint64_t csd; /* comp and store data reg ar25 */ - uint64_t ccv; /* comp and xchange val reg ar32 */ - uint64_t unat; /* */ - uint64_t fpsr; /* floating point state reg ar40 */ - uint64_t pr; /* predicate regs 0-63 */ - - uint64_t gp; /* the gp pointer */ - uint64_t sp; /* stack pointer */ - uint64_t tp; /* thread pointer */ - - uint64_t r2; /* global reg 2 */ - uint64_t r3; - uint64_t r8; - uint64_t r9; - uint64_t r10; - uint64_t r11; - uint64_t r14; - uint64_t r15; - uint64_t r16; - uint64_t r17; - uint64_t r18; - uint64_t r19; - uint64_t r20; - uint64_t r21; - uint64_t r22; - uint64_t r23; - uint64_t r24; - uint64_t r25; - uint64_t r26; - uint64_t r27; - uint64_t r28; - uint64_t r29; - uint64_t r30; - uint64_t r31; - - uint64_t b0; - uint64_t b6; - uint64_t b7; - - ia64_fpreg_t f6; /* floating point register 6 */ - ia64_fpreg_t f7; - ia64_fpreg_t f8; - ia64_fpreg_t f9; - ia64_fpreg_t f10; - ia64_fpreg_t f11; - - uint64_t ifa; /* interruption faulting address */ - uint64_t isr; /* interruption status register */ - uint64_t iim; /* interruption immediate register */ -}; - -typedef struct trap_frame trap_frame_t; - - -#endif /* __ASSEMBLY__ */ - -/* Page access parameters. */ -#define PTE_P_SHIFT 0 -#define PTE_P 1 - -#define PTE_MA_SHIFT 2 -#define PTE_MA_WB 0 - -#define PTE_A_SHIFT 5 -#define PTE_A 1 -#define PTE_D_SHIFT 6 -#define PTE_D 1 - -#define PTE_AR_SHIFT 9 -#define PTE_AR_R 0 -#define PTE_AR_RX 1 -#define PTE_AR_RW 2 -#define PTE_AR_RWX 3 -#define PTE_AR_R_RW 4 -#define PTE_AR_RX_RWX 5 -#define PTE_AR_RWX_RW 6 -/* privilege level */ -#define PTE_PL_SHIFT 7 -#define PTE_PL_KERN 0 /* used for kernel */ -/* page size */ -#define PTE_PS_4K 12 -#define PTE_PS_8K 13 -#define PTE_PS_16K 14 -#define PTE_PS_64K 16 -#define PTE_PS_256K 18 -#define PTE_PS_1M 20 -#define PTE_PS_4M 22 -#define PTE_PS_16M 24 -#define PTE_PS_64M 26 -#define PTE_PS_256M 28 - - - /* Some offsets for ia64_pte_t. */ -#define PTE_OFF_P 0 -#define PTE_OFF_MA 3 -#define PTE_OFF_A 5 -#define PTE_OFF_D 6 -#define PTE_OFF_PL 7 -#define PTE_OFF_AR 9 -#define PTE_OFF_PPN 12 -#define PTE_OFF_ED 52 - -#if !defined(_ASM) && !defined(__ASSEMBLY__) -/* - * A short-format VHPT entry. Also matches the TLB insertion format. - */ -typedef struct -{ - uint64_t pte_p :1; /* bits 0..0 */ - uint64_t pte_rv1:1; /* bits 1..1 */ - uint64_t pte_ma :3; /* bits 2..4 */ - uint64_t pte_a :1; /* bits 5..5 */ - uint64_t pte_d :1; /* bits 6..6 */ - uint64_t pte_pl :2; /* bits 7..8 */ - uint64_t pte_ar :3; /* bits 9..11 */ - uint64_t pte_ppn:38; /* bits 12..49 */ - uint64_t pte_rv2:2; /* bits 50..51 */ - uint64_t pte_ed :1; /* bits 52..52 */ - uint64_t pte_ig :11; /* bits 53..63 */ -} ia64_pte_t; - - -/* - * A long-format VHPT entry. - */ -typedef struct -{ - uint64_t pte_p :1; /* bits 0..0 */ - uint64_t pte_rv1 :1; /* bits 1..1 */ - uint64_t pte_ma :3; /* bits 2..4 */ - uint64_t pte_a :1; /* bits 5..5 */ - uint64_t pte_d :1; /* bits 6..6 */ - uint64_t pte_pl :2; /* bits 7..8 */ - uint64_t pte_ar :3; /* bits 9..11 */ - uint64_t pte_ppn :38; /* bits 12..49 */ - uint64_t pte_rv2 :2; /* bits 50..51 */ - uint64_t pte_ed :1; /* bits 52..52 */ - uint64_t pte_ig :11; /* bits 53..63 */ - uint64_t pte_rv3 :2; /* bits 0..1 */ - uint64_t pte_ps :6; /* bits 2..7 */ - uint64_t pte_key :24; /* bits 8..31 */ - uint64_t pte_rv4 :32; /* bits 32..63 */ - uint64_t pte_tag; /* includes ti */ - uint64_t pte_chain; /* pa of collision chain */ -} ia64_lpte_t; - -#endif /* __ASSEMBLY__ */ - -#endif /* _IA64_CPU_H_ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/ia64_fpu.h xen-4.3.0/extras/mini-os/include/ia64/ia64_fpu.h --- xen-4.2.2/extras/mini-os/include/ia64/ia64_fpu.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/ia64_fpu.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -/* - * Done by Dietmar Hahn - * This code is mostly taken from FreeBSD. - * - **************************************************************************** - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#ifndef _IA64_FPU_H_ -#define _IA64_FPU_H_ - -#include "os.h" - -/* - * Floating point status register bits. - */ -#define IA64_FPSR_TRAP_VD UL_CONST(0x0000000000000001) -#define IA64_FPSR_TRAP_DD UL_CONST(0x0000000000000002) -#define IA64_FPSR_TRAP_ZD UL_CONST(0x0000000000000004) -#define IA64_FPSR_TRAP_OD UL_CONST(0x0000000000000008) -#define IA64_FPSR_TRAP_UD UL_CONST(0x0000000000000010) -#define IA64_FPSR_TRAP_ID UL_CONST(0x0000000000000020) -#define IA64_FPSR_SF(i,v) ((v) << ((i)*13+6)) - -#define IA64_SF_FTZ UL_CONST(0x0001) -#define IA64_SF_WRE UL_CONST(0x0002) -#define IA64_SF_PC UL_CONST(0x000c) -#define IA64_SF_PC_0 UL_CONST(0x0000) -#define IA64_SF_PC_1 UL_CONST(0x0004) -#define IA64_SF_PC_2 UL_CONST(0x0008) -#define IA64_SF_PC_3 UL_CONST(0x000c) -#define IA64_SF_RC UL_CONST(0x0030) -#define IA64_SF_RC_NEAREST UL_CONST(0x0000) -#define IA64_SF_RC_NEGINF UL_CONST(0x0010) -#define IA64_SF_RC_POSINF UL_CONST(0x0020) -#define IA64_SF_RC_TRUNC UL_CONST(0x0030) -#define IA64_SF_TD UL_CONST(0x0040) -#define IA64_SF_V UL_CONST(0x0080) -#define IA64_SF_D UL_CONST(0x0100) -#define IA64_SF_Z UL_CONST(0x0200) -#define IA64_SF_O UL_CONST(0x0400) -#define IA64_SF_U UL_CONST(0x0800) -#define IA64_SF_I UL_CONST(0x1000) - -#define IA64_SF_DEFAULT (IA64_SF_PC_3 | IA64_SF_RC_NEAREST) - -#define IA64_FPSR_DEFAULT (IA64_FPSR_TRAP_VD \ - | IA64_FPSR_TRAP_DD \ - | IA64_FPSR_TRAP_ZD \ - | IA64_FPSR_TRAP_OD \ - | IA64_FPSR_TRAP_UD \ - | IA64_FPSR_TRAP_ID \ - | IA64_FPSR_SF(0, IA64_SF_DEFAULT) \ - | IA64_FPSR_SF(1, (IA64_SF_DEFAULT \ - | IA64_SF_TD \ - | IA64_SF_WRE)) \ - | IA64_FPSR_SF(2, (IA64_SF_DEFAULT \ - | IA64_SF_TD)) \ - | IA64_FPSR_SF(3, (IA64_SF_DEFAULT \ - | IA64_SF_TD))) - - -#ifndef __ASSEMBLY__ - - /* This is from sys/cdefs.h in FreeBSD */ -#define __aligned(x) __attribute__((__aligned__(x))) - - /* A single Floating Point register. */ -struct ia64_fpreg -{ - uint8_t fpr_bits[16]; -} __aligned(16); - -typedef struct ia64_fpreg ia64_fpreg_t; - -#endif /* __ASSEMBLY__ */ - -#endif /* _IA64_FPU_H_ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/os.h xen-4.3.0/extras/mini-os/include/ia64/os.h --- xen-4.2.2/extras/mini-os/include/ia64/os.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/os.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,295 +0,0 @@ -/* - * Copyright (C) 2007 - Dietmar Hahn - * - **************************************************************************** - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - - -#if !defined(__OS_H__) -#define __OS_H__ - -#if !defined(__ASSEMBLY__) - -#include -#include "ia64_cpu.h" -#include "atomic.h" -#include "efi.h" -#include "sal.h" -#include "pal.h" -#include -#include - - -typedef uint64_t paddr_t; /* Physical address. */ -#ifndef HAVE_LIBC -typedef uint64_t caddr_t; /* rr7/kernel memory address. */ -#endif - -#include "page.h" -#include "mm.h" - - -void arch_init(start_info_t *si); /* in common.c */ -void arch_print_info(void); /* in common.c */ -void arch_fini(void); - - -/* Size of xen_ia64_boot_param.command_line */ -#define COMMAND_LINE_SIZE 512 - -extern struct xen_ia64_boot_param* ia64_boot_paramP; -extern struct xen_ia64_boot_param ia64BootParamG; -extern char boot_cmd_line[]; -extern efi_system_table_t* efiSysTableP; -extern int bootverbose; - -extern void ia64_probe_sapics(void); - - - -/* Contains the needed stuff from efi. */ -struct efi -{ - - efi_system_table_t* efiSysTableP; - efi_set_virtual_address_map_t setVirtAddrMapF; - efi_get_time_t getTimeF; - efi_reset_system_t resetSystemF; - -}; - -struct machine_fw -{ - struct efi efi; - - uint64_t ia64_port_base; /* physical address */ - uint64_t ia64_pal_base; /* virtual rr7 address */ - - sal_system_table_t* ia64_sal_tableP; - sal_entry_t* ia64_sal_entryP; /* SAL_PROC entrypoint */ - - uint64_t ia64_efi_acpi_table; /* physical address */ - uint64_t ia64_efi_acpi20_table; /* physical address */ - - uint64_t mach_mem_start; /* phys start addr of machine memory */ - uint64_t mach_mem_size; /* size of machine memory */ - - uint64_t kernstart; /* virt address of kern text start */ - uint64_t kernend; - uint64_t kernpstart; /* phys address of kern text start */ - uint64_t kernpend; -}; - -extern struct machine_fw machineFwG; - -#define ia64_sal_entry machineFwG.ia64_sal_entryP - -#define smp_processor_id() 0 - -static inline uint64_t -xchg8(uint64_t* ptr, uint64_t x) \ -{ - uint64_t oldVal; - asm volatile ("xchg8 %0=[%1],%2" : "=r" (oldVal) - : "r" (ptr), "r" (x) : "memory"); - return oldVal; -} -#define xchg xchg8 - -// Counts the number of 1-bits in x. -#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -# define get_popcnt(x) __builtin_popcountl(x) -#else -# define get_popcnt(x) \ - ({ \ - uint64_t num; \ - asm ("popcnt %0=%1" : "=r" (num) : "r" (x)); \ - num; \ - }) -#endif - -/** - * __ffs - find first bit in word. - * @x: The word to search - * - * Undefined if no bit exists, so code should check against 0 first. - */ -static inline unsigned long -__ffs (unsigned long x) -{ - unsigned long result; - - result = get_popcnt((x-1) & ~x); - return result; -} - - -static inline void -synch_clear_bit(int num, volatile void *addr) -{ - clear_bit(num, addr); -} - -static inline void -synch_set_bit(int num, volatile void *addr) -{ - set_bit(num, addr); -} - -static inline int -synch_test_bit(int nr, const volatile void *addr) -{ - return test_bit(nr, addr); -} - -static inline int -synch_test_and_set_bit(int num, volatile void * addr) -{ - return test_and_set_bit(num, addr); -} - - -#define synch_cmpxchg(ptr, old, new) \ -((__typeof__(*(ptr)))__synch_cmpxchg((ptr),\ - (unsigned long)(old), \ - (unsigned long)(new), \ - sizeof(*(ptr)))) - -static inline unsigned long -__synch_cmpxchg(volatile void *ptr, uint64_t old, uint64_t new, int size) -{ - switch (size) - { - case 1: - return ia64_cmpxchg_acq_8(ptr, old, new); - case 2: - return ia64_cmpxchg_acq_16(ptr, old, new); - case 4: - return ia64_cmpxchg_acq_32(ptr, old, new); - case 8: - return ia64_cmpxchg_acq_64(ptr, old, new); - } - return ia64_cmpxchg_acq_64(ptr, old, new); -} - -extern shared_info_t *HYPERVISOR_shared_info; - - -/* - * This code is from the originally os.h and should be put in a - * common header file! - */ - -/* - * The use of 'barrier' in the following reflects their use as local-lock - * operations. Reentrancy must be prevented (e.g., __cli()) /before/ following - * critical operations are executed. All critical operations must complete - * /before/ reentrancy is permitted (e.g., __sti()). Alpha architecture also - * includes these barriers, for example. - */ - -#define __cli() \ -do { \ - vcpu_info_t *_vcpu; \ - _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - _vcpu->evtchn_upcall_mask = 1; \ - barrier(); \ -} while (0) - -#define __sti() \ -do { \ - vcpu_info_t *_vcpu; \ - barrier(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - _vcpu->evtchn_upcall_mask = 0; \ - barrier(); /* unmask then check (avoid races) */ \ - if (unlikely(_vcpu->evtchn_upcall_pending)) \ - force_evtchn_callback(); \ -} while (0) - -#define __save_flags(x) \ -do { \ - vcpu_info_t *_vcpu; \ - _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - (x) = _vcpu->evtchn_upcall_mask; \ -} while (0) - -#define __restore_flags(x) \ -do { \ - vcpu_info_t *_vcpu; \ - barrier(); \ - _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - if ((_vcpu->evtchn_upcall_mask = (x)) == 0) { \ - barrier(); /* unmask then check (avoid races) */ \ - if ( unlikely(_vcpu->evtchn_upcall_pending) ) \ - force_evtchn_callback(); \ - }\ -} while (0) - -#define safe_halt() ((void)0) - -#define __save_and_cli(x) \ -do { \ - vcpu_info_t *_vcpu; \ - _vcpu = &HYPERVISOR_shared_info->vcpu_info[smp_processor_id()]; \ - (x) = _vcpu->evtchn_upcall_mask; \ - _vcpu->evtchn_upcall_mask = 1; \ - barrier(); \ -} while (0) - -#define local_irq_save(x) __save_and_cli(x) -#define local_irq_restore(x) __restore_flags(x) -#define local_save_flags(x) __save_flags(x) -#define local_irq_disable() __cli() -#define local_irq_enable() __sti() - -#define irqs_disabled() \ - (HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].evtchn_upcall_mask) - -/* This is a barrier for the compiler only, NOT the processor! */ -#define barrier() __asm__ __volatile__("": : :"memory") - -#define mb() ia64_mf() -#define rmb() mb() -#define wmb() mb() - - -#define BUG() \ - { printk("mini-os BUG at %s:%d!\n", __FILE__, __LINE__); do_exit(); } - -#define PRINT_BV(_fmt, _params...) \ - if (bootverbose) \ - printk(_fmt , ## _params) - -#endif /* !defined(__ASSEMBLY__) */ - -#if defined(__ASSEMBLY__) - -#define UL_CONST(x) x -#define UL_TYPE(x) x - -#else /* defined(__ASSEMBLY__) */ - -#define UL_CONST(x) x##UL -#define UL_TYPE(x) ((uint64_t)x) - -#endif /* defined(__ASSEMBLY__) */ - -#endif /* !defined(__OS_H__) */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/page.h xen-4.3.0/extras/mini-os/include/ia64/page.h --- xen-4.2.2/extras/mini-os/include/ia64/page.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/page.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -/* - * Done by Dietmar Hahn - * Common stuff for memory and page handling. - * Parts are taken from FreeBSD. - * - **************************************************************************** - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - - -#if !defined(_PAGE_H_) -#define _PAGE_H_ - -#include "os.h" -#include "ia64_cpu.h" - -#define PTE_KERNEL_ATTR ((PTE_P<> 61) - -#define IA64_PHYS_TO_RR5(x) ((x) | IA64_RR_BASE(5)) -#define IA64_PHYS_TO_RR7(x) ((x) | IA64_RR_BASE(7)) - -#define __pa(x) IA64_RR_MASK(x) -#define __va(x) IA64_PHYS_TO_RR7(x) - -#define roundup_page(x) ((((unsigned long)(x)) + PAGE_SIZE -1) & PAGE_MASK) -#define trunc_page(x) ((unsigned long)(x) & PAGE_MASK) - - -#if !defined(__ASSEMBLY__) - -/* Contains the parts of the physically memory. */ -extern paddr_t phys_avail[]; - -#define page_to_pfn(page) ((uint64_t)(page) >> PAGE_SHIFT) -#define pfn_to_page(pfn) ((uint64_t)pfn << PAGE_SHIFT) -/* Get phyiscal address of page of virtual address. */ -#define virt_to_page(addr) ((uint64_t)__pa(addr) & PAGE_MASK) -#define virt_to_pfn(addr) (page_to_pfn(virt_to_page(addr))) - - -#endif /* __ASSEMBLY__ */ - - -/* For both see minios-ia64.lds. */ -/* This is where the kernel virtually starts. */ -#define KERNEL_START IA64_PHYS_TO_RR5(0x100000000) -/* !!!!! - * For physical start of kernel - * Currently used in arch/ia64/fw.S. - * !!!!! - */ -#define KERNEL_PHYS_START_SHIFT 20 - -/* A region 5 address to physical address */ -#define KERN_VIRT_2_PHYS(x) (((x) - KERNEL_START) + \ - (1 << KERNEL_PHYS_START_SHIFT)) - -/* Some protection keys for region 5 and 7 addresses. */ -#define IA64_KEY_REG7 0x234 /* Region 7 - identity mapped addresses */ -#define IA64_KEY_REG5 0x89a /* Region 5 - kernel addresses */ - -// This is xen specific ! -#define PAGE_SHIFT_XEN_16K 14 // For 16KB page size -#define mfn_to_virt(mfn) ((void*)__va((mfn) << PAGE_SHIFT_XEN_16K)) - -#endif /* !defined(_PAGE_H_) */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/pal.h xen-4.3.0/extras/mini-os/include/ia64/pal.h --- xen-4.2.2/extras/mini-os/include/ia64/pal.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/pal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ -/* - * Done by Dietmar Hahn - * The code is mostly taken from FreeBSD. - * - **************************************************************************** - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#ifndef _PAL_H_ -#define _PAL_H_ - -/* - * Architected static calling convention procedures. - */ -#define PAL_CACHE_FLUSH 1 -#define PAL_CACHE_INFO 2 -#define PAL_CACHE_INIT 3 -#define PAL_CACHE_SUMMARY 4 -#define PAL_MEM_ATTRIB 5 -#define PAL_PTCE_INFO 6 -#define PAL_VM_INFO 7 -#define PAL_VM_SUMMARY 8 -#define PAL_BUS_GET_FEATURES 9 -#define PAL_BUS_SET_FEATURES 10 -#define PAL_DEBUG_INFO 11 -#define PAL_FIXED_ADDR 12 -#define PAL_FREQ_BASE 13 -#define PAL_FREQ_RATIOS 14 -#define PAL_PERF_MON_INFO 15 -#define PAL_PLATFORM_ADDR 16 -#define PAL_PROC_GET_FEATURE 17 -#define PAL_PROC_SET_FEATURE 18 -#define PAL_RSE_INFO 19 -#define PAL_VERSION 20 -#define PAL_MC_CLEAR_LOG 21 -#define PAL_MC_DRAIN 22 -#define PAL_MC_DYNAMIC_STATE 24 -#define PAL_MC_ERROR_INFO 25 -#define PAL_MC_EXPECTED 23 -#define PAL_MC_REGISTER_MEM 27 -#define PAL_MC_RESUME 26 -#define PAL_HALT 28 -#define PAL_HALT_LIGHT 29 -#define PAL_COPY_INFO 30 -#define PAL_CACHE_LINE_INIT 31 -#define PAL_PMI_ENTRYPOINT 32 -#define PAL_ENTER_IA_32_ENV 33 -#define PAL_VM_PAGE_SIZE 34 -#define PAL_MEM_FOR_TEST 37 -#define PAL_CACHE_PROT_INFO 38 -#define PAL_REGISTER_INFO 39 -#define PAL_SHUTDOWN 40 -#define PAL_PREFETCH_VISIBILITY 41 - - -struct ia64_pal_result -{ - int64_t pal_status; - uint64_t pal_result[3]; -}; - -extern struct ia64_pal_result - ia64_call_pal_static(uint64_t proc, uint64_t arg1, - uint64_t arg2, uint64_t arg3); - -#endif /* _PAL_H_ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/privop.h xen-4.3.0/extras/mini-os/include/ia64/privop.h --- xen-4.2.2/extras/mini-os/include/ia64/privop.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/privop.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ - -/* - * Copyright (C) 2005 Hewlett-Packard Co - * Dan Magenheimer - * - * Paravirtualizations of privileged operations for Xen/ia64 - * - */ - -#ifndef _PRIVOP_H_ -#define _PRIVOP_H_ - -#include - -#define IA64_PARAVIRTUALIZED - -/* At 1 MB, before per-cpu space but still addressable using addl instead - of movl. */ -#define XSI_BASE 0xfffffffffff00000 - -/* Address of mapped regs. */ -#define XMAPPEDREGS_BASE (XSI_BASE + XSI_SIZE) - -#ifdef __ASSEMBLY__ -#define XEN_HYPER_RFI break HYPERPRIVOP_RFI -#define XEN_HYPER_RSM_PSR_DT break HYPERPRIVOP_RSM_DT -#define XEN_HYPER_SSM_PSR_DT break HYPERPRIVOP_SSM_DT -#define XEN_HYPER_COVER break HYPERPRIVOP_COVER -#define XEN_HYPER_ITC_D break HYPERPRIVOP_ITC_D -#define XEN_HYPER_ITC_I break HYPERPRIVOP_ITC_I -#define XEN_HYPER_SSM_I break HYPERPRIVOP_SSM_I -#define XEN_HYPER_GET_IVR break HYPERPRIVOP_GET_IVR -#define XEN_HYPER_GET_TPR break HYPERPRIVOP_GET_TPR -#define XEN_HYPER_SET_TPR break HYPERPRIVOP_SET_TPR -#define XEN_HYPER_EOI break HYPERPRIVOP_EOI -#define XEN_HYPER_SET_ITM break HYPERPRIVOP_SET_ITM -#define XEN_HYPER_THASH break HYPERPRIVOP_THASH -#define XEN_HYPER_PTC_GA break HYPERPRIVOP_PTC_GA -#define XEN_HYPER_ITR_D break HYPERPRIVOP_ITR_D -#define XEN_HYPER_GET_RR break HYPERPRIVOP_GET_RR -#define XEN_HYPER_SET_RR break HYPERPRIVOP_SET_RR -#define XEN_HYPER_SET_KR break HYPERPRIVOP_SET_KR -#define XEN_HYPER_FC break HYPERPRIVOP_FC -#define XEN_HYPER_GET_CPUID break HYPERPRIVOP_GET_CPUID -#define XEN_HYPER_GET_PMD break HYPERPRIVOP_GET_PMD -#define XEN_HYPER_GET_EFLAG break HYPERPRIVOP_GET_EFLAG -#define XEN_HYPER_SET_EFLAG break HYPERPRIVOP_SET_EFLAG -#define XEN_HYPER_RSM_BE break HYPERPRIVOP_RSM_BE -#define XEN_HYPER_GET_PSR break HYPERPRIVOP_GET_PSR - -#define XSI_IFS (XSI_BASE + XSI_IFS_OFS) -#define XSI_PRECOVER_IFS (XSI_BASE + XSI_PRECOVER_IFS_OFS) -#define XSI_INCOMPL_REGFR (XSI_BASE + XSI_INCOMPL_REGFR_OFS) -#define XSI_IFA (XSI_BASE + XSI_IFA_OFS) -#define XSI_ISR (XSI_BASE + XSI_ISR_OFS) -#define XSI_IIM (XSI_BASE + XSI_IIM_OFS) -#define XSI_ITIR (XSI_BASE + XSI_ITIR_OFS) -#define XSI_PSR_I_ADDR (XSI_BASE + XSI_PSR_I_ADDR_OFS) -#define XSI_PSR_IC (XSI_BASE + XSI_PSR_IC_OFS) -#define XSI_IPSR (XSI_BASE + XSI_IPSR_OFS) -#define XSI_IIP (XSI_BASE + XSI_IIP_OFS) -#define XSI_BANK1_R16 (XSI_BASE + XSI_BANK1_R16_OFS) -#define XSI_BANKNUM (XSI_BASE + XSI_BANKNUM_OFS) -#define XSI_IHA (XSI_BASE + XSI_IHA_OFS) -#endif - -#ifndef __ASSEMBLY__ -#define XEN_HYPER_SSM_I asm("break %0" : : "i" (HYPERPRIVOP_SSM_I)) -#define XEN_HYPER_GET_IVR asm("break %0" : : "i" (HYPERPRIVOP_GET_IVR)) - -/************************************************/ -/* Instructions paravirtualized for performance */ -/************************************************/ - -/* Xen uses memory-mapped virtual privileged registers for access to many - * performance-sensitive privileged registers. Some, like the processor - * status register (psr), are broken up into multiple memory locations. - * Others, like "pend", are abstractions based on privileged registers. - * "Pend" is guaranteed to be set if reading cr.ivr would return a - * (non-spurious) interrupt. */ -#define XEN_MAPPEDREGS ((struct mapped_regs *)XMAPPEDREGS_BASE) -#define XSI_PSR_I \ - (*XEN_MAPPEDREGS->interrupt_mask_addr) -#define xen_get_virtual_psr_i() \ - (!XSI_PSR_I) -#define xen_set_virtual_psr_i(_val) \ - ({ XSI_PSR_I = (uint8_t)(_val) ? 0 : 1; }) -#define xen_get_virtual_psr_ic() \ - ( XEN_MAPPEDREGS->interrupt_collection_enabled ) -#define xen_set_virtual_psr_ic(_val) \ - ({ XEN_MAPPEDREGS->interrupt_collection_enabled = _val ? 1 : 0; }) -#define xen_get_virtual_pend() (XEN_MAPPEDREGS->pending_interruption) - -#endif /* __ASSEMBLY__ */ - -#endif /* _PRIVOP_H_ */ - diff -Nru xen-4.2.2/extras/mini-os/include/ia64/sal.h xen-4.3.0/extras/mini-os/include/ia64/sal.h --- xen-4.2.2/extras/mini-os/include/ia64/sal.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/sal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,188 +0,0 @@ -/* - * Done by Dietmar Hahn - * The code is mostly taken from FreeBSD. - * - **************************************************************************** - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - - -/* - * The SAL System Table starts with a header which is described in - * sal_system_table_t. - * Table header will be followed by a variable number of variable length - * entries. The first byte of each entry will identify the entry type and - * the entries shall be in ascending order by the entry type. Each entry - * type will have a known fixed length. The total length of this table - * depends upon the configuration of the system. Operating system software - * must step through each entry until it reaches the ENTRY_COUNT. The entries - * are sorted on entry type in ascending order. - * Unless otherwise stated, there is one entry per entry type. - */ - -#ifndef _SAL_H_ -#define _SAL_H_ - -typedef uint64_t u_int64_t; -typedef uint32_t u_int32_t; -typedef uint16_t u_int16_t; -typedef uint8_t u_int8_t; - -struct sal_system_table { - char sal_signature[4]; -#define SAL_SIGNATURE "SST_" - uint32_t sal_length; - uint8_t sal_rev[2]; /* Byte 8 - Minor, Byte 0 - Major */ - uint16_t sal_entry_count; // num entries in var part - uint8_t sal_checksum; - uint8_t sal_reserved1[7]; - uint8_t sal_a_version[2]; // like sal_rev - uint8_t sal_b_version[2]; // like sal_rev - char sal_oem_id[32]; // Ascii - manufacturer of HW - char sal_product_id[32]; // ascii - identification - uint8_t sal_reserved2[8]; -}; - -typedef struct sal_system_table sal_system_table_t; - -#define SAL_DESC_ENTRYPOINT 0 -#define SAL_DESC_ENTRYPOINT_LENGTH 48 -#define SAL_DESC_MEMORY 1 -#define SAL_DESC_MEMORY_LENGTH 32 -#define SAL_DESC_PLATFORM 2 -#define SAL_DESC_PLATFORM_LENGT 16 -#define SAL_DESC_TR_REG 3 -#define SAL_DESC_TR_REG_LENGTH 32 -#define SAL_DESC_PURGE_TR_CACHE 4 -#define SAL_DESC_PURGE_TR_CACHE_LENGTH 16 -#define SAL_DESC_AP_WAKEUP 5 -#define SAL_DESC_AP_WAKEUP_LENGTH 16 - - -struct sal_entrypoint_descriptor -{ - uint8_t sale_type; /* == 0 */ - uint8_t sale_reserved1[7]; - uint64_t sale_pal_proc; /* PAL_PROC entry point */ - uint64_t sale_sal_proc; /* SAL_PROC entry point */ - uint64_t sale_sal_gp; /* gp for SAL_PROC, PAL_PROC */ - uint8_t sale_reserved2[16]; -}; - -struct sal_memory_descriptor -{ - uint8_t sale_type; /* == 1 */ - uint8_t sale_need_virtual; - uint8_t sale_current_attribute; - uint8_t sale_access_rights; - uint8_t sale_supported_attributes; - uint8_t sale_reserved1; - uint8_t sale_memory_type[2]; - uint64_t sale_physical_address; - uint32_t sale_length; - uint8_t sale_reserved2[12]; -}; - -struct sal_platform_descriptor -{ - uint8_t sale_type; /* == 2 */ - uint8_t sale_features; - uint8_t sale_reserved[14]; -}; - -struct sal_tr_descriptor -{ - u_int8_t sale_type; /* == 3 */ - u_int8_t sale_register_type; - u_int8_t sale_register_number; - u_int8_t sale_reserved1[5]; - u_int64_t sale_virtual_address; - u_int64_t sale_page_size; - u_int8_t sale_reserved2[8]; -}; - -struct sal_ptc_cache_descriptor -{ - uint8_t sale_type; /* == 4 */ - uint8_t sale_reserved[3]; - uint32_t sale_domains; - uint64_t sale_address; -}; - -struct sal_ap_wakeup_descriptor -{ - uint8_t sale_type; /* == 5 */ - uint8_t sale_mechanism; - uint8_t sale_reserved[6]; - uint64_t sale_vector; -}; - -/* - * SAL Procedure numbers. - */ - -#define SAL_SET_VECTORS 0x01000000 -#define SAL_GET_STATE_INFO 0x01000001 -#define SAL_GET_STATE_INFO_SIZE 0x01000002 -#define SAL_CLEAR_STATE_INFO 0x01000003 -#define SAL_MC_RENDEZ 0x01000004 -#define SAL_MC_SET_PARAMS 0x01000005 -#define SAL_REGISTER_PHYSICAL_ADDR 0x01000006 -#define SAL_CACHE_FLUSH 0x01000008 -#define SAL_CACHE_INIT 0x01000009 -#define SAL_PCI_CONFIG_READ 0x01000010 -#define SAL_PCI_CONFIG_WRITE 0x01000011 -#define SAL_FREQ_BASE 0x01000012 -#define SAL_UPDATE_PAL 0x01000020 - -/* SAL_SET_VECTORS event handler types */ -#define SAL_OS_MCA 0 -#define SAL_OS_INIT 1 -#define SAL_OS_BOOT_RENDEZ 2 - -/* SAL_GET_STATE_INFO, SAL_GET_STATE_INFO_SIZE types */ -#define SAL_INFO_MCA 0 -#define SAL_INFO_INIT 1 -#define SAL_INFO_CMC 2 -#define SAL_INFO_CPE 3 -#define SAL_INFO_TYPES 4 /* number of types we know about */ - -struct ia64_sal_result -{ - int64_t sal_status; - uint64_t sal_result[3]; -}; -typedef struct ia64_sal_result ia64_sal_result_t; - -typedef ia64_sal_result_t sal_entry_t - ( uint64_t, uint64_t, uint64_t, uint64_t, - uint64_t, uint64_t, uint64_t, uint64_t - ); - -extern ia64_sal_result_t ia64_sal_call(uint64_t, uint64_t, uint64_t, uint64_t, - uint64_t, uint64_t, uint64_t, uint64_t); - -extern void ia64_sal_init(sal_system_table_t *saltab); - -#endif /* _SAL_H_ */ diff -Nru xen-4.2.2/extras/mini-os/include/ia64/traps.h xen-4.3.0/extras/mini-os/include/ia64/traps.h --- xen-4.2.2/extras/mini-os/include/ia64/traps.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/ia64/traps.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -/* - * Done by Dietmar Hahn - * - **************************************************************************** - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#if !defined(_TRAPS_H_) -#define _TRAPS_H_ - -#if !defined(__ASSEMBLY__) - -/* See ia64_cpu.h */ -struct trap_frame; - -#define pt_regs trap_frame - -/* - * A dummy function, which is currently not supported. - */ -inline static void trap_init(void) -{ - //printk("trap_init() until now not needed!\n"); -} -inline static void trap_fini(void) -{ - //printk("trap_fini() until now not needed!\n"); -} - - -#endif /* !defined(__ASSEMBLY__) */ - -#include "ia64_cpu.h" - -void stack_walk(void); - -#endif /* !defined(_TRAPS_H_) */ - diff -Nru xen-4.2.2/extras/mini-os/include/iorw.h xen-4.3.0/extras/mini-os/include/iorw.h --- xen-4.2.2/extras/mini-os/include/iorw.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/iorw.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,16 @@ +#ifndef MINIOS_IORW_H +#define MINIOS_IORW_H + +#include + +void iowrite8(volatile void* addr, uint8_t val); +void iowrite16(volatile void* addr, uint16_t val); +void iowrite32(volatile void* addr, uint32_t val); +void iowrite64(volatile void* addr, uint64_t val); + +uint8_t ioread8(volatile void* addr); +uint16_t ioread16(volatile void* addr); +uint32_t ioread32(volatile void* addr); +uint64_t ioread64(volatile void* addr); + +#endif diff -Nru xen-4.2.2/extras/mini-os/include/lib.h xen-4.3.0/extras/mini-os/include/lib.h --- xen-4.2.2/extras/mini-os/include/lib.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/lib.h 2013-07-09 10:46:56.000000000 +0000 @@ -142,6 +142,8 @@ FTYPE_FB, FTYPE_MEM, FTYPE_SAVEFILE, + FTYPE_TPMFRONT, + FTYPE_TPM_TIS, }; LIST_HEAD(evtchn_port_list, evtchn_port_info); @@ -174,6 +176,7 @@ } tap; struct { struct blkfront_dev *dev; + off_t offset; } blk; struct { struct kbdfront_dev *dev; @@ -184,6 +187,20 @@ struct { struct consfront_dev *dev; } cons; +#ifdef CONFIG_TPMFRONT + struct { + struct tpmfront_dev *dev; + int respgot; + off_t offset; + } tpmfront; +#endif +#ifdef CONFIG_TPM_TIS + struct { + struct tpm_chip *dev; + int respgot; + off_t offset; + } tpm_tis; +#endif #ifdef CONFIG_XENBUS struct { /* To each xenbus FD is associated a queue of watch events for this diff -Nru xen-4.2.2/extras/mini-os/include/mm.h xen-4.3.0/extras/mini-os/include/mm.h --- xen-4.2.2/extras/mini-os/include/mm.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/mm.h 2013-07-09 10:46:56.000000000 +0000 @@ -29,8 +29,6 @@ #include #elif defined(__x86_64__) #include -#elif defined(__ia64__) -#include #else #error "Unsupported architecture" #endif diff -Nru xen-4.2.2/extras/mini-os/include/posix/limits.h xen-4.3.0/extras/mini-os/include/posix/limits.h --- xen-4.2.2/extras/mini-os/include/posix/limits.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/posix/limits.h 2013-07-09 10:46:56.000000000 +0000 @@ -25,7 +25,7 @@ #define SHRT_MAX 0x7fff #define USHRT_MAX 0xffff -#if defined(__x86_64__) || defined(__ia64__) +#if defined(__x86_64__) # define LONG_MAX 0x7fffffffffffffffL # define ULONG_MAX 0xffffffffffffffffUL #else diff -Nru xen-4.2.2/extras/mini-os/include/posix/poll.h xen-4.3.0/extras/mini-os/include/posix/poll.h --- xen-4.2.2/extras/mini-os/include/posix/poll.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/posix/poll.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1 @@ +#include diff -Nru xen-4.2.2/extras/mini-os/include/posix/sys/select.h xen-4.3.0/extras/mini-os/include/posix/sys/select.h --- xen-4.2.2/extras/mini-os/include/posix/sys/select.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/posix/sys/select.h 2013-07-09 10:46:56.000000000 +0000 @@ -2,7 +2,6 @@ #define _POSIX_SELECT_H #include -#include int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); #endif /* _POSIX_SELECT_H */ diff -Nru xen-4.2.2/extras/mini-os/include/sched.h xen-4.3.0/extras/mini-os/include/sched.h --- xen-4.2.2/extras/mini-os/include/sched.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/sched.h 2013-07-09 10:46:56.000000000 +0000 @@ -12,13 +12,9 @@ { char *name; char *stack; -#if !defined(__ia64__) /* keep in that order */ unsigned long sp; /* Stack pointer */ unsigned long ip; /* Instruction pointer */ -#else /* !defined(__ia64__) */ - thread_regs_t regs; -#endif /* !defined(__ia64__) */ MINIOS_TAILQ_ENTRY(struct thread) thread_list; uint32_t flags; s_time_t wakeup_time; diff -Nru xen-4.2.2/extras/mini-os/include/sys/time.h xen-4.3.0/extras/mini-os/include/sys/time.h --- xen-4.2.2/extras/mini-os/include/sys/time.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/sys/time.h 2013-07-09 10:46:56.000000000 +0000 @@ -22,6 +22,7 @@ #ifdef HAVE_LIBC #include_next + #else struct timespec { time_t tv_sec; @@ -37,6 +38,10 @@ }; int gettimeofday(struct timeval *tv, void *tz); + +#endif +#ifdef HAVE_LIBC +#include #endif #endif /* _MINIOS_SYS_TIME_H_ */ diff -Nru xen-4.2.2/extras/mini-os/include/tpm_tis.h xen-4.3.0/extras/mini-os/include/tpm_tis.h --- xen-4.2.2/extras/mini-os/include/tpm_tis.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/tpm_tis.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * This code has been derived from drivers/char/tpm.c + * from the linux kernel + * + * Copyright (C) 2004 IBM Corporation + * + * This code has also been derived from drivers/char/tpm/tpm_tis.c + * from the linux kernel + * + * Copyright (C) 2005, 2006 IBM Corporation + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, version 2 + * of the License + */ +#ifndef TPM_TIS_H +#define TPM_TIS_H + +#include +#include + +#define TPM_TIS_EN_LOCL0 1 +#define TPM_TIS_EN_LOCL1 (1 << 1) +#define TPM_TIS_EN_LOCL2 (1 << 2) +#define TPM_TIS_EN_LOCL3 (1 << 3) +#define TPM_TIS_EN_LOCL4 (1 << 4) +#define TPM_TIS_EN_LOCLALL (TPM_TIS_EN_LOCL0 | TPM_TIS_EN_LOCL1 | TPM_TIS_EN_LOCL2 | TPM_TIS_EN_LOCL3 | TPM_TIS_EN_LOCL4) +#define TPM_TIS_LOCL_INT_TO_FLAG(x) (1 << x) +#define TPM_BASEADDR 0xFED40000 +#define TPM_PROBE_IRQ 0xFFFF + +struct tpm_chip; + +struct tpm_chip* init_tpm_tis(unsigned long baseaddr, int localities, unsigned int irq); +void shutdown_tpm_tis(struct tpm_chip* tpm); + +int tpm_tis_request_locality(struct tpm_chip* tpm, int locality); +int tpm_tis_cmd(struct tpm_chip* tpm, uint8_t* req, size_t reqlen, uint8_t** resp, size_t* resplen); + +#ifdef HAVE_LIBC +#include +#include +/* POSIX IO functions: + * use tpm_tis_open() to get a file descriptor to the tpm device + * use write() on the fd to send a command to the backend. You must + * include the entire command in a single call to write(). + * use read() on the fd to read the response. You can use + * fstat() to get the size of the response and lseek() to seek on it. + */ +int tpm_tis_open(struct tpm_chip* tpm); +int tpm_tis_posix_read(int fd, uint8_t* buf, size_t count); +int tpm_tis_posix_write(int fd, const uint8_t* buf, size_t count); +int tpm_tis_posix_fstat(int fd, struct stat* buf); +#endif + +#endif diff -Nru xen-4.2.2/extras/mini-os/include/tpmback.h xen-4.3.0/extras/mini-os/include/tpmback.h --- xen-4.2.2/extras/mini-os/include/tpmback.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/tpmback.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * This code has been derived from drivers/xen/tpmback/tpmback.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2005, IBM Corporation + * + * which was itself derived from drivers/xen/netback/netback.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2002-2004, K A Fraser + * + * This code has also been derived from drivers/xen/tpmback/xenbus.c + * from the xen 2.6.18 linux kernel + * + * Copyright (C) 2005 IBM Corporation + * Copyright (C) 2005 Rusty Russell + * + * This code has also been derived from drivers/xen/tpmback/interface.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2005, IBM Corporation + * + * which was itself also derived from drvivers/xen/netback/interface.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2004, Keir Fraser + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, version 2 + * of the License + */ + +#include +#include +#include +#include +#ifndef TPMBACK_H +#define TPMBACK_H + +struct tpmcmd { + domid_t domid; /* Domid of the frontend */ + uint8_t locality; /* Locality requested by the frontend */ + unsigned int handle; /* Handle of the frontend */ + void *opaque; /* Opaque pointer taken from the tpmback instance */ + + uint8_t* req; /* tpm command bits, allocated by driver, DON'T FREE IT */ + unsigned int req_len; /* Size of the command in buf - set by tpmback driver */ + unsigned int resp_len; /* Size of the outgoing command, + you set this before passing the cmd object to tpmback_resp */ + uint8_t* resp; /* Buffer for response - YOU MUST ALLOCATE IT, YOU MUST ALSO FREE IT */ +}; +typedef struct tpmcmd tpmcmd_t; + +/* Initialize the tpm backend driver */ +void init_tpmback(void (*open_cb)(domid_t, unsigned int), void (*close_cb)(domid_t, unsigned int)); + +/* Shutdown tpm backend driver */ +void shutdown_tpmback(void); + +/* Blocks until a tpm command is sent from any front end. + * Returns a pointer to the tpm command to handle. + * Do not try to free this pointer or the req buffer + * This function will return NULL if the tpm backend driver + * is shutdown or any other error occurs */ +tpmcmd_t* tpmback_req_any(void); + +/* Blocks until a tpm command from the frontend at domid/handle + * is sent. + * Returns NULL if domid/handle is not connected, tpmback is + * shutdown or shutting down, or if there is an error + */ +tpmcmd_t* tpmback_req(domid_t domid, unsigned int handle); + +/* Send the response to the tpm command back to the frontend + * This function will free the tpmcmd object, but you must free the resp + * buffer yourself */ +void tpmback_resp(tpmcmd_t* tpmcmd); + +/* Waits for the first frontend to connect and then sets domid and handle appropriately. + * If one or more frontends are already connected, this will set domid and handle to one + * of them arbitrarily. The main use for this function is to wait until a single + * frontend connection has occured. + * returns 0 on success, non-zero on failure */ +int tpmback_wait_for_frontend_connect(domid_t *domid, unsigned int *handle); + +/* returns the number of frontends connected */ +int tpmback_num_frontends(void); + +/* Returns the uuid of the specified frontend, NULL on error. + * The return value is internally allocated, so don't free it */ +unsigned char* tpmback_get_uuid(domid_t domid, unsigned int handle); + +/* Get and set the opaque pointer for a tpmback instance */ +void* tpmback_get_opaque(domid_t domid, unsigned int handle); +/* Returns zero if successful, nonzero on failure (no such frontend) */ +int tpmback_set_opaque(domid_t domid, unsigned int handle, void* opaque); + +/* Get the XSM context of the given domain (using the tpmback event channel) */ +int tpmback_get_peercontext(domid_t domid, unsigned int handle, void* buffer, int buflen); +#endif diff -Nru xen-4.2.2/extras/mini-os/include/tpmfront.h xen-4.3.0/extras/mini-os/include/tpmfront.h --- xen-4.2.2/extras/mini-os/include/tpmfront.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/tpmfront.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * This code has been derived from drivers/char/tpm_vtpm.c + * from the xen 2.6.18 linux kernel + * + * Copyright (C) 2006 IBM Corporation + * + * This code has also been derived from drivers/char/tpm_xen.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2005, IBM Corporation + * + * which was itself derived from drivers/xen/netfront/netfront.c + * from the linux kernel + * + * Copyright (c) 2002-2004, K A Fraser + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + */ +#ifndef TPMFRONT_H +#define TPMFRONT_H + +#include +#include +#include +#include +#include +#include +#include + +struct tpmfront_dev { + grant_ref_t ring_ref; + evtchn_port_t evtchn; + + tpmif_shared_page_t *page; + + domid_t bedomid; + char* nodename; + char* bepath; + + XenbusState state; + + uint8_t waiting; + struct wait_queue_head waitq; + + uint8_t* respbuf; + size_t resplen; + +#ifdef HAVE_LIBC + int fd; +#endif + +}; + + +/*Initialize frontend */ +struct tpmfront_dev* init_tpmfront(const char* nodename); +/*Shutdown frontend */ +void shutdown_tpmfront(struct tpmfront_dev* dev); + +/* Send a tpm command to the backend and wait for the response + * + * @dev - frontend device + * @req - request buffer + * @reqlen - length of request buffer + * @resp - *resp will be set to internal response buffer, don't free it! Value is undefined on error + * @resplen - *resplen will be set to the length of the response. Value is undefined on error + * + * returns 0 on success, non zero on failure. + * */ +int tpmfront_cmd(struct tpmfront_dev* dev, uint8_t* req, size_t reqlen, uint8_t** resp, size_t* resplen); + +/* Set the locality used for communicating with a vTPM */ +int tpmfront_set_locality(struct tpmfront_dev* dev, int locality); + +#ifdef HAVE_LIBC +#include +/* POSIX IO functions: + * use tpmfront_open() to get a file descriptor to the tpm device + * use write() on the fd to send a command to the backend. You must + * include the entire command in a single call to write(). + * use read() on the fd to read the response. You can use + * fstat() to get the size of the response and lseek() to seek on it. + */ +int tpmfront_open(struct tpmfront_dev* dev); +int tpmfront_posix_read(int fd, uint8_t* buf, size_t count); +int tpmfront_posix_write(int fd, const uint8_t* buf, size_t count); +int tpmfront_posix_fstat(int fd, struct stat* buf); +#endif + + +#endif diff -Nru xen-4.2.2/extras/mini-os/include/types.h xen-4.3.0/extras/mini-os/include/types.h --- xen-4.2.2/extras/mini-os/include/types.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/types.h 2013-07-09 10:46:56.000000000 +0000 @@ -33,7 +33,7 @@ typedef struct { unsigned long pte_low, pte_high; } pte_t; -#elif defined(__x86_64__) || defined(__ia64__) +#elif defined(__x86_64__) typedef long quad_t; typedef unsigned long u_quad_t; @@ -54,7 +54,7 @@ #ifdef __i386__ typedef unsigned int uintptr_t; typedef int intptr_t; -#elif defined(__x86_64__) || defined(__ia64__) +#elif defined(__x86_64__) typedef unsigned long uintptr_t; typedef long intptr_t; #endif /* __i386__ || __x86_64__ */ @@ -67,7 +67,7 @@ #ifdef __i386__ typedef signed long long int64_t; typedef unsigned long long uint64_t; -#elif defined(__x86_64__) || defined(__ia64__) +#elif defined(__x86_64__) typedef signed long int64_t; typedef unsigned long uint64_t; #endif diff -Nru xen-4.2.2/extras/mini-os/include/wait.h xen-4.3.0/extras/mini-os/include/wait.h --- xen-4.2.2/extras/mini-os/include/wait.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/wait.h 2013-07-09 10:46:56.000000000 +0000 @@ -97,7 +97,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/extras/mini-os/include/waittypes.h xen-4.3.0/extras/mini-os/include/waittypes.h --- xen-4.2.2/extras/mini-os/include/waittypes.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/waittypes.h 2013-07-09 10:46:56.000000000 +0000 @@ -24,7 +24,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/extras/mini-os/include/x86/arch_endian.h xen-4.3.0/extras/mini-os/include/x86/arch_endian.h --- xen-4.2.2/extras/mini-os/include/x86/arch_endian.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/x86/arch_endian.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,7 @@ +#ifndef ARCH_ENDIAN_H +#error "Do not include arch_endian by itself, include endian.h" +#else + +#define __BYTE_ORDER __LITTLE_ENDIAN + +#endif diff -Nru xen-4.2.2/extras/mini-os/include/x86/arch_mm.h xen-4.3.0/extras/mini-os/include/x86/arch_mm.h --- xen-4.2.2/extras/mini-os/include/x86/arch_mm.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/x86/arch_mm.h 2013-07-09 10:46:56.000000000 +0000 @@ -229,6 +229,5 @@ #define do_map_zero(start, n) do_map_frames(start, &mfn_zero, n, 0, 0, DOMID_SELF, NULL, L1_PROT_RO) pgentry_t *need_pgt(unsigned long addr); -int mfn_is_ram(unsigned long mfn); #endif /* _ARCH_MM_H_ */ diff -Nru xen-4.2.2/extras/mini-os/include/x86/x86_32/arch_wordsize.h xen-4.3.0/extras/mini-os/include/x86/x86_32/arch_wordsize.h --- xen-4.2.2/extras/mini-os/include/x86/x86_32/arch_wordsize.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/x86/x86_32/arch_wordsize.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1 @@ +#define __WORDSIZE 32 diff -Nru xen-4.2.2/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h xen-4.3.0/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h --- xen-4.2.2/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/x86/x86_32/hypercall-x86_32.h 2013-07-09 10:46:56.000000000 +0000 @@ -172,6 +172,14 @@ return _hypercall2(int, sched_op, cmd, arg); } +static inline int +HYPERVISOR_shutdown( + unsigned int reason) +{ + struct sched_shutdown shutdown = { .reason = reason }; + return _hypercall2(int, sched_op, SCHEDOP_shutdown, &shutdown); +} + static inline long HYPERVISOR_set_timer_op( uint64_t timeout) diff -Nru xen-4.2.2/extras/mini-os/include/x86/x86_64/arch_wordsize.h xen-4.3.0/extras/mini-os/include/x86/x86_64/arch_wordsize.h --- xen-4.2.2/extras/mini-os/include/x86/x86_64/arch_wordsize.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/x86/x86_64/arch_wordsize.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,2 @@ +#define __WORDSIZE 64 +#define __WORDSIZE_COMPAT32 1 diff -Nru xen-4.2.2/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h xen-4.3.0/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h --- xen-4.2.2/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/x86/x86_64/hypercall-x86_64.h 2013-07-09 10:46:56.000000000 +0000 @@ -176,6 +176,14 @@ return _hypercall2(int, sched_op, cmd, arg); } +static inline int +HYPERVISOR_shutdown( + unsigned int reason) +{ + struct sched_shutdown shutdown = { .reason = reason }; + return _hypercall2(int, sched_op, SCHEDOP_shutdown, &shutdown); +} + static inline long HYPERVISOR_set_timer_op( uint64_t timeout) diff -Nru xen-4.2.2/extras/mini-os/include/xenbus.h xen-4.3.0/extras/mini-os/include/xenbus.h --- xen-4.2.2/extras/mini-os/include/xenbus.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/xenbus.h 2013-07-09 10:46:56.000000000 +0000 @@ -95,6 +95,10 @@ /* Read path and parse it as an integer. Returns -1 on error. */ int xenbus_read_integer(const char *path); +/* Read path and parse it as 16 byte uuid. Returns 1 if + * read and parsing were successful, 0 if not */ +int xenbus_read_uuid(const char* path, unsigned char uuid[16]); + /* Contraction of snprintf and xenbus_write(path/node). */ char* xenbus_printf(xenbus_transaction_t xbt, const char* node, const char* path, diff -Nru xen-4.2.2/extras/mini-os/include/xmalloc.h xen-4.3.0/extras/mini-os/include/xmalloc.h --- xen-4.2.2/extras/mini-os/include/xmalloc.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/include/xmalloc.h 2013-07-09 10:46:56.000000000 +0000 @@ -14,16 +14,16 @@ #include #define DEFAULT_ALIGN (sizeof(unsigned long)) -#define malloc(size) _xmalloc(size, DEFAULT_ALIGN) -#define free(ptr) xfree(ptr) -#define realloc(ptr, size) _realloc(ptr, size) -/* Free any of the above. */ +extern void *malloc(size_t size); +extern void *realloc(void *ptr, size_t size); +extern void free(void *ptr); + +/* Free memory from any xmalloc*() call. */ extern void xfree(const void *); /* Underlying functions */ extern void *_xmalloc(size_t size, size_t align); -extern void *_realloc(void *ptr, size_t size); #endif diff -Nru xen-4.2.2/extras/mini-os/kernel.c xen-4.3.0/extras/mini-os/kernel.c --- xen-4.2.2/extras/mini-os/kernel.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/kernel.c 2013-07-09 10:46:56.000000000 +0000 @@ -64,6 +64,42 @@ } } +#ifdef CONFIG_XENBUS +/* This should be overridden by the application we are linked against. */ +__attribute__((weak)) void app_shutdown(unsigned reason) +{ + printk("Shutdown requested: %d\n", reason); +} + +static void shutdown_thread(void *p) +{ + const char *path = "control/shutdown"; + const char *token = path; + xenbus_event_queue events = NULL; + char *shutdown, *err; + unsigned int shutdown_reason; + xenbus_watch_path_token(XBT_NIL, path, token, &events); + while ((err = xenbus_read(XBT_NIL, path, &shutdown)) != NULL) + { + free(err); + xenbus_wait_for_watch(&events); + } + xenbus_unwatch_path_token(XBT_NIL, path, token); + xenbus_write(XBT_NIL, path, ""); + printk("Shutting down (%s)\n", shutdown); + + if (!strcmp(shutdown, "poweroff")) + shutdown_reason = SHUTDOWN_poweroff; + else if (!strcmp(shutdown, "reboot")) + shutdown_reason = SHUTDOWN_reboot; + else + /* Unknown */ + shutdown_reason = SHUTDOWN_crash; + app_shutdown(shutdown_reason); +} +#endif + + /* This should be overridden by the application we are linked against. */ __attribute__((weak)) int app_main(start_info_t *si) { @@ -126,6 +162,10 @@ /* Init XenBus */ init_xenbus(); +#ifdef CONFIG_XENBUS + create_thread("shutdown", shutdown_thread, NULL); +#endif + /* Call (possibly overridden) app_main() */ app_main(&start_info); diff -Nru xen-4.2.2/extras/mini-os/lib/math.c xen-4.3.0/extras/mini-os/lib/math.c --- xen-4.2.2/extras/mini-os/lib/math.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/lib/math.c 2013-07-09 10:46:56.000000000 +0000 @@ -50,10 +50,6 @@ #include #include - /* On ia64 these functions lead to crashes. These are replaced by - * assembler functions. */ -#if !defined(__ia64__) - /* XXX RN: Yuck hardcoded endianess :) */ #define _QUAD_HIGHWORD 1 #define _QUAD_LOWWORD 0 @@ -428,7 +424,6 @@ (void)__qdivrem(ua, ub, &ur); return (neg ? -ur : ur); } -#endif /* !defined(__ia64__) */ #ifndef HAVE_LIBC /* Should be random enough for our uses */ diff -Nru xen-4.2.2/extras/mini-os/lib/sys.c xen-4.3.0/extras/mini-os/lib/sys.c --- xen-4.2.2/extras/mini-os/lib/sys.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/lib/sys.c 2013-07-09 10:46:56.000000000 +0000 @@ -27,8 +27,11 @@ #include #include #include +#include +#include #include #include +#include #include #include @@ -289,6 +292,21 @@ return ret * sizeof(union xenfb_in_event); } #endif +#ifdef CONFIG_BLKFRONT + case FTYPE_BLK: { + return blkfront_posix_read(fd, buf, nbytes); + } +#endif +#ifdef CONFIG_TPMFRONT + case FTYPE_TPMFRONT: { + return tpmfront_posix_read(fd, buf, nbytes); + } +#endif +#ifdef CONFIG_TPM_TIS + case FTYPE_TPM_TIS: { + return tpm_tis_posix_read(fd, buf, nbytes); + } +#endif default: break; } @@ -321,6 +339,18 @@ netfront_xmit(files[fd].tap.dev, (void*) buf, nbytes); return nbytes; #endif +#ifdef CONFIG_BLKFRONT + case FTYPE_BLK: + return blkfront_posix_write(fd, buf, nbytes); +#endif +#ifdef CONFIG_TPMFRONT + case FTYPE_TPMFRONT: + return tpmfront_posix_write(fd, buf, nbytes); +#endif +#ifdef CONFIG_TPM_TIS + case FTYPE_TPM_TIS: + return tpm_tis_posix_write(fd, buf, nbytes); +#endif default: break; } @@ -331,8 +361,54 @@ off_t lseek(int fd, off_t offset, int whence) { - errno = ESPIPE; - return (off_t) -1; + off_t* target = NULL; + switch(files[fd].type) { +#ifdef CONFIG_BLKFRONT + case FTYPE_BLK: + target = &files[fd].blk.offset; + break; +#endif +#ifdef CONFIG_TPMFRONT + case FTYPE_TPMFRONT: + target = &files[fd].tpmfront.offset; + break; +#endif +#ifdef CONFIG_TPM_TIS + case FTYPE_TPM_TIS: + target = &files[fd].tpm_tis.offset; + break; +#endif + case FTYPE_FILE: + target = &files[fd].file.offset; + break; + default: + /* Not implemented for this filetype */ + errno = ESPIPE; + return (off_t) -1; + } + + switch (whence) { + case SEEK_SET: + *target = offset; + break; + case SEEK_CUR: + *target += offset; + break; + case SEEK_END: + { + struct stat st; + int ret; + ret = fstat(fd, &st); + if (ret) + return -1; + *target = st.st_size + offset; + break; + } + default: + errno = EINVAL; + return -1; + } + return *target; } int fsync(int fd) { @@ -359,6 +435,7 @@ return res; } #endif +#ifdef CONFIG_XC case FTYPE_XC: minios_interface_close_fd(fd); return 0; @@ -368,6 +445,7 @@ case FTYPE_GNTMAP: minios_gnttab_close_fd(fd); return 0; +#endif #ifdef CONFIG_NETFRONT case FTYPE_TAP: shutdown_netfront(files[fd].tap.dev); @@ -380,6 +458,18 @@ files[fd].type = FTYPE_NONE; return 0; #endif +#ifdef CONFIG_TPMFRONT + case FTYPE_TPMFRONT: + shutdown_tpmfront(files[fd].tpmfront.dev); + files[fd].type = FTYPE_NONE; + return 0; +#endif +#ifdef CONFIG_TPM_TIS + case FTYPE_TPM_TIS: + shutdown_tpm_tis(files[fd].tpm_tis.dev); + files[fd].type = FTYPE_NONE; + return 0; +#endif #ifdef CONFIG_KBDFRONT case FTYPE_KBD: shutdown_kbdfront(files[fd].kbd.dev); @@ -445,6 +535,18 @@ buf->st_ctime = time(NULL); return 0; } +#ifdef CONFIG_BLKFRONT + case FTYPE_BLK: + return blkfront_posix_fstat(fd, buf); +#endif +#ifdef CONFIG_TPMFRONT + case FTYPE_TPMFRONT: + return tpmfront_posix_fstat(fd, buf); +#endif +#ifdef CONFIG_TPM_TIS + case FTYPE_TPM_TIS: + return tpm_tis_posix_fstat(fd, buf); +#endif default: break; } @@ -577,6 +679,29 @@ #define dump_set(nfds, readfds, writefds, exceptfds, timeout) #endif +#ifdef LIBC_DEBUG +static void dump_pollfds(struct pollfd *pfd, int nfds, int timeout) +{ + int i, comma, fd; + + printk("["); + comma = 0; + for (i = 0; i < nfds; i++) { + fd = pfd[i].fd; + if (comma) + printk(", "); + printk("%d(%c)/%02x", fd, file_types[files[fd].type], + pfd[i].events); + comma = 1; + } + printk("]"); + + printk(", %d, %d", nfds, timeout); +} +#else +#define dump_pollfds(pfds, nfds, timeout) +#endif + /* Just poll without blocking */ static int select_poll(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds) { @@ -882,6 +1007,98 @@ return ret; } +/* Wrap around select */ +int poll(struct pollfd _pfd[], nfds_t _nfds, int _timeout) +{ + int n, ret; + int i, fd; + struct timeval _timeo, *timeo = NULL; + fd_set rfds, wfds, efds; + int max_fd = -1; + + DEBUG("poll("); + dump_pollfds(_pfd, _nfds, _timeout); + DEBUG(")\n"); + + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + + n = 0; + + for (i = 0; i < _nfds; i++) { + fd = _pfd[i].fd; + _pfd[i].revents = 0; + + /* fd < 0, revents = 0, which is already set */ + if (fd < 0) continue; + + /* fd is invalid, revents = POLLNVAL, increment counter */ + if (fd >= NOFILE || files[fd].type == FTYPE_NONE) { + n++; + _pfd[i].revents |= POLLNVAL; + continue; + } + + /* normal case, map POLL* into readfds and writefds: + * POLLIN -> readfds + * POLLOUT -> writefds + * POLL* -> none + */ + if (_pfd[i].events & POLLIN) + FD_SET(fd, &rfds); + if (_pfd[i].events & POLLOUT) + FD_SET(fd, &wfds); + /* always set exceptfds */ + FD_SET(fd, &efds); + if (fd > max_fd) + max_fd = fd; + } + + /* should never sleep when we already have events */ + if (n) { + _timeo.tv_sec = 0; + _timeo.tv_usec = 0; + timeo = &_timeo; + } else if (_timeout >= 0) { + /* normal case, construct _timeout, might sleep */ + _timeo.tv_sec = _timeout / 1000; + _timeo.tv_usec = (_timeout % 1000) * 1000; + timeo = &_timeo; + } else { + /* _timeout < 0, block forever */ + timeo = NULL; + } + + + ret = select(max_fd+1, &rfds, &wfds, &efds, timeo); + /* error in select, just return, errno is set by select() */ + if (ret < 0) + return ret; + + for (i = 0; i < _nfds; i++) { + fd = _pfd[i].fd; + + /* the revents has already been set for all error case */ + if (fd < 0 || fd >= NOFILE || files[fd].type == FTYPE_NONE) + continue; + + if (FD_ISSET(fd, &rfds) || FD_ISSET(fd, &wfds) || FD_ISSET(fd, &efds)) + n++; + if (FD_ISSET(fd, &efds)) { + /* anything bad happens we set POLLERR */ + _pfd[i].revents |= POLLERR; + continue; + } + if (FD_ISSET(fd, &rfds)) + _pfd[i].revents |= POLLIN; + if (FD_ISSET(fd, &wfds)) + _pfd[i].revents |= POLLOUT; + } + + return n; +} + #ifdef HAVE_LWIP int socket(int domain, int type, int protocol) { @@ -1153,10 +1370,13 @@ if (fd == -1) return map_zero(n, 1); +#ifdef CONFIG_XC else if (files[fd].type == FTYPE_XC) { unsigned long zero = 0; return map_frames_ex(&zero, n, 0, 0, 1, DOMID_SELF, NULL, 0); - } else if (files[fd].type == FTYPE_MEM) { + } +#endif + else if (files[fd].type == FTYPE_MEM) { unsigned long first_mfn = offset >> PAGE_SHIFT; return map_frames_ex(&first_mfn, n, 0, 1, 1, DOMID_IO, NULL, _PAGE_PRESENT|_PAGE_RW); } else ASSERT(0); @@ -1256,7 +1476,6 @@ unsupported_function(int, grantpt, -1); unsupported_function(int, unlockpt, -1); unsupported_function(char *, ptsname, NULL); -unsupported_function(int, poll, -1); /* net/if.h */ unsupported_function_log(unsigned int, if_nametoindex, -1); diff -Nru xen-4.2.2/extras/mini-os/lib/xmalloc.c xen-4.3.0/extras/mini-os/lib/xmalloc.c --- xen-4.2.2/extras/mini-os/lib/xmalloc.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/lib/xmalloc.c 2013-07-09 10:46:56.000000000 +0000 @@ -267,7 +267,12 @@ /* spin_unlock_irqrestore(&freelist_lock, flags); */ } -void *_realloc(void *ptr, size_t size) +void *malloc(size_t size) +{ + return _xmalloc(size, DEFAULT_ALIGN); +} + +void *realloc(void *ptr, size_t size) { void *new; struct xmalloc_hdr *hdr; @@ -296,12 +301,17 @@ return new; } + +void free(void *ptr) +{ + xfree(ptr); +} #endif /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/extras/mini-os/minios.mk xen-4.3.0/extras/mini-os/minios.mk --- xen-4.2.2/extras/mini-os/minios.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/minios.mk 2013-07-09 10:46:56.000000000 +0000 @@ -20,8 +20,8 @@ #DEF_CFLAGS += -DMM_DEBUG #DEF_CFLAGS += -DFS_DEBUG #DEF_CFLAGS += -DLIBC_DEBUG -DEF_CFLAGS += -DGNT_DEBUG -DEF_CFLAGS += -DGNTMAP_DEBUG +#DEF_CFLAGS += -DGNT_DEBUG +#DEF_CFLAGS += -DGNTMAP_DEBUG else DEF_CFLAGS += -O3 endif diff -Nru xen-4.2.2/extras/mini-os/mm.c xen-4.3.0/extras/mini-os/mm.c --- xen-4.2.2/extras/mini-os/mm.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/mm.c 2013-07-09 10:46:56.000000000 +0000 @@ -361,7 +361,6 @@ } -#ifndef __ia64__ int free_physical_pages(xen_pfn_t *mfns, int n) { struct xen_memory_reservation reservation; @@ -372,7 +371,6 @@ reservation.domid = DOMID_SELF; return HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); } -#endif #ifdef HAVE_LIBC void *sbrk(ptrdiff_t increment) diff -Nru xen-4.2.2/extras/mini-os/sched.c xen-4.3.0/extras/mini-os/sched.c --- xen-4.2.2/extras/mini-os/sched.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/sched.c 2013-07-09 10:46:56.000000000 +0000 @@ -293,7 +293,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/extras/mini-os/test.c xen-4.3.0/extras/mini-os/test.c --- xen-4.2.2/extras/mini-os/test.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/test.c 2013-07-09 10:46:56.000000000 +0000 @@ -45,8 +45,13 @@ #include #include -static struct netfront_dev *net_dev; +#ifdef CONFIG_XENBUS +static unsigned int do_shutdown = 0; +static unsigned int shutdown_reason; +static DECLARE_WAIT_QUEUE_HEAD(shutdown_queue); +#endif +#ifdef CONFIG_XENBUS void test_xenbus(void); static void xenbus_tester(void *p) @@ -54,6 +59,7 @@ printk("Xenbus tests disabled, because of a Xend bug.\n"); /* test_xenbus(); */ } +#endif static void periodic_thread(void *p) { @@ -67,15 +73,23 @@ } } +#ifdef CONFIG_NETFRONT +static struct netfront_dev *net_dev; +static struct semaphore net_sem = __SEMAPHORE_INITIALIZER(net_sem, 0); + static void netfront_thread(void *p) { net_dev = init_netfront(NULL, NULL, NULL, NULL); + up(&net_sem); } +#endif +#ifdef CONFIG_BLKFRONT static struct blkfront_dev *blk_dev; static struct blkfront_info blk_info; static uint64_t blk_size_read; static uint64_t blk_size_write; +static struct semaphore blk_sem = __SEMAPHORE_INITIALIZER(blk_sem, 0);; struct blk_req { struct blkfront_aiocb aiocb; @@ -189,8 +203,10 @@ time_t lasttime = 0; blk_dev = init_blkfront(NULL, &blk_info); - if (!blk_dev) + if (!blk_dev) { + up(&blk_sem); return; + } if (blk_info.info & VDISK_CDROM) printk("Block device is a CDROM\n"); @@ -210,7 +226,7 @@ blk_read_sector(blk_info.sectors-1); } - while (1) { + while (!do_shutdown) { uint64_t sector = rand() % blk_info.sectors; struct timeval tv; #ifdef BLKTEST_WRITE @@ -235,8 +251,11 @@ } #endif } + up(&blk_sem); } +#endif +#if defined(CONFIG_FBFRONT) && defined(CONFIG_KBDFRONT) #define WIDTH 800 #define HEIGHT 600 #define DEPTH 32 @@ -293,7 +312,6 @@ xfree(mfns); if (!fb_dev) { xfree(fb); - return; } up(&fbfront_sem); } @@ -330,17 +348,21 @@ } static struct kbdfront_dev *kbd_dev; +static struct semaphore kbd_sem = __SEMAPHORE_INITIALIZER(kbd_sem, 0); static void kbdfront_thread(void *p) { DEFINE_WAIT(w); DEFINE_WAIT(w2); + DEFINE_WAIT(w3); int x = WIDTH / 2, y = HEIGHT / 2, z = 0; kbd_dev = init_kbdfront(NULL, 1); - if (!kbd_dev) + down(&fbfront_sem); + if (!kbd_dev) { + up(&kbd_sem); return; + } - down(&fbfront_sem); refresh_cursor(x, y); while (1) { union xenkbd_in_event kbdevent; @@ -349,6 +371,11 @@ add_waiter(w, kbdfront_queue); add_waiter(w2, fbfront_queue); + add_waiter(w3, shutdown_queue); + + rmb(); + if (do_shutdown) + break; while (kbdfront_receive(kbd_dev, &kbdevent, 1) != 0) { sleep = 0; @@ -391,9 +418,11 @@ fbfront_update(fb_dev, x - 16, y - 16, 33, 33); } } else if (kbdevent.key.keycode == KEY_Q) { - struct sched_shutdown sched_shutdown = { .reason = SHUTDOWN_poweroff }; - HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown); - do_exit(); + shutdown_reason = SHUTDOWN_poweroff; + wmb(); + do_shutdown = 1; + wmb(); + wake_up(&shutdown_queue); } break; } @@ -410,10 +439,17 @@ } if (sleep) schedule(); + remove_waiter(w3, shutdown_queue); + remove_waiter(w2, fbfront_queue); + remove_waiter(w, kbdfront_queue); } + up(&kbd_sem); } +#endif +#ifdef CONFIG_PCIFRONT static struct pcifront_dev *pci_dev; +static struct semaphore pci_sem = __SEMAPHORE_INITIALIZER(pci_sem, 0); static void print_pcidev(unsigned int domain, unsigned int bus, unsigned int slot, unsigned int fun) { @@ -431,39 +467,99 @@ { pcifront_watches(NULL); pci_dev = init_pcifront(NULL); - if (!pci_dev) + if (!pci_dev) { + up(&pci_sem); return; + } printk("PCI devices:\n"); pcifront_scan(pci_dev, print_pcidev); + up(&pci_sem); } - -int app_main(start_info_t *si) -{ - printk("Test main: start_info=%p\n", si); - create_thread("xenbus_tester", xenbus_tester, si); - create_thread("periodic_thread", periodic_thread, si); - create_thread("netfront", netfront_thread, si); - create_thread("blkfront", blkfront_thread, si); - create_thread("fbfront", fbfront_thread, si); - create_thread("kbdfront", kbdfront_thread, si); - create_thread("pcifront", pcifront_thread, si); - return 0; -} +#endif void shutdown_frontends(void) { +#ifdef CONFIG_NETFRONT + down(&net_sem); if (net_dev) shutdown_netfront(net_dev); +#endif +#ifdef CONFIG_BLKFRONT + down(&blk_sem); if (blk_dev) shutdown_blkfront(blk_dev); +#endif +#if defined(CONFIG_FBFRONT) && defined(CONFIG_KBDFRONT) if (fb_dev) shutdown_fbfront(fb_dev); + down(&kbd_sem); if (kbd_dev) shutdown_kbdfront(kbd_dev); +#endif +#ifdef CONFIG_PCIFRONT + down(&pci_sem); if (pci_dev) shutdown_pcifront(pci_dev); +#endif +} + +#ifdef CONFIG_XENBUS +void app_shutdown(unsigned reason) +{ + shutdown_reason = reason; + wmb(); + do_shutdown = 1; + wmb(); + wake_up(&shutdown_queue); +} + +static void shutdown_thread(void *p) +{ + DEFINE_WAIT(w); + + while (1) { + add_waiter(w, shutdown_queue); + rmb(); + if (do_shutdown) { + rmb(); + break; + } + schedule(); + remove_waiter(w, shutdown_queue); + } + + shutdown_frontends(); + + HYPERVISOR_shutdown(shutdown_reason); +} +#endif + +int app_main(start_info_t *si) +{ + printk("Test main: start_info=%p\n", si); +#ifdef CONFIG_XENBUS + create_thread("xenbus_tester", xenbus_tester, si); +#endif + create_thread("periodic_thread", periodic_thread, si); +#ifdef CONFIG_NETFRONT + create_thread("netfront", netfront_thread, si); +#endif +#ifdef CONFIG_BLKFRONT + create_thread("blkfront", blkfront_thread, si); +#endif +#if defined(CONFIG_FBFRONT) && defined(CONFIG_KBDFRONT) + create_thread("fbfront", fbfront_thread, si); + create_thread("kbdfront", kbdfront_thread, si); +#endif +#ifdef CONFIG_PCIFRONT + create_thread("pcifront", pcifront_thread, si); +#endif +#ifdef CONFIG_XENBUS + create_thread("shutdown", shutdown_thread, si); +#endif + return 0; } diff -Nru xen-4.2.2/extras/mini-os/tpm_tis.c xen-4.3.0/extras/mini-os/tpm_tis.c --- xen-4.2.2/extras/mini-os/tpm_tis.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/tpm_tis.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,1354 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * This code has been derived from drivers/char/tpm.c + * from the linux kernel + * + * Copyright (C) 2004 IBM Corporation + * + * This code has also been derived from drivers/char/tpm/tpm_tis.c + * from the linux kernel + * + * Copyright (C) 2005, 2006 IBM Corporation + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, version 2 + * of the License + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef min + #define min( a, b ) ( ((a) < (b)) ? (a) : (b) ) +#endif + +#define TPM_HEADER_SIZE 10 + +#define TPM_BUFSIZE 2048 + +struct tpm_input_header { + uint16_t tag; + uint32_t length; + uint32_t ordinal; +}__attribute__((packed)); + +struct tpm_output_header { + uint16_t tag; + uint32_t length; + uint32_t return_code; +}__attribute__((packed)); + +struct stclear_flags_t { + uint16_t tag; + uint8_t deactivated; + uint8_t disableForceClear; + uint8_t physicalPresence; + uint8_t physicalPresenceLock; + uint8_t bGlobalLock; +}__attribute__((packed)); + +struct tpm_version_t { + uint8_t Major; + uint8_t Minor; + uint8_t revMajor; + uint8_t revMinor; +}__attribute__((packed)); + +struct tpm_version_1_2_t { + uint16_t tag; + uint8_t Major; + uint8_t Minor; + uint8_t revMajor; + uint8_t revMinor; +}__attribute__((packed)); + +struct timeout_t { + uint32_t a; + uint32_t b; + uint32_t c; + uint32_t d; +}__attribute__((packed)); + +struct duration_t { + uint32_t tpm_short; + uint32_t tpm_medium; + uint32_t tpm_long; +}__attribute__((packed)); + +struct permanent_flags_t { + uint16_t tag; + uint8_t disable; + uint8_t ownership; + uint8_t deactivated; + uint8_t readPubek; + uint8_t disableOwnerClear; + uint8_t allowMaintenance; + uint8_t physicalPresenceLifetimeLock; + uint8_t physicalPresenceHWEnable; + uint8_t physicalPresenceCMDEnable; + uint8_t CEKPUsed; + uint8_t TPMpost; + uint8_t TPMpostLock; + uint8_t FIPS; + uint8_t operator; + uint8_t enableRevokeEK; + uint8_t nvLocked; + uint8_t readSRKPub; + uint8_t tpmEstablished; + uint8_t maintenanceDone; + uint8_t disableFullDALogicInfo; +}__attribute__((packed)); + +typedef union { + struct permanent_flags_t perm_flags; + struct stclear_flags_t stclear_flags; + bool owned; + uint32_t num_pcrs; + struct tpm_version_t tpm_version; + struct tpm_version_1_2_t tpm_version_1_2; + uint32_t manufacturer_id; + struct timeout_t timeout; + struct duration_t duration; +} cap_t; + +struct tpm_getcap_params_in { + uint32_t cap; + uint32_t subcap_size; + uint32_t subcap; +}__attribute__((packed)); + +struct tpm_getcap_params_out { + uint32_t cap_size; + cap_t cap; +}__attribute__((packed)); + +struct tpm_readpubek_params_out { + uint8_t algorithm[4]; + uint8_t encscheme[2]; + uint8_t sigscheme[2]; + uint32_t paramsize; + uint8_t parameters[12]; /*assuming RSA*/ + uint32_t keysize; + uint8_t modulus[256]; + uint8_t checksum[20]; +}__attribute__((packed)); + +typedef union { + struct tpm_input_header in; + struct tpm_output_header out; +} tpm_cmd_header; + +#define TPM_DIGEST_SIZE 20 +struct tpm_pcrread_out { + uint8_t pcr_result[TPM_DIGEST_SIZE]; +}__attribute__((packed)); + +struct tpm_pcrread_in { + uint32_t pcr_idx; +}__attribute__((packed)); + +struct tpm_pcrextend_in { + uint32_t pcr_idx; + uint8_t hash[TPM_DIGEST_SIZE]; +}__attribute__((packed)); + +typedef union { + struct tpm_getcap_params_out getcap_out; + struct tpm_readpubek_params_out readpubek_out; + uint8_t readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)]; + struct tpm_getcap_params_in getcap_in; + struct tpm_pcrread_in pcrread_in; + struct tpm_pcrread_out pcrread_out; + struct tpm_pcrextend_in pcrextend_in; +} tpm_cmd_params; + +struct tpm_cmd_t { + tpm_cmd_header header; + tpm_cmd_params params; +}__attribute__((packed)); + + +enum tpm_duration { + TPM_SHORT = 0, + TPM_MEDIUM = 1, + TPM_LONG = 2, + TPM_UNDEFINED, +}; + +#define TPM_MAX_ORDINAL 243 +#define TPM_MAX_PROTECTED_ORDINAL 12 +#define TPM_PROTECTED_ORDINAL_MASK 0xFF + +extern const uint8_t tpm_protected_ordinal_duration[TPM_MAX_PROTECTED_ORDINAL]; +extern const uint8_t tpm_ordinal_duration[TPM_MAX_ORDINAL]; + +#define TPM_DIGEST_SIZE 20 +#define TPM_ERROR_SIZE 10 +#define TPM_RET_CODE_IDX 6 + +/* tpm_capabilities */ +#define TPM_CAP_FLAG cpu_to_be32(4) +#define TPM_CAP_PROP cpu_to_be32(5) +#define CAP_VERSION_1_1 cpu_to_be32(0x06) +#define CAP_VERSION_1_2 cpu_to_be32(0x1A) + +/* tpm_sub_capabilities */ +#define TPM_CAP_PROP_PCR cpu_to_be32(0x101) +#define TPM_CAP_PROP_MANUFACTURER cpu_to_be32(0x103) +#define TPM_CAP_FLAG_PERM cpu_to_be32(0x108) +#define TPM_CAP_FLAG_VOL cpu_to_be32(0x109) +#define TPM_CAP_PROP_OWNER cpu_to_be32(0x111) +#define TPM_CAP_PROP_TIS_TIMEOUT cpu_to_be32(0x115) +#define TPM_CAP_PROP_TIS_DURATION cpu_to_be32(0x120) + + +#define TPM_INTERNAL_RESULT_SIZE 200 +#define TPM_TAG_RQU_COMMAND cpu_to_be16(193) +#define TPM_ORD_GET_CAP cpu_to_be32(101) + +extern const struct tpm_input_header tpm_getcap_header; + + + +const uint8_t tpm_protected_ordinal_duration[TPM_MAX_PROTECTED_ORDINAL] = { + TPM_UNDEFINED, /* 0 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 5 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 10 */ + TPM_SHORT, +}; + +const uint8_t tpm_ordinal_duration[TPM_MAX_ORDINAL] = { + TPM_UNDEFINED, /* 0 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 5 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 10 */ + TPM_SHORT, + TPM_MEDIUM, + TPM_LONG, + TPM_LONG, + TPM_MEDIUM, /* 15 */ + TPM_SHORT, + TPM_SHORT, + TPM_MEDIUM, + TPM_LONG, + TPM_SHORT, /* 20 */ + TPM_SHORT, + TPM_MEDIUM, + TPM_MEDIUM, + TPM_MEDIUM, + TPM_SHORT, /* 25 */ + TPM_SHORT, + TPM_MEDIUM, + TPM_SHORT, + TPM_SHORT, + TPM_MEDIUM, /* 30 */ + TPM_LONG, + TPM_MEDIUM, + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, /* 35 */ + TPM_MEDIUM, + TPM_MEDIUM, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_MEDIUM, /* 40 */ + TPM_LONG, + TPM_MEDIUM, + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, /* 45 */ + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_LONG, + TPM_MEDIUM, /* 50 */ + TPM_MEDIUM, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 55 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_MEDIUM, /* 60 */ + TPM_MEDIUM, + TPM_MEDIUM, + TPM_SHORT, + TPM_SHORT, + TPM_MEDIUM, /* 65 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 70 */ + TPM_SHORT, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 75 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_LONG, /* 80 */ + TPM_UNDEFINED, + TPM_MEDIUM, + TPM_LONG, + TPM_SHORT, + TPM_UNDEFINED, /* 85 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 90 */ + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_UNDEFINED, /* 95 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_MEDIUM, /* 100 */ + TPM_SHORT, + TPM_SHORT, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 105 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 110 */ + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, /* 115 */ + TPM_SHORT, + TPM_SHORT, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_LONG, /* 120 */ + TPM_LONG, + TPM_MEDIUM, + TPM_UNDEFINED, + TPM_SHORT, + TPM_SHORT, /* 125 */ + TPM_SHORT, + TPM_LONG, + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, /* 130 */ + TPM_MEDIUM, + TPM_UNDEFINED, + TPM_SHORT, + TPM_MEDIUM, + TPM_UNDEFINED, /* 135 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 140 */ + TPM_SHORT, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 145 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 150 */ + TPM_MEDIUM, + TPM_MEDIUM, + TPM_SHORT, + TPM_SHORT, + TPM_UNDEFINED, /* 155 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 160 */ + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 165 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_LONG, /* 170 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 175 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_MEDIUM, /* 180 */ + TPM_SHORT, + TPM_MEDIUM, + TPM_MEDIUM, + TPM_MEDIUM, + TPM_MEDIUM, /* 185 */ + TPM_SHORT, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 190 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 195 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 200 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, + TPM_SHORT, /* 205 */ + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_MEDIUM, /* 210 */ + TPM_UNDEFINED, + TPM_MEDIUM, + TPM_MEDIUM, + TPM_MEDIUM, + TPM_UNDEFINED, /* 215 */ + TPM_MEDIUM, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, + TPM_SHORT, /* 220 */ + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_SHORT, + TPM_UNDEFINED, /* 225 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 230 */ + TPM_LONG, + TPM_MEDIUM, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, /* 235 */ + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_UNDEFINED, + TPM_SHORT, /* 240 */ + TPM_UNDEFINED, + TPM_MEDIUM, +}; + +const struct tpm_input_header tpm_getcap_header = { + .tag = TPM_TAG_RQU_COMMAND, + .length = cpu_to_be32(22), + .ordinal = TPM_ORD_GET_CAP +}; + + +enum tis_access { + TPM_ACCESS_VALID = 0x80, + TPM_ACCESS_ACTIVE_LOCALITY = 0x20, /* (R) */ + TPM_ACCESS_RELINQUISH_LOCALITY = 0x20,/* (W) */ + TPM_ACCESS_REQUEST_PENDING = 0x04, /* (W) */ + TPM_ACCESS_REQUEST_USE = 0x02, /* (W) */ +}; + +enum tis_status { + TPM_STS_VALID = 0x80, /* (R) */ + TPM_STS_COMMAND_READY = 0x40, /* (R) */ + TPM_STS_DATA_AVAIL = 0x10, /* (R) */ + TPM_STS_DATA_EXPECT = 0x08, /* (R) */ + TPM_STS_GO = 0x20, /* (W) */ +}; + +enum tis_int_flags { + TPM_GLOBAL_INT_ENABLE = 0x80000000, + TPM_INTF_BURST_COUNT_STATIC = 0x100, + TPM_INTF_CMD_READY_INT = 0x080, + TPM_INTF_INT_EDGE_FALLING = 0x040, + TPM_INTF_INT_EDGE_RISING = 0x020, + TPM_INTF_INT_LEVEL_LOW = 0x010, + TPM_INTF_INT_LEVEL_HIGH = 0x008, + TPM_INTF_LOCALITY_CHANGE_INT = 0x004, + TPM_INTF_STS_VALID_INT = 0x002, + TPM_INTF_DATA_AVAIL_INT = 0x001, +}; + +enum tis_defaults { + TIS_MEM_BASE = 0xFED40000, + TIS_MEM_LEN = 0x5000, + TIS_SHORT_TIMEOUT = 750, /*ms*/ + TIS_LONG_TIMEOUT = 2000, /*2 sec */ +}; + +#define TPM_TIMEOUT 5 + +#define TPM_ACCESS(t, l) (((uint8_t*)t->pages[l]) + 0x0000) +#define TPM_INT_ENABLE(t, l) ((uint32_t*)(((uint8_t*)t->pages[l]) + 0x0008)) +#define TPM_INT_VECTOR(t, l) (((uint8_t*)t->pages[l]) + 0x000C) +#define TPM_INT_STATUS(t, l) (((uint8_t*)t->pages[l]) + 0x0010) +#define TPM_INTF_CAPS(t, l) ((uint32_t*)(((uint8_t*)t->pages[l]) + 0x0014)) +#define TPM_STS(t, l) ((uint8_t*)(((uint8_t*)t->pages[l]) + 0x0018)) +#define TPM_DATA_FIFO(t, l) (((uint8_t*)t->pages[l]) + 0x0024) + +#define TPM_DID_VID(t, l) ((uint32_t*)(((uint8_t*)t->pages[l]) + 0x0F00)) +#define TPM_RID(t, l) (((uint8_t*)t->pages[l]) + 0x0F04) + +struct tpm_chip { + int enabled_localities; + int locality; + unsigned long baseaddr; + uint8_t* pages[5]; + int did, vid, rid; + + uint8_t data_buffer[TPM_BUFSIZE]; + int data_len; + + s_time_t timeout_a, timeout_b, timeout_c, timeout_d; + s_time_t duration[3]; + +#ifdef HAVE_LIBC + int fd; +#endif + + unsigned int irq; + struct wait_queue_head read_queue; + struct wait_queue_head int_queue; +}; + + +static void __init_tpm_chip(struct tpm_chip* tpm) { + tpm->enabled_localities = TPM_TIS_EN_LOCLALL; + tpm->locality = -1; + tpm->baseaddr = 0; + tpm->pages[0] = tpm->pages[1] = tpm->pages[2] = tpm->pages[3] = tpm->pages[4] = NULL; + tpm->vid = 0; + tpm->did = 0; + tpm->irq = 0; + init_waitqueue_head(&tpm->read_queue); + init_waitqueue_head(&tpm->int_queue); + + tpm->data_len = -1; + +#ifdef HAVE_LIBC + tpm->fd = -1; +#endif +} + +/* + * Returns max number of nsecs to wait + */ +s_time_t tpm_calc_ordinal_duration(struct tpm_chip *chip, + uint32_t ordinal) +{ + int duration_idx = TPM_UNDEFINED; + s_time_t duration = 0; + + if (ordinal < TPM_MAX_ORDINAL) + duration_idx = tpm_ordinal_duration[ordinal]; + else if ((ordinal & TPM_PROTECTED_ORDINAL_MASK) < + TPM_MAX_PROTECTED_ORDINAL) + duration_idx = + tpm_protected_ordinal_duration[ordinal & + TPM_PROTECTED_ORDINAL_MASK]; + + if (duration_idx != TPM_UNDEFINED) { + duration = chip->duration[duration_idx]; + } + + if (duration <= 0) { + return SECONDS(120); + } + else + { + return duration; + } +} + + +static int locality_enabled(struct tpm_chip* tpm, int l) { + return tpm->enabled_localities & (1 << l); +} + +static int check_locality(struct tpm_chip* tpm, int l) { + if(locality_enabled(tpm, l) && (ioread8(TPM_ACCESS(tpm, l)) & + (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) == + (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) { + return l; + } + return -1; +} + +void release_locality(struct tpm_chip* tpm, int l, int force) +{ + if (locality_enabled(tpm, l) && (force || (ioread8(TPM_ACCESS(tpm, l)) & + (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) == + (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID))) { + iowrite8(TPM_ACCESS(tpm, l), TPM_ACCESS_RELINQUISH_LOCALITY); + } +} + +int tpm_tis_request_locality(struct tpm_chip* tpm, int l) { + + s_time_t stop; + /*Make sure locality is valid */ + if(!locality_enabled(tpm, l)) { + printk("tpm_tis_change_locality() Tried to change to locality %d, but it is disabled or invalid!\n", l); + return -1; + } + /* Check if we already have the current locality */ + if(check_locality(tpm, l) >= 0) { + return tpm->locality = l; + } + /* Set the new locality*/ + iowrite8(TPM_ACCESS(tpm, l), TPM_ACCESS_REQUEST_USE); + + if(tpm->irq) { + /* Wait for interrupt */ + wait_event_deadline(tpm->int_queue, (check_locality(tpm, l) >= 0), NOW() + tpm->timeout_a); + + /* FIXME: Handle timeout event, should return error in that case */ + return l; + } else { + /* Wait for burstcount */ + stop = NOW() + tpm->timeout_a; + do { + if(check_locality(tpm, l) >= 0) { + return tpm->locality = l; + } + msleep(TPM_TIMEOUT); + } while(NOW() < stop); + } + + printk("REQ LOCALITY FAILURE\n"); + return -1; +} + +static uint8_t tpm_tis_status(struct tpm_chip* tpm) { + return ioread8(TPM_STS(tpm, tpm->locality)); +} + +/* This causes the current command to be aborted */ +static void tpm_tis_ready(struct tpm_chip* tpm) { + iowrite8(TPM_STS(tpm, tpm->locality), TPM_STS_COMMAND_READY); +} +#define tpm_tis_cancel_cmd(v) tpm_tis_ready(v) + +static int get_burstcount(struct tpm_chip* tpm) { + s_time_t stop; + int burstcnt; + + stop = NOW() + tpm->timeout_d; + do { + burstcnt = ioread8((TPM_STS(tpm, tpm->locality) + 1)); + burstcnt += ioread8(TPM_STS(tpm, tpm->locality) + 2) << 8; + + if (burstcnt) { + return burstcnt; + } + msleep(TPM_TIMEOUT); + } while(NOW() < stop); + return -EBUSY; +} + +static int wait_for_stat(struct tpm_chip* tpm, uint8_t mask, + unsigned long timeout, struct wait_queue_head* queue) { + s_time_t stop; + uint8_t status; + + status = tpm_tis_status(tpm); + if((status & mask) == mask) { + return 0; + } + + if(tpm->irq) { + wait_event_deadline(*queue, ((tpm_tis_status(tpm) & mask) == mask), timeout); + /* FIXME: Check for timeout and return -ETIME */ + return 0; + } else { + stop = NOW() + timeout; + do { + msleep(TPM_TIMEOUT); + status = tpm_tis_status(tpm); + if((status & mask) == mask) + return 0; + } while( NOW() < stop); + } + return -ETIME; +} + +static int recv_data(struct tpm_chip* tpm, uint8_t* buf, size_t count) { + int size = 0; + int burstcnt; + while( size < count && + wait_for_stat(tpm, + TPM_STS_DATA_AVAIL | TPM_STS_VALID, + tpm->timeout_c, + &tpm->read_queue) + == 0) { + burstcnt = get_burstcount(tpm); + for(; burstcnt > 0 && size < count; --burstcnt) + { + buf[size++] = ioread8(TPM_DATA_FIFO(tpm, tpm->locality)); + } + } + return size; +} + +int tpm_tis_recv(struct tpm_chip* tpm, uint8_t* buf, size_t count) { + int size = 0; + int expected, status; + + if (count < TPM_HEADER_SIZE) { + size = -EIO; + goto out; + } + + /* read first 10 bytes, including tag, paramsize, and result */ + if((size = + recv_data(tpm, buf, TPM_HEADER_SIZE)) < TPM_HEADER_SIZE) { + printk("Error reading tpm cmd header\n"); + goto out; + } + + expected = be32_to_cpu(*((uint32_t*)(buf + 2))); + if(expected > count) { + size = -EIO; + goto out; + } + + if((size += recv_data(tpm, & buf[TPM_HEADER_SIZE], + expected - TPM_HEADER_SIZE)) < expected) { + printk("Unable to read rest of tpm command size=%d expected=%d\n", size, expected); + size = -ETIME; + goto out; + } + + wait_for_stat(tpm, TPM_STS_VALID, tpm->timeout_c, &tpm->int_queue); + status = tpm_tis_status(tpm); + if(status & TPM_STS_DATA_AVAIL) { + printk("Error: left over data\n"); + size = -EIO; + goto out; + } + +out: + tpm_tis_ready(tpm); + release_locality(tpm, tpm->locality, 0); + return size; +} +int tpm_tis_send(struct tpm_chip* tpm, uint8_t* buf, size_t len) { + int rc; + int status, burstcnt = 0; + int count = 0; + uint32_t ordinal; + + if(tpm_tis_request_locality(tpm, tpm->locality) < 0) { + return -EBUSY; + } + + status = tpm_tis_status(tpm); + if((status & TPM_STS_COMMAND_READY) == 0) { + tpm_tis_ready(tpm); + if(wait_for_stat(tpm, TPM_STS_COMMAND_READY, tpm->timeout_b, &tpm->int_queue) < 0) { + rc = -ETIME; + goto out_err; + } + } + + while(count < len - 1) { + burstcnt = get_burstcount(tpm); + for(;burstcnt > 0 && count < len -1; --burstcnt) { + iowrite8(TPM_DATA_FIFO(tpm, tpm->locality), buf[count++]); + } + + wait_for_stat(tpm, TPM_STS_VALID, tpm->timeout_c, &tpm->int_queue); + status = tpm_tis_status(tpm); + if((status & TPM_STS_DATA_EXPECT) == 0) { + rc = -EIO; + goto out_err; + } + } + + /*Write last byte*/ + iowrite8(TPM_DATA_FIFO(tpm, tpm->locality), buf[count]); + wait_for_stat(tpm, TPM_STS_VALID, tpm->timeout_c, &tpm->read_queue); + status = tpm_tis_status(tpm); + if((status & TPM_STS_DATA_EXPECT) != 0) { + rc = -EIO; + goto out_err; + } + + /*go and do it*/ + iowrite8(TPM_STS(tpm, tpm->locality), TPM_STS_GO); + + if(tpm->irq) { + /*Wait for interrupt */ + ordinal = be32_to_cpu(*(buf + 6)); + if(wait_for_stat(tpm, + TPM_STS_DATA_AVAIL | TPM_STS_VALID, + tpm_calc_ordinal_duration(tpm, ordinal), + &tpm->read_queue) < 0) { + rc = -ETIME; + goto out_err; + } + } +#ifdef HAVE_LIBC + if(tpm->fd >= 0) { + files[tpm->fd].read = 0; + files[tpm->fd].tpm_tis.respgot = 0; + files[tpm->fd].tpm_tis.offset = 0; + } +#endif + return len; + +out_err: + tpm_tis_ready(tpm); + release_locality(tpm, tpm->locality, 0); + return rc; +} + +static void tpm_tis_irq_handler(evtchn_port_t port, struct pt_regs *regs, void* data) +{ + struct tpm_chip* tpm = data; + uint32_t interrupt; + int i; + + interrupt = ioread32(TPM_INT_STATUS(tpm, tpm->locality)); + if(interrupt == 0) { + return; + } + + if(interrupt & TPM_INTF_DATA_AVAIL_INT) { + wake_up(&tpm->read_queue); + } + if(interrupt & TPM_INTF_LOCALITY_CHANGE_INT) { + for(i = 0; i < 5; ++i) { + if(check_locality(tpm, i) >= 0) { + break; + } + } + } + if(interrupt & (TPM_INTF_LOCALITY_CHANGE_INT | TPM_INTF_STS_VALID_INT | + TPM_INTF_CMD_READY_INT)) { + wake_up(&tpm->int_queue); + } + + /* Clear interrupts handled with TPM_EOI */ + iowrite32(TPM_INT_STATUS(tpm, tpm->locality), interrupt); + ioread32(TPM_INT_STATUS(tpm, tpm->locality)); + return; +} + +/* + * Internal kernel interface to transmit TPM commands + */ +static ssize_t tpm_transmit(struct tpm_chip *chip, const uint8_t *buf, + size_t bufsiz) +{ + ssize_t rc; + uint32_t count, ordinal; + s_time_t stop; + + count = be32_to_cpu(*((uint32_t *) (buf + 2))); + ordinal = be32_to_cpu(*((uint32_t *) (buf + 6))); + if (count == 0) + return -ENODATA; + if (count > bufsiz) { + printk("Error: invalid count value %x %zx \n", count, bufsiz); + return -E2BIG; + } + + //down(&chip->tpm_mutex); + + if ((rc = tpm_tis_send(chip, (uint8_t *) buf, count)) < 0) { + printk("tpm_transmit: tpm_send: error %ld\n", rc); + goto out; + } + + if (chip->irq) + goto out_recv; + + stop = NOW() + tpm_calc_ordinal_duration(chip, ordinal); + do { + uint8_t status = tpm_tis_status(chip); + if ((status & (TPM_STS_DATA_AVAIL | TPM_STS_VALID)) == + (TPM_STS_DATA_AVAIL | TPM_STS_VALID)) + goto out_recv; + + if ((status == TPM_STS_COMMAND_READY)) { + printk("TPM Error: Operation Canceled\n"); + rc = -ECANCELED; + goto out; + } + + msleep(TPM_TIMEOUT); /* CHECK */ + rmb(); + } while (NOW() < stop); + + /* Cancel the command */ + tpm_tis_cancel_cmd(chip); + printk("TPM Operation Timed out\n"); + rc = -ETIME; + goto out; + +out_recv: + if((rc = tpm_tis_recv(chip, (uint8_t *) buf, bufsiz)) < 0) { + printk("tpm_transmit: tpm_recv: error %d\n", rc); + } +out: + //up(&chip->tpm_mutex); + return rc; +} + +static ssize_t transmit_cmd(struct tpm_chip *chip, struct tpm_cmd_t *cmd, + int len, const char *desc) +{ + int err; + + len = tpm_transmit(chip,(uint8_t *) cmd, len); + if (len < 0) + return len; + if (len == TPM_ERROR_SIZE) { + err = be32_to_cpu(cmd->header.out.return_code); + printk("A TPM error (%d) occurred %s\n", err, desc); + return err; + } + return 0; +} + +int tpm_get_timeouts(struct tpm_chip *chip) +{ + struct tpm_cmd_t tpm_cmd; + struct timeout_t *timeout_cap; + struct duration_t *duration_cap; + ssize_t rc; + uint32_t timeout; + unsigned int scale = 1; + + tpm_cmd.header.in = tpm_getcap_header; + tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP; + tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4); + tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_TIMEOUT; + + if((rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, + "attempting to determine the timeouts")) != 0) { + printk("transmit failed %d\n", rc); + goto duration; + } + + if(be32_to_cpu(tpm_cmd.header.out.return_code) != 0 || + be32_to_cpu(tpm_cmd.header.out.length) != + sizeof(tpm_cmd.header.out) + sizeof(uint32_t) + 4 * sizeof(uint32_t)) { + return -EINVAL; + } + + timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout; + /* Don't overwrite default if value is 0 */ + timeout = be32_to_cpu(timeout_cap->a); + if(timeout && timeout < 1000) { + /* timeouts in msc rather usec */ + scale = 1000; + } + if (timeout) + chip->timeout_a = MICROSECS(timeout * scale); /*Convert to msec */ + timeout = be32_to_cpu(timeout_cap->b); + if (timeout) + chip->timeout_b = MICROSECS(timeout * scale); /*Convert to msec */ + timeout = be32_to_cpu(timeout_cap->c); + if (timeout) + chip->timeout_c = MICROSECS(timeout * scale); /*Convert to msec */ + timeout = be32_to_cpu(timeout_cap->d); + if (timeout) + chip->timeout_d = MICROSECS(timeout * scale); /*Convert to msec */ + +duration: + tpm_cmd.header.in = tpm_getcap_header; + tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP; + tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4); + tpm_cmd.params.getcap_in.subcap = TPM_CAP_PROP_TIS_DURATION; + + if((rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, + "attempting to determine the durations")) < 0) { + return rc; + } + + if(be32_to_cpu(tpm_cmd.header.out.return_code) != 0 || + be32_to_cpu(tpm_cmd.header.out.length) != + sizeof(tpm_cmd.header.out) + sizeof(uint32_t) + 3 * sizeof(uint32_t)) { + return -EINVAL; + } + + duration_cap = &tpm_cmd.params.getcap_out.cap.duration; + chip->duration[TPM_SHORT] = MICROSECS(be32_to_cpu(duration_cap->tpm_short)); + chip->duration[TPM_MEDIUM] = MICROSECS(be32_to_cpu(duration_cap->tpm_medium)); + chip->duration[TPM_LONG] = MICROSECS(be32_to_cpu(duration_cap->tpm_long)); + + /* The Broadcom BCM0102 chipset in a Dell Latitude D820 gets the above + * value wrong and apparently reports msecs rather than usecs. So we + * fix up the resulting too-small TPM_SHORT value to make things work. + */ + if (chip->duration[TPM_SHORT] < MILLISECS(10)) { + chip->duration[TPM_SHORT] = SECONDS(1); + chip->duration[TPM_MEDIUM] *= 1000; + chip->duration[TPM_LONG] *= 1000; + printk("Adjusting TPM timeout parameters\n"); + } + + return 0; +} + + + +void tpm_continue_selftest(struct tpm_chip* chip) { + uint8_t data[] = { + 0, 193, /* TPM_TAG_RQU_COMMAND */ + 0, 0, 0, 10, /* length */ + 0, 0, 0, 83, /* TPM_ORD_GetCapability */ + }; + + tpm_transmit(chip, data, sizeof(data)); +} + +ssize_t tpm_getcap(struct tpm_chip *chip, uint32_t subcap_id, cap_t *cap, + const char *desc) +{ + struct tpm_cmd_t tpm_cmd; + int rc; + + tpm_cmd.header.in = tpm_getcap_header; + if (subcap_id == CAP_VERSION_1_1 || subcap_id == CAP_VERSION_1_2) { + tpm_cmd.params.getcap_in.cap = subcap_id; + /*subcap field not necessary */ + tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(0); + tpm_cmd.header.in.length -= cpu_to_be32(sizeof(uint32_t)); + } else { + if (subcap_id == TPM_CAP_FLAG_PERM || + subcap_id == TPM_CAP_FLAG_VOL) + tpm_cmd.params.getcap_in.cap = TPM_CAP_FLAG; + else + tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP; + tpm_cmd.params.getcap_in.subcap_size = cpu_to_be32(4); + tpm_cmd.params.getcap_in.subcap = subcap_id; + } + rc = transmit_cmd(chip, &tpm_cmd, TPM_INTERNAL_RESULT_SIZE, desc); + if (!rc) + *cap = tpm_cmd.params.getcap_out.cap; + return rc; +} + + +struct tpm_chip* init_tpm_tis(unsigned long baseaddr, int localities, unsigned int irq) +{ + int i; + unsigned long addr; + struct tpm_chip* tpm = NULL; + uint32_t didvid; + uint32_t intfcaps; + uint32_t intmask; + + printk("============= Init TPM TIS Driver ==============\n"); + + /*Sanity check the localities input */ + if(localities & ~TPM_TIS_EN_LOCLALL) { + printk("init_tpm_tis() Invalid locality specification! %X\n", localities); + goto abort_egress; + } + + printk("IOMEM Machine Base Address: %lX\n", baseaddr); + + /* Create the tpm data structure */ + tpm = malloc(sizeof(struct tpm_chip)); + __init_tpm_chip(tpm); + + /* Set the enabled localities - if 0 we leave default as all enabled */ + if(localities != 0) { + tpm->enabled_localities = localities; + } + printk("Enabled Localities: "); + for(i = 0; i < 5; ++i) { + if(locality_enabled(tpm, i)) { + printk("%d ", i); + } + } + printk("\n"); + + /* Set the base machine address */ + tpm->baseaddr = baseaddr; + + /* Set default timeouts */ + tpm->timeout_a = MILLISECS(TIS_SHORT_TIMEOUT); + tpm->timeout_b = MILLISECS(TIS_LONG_TIMEOUT); + tpm->timeout_c = MILLISECS(TIS_SHORT_TIMEOUT); + tpm->timeout_d = MILLISECS(TIS_SHORT_TIMEOUT); + + /*Map the mmio pages */ + addr = tpm->baseaddr; + for(i = 0; i < 5; ++i) { + if(locality_enabled(tpm, i)) { + /* Map the page in now */ + if((tpm->pages[i] = ioremap_nocache(addr, PAGE_SIZE)) == NULL) { + printk("Unable to map iomem page a address %p\n", addr); + goto abort_egress; + } + + /* Set default locality to the first enabled one */ + if (tpm->locality < 0) { + if(tpm_tis_request_locality(tpm, i) < 0) { + printk("Unable to request locality %d??\n", i); + goto abort_egress; + } + } + } + addr += PAGE_SIZE; + } + + + /* Get the vendor and device ids */ + didvid = ioread32(TPM_DID_VID(tpm, tpm->locality)); + tpm->did = didvid >> 16; + tpm->vid = didvid & 0xFFFF; + + + /* Get the revision id */ + tpm->rid = ioread8(TPM_RID(tpm, tpm->locality)); + + printk("1.2 TPM (device-id=0x%X vendor-id = %X rev-id = %X)\n", tpm->did, tpm->vid, tpm->rid); + + intfcaps = ioread32(TPM_INTF_CAPS(tpm, tpm->locality)); + printk("TPM interface capabilities (0x%x):\n", intfcaps); + if (intfcaps & TPM_INTF_BURST_COUNT_STATIC) + printk("\tBurst Count Static\n"); + if (intfcaps & TPM_INTF_CMD_READY_INT) + printk("\tCommand Ready Int Support\n"); + if (intfcaps & TPM_INTF_INT_EDGE_FALLING) + printk("\tInterrupt Edge Falling\n"); + if (intfcaps & TPM_INTF_INT_EDGE_RISING) + printk("\tInterrupt Edge Rising\n"); + if (intfcaps & TPM_INTF_INT_LEVEL_LOW) + printk("\tInterrupt Level Low\n"); + if (intfcaps & TPM_INTF_INT_LEVEL_HIGH) + printk("\tInterrupt Level High\n"); + if (intfcaps & TPM_INTF_LOCALITY_CHANGE_INT) + printk("\tLocality Change Int Support\n"); + if (intfcaps & TPM_INTF_STS_VALID_INT) + printk("\tSts Valid Int Support\n"); + if (intfcaps & TPM_INTF_DATA_AVAIL_INT) + printk("\tData Avail Int Support\n"); + + /*Interupt setup */ + intmask = ioread32(TPM_INT_ENABLE(tpm, tpm->locality)); + + intmask |= TPM_INTF_CMD_READY_INT + | TPM_INTF_LOCALITY_CHANGE_INT | TPM_INTF_DATA_AVAIL_INT + | TPM_INTF_STS_VALID_INT; + + iowrite32(TPM_INT_ENABLE(tpm, tpm->locality), intmask); + + /*If interupts are enabled, handle it */ + if(irq) { + if(irq != TPM_PROBE_IRQ) { + tpm->irq = irq; + } else { + /*FIXME add irq probing feature later */ + printk("IRQ probing not implemented\n"); + } + } + + if(tpm->irq) { + iowrite8(TPM_INT_VECTOR(tpm, tpm->locality), tpm->irq); + + if(bind_pirq(tpm->irq, 1, tpm_tis_irq_handler, tpm) != 0) { + printk("Unabled to request irq: %u for use\n", tpm->irq); + printk("Will use polling mode\n"); + tpm->irq = 0; + } else { + /* Clear all existing */ + iowrite32(TPM_INT_STATUS(tpm, tpm->locality), ioread32(TPM_INT_STATUS(tpm, tpm->locality))); + + /* Turn on interrupts */ + iowrite32(TPM_INT_ENABLE(tpm, tpm->locality), intmask | TPM_GLOBAL_INT_ENABLE); + } + } + + if(tpm_get_timeouts(tpm)) { + printk("Could not get TPM timeouts and durations\n"); + goto abort_egress; + } + tpm_continue_selftest(tpm); + + + return tpm; +abort_egress: + if(tpm != NULL) { + shutdown_tpm_tis(tpm); + } + return NULL; +} + +void shutdown_tpm_tis(struct tpm_chip* tpm){ + int i; + + printk("Shutting down tpm_tis device\n"); + + iowrite32(TPM_INT_ENABLE(tpm, tpm->locality), ~TPM_GLOBAL_INT_ENABLE); + + /*Unmap all of the mmio pages */ + for(i = 0; i < 5; ++i) { + if(tpm->pages[i] != NULL) { + iounmap(tpm->pages[i], PAGE_SIZE); + tpm->pages[i] = NULL; + } + } + free(tpm); + return; +} + + +int tpm_tis_cmd(struct tpm_chip* tpm, uint8_t* req, size_t reqlen, uint8_t** resp, size_t* resplen) +{ + if(tpm->locality < 0) { + printk("tpm_tis_cmd() failed! locality not set!\n"); + return -1; + } + if(reqlen > TPM_BUFSIZE) { + reqlen = TPM_BUFSIZE; + } + memcpy(tpm->data_buffer, req, reqlen); + *resplen = tpm_transmit(tpm, tpm->data_buffer, TPM_BUFSIZE); + + *resp = malloc(*resplen); + memcpy(*resp, tpm->data_buffer, *resplen); + return 0; +} + +#ifdef HAVE_LIBC +int tpm_tis_open(struct tpm_chip* tpm) +{ + /* Silently prevent multiple opens */ + if(tpm->fd != -1) { + return tpm->fd; + } + + tpm->fd = alloc_fd(FTYPE_TPM_TIS); + printk("tpm_tis_open() -> %d\n", tpm->fd); + files[tpm->fd].tpm_tis.dev = tpm; + files[tpm->fd].tpm_tis.offset = 0; + files[tpm->fd].tpm_tis.respgot = 0; + return tpm->fd; +} + +int tpm_tis_posix_write(int fd, const uint8_t* buf, size_t count) +{ + struct tpm_chip* tpm; + tpm = files[fd].tpm_tis.dev; + + if(tpm->locality < 0) { + printk("tpm_tis_posix_write() failed! locality not set!\n"); + errno = EINPROGRESS; + return -1; + } + if(count == 0) { + return 0; + } + + /* Return an error if we are already processing a command */ + if(count > TPM_BUFSIZE) { + count = TPM_BUFSIZE; + } + /* Send the command now */ + memcpy(tpm->data_buffer, buf, count); + if((tpm->data_len = tpm_transmit(tpm, tpm->data_buffer, TPM_BUFSIZE)) < 0) { + errno = EIO; + return -1; + } + return count; +} + +int tpm_tis_posix_read(int fd, uint8_t* buf, size_t count) +{ + int rc; + struct tpm_chip* tpm; + tpm = files[fd].tpm_tis.dev; + + if(count == 0) { + return 0; + } + + /* If there is no tpm resp to read, return EIO */ + if(tpm->data_len < 0) { + errno = EIO; + return -1; + } + + + /* Handle EOF case */ + if(files[fd].tpm_tis.offset >= tpm->data_len) { + rc = 0; + } else { + rc = min(tpm->data_len - files[fd].tpm_tis.offset, count); + memcpy(buf, tpm->data_buffer + files[fd].tpm_tis.offset, rc); + } + files[fd].tpm_tis.offset += rc; + /* Reset the data pending flag */ + return rc; +} +int tpm_tis_posix_fstat(int fd, struct stat* buf) +{ + struct tpm_chip* tpm; + tpm = files[fd].tpm_tis.dev; + + buf->st_mode = O_RDWR; + buf->st_uid = 0; + buf->st_gid = 0; + buf->st_size = be32_to_cpu(*((uint32_t*)(tpm->data_buffer + 2))); + buf->st_atime = buf->st_mtime = buf->st_ctime = time(NULL); + return 0; +} + + +#endif diff -Nru xen-4.2.2/extras/mini-os/tpmback.c xen-4.3.0/extras/mini-os/tpmback.c --- xen-4.2.2/extras/mini-os/tpmback.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/tpmback.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,1134 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * This code has been derived from drivers/xen/tpmback/tpmback.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2005, IBM Corporation + * + * which was itself derived from drivers/xen/netback/netback.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2002-2004, K A Fraser + * + * This code has also been derived from drivers/xen/tpmback/xenbus.c + * from the xen 2.6.18 linux kernel + * + * Copyright (C) 2005 IBM Corporation + * Copyright (C) 2005 Rusty Russell + * + * This code has also been derived from drivers/xen/tpmback/interface.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2005, IBM Corporation + * + * which was itself also derived from drvivers/xen/netback/interface.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2004, Keir Fraser + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, version 2 + * of the License + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifndef HAVE_LIBC +#define strtoul simple_strtoul +#endif + +//#define TPMBACK_PRINT_DEBUG +#ifdef TPMBACK_PRINT_DEBUG +#define TPMBACK_DEBUG(fmt,...) printk("Tpmback:Debug("__FILE__":%d) " fmt, __LINE__, ##__VA_ARGS__) +#define TPMBACK_DEBUG_MORE(fmt,...) printk(fmt, ##__VA_ARGS__) +#else +#define TPMBACK_DEBUG(fmt,...) +#endif +#define TPMBACK_ERR(fmt,...) printk("Tpmback:Error " fmt, ##__VA_ARGS__) +#define TPMBACK_LOG(fmt,...) printk("Tpmback:Info " fmt, ##__VA_ARGS__) + +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +/* Default size of the tpmif array at initialization */ +#define DEF_ARRAY_SIZE 1 + +/* tpmif and tpmdev flags */ +#define TPMIF_CLOSED 1 +#define TPMIF_REQ_READY 2 + +struct tpmif { + domid_t domid; + unsigned int handle; + + char* fe_path; + char* fe_state_path; + + /* Locally bound event channel*/ + evtchn_port_t evtchn; + + /* Shared page */ + tpmif_shared_page_t *page; + + enum xenbus_state state; + enum { DISCONNECTED, DISCONNECTING, CONNECTED } status; + + unsigned char uuid[16]; + void* opaque; + + /* state flags */ + int flags; +}; +typedef struct tpmif tpmif_t; + +struct tpmback_dev { + + tpmif_t** tpmlist; + unsigned long num_tpms; + unsigned long num_alloc; + + struct gntmap map; + + /* True if at least one tpmif has a request to be handled */ + int flags; + + xenbus_event_queue events; + + /* Callbacks */ + void (*open_callback)(domid_t, unsigned int); + void (*close_callback)(domid_t, unsigned int); +}; +typedef struct tpmback_dev tpmback_dev_t; + +enum { EV_NONE, EV_NEWFE, EV_STCHNG } tpm_ev_enum; + +/* Global objects */ +static struct thread* eventthread = NULL; +static tpmback_dev_t gtpmdev = { + .tpmlist = NULL, + .num_tpms = 0, + .num_alloc = 0, + .flags = TPMIF_CLOSED, + .events = NULL, + .open_callback = NULL, + .close_callback = NULL, +}; +struct wait_queue_head waitq; +int globalinit = 0; + +/************************************ + * TPMIF SORTED ARRAY FUNCTIONS + * tpmback_dev_t.tpmlist is a sorted array, sorted by domid and then handle number + * Duplicates are not allowed + * **********************************/ + +inline void tpmif_req_ready(tpmif_t* tpmif) { + tpmif->flags |= TPMIF_REQ_READY; + gtpmdev.flags |= TPMIF_REQ_READY; +} + +inline void tpmdev_check_req(void) { + int i; + int flags; + local_irq_save(flags); + for(i = 0; i < gtpmdev.num_tpms; ++i) { + if(gtpmdev.tpmlist[i]->flags & TPMIF_REQ_READY) { + gtpmdev.flags |= TPMIF_REQ_READY; + local_irq_restore(flags); + return; + } + } + gtpmdev.flags &= ~TPMIF_REQ_READY; + local_irq_restore(flags); +} + +inline void tpmif_req_finished(tpmif_t* tpmif) { + tpmif->flags &= ~TPMIF_REQ_READY; + tpmdev_check_req(); +} + +int __get_tpmif_index(int st, int n, domid_t domid, unsigned int handle) +{ + int i = st + n /2; + tpmif_t* tmp; + + if( n <= 0 ) + return -1; + + tmp = gtpmdev.tpmlist[i]; + if(domid == tmp->domid && tmp->handle == handle) { + return i; + } else if ( (domid < tmp->domid) || + (domid == tmp->domid && handle < tmp->handle)) { + return __get_tpmif_index(st, n/2, domid, handle); + } else { + return __get_tpmif_index(i + 1, n/2 - ((n +1) % 2), domid, handle); + } +} + +/* Returns the array index of the tpmif domid/handle. Returns -1 if no such tpmif exists */ +int get_tpmif_index(domid_t domid, unsigned int handle) +{ + int flags; + int index; + local_irq_save(flags); + index = __get_tpmif_index(0, gtpmdev.num_tpms, domid, handle); + local_irq_restore(flags); + return index; +} + +/* Returns the tpmif domid/handle or NULL if none exists */ +tpmif_t* get_tpmif(domid_t domid, unsigned int handle) +{ + int flags; + int i; + tpmif_t* ret; + local_irq_save(flags); + i = get_tpmif_index(domid, handle); + if (i < 0) { + ret = NULL; + } else { + ret = gtpmdev.tpmlist[i]; + } + local_irq_restore(flags); + return ret; +} + +/* Remove the given tpmif. Returns 0 if it was removed, -1 if it was not removed */ +int remove_tpmif(tpmif_t* tpmif) +{ + int i, j; + char* err; + int flags; + local_irq_save(flags); + + /* Find the index in the array if it exists */ + i = get_tpmif_index(tpmif->domid, tpmif->handle); + if (i < 0) { + goto error; + } + + /* Remove the interface from the list */ + for(j = i; j < gtpmdev.num_tpms - 1; ++j) { + gtpmdev.tpmlist[j] = gtpmdev.tpmlist[j+1]; + } + gtpmdev.tpmlist[j] = NULL; + --gtpmdev.num_tpms; + + /* If removed tpm was the only ready tpm, then we need to check and turn off the ready flag */ + tpmdev_check_req(); + + local_irq_restore(flags); + + /* Stop listening for events on this tpm interface */ + if((err = xenbus_unwatch_path_token(XBT_NIL, tpmif->fe_state_path, tpmif->fe_state_path))) { + TPMBACK_ERR("Unable to unwatch path token `%s' Error was %s Ignoring..\n", tpmif->fe_state_path, err); + free(err); + } + + return 0; +error: + local_irq_restore(flags); + return -1; +} + +/* Insert tpmif into dev->tpmlist. Returns 0 on success and non zero on error. + * It is an error to insert a tpmif with the same domid and handle + * number + * as something already in the list */ +int insert_tpmif(tpmif_t* tpmif) +{ + int flags; + unsigned int i, j; + tpmif_t* tmp; + char* err; + char path[512]; + + local_irq_save(flags); + + /*Check if we need to allocate more space */ + if (gtpmdev.num_tpms == gtpmdev.num_alloc) { + gtpmdev.num_alloc *= 2; + gtpmdev.tpmlist = realloc(gtpmdev.tpmlist, gtpmdev.num_alloc); + } + + /*Find where to put the new interface */ + for(i = 0; i < gtpmdev.num_tpms; ++i) + { + tmp = gtpmdev.tpmlist[i]; + if(tpmif->domid == tmp->domid && tpmif->handle == tmp->handle) { + TPMBACK_ERR("Tried to insert duplicate tpm interface %u/%u\n", (unsigned int) tpmif->domid, tpmif->handle); + goto error; + } + if((tpmif->domid < tmp->domid) || + (tpmif->domid == tmp->domid && tpmif->handle < tmp->handle)) { + break; + } + } + + /*Shift all the tpm pointers past i down one */ + for(j = gtpmdev.num_tpms; j > i; --j) { + gtpmdev.tpmlist[j] = gtpmdev.tpmlist[j-1]; + } + + /*Add the new interface */ + gtpmdev.tpmlist[i] = tpmif; + ++gtpmdev.num_tpms; + + /*Should not be needed, anything inserted with ready flag is probably an error */ + tpmdev_check_req(); + + local_irq_restore(flags); + + snprintf(path, 512, "backend/vtpm/%u/%u/feature-protocol-v2", (unsigned int) tpmif->domid, tpmif->handle); + if ((err = xenbus_write(XBT_NIL, path, "1"))) + { + /* if we got an error here we should carefully remove the interface and then return */ + TPMBACK_ERR("Unable to write feature-protocol-v2 node: %s\n", err); + free(err); + remove_tpmif(tpmif); + goto error_post_irq; + } + + /*Listen for state changes on the new interface */ + if((err = xenbus_watch_path_token(XBT_NIL, tpmif->fe_state_path, tpmif->fe_state_path, >pmdev.events))) + { + /* if we got an error here we should carefully remove the interface and then return */ + TPMBACK_ERR("Unable to watch path token `%s' Error was %s\n", tpmif->fe_state_path, err); + free(err); + remove_tpmif(tpmif); + goto error_post_irq; + } + return 0; +error: + local_irq_restore(flags); +error_post_irq: + return -1; +} + + +/***************** + * CHANGE BACKEND STATE + * *****************/ +/*Attempts to change the backend state in xenstore + * returns 0 on success and non-zero on error */ +int tpmif_change_state(tpmif_t* tpmif, enum xenbus_state state) +{ + char path[512]; + char *value; + char *err; + enum xenbus_state readst; + TPMBACK_DEBUG("Backend state change %u/%u from=%d to=%d\n", (unsigned int) tpmif->domid, tpmif->handle, tpmif->state, state); + if (tpmif->state == state) + return 0; + + snprintf(path, 512, "backend/vtpm/%u/%u/state", (unsigned int) tpmif->domid, tpmif->handle); + + if((err = xenbus_read(XBT_NIL, path, &value))) { + TPMBACK_ERR("Unable to read backend state %s, error was %s\n", path, err); + free(err); + return -1; + } + if(sscanf(value, "%d", &readst) != 1) { + TPMBACK_ERR("Non integer value (%s) in %s ??\n", value, path); + free(value); + return -1; + } + free(value); + + /* It's possible that the backend state got updated by hotplug or something else behind our back */ + if(readst != tpmif->state) { + TPMBACK_DEBUG("tpm interface state was %d but xenstore state was %d!\n", tpmif->state, readst); + tpmif->state = readst; + } + + /*If if the state isnt changing, then we dont update xenstore b/c we dont want to fire extraneous events */ + if(tpmif->state == state) { + return 0; + } + + /*update xenstore*/ + snprintf(path, 512, "backend/vtpm/%u/%u", (unsigned int) tpmif->domid, tpmif->handle); + if((err = xenbus_printf(XBT_NIL, path, "state", "%u", state))) { + TPMBACK_ERR("Error writing to xenstore %s, error was %s new state=%d\n", path, err, state); + free(err); + return -1; + } + + tpmif->state = state; + + return 0; +} +/********************************** + * TPMIF CREATION AND DELETION + * *******************************/ +inline tpmif_t* __init_tpmif(domid_t domid, unsigned int handle) +{ + tpmif_t* tpmif; + tpmif = malloc(sizeof(*tpmif)); + tpmif->domid = domid; + tpmif->handle = handle; + tpmif->fe_path = NULL; + tpmif->fe_state_path = NULL; + tpmif->state = XenbusStateInitialising; + tpmif->status = DISCONNECTED; + tpmif->page = NULL; + tpmif->flags = 0; + tpmif->opaque = NULL; + memset(tpmif->uuid, 0, sizeof(tpmif->uuid)); + return tpmif; +} + +void __free_tpmif(tpmif_t* tpmif) +{ + if(tpmif->fe_path) { + free(tpmif->fe_path); + } + if(tpmif->fe_state_path) { + free(tpmif->fe_state_path); + } + free(tpmif); +} +/* Creates a new tpm interface, adds it to the sorted array and returns it. + * returns NULL on error + * If the tpm interface already exists, it is returned*/ +tpmif_t* new_tpmif(domid_t domid, unsigned int handle) +{ + tpmif_t* tpmif; + char* err; + char path[512]; + + /* Make sure we haven't already created this tpm + * Double events can occur */ + if((tpmif = get_tpmif(domid, handle)) != NULL) { + return tpmif; + } + + tpmif = __init_tpmif(domid, handle); + + /* Get the uuid from xenstore */ + snprintf(path, 512, "backend/vtpm/%u/%u/uuid", (unsigned int) domid, handle); + if((!xenbus_read_uuid(path, tpmif->uuid))) { + TPMBACK_ERR("Error reading %s\n", path); + goto error; + } + + if(tpmif_change_state(tpmif, XenbusStateInitWait)) { + goto error; + } + + snprintf(path, 512, "backend/vtpm/%u/%u/frontend", (unsigned int) domid, handle); + if((err = xenbus_read(XBT_NIL, path, &tpmif->fe_path))) { + TPMBACK_ERR("Error creating new tpm instance xenbus_read(%s), Error = %s", path, err); + free(err); + goto error; + } + + /*Set the state path */ + tpmif->fe_state_path = malloc(strlen(tpmif->fe_path) + 7); + strcpy(tpmif->fe_state_path, tpmif->fe_path); + strcat(tpmif->fe_state_path, "/state"); + + if(insert_tpmif(tpmif)) { + goto error; + } + TPMBACK_DEBUG("New tpmif %u/%u\n", (unsigned int) tpmif->domid, tpmif->handle); + /* Do the callback now */ + if(gtpmdev.open_callback) { + gtpmdev.open_callback(tpmif->domid, tpmif->handle); + } + return tpmif; +error: + __free_tpmif(tpmif); + return NULL; + +} + +/* Removes tpmif from dev->tpmlist and frees it's memory usage */ +void free_tpmif(tpmif_t* tpmif) +{ + char* err; + char path[512]; + TPMBACK_DEBUG("Free tpmif %u/%u\n", (unsigned int) tpmif->domid, tpmif->handle); + if(tpmif->flags & TPMIF_CLOSED) { + TPMBACK_ERR("Tried to free an instance twice! Theres a bug somewhere!\n"); + BUG(); + } + tpmif->flags = TPMIF_CLOSED; + + tpmif_change_state(tpmif, XenbusStateClosing); + + /* Unmap share page and unbind event channel */ + if(tpmif->status == CONNECTED) { + tpmif->status = DISCONNECTING; + mask_evtchn(tpmif->evtchn); + + if(gntmap_munmap(>pmdev.map, (unsigned long)tpmif->page, 1)) { + TPMBACK_ERR("%u/%u Error occured while trying to unmap shared page\n", (unsigned int) tpmif->domid, tpmif->handle); + } + + unbind_evtchn(tpmif->evtchn); + } + tpmif->status = DISCONNECTED; + tpmif_change_state(tpmif, XenbusStateClosed); + + /* Do the callback now */ + if(gtpmdev.close_callback) { + gtpmdev.close_callback(tpmif->domid, tpmif->handle); + } + + /* remove from array */ + remove_tpmif(tpmif); + + /* Wake up anyone possibly waiting on this interface and let them exit */ + wake_up(&waitq); + schedule(); + + /* Remove the old xenbus entries */ + snprintf(path, 512, "backend/vtpm/%u/%u", (unsigned int) tpmif->domid, tpmif->handle); + if((err = xenbus_rm(XBT_NIL, path))) { + TPMBACK_ERR("Error cleaning up xenbus entries path=%s error=%s\n", path, err); + free(err); + } + + TPMBACK_LOG("Frontend %u/%u disconnected\n", (unsigned int) tpmif->domid, tpmif->handle); + + /* free memory */ + __free_tpmif(tpmif); + +} + +/********************** + * REMAINING TPMBACK FUNCTIONS + * ********************/ + +/*Event channel handler */ +void tpmback_handler(evtchn_port_t port, struct pt_regs *regs, void *data) +{ + tpmif_t* tpmif = (tpmif_t*) data; + tpmif_shared_page_t *pg = tpmif->page; + + switch (pg->state) + { + case TPMIF_STATE_SUBMIT: + TPMBACK_DEBUG("EVENT CHANNEL FIRE %u/%u\n", (unsigned int) tpmif->domid, tpmif->handle); + tpmif_req_ready(tpmif); + wake_up(&waitq); + break; + case TPMIF_STATE_CANCEL: + /* If we are busy with a request, do nothing */ + if (tpmif->flags & TPMIF_REQ_READY) + return; + /* Acknowledge the cancellation if we are idle */ + pg->state = TPMIF_STATE_IDLE; + wmb(); + notify_remote_via_evtchn(tpmif->evtchn); + return; + default: + /* Spurious wakeup; do nothing */ + return; + } +} + +/* Connect to frontend */ +int connect_fe(tpmif_t* tpmif) +{ + char path[512]; + char* err, *value; + uint32_t domid; + grant_ref_t ringref; + evtchn_port_t evtchn; + + /* If already connected then quit */ + if (tpmif->status == CONNECTED) { + TPMBACK_DEBUG("%u/%u tried to connect while it was already connected?\n", (unsigned int) tpmif->domid, tpmif->handle); + return 0; + } + + /* Fetch the grant reference */ + snprintf(path, 512, "%s/ring-ref", tpmif->fe_path); + if((err = xenbus_read(XBT_NIL, path, &value))) { + TPMBACK_ERR("Error creating new tpm instance xenbus_read(%s) Error = %s", path, err); + free(err); + return -1; + } + if(sscanf(value, "%d", &ringref) != 1) { + TPMBACK_ERR("Non integer value (%s) in %s ??\n", value, path); + free(value); + return -1; + } + free(value); + + + /* Fetch the event channel*/ + snprintf(path, 512, "%s/event-channel", tpmif->fe_path); + if((err = xenbus_read(XBT_NIL, path, &value))) { + TPMBACK_ERR("Error creating new tpm instance xenbus_read(%s) Error = %s", path, err); + free(err); + return -1; + } + if(sscanf(value, "%d", &evtchn) != 1) { + TPMBACK_ERR("Non integer value (%s) in %s ??\n", value, path); + free(value); + return -1; + } + free(value); + + /* Check that protocol v2 is being used */ + snprintf(path, 512, "%s/feature-protocol-v2", tpmif->fe_path); + if((err = xenbus_read(XBT_NIL, path, &value))) { + TPMBACK_ERR("Unable to read %s during tpmback initialization! error = %s\n", path, err); + free(err); + return -1; + } + if(strcmp(value, "1")) { + TPMBACK_ERR("%s has an invalid value (%s)\n", path, value); + free(value); + return -1; + } + free(value); + + domid = tpmif->domid; + if((tpmif->page = gntmap_map_grant_refs(>pmdev.map, 1, &domid, 0, &ringref, PROT_READ | PROT_WRITE)) == NULL) { + TPMBACK_ERR("Failed to map grant reference %u/%u\n", (unsigned int) tpmif->domid, tpmif->handle); + return -1; + } + + /*Bind the event channel */ + if((evtchn_bind_interdomain(tpmif->domid, evtchn, tpmback_handler, tpmif, &tpmif->evtchn))) + { + TPMBACK_ERR("%u/%u Unable to bind to interdomain event channel!\n", (unsigned int) tpmif->domid, tpmif->handle); + goto error_post_map; + } + unmask_evtchn(tpmif->evtchn); + + /* Write the ready flag and change status to connected */ + snprintf(path, 512, "backend/vtpm/%u/%u", (unsigned int) tpmif->domid, tpmif->handle); + if((err = xenbus_printf(XBT_NIL, path, "ready", "%u", 1))) { + TPMBACK_ERR("%u/%u Unable to write ready flag on connect_fe()\n", (unsigned int) tpmif->domid, tpmif->handle); + free(err); + goto error_post_evtchn; + } + tpmif->status = CONNECTED; + if((tpmif_change_state(tpmif, XenbusStateConnected))){ + goto error_post_evtchn; + } + + TPMBACK_LOG("Frontend %u/%u connected\n", (unsigned int) tpmif->domid, tpmif->handle); + + return 0; +error_post_evtchn: + mask_evtchn(tpmif->evtchn); + unbind_evtchn(tpmif->evtchn); +error_post_map: + gntmap_munmap(>pmdev.map, (unsigned long)tpmif->page, 1); + return -1; +} + +static void disconnect_fe(tpmif_t* tpmif) +{ + if (tpmif->status == CONNECTED) { + tpmif->status = DISCONNECTING; + mask_evtchn(tpmif->evtchn); + + if(gntmap_munmap(>pmdev.map, (unsigned long)tpmif->page, 1)) { + TPMBACK_ERR("%u/%u Error occured while trying to unmap shared page\n", (unsigned int) tpmif->domid, tpmif->handle); + } + + unbind_evtchn(tpmif->evtchn); + } + tpmif->status = DISCONNECTED; + tpmif_change_state(tpmif, XenbusStateInitWait); + + TPMBACK_LOG("Frontend %u/%u disconnected\n", (unsigned int) tpmif->domid, tpmif->handle); +} + +static int frontend_changed(tpmif_t* tpmif) +{ + int state = xenbus_read_integer(tpmif->fe_state_path); + if(state < 0) { + state = XenbusStateUnknown; + } + + TPMBACK_DEBUG("Frontend %u/%u state changed to %d\n", (unsigned int) tpmif->domid, tpmif->handle, state); + + switch (state) { + case XenbusStateInitialising: + break; + + case XenbusStateInitialised: + case XenbusStateConnected: + if(connect_fe(tpmif)) { + TPMBACK_ERR("Failed to connect to front end %u/%u\n", (unsigned int) tpmif->domid, tpmif->handle); + tpmif_change_state(tpmif, XenbusStateClosed); + return -1; + } + break; + + case XenbusStateClosing: + tpmif_change_state(tpmif, XenbusStateClosing); + break; + + case XenbusStateClosed: + disconnect_fe(tpmif); + break; + + case XenbusStateUnknown: /* keep it here */ + free_tpmif(tpmif); + break; + + default: + TPMBACK_DEBUG("BAD STATE CHANGE %u/%u state = %d for tpmif\n", (unsigned int) tpmif->domid, tpmif->handle, state); + return -1; + } + return 0; +} + + +/* parses the string that comes out of xenbus_watch_wait_return. */ +static int parse_eventstr(const char* evstr, domid_t* domid, unsigned int* handle) +{ + int ret; + char cmd[40]; + char* err; + char* value; + unsigned int udomid = 0; + tpmif_t* tpmif; + /* First check for new frontends, this occurs when /backend/vtpm// gets created. Note we what the sscanf to fail on the last %s */ + if (sscanf(evstr, "backend/vtpm/%u/%u/%40s", &udomid, handle, cmd) == 2) { + *domid = udomid; + /* Make sure the entry exists, if this event triggers because the entry dissapeared then ignore it */ + if((err = xenbus_read(XBT_NIL, evstr, &value))) { + free(err); + return EV_NONE; + } + free(value); + /* Make sure the tpmif entry does not already exist, this should not happen */ + if((tpmif = get_tpmif(*domid, *handle)) != NULL) { + TPMBACK_DEBUG("Duplicate tpm entries! %u %u\n", tpmif->domid, tpmif->handle); + return EV_NONE; + } + return EV_NEWFE; + } else if((ret = sscanf(evstr, "/local/domain/%u/device/vtpm/%u/%40s", &udomid, handle, cmd)) == 3) { + *domid = udomid; + if (!strcmp(cmd, "state")) + return EV_STCHNG; + } + return EV_NONE; +} + +void handle_backend_event(char* evstr) { + tpmif_t* tpmif; + domid_t domid; + unsigned int handle; + int event; + + TPMBACK_DEBUG("Xenbus Event: %s\n", evstr); + + event = parse_eventstr(evstr, &domid, &handle); + + switch(event) { + case EV_NEWFE: + if(new_tpmif(domid, handle) == NULL) { + TPMBACK_ERR("Failed to create new tpm instance %u/%u\n", (unsigned int) domid, handle); + } + wake_up(&waitq); + break; + case EV_STCHNG: + if((tpmif = get_tpmif(domid, handle))) { + frontend_changed(tpmif); + } else { + TPMBACK_DEBUG("Event Received for non-existant tpm! instance=%u/%u xenbus_event=%s\n", (unsigned int) domid, handle, evstr); + } + break; + } +} + +/* Runs through the given path and creates events recursively + * for all of its children. + * @path - xenstore path to scan */ +static void generate_backend_events(const char* path) +{ + char* err; + int i, len; + char **dirs; + char *entry; + + if((err = xenbus_ls(XBT_NIL, path, &dirs)) != NULL) { + free(err); + return; + } + + for(i = 0; dirs[i] != NULL; ++i) { + len = strlen(path) + strlen(dirs[i]) + 2; + entry = malloc(len); + snprintf(entry, len, "%s/%s", path, dirs[i]); + + /* Generate and handle event for the entry itself */ + handle_backend_event(entry); + + /* Do children */ + generate_backend_events(entry); + + /* Cleanup */ + free(entry); + free(dirs[i]); + } + free(dirs); + return; +} + +void* tpmback_get_opaque(domid_t domid, unsigned int handle) +{ + tpmif_t* tpmif; + if((tpmif = get_tpmif(domid, handle)) == NULL) { + TPMBACK_DEBUG("get_opaque() failed, %u/%u is an invalid frontend\n", (unsigned int) domid, handle); + return NULL; + } + + return tpmif->opaque; +} + +int tpmback_set_opaque(domid_t domid, unsigned int handle, void *opaque) +{ + tpmif_t* tpmif; + if((tpmif = get_tpmif(domid, handle)) == NULL) { + TPMBACK_DEBUG("set_opaque() failed, %u/%u is an invalid frontend\n", (unsigned int) domid, handle); + return -1; + } + + tpmif->opaque = opaque; + return 0; +} + +unsigned char* tpmback_get_uuid(domid_t domid, unsigned int handle) +{ + tpmif_t* tpmif; + if((tpmif = get_tpmif(domid, handle)) == NULL) { + TPMBACK_DEBUG("get_uuid() failed, %u/%u is an invalid frontend\n", (unsigned int) domid, handle); + return NULL; + } + + return tpmif->uuid; +} + +int tpmback_get_peercontext(domid_t domid, unsigned int handle, void* buffer, int buflen) +{ + tpmif_t* tpmif; + if((tpmif = get_tpmif(domid, handle)) == NULL) { + TPMBACK_DEBUG("get_uuid() failed, %u/%u is an invalid frontend\n", (unsigned int) domid, handle); + return -1; + } + + return evtchn_get_peercontext(tpmif->evtchn, buffer, buflen); +} + +static void event_listener(void) +{ + const char* bepath = "backend/vtpm"; + char **path; + char* err; + + /* Setup the backend device watch */ + if((err = xenbus_watch_path_token(XBT_NIL, bepath, bepath, >pmdev.events)) != NULL) { + TPMBACK_ERR("xenbus_watch_path_token(%s) failed with error %s!\n", bepath, err); + free(err); + goto egress; + } + + /* Check for any frontends that connected before we set the watch. + * This is almost guaranteed to happen if both domains are started + * immediatly one after the other. + * We do this by manually generating events on everything in the backend + * path */ + generate_backend_events(bepath); + + /* Wait and listen for changes in frontend connections */ + while(1) { + path = xenbus_wait_for_watch_return(>pmdev.events); + + /*If quit flag was set then exit */ + if(gtpmdev.flags & TPMIF_CLOSED) { + TPMBACK_DEBUG("listener thread got quit event. Exiting..\n"); + free(path); + break; + } + handle_backend_event(*path); + free(path); + + } + + if((err = xenbus_unwatch_path_token(XBT_NIL, bepath, bepath)) != NULL) { + free(err); + } +egress: + return; +} + +void event_thread(void* p) { + event_listener(); +} + +void init_tpmback(void (*open_cb)(domid_t, unsigned int), void (*close_cb)(domid_t, unsigned int)) +{ + if(!globalinit) { + init_waitqueue_head(&waitq); + globalinit = 1; + } + printk("============= Init TPM BACK ================\n"); + gtpmdev.tpmlist = malloc(sizeof(tpmif_t*) * DEF_ARRAY_SIZE); + gtpmdev.num_alloc = DEF_ARRAY_SIZE; + gtpmdev.num_tpms = 0; + gtpmdev.flags = 0; + + gtpmdev.open_callback = open_cb; + gtpmdev.close_callback = close_cb; + + eventthread = create_thread("tpmback-listener", event_thread, NULL); + +} + +void shutdown_tpmback(void) +{ + TPMBACK_LOG("Shutting down tpm backend\n"); + /* Set the quit flag */ + gtpmdev.flags = TPMIF_CLOSED; + + //printk("num tpms is %d\n", gtpmdev.num_tpms); + /*Free all backend instances */ + while(gtpmdev.num_tpms) { + free_tpmif(gtpmdev.tpmlist[0]); + } + free(gtpmdev.tpmlist); + gtpmdev.tpmlist = NULL; + gtpmdev.num_alloc = 0; + + /* Wake up anyone possibly waiting on the device and let them exit */ + wake_up(&waitq); + schedule(); +} + +static void init_tpmcmd(tpmcmd_t* tpmcmd, domid_t domid, unsigned int handle, void *opaque) +{ + tpmcmd->domid = domid; + tpmcmd->locality = -1; + tpmcmd->handle = handle; + tpmcmd->opaque = opaque; + tpmcmd->req = NULL; + tpmcmd->req_len = 0; + tpmcmd->resp = NULL; + tpmcmd->resp_len = 0; +} + +tpmcmd_t* get_request(tpmif_t* tpmif) { + tpmcmd_t* cmd; + tpmif_shared_page_t *shr; + unsigned int offset; + int flags; +#ifdef TPMBACK_PRINT_DEBUG + int i; +#endif + + local_irq_save(flags); + + /* Allocate the cmd object to hold the data */ + if((cmd = malloc(sizeof(*cmd))) == NULL) { + goto error; + } + init_tpmcmd(cmd, tpmif->domid, tpmif->handle, tpmif->opaque); + + shr = tpmif->page; + cmd->req_len = shr->length; + cmd->locality = shr->locality; + offset = sizeof(*shr) + 4*shr->nr_extra_pages; + if (offset > PAGE_SIZE || offset + cmd->req_len > PAGE_SIZE) { + TPMBACK_ERR("%u/%u Command size too long for shared page!\n", (unsigned int) tpmif->domid, tpmif->handle); + goto error; + } + /* Allocate the buffer */ + if(cmd->req_len) { + if((cmd->req = malloc(cmd->req_len)) == NULL) { + goto error; + } + } + /* Copy the bits from the shared page(s) */ + memcpy(cmd->req, offset + (uint8_t*)shr, cmd->req_len); + +#ifdef TPMBACK_PRINT_DEBUG + TPMBACK_DEBUG("Received Tpm Command from %u/%u of size %u", (unsigned int) tpmif->domid, tpmif->handle, cmd->req_len); + for(i = 0; i < cmd->req_len; ++i) { + if (!(i % 30)) { + TPMBACK_DEBUG_MORE("\n"); + } + TPMBACK_DEBUG_MORE("%02hhX ", cmd->req[i]); + } + TPMBACK_DEBUG_MORE("\n\n"); +#endif + + local_irq_restore(flags); + return cmd; +error: + if(cmd != NULL) { + if (cmd->req != NULL) { + free(cmd->req); + cmd->req = NULL; + } + free(cmd); + cmd = NULL; + } + local_irq_restore(flags); + return NULL; + +} + +void send_response(tpmcmd_t* cmd, tpmif_t* tpmif) +{ + tpmif_shared_page_t *shr; + unsigned int offset; + int flags; +#ifdef TPMBACK_PRINT_DEBUG +int i; +#endif + + local_irq_save(flags); + + shr = tpmif->page; + shr->length = cmd->resp_len; + + offset = sizeof(*shr) + 4*shr->nr_extra_pages; + if (offset > PAGE_SIZE || offset + cmd->resp_len > PAGE_SIZE) { + TPMBACK_ERR("%u/%u Command size too long for shared page!\n", (unsigned int) tpmif->domid, tpmif->handle); + goto error; + } + memcpy(offset + (uint8_t*)shr, cmd->resp, cmd->resp_len); + +#ifdef TPMBACK_PRINT_DEBUG + TPMBACK_DEBUG("Sent response to %u/%u of size %u", (unsigned int) tpmif->domid, tpmif->handle, cmd->resp_len); + for(i = 0; i < cmd->resp_len; ++i) { + if (!(i % 30)) { + TPMBACK_DEBUG_MORE("\n"); + } + TPMBACK_DEBUG_MORE("%02hhX ", cmd->resp[i]); + } + TPMBACK_DEBUG_MORE("\n\n"); +#endif + /* clear the ready flag and send the event channel notice to the frontend */ + tpmif_req_finished(tpmif); + barrier(); + shr->state = TPMIF_STATE_FINISH; + wmb(); + notify_remote_via_evtchn(tpmif->evtchn); +error: + local_irq_restore(flags); + return; +} + +tpmcmd_t* tpmback_req_any(void) +{ + int i; + /* Block until something has a request */ + wait_event(waitq, (gtpmdev.flags & (TPMIF_REQ_READY | TPMIF_CLOSED))); + + /* Check if were shutting down */ + if(gtpmdev.flags & TPMIF_CLOSED) { + /* if something was waiting for us to give up the queue so it can shutdown, let it finish */ + schedule(); + return NULL; + } + + for(i = 0; i < gtpmdev.num_tpms; ++i) { + if(gtpmdev.tpmlist[i]->flags & TPMIF_REQ_READY) { + return get_request(gtpmdev.tpmlist[i]); + } + } + + TPMBACK_ERR("backend request ready flag was set but no interfaces were actually ready\n"); + return NULL; +} + +tpmcmd_t* tpmback_req(domid_t domid, unsigned int handle) +{ + tpmif_t* tpmif; + tpmif = get_tpmif(domid, handle); + if(tpmif == NULL) { + return NULL; + } + + wait_event(waitq, (tpmif->flags & (TPMIF_REQ_READY | TPMIF_CLOSED) || gtpmdev.flags & TPMIF_CLOSED)); + + /* Check if were shutting down */ + if(tpmif->flags & TPMIF_CLOSED || gtpmdev.flags & TPMIF_CLOSED) { + /* if something was waiting for us to give up the queue so it can free this instance, let it finish */ + schedule(); + return NULL; + } + + return get_request(tpmif); +} + +void tpmback_resp(tpmcmd_t* tpmcmd) +{ + tpmif_t* tpmif; + + /* Get the associated interface, if it doesnt exist then just quit */ + tpmif = get_tpmif(tpmcmd->domid, tpmcmd->handle); + if(tpmif == NULL) { + TPMBACK_ERR("Tried to send a reponse to non existant frontend %u/%u\n", (unsigned int) tpmcmd->domid, tpmcmd->handle); + goto end; + } + + if(!(tpmif->flags & TPMIF_REQ_READY)) { + TPMBACK_ERR("Tried to send response to a frontend that was not waiting for one %u/%u\n", (unsigned int) tpmcmd->domid, tpmcmd->handle); + goto end; + } + + /* Send response to frontend */ + send_response(tpmcmd, tpmif); + +end: + if(tpmcmd->req != NULL) { + free(tpmcmd->req); + } + free(tpmcmd); + return; +} + +int tpmback_wait_for_frontend_connect(domid_t *domid, unsigned int *handle) +{ + tpmif_t* tpmif; + int flags; + wait_event(waitq, ((gtpmdev.num_tpms > 0) || gtpmdev.flags & TPMIF_CLOSED)); + if(gtpmdev.flags & TPMIF_CLOSED) { + return -1; + } + local_irq_save(flags); + tpmif = gtpmdev.tpmlist[0]; + *domid = tpmif->domid; + *handle = tpmif->handle; + local_irq_restore(flags); + + return 0; +} + +int tpmback_num_frontends(void) +{ + return gtpmdev.num_tpms; +} diff -Nru xen-4.2.2/extras/mini-os/tpmfront.c xen-4.3.0/extras/mini-os/tpmfront.c --- xen-4.2.2/extras/mini-os/tpmfront.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/extras/mini-os/tpmfront.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,630 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * This code has been derived from drivers/char/tpm_vtpm.c + * from the xen 2.6.18 linux kernel + * + * Copyright (C) 2006 IBM Corporation + * + * This code has also been derived from drivers/char/tpm_xen.c + * from the xen 2.6.18 linux kernel + * + * Copyright (c) 2005, IBM Corporation + * + * which was itself derived from drivers/xen/netfront/netfront.c + * from the linux kernel + * + * Copyright (c) 2002-2004, K A Fraser + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2 of the + * License. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#define TPMFRONT_PRINT_DEBUG +#ifdef TPMFRONT_PRINT_DEBUG +#define TPMFRONT_DEBUG(fmt,...) printk("Tpmfront:Debug("__FILE__":%d) " fmt, __LINE__, ##__VA_ARGS__) +#define TPMFRONT_DEBUG_MORE(fmt,...) printk(fmt, ##__VA_ARGS__) +#else +#define TPMFRONT_DEBUG(fmt,...) +#endif +#define TPMFRONT_ERR(fmt,...) printk("Tpmfront:Error " fmt, ##__VA_ARGS__) +#define TPMFRONT_LOG(fmt,...) printk("Tpmfront:Info " fmt, ##__VA_ARGS__) + +#define min(a,b) (((a) < (b)) ? (a) : (b)) + +void tpmfront_handler(evtchn_port_t port, struct pt_regs *regs, void *data) { + struct tpmfront_dev* dev = (struct tpmfront_dev*) data; + tpmif_shared_page_t *shr = dev->page; + /*If we get a response when we didnt make a request, just ignore it */ + if(!dev->waiting) { + return; + } + + switch (shr->state) { + case TPMIF_STATE_FINISH: /* request was completed */ + case TPMIF_STATE_IDLE: /* request was cancelled */ + break; + default: + /* Spurious wakeup; do nothing, request is still pending */ + return; + } + + dev->waiting = 0; +#ifdef HAVE_LIBC + if(dev->fd >= 0) { + files[dev->fd].read = 1; + } +#endif + wake_up(&dev->waitq); +} + +static int publish_xenbus(struct tpmfront_dev* dev) { + xenbus_transaction_t xbt; + int retry; + char* err; + /* Write the grant reference and event channel to xenstore */ +again: + if((err = xenbus_transaction_start(&xbt))) { + TPMFRONT_ERR("Unable to start xenbus transaction, error was %s\n", err); + free(err); + return -1; + } + + if((err = xenbus_printf(xbt, dev->nodename, "ring-ref", "%u", (unsigned int) dev->ring_ref))) { + TPMFRONT_ERR("Unable to write %s/ring-ref, error was %s\n", dev->nodename, err); + free(err); + goto abort_transaction; + } + + if((err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u", (unsigned int) dev->evtchn))) { + TPMFRONT_ERR("Unable to write %s/event-channel, error was %s\n", dev->nodename, err); + free(err); + goto abort_transaction; + } + + if((err = xenbus_transaction_end(xbt, 0, &retry))) { + TPMFRONT_ERR("Unable to complete xenbus transaction, error was %s\n", err); + free(err); + return -1; + } + if(retry) { + goto again; + } + + return 0; +abort_transaction: + if((err = xenbus_transaction_end(xbt, 1, &retry))) { + free(err); + } + return -1; +} + +static int wait_for_backend_connect(xenbus_event_queue* events, char* path) +{ + int state; + + TPMFRONT_LOG("Waiting for backend connection..\n"); + /* Wait for the backend to connect */ + while(1) { + state = xenbus_read_integer(path); + if ( state < 0) + state = XenbusStateUnknown; + switch(state) { + /* Bad states, we quit with error */ + case XenbusStateUnknown: + case XenbusStateClosing: + case XenbusStateClosed: + TPMFRONT_ERR("Unable to connect to backend\n"); + return -1; + /* If backend is connected then break out of loop */ + case XenbusStateConnected: + TPMFRONT_LOG("Backend Connected\n"); + return 0; + default: + xenbus_wait_for_watch(events); + } + } + +} + +static int wait_for_backend_closed(xenbus_event_queue* events, char* path) +{ + int state; + + TPMFRONT_LOG("Waiting for backend to close..\n"); + while(1) { + state = xenbus_read_integer(path); + if ( state < 0) + state = XenbusStateUnknown; + switch(state) { + case XenbusStateUnknown: + TPMFRONT_ERR("Backend Unknown state, forcing shutdown\n"); + return -1; + case XenbusStateClosed: + TPMFRONT_LOG("Backend Closed\n"); + return 0; + case XenbusStateInitWait: + TPMFRONT_LOG("Backend Closed (waiting for reconnect)\n"); + return 0; + default: + xenbus_wait_for_watch(events); + } + } + +} + +static int wait_for_backend_state_changed(struct tpmfront_dev* dev, XenbusState state) { + char* err; + int ret = 0; + xenbus_event_queue events = NULL; + char path[512]; + + snprintf(path, 512, "%s/state", dev->bepath); + /*Setup the watch to wait for the backend */ + if((err = xenbus_watch_path_token(XBT_NIL, path, path, &events))) { + TPMFRONT_ERR("Could not set a watch on %s, error was %s\n", path, err); + free(err); + return -1; + } + + /* Do the actual wait loop now */ + switch(state) { + case XenbusStateConnected: + ret = wait_for_backend_connect(&events, path); + break; + case XenbusStateClosed: + ret = wait_for_backend_closed(&events, path); + break; + default: + TPMFRONT_ERR("Bad wait state %d, ignoring\n", state); + } + + if((err = xenbus_unwatch_path_token(XBT_NIL, path, path))) { + TPMFRONT_ERR("Unable to unwatch %s, error was %s, ignoring..\n", path, err); + free(err); + } + return ret; +} + +static int tpmfront_connect(struct tpmfront_dev* dev) +{ + char* err; + /* Create shared page */ + dev->page = (tpmif_shared_page_t *)alloc_page(); + if(dev->page == NULL) { + TPMFRONT_ERR("Unable to allocate page for shared memory\n"); + goto error; + } + memset(dev->page, 0, PAGE_SIZE); + dev->ring_ref = gnttab_grant_access(dev->bedomid, virt_to_mfn(dev->page), 0); + TPMFRONT_DEBUG("grant ref is %lu\n", (unsigned long) dev->ring_ref); + + /*Create event channel */ + if(evtchn_alloc_unbound(dev->bedomid, tpmfront_handler, dev, &dev->evtchn)) { + TPMFRONT_ERR("Unable to allocate event channel\n"); + goto error_postmap; + } + unmask_evtchn(dev->evtchn); + TPMFRONT_DEBUG("event channel is %lu\n", (unsigned long) dev->evtchn); + + /* Write the entries to xenstore */ + if(publish_xenbus(dev)) { + goto error_postevtchn; + } + + /* Change state to connected */ + dev->state = XenbusStateConnected; + + /* Tell the backend that we are ready */ + if((err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%u", dev->state))) { + TPMFRONT_ERR("Unable to write to xenstore %s/state, value=%u", dev->nodename, XenbusStateConnected); + free(err); + goto error; + } + + return 0; +error_postevtchn: + mask_evtchn(dev->evtchn); + unbind_evtchn(dev->evtchn); +error_postmap: + gnttab_end_access(dev->ring_ref); + free_page(dev->page); +error: + return -1; +} + +struct tpmfront_dev* init_tpmfront(const char* _nodename) +{ + struct tpmfront_dev* dev; + const char* nodename; + char path[512]; + char* value, *err; + unsigned long long ival; + + printk("============= Init TPM Front ================\n"); + + dev = malloc(sizeof(struct tpmfront_dev)); + memset(dev, 0, sizeof(struct tpmfront_dev)); + +#ifdef HAVE_LIBC + dev->fd = -1; +#endif + + nodename = _nodename ? _nodename : "device/vtpm/0"; + dev->nodename = strdup(nodename); + + init_waitqueue_head(&dev->waitq); + + /* Get backend domid */ + snprintf(path, 512, "%s/backend-id", dev->nodename); + if((err = xenbus_read(XBT_NIL, path, &value))) { + TPMFRONT_ERR("Unable to read %s during tpmfront initialization! error = %s\n", path, err); + free(err); + goto error; + } + if(sscanf(value, "%llu", &ival) != 1) { + TPMFRONT_ERR("%s has non-integer value (%s)\n", path, value); + free(value); + goto error; + } + free(value); + dev->bedomid = ival; + + /* Get backend xenstore path */ + snprintf(path, 512, "%s/backend", dev->nodename); + if((err = xenbus_read(XBT_NIL, path, &dev->bepath))) { + TPMFRONT_ERR("Unable to read %s during tpmfront initialization! error = %s\n", path, err); + free(err); + goto error; + } + + /* Publish protocol v2 feature */ + snprintf(path, 512, "%s/feature-protocol-v2", dev->nodename); + if ((err = xenbus_write(XBT_NIL, path, "1"))) + { + TPMFRONT_ERR("Unable to write feature-protocol-v2 node: %s\n", err); + free(err); + goto error; + } + + /* Create and publish grant reference and event channel */ + if (tpmfront_connect(dev)) { + goto error; + } + + /* Wait for backend to connect */ + if( wait_for_backend_state_changed(dev, XenbusStateConnected)) { + goto error; + } + + /* Ensure backend is also using protocol v2 */ + snprintf(path, 512, "%s/feature-protocol-v2", dev->bepath); + if((err = xenbus_read(XBT_NIL, path, &value))) { + TPMFRONT_ERR("Unable to read %s during tpmfront initialization! error = %s\n", path, err); + free(err); + goto error; + } + if(strcmp(value, "1")) { + TPMFRONT_ERR("%s has an invalid value (%s)\n", path, value); + free(value); + goto error; + } + free(value); + + TPMFRONT_LOG("Initialization Completed successfully\n"); + + return dev; + +error: + shutdown_tpmfront(dev); + return NULL; +} +void shutdown_tpmfront(struct tpmfront_dev* dev) +{ + char* err; + char path[512]; + if(dev == NULL) { + return; + } + TPMFRONT_LOG("Shutting down tpmfront\n"); + /* disconnect */ + if(dev->state == XenbusStateConnected) { + /* Tell backend we are closing */ + dev->state = XenbusStateClosing; + if((err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%u", (unsigned int) dev->state))) { + TPMFRONT_ERR("Unable to write to %s, error was %s", dev->nodename, err); + free(err); + } + + /* Clean up xenstore entries */ + snprintf(path, 512, "%s/event-channel", dev->nodename); + if((err = xenbus_rm(XBT_NIL, path))) { + free(err); + } + snprintf(path, 512, "%s/ring-ref", dev->nodename); + if((err = xenbus_rm(XBT_NIL, path))) { + free(err); + } + + /* Tell backend we are closed */ + dev->state = XenbusStateClosed; + if((err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%u", (unsigned int) dev->state))) { + TPMFRONT_ERR("Unable to write to %s, error was %s", dev->nodename, err); + free(err); + } + + /* Wait for the backend to close and unmap shared pages, ignore any errors */ + wait_for_backend_state_changed(dev, XenbusStateClosed); + + /* Prepare for a later reopen (possibly by a kexec'd kernel) */ + dev->state = XenbusStateInitialising; + if((err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%u", (unsigned int) dev->state))) { + TPMFRONT_ERR("Unable to write to %s, error was %s", dev->nodename, err); + free(err); + } + + /* Close event channel and unmap shared page */ + mask_evtchn(dev->evtchn); + unbind_evtchn(dev->evtchn); + gnttab_end_access(dev->ring_ref); + + free_page(dev->page); + } + + /* Cleanup memory usage */ + if(dev->respbuf) { + free(dev->respbuf); + } + if(dev->bepath) { + free(dev->bepath); + } + if(dev->nodename) { + free(dev->nodename); + } + free(dev); +} + +int tpmfront_send(struct tpmfront_dev* dev, const uint8_t* msg, size_t length) +{ + unsigned int offset; + tpmif_shared_page_t *shr = NULL; +#ifdef TPMFRONT_PRINT_DEBUG + int i; +#endif + /* Error Checking */ + if(dev == NULL || dev->state != XenbusStateConnected) { + TPMFRONT_ERR("Tried to send message through disconnected frontend\n"); + return -1; + } + shr = dev->page; + +#ifdef TPMFRONT_PRINT_DEBUG + TPMFRONT_DEBUG("Sending Msg to backend size=%u", (unsigned int) length); + for(i = 0; i < length; ++i) { + if(!(i % 30)) { + TPMFRONT_DEBUG_MORE("\n"); + } + TPMFRONT_DEBUG_MORE("%02X ", msg[i]); + } + TPMFRONT_DEBUG_MORE("\n"); +#endif + + /* Copy to shared pages now */ + offset = sizeof(*shr); + if (length + offset > PAGE_SIZE) { + TPMFRONT_ERR("Message too long for shared page\n"); + return -1; + } + memcpy(offset + (uint8_t*)shr, msg, length); + shr->length = length; + barrier(); + shr->state = TPMIF_STATE_SUBMIT; + + dev->waiting = 1; + dev->resplen = 0; +#ifdef HAVE_LIBC + if(dev->fd >= 0) { + files[dev->fd].read = 0; + files[dev->fd].tpmfront.respgot = 0; + files[dev->fd].tpmfront.offset = 0; + } +#endif + wmb(); + notify_remote_via_evtchn(dev->evtchn); + return 0; +} +int tpmfront_recv(struct tpmfront_dev* dev, uint8_t** msg, size_t *length) +{ + unsigned int offset; + tpmif_shared_page_t *shr = NULL; +#ifdef TPMFRONT_PRINT_DEBUG +int i; +#endif + if(dev == NULL || dev->state != XenbusStateConnected) { + TPMFRONT_ERR("Tried to receive message from disconnected frontend\n"); + return -1; + } + /*Wait for the response */ + wait_event(dev->waitq, (!dev->waiting)); + shr = dev->page; + + /* Initialize */ + *msg = NULL; + *length = 0; + offset = sizeof(*shr); + + if (shr->state != TPMIF_STATE_FINISH) + goto quit; + + *length = shr->length; + + if (*length + offset > PAGE_SIZE) { + TPMFRONT_ERR("Reply too long for shared page\n"); + return -1; + } + + /* Alloc the buffer */ + if(dev->respbuf) { + free(dev->respbuf); + } + *msg = dev->respbuf = malloc(*length); + dev->resplen = *length; + + /* Copy the bits */ + memcpy(*msg, offset + (uint8_t*)shr, *length); + +#ifdef TPMFRONT_PRINT_DEBUG + TPMFRONT_DEBUG("Received response from backend size=%u", (unsigned int) *length); + for(i = 0; i < *length; ++i) { + if(!(i % 30)) { + TPMFRONT_DEBUG_MORE("\n"); + } + TPMFRONT_DEBUG_MORE("%02X ", (*msg)[i]); + } + TPMFRONT_DEBUG_MORE("\n"); +#endif +#ifdef HAVE_LIBC + if(dev->fd >= 0) { + files[dev->fd].tpmfront.respgot = 1; + } +#endif +quit: + return 0; +} + +int tpmfront_cmd(struct tpmfront_dev* dev, uint8_t* req, size_t reqlen, uint8_t** resp, size_t* resplen) +{ + int rc; + if((rc = tpmfront_send(dev, req, reqlen))) { + return rc; + } + if((rc = tpmfront_recv(dev, resp, resplen))) { + return rc; + } + + return 0; +} + +int tpmfront_set_locality(struct tpmfront_dev* dev, int locality) +{ + if (!dev || !dev->page) + return -1; + dev->page->locality = locality; + return 0; +} + +#ifdef HAVE_LIBC +#include +int tpmfront_open(struct tpmfront_dev* dev) +{ + /* Silently prevent multiple opens */ + if(dev->fd != -1) { + return dev->fd; + } + + dev->fd = alloc_fd(FTYPE_TPMFRONT); + printk("tpmfront_open(%s) -> %d\n", dev->nodename, dev->fd); + files[dev->fd].tpmfront.dev = dev; + files[dev->fd].tpmfront.offset = 0; + files[dev->fd].tpmfront.respgot = 0; + return dev->fd; +} + +int tpmfront_posix_write(int fd, const uint8_t* buf, size_t count) +{ + int rc; + struct tpmfront_dev* dev; + dev = files[fd].tpmfront.dev; + + if(count == 0) { + return 0; + } + + /* Return an error if we are already processing a command */ + if(dev->waiting) { + errno = EINPROGRESS; + return -1; + } + /* Send the command now */ + if((rc = tpmfront_send(dev, buf, count)) != 0) { + errno = EIO; + return -1; + } + return count; +} + +int tpmfront_posix_read(int fd, uint8_t* buf, size_t count) +{ + int rc; + uint8_t* dummybuf; + size_t dummysz; + struct tpmfront_dev* dev; + + dev = files[fd].tpmfront.dev; + + if(count == 0) { + return 0; + } + + /* get the response if we haven't already */ + if(files[dev->fd].tpmfront.respgot == 0) { + if ((rc = tpmfront_recv(dev, &dummybuf, &dummysz)) != 0) { + errno = EIO; + return -1; + } + } + + /* handle EOF case */ + if(files[dev->fd].tpmfront.offset >= dev->resplen) { + return 0; + } + + /* Compute the number of bytes and do the copy operation */ + if((rc = min(count, dev->resplen - files[dev->fd].tpmfront.offset)) != 0) { + memcpy(buf, dev->respbuf + files[dev->fd].tpmfront.offset, rc); + files[dev->fd].tpmfront.offset += rc; + } + + return rc; +} + +int tpmfront_posix_fstat(int fd, struct stat* buf) +{ + uint8_t* dummybuf; + size_t dummysz; + int rc; + struct tpmfront_dev* dev = files[fd].tpmfront.dev; + + /* If we have a response waiting, then read it now from the backend + * so we can get its length*/ + if(dev->waiting || (files[dev->fd].read == 1 && !files[dev->fd].tpmfront.respgot)) { + if ((rc = tpmfront_recv(dev, &dummybuf, &dummysz)) != 0) { + errno = EIO; + return -1; + } + } + + buf->st_mode = O_RDWR; + buf->st_uid = 0; + buf->st_gid = 0; + buf->st_size = dev->resplen; + buf->st_atime = buf->st_mtime = buf->st_ctime = time(NULL); + + return 0; +} + + +#endif diff -Nru xen-4.2.2/extras/mini-os/xenbus/xenbus.c xen-4.3.0/extras/mini-os/xenbus/xenbus.c --- xen-4.2.2/extras/mini-os/xenbus/xenbus.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/extras/mini-os/xenbus/xenbus.c 2013-07-09 10:46:56.000000000 +0000 @@ -719,6 +719,33 @@ return t; } +int xenbus_read_uuid(const char* path, unsigned char uuid[16]) { + char * res, *buf; + res = xenbus_read(XBT_NIL, path, &buf); + if(res) { + printk("Failed to read %s.\n", path); + free(res); + return 0; + } + if(strlen(buf) != ((2*16)+4) /* 16 hex bytes and 4 hyphens */ + || sscanf(buf, + "%2hhx%2hhx%2hhx%2hhx-" + "%2hhx%2hhx-" + "%2hhx%2hhx-" + "%2hhx%2hhx-" + "%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx", + uuid, uuid + 1, uuid + 2, uuid + 3, + uuid + 4, uuid + 5, uuid + 6, uuid + 7, + uuid + 8, uuid + 9, uuid + 10, uuid + 11, + uuid + 12, uuid + 13, uuid + 14, uuid + 15) != 16) { + printk("Xenbus path %s value %s is not a uuid!\n", path, buf); + free(buf); + return 0; + } + free(buf); + return 1; +} + char* xenbus_printf(xenbus_transaction_t xbt, const char* node, const char* path, const char* fmt, ...) diff -Nru xen-4.2.2/install.sh xen-4.3.0/install.sh --- xen-4.2.2/install.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/install.sh 2013-07-09 10:46:56.000000000 +0000 @@ -27,20 +27,6 @@ echo "Installing Xen from '$src' to '$dst'..." (cd $src; tar -cf - * ) | tar -C "$tmp" -xf - -[ -x "$(which udevinfo)" ] && \ - UDEV_VERSION=$(udevinfo -V | sed -e 's/^[^0-9]* \([0-9]\{1,\}\)[^0-9]\{0,\}/\1/') - -[ -z "$UDEV_VERSION" -a -x /sbin/udevadm ] && \ - UDEV_VERSION=$(/sbin/udevadm info -V | awk '{print $NF}') - -if [ -n "$UDEV_VERSION" ] && [ $UDEV_VERSION -ge 059 ]; then - echo " - installing for udev-based system" - rm -rf "$tmp/etc/hotplug" -else - echo " - installing for hotplug-based system" - rm -rf "$tmp/etc/udev" -fi - echo " - modifying permissions" chmod -R a+rX "$tmp" diff -Nru xen-4.2.2/m4/checkpolicy.m4 xen-4.3.0/m4/checkpolicy.m4 --- xen-4.2.2/m4/checkpolicy.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/checkpolicy.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,12 @@ +AC_DEFUN([AC_PROG_CHECKPOLICY], +[dnl + # check for a checkpolicy binary with support for -t xen + AC_CHECK_TOOL([CHECKPOLICY],[checkpolicy],[no]) + + if test "$CHECKPOLICY" != "no"; then + CHECKPOLICYHELP=`$CHECKPOLICY -h | grep xen` + if test "$CHECKPOLICYHELP" = ""; then + CHECKPOLICY=no + fi + fi +]) diff -Nru xen-4.2.2/m4/curses.m4 xen-4.3.0/m4/curses.m4 --- xen-4.2.2/m4/curses.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/curses.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,20 @@ +AC_DEFUN([AX_CHECK_CURSES], [ +AC_CHECK_HEADER([curses.h], [ + AC_CHECK_LIB([curses], [clear], [curses="y"], [curses="n"]) +], [curses="n"]) +AC_CHECK_HEADER([ncurses.h], [ + AC_CHECK_LIB([ncurses], [clear], [ncurses="y"], [ncurses="n"]) +], [ncurses="n"]) +AS_IF([test "$curses" = "n" && test "$ncurses" = "n"], [ + AC_MSG_ERROR([Unable to find a suitable curses library]) +]) +# Prefer ncurses over curses if both are present +AS_IF([test "$ncurses" = "y"], [ + CURSES_LIBS="-lncurses" + AC_DEFINE([INCLUDE_CURSES_H], [], [Define curses header to use]) +], [ + CURSES_LIBS="-lcurses" + AC_DEFINE([INCLUDE_CURSES_H], [], [Define curses header to use]) +]) +AC_SUBST(CURSES_LIBS) +]) diff -Nru xen-4.2.2/m4/depends.m4 xen-4.3.0/m4/depends.m4 --- xen-4.2.2/m4/depends.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/depends.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,15 @@ + +AC_DEFUN([AX_DEPENDS_PATH_PROG], [ +AS_IF([test "x$$1" = "xy"], [AX_PATH_PROG_OR_FAIL([$2], [$3])], [ +AS_IF([test "x$$1" = "xn"], [ +$2="/$3-disabled-in-configure-script" +], [ +AC_PATH_PROG([$2], [$3], [no]) +AS_IF([test x"${$2}" = "xno"], [ +$1=n +$2="/$3-disabled-in-configure-script" +]) +]) +]) +AC_SUBST($2) +]) diff -Nru xen-4.2.2/m4/docs_tool.m4 xen-4.3.0/m4/docs_tool.m4 --- xen-4.2.2/m4/docs_tool.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/docs_tool.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,17 @@ +AC_DEFUN([AX_DOCS_TOOL_PROG], [ +dnl + AC_ARG_VAR([$1], [Path to $2 tool]) + AC_PATH_PROG([$1], [$2]) + AS_IF([! test -x "$ac_cv_path_$1"], [ + AC_MSG_WARN([$2 is not available so some documentation won't be built]) + ]) +]) + +AC_DEFUN([AX_DOCS_TOOL_PROGS], [ +dnl + AC_ARG_VAR([$1], [Path to $2 tool]) + AC_PATH_PROGS([$1], [$3]) + AS_IF([! test -x "$ac_cv_path_$1"], [ + AC_MSG_WARN([$2 is not available so some documentation won't be built]) + ]) +]) diff -Nru xen-4.2.2/m4/extfs.m4 xen-4.3.0/m4/extfs.m4 --- xen-4.2.2/m4/extfs.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/extfs.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,20 @@ +AC_DEFUN([AX_CHECK_EXTFS], [ +AC_CHECK_HEADER([ext2fs/ext2fs.h], [ +AC_CHECK_LIB([ext2fs], [ext2fs_open2], [ + AC_DEFINE([INCLUDE_EXTFS_H], [], + [Define extfs header to use]) + EXTFS_LIBS="-lext2fs" +]) +]) +dnl This is a temporary hack for CentOS 5.x, which split the ext4 support +dnl of ext2fs in a different package. Once CentOS 5.x is no longer supported +dnl we can remove this. +AC_CHECK_HEADER([ext4fs/ext2fs.h], [ +AC_CHECK_LIB([ext4fs], [ext2fs_open2], [ + AC_DEFINE([INCLUDE_EXTFS_H], [], + [Define extfs header to use]) + EXTFS_LIBS="-lext4fs" +]) +]) +AC_SUBST(EXTFS_LIBS) +]) diff -Nru xen-4.2.2/m4/features.m4 xen-4.3.0/m4/features.m4 --- xen-4.2.2/m4/features.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/features.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,21 @@ +AC_DEFUN([AX_ARG_DEFAULT_ENABLE], [ +AC_ARG_ENABLE([$1], AS_HELP_STRING([--disable-$1], [$2 (default is ENABLED)])) +AX_PARSE_VALUE([$1], [y]) +]) + +AC_DEFUN([AX_ARG_DEFAULT_DISABLE], [ +AC_ARG_ENABLE([$1], AS_HELP_STRING([--enable-$1], [$2 (default is DISABLED)])) +AX_PARSE_VALUE([$1], [n]) +]) + +dnl This function should not be called outside of this file +AC_DEFUN([AX_PARSE_VALUE], [ +AS_IF([test "x$enable_$1" = "xno"], [ + ax_cv_$1="n" +], [test "x$enable_$1" = "xyes"], [ + ax_cv_$1="y" +], [test -z $ax_cv_$1], [ + ax_cv_$1="$2" +]) +$1=$ax_cv_$1 +AC_SUBST($1)]) diff -Nru xen-4.2.2/m4/fetcher.m4 xen-4.3.0/m4/fetcher.m4 --- xen-4.2.2/m4/fetcher.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/fetcher.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,14 @@ +AC_DEFUN([AX_CHECK_FETCHER], [ +AC_PATH_PROG([WGET],[wget], [no]) +AS_IF([test x"$WGET" != x"no"], [ + FETCHER="$WGET -c -O" +], [ + AC_PATH_PROG([FTP],[ftp], [no]) + AS_IF([test x"$FTP" != x"no"], [ + FETCHER="$FTP -o" + ], [ + AC_MSG_ERROR([cannot find wget or ftp]) + ]) +]) +AC_SUBST(FETCHER) +]) diff -Nru xen-4.2.2/m4/ocaml.m4 xen-4.3.0/m4/ocaml.m4 --- xen-4.2.2/m4/ocaml.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/ocaml.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,241 @@ +dnl autoconf macros for OCaml +dnl from http://forge.ocamlcore.org/ +dnl +dnl Copyright © 2009 Richard W.M. Jones +dnl Copyright © 2009 Stefano Zacchiroli +dnl Copyright © 2000-2005 Olivier Andrieu +dnl Copyright © 2000-2005 Jean-Christophe Filliâtre +dnl Copyright © 2000-2005 Georges Mariano +dnl +dnl For documentation, please read the ocaml.m4 man page. + +AC_DEFUN([AC_PROG_OCAML], +[dnl + # checking for ocamlc + AC_CHECK_TOOL([OCAMLC],[ocamlc],[no]) + + if test "$OCAMLC" != "no"; then + OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version* *\(.*\)$|\1|p'` + AC_MSG_RESULT([OCaml version is $OCAMLVERSION]) + # If OCAMLLIB is set, use it + if test "$OCAMLLIB" = ""; then + OCAMLLIB=`$OCAMLC -where 2>/dev/null || $OCAMLC -v|tail -1|cut -d ' ' -f 4` + else + AC_MSG_RESULT([OCAMLLIB previously set; preserving it.]) + fi + AC_MSG_RESULT([OCaml library path is $OCAMLLIB]) + + AC_SUBST([OCAMLVERSION]) + AC_SUBST([OCAMLLIB]) + + # checking for ocamlopt + AC_CHECK_TOOL([OCAMLOPT],[ocamlopt],[no]) + OCAMLBEST=byte + if test "$OCAMLOPT" = "no"; then + AC_MSG_WARN([Cannot find ocamlopt; bytecode compilation only.]) + else + TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([versions differs from ocamlc; ocamlopt discarded.]) + OCAMLOPT=no + else + OCAMLBEST=opt + fi + fi + + AC_SUBST([OCAMLBEST]) + + # checking for ocamlc.opt + AC_CHECK_TOOL([OCAMLCDOTOPT],[ocamlc.opt],[no]) + if test "$OCAMLCDOTOPT" != "no"; then + TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([versions differs from ocamlc; ocamlc.opt discarded.]) + else + OCAMLC=$OCAMLCDOTOPT + fi + fi + + # checking for ocamlopt.opt + if test "$OCAMLOPT" != "no" ; then + AC_CHECK_TOOL([OCAMLOPTDOTOPT],[ocamlopt.opt],[no]) + if test "$OCAMLOPTDOTOPT" != "no"; then + TMPVERSION=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([version differs from ocamlc; ocamlopt.opt discarded.]) + else + OCAMLOPT=$OCAMLOPTDOTOPT + fi + fi + fi + + AC_SUBST([OCAMLOPT]) + fi + + AC_SUBST([OCAMLC]) + + # checking for ocaml toplevel + AC_CHECK_TOOL([OCAML],[ocaml],[no]) + + # checking for ocamldep + AC_CHECK_TOOL([OCAMLDEP],[ocamldep],[no]) + + # checking for ocamlmktop + AC_CHECK_TOOL([OCAMLMKTOP],[ocamlmktop],[no]) + + # checking for ocamlmklib + AC_CHECK_TOOL([OCAMLMKLIB],[ocamlmklib],[no]) + + # checking for ocamldoc + AC_CHECK_TOOL([OCAMLDOC],[ocamldoc],[no]) + + # checking for ocamlbuild + AC_CHECK_TOOL([OCAMLBUILD],[ocamlbuild],[no]) +]) + + +AC_DEFUN([AC_PROG_OCAMLLEX], +[dnl + # checking for ocamllex + AC_CHECK_TOOL([OCAMLLEX],[ocamllex],[no]) + if test "$OCAMLLEX" != "no"; then + AC_CHECK_TOOL([OCAMLLEXDOTOPT],[ocamllex.opt],[no]) + if test "$OCAMLLEXDOTOPT" != "no"; then + OCAMLLEX=$OCAMLLEXDOTOPT + fi + fi + AC_SUBST([OCAMLLEX]) +]) + +AC_DEFUN([AC_PROG_OCAMLYACC], +[dnl + AC_CHECK_TOOL([OCAMLYACC],[ocamlyacc],[no]) + AC_SUBST([OCAMLYACC]) +]) + + +AC_DEFUN([AC_PROG_CAMLP4], +[dnl + AC_REQUIRE([AC_PROG_OCAML])dnl + + # checking for camlp4 + AC_CHECK_TOOL([CAMLP4],[camlp4],[no]) + if test "$CAMLP4" != "no"; then + TMPVERSION=`$CAMLP4 -v 2>&1| sed -n -e 's|.*version *\(.*\)$|\1|p'` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([versions differs from ocamlc]) + CAMLP4=no + fi + fi + AC_SUBST([CAMLP4]) + + # checking for companion tools + AC_CHECK_TOOL([CAMLP4BOOT],[camlp4boot],[no]) + AC_CHECK_TOOL([CAMLP4O],[camlp4o],[no]) + AC_CHECK_TOOL([CAMLP4OF],[camlp4of],[no]) + AC_CHECK_TOOL([CAMLP4OOF],[camlp4oof],[no]) + AC_CHECK_TOOL([CAMLP4ORF],[camlp4orf],[no]) + AC_CHECK_TOOL([CAMLP4PROF],[camlp4prof],[no]) + AC_CHECK_TOOL([CAMLP4R],[camlp4r],[no]) + AC_CHECK_TOOL([CAMLP4RF],[camlp4rf],[no]) + AC_SUBST([CAMLP4BOOT]) + AC_SUBST([CAMLP4O]) + AC_SUBST([CAMLP4OF]) + AC_SUBST([CAMLP4OOF]) + AC_SUBST([CAMLP4ORF]) + AC_SUBST([CAMLP4PROF]) + AC_SUBST([CAMLP4R]) + AC_SUBST([CAMLP4RF]) +]) + + +AC_DEFUN([AC_PROG_FINDLIB], +[dnl + AC_REQUIRE([AC_PROG_OCAML])dnl + + # checking for ocamlfind + AC_CHECK_TOOL([OCAMLFIND],[ocamlfind],[no]) + AC_SUBST([OCAMLFIND]) +]) + + +dnl Thanks to Jim Meyering for working this next bit out for us. +dnl XXX We should define AS_TR_SH if it's not defined already +dnl (eg. for old autoconf). +AC_DEFUN([AC_CHECK_OCAML_PKG], +[dnl + AC_REQUIRE([AC_PROG_FINDLIB])dnl + + AC_MSG_CHECKING([for OCaml findlib package $1]) + + unset found + unset pkg + found=no + for pkg in $1 $2 ; do + if $OCAMLFIND query $pkg >/dev/null 2>/dev/null; then + AC_MSG_RESULT([found]) + AS_TR_SH([OCAML_PKG_$1])=$pkg + found=yes + break + fi + done + if test "$found" = "no" ; then + AC_MSG_RESULT([not found]) + AS_TR_SH([OCAML_PKG_$1])=no + fi + + AC_SUBST(AS_TR_SH([OCAML_PKG_$1])) +]) + + +AC_DEFUN([AC_CHECK_OCAML_MODULE], +[dnl + AC_MSG_CHECKING([for OCaml module $2]) + + cat > conftest.ml <&5 2>&5 ; then + found=yes + break + fi + done + + if test "$found" ; then + AC_MSG_RESULT([$$1]) + else + AC_MSG_RESULT([not found]) + $1=no + fi + AC_SUBST([$1]) +]) + + +dnl XXX Cross-compiling +AC_DEFUN([AC_CHECK_OCAML_WORD_SIZE], +[dnl + AC_REQUIRE([AC_PROG_OCAML])dnl + AC_MSG_CHECKING([for OCaml compiler word size]) + cat > conftest.ml < conftest.ml <. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES diff -Nru xen-4.2.2/m4/pthread.m4 xen-4.3.0/m4/pthread.m4 --- xen-4.2.2/m4/pthread.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/pthread.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,41 @@ +# We define, separately, PTHREAD_CFLAGS, _LDFLAGS and _LIBS +# even though currently we don't set them very separately. +# This means that the makefiles will not need to change in +# the future if we make the test more sophisticated. + +AC_DEFUN([AX_PTHREAD_CV2VARS],[ + PTHREAD_CFLAGS="$ax_cv_pthread_flags" + PTHREAD_LDFLAGS="$ax_cv_pthread_flags" + PTHREAD_LIBS="" +]) + +# We invoke AX_PTHREAD_VARS with the name of another macro +# which is then expanded once for each variable. +AC_DEFUN([AX_PTHREAD_VARS],[$1(CFLAGS) $1(LDFLAGS) $1(LIBS)]) + +AC_DEFUN([AX_PTHREAD_VAR_APPLY],[ + $1="$$1 $PTHREAD_$1" +]) +AC_DEFUN([AX_PTHREAD_VAR_SUBST],[AC_SUBST(PTHREAD_$1)]) + +AC_DEFUN([AX_CHECK_PTHREAD],[ + AC_CACHE_CHECK([for pthread flag], [ax_cv_pthread_flags], [ + ax_cv_pthread_flags=-pthread + AX_PTHREAD_CV2VARS + AX_PTHREAD_VARS([AX_SAVEVAR_SAVE]) + AX_PTHREAD_VARS([AX_PTHREAD_VAR_APPLY]) + AC_LINK_IFELSE([AC_LANG_SOURCE([ +#include +int main(void) { + pthread_atfork(0,0,0); + pthread_create(0,0,0,0); +} +])],[],[ax_cv_pthread_flags=failed]) + AX_PTHREAD_VARS([AX_SAVEVAR_RESTORE]) + ]) + if test "x$ax_cv_pthread_flags" = xfailed; then + AC_MSG_ERROR([-pthread does not work]) + fi + AX_PTHREAD_CV2VARS + AX_PTHREAD_VARS([AX_PTHREAD_VAR_SUBST]) +]) diff -Nru xen-4.2.2/m4/ptyfuncs.m4 xen-4.3.0/m4/ptyfuncs.m4 --- xen-4.2.2/m4/ptyfuncs.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/ptyfuncs.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,35 @@ +AC_DEFUN([AX_CHECK_PTYFUNCS], [ + dnl This is a workaround for a bug in Debian package + dnl libbsd-dev-0.3.0-1. Once we no longer support that + dnl package we can remove the addition of -Werror to + dnl CPPFLAGS. + AX_SAVEVAR_SAVE(CPPFLAGS) + CPPFLAGS="$CPPFLAGS -Werror" + AC_CHECK_HEADER([libutil.h],[ + AC_DEFINE([INCLUDE_LIBUTIL_H],[],[libutil header file name]) + ]) + AX_SAVEVAR_RESTORE(CPPFLAGS) + AC_CACHE_CHECK([for openpty et al], [ax_cv_ptyfuncs_libs], [ + for ax_cv_ptyfuncs_libs in -lutil "" NOT_FOUND; do + if test "x$ax_cv_ptyfuncs_libs" = "xNOT_FOUND"; then + AC_MSG_FAILURE([Unable to find library for openpty and login_tty]) + fi + AX_SAVEVAR_SAVE(LIBS) + LIBS="$LIBS $ax_cv_ptyfuncs_libs" + AC_LINK_IFELSE([AC_LANG_SOURCE([ +#ifdef INCLUDE_LIBUTIL_H +#include INCLUDE_LIBUTIL_H +#endif +int main(void) { + openpty(0,0,0,0,0); + login_tty(0); +} +])],[ + break + ],[]) + AX_SAVEVAR_RESTORE(LIBS) + done + ]) + PTYFUNCS_LIBS="$ax_cv_ptyfuncs_libs" + AC_SUBST(PTYFUNCS_LIBS) +]) diff -Nru xen-4.2.2/m4/python_devel.m4 xen-4.3.0/m4/python_devel.m4 --- xen-4.2.2/m4/python_devel.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/python_devel.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,36 @@ +AC_DEFUN([AX_CHECK_PYTHON_DEVEL], [ +ac_previous_cppflags=$CPPFLAGS +ac_previous_ldflags=$LDFLAGS +ac_python_version=`$PYTHON -c 'import distutils.sysconfig; \ + print distutils.sysconfig.get_config_var("VERSION")'` +AC_PATH_PROG([pyconfig], [$PYTHON-config], [no]) +AS_IF([test x"$pyconfig" = x"no"], [ + dnl For those that don't have python-config + CPPFLAGS="$CFLAGS `$PYTHON -c 'import distutils.sysconfig; \ + print "-I" + distutils.sysconfig.get_config_var("INCLUDEPY")'`" + CPPFLAGS="$CPPFLAGS `$PYTHON -c 'import distutils.sysconfig; \ + print distutils.sysconfig.get_config_var("CFLAGS")'`" + LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \ + print distutils.sysconfig.get_config_var("LIBS")'`" + LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \ + print distutils.sysconfig.get_config_var("SYSLIBS")'`" + LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \ + print "-L" + distutils.sysconfig.get_python_lib(plat_specific=1,\ + standard_lib=1) + "/config"'`" + LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \ + print distutils.sysconfig.get_config_var("LINKFORSHARED")'`" + LDFLAGS="$LDFLAGS `$PYTHON -c 'import distutils.sysconfig; \ + print distutils.sysconfig.get_config_var("LDFLAGS")'`" +], [ + dnl If python-config is found use it + CPPFLAGS="$CFLAGS `$PYTHON-config --cflags`" + LDFLAGS="$LDFLAGS `$PYTHON-config --ldflags`" +]) + +AC_CHECK_HEADER([Python.h], [], + [AC_MSG_ERROR([Unable to find Python development headers])],) +AC_CHECK_LIB(python$ac_python_version, PyArg_ParseTuple, [], + [AC_MSG_ERROR([Unable to find a suitable python development library])]) +CPPFLAGS=$ac_previous_cppflags +LDLFAGS=$ac_previous_ldflags +]) diff -Nru xen-4.2.2/m4/python_version.m4 xen-4.3.0/m4/python_version.m4 --- xen-4.2.2/m4/python_version.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/python_version.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,12 @@ +AC_DEFUN([AX_CHECK_PYTHON_VERSION], +[AC_MSG_CHECKING([for python version >= $1.$2 ]) +`$PYTHON -c 'import sys; sys.exit(eval("sys.version_info < ($1, $2)"))'` +if test "$?" != "0" +then + python_version=`$PYTHON -V 2>&1` + AC_MSG_RESULT([no]) + AC_MSG_ERROR( + [$python_version is too old, minimum required version is $1.$2]) +else + AC_MSG_RESULT([yes]) +fi]) diff -Nru xen-4.2.2/m4/savevar.m4 xen-4.3.0/m4/savevar.m4 --- xen-4.2.2/m4/savevar.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/savevar.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,6 @@ +AC_DEFUN([AX_SAVEVAR_SAVE],[ + saved_$1="$$1" +]) +AC_DEFUN([AX_SAVEVAR_RESTORE],[ + $1="$saved_$1" +]) diff -Nru xen-4.2.2/m4/set_cflags_ldflags.m4 xen-4.3.0/m4/set_cflags_ldflags.m4 --- xen-4.2.2/m4/set_cflags_ldflags.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/set_cflags_ldflags.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,20 @@ +AC_DEFUN([AX_SET_FLAGS], +[for cppflag in $PREPEND_INCLUDES +do + PREPEND_CPPFLAGS="$PREPEND_CPPFLAGS -I$cppflag" +done +for ldflag in $PREPEND_LIB +do + PREPEND_LDFLAGS="$PREPEND_LDFLAGS -L$ldflag" +done +for cppflag in $APPEND_INCLUDES +do + APPEND_CPPFLAGS="$APPEND_CPPFLAGS -I$cppflag" +done +for ldflag in $APPEND_LIB +do + APPEND_LDFLAGS="$APPEND_LDFLAGS -L$ldflag" +done +CPPFLAGS="$PREPEND_CPPFLAGS $CPPFLAGS $APPEND_CPPFLAGS" +LDFLAGS="$PREPEND_LDFLAGS $LDFLAGS $APPEND_LDFLAGS"]) + diff -Nru xen-4.2.2/m4/stubdom.m4 xen-4.3.0/m4/stubdom.m4 --- xen-4.2.2/m4/stubdom.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/stubdom.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,96 @@ +AC_DEFUN([AX_STUBDOM_DEFAULT_ENABLE], [ +AC_ARG_ENABLE([$1], +AS_HELP_STRING([--disable-$1], [Build and install $1 (default is ENABLED)]),[ +AX_STUBDOM_INTERNAL([$1], [$2]) +],[ +AX_ENABLE_STUBDOM([$1], [$2]) +]) +AC_SUBST([$2]) +]) + +AC_DEFUN([AX_STUBDOM_DEFAULT_DISABLE], [ +AC_ARG_ENABLE([$1], +AS_HELP_STRING([--enable-$1], [Build and install $1 (default is DISABLED)]),[ +AX_STUBDOM_INTERNAL([$1], [$2]) +],[ +AX_DISABLE_STUBDOM([$1], [$2]) +]) +AC_SUBST([$2]) +]) + +AC_DEFUN([AX_STUBDOM_CONDITIONAL], [ +AC_ARG_ENABLE([$1], +AS_HELP_STRING([--enable-$1], [Build and install $1]),[ +AX_STUBDOM_INTERNAL([$1], [$2]) +]) +]) + +AC_DEFUN([AX_STUBDOM_CONDITIONAL_FINISH], [ +AS_IF([test "x$$2" = "xy" || test "x$$2" = "x"], [ +AX_ENABLE_STUBDOM([$1],[$2]) +],[ +AX_DISABLE_STUBDOM([$1],[$2]) +]) +AC_SUBST([$2]) +]) + +AC_DEFUN([AX_STUBDOM_AUTO_DEPENDS], [ +AS_IF([test "x$$1" = "x" && test "x$$2" = "xn"], [ +$1="n" +]) +]) + + +AC_DEFUN([AX_ENABLE_STUBDOM], [ +$2=y +STUBDOM_TARGETS="$STUBDOM_TARGETS $2" +STUBDOM_BUILD="$STUBDOM_BUILD $1" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-$2" +]) + +AC_DEFUN([AX_DISABLE_STUBDOM], [ +$2=n +]) + +dnl Don't call this outside of this file +AC_DEFUN([AX_STUBDOM_INTERNAL], [ +AS_IF([test "x$enableval" = "xyes"], [ +AX_ENABLE_STUBDOM([$1], [$2]) +],[ +AS_IF([test "x$enableval" = "xno"],[ +AX_DISABLE_STUBDOM([$1], [$2]) +]) +]) +]) + +AC_DEFUN([AX_STUBDOM_FINISH], [ +AC_SUBST(STUBDOM_TARGETS) +AC_SUBST(STUBDOM_BUILD) +AC_SUBST(STUBDOM_INSTALL) +echo "Will build the following stub domains:" +for x in $STUBDOM_BUILD; do + echo " $x" +done +]) + +AC_DEFUN([AX_STUBDOM_LIB], [ +AC_ARG_VAR([$1_URL], [Download url for $2]) +AS_IF([test "x$$1_URL" = "x"], [ + AS_IF([test "x$extfiles" = "xy"], + [$1_URL=\@S|@\@{:@XEN_EXTFILES_URL\@:}@], + [$1_URL="$4"]) + ]) +$1_VERSION="$3" +AC_SUBST($1_URL) +AC_SUBST($1_VERSION) +]) + +AC_DEFUN([AX_STUBDOM_LIB_NOEXT], [ +AC_ARG_VAR([$1_URL], [Download url for $2]) +AS_IF([test "x$$1_URL" = "x"], [ + $1_URL="$4" + ]) +$1_VERSION="$3" +AC_SUBST($1_URL) +AC_SUBST($1_VERSION) +]) diff -Nru xen-4.2.2/m4/subsystem.m4 xen-4.3.0/m4/subsystem.m4 --- xen-4.2.2/m4/subsystem.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/subsystem.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,71 @@ +AC_DEFUN([AX_ENABLE_SUBSYSTEM], [ +$1=y +SUBSYSTEMS="$SUBSYSTEMS $1" +]) + +AC_DEFUN([AX_DISABLE_SUBSYSTEM], [ +$1=n +]) + +AC_DEFUN([AX_SUBSYSTEM_DEFAULT_ENABLE], [ +AC_ARG_ENABLE([$1], +AS_HELP_STRING([--disable-$1], [Disable build and install of $1]),[ +AX_SUBSYSTEM_INTERNAL([$1]) +],[ +AX_ENABLE_SUBSYSTEM([$1]) +]) +AX_SUBSYSTEM_CONFIGURE([$1]) +AC_SUBST([$1]) +]) + +AC_DEFUN([AX_SUBSYSTEM_DEFAULT_DISABLE], [ +AC_ARG_ENABLE([$1], +AS_HELP_STRING([--enable-$1], [Enable build and install of $1]),[ +AX_SUBSYSTEM_INTERNAL([$1]) +],[ +AX_DISABLE_SUBSYSTEM([$1]) +]) +AX_SUBSYSTEM_CONFIGURE([$1]) +AC_SUBST([$1]) +]) + +AC_DEFUN([AX_SUBSYSTEM_CONDITIONAL], [ +AC_ARG_ENABLE([$1], +AS_HELP_STRING([--enable-$1], [Enable build and install of $1]),[ +AX_SUBSYSTEM_INTERNAL([$1]) +],[ +AS_IF([test "x$2" = "xy"],[ +AX_ENABLE_SUBSYSTEM([$1]) +],[ +AX_DISABLE_SUBSYSTEM([$1]) +]) +]) +AX_SUBSYSTEM_CONFIGURE([$1]) +AC_SUBST($1) +]) + +AC_DEFUN([AX_SUBSYSTEM_FINISH], [ +AC_SUBST(SUBSYSTEMS) +echo "Will build the following subsystems:" +for x in $SUBSYSTEMS; do + echo " $x" +done +]) + +AC_DEFUN([AX_SUBSYSTEM_INTERNAL], [ +AS_IF([test "x$enableval" = "xyes"], [ +AX_ENABLE_SUBSYSTEM([$1]) +],[ +AS_IF([test "x$enableval" = "xno"],[ +AX_DISABLE_SUBSYSTEM([$1]) +]) +]) +]) + +AC_DEFUN([AX_SUBSYSTEM_CONFIGURE], [ +AS_IF([test -e "$1/configure"], [ +if test "x$$1" = "xy" || test "x$$1" = "x" ; then + AC_CONFIG_SUBDIRS([$1]) +fi +]) +]) diff -Nru xen-4.2.2/m4/uuid.m4 xen-4.3.0/m4/uuid.m4 --- xen-4.2.2/m4/uuid.m4 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/m4/uuid.m4 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,9 @@ +AC_DEFUN([AX_CHECK_UUID], [ +AC_CHECK_HEADER([uuid/uuid.h],[ + AC_CHECK_LIB([uuid], [uuid_clear], [libuuid="y"]) +]) +AC_CHECK_HEADER([uuid.h],[libuuid="y"]) +AS_IF([test "$libuuid" != "y"], [ + AC_MSG_ERROR([cannot find a valid uuid library]) +]) +]) diff -Nru xen-4.2.2/qemu/configure xen-4.3.0/qemu/configure --- xen-4.2.2/qemu/configure 2013-01-17 16:00:26.000000000 +0000 +++ xen-4.3.0/qemu/configure 2013-06-17 16:39:51.000000000 +0000 @@ -1097,7 +1097,7 @@ cat > $TMPC < #include -int main(void) { clockid_t id; return clock_gettime(id, NULL); } +int main(void) { struct itimerspec v; timer_t t; return timer_gettime (t, &v); } EOF rt=no diff -Nru xen-4.2.2/qemu/hw/piix4acpi.c xen-4.3.0/qemu/hw/piix4acpi.c --- xen-4.2.2/qemu/hw/piix4acpi.c 2013-01-17 16:00:26.000000000 +0000 +++ xen-4.3.0/qemu/hw/piix4acpi.c 2013-06-17 16:39:51.000000000 +0000 @@ -814,24 +814,26 @@ return 1; } -void qemu_cpu_add_remove(int cpu, int state) +int qemu_cpu_add_remove(int cpu, int state) { if ((cpu <0) || (cpu >= vcpus)) { fprintf(stderr, "vcpu out of range, should be [0~%d]\n", vcpus - 1); - return; + return -EINVAL; } if (state) { if (!enable_processor(&gpe_state, cpu)) - return; + return 0; } else { if (!disable_processor(&gpe_state, cpu)) - return; + return 0; } fprintf(logfile, "%s vcpu %d\n", state ? "Add" : "Remove", cpu); - if (gpe_state.gpe0_en[0] & 4) { - qemu_set_irq(sci_irq, 1); - qemu_set_irq(sci_irq, 0); - } + return 1; +} +void qemu_cpu_notify(void) +{ + if (gpe_state.gpe0_en[0] & 4) + qemu_irq_pulse(sci_irq); } diff -Nru xen-4.2.2/qemu/hw/pt-msi.c xen-4.3.0/qemu/hw/pt-msi.c --- xen-4.2.2/qemu/hw/pt-msi.c 2013-01-17 16:00:26.000000000 +0000 +++ xen-4.3.0/qemu/hw/pt-msi.c 2013-06-17 16:39:51.000000000 +0000 @@ -213,7 +213,7 @@ out: /* clear msi info */ - dev->msi->flags = 0; + dev->msi->flags &= ~(MSI_FLAG_UNINIT | PT_MSI_MAPPED | PCI_MSI_FLAGS_ENABLE); dev->msi->pirq = -1; dev->msi_trans_en = 0; } diff -Nru xen-4.2.2/qemu/hw/xen_disk.c xen-4.3.0/qemu/hw/xen_disk.c --- xen-4.2.2/qemu/hw/xen_disk.c 2013-01-17 16:00:26.000000000 +0000 +++ xen-4.3.0/qemu/hw/xen_disk.c 2013-06-17 16:39:51.000000000 +0000 @@ -635,7 +635,7 @@ return -1; /* read-only ? */ - qflags = BDRV_O_NOCACHE; + qflags = BDRV_O_CACHE_WB; if (strcmp(blkdev->mode, "w") == 0) { mode = O_RDWR; qflags |= BDRV_O_RDWR; diff -Nru xen-4.2.2/qemu/i386-dm/helper2.c xen-4.3.0/qemu/i386-dm/helper2.c --- xen-4.2.2/qemu/i386-dm/helper2.c 2013-01-17 16:00:26.000000000 +0000 +++ xen-4.3.0/qemu/i386-dm/helper2.c 2013-06-17 16:39:51.000000000 +0000 @@ -339,21 +339,40 @@ } } -static inline void read_physical(uint64_t addr, unsigned long size, void *val) +/* + * Helper functions which read/write an object from/to physical guest + * memory, as part of the implementation of an ioreq. + * + * Equivalent to + * cpu_physical_memory_rw(addr + (req->df ? -1 : +1) * req->size * i, + * val, req->size, 0/1) + * except without the integer overflow problems. + */ +static void rw_phys_req_item(target_phys_addr_t addr, + ioreq_t *req, uint32_t i, void *val, int rw) +{ + /* Do everything unsigned so overflow just results in a truncated result + * and accesses to undesired parts of guest memory, which is up + * to the guest */ + target_phys_addr_t offset = (target_phys_addr_t)req->size * i; + if (req->df) addr -= offset; + else addr += offset; + cpu_physical_memory_rw(addr, val, req->size, rw); +} +static inline void read_phys_req_item(target_phys_addr_t addr, + ioreq_t *req, uint32_t i, void *val) { - return cpu_physical_memory_rw((target_phys_addr_t)addr, val, size, 0); + rw_phys_req_item(addr, req, i, val, 0); } - -static inline void write_physical(uint64_t addr, unsigned long size, void *val) +static inline void write_phys_req_item(target_phys_addr_t addr, + ioreq_t *req, uint32_t i, void *val) { - return cpu_physical_memory_rw((target_phys_addr_t)addr, val, size, 1); + rw_phys_req_item(addr, req, i, val, 1); } static void cpu_ioreq_pio(CPUState *env, ioreq_t *req) { - int i, sign; - - sign = req->df ? -1 : 1; + uint32_t i; if (req->dir == IOREQ_READ) { if (!req->data_is_ptr) { @@ -363,9 +382,7 @@ for (i = 0; i < req->count; i++) { tmp = do_inp(env, req->addr, req->size); - write_physical((target_phys_addr_t) req->data - + (sign * i * req->size), - req->size, &tmp); + write_phys_req_item(req->data, req, i, &tmp); } } } else if (req->dir == IOREQ_WRITE) { @@ -375,9 +392,7 @@ for (i = 0; i < req->count; i++) { unsigned long tmp = 0; - read_physical((target_phys_addr_t) req->data - + (sign * i * req->size), - req->size, &tmp); + read_phys_req_item(req->data, req, i, &tmp); do_outp(env, req->addr, req->size, tmp); } } @@ -386,22 +401,16 @@ static void cpu_ioreq_move(CPUState *env, ioreq_t *req) { - int i, sign; - - sign = req->df ? -1 : 1; + uint32_t i; if (!req->data_is_ptr) { if (req->dir == IOREQ_READ) { for (i = 0; i < req->count; i++) { - read_physical(req->addr - + (sign * i * req->size), - req->size, &req->data); + read_phys_req_item(req->addr, req, i, &req->data); } } else if (req->dir == IOREQ_WRITE) { for (i = 0; i < req->count; i++) { - write_physical(req->addr - + (sign * i * req->size), - req->size, &req->data); + write_phys_req_item(req->addr, req, i, &req->data); } } } else { @@ -409,21 +418,13 @@ if (req->dir == IOREQ_READ) { for (i = 0; i < req->count; i++) { - read_physical(req->addr - + (sign * i * req->size), - req->size, &tmp); - write_physical((target_phys_addr_t )req->data - + (sign * i * req->size), - req->size, &tmp); + read_phys_req_item(req->addr, req, i, &tmp); + write_phys_req_item(req->data, req, i, &tmp); } } else if (req->dir == IOREQ_WRITE) { for (i = 0; i < req->count; i++) { - read_physical((target_phys_addr_t) req->data - + (sign * i * req->size), - req->size, &tmp); - write_physical(req->addr - + (sign * i * req->size), - req->size, &tmp); + read_phys_req_item(req->data, req, i, &tmp); + write_phys_req_item(req->addr, req, i, &tmp); } } } diff -Nru xen-4.2.2/qemu/monitor.c xen-4.3.0/qemu/monitor.c --- xen-4.2.2/qemu/monitor.c 2013-01-17 16:00:26.000000000 +0000 +++ xen-4.3.0/qemu/monitor.c 2013-06-17 16:39:51.000000000 +0000 @@ -1485,8 +1485,8 @@ term_printf("invalid status: %s\n", status); return; } - - qemu_cpu_add_remove(value, state); + if (qemu_cpu_add_remove(value, state)) + qemu_cpu_notify(); } /* Please update qemu-doc.texi when adding or changing commands */ diff -Nru xen-4.2.2/qemu/sysemu.h xen-4.3.0/qemu/sysemu.h --- xen-4.2.2/qemu/sysemu.h 2013-01-17 16:00:26.000000000 +0000 +++ xen-4.3.0/qemu/sysemu.h 2013-06-17 16:39:51.000000000 +0000 @@ -173,9 +173,11 @@ extern int drive_init(struct drive_opt *arg, int snapshot, void *machine); /* acpi */ -void qemu_cpu_add_remove(int cpu, int state); +/* Returns 0 if nothing changed, 1 if added or removed and < 0 for errors. */ +int qemu_cpu_add_remove(int cpu, int state); void qemu_system_hot_add_init(void); void qemu_system_device_hot_add(int pcibus, int slot, int state); +void qemu_cpu_notify(void); /* device-hotplug */ diff -Nru xen-4.2.2/qemu/xen-hooks.mak xen-4.3.0/qemu/xen-hooks.mak --- xen-4.2.2/qemu/xen-hooks.mak 2013-01-17 16:00:26.000000000 +0000 +++ xen-4.3.0/qemu/xen-hooks.mak 2013-06-17 16:39:51.000000000 +0000 @@ -83,4 +83,6 @@ docdir := $(subst qemu,xen/qemu,$(docdir)) mandir := $(subst share/man,share/xen/man,$(mandir)) +BUILD_DOCS= + configdir := $(XEN_SCRIPT_DIR) diff -Nru xen-4.2.2/qemu/xenstore.c xen-4.3.0/qemu/xenstore.c --- xen-4.2.2/qemu/xenstore.c 2013-01-17 16:00:26.000000000 +0000 +++ xen-4.3.0/qemu/xenstore.c 2013-06-17 16:39:51.000000000 +0000 @@ -22,6 +22,7 @@ #include "pci.h" #include "qemu-timer.h" #include "qemu-xen.h" +#include "xen_backend.h" struct xs_handle *xsh = NULL; static char *media_filename[MAX_DRIVES+1]; @@ -999,34 +1000,89 @@ { xenstore_record_dm("state", state); } - -static void xenstore_process_vcpu_set_event(char **vec) +static int xenstore_process_one_vcpu_set_event(char *node) { char *act = NULL; - char *vcpustr, *node = vec[XS_WATCH_PATH]; + char *vcpustr; unsigned int vcpu, len; + int changed = -EINVAL; vcpustr = strstr(node, "cpu/"); if (!vcpustr) { fprintf(stderr, "vcpu-set: watch node error.\n"); - return; + return changed; } sscanf(vcpustr, "cpu/%u", &vcpu); act = xs_read(xsh, XBT_NULL, node, &len); if (!act) { fprintf(stderr, "vcpu-set: no command yet.\n"); - return; + return changed; } if (!strncmp(act, "online", len)) - qemu_cpu_add_remove(vcpu, 1); + changed = qemu_cpu_add_remove(vcpu, 1); else if (!strncmp(act, "offline", len)) - qemu_cpu_add_remove(vcpu, 0); + changed = qemu_cpu_add_remove(vcpu, 0); else fprintf(stderr, "vcpu-set: command error.\n"); free(act); + return changed; +} +static void xenstore_process_vcpu_set_event(char **vec) +{ + int changed = 0, rc, i, num = 0; + char *vcpu, **dir; + char *path = vec[XS_WATCH_PATH]; + + /* + * Process the event right away in case the loop below fails + * to get to vCPU that is in the event. + */ + rc = xenstore_process_one_vcpu_set_event(path); + if (rc > 0) + changed = 1; + /* + * We get: /local/domain//cpu//availability or + * (at init) /local/domain//cpu [ignore it] and need to + * iterate over /local/domain//cpu/ directory. + */ + vcpu = strstr(path, "cpu/"); + if (!vcpu) { + fprintf(stderr,"[%s]: %s has no CPU!\n", __func__, path); + return; + } + /* Eliminate '/availability' */ + vcpu[3] = '\0'; + dir = xs_directory(xsh, XBT_NULL, path, &num); + + if (!dir) { + fprintf(stderr, "[%s]: directory %s has no dirs!\n", __func__, path); + return; + } + if (num != vcpus) + fprintf(stderr, "[%s]: %d (number of vcpu entries) != %d (maxvcpus)! "\ + "Continuing on..\n", __func__, num, vcpus); + + for (i = 0; i < num; i++) { + char attr[XEN_BUFSIZE]; + + /* Construct "/local/domain//cpu" (path) with (attr), + * and "availability" with '/' sprinkled around. */ + snprintf(attr, XEN_BUFSIZE, "%s/%s/%s", path, dir[i], "availability"); + rc = xenstore_process_one_vcpu_set_event(attr); + + if (rc > 0) + changed = 1; + if (rc < 0) /* say xs_read failed */ + break; + } + free (dir); + if (changed > 0) { + fprintf(stderr, "Notifying OS about CPU hotplug changes.\n"); + qemu_cpu_notify(); + } return; } diff -Nru xen-4.2.2/stubdom/Makefile xen-4.3.0/stubdom/Makefile --- xen-4.2.2/stubdom/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/stubdom/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -6,32 +6,7 @@ export stubdom=y export debug=y include $(XEN_ROOT)/Config.mk - -#ZLIB_URL?=http://www.zlib.net -ZLIB_URL=$(XEN_EXTFILES_URL) -ZLIB_VERSION=1.2.3 - -#LIBPCI_URL?=http://www.kernel.org/pub/software/utils/pciutils -LIBPCI_URL?=$(XEN_EXTFILES_URL) -LIBPCI_VERSION=2.2.9 - -#NEWLIB_URL?=ftp://sources.redhat.com/pub/newlib -NEWLIB_URL?=$(XEN_EXTFILES_URL) -NEWLIB_VERSION=1.16.0 - -#LWIP_URL?=http://download.savannah.gnu.org/releases/lwip -LWIP_URL?=$(XEN_EXTFILES_URL) -LWIP_VERSION=1.3.0 - -#GRUB_URL?=http://alpha.gnu.org/gnu/grub -GRUB_URL?=$(XEN_EXTFILES_URL) -GRUB_VERSION=0.97 - -#OCAML_URL?=$(XEN_EXTFILES_URL) -OCAML_URL?=http://caml.inria.fr/pub/distrib/ocaml-3.11 -OCAML_VERSION=3.11.0 - -WGET=wget -c +-include $(XEN_ROOT)/config/Stubdom.mk GNU_TARGET_ARCH:=$(XEN_TARGET_ARCH) ifeq ($(XEN_TARGET_ARCH),x86_32) @@ -74,12 +49,12 @@ TARGET_LDFLAGS += -nostdlib -L$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib -TARGETS=ioemu c caml grub xenstore +TARGETS=$(STUBDOM_TARGETS) .PHONY: all all: build ifeq ($(STUBDOM_SUPPORTED),1) -build: genpath ioemu-stubdom c-stubdom pv-grub xenstore-stubdom +build: genpath $(STUBDOM_BUILD) else build: genpath endif @@ -93,7 +68,7 @@ ############## newlib-$(NEWLIB_VERSION).tar.gz: - $(WGET) $(NEWLIB_URL)/$@ + $(FETCHER) $@ $(NEWLIB_URL)/$@ newlib-$(NEWLIB_VERSION): newlib-$(NEWLIB_VERSION).tar.gz tar xzf $< @@ -119,7 +94,7 @@ ############ zlib-$(ZLIB_VERSION).tar.gz: - $(WGET) $(ZLIB_URL)/$@ + $(FETCHER) $@ $(ZLIB_URL)/$@ zlib-$(XEN_TARGET_ARCH): zlib-$(ZLIB_VERSION).tar.gz tar xzf $< @@ -139,7 +114,7 @@ ############## pciutils-$(LIBPCI_VERSION).tar.bz2: - $(WGET) $(LIBPCI_URL)/$@ + $(FETCHER) $@ $(LIBPCI_URL)/$@ pciutils-$(XEN_TARGET_ARCH): pciutils-$(LIBPCI_VERSION).tar.bz2 tar xjf $< @@ -167,7 +142,7 @@ ###### lwip-$(LWIP_VERSION).tar.gz: - $(WGET) $(LWIP_URL)/$@ + $(FETCHER) $@ $(LWIP_URL)/$@ lwip-$(XEN_TARGET_ARCH): lwip-$(LWIP_VERSION).tar.gz tar xzf $< @@ -176,6 +151,80 @@ touch $@ ############# +# cross-gmp +############# +gmp-$(GMP_VERSION).tar.bz2: + $(FETCHER) $@ $(GMP_URL)/$@ + +.PHONY: cross-gmp +ifeq ($(XEN_TARGET_ARCH), x86_32) + GMPEXT=ABI=32 +endif +gmp-$(XEN_TARGET_ARCH): gmp-$(GMP_VERSION).tar.bz2 $(NEWLIB_STAMPFILE) + tar xjf $< + rm $@ -rf || : + mv gmp-$(GMP_VERSION) $@ + #patch -d $@ -p0 < gmp.patch + cd $@; CPPFLAGS="-isystem $(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/include $(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" CC=$(CC) $(GMPEXT) ./configure --disable-shared --enable-static --disable-fft --without-readline --prefix=$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf + sed -i 's/#define HAVE_OBSTACK_VPRINTF 1/\/\/#define HAVE_OBSTACK_VPRINTF 1/' $@/config.h + touch $@ + +GMP_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libgmp.a +cross-gmp: $(GMP_STAMPFILE) +$(GMP_STAMPFILE): gmp-$(XEN_TARGET_ARCH) + ( cd $< && \ + $(MAKE) && \ + $(MAKE) DESTDIR= install ) + +############# +# cross-polarssl +############# +polarssl-$(POLARSSL_VERSION)-gpl.tgz: + $(FETCHER) $@ $(POLARSSL_URL)/$@ + +polarssl-$(XEN_TARGET_ARCH): polarssl-$(POLARSSL_VERSION)-gpl.tgz + tar xzf $< + mv polarssl-$(POLARSSL_VERSION) $@ + patch -d $@ -p1 < polarssl.patch + touch $@ + +POLARSSL_STAMPFILE=$(CROSS_ROOT)/$(GNU_TARGET_ARCH)-xen-elf/lib/libpolarssl.a +cross-polarssl: $(POLARSSL_STAMPFILE) +$(POLARSSL_STAMPFILE): polarssl-$(XEN_TARGET_ARCH) $(NEWLIB_STAMPFILE) lwip-$(XEN_TARGET_ARCH) + ( cd $. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: xen-devel@lists.xen.org about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='Xen Hypervisor Stub Domains' +PACKAGE_TARNAME='xen' +PACKAGE_VERSION='4.3' +PACKAGE_STRING='Xen Hypervisor Stub Domains 4.3' +PACKAGE_BUGREPORT='xen-devel@lists.xen.org' +PACKAGE_URL='http://www.xen.org/' + +ac_unique_file="../extras/mini-os/kernel.c" +ac_subst_vars='LTLIBOBJS +LIBOBJS +STUBDOM_INSTALL +STUBDOM_BUILD +STUBDOM_TARGETS +vtpmmgr +vtpm +TPMEMU_VERSION +TPMEMU_URL +POLARSSL_VERSION +POLARSSL_URL +GMP_VERSION +GMP_URL +OCAML_VERSION +OCAML_URL +GRUB_VERSION +GRUB_URL +LWIP_VERSION +LWIP_URL +NEWLIB_VERSION +NEWLIB_URL +LIBPCI_VERSION +LIBPCI_URL +ZLIB_VERSION +ZLIB_URL +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +SET_MAKE +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +FETCHER +FTP +WGET +CMAKE +extfiles +debug +xenstore +grub +caml +c +ioemu +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_ioemu_stubdom +enable_c_stubdom +enable_caml_stubdom +enable_pv_grub +enable_xenstore_stubdom +enable_vtpm_stubdom +enable_vtpmmgr_stubdom +enable_debug +enable_extfiles +' + ac_precious_vars='build_alias +host_alias +target_alias +CMAKE +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +ZLIB_URL +LIBPCI_URL +NEWLIB_URL +LWIP_URL +GRUB_URL +OCAML_URL +GMP_URL +POLARSSL_URL +TPMEMU_URL' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures Xen Hypervisor Stub Domains 4.3 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/xen] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of Xen Hypervisor Stub Domains 4.3:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-ioemu-stubdom Build and install ioemu-stubdom (default is ENABLED) + --enable-c-stubdom Build and install c-stubdom (default is DISABLED) + --enable-caml-stubdom Build and install caml-stubdom (default is DISABLED) + --disable-pv-grub Build and install pv-grub (default is ENABLED) + --disable-xenstore-stubdom + Build and install xenstore-stubdom (default is + ENABLED) + --enable-vtpm-stubdom Build and install vtpm-stubdom + --enable-vtpmmgr-stubdom + Build and install vtpmmgr-stubdom + --disable-debug Disable debug build of stubdom (default is ENABLED) + --disable-extfiles Use xen extfiles repository for libraries (default + is ENABLED) + +Some influential environment variables: + CMAKE Path to the cmake program + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + ZLIB_URL Download url for zlib + LIBPCI_URL Download url for libpci + NEWLIB_URL Download url for newlib + LWIP_URL Download url for lwip + GRUB_URL Download url for grub + OCAML_URL Download url for ocaml + GMP_URL Download url for libgmp + POLARSSL_URL + Download url for polarssl + TPMEMU_URL Download url for berlios tpm emulator + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +Xen Hypervisor Stub Domains home page: . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +Xen Hypervisor Stub Domains configure 4.3 +generated by GNU Autoconf 2.67 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by Xen Hypervisor Stub Domains $as_me 4.3, which was +generated by GNU Autoconf 2.67. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5 ; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_config_files="$ac_config_files ../config/Stubdom.mk" + +ac_aux_dir= +for ac_dir in ../ "$srcdir"/../; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../ \"$srcdir\"/../" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + +# M4 Macro includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Enable/disable stub domains + +# Check whether --enable-ioemu-stubdom was given. +if test "${enable_ioemu_stubdom+set}" = set; then : + enableval=$enable_ioemu_stubdom; + +if test "x$enableval" = "xyes"; then : + + +ioemu=y +STUBDOM_TARGETS="$STUBDOM_TARGETS ioemu" +STUBDOM_BUILD="$STUBDOM_BUILD ioemu-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-ioemu" + + +else + +if test "x$enableval" = "xno"; then : + + +ioemu=n + + +fi + +fi + + +else + + +ioemu=y +STUBDOM_TARGETS="$STUBDOM_TARGETS ioemu" +STUBDOM_BUILD="$STUBDOM_BUILD ioemu-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-ioemu" + + +fi + + + + +# Check whether --enable-c-stubdom was given. +if test "${enable_c_stubdom+set}" = set; then : + enableval=$enable_c_stubdom; + +if test "x$enableval" = "xyes"; then : + + +c=y +STUBDOM_TARGETS="$STUBDOM_TARGETS c" +STUBDOM_BUILD="$STUBDOM_BUILD c-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-c" + + +else + +if test "x$enableval" = "xno"; then : + + +c=n + + +fi + +fi + + +else + + +c=n + + +fi + + + + +# Check whether --enable-caml-stubdom was given. +if test "${enable_caml_stubdom+set}" = set; then : + enableval=$enable_caml_stubdom; + +if test "x$enableval" = "xyes"; then : + + +caml=y +STUBDOM_TARGETS="$STUBDOM_TARGETS caml" +STUBDOM_BUILD="$STUBDOM_BUILD caml-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-caml" + + +else + +if test "x$enableval" = "xno"; then : + + +caml=n + + +fi + +fi + + +else + + +caml=n + + +fi + + + + +# Check whether --enable-pv-grub was given. +if test "${enable_pv_grub+set}" = set; then : + enableval=$enable_pv_grub; + +if test "x$enableval" = "xyes"; then : + + +grub=y +STUBDOM_TARGETS="$STUBDOM_TARGETS grub" +STUBDOM_BUILD="$STUBDOM_BUILD pv-grub" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-grub" + + +else + +if test "x$enableval" = "xno"; then : + + +grub=n + + +fi + +fi + + +else + + +grub=y +STUBDOM_TARGETS="$STUBDOM_TARGETS grub" +STUBDOM_BUILD="$STUBDOM_BUILD pv-grub" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-grub" + + +fi + + + + +# Check whether --enable-xenstore-stubdom was given. +if test "${enable_xenstore_stubdom+set}" = set; then : + enableval=$enable_xenstore_stubdom; + +if test "x$enableval" = "xyes"; then : + + +xenstore=y +STUBDOM_TARGETS="$STUBDOM_TARGETS xenstore" +STUBDOM_BUILD="$STUBDOM_BUILD xenstore-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-xenstore" + + +else + +if test "x$enableval" = "xno"; then : + + +xenstore=n + + +fi + +fi + + +else + + +xenstore=y +STUBDOM_TARGETS="$STUBDOM_TARGETS xenstore" +STUBDOM_BUILD="$STUBDOM_BUILD xenstore-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-xenstore" + + +fi + + + + +# Check whether --enable-vtpm-stubdom was given. +if test "${enable_vtpm_stubdom+set}" = set; then : + enableval=$enable_vtpm_stubdom; + +if test "x$enableval" = "xyes"; then : + + +vtpm=y +STUBDOM_TARGETS="$STUBDOM_TARGETS vtpm" +STUBDOM_BUILD="$STUBDOM_BUILD vtpm-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-vtpm" + + +else + +if test "x$enableval" = "xno"; then : + + +vtpm=n + + +fi + +fi + + +fi + + + +# Check whether --enable-vtpmmgr-stubdom was given. +if test "${enable_vtpmmgr_stubdom+set}" = set; then : + enableval=$enable_vtpmmgr_stubdom; + +if test "x$enableval" = "xyes"; then : + + +vtpmmgr=y +STUBDOM_TARGETS="$STUBDOM_TARGETS vtpmmgr" +STUBDOM_BUILD="$STUBDOM_BUILD vtpmmgr-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-vtpmmgr" + + +else + +if test "x$enableval" = "xno"; then : + + +vtpmmgr=n + + +fi + +fi + + +fi + + + + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +fi + + +if test "x$enable_debug" = "xno"; then : + + ax_cv_debug="n" + +elif test "x$enable_debug" = "xyes"; then : + + ax_cv_debug="y" + +elif test -z $ax_cv_debug; then : + + ax_cv_debug="y" + +fi +debug=$ax_cv_debug + + + +# Check whether --enable-extfiles was given. +if test "${enable_extfiles+set}" = set; then : + enableval=$enable_extfiles; +fi + + +if test "x$enable_extfiles" = "xno"; then : + + ax_cv_extfiles="n" + +elif test "x$enable_extfiles" = "xyes"; then : + + ax_cv_extfiles="y" + +elif test -z $ax_cv_extfiles; then : + + ax_cv_extfiles="y" + +fi +extfiles=$ax_cv_extfiles + + + + + +# Extract the first word of "wget", so it can be a program name with args. +set dummy wget; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_WGET+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $WGET in + [\\/]* | ?:[\\/]*) + ac_cv_path_WGET="$WGET" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="no" + ;; +esac +fi +WGET=$ac_cv_path_WGET +if test -n "$WGET"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5 +$as_echo "$WGET" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test x"$WGET" != x"no"; then : + + FETCHER="$WGET -c -O" + +else + + # Extract the first word of "ftp", so it can be a program name with args. +set dummy ftp; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_FTP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $FTP in + [\\/]* | ?:[\\/]*) + ac_cv_path_FTP="$FTP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_FTP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_FTP" && ac_cv_path_FTP="no" + ;; +esac +fi +FTP=$ac_cv_path_FTP +if test -n "$FTP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FTP" >&5 +$as_echo "$FTP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$FTP" != x"no"; then : + + FETCHER="$FTP -o" + +else + + as_fn_error $? "cannot find wget or ftp" "$LINENO" 5 + +fi + +fi + + + +# Checks for programs. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5 ; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5 ; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5 ; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +# Checks for programs that depend on a feature + +if test "x$vtpm" = "xy"; then : + # Extract the first word of "cmake", so it can be a program name with args. +set dummy cmake; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CMAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CMAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CMAKE="$CMAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CMAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_CMAKE" && ac_cv_path_CMAKE="no" + ;; +esac +fi +CMAKE=$ac_cv_path_CMAKE +if test -n "$CMAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CMAKE" >&5 +$as_echo "$CMAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test x"${CMAKE}" = x"no" +then + as_fn_error $? "Unable to find cmake, please install cmake" "$LINENO" 5 +fi +else + +if test "x$vtpm" = "xn"; then : + +CMAKE="/cmake-disabled-in-configure-script" + +else + +# Extract the first word of "cmake", so it can be a program name with args. +set dummy cmake; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CMAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CMAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CMAKE="$CMAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CMAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_CMAKE" && ac_cv_path_CMAKE="no" + ;; +esac +fi +CMAKE=$ac_cv_path_CMAKE +if test -n "$CMAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CMAKE" >&5 +$as_echo "$CMAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test x"${CMAKE}" = "xno"; then : + +vtpm=n +CMAKE="/cmake-disabled-in-configure-script" + +fi + +fi + +fi + + + +# Stubdom libraries version and url setup + + +if test "x$ZLIB_URL" = "x"; then : + + if test "x$extfiles" = "xy"; then : + ZLIB_URL=\$\(XEN_EXTFILES_URL\) +else + ZLIB_URL="http://www.zlib.net" +fi + +fi +ZLIB_VERSION="1.2.3" + + + + + +if test "x$LIBPCI_URL" = "x"; then : + + if test "x$extfiles" = "xy"; then : + LIBPCI_URL=\$\(XEN_EXTFILES_URL\) +else + LIBPCI_URL="http://www.kernel.org/pub/software/utils/pciutils" +fi + +fi +LIBPCI_VERSION="2.2.9" + + + + + +if test "x$NEWLIB_URL" = "x"; then : + + if test "x$extfiles" = "xy"; then : + NEWLIB_URL=\$\(XEN_EXTFILES_URL\) +else + NEWLIB_URL="ftp://sources.redhat.com/pub/newlib" +fi + +fi +NEWLIB_VERSION="1.16.0" + + + + + +if test "x$LWIP_URL" = "x"; then : + + if test "x$extfiles" = "xy"; then : + LWIP_URL=\$\(XEN_EXTFILES_URL\) +else + LWIP_URL="http://download.savannah.gnu.org/releases/lwip" +fi + +fi +LWIP_VERSION="1.3.0" + + + + + +if test "x$GRUB_URL" = "x"; then : + + if test "x$extfiles" = "xy"; then : + GRUB_URL=\$\(XEN_EXTFILES_URL\) +else + GRUB_URL="http://alpha.gnu.org/gnu/grub" +fi + +fi +GRUB_VERSION="0.97" + + + + + +if test "x$OCAML_URL" = "x"; then : + + OCAML_URL="http://caml.inria.fr/pub/distrib/ocaml-3.11" + +fi +OCAML_VERSION="3.11.0" + + + + + +if test "x$GMP_URL" = "x"; then : + + if test "x$extfiles" = "xy"; then : + GMP_URL=\$\(XEN_EXTFILES_URL\) +else + GMP_URL="ftp://ftp.gmplib.org/pub/gmp-4.3.2" +fi + +fi +GMP_VERSION="4.3.2" + + + + + +if test "x$POLARSSL_URL" = "x"; then : + + if test "x$extfiles" = "xy"; then : + POLARSSL_URL=\$\(XEN_EXTFILES_URL\) +else + POLARSSL_URL="http://polarssl.org/code/releases" +fi + +fi +POLARSSL_VERSION="1.1.4" + + + + + +if test "x$TPMEMU_URL" = "x"; then : + + if test "x$extfiles" = "xy"; then : + TPMEMU_URL=\$\(XEN_EXTFILES_URL\) +else + TPMEMU_URL="http://download.berlios.de/tpm-emulator" +fi + +fi +TPMEMU_VERSION="0.7.4" + + + + +#These stubdoms should be enabled if the dependent one is + +if test "x$vtpmmgr" = "x" && test "x$vtpm" = "xn"; then : + +vtpmmgr="n" + +fi + + +#Conditionally enable these stubdoms based on the presense of dependencies + +if test "x$vtpm" = "xy" || test "x$vtpm" = "x"; then : + + +vtpm=y +STUBDOM_TARGETS="$STUBDOM_TARGETS vtpm" +STUBDOM_BUILD="$STUBDOM_BUILD vtpm-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-vtpm" + + +else + + +vtpm=n + + +fi + + + +if test "x$vtpmmgr" = "xy" || test "x$vtpmmgr" = "x"; then : + + +vtpmmgr=y +STUBDOM_TARGETS="$STUBDOM_TARGETS vtpmmgr" +STUBDOM_BUILD="$STUBDOM_BUILD vtpmmgr-stubdom" +STUBDOM_INSTALL="$STUBDOM_INSTALL install-vtpmmgr" + + +else + + +vtpmmgr=n + + +fi + + + + + + + +echo "Will build the following stub domains:" +for x in $STUBDOM_BUILD; do + echo " $x" +done + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by Xen Hypervisor Stub Domains $as_me 4.3, which was +generated by GNU Autoconf 2.67. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to . +Xen Hypervisor Stub Domains home page: ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +Xen Hypervisor Stub Domains config.status 4.3 +configured by $0, generated by GNU Autoconf 2.67, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "../config/Stubdom.mk") CONFIG_FILES="$CONFIG_FILES ../config/Stubdom.mk" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff -Nru xen-4.2.2/stubdom/configure.ac xen-4.3.0/stubdom/configure.ac --- xen-4.2.2/stubdom/configure.ac 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/configure.ac 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,60 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.67]) +AC_INIT([Xen Hypervisor Stub Domains], m4_esyscmd([../version.sh ../xen/Makefile]), + [xen-devel@lists.xen.org], [xen], [http://www.xen.org/]) +AC_CONFIG_SRCDIR([../extras/mini-os/kernel.c]) +AC_CONFIG_FILES([../config/Stubdom.mk]) +AC_CONFIG_AUX_DIR([../]) + +# M4 Macro includes +m4_include([../m4/stubdom.m4]) +m4_include([../m4/features.m4]) +m4_include([../m4/path_or_fail.m4]) +m4_include([../m4/depends.m4]) +m4_include([../m4/fetcher.m4]) + +# Enable/disable stub domains +AX_STUBDOM_DEFAULT_ENABLE([ioemu-stubdom], [ioemu]) +AX_STUBDOM_DEFAULT_DISABLE([c-stubdom], [c]) +AX_STUBDOM_DEFAULT_DISABLE([caml-stubdom], [caml]) +AX_STUBDOM_DEFAULT_ENABLE([pv-grub], [grub]) +AX_STUBDOM_DEFAULT_ENABLE([xenstore-stubdom], [xenstore]) +AX_STUBDOM_CONDITIONAL([vtpm-stubdom], [vtpm]) +AX_STUBDOM_CONDITIONAL([vtpmmgr-stubdom], [vtpmmgr]) + +AX_ARG_DEFAULT_ENABLE([debug], [Disable debug build of stubdom]) +AX_ARG_DEFAULT_ENABLE([extfiles], [Use xen extfiles repository for libraries]) + +AC_ARG_VAR([CMAKE], [Path to the cmake program]) +AX_CHECK_FETCHER + +# Checks for programs. +AC_PROG_CC +AC_PROG_MAKE_SET +AC_PROG_INSTALL + +# Checks for programs that depend on a feature +AX_DEPENDS_PATH_PROG([vtpm], [CMAKE], [cmake]) + +# Stubdom libraries version and url setup +AX_STUBDOM_LIB([ZLIB], [zlib], [1.2.3], [http://www.zlib.net]) +AX_STUBDOM_LIB([LIBPCI], [libpci], [2.2.9], [http://www.kernel.org/pub/software/utils/pciutils]) +AX_STUBDOM_LIB([NEWLIB], [newlib], [1.16.0], [ftp://sources.redhat.com/pub/newlib]) +AX_STUBDOM_LIB([LWIP], [lwip], [1.3.0], [http://download.savannah.gnu.org/releases/lwip]) +AX_STUBDOM_LIB([GRUB], [grub], [0.97], [http://alpha.gnu.org/gnu/grub]) +AX_STUBDOM_LIB_NOEXT([OCAML], [ocaml], [3.11.0], [http://caml.inria.fr/pub/distrib/ocaml-3.11]) +AX_STUBDOM_LIB([GMP], [libgmp], [4.3.2], [ftp://ftp.gmplib.org/pub/gmp-4.3.2]) +AX_STUBDOM_LIB([POLARSSL], [polarssl], [1.1.4], [http://polarssl.org/code/releases]) +AX_STUBDOM_LIB([TPMEMU], [berlios tpm emulator], [0.7.4], [http://download.berlios.de/tpm-emulator]) + +#These stubdoms should be enabled if the dependent one is +AX_STUBDOM_AUTO_DEPENDS([vtpmmgr], [vtpm]) + +#Conditionally enable these stubdoms based on the presense of dependencies +AX_STUBDOM_CONDITIONAL_FINISH([vtpm-stubdom], [vtpm]) +AX_STUBDOM_CONDITIONAL_FINISH([vtpmmgr-stubdom], [vtpmmgr]) + +AX_STUBDOM_FINISH +AC_OUTPUT() diff -Nru xen-4.2.2/stubdom/grub/Makefile xen-4.3.0/stubdom/grub/Makefile --- xen-4.2.2/stubdom/grub/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/stubdom/grub/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -60,6 +60,7 @@ $(BOOT): DEF_CPPFLAGS+=-D__ASSEMBLY__ PV_GRUB_SOURCES = kexec.c mini-os.c +PV_GRUB_SOURCES += ../polarssl-$(XEN_TARGET_ARCH)/library/sha1.o SOURCES = $(NETBOOT_SOURCES) $(STAGE2_SOURCES) $(PV_GRUB_SOURCES) diff -Nru xen-4.2.2/stubdom/grub/kexec.c xen-4.3.0/stubdom/grub/kexec.c --- xen-4.2.2/stubdom/grub/kexec.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/stubdom/grub/kexec.c 2013-07-09 10:46:56.000000000 +0000 @@ -28,7 +28,9 @@ #include #include #include +#include #include +#include #include "mini-os.h" @@ -54,6 +56,22 @@ int pin_table(xc_interface *xc_handle, unsigned int type, unsigned long mfn, domid_t dom); +#define TPM_TAG_RQU_COMMAND 0xC1 +#define TPM_ORD_Extend 20 + +struct pcr_extend_cmd { + uint16_t tag; + uint32_t size; + uint32_t ord; + + uint32_t pcr; + unsigned char hash[20]; +} __attribute__((packed)); + +/* Not imported from polarssl's header since the prototype unhelpfully defines + * the input as unsigned char, which causes pointer type mismatches */ +void sha1(const void *input, size_t ilen, unsigned char output[20]); + /* We need mfn to appear as target_pfn, so exchange with the MFN there */ static void do_exchange(struct xc_dom_image *dom, xen_pfn_t target_pfn, xen_pfn_t source_mfn) { @@ -117,6 +135,40 @@ return 0; } +static void tpm_hash2pcr(struct xc_dom_image *dom, char *cmdline) +{ + struct tpmfront_dev* tpm = init_tpmfront(NULL); + uint8_t *resp; + size_t resplen = 0; + struct pcr_extend_cmd cmd; + + /* If all guests have access to a vTPM, it may be useful to replace this + * with ASSERT(tpm) to prevent configuration errors from allowing a guest + * to boot without a TPM (or with a TPM that has not been sent any + * measurements, which could allow forging the measurements). + */ + if (!tpm) + return; + + cmd.tag = bswap_16(TPM_TAG_RQU_COMMAND); + cmd.size = bswap_32(sizeof(cmd)); + cmd.ord = bswap_32(TPM_ORD_Extend); + cmd.pcr = bswap_32(4); // PCR #4 for kernel + sha1(dom->kernel_blob, dom->kernel_size, cmd.hash); + + tpmfront_cmd(tpm, (void*)&cmd, sizeof(cmd), &resp, &resplen); + + cmd.pcr = bswap_32(5); // PCR #5 for cmdline + sha1(cmdline, strlen(cmdline), cmd.hash); + tpmfront_cmd(tpm, (void*)&cmd, sizeof(cmd), &resp, &resplen); + + cmd.pcr = bswap_32(5); // PCR #5 for initrd + sha1(dom->ramdisk_blob, dom->ramdisk_size, cmd.hash); + tpmfront_cmd(tpm, (void*)&cmd, sizeof(cmd), &resp, &resplen); + + shutdown_tpmfront(tpm); +} + void kexec(void *kernel, long kernel_size, void *module, long module_size, char *cmdline, unsigned long flags) { struct xc_dom_image *dom; @@ -151,6 +203,8 @@ dom->console_evtchn = start_info.console.domU.evtchn; dom->xenstore_evtchn = start_info.store_evtchn; + tpm_hash2pcr(dom, cmdline); + if ( (rc = xc_dom_boot_xen_init(dom, xc_handle, domid)) != 0 ) { grub_printf("xc_dom_boot_xen_init returned %d\n", rc); errnum = ERR_BOOT_FAILURE; diff -Nru xen-4.2.2/stubdom/grub/mini-os.c xen-4.3.0/stubdom/grub/mini-os.c --- xen-4.2.2/stubdom/grub/mini-os.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/stubdom/grub/mini-os.c 2013-07-09 10:46:56.000000000 +0000 @@ -241,7 +241,7 @@ if ((void*) (multiboot_next_module_header+1) - module_image > PAGE_SIZE) { /* Too many modules */ - ERR_WONT_FIT; + errnum = ERR_WONT_FIT; return 0; } diff -Nru xen-4.2.2/stubdom/grub/minios.cfg xen-4.3.0/stubdom/grub/minios.cfg --- xen-4.2.2/stubdom/grub/minios.cfg 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/stubdom/grub/minios.cfg 2013-07-09 10:46:56.000000000 +0000 @@ -1,2 +1,3 @@ CONFIG_START_NETWORK=n CONFIG_SPARSE_BSS=n +CONFIG_TPMFRONT=y diff -Nru xen-4.2.2/stubdom/grub.patches/70compiler_warnings.diff xen-4.3.0/stubdom/grub.patches/70compiler_warnings.diff --- xen-4.2.2/stubdom/grub.patches/70compiler_warnings.diff 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/grub.patches/70compiler_warnings.diff 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,45 @@ +[ 1436s] ../grub-upstream/netboot/fsys_tftp.c:213: warning: operation on 'block' may be undefined +[ 1437s] ../grub-upstream/netboot/main.c:444: warning: operation on 'block' may be undefined + +[ 1234s] E: xen sequence-point ../grub-upstream/netboot/fsys_tftp.c:213 +[ 1234s] E: xen sequence-point ../grub-upstream/netboot/main.c:444 + +--- + netboot/fsys_tftp.c | 5 ++++- + netboot/main.c | 5 ++++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +Index: grub-0.97/netboot/fsys_tftp.c +=================================================================== +--- grub-0.97.orig/netboot/fsys_tftp.c ++++ grub-0.97/netboot/fsys_tftp.c +@@ -209,8 +209,11 @@ buf_fill (int abort) + break; + + if ((block || bcounter) && (block != prevblock + (unsigned short) 1)) ++ { ++ block = prevblock; + /* Block order should be continuous */ +- tp.u.ack.block = htons (block = prevblock); ++ tp.u.ack.block = htons (block); ++ } + + /* Should be continuous. */ + tp.opcode = abort ? htons (TFTP_ERROR) : htons (TFTP_ACK); +Index: grub-0.97/netboot/main.c +=================================================================== +--- grub-0.97.orig/netboot/main.c ++++ grub-0.97/netboot/main.c +@@ -440,8 +440,11 @@ tftp (const char *name, int (*fnc) (unsi + break; + + if ((block || bcounter) && (block != prevblock + 1)) ++ { ++ block = prevblock; + /* Block order should be continuous */ +- tp.u.ack.block = htons (block = prevblock); ++ tp.u.ack.block = htons (block); ++ } + + /* Should be continuous. */ + tp.opcode = htons (TFTP_ACK); diff -Nru xen-4.2.2/stubdom/polarssl.patch xen-4.3.0/stubdom/polarssl.patch --- xen-4.2.2/stubdom/polarssl.patch 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/polarssl.patch 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,64 @@ +diff -Naur polarssl-1.1.4/include/polarssl/config.h polarssl-x86_64/include/polarssl/config.h +--- polarssl-1.1.4/include/polarssl/config.h 2011-12-22 05:06:27.000000000 -0500 ++++ polarssl-x86_64/include/polarssl/config.h 2012-10-30 17:18:07.567001000 -0400 +@@ -164,8 +164,8 @@ + * application. + * + * Uncomment this macro to prevent loading of default entropy functions. +-#define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES + */ ++#define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES + + /** + * \def POLARSSL_NO_PLATFORM_ENTROPY +@@ -175,8 +175,8 @@ + * standards like the /dev/urandom or Windows CryptoAPI. + * + * Uncomment this macro to disable the built-in platform entropy functions. +-#define POLARSSL_NO_PLATFORM_ENTROPY + */ ++#define POLARSSL_NO_PLATFORM_ENTROPY + + /** + * \def POLARSSL_PKCS1_V21 +@@ -426,8 +426,8 @@ + * Requires: POLARSSL_TIMING_C + * + * This module enables the HAVEGE random number generator. +- */ + #define POLARSSL_HAVEGE_C ++ */ + + /** + * \def POLARSSL_MD_C +@@ -490,7 +490,7 @@ + * + * This module provides TCP/IP networking routines. + */ +-#define POLARSSL_NET_C ++//#define POLARSSL_NET_C + + /** + * \def POLARSSL_PADLOCK_C +@@ -644,8 +644,8 @@ + * Caller: library/havege.c + * + * This module is used by the HAVEGE random number generator. +- */ + #define POLARSSL_TIMING_C ++ */ + + /** + * \def POLARSSL_VERSION_C +diff -Naur polarssl-1.1.4/library/bignum.c polarssl-x86_64/library/bignum.c +--- polarssl-1.1.4/library/bignum.c 2012-04-29 16:15:55.000000000 -0400 ++++ polarssl-x86_64/library/bignum.c 2012-10-30 17:21:52.135000999 -0400 +@@ -1101,7 +1101,7 @@ + Z.p[i - t - 1] = ~0; + else + { +-#if defined(POLARSSL_HAVE_LONGLONG) ++#if 0 //defined(POLARSSL_HAVE_LONGLONG) + t_udbl r; + + r = (t_udbl) X.p[i] << biL; diff -Nru xen-4.2.2/stubdom/tpmemu-0.7.4.patch xen-4.3.0/stubdom/tpmemu-0.7.4.patch --- xen-4.2.2/stubdom/tpmemu-0.7.4.patch 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/tpmemu-0.7.4.patch 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,12 @@ +diff -Naur tpm_emulator-x86_64-back/tpm/tpm_emulator_extern.c tpm_emulator-x86_64/tpm/tpm_emulator_extern.c +--- tpm_emulator-x86_64-back/tpm/tpm_emulator_extern.c 2012-04-27 10:55:46.581963398 -0400 ++++ tpm_emulator-x86_64/tpm/tpm_emulator_extern.c 2012-04-27 10:56:02.193034152 -0400 +@@ -249,7 +249,7 @@ + #else /* TPM_NO_EXTERN */ + + int (*tpm_extern_init)(void) = NULL; +-int (*tpm_extern_release)(void) = NULL; ++void (*tpm_extern_release)(void) = NULL; + void* (*tpm_malloc)(size_t size) = NULL; + void (*tpm_free)(/*const*/ void *ptr) = NULL; + void (*tpm_log)(int priority, const char *fmt, ...) = NULL; diff -Nru xen-4.2.2/stubdom/vtpm/Makefile xen-4.3.0/stubdom/vtpm/Makefile --- xen-4.2.2/stubdom/vtpm/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,34 @@ +# Copyright (c) 2010-2012 United States Government, as represented by +# the Secretary of Defense. All rights reserved. +# +# THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT +# ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES +# INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY +# DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE +# SOFTWARE. +# + +XEN_ROOT=../.. + +TARGET=vtpm.a +OBJS=vtpm.o vtpm_cmd.o vtpmblk.o vtpm_pcrs.o + + +CPPFLAGS+=-I../tpm_emulator-$(XEN_TARGET_ARCH)/build +CPPFLAGS+=-I../tpm_emulator-$(XEN_TARGET_ARCH)/tpm +CPPFLAGS+=-I../tpm_emulator-$(XEN_TARGET_ARCH)/crypto +CPPFLAGS+=-I../tpm_emulator-$(XEN_TARGET_ARCH) + +$(TARGET): $(OBJS) + ar -cr $@ $(OBJS) + +$(OBJS): vtpm_manager.h + +vtpm_manager.h: + ln -s ../vtpmmgr/vtpm_manager.h vtpm_manager.h + +clean: + rm -f $(TARGET) $(OBJS) vtpm_manager.h + +.PHONY: clean diff -Nru xen-4.2.2/stubdom/vtpm/README xen-4.3.0/stubdom/vtpm/README --- xen-4.2.2/stubdom/vtpm/README 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/README 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,75 @@ +Copyright (c) 2010-2012 United States Government, as represented by +the Secretary of Defense. All rights reserved. +November 12 2012 +Authors: Matthew Fioravante (JHUAPL), + +This document describes the operation and command line interface +of vtpm-stubdom. See docs/misc/vtpm.txt for details on the +vTPM subsystem as a whole. + + +------------------------------ +OPERATION +------------------------------ + +The vtpm-stubdom is a mini-OS domain that emulates a TPM for the guest OS to +use. It is a small wrapper around the Berlios TPM emulator +version 0.7.4. Commands are passed from the linux guest via the +mini-os TPM backend driver. vTPM data is encrypted and stored via a disk image +provided to the virtual machine. The key used to encrypt the data along +with a hash of the vTPM's data is sent to the vTPM manager for secure storage +and later retrieval. The vTPM domain communicates with the manager using a +mini-os tpm front/back device pair. + +------------------------------ +COMMAND LINE ARGUMENTS +------------------------------ + +Command line arguments are passed to the domain via the 'extra' +parameter in the VM config file. Each parameter is separated +by white space. For example: + +extra="foo=bar baz" + +List of Arguments: +------------------ + +loglevel=: Controls the amount of logging printed to the console. + The possible values for are: + error + info (default) + debug + +clear: Start the Berlios emulator in "clear" mode. (default) + +save: Start the Berlios emulator in "save" mode. + +deactivated: Start the Berlios emulator in "deactivated" mode. + See the Berlios TPM emulator documentation for details + about the startup mode. For all normal use, always use clear + which is the default. You should not need to specify any of these. + +maintcmds=<1|0>: Enable to disable the TPM maintenance commands. + These commands are used by tpm manufacturers and thus + open a security hole. They are disabled by default. + +hwinitpcr=: Initialize the virtual Platform Configuration Registers + (PCRs) with PCR values from the hardware TPM. Each pcr specified by + will be initialized with the value of that same PCR in TPM + once at startup. By default all PCRs are zero initialized. + Value values of are: + all: copy all pcrs + none: copy no pcrs (default) + : copy pcr n + : copy pcrs x to y (inclusive) + + These can also be combined by comma separation, for example: + hwinitpcrs=5,12-16 + will copy pcrs 5, 12, 13, 14, 15, and 16. + +------------------------------ +REFERENCES +------------------------------ + +Berlios TPM Emulator: +http://tpm-emulator.berlios.de/ diff -Nru xen-4.2.2/stubdom/vtpm/minios.cfg xen-4.3.0/stubdom/vtpm/minios.cfg --- xen-4.2.2/stubdom/vtpm/minios.cfg 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/minios.cfg 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,14 @@ +CONFIG_TPMFRONT=y +CONFIG_TPM_TIS=n +CONFIG_TPMBACK=y +CONFIG_START_NETWORK=n +CONFIG_TEST=n +CONFIG_PCIFRONT=n +CONFIG_BLKFRONT=y +CONFIG_NETFRONT=n +CONFIG_FBFRONT=n +CONFIG_KBDFRONT=n +CONFIG_CONSFRONT=n +CONFIG_XENBUS=y +CONFIG_LWIP=n +CONFIG_XC=n diff -Nru xen-4.2.2/stubdom/vtpm/vtpm.c xen-4.3.0/stubdom/vtpm/vtpm.c --- xen-4.2.2/stubdom/vtpm/vtpm.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/vtpm.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,466 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES + * INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY + * DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE + * SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "tpm/tpm_emulator_extern.h" +#include "tpm/tpm_marshalling.h" +#include "vtpm.h" +#include "vtpm_cmd.h" +#include "vtpm_pcrs.h" +#include "vtpmblk.h" + +#define TPM_LOG_INFO LOG_INFO +#define TPM_LOG_ERROR LOG_ERR +#define TPM_LOG_DEBUG LOG_DEBUG + +/* Global commandline options - default values */ +struct Opt_args opt_args = { + .startup = ST_CLEAR, + .loglevel = TPM_LOG_INFO, + .hwinitpcrs = VTPM_PCRNONE, + .tpmconf = 0, + .enable_maint_cmds = false, +}; + +static uint32_t badords[32]; +static unsigned int n_badords = 0; + +entropy_context entropy; +ctr_drbg_context ctr_drbg; + +struct tpmfront_dev* tpmfront_dev; + +void vtpm_get_extern_random_bytes(void *buf, size_t nbytes) +{ + ctr_drbg_random(&ctr_drbg, buf, nbytes); +} + +int vtpm_read_from_file(uint8_t **data, size_t *data_length) { + return read_vtpmblk(tpmfront_dev, data, data_length); +} + +int vtpm_write_to_file(uint8_t *data, size_t data_length) { + return write_vtpmblk(tpmfront_dev, data, data_length); +} + +int vtpm_extern_init_fake(void) { + return 0; +} + +void vtpm_extern_release_fake(void) { +} + + +void vtpm_log(int priority, const char *fmt, ...) +{ + if(opt_args.loglevel >= priority) { + va_list v; + va_start(v, fmt); + vprintf(fmt, v); + va_end(v); + } +} + +static uint64_t vtpm_get_ticks(void) +{ + static uint64_t old_t = 0; + uint64_t new_t, res_t; + struct timeval tv; + gettimeofday(&tv, NULL); + new_t = (uint64_t)tv.tv_sec * 1000000 + (uint64_t)tv.tv_usec; + res_t = (old_t > 0) ? new_t - old_t : 0; + old_t = new_t; + return res_t; +} + + +static int tpm_entropy_source(void* dummy, unsigned char* data, size_t len, size_t* olen) { + UINT32 sz = len; + TPM_RESULT rc = VTPM_GetRandom(tpmfront_dev, data, &sz); + *olen = sz; + return rc == TPM_SUCCESS ? 0 : POLARSSL_ERR_ENTROPY_SOURCE_FAILED; +} + +int init_random(void) { + /* Initialize the rng */ + entropy_init(&entropy); + entropy_add_source(&entropy, tpm_entropy_source, NULL, 0); + entropy_gather(&entropy); + ctr_drbg_init(&ctr_drbg, entropy_func, &entropy, NULL, 0); + ctr_drbg_set_prediction_resistance( &ctr_drbg, CTR_DRBG_PR_OFF ); + + return 0; +} + +int check_ordinal(tpmcmd_t* tpmcmd) { + TPM_COMMAND_CODE ord; + UINT32 len = 4; + BYTE* ptr; + unsigned int i; + + if(tpmcmd->req_len < 10) { + return true; + } + + ptr = tpmcmd->req + 6; + tpm_unmarshal_UINT32(&ptr, &len, &ord); + + for(i = 0; i < n_badords; ++i) { + if(ord == badords[i]) { + error("Disabled command ordinal (%" PRIu32") requested!\n"); + return false; + } + } + return true; +} + +struct locality_item { + char* lbl; + uint8_t mask[32]; +}; +#define MAX_CLIENT_LOCALITIES 16 +static struct locality_item client_locality[MAX_CLIENT_LOCALITIES]; +static int nr_client_localities = 0; + +static void *generate_locality_mask(domid_t domid, unsigned int handle) +{ + char label[512]; + int i; + if (tpmback_get_peercontext(domid, handle, label, sizeof(label))) + BUG(); + for(i=0; i < nr_client_localities; i++) { + if (!strcmp(client_locality[i].lbl, label)) + goto found; + if (client_locality[i].lbl[0] == '*') { + char * f = strstr(label, 1 + client_locality[i].lbl); + if (!strcmp(f, 1 + client_locality[i].lbl)) + goto found; + } + } + return NULL; + found: + tpmback_set_opaque(domid, handle, client_locality[i].mask); + return client_locality[i].mask; +} + +static void main_loop(void) { + tpmcmd_t* tpmcmd = NULL; + int res = -1; + + info("VTPM Initializing\n"); + + /* Set required tpm config args */ + opt_args.tpmconf |= TPM_CONF_STRONG_PERSISTENCE; + opt_args.tpmconf &= ~TPM_CONF_USE_INTERNAL_PRNG; + opt_args.tpmconf |= TPM_CONF_GENERATE_EK; + opt_args.tpmconf |= TPM_CONF_GENERATE_SEED_DAA; + + /* Initialize the emulator */ + tpm_emulator_init(opt_args.startup, opt_args.tpmconf); + + /* Initialize any requested PCRs with hardware TPM values */ + if(vtpm_initialize_hw_pcrs(tpmfront_dev, opt_args.hwinitpcrs) != TPM_SUCCESS) { + error("Failed to initialize PCRs with hardware TPM values"); + goto abort_postpcrs; + } + + tpmcmd = tpmback_req_any(); + while(tpmcmd) { + /* Handle the request */ + if(tpmcmd->req_len) { + uint8_t* locality_mask = tpmcmd->opaque; + uint8_t locality_bit = (1 << (tpmcmd->locality & 7)); + int locality_byte = tpmcmd->locality >> 3; + tpmcmd->resp = NULL; + tpmcmd->resp_len = 0; + + if (nr_client_localities && !locality_mask) + locality_mask = generate_locality_mask(tpmcmd->domid, tpmcmd->handle); + if (nr_client_localities && !locality_mask) { + error("Unknown client label in tpm_handle_command"); + create_error_response(tpmcmd, TPM_FAIL); + } + else if (nr_client_localities && !(locality_mask[locality_byte] & locality_bit)) { + error("Invalid locality (%d) for client in tpm_handle_command", tpmcmd->locality); + create_error_response(tpmcmd, TPM_FAIL); + } + /* Check for disabled ordinals */ + else if(!check_ordinal(tpmcmd)) { + create_error_response(tpmcmd, TPM_BAD_ORDINAL); + } + /* If not disabled, do the command */ + else { + if((res = tpm_handle_command(tpmcmd->req, tpmcmd->req_len, &tpmcmd->resp, &tpmcmd->resp_len, tpmcmd->locality)) != 0) { + error("tpm_handle_command() failed"); + create_error_response(tpmcmd, TPM_FAIL); + } + } + } + + /* Send the response */ + tpmback_resp(tpmcmd); + + /* Wait for the next request */ + tpmcmd = tpmback_req_any(); + + } + +abort_postpcrs: + info("VTPM Shutting down\n"); + + tpm_emulator_shutdown(); +} + +int parse_cmd_line(int argc, char** argv) +{ + char sval[25]; + char* logstr = NULL; + /* Parse the command strings */ + for(unsigned int i = 1; i < argc; ++i) { + if (sscanf(argv[i], "loglevel=%25s", sval) == 1){ + if (!strcmp(sval, "debug")) { + opt_args.loglevel = TPM_LOG_DEBUG; + logstr = "debug"; + } + else if (!strcmp(sval, "info")) { + logstr = "info"; + opt_args.loglevel = TPM_LOG_INFO; + } + else if (!strcmp(sval, "error")) { + logstr = "error"; + opt_args.loglevel = TPM_LOG_ERROR; + } + } + else if (!strcmp(argv[i], "clear")) { + opt_args.startup = ST_CLEAR; + } + else if (!strcmp(argv[i], "save")) { + opt_args.startup = ST_SAVE; + } + else if (!strcmp(argv[i], "deactivated")) { + opt_args.startup = ST_DEACTIVATED; + } + else if (!strncmp(argv[i], "maintcmds=", 10)) { + if(!strcmp(argv[i] + 10, "1")) { + opt_args.enable_maint_cmds = true; + } else if(!strcmp(argv[i] + 10, "0")) { + opt_args.enable_maint_cmds = false; + } + } + else if(!strncmp(argv[i], "hwinitpcr=", 10)) { + char *pch = argv[i] + 10; + unsigned int v1, v2; + pch = strtok(pch, ","); + while(pch != NULL) { + if(!strcmp(pch, "all")) { + //Set all + opt_args.hwinitpcrs = VTPM_PCRALL; + } else if(!strcmp(pch, "none")) { + //Set none + opt_args.hwinitpcrs = VTPM_PCRNONE; + } else if(sscanf(pch, "%u", &v1) == 1) { + //Set one + if(v1 >= TPM_NUM_PCR) { + error("hwinitpcr error: Invalid PCR index %u", v1); + return -1; + } + opt_args.hwinitpcrs |= (1 << v1); + } else if(sscanf(pch, "%u-%u", &v1, &v2) == 2) { + //Set range + if(v1 >= TPM_NUM_PCR) { + error("hwinitpcr error: Invalid PCR index %u", v1); + return -1; + } + if(v2 >= TPM_NUM_PCR) { + error("hwinitpcr error: Invalid PCR index %u", v1); + return -1; + } + if(v2 < v1) { + unsigned tp = v1; + v1 = v2; + v2 = tp; + } + for(unsigned int i = v1; i <= v2; ++i) { + opt_args.hwinitpcrs |= (1 << i); + } + } else { + error("hwintipcr error: Invalid PCR specification : %s", pch); + return -1; + } + pch = strtok(NULL, ","); + } + } + else if(!strncmp(argv[i], "locality=", 9)) { + char *lbl = argv[i] + 9; + char *pch = strchr(lbl, '='); + uint8_t* locality_mask = client_locality[nr_client_localities].mask; + if (pch == NULL) { + error("Invalid locality specification: %s", lbl); + return -1; + } + if (nr_client_localities == MAX_CLIENT_LOCALITIES) { + error("Too many locality specifications"); + return -1; + } + client_locality[nr_client_localities].lbl = lbl; + memset(locality_mask, 0, 32); + nr_client_localities++; + *pch = 0; + pch = strtok(pch + 1, ","); + while (pch != NULL) { + unsigned int loc; + if (sscanf(pch, "%u", &loc) == 1 && loc < 256) { + uint8_t locality_bit = (1 << (loc & 7)); + int locality_byte = loc >> 3; + locality_mask[locality_byte] |= locality_bit; + } else { + error("Invalid locality item: %s", pch); + return -1; + } + pch = strtok(NULL, ","); + } + } + else { + error("Invalid command line option `%s'", argv[i]); + } + + } + + /* Check Errors and print results */ + switch(opt_args.startup) { + case ST_CLEAR: + info("Startup mode is `clear'"); + break; + case ST_SAVE: + info("Startup mode is `save'"); + break; + case ST_DEACTIVATED: + info("Startup mode is `deactivated'"); + break; + default: + error("Invalid startup mode %d", opt_args.startup); + return -1; + } + + if(opt_args.hwinitpcrs & (VTPM_PCRALL)) + { + char pcrstr[1024]; + char* ptr = pcrstr; + + pcrstr[0] = '\0'; + info("The following PCRs will be initialized with values from the hardware TPM:"); + for(unsigned int i = 0; i < TPM_NUM_PCR; ++i) { + if(opt_args.hwinitpcrs & (1 << i)) { + ptr += sprintf(ptr, "%u, ", i); + } + } + /* get rid of the last comma if any numbers were printed */ + *(ptr -2) = '\0'; + + info("\t%s", pcrstr); + } else { + info("All PCRs initialized to default values"); + } + + if(!opt_args.enable_maint_cmds) { + info("TPM Maintenance Commands disabled"); + badords[n_badords++] = TPM_ORD_CreateMaintenanceArchive; + badords[n_badords++] = TPM_ORD_LoadMaintenanceArchive; + badords[n_badords++] = TPM_ORD_KillMaintenanceFeature; + badords[n_badords++] = TPM_ORD_LoadManuMaintPub; + badords[n_badords++] = TPM_ORD_ReadManuMaintPub; + } else { + info("TPM Maintenance Commands enabled"); + } + + info("Log level set to %s", logstr); + + return 0; +} + +void cleanup_opt_args(void) { +} + +int main(int argc, char **argv) +{ + //FIXME: initializing blkfront without this sleep causes the domain to crash on boot + sleep(2); + + /* Setup extern function pointers */ + tpm_extern_init = vtpm_extern_init_fake; + tpm_extern_release = vtpm_extern_release_fake; + tpm_malloc = malloc; + tpm_free = free; + tpm_log = vtpm_log; + tpm_get_ticks = vtpm_get_ticks; + tpm_get_extern_random_bytes = vtpm_get_extern_random_bytes; + tpm_write_to_storage = vtpm_write_to_file; + tpm_read_from_storage = vtpm_read_from_file; + + info("starting TPM Emulator (1.2.%d.%d-%d)", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD); + if(parse_cmd_line(argc, argv)) { + error("Error parsing commandline\n"); + return -1; + } + + /* Initialize devices */ + init_tpmback(NULL, NULL); + if((tpmfront_dev = init_tpmfront(NULL)) == NULL) { + error("Unable to initialize tpmfront device"); + goto abort_posttpmfront; + } + + /* Seed the RNG with entropy from hardware TPM */ + if(init_random()) { + error("Unable to initialize RNG"); + goto abort_postrng; + } + + /* Initialize blkfront device */ + if(init_vtpmblk(tpmfront_dev)) { + error("Unable to initialize Blkfront persistent storage"); + goto abort_postvtpmblk; + } + + /* Run main loop */ + main_loop(); + + /* Shutdown blkfront */ + shutdown_vtpmblk(); +abort_postvtpmblk: +abort_postrng: + + /* Close devices */ + shutdown_tpmfront(tpmfront_dev); +abort_posttpmfront: + shutdown_tpmback(); + + cleanup_opt_args(); + + return 0; +} diff -Nru xen-4.2.2/stubdom/vtpm/vtpm.h xen-4.3.0/stubdom/vtpm/vtpm.h --- xen-4.2.2/stubdom/vtpm/vtpm.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/vtpm.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES + * INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY + * DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE + * SOFTWARE. + */ + +#ifndef VTPM_H +#define VTPM_H + +#include + +/* For testing */ +#define VERS_CMD "\x00\xC1\x00\x00\x00\x16\x00\x00\x00\x65\x00\x00\x00\x05\x00\x00\x00\x04\x00\x00\x01\x03" +#define VERS_CMD_LEN 22 + +/* Global commandline options */ +struct Opt_args { + enum StartUp { + ST_CLEAR = 1, + ST_SAVE = 2, + ST_DEACTIVATED = 3 + } startup; + unsigned long hwinitpcrs; + int loglevel; + uint32_t tpmconf; + bool enable_maint_cmds; +}; +extern struct Opt_args opt_args; + +#endif diff -Nru xen-4.2.2/stubdom/vtpm/vtpm_cmd.c xen-4.3.0/stubdom/vtpm/vtpm_cmd.c --- xen-4.2.2/stubdom/vtpm/vtpm_cmd.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/vtpm_cmd.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,256 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES + * INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY + * DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE + * SOFTWARE. + */ + +#include +#include +#include +#include +#include "tpm/tpm_marshalling.h" +#include "vtpm_manager.h" +#include "vtpm_cmd.h" +#include + +#define TRYFAILGOTO(C) \ + if((C)) { \ + status = TPM_FAIL; \ + goto abort_egress; \ + } +#define TRYFAILGOTOMSG(C, msg) \ + if((C)) { \ + status = TPM_FAIL; \ + error(msg); \ + goto abort_egress; \ + } +#define CHECKSTATUSGOTO(ret, fname) \ + if((ret) != TPM_SUCCESS) { \ + error("%s failed with error code (%lu)", fname, (unsigned long) ret); \ + status = ord; \ + goto abort_egress; \ + } + +#define ERR_MALFORMED "Malformed response from backend" +#define ERR_TPMFRONT "Error sending command through frontend device" + +struct shpage { + void* page; + grant_ref_t grantref; +}; + +typedef struct shpage shpage_t; + +static inline int pack_header(uint8_t** bptr, UINT32* len, TPM_TAG tag, UINT32 size, TPM_COMMAND_CODE ord) +{ + return *bptr == NULL || + tpm_marshal_UINT16(bptr, len, tag) || + tpm_marshal_UINT32(bptr, len, size) || + tpm_marshal_UINT32(bptr, len, ord); +} + +static inline int unpack_header(uint8_t** bptr, UINT32* len, TPM_TAG* tag, UINT32* size, TPM_COMMAND_CODE* ord) +{ + return *bptr == NULL || + tpm_unmarshal_UINT16(bptr, len, tag) || + tpm_unmarshal_UINT32(bptr, len, size) || + tpm_unmarshal_UINT32(bptr, len, ord); +} + +int create_error_response(tpmcmd_t* tpmcmd, TPM_RESULT errorcode) +{ + TPM_TAG tag; + UINT32 len = tpmcmd->req_len; + uint8_t* respptr; + uint8_t* cmdptr = tpmcmd->req; + + if(!tpm_unmarshal_UINT16(&cmdptr, &len, &tag)) { + switch (tag) { + case TPM_TAG_RQU_COMMAND: + tag = TPM_TAG_RSP_COMMAND; + break; + case TPM_TAG_RQU_AUTH1_COMMAND: + tag = TPM_TAG_RQU_AUTH2_COMMAND; + break; + case TPM_TAG_RQU_AUTH2_COMMAND: + tag = TPM_TAG_RQU_AUTH2_COMMAND; + break; + } + } else { + tag = TPM_TAG_RSP_COMMAND; + } + + tpmcmd->resp_len = len = 10; + tpmcmd->resp = respptr = tpm_malloc(tpmcmd->resp_len); + + return pack_header(&respptr, &len, tag, len, errorcode); +} + +TPM_RESULT VTPM_GetRandom(struct tpmfront_dev* tpmfront_dev, BYTE* bytes, UINT32 *numbytes) { + TPM_RESULT status = TPM_SUCCESS; + uint8_t* cmdbuf, *resp, *bptr; + size_t resplen = 0; + UINT32 len; + + /*Ask the real tpm for random bytes for the seed */ + TPM_TAG tag = TPM_TAG_RQU_COMMAND; + UINT32 size; + TPM_COMMAND_CODE ord = TPM_ORD_GetRandom; + len = size = sizeof(TPM_TAG) + sizeof(UINT32) + sizeof(TPM_COMMAND_CODE) + sizeof(UINT32); + + /*Create the raw tpm command */ + bptr = cmdbuf = malloc(size); + TRYFAILGOTO(pack_header(&bptr, &len, tag, size, ord)); + TRYFAILGOTO(tpm_marshal_UINT32(&bptr, &len, *numbytes)); + + /* Send cmd, wait for response */ + TRYFAILGOTOMSG(tpmfront_cmd(tpmfront_dev, cmdbuf, size, &resp, &resplen), + ERR_TPMFRONT); + + bptr = resp; len = resplen; + TRYFAILGOTOMSG(unpack_header(&bptr, &len, &tag, &size, &ord), ERR_MALFORMED); + + //Check return status of command + CHECKSTATUSGOTO(ord, "TPM_GetRandom()"); + + // Get the number of random bytes in the response + TRYFAILGOTOMSG(tpm_unmarshal_UINT32(&bptr, &len, &size), ERR_MALFORMED); + *numbytes = size; + + //Get the random bytes out, tpm may give us less bytes than what we wanrt + TRYFAILGOTOMSG(tpm_unmarshal_BYTE_ARRAY(&bptr, &len, bytes, *numbytes), ERR_MALFORMED); + + goto egress; +abort_egress: +egress: + free(cmdbuf); + return status; + +} + +TPM_RESULT VTPM_LoadHashKey(struct tpmfront_dev* tpmfront_dev, uint8_t** data, size_t* data_length) +{ + TPM_RESULT status = TPM_SUCCESS; + uint8_t* bptr, *resp; + uint8_t* cmdbuf = NULL; + size_t resplen = 0; + UINT32 len; + + TPM_TAG tag = VTPM_TAG_REQ; + UINT32 size; + TPM_COMMAND_CODE ord = VTPM_ORD_LOADHASHKEY; + + /*Create the command*/ + len = size = VTPM_COMMAND_HEADER_SIZE; + bptr = cmdbuf = malloc(size); + TRYFAILGOTO(pack_header(&bptr, &len, tag, size, ord)); + + /* Send the command to vtpm_manager */ + info("Requesting Encryption key from backend"); + TRYFAILGOTOMSG(tpmfront_cmd(tpmfront_dev, cmdbuf, size, &resp, &resplen), ERR_TPMFRONT); + + /* Unpack response header */ + bptr = resp; + len = resplen; + TRYFAILGOTOMSG(unpack_header(&bptr, &len, &tag, &size, &ord), ERR_MALFORMED); + + /* Check return code */ + CHECKSTATUSGOTO(ord, "VTPM_LoadHashKey()"); + + /* Get the size of the key */ + *data_length = size - VTPM_COMMAND_HEADER_SIZE; + + /* Copy the key bits */ + *data = malloc(*data_length); + memcpy(*data, bptr, *data_length); + + goto egress; +abort_egress: + error("VTPM_LoadHashKey failed"); +egress: + free(cmdbuf); + return status; +} + +TPM_RESULT VTPM_SaveHashKey(struct tpmfront_dev* tpmfront_dev, uint8_t* data, size_t data_length) +{ + TPM_RESULT status = TPM_SUCCESS; + uint8_t* bptr, *resp; + uint8_t* cmdbuf = NULL; + size_t resplen = 0; + UINT32 len; + + TPM_TAG tag = VTPM_TAG_REQ; + UINT32 size; + TPM_COMMAND_CODE ord = VTPM_ORD_SAVEHASHKEY; + + /*Create the command*/ + len = size = VTPM_COMMAND_HEADER_SIZE + data_length; + bptr = cmdbuf = malloc(size); + TRYFAILGOTO(pack_header(&bptr, &len, tag, size, ord)); + memcpy(bptr, data, data_length); + bptr += data_length; + + /* Send the command to vtpm_manager */ + info("Sending encryption key to backend"); + TRYFAILGOTOMSG(tpmfront_cmd(tpmfront_dev, cmdbuf, size, &resp, &resplen), ERR_TPMFRONT); + + /* Unpack response header */ + bptr = resp; + len = resplen; + TRYFAILGOTOMSG(unpack_header(&bptr, &len, &tag, &size, &ord), ERR_MALFORMED); + + /* Check return code */ + CHECKSTATUSGOTO(ord, "VTPM_SaveHashKey()"); + + goto egress; +abort_egress: + error("VTPM_SaveHashKey failed"); +egress: + free(cmdbuf); + return status; +} + +TPM_RESULT VTPM_PCRRead(struct tpmfront_dev* tpmfront_dev, UINT32 pcrIndex, BYTE* outDigest) +{ + TPM_RESULT status = TPM_SUCCESS; + uint8_t *cmdbuf, *resp, *bptr; + size_t resplen = 0; + UINT32 len; + + /*Just send a TPM_PCRRead Command to the HW tpm */ + TPM_TAG tag = TPM_TAG_RQU_COMMAND; + UINT32 size; + TPM_COMMAND_CODE ord = TPM_ORD_PCRRead; + len = size = sizeof(TPM_TAG) + sizeof(UINT32) + sizeof(TPM_COMMAND_CODE) + sizeof(UINT32); + + /*Create the raw tpm cmd */ + bptr = cmdbuf = malloc(size); + TRYFAILGOTO(pack_header(&bptr, &len, tag, size, ord)); + TRYFAILGOTO(tpm_marshal_UINT32(&bptr, &len, pcrIndex)); + + /*Send Cmd wait for response */ + TRYFAILGOTOMSG(tpmfront_cmd(tpmfront_dev, cmdbuf, size, &resp, &resplen), ERR_TPMFRONT); + + bptr = resp; len = resplen; + TRYFAILGOTOMSG(unpack_header(&bptr, &len, &tag, &size, &ord), ERR_MALFORMED); + + //Check return status of command + CHECKSTATUSGOTO(ord, "TPM_PCRRead"); + + //Get the ptr value + memcpy(outDigest, bptr, sizeof(TPM_PCRVALUE)); + + goto egress; +abort_egress: +egress: + free(cmdbuf); + return status; + +} diff -Nru xen-4.2.2/stubdom/vtpm/vtpm_cmd.h xen-4.3.0/stubdom/vtpm/vtpm_cmd.h --- xen-4.2.2/stubdom/vtpm/vtpm_cmd.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/vtpm_cmd.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES + * INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY + * DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE + * SOFTWARE. + */ + +#ifndef MANAGER_H +#define MANAGER_H + +#include +#include +#include "tpm/tpm_structures.h" + +/* Create a command response error header */ +int create_error_response(tpmcmd_t* tpmcmd, TPM_RESULT errorcode); +/* Request random bytes from hardware tpm, returns 0 on success */ +TPM_RESULT VTPM_GetRandom(struct tpmfront_dev* tpmfront_dev, BYTE* bytes, UINT32* numbytes); +/* Retreive 256 bit AES encryption key from manager */ +TPM_RESULT VTPM_LoadHashKey(struct tpmfront_dev* tpmfront_dev, uint8_t** data, size_t* data_length); +/* Manager securely saves our 256 bit AES encryption key */ +TPM_RESULT VTPM_SaveHashKey(struct tpmfront_dev* tpmfront_dev, uint8_t* data, size_t data_length); +/* Send a TPM_PCRRead command passthrough the manager to the hw tpm */ +TPM_RESULT VTPM_PCRRead(struct tpmfront_dev* tpmfront_dev, UINT32 pcrIndex, BYTE* outDigest); + +#endif diff -Nru xen-4.2.2/stubdom/vtpm/vtpm_pcrs.c xen-4.3.0/stubdom/vtpm/vtpm_pcrs.c --- xen-4.2.2/stubdom/vtpm/vtpm_pcrs.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/vtpm_pcrs.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES + * INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY + * DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE + * SOFTWARE. + */ + +#include "vtpm_pcrs.h" +#include "vtpm_cmd.h" +#include "tpm/tpm_data.h" + +#define PCR_VALUE tpmData.permanent.data.pcrValue + +static int write_pcr_direct(unsigned int pcrIndex, uint8_t* val) { + if(pcrIndex > TPM_NUM_PCR) { + return TPM_BADINDEX; + } + memcpy(&PCR_VALUE[pcrIndex], val, sizeof(TPM_PCRVALUE)); + return TPM_SUCCESS; +} + +TPM_RESULT vtpm_initialize_hw_pcrs(struct tpmfront_dev* tpmfront_dev, unsigned long pcrs) +{ + TPM_RESULT rc = TPM_SUCCESS; + uint8_t digest[sizeof(TPM_PCRVALUE)]; + + for(unsigned int i = 0; i < TPM_NUM_PCR; ++i) { + if(pcrs & 1 << i) { + if((rc = VTPM_PCRRead(tpmfront_dev, i, digest)) != TPM_SUCCESS) { + error("TPM_PCRRead failed with error : %d", rc); + return rc; + } + write_pcr_direct(i, digest); + } + } + + return rc; +} diff -Nru xen-4.2.2/stubdom/vtpm/vtpm_pcrs.h xen-4.3.0/stubdom/vtpm/vtpm_pcrs.h --- xen-4.2.2/stubdom/vtpm/vtpm_pcrs.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/vtpm_pcrs.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES + * INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY + * DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE + * SOFTWARE. + */ + +#ifndef VTPM_PCRS_H +#define VTPM_PCRS_H + +#include "tpm/tpm_structures.h" + +#define VTPM_PCR0 1 +#define VTPM_PCR1 1 << 1 +#define VTPM_PCR2 1 << 2 +#define VTPM_PCR3 1 << 3 +#define VTPM_PCR4 1 << 4 +#define VTPM_PCR5 1 << 5 +#define VTPM_PCR6 1 << 6 +#define VTPM_PCR7 1 << 7 +#define VTPM_PCR8 1 << 8 +#define VTPM_PCR9 1 << 9 +#define VTPM_PCR10 1 << 10 +#define VTPM_PCR11 1 << 11 +#define VTPM_PCR12 1 << 12 +#define VTPM_PCR13 1 << 13 +#define VTPM_PCR14 1 << 14 +#define VTPM_PCR15 1 << 15 +#define VTPM_PCR16 1 << 16 +#define VTPM_PCR17 1 << 17 +#define VTPM_PCR18 1 << 18 +#define VTPM_PCR19 1 << 19 +#define VTPM_PCR20 1 << 20 +#define VTPM_PCR21 1 << 21 +#define VTPM_PCR22 1 << 22 +#define VTPM_PCR23 1 << 23 + +#define VTPM_PCRALL (1 << TPM_NUM_PCR) - 1 +#define VTPM_PCRNONE 0 + +#define VTPM_NUMPCRS 24 + +struct tpmfront_dev; + +TPM_RESULT vtpm_initialize_hw_pcrs(struct tpmfront_dev* tpmfront_dev, unsigned long pcrs); + + +#endif diff -Nru xen-4.2.2/stubdom/vtpm/vtpmblk.c xen-4.3.0/stubdom/vtpm/vtpmblk.c --- xen-4.2.2/stubdom/vtpm/vtpmblk.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/vtpmblk.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,353 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES + * INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY + * DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE + * SOFTWARE. + */ + +#include +#include "vtpmblk.h" +#include "tpm/tpm_marshalling.h" +#include "vtpm_cmd.h" +#include "polarssl/aes.h" +#include "polarssl/sha1.h" +#include +#include +#include +#include + +/*Encryption key and block sizes */ +#define BLKSZ 16 + +static struct blkfront_dev* blkdev = NULL; +static int blkfront_fd = -1; +static uint64_t slot_size = 0; + +int init_vtpmblk(struct tpmfront_dev* tpmfront_dev) +{ + struct blkfront_info blkinfo; + info("Initializing persistent NVM storage\n"); + + if((blkdev = init_blkfront(NULL, &blkinfo)) == NULL) { + error("BLKIO: ERROR Unable to initialize blkfront"); + return -1; + } + if (blkinfo.info & VDISK_READONLY || blkinfo.mode != O_RDWR) { + error("BLKIO: ERROR block device is read only!"); + goto error; + } + if((blkfront_fd = blkfront_open(blkdev)) == -1) { + error("Unable to open blkfront file descriptor!"); + goto error; + } + + slot_size = blkinfo.sectors * blkinfo.sector_size / 2; + + return 0; +error: + shutdown_blkfront(blkdev); + blkdev = NULL; + return -1; +} + +void shutdown_vtpmblk(void) +{ + close(blkfront_fd); + blkfront_fd = -1; + blkdev = NULL; +} + +static int write_vtpmblk_raw(uint8_t *data, size_t data_length, int slot) +{ + int rc; + uint32_t lenbuf; + debug("Begin Write data=%p len=%u slot=%u ssize=%u", data, data_length, slot, slot_size); + + if (data_length > slot_size - 4) { + error("vtpm data cannot fit in data slot (%d/%d).", data_length, slot_size - 4); + return -1; + } + + lenbuf = cpu_to_be32((uint32_t)data_length); + + lseek(blkfront_fd, slot * slot_size, SEEK_SET); + if((rc = write(blkfront_fd, (uint8_t*)&lenbuf, 4)) != 4) { + error("write(length) failed! error was %s", strerror(errno)); + return -1; + } + if((rc = write(blkfront_fd, data, data_length)) != data_length) { + error("write(data) failed! error was %s", strerror(errno)); + return -1; + } + + info("Wrote %u bytes to NVM persistent storage", data_length); + + return 0; +} + +static int read_vtpmblk_raw(uint8_t **data, size_t *data_length, int slot) +{ + int rc; + uint32_t lenbuf; + + lseek(blkfront_fd, slot * slot_size, SEEK_SET); + if(( rc = read(blkfront_fd, (uint8_t*)&lenbuf, 4)) != 4) { + error("read(length) failed! error was %s", strerror(errno)); + return -1; + } + *data_length = (size_t) cpu_to_be32(lenbuf); + if(*data_length == 0) { + error("read 0 data_length for NVM"); + return -1; + } + if(*data_length > slot_size - 4) { + error("read invalid data_length for NVM"); + return -1; + } + + *data = tpm_malloc(*data_length); + if((rc = read(blkfront_fd, *data, *data_length)) != *data_length) { + error("read(data) failed! error was %s", strerror(errno)); + return -1; + } + + info("Read %u bytes from NVM persistent storage (slot %d)", *data_length, slot); + return 0; +} + +int encrypt_vtpmblk(uint8_t* clear, size_t clear_len, uint8_t** cipher, size_t* cipher_len, uint8_t* symkey) +{ + int rc = 0; + uint8_t iv[BLKSZ]; + aes_context aes_ctx; + UINT32 temp; + int mod; + + uint8_t* clbuf = NULL; + + uint8_t* ivptr; + int ivlen; + + uint8_t* cptr; //Cipher block pointer + int clen; //Cipher block length + + /*Create a new 256 bit encryption key */ + if(symkey == NULL) { + rc = -1; + goto abort_egress; + } + tpm_get_extern_random_bytes(symkey, NVMKEYSZ); + + /*Setup initialization vector - random bits and then 4 bytes clear text size at the end*/ + temp = sizeof(UINT32); + ivlen = BLKSZ - temp; + tpm_get_extern_random_bytes(iv, ivlen); + ivptr = iv + ivlen; + tpm_marshal_UINT32(&ivptr, &temp, (UINT32) clear_len); + + /*The clear text needs to be padded out to a multiple of BLKSZ */ + mod = clear_len % BLKSZ; + clen = mod ? clear_len + BLKSZ - mod : clear_len; + clbuf = malloc(clen); + if (clbuf == NULL) { + rc = -1; + goto abort_egress; + } + memcpy(clbuf, clear, clear_len); + /* zero out the padding bits - FIXME: better / more secure way to handle these? */ + if(clen - clear_len) { + memset(clbuf + clear_len, 0, clen - clear_len); + } + + /* Setup the ciphertext buffer */ + *cipher_len = BLKSZ + clen; /*iv + ciphertext */ + cptr = *cipher = malloc(*cipher_len); + if (*cipher == NULL) { + rc = -1; + goto abort_egress; + } + + /* Copy the IV to cipher text blob*/ + memcpy(cptr, iv, BLKSZ); + cptr += BLKSZ; + + /* Setup encryption */ + aes_setkey_enc(&aes_ctx, symkey, 256); + + /* Do encryption now */ + aes_crypt_cbc(&aes_ctx, AES_ENCRYPT, clen, iv, clbuf, cptr); + + goto egress; +abort_egress: +egress: + free(clbuf); + return rc; +} +int decrypt_vtpmblk(uint8_t* cipher, size_t cipher_len, uint8_t** clear, size_t* clear_len, uint8_t* symkey) +{ + int rc = 0; + uint8_t iv[BLKSZ]; + uint8_t* ivptr; + UINT32 u32, temp; + aes_context aes_ctx; + + uint8_t* cptr = cipher; //cipher block pointer + int clen = cipher_len; //cipher block length + + /* Pull out the initialization vector */ + memcpy(iv, cipher, BLKSZ); + cptr += BLKSZ; + clen -= BLKSZ; + + /* Setup the clear text buffer */ + if((*clear = malloc(clen)) == NULL) { + rc = -1; + goto abort_egress; + } + + /* Get the length of clear text from last 4 bytes of iv */ + temp = sizeof(UINT32); + ivptr = iv + BLKSZ - temp; + tpm_unmarshal_UINT32(&ivptr, &temp, &u32); + *clear_len = u32; + + /* Setup decryption */ + aes_setkey_dec(&aes_ctx, symkey, 256); + + /* Do decryption now */ + if ((clen % BLKSZ) != 0) { + error("Decryption Error: Cipher block size was not a multiple of %u", BLKSZ); + rc = -1; + goto abort_egress; + } + aes_crypt_cbc(&aes_ctx, AES_DECRYPT, clen, iv, cptr, *clear); + + goto egress; +abort_egress: +egress: + return rc; +} + +/* Current active state slot, or -1 if no valid saved state exists */ +static int active_slot = -1; + +int write_vtpmblk(struct tpmfront_dev* tpmfront_dev, uint8_t* data, size_t data_length) { + int rc; + uint8_t* cipher = NULL; + size_t cipher_len = 0; + uint8_t hashkey[HASHKEYSZ]; + uint8_t* symkey = hashkey + HASHSZ; + + /* Switch to the other slot. Note that in a new vTPM, the read will not + * succeed, so active_slot will be -1 and we will write to slot 0. + */ + active_slot = !active_slot; + + /* Encrypt the data */ + if((rc = encrypt_vtpmblk(data, data_length, &cipher, &cipher_len, symkey))) { + goto abort_egress; + } + /* Write to disk */ + if((rc = write_vtpmblk_raw(cipher, cipher_len, active_slot))) { + goto abort_egress; + } + /* Get sha1 hash of data */ + sha1(cipher, cipher_len, hashkey); + + /* Send hash and key to manager */ + if((rc = VTPM_SaveHashKey(tpmfront_dev, hashkey, HASHKEYSZ)) != TPM_SUCCESS) { + goto abort_egress; + } + goto egress; +abort_egress: +egress: + free(cipher); + return rc; +} + +int read_vtpmblk(struct tpmfront_dev* tpmfront_dev, uint8_t** data, size_t *data_length) { + int rc; + uint8_t* cipher = NULL; + size_t cipher_len = 0; + size_t keysize; + uint8_t* hashkey = NULL; + uint8_t hash0[HASHSZ]; + uint8_t hash1[HASHSZ]; + uint8_t* symkey; + + /* Retreive the hash and the key from the manager */ + if((rc = VTPM_LoadHashKey(tpmfront_dev, &hashkey, &keysize)) != TPM_SUCCESS) { + goto abort_egress; + } + if(keysize != HASHKEYSZ) { + error("Manager returned a hashkey of invalid size! expected %d, actual %d", NVMKEYSZ, keysize); + rc = -1; + goto abort_egress; + } + symkey = hashkey + HASHSZ; + + active_slot = 0; + debug("Reading slot 0 from disk\n"); + if((rc = read_vtpmblk_raw(&cipher, &cipher_len, 0))) { + goto abort_egress; + } + + /* Compute the hash of the cipher text and compare */ + sha1(cipher, cipher_len, hash0); + if(!memcmp(hash0, hashkey, HASHSZ)) + goto valid; + + free(cipher); + cipher = NULL; + + active_slot = 1; + debug("Reading slot 1 from disk (offset=%u)\n", slot_size); + if((rc = read_vtpmblk_raw(&cipher, &cipher_len, 1))) { + goto abort_egress; + } + + /* Compute the hash of the cipher text and compare */ + sha1(cipher, cipher_len, hash1); + if(!memcmp(hash1, hashkey, HASHSZ)) + goto valid; + + { + int i; + error("NVM Storage Checksum failed!"); + printf("Expected: "); + for(i = 0; i < HASHSZ; ++i) { + printf("%02hhX ", hashkey[i]); + } + printf("\n"); + printf("Slot 0: "); + for(i = 0; i < HASHSZ; ++i) { + printf("%02hhX ", hash0[i]); + } + printf("\n"); + printf("Slot 1: "); + for(i = 0; i < HASHSZ; ++i) { + printf("%02hhX ", hash1[i]); + } + printf("\n"); + rc = -1; + goto abort_egress; + } +valid: + + /* Decrypt the blob */ + if((rc = decrypt_vtpmblk(cipher, cipher_len, data, data_length, symkey))) { + goto abort_egress; + } + goto egress; +abort_egress: + active_slot = -1; +egress: + free(cipher); + free(hashkey); + return rc; +} diff -Nru xen-4.2.2/stubdom/vtpm/vtpmblk.h xen-4.3.0/stubdom/vtpm/vtpmblk.h --- xen-4.2.2/stubdom/vtpm/vtpmblk.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm/vtpmblk.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES + * INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY + * DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE + * SOFTWARE. + */ + +#ifndef NVM_H +#define NVM_H +#include +#include +#include + +#define NVMKEYSZ 32 +#define HASHSZ 20 +#define HASHKEYSZ (NVMKEYSZ + HASHSZ) + +int init_vtpmblk(struct tpmfront_dev* tpmfront_dev); +void shutdown_vtpmblk(void); + +/* Encrypts and writes data to blk device */ +int write_vtpmblk(struct tpmfront_dev* tpmfront_dev, uint8_t *data, size_t data_length); +/* Reads, Decrypts, and returns data from blk device */ +int read_vtpmblk(struct tpmfront_dev* tpmfront_dev, uint8_t **data, size_t *data_length); + +#endif diff -Nru xen-4.2.2/stubdom/vtpm-bufsize.patch xen-4.3.0/stubdom/vtpm-bufsize.patch --- xen-4.2.2/stubdom/vtpm-bufsize.patch 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm-bufsize.patch 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,13 @@ +diff --git a/config.h.in b/config.h.in +index d16a997..8088a2a 100644 +--- a/config.h.in ++++ b/config.h.in +@@ -27,7 +27,7 @@ + #define TPM_STORAGE_NAME "${TPM_STORAGE_NAME}" + #define TPM_DEVICE_NAME "${TPM_DEVICE_NAME}" + #define TPM_LOG_FILE "${TPM_LOG_FILE}" +-#define TPM_CMD_BUF_SIZE 4096 ++#define TPM_CMD_BUF_SIZE 4088 + + #endif /* _CONFIG_H_ */ + diff -Nru xen-4.2.2/stubdom/vtpm-locality.patch xen-4.3.0/stubdom/vtpm-locality.patch --- xen-4.2.2/stubdom/vtpm-locality.patch 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpm-locality.patch 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,50 @@ +diff --git a/tpm/tpm_capability.c b/tpm/tpm_capability.c +index 60bbb90..f8f7f0f 100644 +--- a/tpm/tpm_capability.c ++++ b/tpm/tpm_capability.c +@@ -949,6 +949,8 @@ static TPM_RESULT set_vendor(UINT32 subCap, BYTE *setValue, + UINT32 setValueSize, BOOL ownerAuth, + BOOL deactivated, BOOL disabled) + { ++ if (tpmData.stany.flags.localityModifier != 8) ++ return TPM_BAD_PARAMETER; + /* set the capability area with the specified data, on failure + deactivate the TPM */ + switch (subCap) { +diff --git a/tpm/tpm_cmd_handler.c b/tpm/tpm_cmd_handler.c +index 288d1ce..9e1cfb4 100644 +--- a/tpm/tpm_cmd_handler.c ++++ b/tpm/tpm_cmd_handler.c +@@ -4132,7 +4132,7 @@ void tpm_emulator_shutdown() + tpm_extern_release(); + } + +-int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint32_t *out_size) ++int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint32_t *out_size, int locality) + { + TPM_REQUEST req; + TPM_RESPONSE rsp; +@@ -4140,7 +4140,9 @@ int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint3 + UINT32 len; + BOOL free_out; + +- debug("tpm_handle_command()"); ++ debug("tpm_handle_command(%d)", locality); ++ if (locality != -1) ++ tpmData.stany.flags.localityModifier = locality; + + /* we need the whole packet at once, otherwise unmarshalling will fail */ + if (tpm_unmarshal_TPM_REQUEST((uint8_t**)&in, &in_size, &req) != 0) { +diff --git a/tpm/tpm_emulator.h b/tpm/tpm_emulator.h +index eed749e..4c228bd 100644 +--- a/tpm/tpm_emulator.h ++++ b/tpm/tpm_emulator.h +@@ -59,7 +59,7 @@ void tpm_emulator_shutdown(void); + * its usage. In case of an error, all internally allocated memory + * is released and the the state of out and out_size is unspecified. + */ +-int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint32_t *out_size); ++int tpm_handle_command(const uint8_t *in, uint32_t in_size, uint8_t **out, uint32_t *out_size, int locality); + + #endif /* _TPM_EMULATOR_H_ */ + diff -Nru xen-4.2.2/stubdom/vtpmmgr/Makefile xen-4.3.0/stubdom/vtpmmgr/Makefile --- xen-4.2.2/stubdom/vtpmmgr/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,29 @@ +# Copyright (c) 2010-2012 United States Government, as represented by +# the Secretary of Defense. All rights reserved. +# +# THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT +# ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES +# INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS +# FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY +# DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE +# SOFTWARE. +# + +XEN_ROOT=../.. + +TARGET=vtpmmgr.a +OBJS=vtpmmgr.o vtpm_cmd_handler.o vtpm_storage.o init.o tpmrsa.o tpm.o log.o + +CFLAGS+=-Werror -Iutil -Icrypto -Itcs +CFLAGS+=-Wno-declaration-after-statement -Wno-unused-label + +build: $(TARGET) +$(TARGET): $(OBJS) + ar -rcs $@ $^ + +clean: + rm -f $(TARGET) $(OBJS) + +distclean: clean + +.PHONY: clean distclean diff -Nru xen-4.2.2/stubdom/vtpmmgr/README xen-4.3.0/stubdom/vtpmmgr/README --- xen-4.2.2/stubdom/vtpmmgr/README 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/README 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,75 @@ +Copyright (c) 2010-2012 United States Government, as represented by +the Secretary of Defense. All rights reserved. +November 12 2012 +Authors: Matthew Fioravante (JHUAPL), + +This document describes the operation and command line interface +of vtpmmgr-stubdom. See docs/misc/vtpm.txt for details on the +vTPM subsystem as a whole. + + +------------------------------ +OPERATION +------------------------------ + +The vtpmmgr-stubdom implements a vTPM manager who has two major functions: + + - Securely store encryption keys for each of the vTPMS + - Regulate access to the hardware TPM for the entire system + +The manager accepts commands from the vtpm-stubdom domains via the mini-os +TPM backend driver. The vTPM manager communicates directly with hardware TPM +using the mini-os tpm_tis driver. + + +When the manager starts for the first time it will check if the TPM +has an owner. If the TPM is unowned, it will attempt to take ownership +with the supplied owner_auth (see below) and then create a TPM +storage key which will be used to secure vTPM key data. Currently the +manager only binds vTPM keys to the disk. In the future support +for sealing to PCRs should be added. + +------------------------------ +COMMAND LINE ARGUMENTS +------------------------------ + +Command line arguments are passed to the domain via the 'extra' +parameter in the VM config file. Each parameter is separated +by white space. For example: + +extra="foo=bar baz" + +List of Arguments: +------------------ + +owner_auth=: Set the owner auth of the TPM. The default + is the well known owner auth of all ones. + +srk_auth=: Set the SRK auth for the TPM. The default is + the well known srk auth of all zeroes. + The possible values of are: + well-known: Use the well known auth (default) + random: Randomly generate an auth + hash: : Use the given 40 character ASCII hex string + text: : Use sha1 hash of . + +tpmdriver=: Which driver to use to talk to the hardware TPM. + Don't change this unless you know what you're doing. + The possible values of are: + tpm_tis: Use the tpm_tis driver to talk directly to the TPM. + The domain must have access to TPM IO memory. (default) + tpmfront: Use tpmfront to talk to the TPM. The domain must have + a tpmfront device setup to talk to another domain + which provides access to the TPM. + +The following options only apply to the tpm_tis driver: + +tpmiomem=: The base address of the hardware memory pages of the + TPM (default 0xfed40000). + +tpmirq=: The irq of the hardware TPM if using interrupts. A value of + "probe" can be set to probe for the irq. A value of 0 + disabled interrupts and uses polling (default 0). + +tpmlocality=: Attempt to use locality of the hardware TPM. + (default 0) diff -Nru xen-4.2.2/stubdom/vtpmmgr/init.c xen-4.3.0/stubdom/vtpmmgr/init.c --- xen-4.2.2/stubdom/vtpmmgr/init.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/init.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,559 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "vtpmmgr.h" +#include "vtpm_storage.h" +#include "tpm.h" +#include "marshal.h" + +struct Opts { + enum { + TPMDRV_TPM_TIS, + TPMDRV_TPMFRONT, + } tpmdriver; + unsigned long tpmiomem; + unsigned int tpmirq; + unsigned int tpmlocality; + int gen_owner_auth; +}; + +// --------------------------- Well Known Auths -------------------------- +const TPM_AUTHDATA WELLKNOWN_SRK_AUTH = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +const TPM_AUTHDATA WELLKNOWN_OWNER_AUTH = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + +struct vtpm_globals vtpm_globals = { + .tpm_fd = -1, + .storage_key = TPM_KEY_INIT, + .storage_key_handle = 0, + .oiap = { .AuthHandle = 0 } +}; + +static int tpm_entropy_source(void* dummy, unsigned char* data, size_t len, size_t* olen) { + UINT32 sz = len; + TPM_RESULT rc = TPM_GetRandom(&sz, data); + *olen = sz; + return rc == TPM_SUCCESS ? 0 : POLARSSL_ERR_ENTROPY_SOURCE_FAILED; +} + +static TPM_RESULT check_tpm_version(void) { + TPM_RESULT status; + UINT32 rsize; + BYTE* res = NULL; + TPM_CAP_VERSION_INFO vinfo; + + TPMTRYRETURN(TPM_GetCapability( + TPM_CAP_VERSION_VAL, + 0, + NULL, + &rsize, + &res)); + if(rsize < 4) { + vtpmlogerror(VTPM_LOG_VTPM, "Invalid size returned by GetCapability!\n"); + status = TPM_BAD_PARAMETER; + goto abort_egress; + } + + unpack_TPM_CAP_VERSION_INFO(res, &vinfo, UNPACK_ALIAS); + + vtpmloginfo(VTPM_LOG_VTPM, "Hardware TPM:\n"); + vtpmloginfo(VTPM_LOG_VTPM, " version: %hhd %hhd %hhd %hhd\n", + vinfo.version.major, vinfo.version.minor, vinfo.version.revMajor, vinfo.version.revMinor); + vtpmloginfo(VTPM_LOG_VTPM, " specLevel: %hd\n", vinfo.specLevel); + vtpmloginfo(VTPM_LOG_VTPM, " errataRev: %hhd\n", vinfo.errataRev); + vtpmloginfo(VTPM_LOG_VTPM, " vendorID: %c%c%c%c\n", + vinfo.tpmVendorID[0], vinfo.tpmVendorID[1], + vinfo.tpmVendorID[2], vinfo.tpmVendorID[3]); + vtpmloginfo(VTPM_LOG_VTPM, " vendorSpecificSize: %hd\n", vinfo.vendorSpecificSize); + vtpmloginfo(VTPM_LOG_VTPM, " vendorSpecific: "); + for(int i = 0; i < vinfo.vendorSpecificSize; ++i) { + vtpmloginfomore(VTPM_LOG_VTPM, "%02hhx", vinfo.vendorSpecific[i]); + } + vtpmloginfomore(VTPM_LOG_VTPM, "\n"); + +abort_egress: + free(res); + return status; +} + +static TPM_RESULT flush_tpm(void) { + TPM_RESULT status = TPM_SUCCESS; + const TPM_RESOURCE_TYPE reslist[] = { TPM_RT_KEY, TPM_RT_AUTH, TPM_RT_TRANS, TPM_RT_COUNTER, TPM_RT_DAA_TPM, TPM_RT_CONTEXT }; + BYTE* keylist = NULL; + UINT32 keylistSize; + BYTE* ptr; + + //Iterate through each resource type and flush all handles + for(int i = 0; i < sizeof(reslist) / sizeof(TPM_RESOURCE_TYPE); ++i) { + TPM_RESOURCE_TYPE beres = cpu_to_be32(reslist[i]); + UINT16 size; + TPMTRYRETURN(TPM_GetCapability( + TPM_CAP_HANDLE, + sizeof(TPM_RESOURCE_TYPE), + (BYTE*)(&beres), + &keylistSize, + &keylist)); + + ptr = keylist; + ptr = unpack_UINT16(ptr, &size); + + //Flush each handle + if(size) { + vtpmloginfo(VTPM_LOG_VTPM, "Flushing %u handle(s) of type %lu\n", size, (unsigned long) reslist[i]); + for(int j = 0; j < size; ++j) { + TPM_HANDLE h; + ptr = unpack_TPM_HANDLE(ptr, &h); + TPMTRYRETURN(TPM_FlushSpecific(h, reslist[i])); + } + } + + free(keylist); + keylist = NULL; + } + + goto egress; +abort_egress: + free(keylist); +egress: + return status; +} + + +static TPM_RESULT try_take_ownership(void) { + TPM_RESULT status = TPM_SUCCESS; + TPM_PUBKEY pubEK = TPM_PUBKEY_INIT; + + // If we can read PubEK then there is no owner and we should take it. + status = TPM_ReadPubek(&pubEK); + + switch(status) { + case TPM_DISABLED_CMD: + //Cannot read ek? TPM has owner + vtpmloginfo(VTPM_LOG_VTPM, "Failed to readEK meaning TPM has an owner. Creating Keys off existing SRK.\n"); + status = TPM_SUCCESS; + break; + case TPM_NO_ENDORSEMENT: + { + //If theres no ek, we have to create one + TPM_KEY_PARMS keyInfo = { + .algorithmID = TPM_ALG_RSA, + .encScheme = TPM_ES_RSAESOAEP_SHA1_MGF1, + .sigScheme = TPM_SS_NONE, + .parmSize = 12, + .parms.rsa = { + .keyLength = RSA_KEY_SIZE, + .numPrimes = 2, + .exponentSize = 0, + .exponent = NULL, + }, + }; + TPMTRYRETURN(TPM_CreateEndorsementKeyPair(&keyInfo, &pubEK)); + } + //fall through to take ownership + case TPM_SUCCESS: + { + //Construct the Srk + TPM_KEY srk = { + .ver = TPM_STRUCT_VER_1_1, + .keyUsage = TPM_KEY_STORAGE, + .keyFlags = 0x00, + .authDataUsage = TPM_AUTH_ALWAYS, + .algorithmParms = { + .algorithmID = TPM_ALG_RSA, + .encScheme = TPM_ES_RSAESOAEP_SHA1_MGF1, + .sigScheme = TPM_SS_NONE, + .parmSize = 12, + .parms.rsa = { + .keyLength = RSA_KEY_SIZE, + .numPrimes = 2, + .exponentSize = 0, + .exponent = NULL, + }, + }, + .PCRInfoSize = 0, + .pubKey = { + .keyLength = 0, + .key = NULL, + }, + .encDataSize = 0, + }; + + TPMTRYRETURN(TPM_TakeOwnership( + &pubEK, + (const TPM_AUTHDATA*)&vtpm_globals.owner_auth, + (const TPM_AUTHDATA*)&vtpm_globals.srk_auth, + &srk, + NULL, + &vtpm_globals.oiap)); + + TPMTRYRETURN(TPM_DisablePubekRead( + (const TPM_AUTHDATA*)&vtpm_globals.owner_auth, + &vtpm_globals.oiap)); + } + break; + default: + break; + } +abort_egress: + free_TPM_PUBKEY(&pubEK); + return status; +} + +static void init_storage_key(TPM_KEY* key) { + key->ver.major = 1; + key->ver.minor = 1; + key->ver.revMajor = 0; + key->ver.revMinor = 0; + + key->keyUsage = TPM_KEY_BIND; + key->keyFlags = 0; + key->authDataUsage = TPM_AUTH_ALWAYS; + + TPM_KEY_PARMS* p = &key->algorithmParms; + p->algorithmID = TPM_ALG_RSA; + p->encScheme = TPM_ES_RSAESOAEP_SHA1_MGF1; + p->sigScheme = TPM_SS_NONE; + p->parmSize = 12; + + TPM_RSA_KEY_PARMS* r = &p->parms.rsa; + r->keyLength = RSA_KEY_SIZE; + r->numPrimes = 2; + r->exponentSize = 0; + r->exponent = NULL; + + key->PCRInfoSize = 0; + key->encDataSize = 0; + key->encData = NULL; +} + +static int parse_auth_string(char* authstr, BYTE* target, const TPM_AUTHDATA wellknown, int allowrandom) { + int rc; + /* well known owner auth */ + if(!strcmp(authstr, "well-known")) { + memcpy(target, wellknown, sizeof(TPM_AUTHDATA)); + } + /* Create a randomly generated owner auth */ + else if(allowrandom && !strcmp(authstr, "random")) { + return 1; + } + /* owner auth is a raw hash */ + else if(!strncmp(authstr, "hash:", 5)) { + authstr += 5; + if((rc = strlen(authstr)) != 40) { + vtpmlogerror(VTPM_LOG_VTPM, "Supplied owner auth hex string `%s' must be exactly 40 characters (20 bytes) long, length=%d\n", authstr, rc); + return -1; + } + for(int j = 0; j < 20; ++j) { + if(sscanf(authstr, "%hhX", target + j) != 1) { + vtpmlogerror(VTPM_LOG_VTPM, "Supplied owner auth string `%s' is not a valid hex string\n", authstr); + return -1; + } + authstr += 2; + } + } + /* owner auth is a string that will be hashed */ + else if(!strncmp(authstr, "text:", 5)) { + authstr += 5; + sha1((const unsigned char*)authstr, strlen(authstr), target); + } + else { + vtpmlogerror(VTPM_LOG_VTPM, "Invalid auth string %s\n", authstr); + return -1; + } + + return 0; +} + +int parse_cmdline_opts(int argc, char** argv, struct Opts* opts) +{ + int rc; + int i; + + //Set defaults + memcpy(vtpm_globals.owner_auth, WELLKNOWN_OWNER_AUTH, sizeof(TPM_AUTHDATA)); + memcpy(vtpm_globals.srk_auth, WELLKNOWN_SRK_AUTH, sizeof(TPM_AUTHDATA)); + + for(i = 1; i < argc; ++i) { + if(!strncmp(argv[i], "owner_auth:", 10)) { + if((rc = parse_auth_string(argv[i] + 10, vtpm_globals.owner_auth, WELLKNOWN_OWNER_AUTH, 1)) < 0) { + goto err_invalid; + } + if(rc == 1) { + opts->gen_owner_auth = 1; + } + } + else if(!strncmp(argv[i], "srk_auth:", 8)) { + if((rc = parse_auth_string(argv[i] + 8, vtpm_globals.srk_auth, WELLKNOWN_SRK_AUTH, 0)) != 0) { + goto err_invalid; + } + } + else if(!strncmp(argv[i], "tpmdriver=", 10)) { + if(!strcmp(argv[i] + 10, "tpm_tis")) { + opts->tpmdriver = TPMDRV_TPM_TIS; + } else if(!strcmp(argv[i] + 10, "tpmfront")) { + opts->tpmdriver = TPMDRV_TPMFRONT; + } else { + goto err_invalid; + } + } + else if(!strncmp(argv[i], "tpmiomem=",9)) { + if(sscanf(argv[i] + 9, "0x%lX", &opts->tpmiomem) != 1) { + goto err_invalid; + } + } + else if(!strncmp(argv[i], "tpmirq=",7)) { + if(!strcmp(argv[i] + 7, "probe")) { + opts->tpmirq = TPM_PROBE_IRQ; + } else if( sscanf(argv[i] + 7, "%u", &opts->tpmirq) != 1) { + goto err_invalid; + } + } + else if(!strncmp(argv[i], "tpmlocality=",12)) { + if(sscanf(argv[i] + 12, "%u", &opts->tpmlocality) != 1 || opts->tpmlocality > 4) { + goto err_invalid; + } + } + } + + switch(opts->tpmdriver) { + case TPMDRV_TPM_TIS: + vtpmloginfo(VTPM_LOG_VTPM, "Option: Using tpm_tis driver\n"); + break; + case TPMDRV_TPMFRONT: + vtpmloginfo(VTPM_LOG_VTPM, "Option: Using tpmfront driver\n"); + break; + } + + return 0; +err_invalid: + vtpmlogerror(VTPM_LOG_VTPM, "Invalid Option %s\n", argv[i]); + return -1; +} + + + +static TPM_RESULT vtpmmgr_create(void) { + TPM_RESULT status = TPM_SUCCESS; + TPM_AUTH_SESSION osap = TPM_AUTH_SESSION_INIT; + TPM_AUTHDATA sharedsecret; + + // Take ownership if TPM is unowned + TPMTRYRETURN(try_take_ownership()); + + // Generate storage key's auth + memset(&vtpm_globals.storage_key_usage_auth, 0, sizeof(TPM_AUTHDATA)); + + TPMTRYRETURN( TPM_OSAP( + TPM_ET_KEYHANDLE, + TPM_SRK_KEYHANDLE, + (const TPM_AUTHDATA*)&vtpm_globals.srk_auth, + &sharedsecret, + &osap) ); + + init_storage_key(&vtpm_globals.storage_key); + + //initialize the storage key + TPMTRYRETURN( TPM_CreateWrapKey( + TPM_SRK_KEYHANDLE, + (const TPM_AUTHDATA*)&sharedsecret, + (const TPM_AUTHDATA*)&vtpm_globals.storage_key_usage_auth, + (const TPM_AUTHDATA*)&vtpm_globals.storage_key_usage_auth, + &vtpm_globals.storage_key, + &osap) ); + + //Load Storage Key + TPMTRYRETURN( TPM_LoadKey( + TPM_SRK_KEYHANDLE, + &vtpm_globals.storage_key, + &vtpm_globals.storage_key_handle, + (const TPM_AUTHDATA*) &vtpm_globals.srk_auth, + &vtpm_globals.oiap)); + + //Make sure TPM has commited changes + TPMTRYRETURN( TPM_SaveState() ); + + //Create new disk image + TPMTRYRETURN(vtpm_storage_new_header()); + + goto egress; +abort_egress: +egress: + vtpmloginfo(VTPM_LOG_VTPM, "Finished initialized new VTPM manager\n"); + + //End the OSAP session + if(osap.AuthHandle) { + TPM_TerminateHandle(osap.AuthHandle); + } + + return status; +} + +/* Set up the opaque field to contain a pointer to the UUID */ +static void set_opaque_to_uuid(domid_t domid, unsigned int handle) +{ + tpmback_set_opaque(domid, handle, tpmback_get_uuid(domid, handle)); +} + +TPM_RESULT vtpmmgr_init(int argc, char** argv) { + TPM_RESULT status = TPM_SUCCESS; + + /* Default commandline options */ + struct Opts opts = { + .tpmdriver = TPMDRV_TPM_TIS, + .tpmiomem = TPM_BASEADDR, + .tpmirq = 0, + .tpmlocality = 0, + .gen_owner_auth = 0, + }; + + if(parse_cmdline_opts(argc, argv, &opts) != 0) { + vtpmlogerror(VTPM_LOG_VTPM, "Command line parsing failed! exiting..\n"); + status = TPM_BAD_PARAMETER; + goto abort_egress; + } + + //Setup storage system + if(vtpm_storage_init() != 0) { + vtpmlogerror(VTPM_LOG_VTPM, "Unable to initialize storage subsystem!\n"); + status = TPM_IOERROR; + goto abort_egress; + } + + //Setup tpmback device + init_tpmback(set_opaque_to_uuid, NULL); + + //Setup tpm access + switch(opts.tpmdriver) { + case TPMDRV_TPM_TIS: + { + struct tpm_chip* tpm; + if((tpm = init_tpm_tis(opts.tpmiomem, TPM_TIS_LOCL_INT_TO_FLAG(opts.tpmlocality), opts.tpmirq)) == NULL) { + vtpmlogerror(VTPM_LOG_VTPM, "Unable to initialize tpmfront device\n"); + status = TPM_IOERROR; + goto abort_egress; + } + vtpm_globals.tpm_fd = tpm_tis_open(tpm); + tpm_tis_request_locality(tpm, opts.tpmlocality); + } + break; + case TPMDRV_TPMFRONT: + { + struct tpmfront_dev* tpmfront_dev; + if((tpmfront_dev = init_tpmfront(NULL)) == NULL) { + vtpmlogerror(VTPM_LOG_VTPM, "Unable to initialize tpmfront device\n"); + status = TPM_IOERROR; + goto abort_egress; + } + vtpm_globals.tpm_fd = tpmfront_open(tpmfront_dev); + } + break; + } + + //Get the version of the tpm + TPMTRYRETURN(check_tpm_version()); + + // Blow away all stale handles left in the tpm + if(flush_tpm() != TPM_SUCCESS) { + vtpmlogerror(VTPM_LOG_VTPM, "VTPM_FlushResources failed, continuing anyway..\n"); + } + + /* Initialize the rng */ + entropy_init(&vtpm_globals.entropy); + entropy_add_source(&vtpm_globals.entropy, tpm_entropy_source, NULL, 0); + entropy_gather(&vtpm_globals.entropy); + ctr_drbg_init(&vtpm_globals.ctr_drbg, entropy_func, &vtpm_globals.entropy, NULL, 0); + ctr_drbg_set_prediction_resistance( &vtpm_globals.ctr_drbg, CTR_DRBG_PR_OFF ); + + // Generate Auth for Owner + if(opts.gen_owner_auth) { + vtpmmgr_rand(vtpm_globals.owner_auth, sizeof(TPM_AUTHDATA)); + } + + // Create OIAP session for service's authorized commands + TPMTRYRETURN( TPM_OIAP(&vtpm_globals.oiap) ); + + /* Load the Manager data, if it fails create a new manager */ + if (vtpm_storage_load_header() != TPM_SUCCESS) { + /* If the OIAP session was closed by an error, create a new one */ + if(vtpm_globals.oiap.AuthHandle == 0) { + TPMTRYRETURN( TPM_OIAP(&vtpm_globals.oiap) ); + } + vtpmloginfo(VTPM_LOG_VTPM, "Failed to read manager file. Assuming first time initialization.\n"); + TPMTRYRETURN( vtpmmgr_create() ); + } + + goto egress; +abort_egress: + vtpmmgr_shutdown(); +egress: + return status; +} + +void vtpmmgr_shutdown(void) +{ + /* Cleanup resources */ + free_TPM_KEY(&vtpm_globals.storage_key); + + /* Cleanup TPM resources */ + TPM_EvictKey(vtpm_globals.storage_key_handle); + TPM_TerminateHandle(vtpm_globals.oiap.AuthHandle); + + /* Close tpmback */ + shutdown_tpmback(); + + /* Close the storage system and blkfront */ + vtpm_storage_shutdown(); + + /* Close tpmfront/tpm_tis */ + close(vtpm_globals.tpm_fd); + + vtpmloginfo(VTPM_LOG_VTPM, "VTPM Manager stopped.\n"); +} diff -Nru xen-4.2.2/stubdom/vtpmmgr/log.c xen-4.3.0/stubdom/vtpmmgr/log.c --- xen-4.2.2/stubdom/vtpmmgr/log.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/log.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include + +#include "tcg.h" + +char *module_names[] = { "", + "TPM", + "TPM", + "VTPM", + "VTPM", + "TXDATA", + }; +// Helper code for the consts, eg. to produce messages for error codes. + +typedef struct error_code_entry_t { + TPM_RESULT code; + char * code_name; + char * msg; +} error_code_entry_t; + +static const error_code_entry_t error_msgs [] = { + { TPM_SUCCESS, "TPM_SUCCESS", "Successful completion of the operation" }, + { TPM_AUTHFAIL, "TPM_AUTHFAIL", "Authentication failed" }, + { TPM_BADINDEX, "TPM_BADINDEX", "The index to a PCR, DIR or other register is incorrect" }, + { TPM_BAD_PARAMETER, "TPM_BAD_PARAMETER", "One or more parameter is bad" }, + { TPM_AUDITFAILURE, "TPM_AUDITFAILURE", "An operation completed successfully but the auditing of that operation failed." }, + { TPM_CLEAR_DISABLED, "TPM_CLEAR_DISABLED", "The clear disable flag is set and all clear operations now require physical access" }, + { TPM_DEACTIVATED, "TPM_DEACTIVATED", "The TPM is deactivated" }, + { TPM_DISABLED, "TPM_DISABLED", "The TPM is disabled" }, + { TPM_DISABLED_CMD, "TPM_DISABLED_CMD", "The target command has been disabled" }, + { TPM_FAIL, "TPM_FAIL", "The operation failed" }, + { TPM_BAD_ORDINAL, "TPM_BAD_ORDINAL", "The ordinal was unknown or inconsistent" }, + { TPM_INSTALL_DISABLED, "TPM_INSTALL_DISABLED", "The ability to install an owner is disabled" }, + { TPM_INVALID_KEYHANDLE, "TPM_INVALID_KEYHANDLE", "The key handle presented was invalid" }, + { TPM_KEYNOTFOUND, "TPM_KEYNOTFOUND", "The target key was not found" }, + { TPM_INAPPROPRIATE_ENC, "TPM_INAPPROPRIATE_ENC", "Unacceptable encryption scheme" }, + { TPM_MIGRATEFAIL, "TPM_MIGRATEFAIL", "Migration authorization failed" }, + { TPM_INVALID_PCR_INFO, "TPM_INVALID_PCR_INFO", "PCR information could not be interpreted" }, + { TPM_NOSPACE, "TPM_NOSPACE", "No room to load key." }, + { TPM_NOSRK, "TPM_NOSRK", "There is no SRK set" }, + { TPM_NOTSEALED_BLOB, "TPM_NOTSEALED_BLOB", "An encrypted blob is invalid or was not created by this TPM" }, + { TPM_OWNER_SET, "TPM_OWNER_SET", "There is already an Owner" }, + { TPM_RESOURCES, "TPM_RESOURCES", "The TPM has insufficient internal resources to perform the requested action." }, + { TPM_SHORTRANDOM, "TPM_SHORTRANDOM", "A random string was too short" }, + { TPM_SIZE, "TPM_SIZE", "The TPM does not have the space to perform the operation." }, + { TPM_WRONGPCRVAL, "TPM_WRONGPCRVAL", "The named PCR value does not match the current PCR value." }, + { TPM_BAD_PARAM_SIZE, "TPM_BAD_PARAM_SIZE", "The paramSize argument to the command has the incorrect value" }, + { TPM_SHA_THREAD, "TPM_SHA_THREAD", "There is no existing SHA-1 thread." }, + { TPM_SHA_ERROR, "TPM_SHA_ERROR", "The calculation is unable to proceed because the existing SHA-1 thread has already encountered an error." }, + { TPM_FAILEDSELFTEST, "TPM_FAILEDSELFTEST", "Self-test has failed and the TPM has shutdown." }, + { TPM_AUTH2FAIL, "TPM_AUTH2FAIL", "The authorization for the second key in a 2 key function failed authorization" }, + { TPM_BADTAG, "TPM_BADTAG", "The tag value sent to for a command is invalid" }, + { TPM_IOERROR, "TPM_IOERROR", "An IO error occurred transmitting information to the TPM" }, + { TPM_ENCRYPT_ERROR, "TPM_ENCRYPT_ERROR", "The encryption process had a problem." }, + { TPM_DECRYPT_ERROR, "TPM_DECRYPT_ERROR", "The decryption process did not complete." }, + { TPM_INVALID_AUTHHANDLE, "TPM_INVALID_AUTHHANDLE", "An invalid handle was used." }, + { TPM_NO_ENDORSEMENT, "TPM_NO_ENDORSEMENT", "The TPM does not a EK installed" }, + { TPM_INVALID_KEYUSAGE, "TPM_INVALID_KEYUSAGE", "The usage of a key is not allowed" }, + { TPM_WRONG_ENTITYTYPE, "TPM_WRONG_ENTITYTYPE", "The submitted entity type is not allowed" }, + { TPM_INVALID_POSTINIT, "TPM_INVALID_POSTINIT", "The command was received in the wrong sequence relative to TPM_Init and a subsequent TPM_Startup" }, + { TPM_INAPPROPRIATE_SIG, "TPM_INAPPROPRIATE_SIG", "Signed data cannot include additional DER information" }, + { TPM_BAD_KEY_PROPERTY, "TPM_BAD_KEY_PROPERTY", "The key properties in TPM_KEY_PARMs are not supported by this TPM" }, + + { TPM_BAD_MIGRATION, "TPM_BAD_MIGRATION", "The migration properties of this key are incorrect." }, + { TPM_BAD_SCHEME, "TPM_BAD_SCHEME", "The signature or encryption scheme for this key is incorrect or not permitted in this situation." }, + { TPM_BAD_DATASIZE, "TPM_BAD_DATASIZE", "The size of the data (or blob) parameter is bad or inconsistent with the referenced key" }, + { TPM_BAD_MODE, "TPM_BAD_MODE", "A mode parameter is bad, such as capArea or subCapArea for TPM_GetCapability, phsicalPresence parameter for TPM_PhysicalPresence, or migrationType for TPM_CreateMigrationBlob." }, + { TPM_BAD_PRESENCE, "TPM_BAD_PRESENCE", "Either the physicalPresence or physicalPresenceLock bits have the wrong value" }, + { TPM_BAD_VERSION, "TPM_BAD_VERSION", "The TPM cannot perform this version of the capability" }, + { TPM_NO_WRAP_TRANSPORT, "TPM_NO_WRAP_TRANSPORT", "The TPM does not allow for wrapped transport sessions" }, + { TPM_AUDITFAIL_UNSUCCESSFUL, "TPM_AUDITFAIL_UNSUCCESSFUL", "TPM audit construction failed and the underlying command was returning a failure code also" }, + { TPM_AUDITFAIL_SUCCESSFUL, "TPM_AUDITFAIL_SUCCESSFUL", "TPM audit construction failed and the underlying command was returning success" }, + { TPM_NOTRESETABLE, "TPM_NOTRESETABLE", "Attempt to reset a PCR register that does not have the resettable attribute" }, + { TPM_NOTLOCAL, "TPM_NOTLOCAL", "Attempt to reset a PCR register that requires locality and locality modifier not part of command transport" }, + { TPM_BAD_TYPE, "TPM_BAD_TYPE", "Make identity blob not properly typed" }, + { TPM_INVALID_RESOURCE, "TPM_INVALID_RESOURCE", "When saving context identified resource type does not match actual resource" }, + { TPM_NOTFIPS, "TPM_NOTFIPS", "The TPM is attempting to execute a command only available when in FIPS mode" }, + { TPM_INVALID_FAMILY, "TPM_INVALID_FAMILY", "The command is attempting to use an invalid family ID" }, + { TPM_NO_NV_PERMISSION, "TPM_NO_NV_PERMISSION", "The permission to manipulate the NV storage is not available" }, + { TPM_REQUIRES_SIGN, "TPM_REQUIRES_SIGN", "The operation requires a signed command" }, + { TPM_KEY_NOTSUPPORTED, "TPM_KEY_NOTSUPPORTED", "Wrong operation to load an NV key" }, + { TPM_AUTH_CONFLICT, "TPM_AUTH_CONFLICT", "NV_LoadKey blob requires both owner and blob authorization" }, + { TPM_AREA_LOCKED, "TPM_AREA_LOCKED", "The NV area is locked and not writtable" }, + { TPM_BAD_LOCALITY, "TPM_BAD_LOCALITY", "The locality is incorrect for the attempted operation" }, + { TPM_READ_ONLY, "TPM_READ_ONLY", "The NV area is read only and can't be written to" }, + { TPM_PER_NOWRITE, "TPM_PER_NOWRITE", "There is no protection on the write to the NV area" }, + { TPM_FAMILYCOUNT, "TPM_FAMILYCOUNT", "The family count value does not match" }, + { TPM_WRITE_LOCKED, "TPM_WRITE_LOCKED", "The NV area has already been written to" }, + { TPM_BAD_ATTRIBUTES, "TPM_BAD_ATTRIBUTES", "The NV area attributes conflict" }, + { TPM_INVALID_STRUCTURE, "TPM_INVALID_STRUCTURE", "The structure tag and version are invalid or inconsistent" }, + { TPM_KEY_OWNER_CONTROL, "TPM_KEY_OWNER_CONTROL", "The key is under control of the TPM Owner and can only be evicted by the TPM Owner." }, + { TPM_BAD_COUNTER, "TPM_BAD_COUNTER", "The counter handle is incorrect" }, + { TPM_NOT_FULLWRITE, "TPM_NOT_FULLWRITE", "The write is not a complete write of the area" }, + { TPM_CONTEXT_GAP, "TPM_CONTEXT_GAP", "The gap between saved context counts is too large" }, + { TPM_MAXNVWRITES, "TPM_MAXNVWRITES", "The maximum number of NV writes without an owner has been exceeded" }, + { TPM_NOOPERATOR, "TPM_NOOPERATOR", "No operator authorization value is set" }, + { TPM_RESOURCEMISSING, "TPM_RESOURCEMISSING", "The resource pointed to by context is not loaded" }, + { TPM_DELEGATE_LOCK, "TPM_DELEGATE_LOCK", "The delegate administration is locked" }, + { TPM_DELEGATE_FAMILY, "TPM_DELEGATE_FAMILY", "Attempt to manage a family other then the delegated family" }, + { TPM_DELEGATE_ADMIN, "TPM_DELEGATE_ADMIN", "Delegation table management not enabled" }, + { TPM_TRANSPORT_EXCLUSIVE, "TPM_TRANSPORT_EXCLUSIVE", "There was a command executed outside of an exclusive transport session" }, +}; + + +// helper function for the error codes: +const char* tpm_get_error_name (TPM_RESULT code) { + // just do a linear scan for now + unsigned i; + for (i = 0; i < sizeof(error_msgs)/sizeof(error_msgs[0]); i++) + if (code == error_msgs[i].code) + return error_msgs[i].code_name; + + return("Unknown Error Code"); +} diff -Nru xen-4.2.2/stubdom/vtpmmgr/log.h xen-4.3.0/stubdom/vtpmmgr/log.h --- xen-4.2.2/stubdom/vtpmmgr/log.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/log.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __VTPM_LOG_H__ +#define __VTPM_LOG_H__ + +#include // for uint32_t +#include // for pointer NULL +#include +#include "tcg.h" + +// =========================== LOGGING ============================== + +// the logging module numbers +#define VTPM_LOG_TPM 1 +#define VTPM_LOG_TPM_DEEP 2 +#define VTPM_LOG_VTPM 3 +#define VTPM_LOG_VTPM_DEEP 4 +#define VTPM_LOG_TXDATA 5 + +extern char *module_names[]; + +// Default to standard logging +#ifndef LOGGING_MODULES +#define LOGGING_MODULES (BITMASK(VTPM_LOG_VTPM)|BITMASK(VTPM_LOG_TPM)) +#endif + +// bit-access macros +#define BITMASK(idx) ( 1U << (idx) ) +#define GETBIT(num,idx) ( ((num) & BITMASK(idx)) >> idx ) +#define SETBIT(num,idx) (num) |= BITMASK(idx) +#define CLEARBIT(num,idx) (num) &= ( ~ BITMASK(idx) ) + +#define vtpmloginfo(module, fmt, args...) \ + if (GETBIT (LOGGING_MODULES, module) == 1) { \ + fprintf (stdout, "INFO[%s]: " fmt, module_names[module], ##args); \ + } + +#define vtpmloginfomore(module, fmt, args...) \ + if (GETBIT (LOGGING_MODULES, module) == 1) { \ + fprintf (stdout, fmt,##args); \ + } + +#define vtpmlogerror(module, fmt, args...) \ + fprintf (stderr, "ERROR[%s]: " fmt, module_names[module], ##args); + +//typedef UINT32 tpm_size_t; + +// helper function for the error codes: +const char* tpm_get_error_name (TPM_RESULT code); + +#endif // _VTPM_LOG_H_ diff -Nru xen-4.2.2/stubdom/vtpmmgr/marshal.h xen-4.3.0/stubdom/vtpmmgr/marshal.h --- xen-4.2.2/stubdom/vtpmmgr/marshal.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/marshal.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,528 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef MARSHAL_H +#define MARSHAL_H + +#include +#include +#include +#include "tcg.h" + +typedef enum UnpackPtr { + UNPACK_ALIAS, + UNPACK_ALLOC +} UnpackPtr; + +inline BYTE* pack_BYTE(BYTE* ptr, BYTE t) { + ptr[0] = t; + return ++ptr; +} + +inline BYTE* unpack_BYTE(BYTE* ptr, BYTE* t) { + t[0] = ptr[0]; + return ++ptr; +} + +#define pack_BOOL(p, t) pack_BYTE(p, t) +#define unpack_BOOL(p, t) unpack_BYTE(p, t) + +inline BYTE* pack_UINT16(BYTE* ptr, UINT16 t) { + BYTE* b = (BYTE*)&t; +#if __BYTE_ORDER == __LITTLE_ENDIAN + ptr[0] = b[1]; + ptr[1] = b[0]; +#elif __BYTE_ORDER == __BIG_ENDIAN + ptr[0] = b[0]; + ptr[1] = b[1]; +#endif + return ptr + sizeof(UINT16); +} + +inline BYTE* unpack_UINT16(BYTE* ptr, UINT16* t) { + BYTE* b = (BYTE*)t; +#if __BYTE_ORDER == __LITTLE_ENDIAN + b[0] = ptr[1]; + b[1] = ptr[0]; +#elif __BYTE_ORDER == __BIG_ENDIAN + b[0] = ptr[0]; + b[1] = ptr[1]; +#endif + return ptr + sizeof(UINT16); +} + +inline BYTE* pack_UINT32(BYTE* ptr, UINT32 t) { + BYTE* b = (BYTE*)&t; +#if __BYTE_ORDER == __LITTLE_ENDIAN + ptr[3] = b[0]; + ptr[2] = b[1]; + ptr[1] = b[2]; + ptr[0] = b[3]; +#elif __BYTE_ORDER == __BIG_ENDIAN + ptr[0] = b[0]; + ptr[1] = b[1]; + ptr[2] = b[2]; + ptr[3] = b[3]; +#endif + return ptr + sizeof(UINT32); +} + +inline BYTE* unpack_UINT32(BYTE* ptr, UINT32* t) { + BYTE* b = (BYTE*)t; +#if __BYTE_ORDER == __LITTLE_ENDIAN + b[0] = ptr[3]; + b[1] = ptr[2]; + b[2] = ptr[1]; + b[3] = ptr[0]; +#elif __BYTE_ORDER == __BIG_ENDIAN + b[0] = ptr[0]; + b[1] = ptr[1]; + b[2] = ptr[2]; + b[3] = ptr[3]; +#endif + return ptr + sizeof(UINT32); +} + +#define pack_TPM_RESULT(p, t) pack_UINT32(p, t) +#define pack_TPM_PCRINDEX(p, t) pack_UINT32(p, t) +#define pack_TPM_DIRINDEX(p, t) pack_UINT32(p, t) +#define pack_TPM_HANDLE(p, t) pack_UINT32(p, t) +#define pack_TPM_AUTHHANDLE(p, t) pack_TPM_HANDLE(p, t) +#define pack_TCPA_HASHHANDLE(p, t) pack_TPM_HANDLE(p, t) +#define pack_TCPA_HMACHANDLE(p, t) pack_TPM_HANDLE(p, t) +#define pack_TCPA_ENCHANDLE(p, t) pack_TPM_HANDLE(p, t) +#define pack_TPM_KEY_HANDLE(p, t) pack_TPM_HANDLE(p, t) +#define pack_TCPA_ENTITYHANDLE(p, t) pack_TPM_HANDLE(p, t) +#define pack_TPM_RESOURCE_TYPE(p, t) pack_UINT32(p, t) +#define pack_TPM_COMMAND_CODE(p, t) pack_UINT32(p, t) +#define pack_TPM_PROTOCOL_ID(p, t) pack_UINT16(p, t) +#define pack_TPM_AUTH_DATA_USAGE(p, t) pack_BYTE(p, t) +#define pack_TPM_ENTITY_TYPE(p, t) pack_UINT16(p, t) +#define pack_TPM_ALGORITHM_ID(p, t) pack_UINT32(p, t) +#define pack_TPM_KEY_USAGE(p, t) pack_UINT16(p, t) +#define pack_TPM_STARTUP_TYPE(p, t) pack_UINT16(p, t) +#define pack_TPM_CAPABILITY_AREA(p, t) pack_UINT32(p, t) +#define pack_TPM_ENC_SCHEME(p, t) pack_UINT16(p, t) +#define pack_TPM_SIG_SCHEME(p, t) pack_UINT16(p, t) +#define pack_TPM_MIGRATE_SCHEME(p, t) pack_UINT16(p, t) +#define pack_TPM_PHYSICAL_PRESENCE(p, t) pack_UINT16(p, t) +#define pack_TPM_KEY_FLAGS(p, t) pack_UINT32(p, t) + +#define unpack_TPM_RESULT(p, t) unpack_UINT32(p, t) +#define unpack_TPM_PCRINDEX(p, t) unpack_UINT32(p, t) +#define unpack_TPM_DIRINDEX(p, t) unpack_UINT32(p, t) +#define unpack_TPM_HANDLE(p, t) unpack_UINT32(p, t) +#define unpack_TPM_AUTHHANDLE(p, t) unpack_TPM_HANDLE(p, t) +#define unpack_TCPA_HASHHANDLE(p, t) unpack_TPM_HANDLE(p, t) +#define unpack_TCPA_HMACHANDLE(p, t) unpack_TPM_HANDLE(p, t) +#define unpack_TCPA_ENCHANDLE(p, t) unpack_TPM_HANDLE(p, t) +#define unpack_TPM_KEY_HANDLE(p, t) unpack_TPM_HANDLE(p, t) +#define unpack_TCPA_ENTITYHANDLE(p, t) unpack_TPM_HANDLE(p, t) +#define unpack_TPM_RESOURCE_TYPE(p, t) unpack_UINT32(p, t) +#define unpack_TPM_COMMAND_CODE(p, t) unpack_UINT32(p, t) +#define unpack_TPM_PROTOCOL_ID(p, t) unpack_UINT16(p, t) +#define unpack_TPM_AUTH_DATA_USAGE(p, t) unpack_BYTE(p, t) +#define unpack_TPM_ENTITY_TYPE(p, t) unpack_UINT16(p, t) +#define unpack_TPM_ALGORITHM_ID(p, t) unpack_UINT32(p, t) +#define unpack_TPM_KEY_USAGE(p, t) unpack_UINT16(p, t) +#define unpack_TPM_STARTUP_TYPE(p, t) unpack_UINT16(p, t) +#define unpack_TPM_CAPABILITY_AREA(p, t) unpack_UINT32(p, t) +#define unpack_TPM_ENC_SCHEME(p, t) unpack_UINT16(p, t) +#define unpack_TPM_SIG_SCHEME(p, t) unpack_UINT16(p, t) +#define unpack_TPM_MIGRATE_SCHEME(p, t) unpack_UINT16(p, t) +#define unpack_TPM_PHYSICAL_PRESENCE(p, t) unpack_UINT16(p, t) +#define unpack_TPM_KEY_FLAGS(p, t) unpack_UINT32(p, t) + +#define pack_TPM_AUTH_HANDLE(p, t) pack_UINT32(p, t); +#define pack_TCS_CONTEXT_HANDLE(p, t) pack_UINT32(p, t); +#define pack_TCS_KEY_HANDLE(p, t) pack_UINT32(p, t); + +#define unpack_TPM_AUTH_HANDLE(p, t) unpack_UINT32(p, t); +#define unpack_TCS_CONTEXT_HANDLE(p, t) unpack_UINT32(p, t); +#define unpack_TCS_KEY_HANDLE(p, t) unpack_UINT32(p, t); + +inline BYTE* pack_BUFFER(BYTE* ptr, const BYTE* buf, UINT32 size) { + memcpy(ptr, buf, size); + return ptr + size; +} + +inline BYTE* unpack_BUFFER(BYTE* ptr, BYTE* buf, UINT32 size) { + memcpy(buf, ptr, size); + return ptr + size; +} + +inline BYTE* unpack_ALIAS(BYTE* ptr, BYTE** buf, UINT32 size) { + *buf = ptr; + return ptr + size; +} + +inline BYTE* unpack_ALLOC(BYTE* ptr, BYTE** buf, UINT32 size) { + if(size) { + *buf = malloc(size); + memcpy(*buf, ptr, size); + } else { + *buf = NULL; + } + return ptr + size; +} + +inline BYTE* unpack_PTR(BYTE* ptr, BYTE** buf, UINT32 size, UnpackPtr alloc) { + if(alloc == UNPACK_ALLOC) { + return unpack_ALLOC(ptr, buf, size); + } else { + return unpack_ALIAS(ptr, buf, size); + } +} + +inline BYTE* pack_TPM_AUTHDATA(BYTE* ptr, const TPM_AUTHDATA* d) { + return pack_BUFFER(ptr, *d, TPM_DIGEST_SIZE); +} + +inline BYTE* unpack_TPM_AUTHDATA(BYTE* ptr, TPM_AUTHDATA* d) { + return unpack_BUFFER(ptr, *d, TPM_DIGEST_SIZE); +} + +#define pack_TPM_SECRET(p, t) pack_TPM_AUTHDATA(p, t) +#define pack_TPM_ENCAUTH(p, t) pack_TPM_AUTHDATA(p, t) +#define pack_TPM_PAYLOAD_TYPE(p, t) pack_BYTE(p, t) +#define pack_TPM_TAG(p, t) pack_UINT16(p, t) +#define pack_TPM_STRUCTURE_TAG(p, t) pack_UINT16(p, t) + +#define unpack_TPM_SECRET(p, t) unpack_TPM_AUTHDATA(p, t) +#define unpack_TPM_ENCAUTH(p, t) unpack_TPM_AUTHDATA(p, t) +#define unpack_TPM_PAYLOAD_TYPE(p, t) unpack_BYTE(p, t) +#define unpack_TPM_TAG(p, t) unpack_UINT16(p, t) +#define unpack_TPM_STRUCTURE_TAG(p, t) unpack_UINT16(p, t) + +inline BYTE* pack_TPM_VERSION(BYTE* ptr, const TPM_VERSION* t) { + ptr[0] = t->major; + ptr[1] = t->minor; + ptr[2] = t->revMajor; + ptr[3] = t->revMinor; + return ptr + 4; +} + +inline BYTE* unpack_TPM_VERSION(BYTE* ptr, TPM_VERSION* t) { + t->major = ptr[0]; + t->minor = ptr[1]; + t->revMajor = ptr[2]; + t->revMinor = ptr[3]; + return ptr + 4; +} + +inline BYTE* pack_TPM_CAP_VERSION_INFO(BYTE* ptr, const TPM_CAP_VERSION_INFO* v) { + ptr = pack_TPM_STRUCTURE_TAG(ptr, v->tag); + ptr = pack_TPM_VERSION(ptr, &v->version); + ptr = pack_UINT16(ptr, v->specLevel); + ptr = pack_BYTE(ptr, v->errataRev); + ptr = pack_BUFFER(ptr, v->tpmVendorID, sizeof(v->tpmVendorID)); + ptr = pack_UINT16(ptr, v->vendorSpecificSize); + ptr = pack_BUFFER(ptr, v->vendorSpecific, v->vendorSpecificSize); + return ptr; +} + +inline BYTE* unpack_TPM_CAP_VERSION_INFO(BYTE* ptr, TPM_CAP_VERSION_INFO* v, UnpackPtr alloc) { + ptr = unpack_TPM_STRUCTURE_TAG(ptr, &v->tag); + ptr = unpack_TPM_VERSION(ptr, &v->version); + ptr = unpack_UINT16(ptr, &v->specLevel); + ptr = unpack_BYTE(ptr, &v->errataRev); + ptr = unpack_BUFFER(ptr, v->tpmVendorID, sizeof(v->tpmVendorID)); + ptr = unpack_UINT16(ptr, &v->vendorSpecificSize); + ptr = unpack_PTR(ptr, &v->vendorSpecific, v->vendorSpecificSize, alloc); + return ptr; +} + +inline BYTE* pack_TPM_DIGEST(BYTE* ptr, const TPM_DIGEST* d) { + return pack_BUFFER(ptr, d->digest, TPM_DIGEST_SIZE); +} + +inline BYTE* unpack_TPM_DIGEST(BYTE* ptr, TPM_DIGEST* d) { + return unpack_BUFFER(ptr, d->digest, TPM_DIGEST_SIZE); +} + +#define pack_TPM_PCRVALUE(ptr, d) pack_TPM_DIGEST(ptr, d); +#define unpack_TPM_PCRVALUE(ptr, d) unpack_TPM_DIGEST(ptr, d); + +#define pack_TPM_COMPOSITE_HASH(ptr, d) pack_TPM_DIGEST(ptr, d); +#define unpack_TPM_COMPOSITE_HASH(ptr, d) unpack_TPM_DIGEST(ptr, d); + +#define pack_TPM_DIRVALUE(ptr, d) pack_TPM_DIGEST(ptr, d); +#define unpack_TPM_DIRVALUE(ptr, d) unpack_TPM_DIGEST(ptr, d); + +#define pack_TPM_HMAC(ptr, d) pack_TPM_DIGEST(ptr, d); +#define unpack_TPM_HMAC(ptr, d) unpack_TPM_DIGEST(ptr, d); + +#define pack_TPM_CHOSENID_HASH(ptr, d) pack_TPM_DIGEST(ptr, d); +#define unpack_TPM_CHOSENID_HASH(ptr, d) unpack_TPM_DIGEST(ptr, d); + +inline BYTE* pack_TPM_NONCE(BYTE* ptr, const TPM_NONCE* n) { + return pack_BUFFER(ptr, n->nonce, TPM_DIGEST_SIZE); +} + +inline BYTE* unpack_TPM_NONCE(BYTE* ptr, TPM_NONCE* n) { + return unpack_BUFFER(ptr, n->nonce, TPM_DIGEST_SIZE); +} + +inline BYTE* pack_TPM_SYMMETRIC_KEY_PARMS(BYTE* ptr, const TPM_SYMMETRIC_KEY_PARMS* k) { + ptr = pack_UINT32(ptr, k->keyLength); + ptr = pack_UINT32(ptr, k->blockSize); + ptr = pack_UINT32(ptr, k->ivSize); + return pack_BUFFER(ptr, k->IV, k->ivSize); +} + +inline BYTE* unpack_TPM_SYMMETRIC_KEY_PARMS(BYTE* ptr, TPM_SYMMETRIC_KEY_PARMS* k, UnpackPtr alloc) { + ptr = unpack_UINT32(ptr, &k->keyLength); + ptr = unpack_UINT32(ptr, &k->blockSize); + ptr = unpack_UINT32(ptr, &k->ivSize); + return unpack_PTR(ptr, &k->IV, k->ivSize, alloc); +} + +inline BYTE* pack_TPM_RSA_KEY_PARMS(BYTE* ptr, const TPM_RSA_KEY_PARMS* k) { + ptr = pack_UINT32(ptr, k->keyLength); + ptr = pack_UINT32(ptr, k->numPrimes); + ptr = pack_UINT32(ptr, k->exponentSize); + return pack_BUFFER(ptr, k->exponent, k->exponentSize); +} + +inline BYTE* unpack_TPM_RSA_KEY_PARMS(BYTE* ptr, TPM_RSA_KEY_PARMS* k, UnpackPtr alloc) { + ptr = unpack_UINT32(ptr, &k->keyLength); + ptr = unpack_UINT32(ptr, &k->numPrimes); + ptr = unpack_UINT32(ptr, &k->exponentSize); + return unpack_PTR(ptr, &k->exponent, k->exponentSize, alloc); +} + +inline BYTE* pack_TPM_KEY_PARMS(BYTE* ptr, const TPM_KEY_PARMS* k) { + ptr = pack_TPM_ALGORITHM_ID(ptr, k->algorithmID); + ptr = pack_TPM_ENC_SCHEME(ptr, k->encScheme); + ptr = pack_TPM_SIG_SCHEME(ptr, k->sigScheme); + ptr = pack_UINT32(ptr, k->parmSize); + + if(k->parmSize) { + switch(k->algorithmID) { + case TPM_ALG_RSA: + return pack_TPM_RSA_KEY_PARMS(ptr, &k->parms.rsa); + case TPM_ALG_AES128: + case TPM_ALG_AES192: + case TPM_ALG_AES256: + return pack_TPM_SYMMETRIC_KEY_PARMS(ptr, &k->parms.sym); + } + } + return ptr; +} + +inline BYTE* unpack_TPM_KEY_PARMS(BYTE* ptr, TPM_KEY_PARMS* k, UnpackPtr alloc) { + ptr = unpack_TPM_ALGORITHM_ID(ptr, &k->algorithmID); + ptr = unpack_TPM_ENC_SCHEME(ptr, &k->encScheme); + ptr = unpack_TPM_SIG_SCHEME(ptr, &k->sigScheme); + ptr = unpack_UINT32(ptr, &k->parmSize); + + if(k->parmSize) { + switch(k->algorithmID) { + case TPM_ALG_RSA: + return unpack_TPM_RSA_KEY_PARMS(ptr, &k->parms.rsa, alloc); + case TPM_ALG_AES128: + case TPM_ALG_AES192: + case TPM_ALG_AES256: + return unpack_TPM_SYMMETRIC_KEY_PARMS(ptr, &k->parms.sym, alloc); + } + } + return ptr; +} + +inline BYTE* pack_TPM_STORE_PUBKEY(BYTE* ptr, const TPM_STORE_PUBKEY* k) { + ptr = pack_UINT32(ptr, k->keyLength); + ptr = pack_BUFFER(ptr, k->key, k->keyLength); + return ptr; +} + +inline BYTE* unpack_TPM_STORE_PUBKEY(BYTE* ptr, TPM_STORE_PUBKEY* k, UnpackPtr alloc) { + ptr = unpack_UINT32(ptr, &k->keyLength); + ptr = unpack_PTR(ptr, &k->key, k->keyLength, alloc); + return ptr; +} + +inline BYTE* pack_TPM_PUBKEY(BYTE* ptr, const TPM_PUBKEY* k) { + ptr = pack_TPM_KEY_PARMS(ptr, &k->algorithmParms); + return pack_TPM_STORE_PUBKEY(ptr, &k->pubKey); +} + +inline BYTE* unpack_TPM_PUBKEY(BYTE* ptr, TPM_PUBKEY* k, UnpackPtr alloc) { + ptr = unpack_TPM_KEY_PARMS(ptr, &k->algorithmParms, alloc); + return unpack_TPM_STORE_PUBKEY(ptr, &k->pubKey, alloc); +} + +inline BYTE* pack_TPM_PCR_SELECTION(BYTE* ptr, const TPM_PCR_SELECTION* p) { + ptr = pack_UINT16(ptr, p->sizeOfSelect); + ptr = pack_BUFFER(ptr, p->pcrSelect, p->sizeOfSelect); + return ptr; +} + +inline BYTE* unpack_TPM_PCR_SELECTION(BYTE* ptr, TPM_PCR_SELECTION* p, UnpackPtr alloc) { + ptr = unpack_UINT16(ptr, &p->sizeOfSelect); + ptr = unpack_PTR(ptr, &p->pcrSelect, p->sizeOfSelect, alloc); + return ptr; +} + +inline BYTE* pack_TPM_PCR_INFO(BYTE* ptr, const TPM_PCR_INFO* p) { + ptr = pack_TPM_PCR_SELECTION(ptr, &p->pcrSelection); + ptr = pack_TPM_COMPOSITE_HASH(ptr, &p->digestAtRelease); + ptr = pack_TPM_COMPOSITE_HASH(ptr, &p->digestAtCreation); + return ptr; +} + +inline BYTE* unpack_TPM_PCR_INFO(BYTE* ptr, TPM_PCR_INFO* p, UnpackPtr alloc) { + ptr = unpack_TPM_PCR_SELECTION(ptr, &p->pcrSelection, alloc); + ptr = unpack_TPM_COMPOSITE_HASH(ptr, &p->digestAtRelease); + ptr = unpack_TPM_COMPOSITE_HASH(ptr, &p->digestAtCreation); + return ptr; +} + +inline BYTE* pack_TPM_PCR_COMPOSITE(BYTE* ptr, const TPM_PCR_COMPOSITE* p) { + ptr = pack_TPM_PCR_SELECTION(ptr, &p->select); + ptr = pack_UINT32(ptr, p->valueSize); + ptr = pack_BUFFER(ptr, (const BYTE*)p->pcrValue, p->valueSize); + return ptr; +} + +inline BYTE* unpack_TPM_PCR_COMPOSITE(BYTE* ptr, TPM_PCR_COMPOSITE* p, UnpackPtr alloc) { + ptr = unpack_TPM_PCR_SELECTION(ptr, &p->select, alloc); + ptr = unpack_UINT32(ptr, &p->valueSize); + ptr = unpack_PTR(ptr, (BYTE**)&p->pcrValue, p->valueSize, alloc); + return ptr; +} + +inline BYTE* pack_TPM_KEY(BYTE* ptr, const TPM_KEY* k) { + ptr = pack_TPM_VERSION(ptr, &k->ver); + ptr = pack_TPM_KEY_USAGE(ptr, k->keyUsage); + ptr = pack_TPM_KEY_FLAGS(ptr, k->keyFlags); + ptr = pack_TPM_AUTH_DATA_USAGE(ptr, k->authDataUsage); + ptr = pack_TPM_KEY_PARMS(ptr, &k->algorithmParms); + ptr = pack_UINT32(ptr, k->PCRInfoSize); + if(k->PCRInfoSize) { + ptr = pack_TPM_PCR_INFO(ptr, &k->PCRInfo); + } + ptr = pack_TPM_STORE_PUBKEY(ptr, &k->pubKey); + ptr = pack_UINT32(ptr, k->encDataSize); + return pack_BUFFER(ptr, k->encData, k->encDataSize); +} + +inline BYTE* unpack_TPM_KEY(BYTE* ptr, TPM_KEY* k, UnpackPtr alloc) { + ptr = unpack_TPM_VERSION(ptr, &k->ver); + ptr = unpack_TPM_KEY_USAGE(ptr, &k->keyUsage); + ptr = unpack_TPM_KEY_FLAGS(ptr, &k->keyFlags); + ptr = unpack_TPM_AUTH_DATA_USAGE(ptr, &k->authDataUsage); + ptr = unpack_TPM_KEY_PARMS(ptr, &k->algorithmParms, alloc); + ptr = unpack_UINT32(ptr, &k->PCRInfoSize); + if(k->PCRInfoSize) { + ptr = unpack_TPM_PCR_INFO(ptr, &k->PCRInfo, alloc); + } + ptr = unpack_TPM_STORE_PUBKEY(ptr, &k->pubKey, alloc); + ptr = unpack_UINT32(ptr, &k->encDataSize); + return unpack_PTR(ptr, &k->encData, k->encDataSize, alloc); +} + +inline BYTE* pack_TPM_BOUND_DATA(BYTE* ptr, const TPM_BOUND_DATA* b, UINT32 payloadSize) { + ptr = pack_TPM_VERSION(ptr, &b->ver); + ptr = pack_TPM_PAYLOAD_TYPE(ptr, b->payload); + return pack_BUFFER(ptr, b->payloadData, payloadSize); +} + +inline BYTE* unpack_TPM_BOUND_DATA(BYTE* ptr, TPM_BOUND_DATA* b, UINT32 payloadSize, UnpackPtr alloc) { + ptr = unpack_TPM_VERSION(ptr, &b->ver); + ptr = unpack_TPM_PAYLOAD_TYPE(ptr, &b->payload); + return unpack_PTR(ptr, &b->payloadData, payloadSize, alloc); +} + +inline BYTE* pack_TPM_STORED_DATA(BYTE* ptr, const TPM_STORED_DATA* d) { + ptr = pack_TPM_VERSION(ptr, &d->ver); + ptr = pack_UINT32(ptr, d->sealInfoSize); + if(d->sealInfoSize) { + ptr = pack_TPM_PCR_INFO(ptr, &d->sealInfo); + } + ptr = pack_UINT32(ptr, d->encDataSize); + ptr = pack_BUFFER(ptr, d->encData, d->encDataSize); + return ptr; +} + +inline BYTE* unpack_TPM_STORED_DATA(BYTE* ptr, TPM_STORED_DATA* d, UnpackPtr alloc) { + ptr = unpack_TPM_VERSION(ptr, &d->ver); + ptr = unpack_UINT32(ptr, &d->sealInfoSize); + if(d->sealInfoSize) { + ptr = unpack_TPM_PCR_INFO(ptr, &d->sealInfo, alloc); + } + ptr = unpack_UINT32(ptr, &d->encDataSize); + ptr = unpack_PTR(ptr, &d->encData, d->encDataSize, alloc); + return ptr; +} + +inline BYTE* pack_TPM_AUTH_SESSION(BYTE* ptr, const TPM_AUTH_SESSION* auth) { + ptr = pack_TPM_AUTH_HANDLE(ptr, auth->AuthHandle); + ptr = pack_TPM_NONCE(ptr, &auth->NonceOdd); + ptr = pack_BOOL(ptr, auth->fContinueAuthSession); + ptr = pack_TPM_AUTHDATA(ptr, &auth->HMAC); + return ptr; +} + +inline BYTE* unpack_TPM_AUTH_SESSION(BYTE* ptr, TPM_AUTH_SESSION* auth) { + ptr = unpack_TPM_NONCE(ptr, &auth->NonceEven); + ptr = unpack_BOOL(ptr, &auth->fContinueAuthSession); + ptr = unpack_TPM_AUTHDATA(ptr, &auth->HMAC); + return ptr; +} + +inline BYTE* pack_TPM_RQU_HEADER(BYTE* ptr, + TPM_TAG tag, + UINT32 size, + TPM_COMMAND_CODE ord) { + ptr = pack_UINT16(ptr, tag); + ptr = pack_UINT32(ptr, size); + return pack_UINT32(ptr, ord); +} + +inline BYTE* unpack_TPM_RQU_HEADER(BYTE* ptr, + TPM_TAG* tag, + UINT32* size, + TPM_COMMAND_CODE* ord) { + ptr = unpack_UINT16(ptr, tag); + ptr = unpack_UINT32(ptr, size); + ptr = unpack_UINT32(ptr, ord); + return ptr; +} + +#define pack_TPM_RSP_HEADER(p, t, s, r) pack_TPM_RQU_HEADER(p, t, s, r); +#define unpack_TPM_RSP_HEADER(p, t, s, r) unpack_TPM_RQU_HEADER(p, t, s, r); + +#endif diff -Nru xen-4.2.2/stubdom/vtpmmgr/minios.cfg xen-4.3.0/stubdom/vtpmmgr/minios.cfg --- xen-4.2.2/stubdom/vtpmmgr/minios.cfg 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/minios.cfg 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,14 @@ +CONFIG_TPMFRONT=y +CONFIG_TPM_TIS=y +CONFIG_TPMBACK=y +CONFIG_START_NETWORK=n +CONFIG_TEST=n +CONFIG_PCIFRONT=n +CONFIG_BLKFRONT=y +CONFIG_NETFRONT=n +CONFIG_FBFRONT=n +CONFIG_KBDFRONT=n +CONFIG_CONSFRONT=n +CONFIG_XENBUS=y +CONFIG_LWIP=n +CONFIG_XC=n diff -Nru xen-4.2.2/stubdom/vtpmmgr/tcg.h xen-4.3.0/stubdom/vtpmmgr/tcg.h --- xen-4.2.2/stubdom/vtpmmgr/tcg.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/tcg.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,707 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005 Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __TCG_H__ +#define __TCG_H__ + +#include +#include + +// **************************** CONSTANTS ********************************* + +// BOOL values +#define TRUE 0x01 +#define FALSE 0x00 + +#define TCPA_MAX_BUFFER_LENGTH 0x2000 + +// +// TPM_COMMAND_CODE values +#define TPM_PROTECTED_ORDINAL 0x00000000UL +#define TPM_UNPROTECTED_ORDINAL 0x80000000UL +#define TPM_CONNECTION_ORDINAL 0x40000000UL +#define TPM_VENDOR_ORDINAL 0x20000000UL + +#define TPM_ORD_OIAP (10UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_OSAP (11UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ChangeAuth (12UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_TakeOwnership (13UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ChangeAuthAsymStart (14UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ChangeAuthAsymFinish (15UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ChangeAuthOwner (16UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Extend (20UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_PcrRead (21UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Quote (22UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Seal (23UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Unseal (24UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_DirWriteAuth (25UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_DirRead (26UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_UnBind (30UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_CreateWrapKey (31UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_LoadKey (32UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetPubKey (33UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_EvictKey (34UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_CreateMigrationBlob (40UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ReWrapKey (41UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ConvertMigrationBlob (42UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_AuthorizeMigrationKey (43UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_CreateMaintenanceArchive (44UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_LoadMaintenanceArchive (45UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_KillMaintenanceFeature (46UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_LoadManuMaintPub (47UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ReadManuMaintPub (48UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_CertifyKey (50UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Sign (60UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetRandom (70UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_StirRandom (71UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SelfTestFull (80UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SelfTestStartup (81UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_CertifySelfTest (82UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ContinueSelfTest (83UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetTestResult (84UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Reset (90UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_OwnerClear (91UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_DisableOwnerClear (92UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ForceClear (93UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_DisableForceClear (94UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetCapabilitySigned (100UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetCapability (101UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetCapabilityOwner (102UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_OwnerSetDisable (110UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_PhysicalEnable (111UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_PhysicalDisable (112UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SetOwnerInstall (113UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_PhysicalSetDeactivated (114UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SetTempDeactivated (115UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_CreateEndorsementKeyPair (120UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_MakeIdentity (121UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ActivateIdentity (122UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ReadPubek (124UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_OwnerReadPubek (125UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_DisablePubekRead (126UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetAuditEvent (130UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetAuditEventSigned (131UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetOrdinalAuditStatus (140UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SetOrdinalAuditStatus (141UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Terminate_Handle (150UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Init (151UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SaveState (152UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Startup (153UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SetRedirection (154UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SHA1Start (160UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SHA1Update (161UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SHA1Complete (162UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SHA1CompleteExtend (163UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_FieldUpgrade (170UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SaveKeyContext (180UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_LoadKeyContext (181UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SaveAuthContext (182UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_LoadAuthContext (183UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_SaveContext (184UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_LoadContext (185UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_FlushSpecific (186UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_PCR_Reset (200UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_NV_DefineSpace (204UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_NV_WriteValue (205UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_NV_WriteValueAuth (206UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_NV_ReadValue (207UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_NV_ReadValueAuth (208UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Delegate_UpdateVerification (209UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Delegate_Manage (210UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Delegate_CreateKeyDelegation (212UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Delegate_CreateOwnerDelegation (213UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Delegate_VerifyDelegation (214UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Delegate_LoadOwnerDelegation (216UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Delegate_ReadAuth (217UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_Delegate_ReadTable (219UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_CreateCounter (220UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_IncrementCounter (221UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ReadCounter (222UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ReleaseCounter (223UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ReleaseCounterOwner (224UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_EstablishTransport (230UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ExecuteTransport (231UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_ReleaseTransportSigned (232UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_GetTicks (241UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_TickStampBlob (242UL + TPM_PROTECTED_ORDINAL) +#define TPM_ORD_MAX (256UL + TPM_PROTECTED_ORDINAL) + +#define TSC_ORD_PhysicalPresence (10UL + TPM_CONNECTION_ORDINAL) + + + +// +// TPM_RESULT values +// +// just put in the whole table from spec 1.2 + +#define TPM_BASE 0x0 // The start of TPM return codes +#define TPM_VENDOR_ERROR 0x00000400 // Mask to indicate that the error code is vendor specific for vendor specific commands +#define TPM_NON_FATAL 0x00000800 // Mask to indicate that the error code is a non-fatal failure. + +#define TPM_SUCCESS TPM_BASE // Successful completion of the operation +#define TPM_AUTHFAIL TPM_BASE + 1 // Authentication failed +#define TPM_BADINDEX TPM_BASE + 2 // The index to a PCR, DIR or other register is incorrect +#define TPM_BAD_PARAMETER TPM_BASE + 3 // One or more parameter is bad +#define TPM_AUDITFAILURE TPM_BASE + 4 // An operation completed successfully but the auditing of that operation failed. +#define TPM_CLEAR_DISABLED TPM_BASE + 5 // The clear disable flag is set and all clear operations now require physical access +#define TPM_DEACTIVATED TPM_BASE + 6 // The TPM is deactivated +#define TPM_DISABLED TPM_BASE + 7 // The TPM is disabled +#define TPM_DISABLED_CMD TPM_BASE + 8 // The target command has been disabled +#define TPM_FAIL TPM_BASE + 9 // The operation failed +#define TPM_BAD_ORDINAL TPM_BASE + 10 // The ordinal was unknown or inconsistent +#define TPM_INSTALL_DISABLED TPM_BASE + 11 // The ability to install an owner is disabled +#define TPM_INVALID_KEYHANDLE TPM_BASE + 12 // The key handle presented was invalid +#define TPM_KEYNOTFOUND TPM_BASE + 13 // The target key was not found +#define TPM_INAPPROPRIATE_ENC TPM_BASE + 14 // Unacceptable encryption scheme +#define TPM_MIGRATEFAIL TPM_BASE + 15 // Migration authorization failed +#define TPM_INVALID_PCR_INFO TPM_BASE + 16 // PCR information could not be interpreted +#define TPM_NOSPACE TPM_BASE + 17 // No room to load key. +#define TPM_NOSRK TPM_BASE + 18 // There is no SRK set +#define TPM_NOTSEALED_BLOB TPM_BASE + 19 // An encrypted blob is invalid or was not created by this TPM +#define TPM_OWNER_SET TPM_BASE + 20 // There is already an Owner +#define TPM_RESOURCES TPM_BASE + 21 // The TPM has insufficient internal resources to perform the requested action. +#define TPM_SHORTRANDOM TPM_BASE + 22 // A random string was too short +#define TPM_SIZE TPM_BASE + 23 // The TPM does not have the space to perform the operation. +#define TPM_WRONGPCRVAL TPM_BASE + 24 // The named PCR value does not match the current PCR value. +#define TPM_BAD_PARAM_SIZE TPM_BASE + 25 // The paramSize argument to the command has the incorrect value +#define TPM_SHA_THREAD TPM_BASE + 26 // There is no existing SHA-1 thread. +#define TPM_SHA_ERROR TPM_BASE + 27 // The calculation is unable to proceed because the existing SHA-1 thread has already encountered an error. +#define TPM_FAILEDSELFTEST TPM_BASE + 28 // Self-test has failed and the TPM has shutdown. +#define TPM_AUTH2FAIL TPM_BASE + 29 // The authorization for the second key in a 2 key function failed authorization +#define TPM_BADTAG TPM_BASE + 30 // The tag value sent to for a command is invalid +#define TPM_IOERROR TPM_BASE + 31 // An IO error occurred transmitting information to the TPM +#define TPM_ENCRYPT_ERROR TPM_BASE + 32 // The encryption process had a problem. +#define TPM_DECRYPT_ERROR TPM_BASE + 33 // The decryption process did not complete. +#define TPM_INVALID_AUTHHANDLE TPM_BASE + 34 // An invalid handle was used. +#define TPM_NO_ENDORSEMENT TPM_BASE + 35 // The TPM does not a EK installed +#define TPM_INVALID_KEYUSAGE TPM_BASE + 36 // The usage of a key is not allowed +#define TPM_WRONG_ENTITYTYPE TPM_BASE + 37 // The submitted entity type is not allowed +#define TPM_INVALID_POSTINIT TPM_BASE + 38 // The command was received in the wrong sequence relative to TPM_Init and a subsequent TPM_Startup +#define TPM_INAPPROPRIATE_SIG TPM_BASE + 39 // Signed data cannot include additional DER information +#define TPM_BAD_KEY_PROPERTY TPM_BASE + 40 // The key properties in TPM_KEY_PARMs are not supported by this TPM + +#define TPM_BAD_MIGRATION TPM_BASE + 41 // The migration properties of this key are incorrect. +#define TPM_BAD_SCHEME TPM_BASE + 42 // The signature or encryption scheme for this key is incorrect or not permitted in this situation. +#define TPM_BAD_DATASIZE TPM_BASE + 43 // The size of the data (or blob) parameter is bad or inconsistent with the referenced key +#define TPM_BAD_MODE TPM_BASE + 44 // A mode parameter is bad, such as capArea or subCapArea for TPM_GetCapability, phsicalPresence parameter for TPM_PhysicalPresence, or migrationType for TPM_CreateMigrationBlob. +#define TPM_BAD_PRESENCE TPM_BASE + 45 // Either the physicalPresence or physicalPresenceLock bits have the wrong value +#define TPM_BAD_VERSION TPM_BASE + 46 // The TPM cannot perform this version of the capability +#define TPM_NO_WRAP_TRANSPORT TPM_BASE + 47 // The TPM does not allow for wrapped transport sessions +#define TPM_AUDITFAIL_UNSUCCESSFUL TPM_BASE + 48 // TPM audit construction failed and the underlying command was returning a failure code also +#define TPM_AUDITFAIL_SUCCESSFUL TPM_BASE + 49 // TPM audit construction failed and the underlying command was returning success +#define TPM_NOTRESETABLE TPM_BASE + 50 // Attempt to reset a PCR register that does not have the resettable attribute +#define TPM_NOTLOCAL TPM_BASE + 51 // Attempt to reset a PCR register that requires locality and locality modifier not part of command transport +#define TPM_BAD_TYPE TPM_BASE + 52 // Make identity blob not properly typed +#define TPM_INVALID_RESOURCE TPM_BASE + 53 // When saving context identified resource type does not match actual resource +#define TPM_NOTFIPS TPM_BASE + 54 // The TPM is attempting to execute a command only available when in FIPS mode +#define TPM_INVALID_FAMILY TPM_BASE + 55 // The command is attempting to use an invalid family ID +#define TPM_NO_NV_PERMISSION TPM_BASE + 56 // The permission to manipulate the NV storage is not available +#define TPM_REQUIRES_SIGN TPM_BASE + 57 // The operation requires a signed command +#define TPM_KEY_NOTSUPPORTED TPM_BASE + 58 // Wrong operation to load an NV key +#define TPM_AUTH_CONFLICT TPM_BASE + 59 // NV_LoadKey blob requires both owner and blob authorization +#define TPM_AREA_LOCKED TPM_BASE + 60 // The NV area is locked and not writtable +#define TPM_BAD_LOCALITY TPM_BASE + 61 // The locality is incorrect for the attempted operation +#define TPM_READ_ONLY TPM_BASE + 62 // The NV area is read only and can't be written to +#define TPM_PER_NOWRITE TPM_BASE + 63 // There is no protection on the write to the NV area +#define TPM_FAMILYCOUNT TPM_BASE + 64 // The family count value does not match +#define TPM_WRITE_LOCKED TPM_BASE + 65 // The NV area has already been written to +#define TPM_BAD_ATTRIBUTES TPM_BASE + 66 // The NV area attributes conflict +#define TPM_INVALID_STRUCTURE TPM_BASE + 67 // The structure tag and version are invalid or inconsistent +#define TPM_KEY_OWNER_CONTROL TPM_BASE + 68 // The key is under control of the TPM Owner and can only be evicted by the TPM Owner. +#define TPM_BAD_COUNTER TPM_BASE + 69 // The counter handle is incorrect +#define TPM_NOT_FULLWRITE TPM_BASE + 70 // The write is not a complete write of the area +#define TPM_CONTEXT_GAP TPM_BASE + 71 // The gap between saved context counts is too large +#define TPM_MAXNVWRITES TPM_BASE + 72 // The maximum number of NV writes without an owner has been exceeded +#define TPM_NOOPERATOR TPM_BASE + 73 // No operator authorization value is set +#define TPM_RESOURCEMISSING TPM_BASE + 74 // The resource pointed to by context is not loaded +#define TPM_DELEGATE_LOCK TPM_BASE + 75 // The delegate administration is locked +#define TPM_DELEGATE_FAMILY TPM_BASE + 76 // Attempt to manage a family other then the delegated family +#define TPM_DELEGATE_ADMIN TPM_BASE + 77 // Delegation table management not enabled +#define TPM_TRANSPORT_EXCLUSIVE TPM_BASE + 78 // There was a command executed outside of an exclusive transport session + +// TPM_STARTUP_TYPE values +#define TPM_ST_CLEAR 0x0001 +#define TPM_ST_STATE 0x0002 +#define TPM_ST_DEACTIVATED 0x003 + +// TPM_TAG values +#define TPM_TAG_RQU_COMMAND 0x00c1 +#define TPM_TAG_RQU_AUTH1_COMMAND 0x00c2 +#define TPM_TAG_RQU_AUTH2_COMMAND 0x00c3 +#define TPM_TAG_RSP_COMMAND 0x00c4 +#define TPM_TAG_RSP_AUTH1_COMMAND 0x00c5 +#define TPM_TAG_RSP_AUTH2_COMMAND 0x00c6 + +// TPM_PAYLOAD_TYPE values +#define TPM_PT_ASYM 0x01 +#define TPM_PT_BIND 0x02 +#define TPM_PT_MIGRATE 0x03 +#define TPM_PT_MAINT 0x04 +#define TPM_PT_SEAL 0x05 + +// TPM_ENTITY_TYPE values +#define TPM_ET_KEYHANDLE 0x0001 +#define TPM_ET_OWNER 0x0002 +#define TPM_ET_DATA 0x0003 +#define TPM_ET_SRK 0x0004 +#define TPM_ET_KEY 0x0005 + +/// TPM_ResourceTypes +#define TPM_RT_KEY 0x00000001 +#define TPM_RT_AUTH 0x00000002 +#define TPM_RT_HASH 0x00000003 +#define TPM_RT_TRANS 0x00000004 +#define TPM_RT_CONTEXT 0x00000005 +#define TPM_RT_COUNTER 0x00000006 +#define TPM_RT_DELEGATE 0x00000007 +#define TPM_RT_DAA_TPM 0x00000008 +#define TPM_RT_DAA_V0 0x00000009 +#define TPM_RT_DAA_V1 0x0000000A + + + +// TPM_PROTOCOL_ID values +#define TPM_PID_OIAP 0x0001 +#define TPM_PID_OSAP 0x0002 +#define TPM_PID_ADIP 0x0003 +#define TPM_PID_ADCP 0x0004 +#define TPM_PID_OWNER 0x0005 + +// TPM_ALGORITHM_ID values +#define TPM_ALG_RSA 0x00000001 +#define TPM_ALG_SHA 0x00000004 +#define TPM_ALG_HMAC 0x00000005 +#define TPM_ALG_AES128 0x00000006 +#define TPM_ALG_MFG1 0x00000007 +#define TPM_ALG_AES192 0x00000008 +#define TPM_ALG_AES256 0x00000009 +#define TPM_ALG_XOR 0x0000000A + +// TPM_ENC_SCHEME values +#define TPM_ES_NONE 0x0001 +#define TPM_ES_RSAESPKCSv15 0x0002 +#define TPM_ES_RSAESOAEP_SHA1_MGF1 0x0003 + +// TPM_SIG_SCHEME values +#define TPM_SS_NONE 0x0001 +#define TPM_SS_RSASSAPKCS1v15_SHA1 0x0002 +#define TPM_SS_RSASSAPKCS1v15_DER 0x0003 + +/* + * TPM_CAPABILITY_AREA Values for TPM_GetCapability ([TPM_Part2], Section 21.1) + */ +#define TPM_CAP_ORD 0x00000001 +#define TPM_CAP_ALG 0x00000002 +#define TPM_CAP_PID 0x00000003 +#define TPM_CAP_FLAG 0x00000004 +#define TPM_CAP_PROPERTY 0x00000005 +#define TPM_CAP_VERSION 0x00000006 +#define TPM_CAP_KEY_HANDLE 0x00000007 +#define TPM_CAP_CHECK_LOADED 0x00000008 +#define TPM_CAP_SYM_MODE 0x00000009 +#define TPM_CAP_KEY_STATUS 0x0000000C +#define TPM_CAP_NV_LIST 0x0000000D +#define TPM_CAP_MFR 0x00000010 +#define TPM_CAP_NV_INDEX 0x00000011 +#define TPM_CAP_TRANS_ALG 0x00000012 +#define TPM_CAP_HANDLE 0x00000014 +#define TPM_CAP_TRANS_ES 0x00000015 +#define TPM_CAP_AUTH_ENCRYPT 0x00000017 +#define TPM_CAP_SELECT_SIZE 0x00000018 +#define TPM_CAP_DA_LOGIC 0x00000019 +#define TPM_CAP_VERSION_VAL 0x0000001A + +/* subCap definitions ([TPM_Part2], Section 21.2) */ +#define TPM_CAP_PROP_PCR 0x00000101 +#define TPM_CAP_PROP_DIR 0x00000102 +#define TPM_CAP_PROP_MANUFACTURER 0x00000103 +#define TPM_CAP_PROP_KEYS 0x00000104 +#define TPM_CAP_PROP_MIN_COUNTER 0x00000107 +#define TPM_CAP_FLAG_PERMANENT 0x00000108 +#define TPM_CAP_FLAG_VOLATILE 0x00000109 +#define TPM_CAP_PROP_AUTHSESS 0x0000010A +#define TPM_CAP_PROP_TRANSESS 0x0000010B +#define TPM_CAP_PROP_COUNTERS 0x0000010C +#define TPM_CAP_PROP_MAX_AUTHSESS 0x0000010D +#define TPM_CAP_PROP_MAX_TRANSESS 0x0000010E +#define TPM_CAP_PROP_MAX_COUNTERS 0x0000010F +#define TPM_CAP_PROP_MAX_KEYS 0x00000110 +#define TPM_CAP_PROP_OWNER 0x00000111 +#define TPM_CAP_PROP_CONTEXT 0x00000112 +#define TPM_CAP_PROP_MAX_CONTEXT 0x00000113 +#define TPM_CAP_PROP_FAMILYROWS 0x00000114 +#define TPM_CAP_PROP_TIS_TIMEOUT 0x00000115 +#define TPM_CAP_PROP_STARTUP_EFFECT 0x00000116 +#define TPM_CAP_PROP_DELEGATE_ROW 0x00000117 +#define TPM_CAP_PROP_MAX_DAASESS 0x00000119 +#define TPM_CAP_PROP_DAASESS 0x0000011A +#define TPM_CAP_PROP_CONTEXT_DIST 0x0000011B +#define TPM_CAP_PROP_DAA_INTERRUPT 0x0000011C +#define TPM_CAP_PROP_SESSIONS 0x0000011D +#define TPM_CAP_PROP_MAX_SESSIONS 0x0000011E +#define TPM_CAP_PROP_CMK_RESTRICTION 0x0000011F +#define TPM_CAP_PROP_DURATION 0x00000120 +#define TPM_CAP_PROP_ACTIVE_COUNTER 0x00000122 +#define TPM_CAP_PROP_MAX_NV_AVAILABLE 0x00000123 +#define TPM_CAP_PROP_INPUT_BUFFER 0x00000124 + +// TPM_KEY_USAGE values +#define TPM_KEY_EK 0x0000 +#define TPM_KEY_SIGNING 0x0010 +#define TPM_KEY_STORAGE 0x0011 +#define TPM_KEY_IDENTITY 0x0012 +#define TPM_KEY_AUTHCHANGE 0X0013 +#define TPM_KEY_BIND 0x0014 +#define TPM_KEY_LEGACY 0x0015 + +// TPM_AUTH_DATA_USAGE values +#define TPM_AUTH_NEVER 0x00 +#define TPM_AUTH_ALWAYS 0x01 + +// Key Handle of owner and srk +#define TPM_OWNER_KEYHANDLE 0x40000001 +#define TPM_SRK_KEYHANDLE 0x40000000 + + + +// *************************** TYPEDEFS ********************************* +typedef unsigned char BYTE; +typedef unsigned char BOOL; +typedef uint16_t UINT16; +typedef uint32_t UINT32; +typedef uint64_t UINT64; + +typedef UINT32 TPM_RESULT; +typedef UINT32 TPM_PCRINDEX; +typedef UINT32 TPM_DIRINDEX; +typedef UINT32 TPM_HANDLE; +typedef TPM_HANDLE TPM_AUTHHANDLE; +typedef TPM_HANDLE TCPA_HASHHANDLE; +typedef TPM_HANDLE TCPA_HMACHANDLE; +typedef TPM_HANDLE TCPA_ENCHANDLE; +typedef TPM_HANDLE TPM_KEY_HANDLE; +typedef TPM_HANDLE TCPA_ENTITYHANDLE; +typedef UINT32 TPM_RESOURCE_TYPE; +typedef UINT32 TPM_COMMAND_CODE; +typedef UINT16 TPM_PROTOCOL_ID; +typedef BYTE TPM_AUTH_DATA_USAGE; +typedef UINT16 TPM_ENTITY_TYPE; +typedef UINT32 TPM_ALGORITHM_ID; +typedef UINT16 TPM_KEY_USAGE; +typedef UINT16 TPM_STARTUP_TYPE; +typedef UINT32 TPM_CAPABILITY_AREA; +typedef UINT16 TPM_ENC_SCHEME; +typedef UINT16 TPM_SIG_SCHEME; +typedef UINT16 TPM_MIGRATE_SCHEME; +typedef UINT16 TPM_PHYSICAL_PRESENCE; +typedef UINT32 TPM_KEY_FLAGS; + +#define TPM_DIGEST_SIZE 20 // Don't change this +typedef BYTE TPM_AUTHDATA[TPM_DIGEST_SIZE]; +typedef TPM_AUTHDATA TPM_SECRET; +typedef TPM_AUTHDATA TPM_ENCAUTH; +typedef BYTE TPM_PAYLOAD_TYPE; +typedef UINT16 TPM_TAG; +typedef UINT16 TPM_STRUCTURE_TAG; + +// Data Types of the TCS +typedef UINT32 TCS_AUTHHANDLE; // Handle addressing a authorization session +typedef UINT32 TCS_CONTEXT_HANDLE; // Basic context handle +typedef UINT32 TCS_KEY_HANDLE; // Basic key handle + +// ************************* STRUCTURES ********************************** + +typedef struct TPM_VERSION { + BYTE major; + BYTE minor; + BYTE revMajor; + BYTE revMinor; +} TPM_VERSION; + +static const TPM_VERSION TPM_STRUCT_VER_1_1 = { 1,1,0,0 }; + +typedef struct TPM_CAP_VERSION_INFO { + TPM_STRUCTURE_TAG tag; + TPM_VERSION version; + UINT16 specLevel; + BYTE errataRev; + BYTE tpmVendorID[4]; + UINT16 vendorSpecificSize; + BYTE* vendorSpecific; +} TPM_CAP_VERSION_INFO; + +inline void free_TPM_CAP_VERSION_INFO(TPM_CAP_VERSION_INFO* v) { + free(v->vendorSpecific); + v->vendorSpecific = NULL; +} + +typedef struct TPM_DIGEST { + BYTE digest[TPM_DIGEST_SIZE]; +} TPM_DIGEST; + +typedef TPM_DIGEST TPM_PCRVALUE; +typedef TPM_DIGEST TPM_COMPOSITE_HASH; +typedef TPM_DIGEST TPM_DIRVALUE; +typedef TPM_DIGEST TPM_HMAC; +typedef TPM_DIGEST TPM_CHOSENID_HASH; + +typedef struct TPM_NONCE { + BYTE nonce[TPM_DIGEST_SIZE]; +} TPM_NONCE; + +typedef struct TPM_SYMMETRIC_KEY_PARMS { + UINT32 keyLength; + UINT32 blockSize; + UINT32 ivSize; + BYTE* IV; +} TPM_SYMMETRIC_KEY_PARMS; + +inline void free_TPM_SYMMETRIC_KEY_PARMS(TPM_SYMMETRIC_KEY_PARMS* p) { + free(p->IV); + p->IV = NULL; +} + +#define TPM_SYMMETRIC_KEY_PARMS_INIT { 0, 0, 0, NULL } + +typedef struct TPM_RSA_KEY_PARMS { + UINT32 keyLength; + UINT32 numPrimes; + UINT32 exponentSize; + BYTE* exponent; +} TPM_RSA_KEY_PARMS; + +#define TPM_RSA_KEY_PARMS_INIT { 0, 0, 0, NULL } + +inline void free_TPM_RSA_KEY_PARMS(TPM_RSA_KEY_PARMS* p) { + free(p->exponent); + p->exponent = NULL; +} + +typedef struct TPM_KEY_PARMS { + TPM_ALGORITHM_ID algorithmID; + TPM_ENC_SCHEME encScheme; + TPM_SIG_SCHEME sigScheme; + UINT32 parmSize; + union { + TPM_SYMMETRIC_KEY_PARMS sym; + TPM_RSA_KEY_PARMS rsa; + } parms; +} TPM_KEY_PARMS; + +#define TPM_KEY_PARMS_INIT { 0, 0, 0, 0 } + +inline void free_TPM_KEY_PARMS(TPM_KEY_PARMS* p) { + if(p->parmSize) { + switch(p->algorithmID) { + case TPM_ALG_RSA: + free_TPM_RSA_KEY_PARMS(&p->parms.rsa); + break; + case TPM_ALG_AES128: + case TPM_ALG_AES192: + case TPM_ALG_AES256: + free_TPM_SYMMETRIC_KEY_PARMS(&p->parms.sym); + break; + } + } +} + +typedef struct TPM_STORE_PUBKEY { + UINT32 keyLength; + BYTE* key; +} TPM_STORE_PUBKEY; + +#define TPM_STORE_PUBKEY_INIT { 0, NULL } + +inline void free_TPM_STORE_PUBKEY(TPM_STORE_PUBKEY* p) { + free(p->key); + p->key = NULL; +} + +typedef struct TPM_PUBKEY { + TPM_KEY_PARMS algorithmParms; + TPM_STORE_PUBKEY pubKey; +} TPM_PUBKEY; + +#define TPM_PUBKEY_INIT { TPM_KEY_PARMS_INIT, TPM_STORE_PUBKEY_INIT } + +inline void free_TPM_PUBKEY(TPM_PUBKEY* k) { + free_TPM_KEY_PARMS(&k->algorithmParms); + free_TPM_STORE_PUBKEY(&k->pubKey); +} + +typedef struct TPM_PCR_SELECTION { + UINT16 sizeOfSelect; + BYTE* pcrSelect; +} TPM_PCR_SELECTION; + +#define TPM_PCR_SELECTION_INIT { 0, NULL } + +inline void free_TPM_PCR_SELECTION(TPM_PCR_SELECTION* p) { + free(p->pcrSelect); + p->pcrSelect = NULL; +} + +typedef struct TPM_PCR_INFO { + TPM_PCR_SELECTION pcrSelection; + TPM_COMPOSITE_HASH digestAtRelease; + TPM_COMPOSITE_HASH digestAtCreation; +} TPM_PCR_INFO; + +#define TPM_PCR_INFO_INIT { TPM_PCR_SELECTION_INIT } + +inline void free_TPM_PCR_INFO(TPM_PCR_INFO* p) { + free_TPM_PCR_SELECTION(&p->pcrSelection); +} + +typedef struct TPM_PCR_COMPOSITE { + TPM_PCR_SELECTION select; + UINT32 valueSize; + TPM_PCRVALUE* pcrValue; +} TPM_PCR_COMPOSITE; + +#define TPM_PCR_COMPOSITE_INIT { TPM_PCR_SELECTION_INIT, 0, NULL } + +inline void free_TPM_PCR_COMPOSITE(TPM_PCR_COMPOSITE* p) { + free_TPM_PCR_SELECTION(&p->select); + free(p->pcrValue); + p->pcrValue = NULL; +} + +typedef struct TPM_KEY { + TPM_VERSION ver; + TPM_KEY_USAGE keyUsage; + TPM_KEY_FLAGS keyFlags; + TPM_AUTH_DATA_USAGE authDataUsage; + TPM_KEY_PARMS algorithmParms; + UINT32 PCRInfoSize; + TPM_PCR_INFO PCRInfo; + TPM_STORE_PUBKEY pubKey; + UINT32 encDataSize; + BYTE* encData; +} TPM_KEY; + +#define TPM_KEY_INIT { .algorithmParms = TPM_KEY_PARMS_INIT,\ + .PCRInfoSize = 0, .PCRInfo = TPM_PCR_INFO_INIT, \ + .pubKey = TPM_STORE_PUBKEY_INIT, \ + .encDataSize = 0, .encData = NULL } + +inline void free_TPM_KEY(TPM_KEY* k) { + if(k->PCRInfoSize) { + free_TPM_PCR_INFO(&k->PCRInfo); + } + free_TPM_STORE_PUBKEY(&k->pubKey); + free(k->encData); + k->encData = NULL; +} + +typedef struct TPM_BOUND_DATA { + TPM_VERSION ver; + TPM_PAYLOAD_TYPE payload; + BYTE* payloadData; +} TPM_BOUND_DATA; + +#define TPM_BOUND_DATA_INIT { .payloadData = NULL } + +inline void free_TPM_BOUND_DATA(TPM_BOUND_DATA* d) { + free(d->payloadData); + d->payloadData = NULL; +} + +typedef struct TPM_STORED_DATA { + TPM_VERSION ver; + UINT32 sealInfoSize; + TPM_PCR_INFO sealInfo; + UINT32 encDataSize; + BYTE* encData; +} TPM_STORED_DATA; + +#define TPM_STORED_DATA_INIT { .sealInfoSize = 0, sealInfo = TPM_PCR_INFO_INIT,\ + .encDataSize = 0, .encData = NULL } + +inline void free_TPM_STORED_DATA(TPM_STORED_DATA* d) { + if(d->sealInfoSize) { + free_TPM_PCR_INFO(&d->sealInfo); + } + free(d->encData); + d->encData = NULL; +} + +typedef struct TPM_AUTH_SESSION { + TPM_AUTHHANDLE AuthHandle; + TPM_NONCE NonceOdd; // system + TPM_NONCE NonceEven; // TPM + BOOL fContinueAuthSession; + TPM_AUTHDATA HMAC; +} TPM_AUTH_SESSION; + +#define TPM_AUTH_SESSION_INIT { .AuthHandle = 0, .fContinueAuthSession = FALSE } + +// ---------------------- Functions for checking TPM_RESULTs ----------------- + +#include + +// FIXME: Review use of these and delete unneeded ones. + +// these are really badly dependent on local structure: +// DEPENDS: local var 'status' of type TPM_RESULT +// DEPENDS: label 'abort_egress' which cleans up and returns the status +#define ERRORDIE(s) do { status = s; \ + fprintf (stderr, "*** ERRORDIE in %s at %s: %i\n", __func__, __FILE__, __LINE__); \ + goto abort_egress; } \ + while (0) + +// DEPENDS: local var 'status' of type TPM_RESULT +// DEPENDS: label 'abort_egress' which cleans up and returns the status +// Try command c. If it fails, set status to s and goto abort. +#define TPMTRY(s,c) if (c != TPM_SUCCESS) { \ + status = s; \ + printf("ERROR in %s at %s:%i code: %s.\n", __func__, __FILE__, __LINE__, tpm_get_error_name(status)); \ + goto abort_egress; \ + } else {\ + status = c; \ + } + +// Try command c. If it fails, print error message, set status to actual return code. Goto abort +#define TPMTRYRETURN(c) do { status = c; \ + if (status != TPM_SUCCESS) { \ + fprintf(stderr, "ERROR in %s at %s:%i code: %s.\n", __func__, __FILE__, __LINE__, tpm_get_error_name(status)); \ + goto abort_egress; \ + } \ + } while(0) + + +#endif //__TCPA_H__ diff -Nru xen-4.2.2/stubdom/vtpmmgr/tpm.c xen-4.3.0/stubdom/vtpmmgr/tpm.c --- xen-4.2.2/stubdom/vtpmmgr/tpm.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/tpm.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,938 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include + +#include + +#include "tcg.h" +#include "tpm.h" +#include "log.h" +#include "marshal.h" +#include "tpmrsa.h" +#include "vtpmmgr.h" + +#define TCPA_MAX_BUFFER_LENGTH 0x2000 + +#define TPM_BEGIN(TAG, ORD) \ + const TPM_TAG intag = TAG;\ +TPM_TAG tag = intag;\ +UINT32 paramSize;\ +const TPM_COMMAND_CODE ordinal = ORD;\ +TPM_RESULT status = TPM_SUCCESS;\ +BYTE in_buf[TCPA_MAX_BUFFER_LENGTH];\ +BYTE out_buf[TCPA_MAX_BUFFER_LENGTH];\ +UINT32 out_len = sizeof(out_buf);\ +BYTE* ptr = in_buf;\ +/*Print a log message */\ +vtpmloginfo(VTPM_LOG_TPM, "%s\n", __func__);\ +/* Pack the header*/\ +ptr = pack_TPM_TAG(ptr, tag);\ +ptr += sizeof(UINT32);\ +ptr = pack_TPM_COMMAND_CODE(ptr, ordinal)\ + +#define TPM_AUTH_BEGIN() \ + sha1_context sha1_ctx;\ +BYTE* authbase = ptr - sizeof(TPM_COMMAND_CODE);\ +TPM_DIGEST paramDigest;\ +sha1_starts(&sha1_ctx) + +#define TPM_AUTH1_GEN(HMACkey, auth) do {\ + sha1_finish(&sha1_ctx, paramDigest.digest);\ + generateAuth(¶mDigest, HMACkey, auth);\ + ptr = pack_TPM_AUTH_SESSION(ptr, auth);\ +} while(0) + +#define TPM_AUTH2_GEN(HMACkey, auth) do {\ + generateAuth(¶mDigest, HMACkey, auth);\ + ptr = pack_TPM_AUTH_SESSION(ptr, auth);\ +} while(0) + +#define TPM_TRANSMIT() do {\ + /* Pack the command size */\ + paramSize = ptr - in_buf;\ + pack_UINT32(in_buf + sizeof(TPM_TAG), paramSize);\ + if((status = TPM_TransmitData(in_buf, paramSize, out_buf, &out_len)) != TPM_SUCCESS) {\ + goto abort_egress;\ + }\ +} while(0) + +#define TPM_AUTH_VERIFY_BEGIN() do {\ + UINT32 buf[2] = { cpu_to_be32(status), cpu_to_be32(ordinal) };\ + sha1_starts(&sha1_ctx);\ + sha1_update(&sha1_ctx, (unsigned char*)buf, sizeof(buf));\ + authbase = ptr;\ +} while(0) + +#define TPM_AUTH1_VERIFY(HMACkey, auth) do {\ + sha1_finish(&sha1_ctx, paramDigest.digest);\ + ptr = unpack_TPM_AUTH_SESSION(ptr, auth);\ + if((status = verifyAuth(¶mDigest, HMACkey, auth)) != TPM_SUCCESS) {\ + goto abort_egress;\ + }\ +} while(0) + +#define TPM_AUTH2_VERIFY(HMACkey, auth) do {\ + ptr = unpack_TPM_AUTH_SESSION(ptr, auth);\ + if((status = verifyAuth(¶mDigest, HMACkey, auth)) != TPM_SUCCESS) {\ + goto abort_egress;\ + }\ +} while(0) + + + +#define TPM_UNPACK_VERIFY() do { \ + ptr = out_buf;\ + ptr = unpack_TPM_RSP_HEADER(ptr, \ + &(tag), &(paramSize), &(status));\ + if((status) != TPM_SUCCESS || (tag) != (intag +3)) { \ + vtpmlogerror(VTPM_LOG_TPM, "Failed with return code %s\n", tpm_get_error_name(status));\ + goto abort_egress;\ + }\ +} while(0) + +#define TPM_AUTH_HASH() do {\ + sha1_update(&sha1_ctx, authbase, ptr - authbase);\ + authbase = ptr;\ +} while(0) + +#define TPM_AUTH_SKIP() do {\ + authbase = ptr;\ +} while(0) + +#define TPM_AUTH_ERR_CHECK(auth) do {\ + if(status != TPM_SUCCESS || auth->fContinueAuthSession == FALSE) {\ + vtpmloginfo(VTPM_LOG_TPM, "Auth Session: 0x%x closed by TPM\n", auth->AuthHandle);\ + auth->AuthHandle = 0;\ + }\ +} while(0) + +static void xorEncrypt(const TPM_SECRET* sharedSecret, + TPM_NONCE* nonce, + const TPM_AUTHDATA* inAuth0, + TPM_ENCAUTH outAuth0, + const TPM_AUTHDATA* inAuth1, + TPM_ENCAUTH outAuth1) { + BYTE XORbuffer[sizeof(TPM_SECRET) + sizeof(TPM_NONCE)]; + BYTE XORkey[TPM_DIGEST_SIZE]; + BYTE* ptr = XORbuffer; + ptr = pack_TPM_SECRET(ptr, sharedSecret); + ptr = pack_TPM_NONCE(ptr, nonce); + + sha1(XORbuffer, ptr - XORbuffer, XORkey); + + if(inAuth0) { + for(int i = 0; i < TPM_DIGEST_SIZE; ++i) { + outAuth0[i] = XORkey[i] ^ (*inAuth0)[i]; + } + } + if(inAuth1) { + for(int i = 0; i < TPM_DIGEST_SIZE; ++i) { + outAuth1[i] = XORkey[i] ^ (*inAuth1)[i]; + } + } + +} + +static void generateAuth(const TPM_DIGEST* paramDigest, + const TPM_SECRET* HMACkey, + TPM_AUTH_SESSION *auth) +{ + //Generate new OddNonce + vtpmmgr_rand((BYTE*)auth->NonceOdd.nonce, sizeof(TPM_NONCE)); + + // Create HMAC text. (Concat inParamsDigest with inAuthSetupParams). + BYTE hmacText[sizeof(TPM_DIGEST) + (2 * sizeof(TPM_NONCE)) + sizeof(BOOL)]; + BYTE* ptr = hmacText; + + ptr = pack_TPM_DIGEST(ptr, paramDigest); + ptr = pack_TPM_NONCE(ptr, &auth->NonceEven); + ptr = pack_TPM_NONCE(ptr, &auth->NonceOdd); + ptr = pack_BOOL(ptr, auth->fContinueAuthSession); + + sha1_hmac((BYTE *) HMACkey, sizeof(TPM_DIGEST), + (BYTE *) hmacText, sizeof(hmacText), + auth->HMAC); +} + +static TPM_RESULT verifyAuth(const TPM_DIGEST* paramDigest, + /*[IN]*/ const TPM_SECRET *HMACkey, + /*[IN,OUT]*/ TPM_AUTH_SESSION *auth) +{ + + // Create HMAC text. (Concat inParamsDigest with inAuthSetupParams). + TPM_AUTHDATA hm; + BYTE hmacText[sizeof(TPM_DIGEST) + (2 * sizeof(TPM_NONCE)) + sizeof(BOOL)]; + BYTE* ptr = hmacText; + + ptr = pack_TPM_DIGEST(ptr, paramDigest); + ptr = pack_TPM_NONCE(ptr, &auth->NonceEven); + ptr = pack_TPM_NONCE(ptr, &auth->NonceOdd); + ptr = pack_BOOL(ptr, auth->fContinueAuthSession); + + sha1_hmac( (BYTE *) HMACkey, sizeof(TPM_DIGEST), + (BYTE *) hmacText, sizeof(hmacText), + hm); + + // Compare correct HMAC with provided one. + if (memcmp(hm, auth->HMAC, sizeof(TPM_DIGEST)) == 0) { // 0 indicates equality + return TPM_SUCCESS; + } else { + vtpmlogerror(VTPM_LOG_TPM, "Auth Session verification failed!\n"); + return TPM_AUTHFAIL; + } +} + + + +// ------------------------------------------------------------------ +// Authorization Commands +// ------------------------------------------------------------------ + +TPM_RESULT TPM_OIAP(TPM_AUTH_SESSION* auth) // out +{ + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_OIAP); + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + + memset(&auth->HMAC, 0, sizeof(TPM_DIGEST)); + auth->fContinueAuthSession = TRUE; + + ptr = unpack_UINT32(ptr, &auth->AuthHandle); + ptr = unpack_TPM_NONCE(ptr, &auth->NonceEven); + + vtpmloginfo(VTPM_LOG_TPM, "Auth Session: 0x%x opened by TPM_OIAP.\n", auth->AuthHandle); + +abort_egress: + return status; +} + +TPM_RESULT TPM_OSAP(TPM_ENTITY_TYPE entityType, // in + UINT32 entityValue, // in + const TPM_AUTHDATA* usageAuth, //in + TPM_SECRET *sharedSecret, //out + TPM_AUTH_SESSION *auth) +{ + BYTE* nonceOddOSAP; + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_OSAP); + + ptr = pack_TPM_ENTITY_TYPE(ptr, entityType); + ptr = pack_UINT32(ptr, entityValue); + + //nonce Odd OSAP + nonceOddOSAP = ptr; + vtpmmgr_rand(ptr, TPM_DIGEST_SIZE); + ptr += TPM_DIGEST_SIZE; + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + + ptr = unpack_UINT32(ptr, &auth->AuthHandle); + ptr = unpack_TPM_NONCE(ptr, &auth->NonceEven); + + //Calculate session secret + sha1_context ctx; + sha1_hmac_starts(&ctx, *usageAuth, TPM_DIGEST_SIZE); + sha1_hmac_update(&ctx, ptr, TPM_DIGEST_SIZE); //ptr = nonceEvenOSAP + sha1_hmac_update(&ctx, nonceOddOSAP, TPM_DIGEST_SIZE); + sha1_hmac_finish(&ctx, *sharedSecret); + + memset(&auth->HMAC, 0, sizeof(TPM_DIGEST)); + auth->fContinueAuthSession = FALSE; + + vtpmloginfo(VTPM_LOG_TPM, "Auth Session: 0x%x opened by TPM_OSAP.\n", auth->AuthHandle); + +abort_egress: + return status; +} + +TPM_RESULT TPM_TakeOwnership( + const TPM_PUBKEY *pubEK, //in + const TPM_AUTHDATA* ownerAuth, //in + const TPM_AUTHDATA* srkAuth, //in + const TPM_KEY* inSrk, //in + TPM_KEY* outSrk, //out, optional + TPM_AUTH_SESSION* auth) // in, out +{ + int keyAlloced = 0; + tpmrsa_context ek_rsa = TPMRSA_CTX_INIT; + + TPM_BEGIN(TPM_TAG_RQU_AUTH1_COMMAND, TPM_ORD_TakeOwnership); + TPM_AUTH_BEGIN(); + + tpmrsa_set_pubkey(&ek_rsa, + pubEK->pubKey.key, pubEK->pubKey.keyLength, + pubEK->algorithmParms.parms.rsa.exponent, + pubEK->algorithmParms.parms.rsa.exponentSize); + + /* Pack the protocol ID */ + ptr = pack_UINT16(ptr, TPM_PID_OWNER); + + /* Pack the encrypted owner auth */ + ptr = pack_UINT32(ptr, pubEK->algorithmParms.parms.rsa.keyLength / 8); + tpmrsa_pub_encrypt_oaep(&ek_rsa, + ctr_drbg_random, &vtpm_globals.ctr_drbg, + sizeof(TPM_SECRET), + (BYTE*) ownerAuth, + ptr); + ptr += pubEK->algorithmParms.parms.rsa.keyLength / 8; + + /* Pack the encrypted srk auth */ + ptr = pack_UINT32(ptr, pubEK->algorithmParms.parms.rsa.keyLength / 8); + tpmrsa_pub_encrypt_oaep(&ek_rsa, + ctr_drbg_random, &vtpm_globals.ctr_drbg, + sizeof(TPM_SECRET), + (BYTE*) srkAuth, + ptr); + ptr += pubEK->algorithmParms.parms.rsa.keyLength / 8; + + /* Pack the Srk key */ + ptr = pack_TPM_KEY(ptr, inSrk); + + /* Hash everything up to here */ + TPM_AUTH_HASH(); + + /* Generate the authorization */ + TPM_AUTH1_GEN(ownerAuth, auth); + + /* Send the command to the tpm*/ + TPM_TRANSMIT(); + /* Unpack and validate the header */ + TPM_UNPACK_VERIFY(); + TPM_AUTH_VERIFY_BEGIN(); + + if(outSrk != NULL) { + /* If the user wants a copy of the srk we give it to them */ + keyAlloced = 1; + ptr = unpack_TPM_KEY(ptr, outSrk, UNPACK_ALLOC); + } else { + /*otherwise just parse past it */ + TPM_KEY temp; + ptr = unpack_TPM_KEY(ptr, &temp, UNPACK_ALIAS); + } + + /* Hash the output key */ + TPM_AUTH_HASH(); + + /* Verify authorizaton */ + TPM_AUTH1_VERIFY(ownerAuth, auth); + + goto egress; +abort_egress: + if(keyAlloced) { + free_TPM_KEY(outSrk); + } +egress: + tpmrsa_free(&ek_rsa); + TPM_AUTH_ERR_CHECK(auth); + return status; +} + + +TPM_RESULT TPM_DisablePubekRead ( + const TPM_AUTHDATA* ownerAuth, + TPM_AUTH_SESSION* auth) +{ + TPM_BEGIN(TPM_TAG_RQU_AUTH1_COMMAND, TPM_ORD_DisablePubekRead); + TPM_AUTH_BEGIN(); + + TPM_AUTH_HASH(); + + TPM_AUTH1_GEN(ownerAuth, auth); + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + TPM_AUTH_VERIFY_BEGIN(); + + TPM_AUTH1_VERIFY(ownerAuth, auth); + +abort_egress: + TPM_AUTH_ERR_CHECK(auth); + return status; +} + + +TPM_RESULT TPM_TerminateHandle(TPM_AUTHHANDLE handle) // in +{ + if(handle == 0) { + return TPM_SUCCESS; + } + + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_Terminate_Handle); + + ptr = pack_TPM_AUTHHANDLE(ptr, handle); + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + + vtpmloginfo(VTPM_LOG_TPM, "Auth Session: 0x%x closed by TPM_TerminateHandle\n", handle); + +abort_egress: + return status; +} + +TPM_RESULT TPM_Extend( TPM_PCRINDEX pcrNum, // in + TPM_DIGEST inDigest, // in + TPM_PCRVALUE* outDigest) // out +{ + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_Extend); + + ptr = pack_TPM_PCRINDEX(ptr, pcrNum); + ptr = pack_TPM_DIGEST(ptr, &inDigest); + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + + ptr = unpack_TPM_PCRVALUE(ptr, outDigest); + +abort_egress: + return status; +} + +TPM_RESULT TPM_Seal( + TPM_KEY_HANDLE keyHandle, // in + UINT32 pcrInfoSize, // in + TPM_PCR_INFO* pcrInfo, // in + UINT32 inDataSize, // in + const BYTE* inData, // in + TPM_STORED_DATA* sealedData, //out + const TPM_SECRET* osapSharedSecret, //in + const TPM_AUTHDATA* sealedDataAuth, //in + TPM_AUTH_SESSION* pubAuth // in, out + ) +{ + int dataAlloced = 0; + TPM_BEGIN(TPM_TAG_RQU_AUTH1_COMMAND, TPM_ORD_Seal); + TPM_AUTH_BEGIN(); + + TPM_AUTH_HASH(); + + ptr = pack_TPM_KEY_HANDLE(ptr, keyHandle); + + TPM_AUTH_SKIP(); + + xorEncrypt(osapSharedSecret, &pubAuth->NonceEven, + sealedDataAuth, ptr, + NULL, NULL); + ptr += sizeof(TPM_ENCAUTH); + + ptr = pack_UINT32(ptr, pcrInfoSize); + ptr = pack_TPM_PCR_INFO(ptr, pcrInfo); + + ptr = pack_UINT32(ptr, inDataSize); + ptr = pack_BUFFER(ptr, inData, inDataSize); + + TPM_AUTH_HASH(); + + TPM_AUTH1_GEN(osapSharedSecret, pubAuth); + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + TPM_AUTH_VERIFY_BEGIN(); + + ptr = unpack_TPM_STORED_DATA(ptr, sealedData, UNPACK_ALLOC); + dataAlloced = 1; + + TPM_AUTH_HASH(); + + TPM_AUTH1_VERIFY(osapSharedSecret, pubAuth); + + goto egress; +abort_egress: + if(dataAlloced) { + free_TPM_STORED_DATA(sealedData); + } +egress: + TPM_AUTH_ERR_CHECK(pubAuth); + return status; +} + +TPM_RESULT TPM_Unseal( + TPM_KEY_HANDLE parentHandle, // in + const TPM_STORED_DATA* sealedData, + UINT32* outSize, // out + BYTE** out, //out + const TPM_AUTHDATA* key_usage_auth, //in + const TPM_AUTHDATA* data_usage_auth, //in + TPM_AUTH_SESSION* keyAuth, // in, out + TPM_AUTH_SESSION* dataAuth // in, out + ) +{ + TPM_BEGIN(TPM_TAG_RQU_AUTH2_COMMAND, TPM_ORD_Unseal); + TPM_AUTH_BEGIN(); + + TPM_AUTH_HASH(); + + ptr = pack_TPM_KEY_HANDLE(ptr, parentHandle); + + TPM_AUTH_SKIP(); + + ptr = pack_TPM_STORED_DATA(ptr, sealedData); + + TPM_AUTH_HASH(); + + TPM_AUTH1_GEN(key_usage_auth, keyAuth); + TPM_AUTH2_GEN(data_usage_auth, dataAuth); + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + TPM_AUTH_VERIFY_BEGIN(); + + ptr = unpack_UINT32(ptr, outSize); + ptr = unpack_ALLOC(ptr, out, *outSize); + + TPM_AUTH_HASH(); + + TPM_AUTH1_VERIFY(key_usage_auth, keyAuth); + TPM_AUTH2_VERIFY(data_usage_auth, dataAuth); + +abort_egress: + TPM_AUTH_ERR_CHECK(keyAuth); + TPM_AUTH_ERR_CHECK(dataAuth); + return status; +} + +TPM_RESULT TPM_Bind( + const TPM_KEY* key, + const BYTE* in, + UINT32 ilen, + BYTE* out) +{ + TPM_RESULT status; + tpmrsa_context rsa = TPMRSA_CTX_INIT; + TPM_BOUND_DATA boundData; + uint8_t plain[TCPA_MAX_BUFFER_LENGTH]; + BYTE* ptr = plain; + + vtpmloginfo(VTPM_LOG_TPM, "%s\n", __func__); + + tpmrsa_set_pubkey(&rsa, + key->pubKey.key, key->pubKey.keyLength, + key->algorithmParms.parms.rsa.exponent, + key->algorithmParms.parms.rsa.exponentSize); + + // Fill boundData's accessory information + boundData.ver = TPM_STRUCT_VER_1_1; + boundData.payload = TPM_PT_BIND; + boundData.payloadData = (BYTE*)in; + + //marshall the bound data object + ptr = pack_TPM_BOUND_DATA(ptr, &boundData, ilen); + + // Encrypt the data + TPMTRYRETURN(tpmrsa_pub_encrypt_oaep(&rsa, + ctr_drbg_random, &vtpm_globals.ctr_drbg, + ptr - plain, + plain, + out)); + +abort_egress: + tpmrsa_free(&rsa); + return status; + +} + +TPM_RESULT TPM_UnBind( + TPM_KEY_HANDLE keyHandle, // in + UINT32 ilen, //in + const BYTE* in, // + UINT32* olen, // + BYTE* out, //out + const TPM_AUTHDATA* usage_auth, + TPM_AUTH_SESSION* auth //in, out + ) +{ + TPM_BEGIN(TPM_TAG_RQU_AUTH1_COMMAND, TPM_ORD_UnBind); + TPM_AUTH_BEGIN(); + + TPM_AUTH_HASH(); + + ptr = pack_TPM_KEY_HANDLE(ptr, keyHandle); + + TPM_AUTH_SKIP(); + + ptr = pack_UINT32(ptr, ilen); + ptr = pack_BUFFER(ptr, in, ilen); + + TPM_AUTH_HASH(); + + TPM_AUTH1_GEN(usage_auth, auth); + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + TPM_AUTH_VERIFY_BEGIN(); + + ptr = unpack_UINT32(ptr, olen); + if(*olen > ilen) { + vtpmlogerror(VTPM_LOG_TPM, "Output length < input length!\n"); + status = TPM_IOERROR; + goto abort_egress; + } + ptr = unpack_BUFFER(ptr, out, *olen); + + TPM_AUTH_HASH(); + + TPM_AUTH1_VERIFY(usage_auth, auth); + +abort_egress: +egress: + TPM_AUTH_ERR_CHECK(auth); + return status; +} + +TPM_RESULT TPM_CreateWrapKey( + TPM_KEY_HANDLE hWrappingKey, // in + const TPM_AUTHDATA* osapSharedSecret, + const TPM_AUTHDATA* dataUsageAuth, //in + const TPM_AUTHDATA* dataMigrationAuth, //in + TPM_KEY* key, //in, out + TPM_AUTH_SESSION* pAuth) // in, out +{ + int keyAlloced = 0; + TPM_BEGIN(TPM_TAG_RQU_AUTH1_COMMAND, TPM_ORD_CreateWrapKey); + TPM_AUTH_BEGIN(); + + TPM_AUTH_HASH(); + + ptr = pack_TPM_KEY_HANDLE(ptr, hWrappingKey); + + TPM_AUTH_SKIP(); + + //Encrypted auths + xorEncrypt(osapSharedSecret, &pAuth->NonceEven, + dataUsageAuth, ptr, + dataMigrationAuth, ptr + sizeof(TPM_ENCAUTH)); + ptr += sizeof(TPM_ENCAUTH) * 2; + + ptr = pack_TPM_KEY(ptr, key); + + TPM_AUTH_HASH(); + + TPM_AUTH1_GEN(osapSharedSecret, pAuth); + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + TPM_AUTH_VERIFY_BEGIN(); + + keyAlloced = 1; + ptr = unpack_TPM_KEY(ptr, key, UNPACK_ALLOC); + + TPM_AUTH_HASH(); + + TPM_AUTH1_VERIFY(osapSharedSecret, pAuth); + + goto egress; +abort_egress: + if(keyAlloced) { + free_TPM_KEY(key); + } +egress: + TPM_AUTH_ERR_CHECK(pAuth); + return status; +} + +TPM_RESULT TPM_LoadKey( + TPM_KEY_HANDLE parentHandle, // + const TPM_KEY* key, //in + TPM_HANDLE* keyHandle, // out + const TPM_AUTHDATA* usage_auth, + TPM_AUTH_SESSION* auth) +{ + TPM_BEGIN(TPM_TAG_RQU_AUTH1_COMMAND, TPM_ORD_LoadKey); + TPM_AUTH_BEGIN(); + + TPM_AUTH_HASH(); + + ptr = pack_TPM_KEY_HANDLE(ptr, parentHandle); + + TPM_AUTH_SKIP(); + + ptr = pack_TPM_KEY(ptr, key); + + TPM_AUTH_HASH(); + + TPM_AUTH1_GEN(usage_auth, auth); + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + TPM_AUTH_VERIFY_BEGIN(); + + ptr = unpack_UINT32(ptr, keyHandle); + + TPM_AUTH_HASH(); + + TPM_AUTH1_VERIFY(usage_auth, auth); + + vtpmloginfo(VTPM_LOG_TPM, "Key Handle: 0x%x opened by TPM_LoadKey\n", *keyHandle); + +abort_egress: + TPM_AUTH_ERR_CHECK(auth); + return status; +} + +TPM_RESULT TPM_EvictKey( TPM_KEY_HANDLE hKey) // in +{ + if(hKey == 0) { + return TPM_SUCCESS; + } + + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_EvictKey); + + ptr = pack_TPM_KEY_HANDLE(ptr, hKey); + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + + vtpmloginfo(VTPM_LOG_TPM, "Key handle: 0x%x closed by TPM_EvictKey\n", hKey); + +abort_egress: + return status; +} + +TPM_RESULT TPM_FlushSpecific(TPM_HANDLE handle, + TPM_RESOURCE_TYPE rt) { + if(handle == 0) { + return TPM_SUCCESS; + } + + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_FlushSpecific); + + ptr = pack_TPM_HANDLE(ptr, handle); + ptr = pack_TPM_RESOURCE_TYPE(ptr, rt); + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + +abort_egress: + return status; +} + +TPM_RESULT TPM_GetRandom( UINT32* bytesRequested, // in, out + BYTE* randomBytes) // out +{ + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_GetRandom); + + // check input params + if (bytesRequested == NULL || randomBytes == NULL){ + return TPM_BAD_PARAMETER; + } + + ptr = pack_UINT32(ptr, *bytesRequested); + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + + ptr = unpack_UINT32(ptr, bytesRequested); + ptr = unpack_BUFFER(ptr, randomBytes, *bytesRequested); + +abort_egress: + return status; +} + + +TPM_RESULT TPM_ReadPubek( + TPM_PUBKEY* pubEK //out + ) +{ + BYTE* antiReplay = NULL; + BYTE* kptr = NULL; + BYTE digest[TPM_DIGEST_SIZE]; + sha1_context ctx; + + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_ReadPubek); + + //antiReplay nonce + vtpmmgr_rand(ptr, TPM_DIGEST_SIZE); + antiReplay = ptr; + ptr += TPM_DIGEST_SIZE; + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + + //unpack and allocate the key + kptr = ptr; + ptr = unpack_TPM_PUBKEY(ptr, pubEK, UNPACK_ALLOC); + + //Verify the checksum + sha1_starts(&ctx); + sha1_update(&ctx, kptr, ptr - kptr); + sha1_update(&ctx, antiReplay, TPM_DIGEST_SIZE); + sha1_finish(&ctx, digest); + + //ptr points to the checksum computed by TPM + if(memcmp(digest, ptr, TPM_DIGEST_SIZE)) { + vtpmlogerror(VTPM_LOG_TPM, "TPM_ReadPubek: Checksum returned by TPM was invalid!\n"); + status = TPM_FAIL; + goto abort_egress; + } + + goto egress; +abort_egress: + if(kptr != NULL) { //If we unpacked the pubEK, we have to free it + free_TPM_PUBKEY(pubEK); + } +egress: + return status; +} + + +TPM_RESULT TPM_SaveState(void) +{ + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_SaveState); + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + +abort_egress: + return status; +} + +TPM_RESULT TPM_GetCapability( + TPM_CAPABILITY_AREA capArea, + UINT32 subCapSize, + const BYTE* subCap, + UINT32* respSize, + BYTE** resp) +{ + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_GetCapability); + + ptr = pack_TPM_CAPABILITY_AREA(ptr, capArea); + ptr = pack_UINT32(ptr, subCapSize); + ptr = pack_BUFFER(ptr, subCap, subCapSize); + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + + ptr = unpack_UINT32(ptr, respSize); + ptr = unpack_ALLOC(ptr, resp, *respSize); + +abort_egress: + return status; +} + +TPM_RESULT TPM_CreateEndorsementKeyPair( + const TPM_KEY_PARMS* keyInfo, + TPM_PUBKEY* pubEK) +{ + BYTE* kptr = NULL; + sha1_context ctx; + TPM_DIGEST checksum; + TPM_DIGEST hash; + TPM_NONCE antiReplay; + TPM_BEGIN(TPM_TAG_RQU_COMMAND, TPM_ORD_CreateEndorsementKeyPair); + + //Make anti replay nonce + vtpmmgr_rand(antiReplay.nonce, sizeof(antiReplay.nonce)); + + ptr = pack_TPM_NONCE(ptr, &antiReplay); + ptr = pack_TPM_KEY_PARMS(ptr, keyInfo); + + TPM_TRANSMIT(); + TPM_UNPACK_VERIFY(); + + sha1_starts(&ctx); + + kptr = ptr; + ptr = unpack_TPM_PUBKEY(ptr, pubEK, UNPACK_ALLOC); + + /* Hash the pub key blob */ + sha1_update(&ctx, kptr, ptr - kptr); + ptr = unpack_TPM_DIGEST(ptr, &checksum); + + sha1_update(&ctx, antiReplay.nonce, sizeof(antiReplay.nonce)); + + sha1_finish(&ctx, hash.digest); + if(memcmp(checksum.digest, hash.digest, TPM_DIGEST_SIZE)) { + vtpmloginfo(VTPM_LOG_VTPM, "TPM_CreateEndorsementKey: Checkum verification failed!\n"); + status = TPM_FAIL; + goto abort_egress; + } + + goto egress; +abort_egress: + if(kptr) { + free_TPM_PUBKEY(pubEK); + } +egress: + return status; +} + +TPM_RESULT TPM_TransmitData( + BYTE* in, + UINT32 insize, + BYTE* out, + UINT32* outsize) { + TPM_RESULT status = TPM_SUCCESS; + + UINT32 i; + vtpmloginfo(VTPM_LOG_TXDATA, "Sending buffer = 0x"); + for(i = 0 ; i < insize ; i++) + vtpmloginfomore(VTPM_LOG_TXDATA, "%2.2x ", in[i]); + + vtpmloginfomore(VTPM_LOG_TXDATA, "\n"); + + ssize_t size = 0; + + // send the request + size = write (vtpm_globals.tpm_fd, in, insize); + if (size < 0) { + vtpmlogerror(VTPM_LOG_TXDATA, "write() failed : %s\n", strerror(errno)); + ERRORDIE (TPM_IOERROR); + } + else if ((UINT32) size < insize) { + vtpmlogerror(VTPM_LOG_TXDATA, "Wrote %d instead of %d bytes!\n", (int) size, insize); + ERRORDIE (TPM_IOERROR); + } + + // read the response + size = read (vtpm_globals.tpm_fd, out, *outsize); + if (size < 0) { + vtpmlogerror(VTPM_LOG_TXDATA, "read() failed : %s\n", strerror(errno)); + ERRORDIE (TPM_IOERROR); + } + + vtpmloginfo(VTPM_LOG_TXDATA, "Receiving buffer = 0x"); + for(i = 0 ; i < size ; i++) + vtpmloginfomore(VTPM_LOG_TXDATA, "%2.2x ", out[i]); + + vtpmloginfomore(VTPM_LOG_TXDATA, "\n"); + + *outsize = size; + goto egress; + +abort_egress: +egress: + return status; +} diff -Nru xen-4.2.2/stubdom/vtpmmgr/tpm.h xen-4.3.0/stubdom/vtpmmgr/tpm.h --- xen-4.2.2/stubdom/vtpmmgr/tpm.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/tpm.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005/2006, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __TPM_H__ +#define __TPM_H__ + +#include "tcg.h" + +// ------------------------------------------------------------------ +// Exposed API +// ------------------------------------------------------------------ + +// TPM v1.1B Command Set + +// Authorzation +TPM_RESULT TPM_OIAP( + TPM_AUTH_SESSION* auth //out + ); + +TPM_RESULT TPM_OSAP ( + TPM_ENTITY_TYPE entityType, // in + UINT32 entityValue, // in + const TPM_AUTHDATA* usageAuth, //in + TPM_SECRET *sharedSecret, //out + TPM_AUTH_SESSION *auth); + +TPM_RESULT TPM_TakeOwnership( + const TPM_PUBKEY *pubEK, //in + const TPM_AUTHDATA* ownerAuth, //in + const TPM_AUTHDATA* srkAuth, //in + const TPM_KEY* inSrk, //in + TPM_KEY* outSrk, //out, optional + TPM_AUTH_SESSION* auth // in, out + ); + +TPM_RESULT TPM_DisablePubekRead ( + const TPM_AUTHDATA* ownerAuth, + TPM_AUTH_SESSION* auth + ); + +TPM_RESULT TPM_TerminateHandle ( TPM_AUTHHANDLE handle // in + ); + +TPM_RESULT TPM_FlushSpecific ( TPM_HANDLE handle, // in + TPM_RESOURCE_TYPE resourceType //in + ); + +// TPM Mandatory +TPM_RESULT TPM_Extend ( TPM_PCRINDEX pcrNum, // in + TPM_DIGEST inDigest, // in + TPM_PCRVALUE* outDigest // out + ); + +TPM_RESULT TPM_PcrRead ( TPM_PCRINDEX pcrNum, // in + TPM_PCRVALUE* outDigest // out + ); + +TPM_RESULT TPM_Quote ( TCS_KEY_HANDLE keyHandle, // in + TPM_NONCE antiReplay, // in + UINT32* PcrDataSize, // in, out + BYTE** PcrData, // in, out + TPM_AUTH_SESSION* privAuth, // in, out + UINT32* sigSize, // out + BYTE** sig // out + ); + +TPM_RESULT TPM_Seal( + TCS_KEY_HANDLE keyHandle, // in + UINT32 pcrInfoSize, // in + TPM_PCR_INFO* pcrInfo, // in + UINT32 inDataSize, // in + const BYTE* inData, // in + TPM_STORED_DATA* sealedData, //out + const TPM_SECRET* osapSharedSecret, //in + const TPM_AUTHDATA* sealDataAuth, //in + TPM_AUTH_SESSION* pubAuth // in, out + ); + +TPM_RESULT TPM_Unseal ( + TPM_KEY_HANDLE parentHandle, // in + const TPM_STORED_DATA* sealedData, + UINT32* outSize, // out + BYTE** out, //out + const TPM_AUTHDATA* key_usage_auth, //in + const TPM_AUTHDATA* data_usage_auth, //in + TPM_AUTH_SESSION* keyAuth, // in, out + TPM_AUTH_SESSION* dataAuth // in, out + ); + +TPM_RESULT TPM_DirWriteAuth ( TPM_DIRINDEX dirIndex, // in + TPM_DIRVALUE newContents, // in + TPM_AUTH_SESSION* ownerAuth // in, out + ); + +TPM_RESULT TPM_DirRead ( TPM_DIRINDEX dirIndex, // in + TPM_DIRVALUE* dirValue // out + ); + +TPM_RESULT TPM_Bind( + const TPM_KEY* key, //in + const BYTE* in, //in + UINT32 ilen, //in + BYTE* out //out, must be at least cipher block size + ); + +TPM_RESULT TPM_UnBind ( + TCS_KEY_HANDLE keyHandle, // in + UINT32 ilen, //in + const BYTE* in, // + UINT32* outDataSize, // out + BYTE* outData, //out + const TPM_AUTHDATA* usage_auth, + TPM_AUTH_SESSION* auth //in, out + ); + +TPM_RESULT TPM_CreateWrapKey ( + TCS_KEY_HANDLE hWrappingKey, // in + const TPM_AUTHDATA* osapSharedSecret, + const TPM_AUTHDATA* dataUsageAuth, //in + const TPM_AUTHDATA* dataMigrationAuth, //in + TPM_KEY* key, //in + TPM_AUTH_SESSION* pAuth // in, out + ); + +TPM_RESULT TPM_LoadKey ( + TPM_KEY_HANDLE parentHandle, // + const TPM_KEY* key, //in + TPM_HANDLE* keyHandle, // out + const TPM_AUTHDATA* usage_auth, + TPM_AUTH_SESSION* auth + ); + +TPM_RESULT TPM_GetPubKey ( TCS_KEY_HANDLE hKey, // in + TPM_AUTH_SESSION* pAuth, // in, out + UINT32* pcPubKeySize, // out + BYTE** prgbPubKey // out + ); + +TPM_RESULT TPM_EvictKey ( TCS_KEY_HANDLE hKey // in + ); + +TPM_RESULT TPM_FlushSpecific(TPM_HANDLE handle, //in + TPM_RESOURCE_TYPE rt //in + ); + +TPM_RESULT TPM_Sign ( TCS_KEY_HANDLE keyHandle, // in + UINT32 areaToSignSize, // in + BYTE* areaToSign, // in + TPM_AUTH_SESSION* privAuth, // in, out + UINT32* sigSize, // out + BYTE** sig // out + ); + +TPM_RESULT TPM_GetRandom ( UINT32* bytesRequested, // in, out + BYTE* randomBytes // out + ); + +TPM_RESULT TPM_StirRandom ( UINT32 inDataSize, // in + BYTE* inData // in + ); + +TPM_RESULT TPM_ReadPubek ( + TPM_PUBKEY* pubEK //out + ); + +TPM_RESULT TPM_GetCapability( + TPM_CAPABILITY_AREA capArea, + UINT32 subCapSize, + const BYTE* subCap, + UINT32* respSize, + BYTE** resp); + +TPM_RESULT TPM_SaveState(void); + +TPM_RESULT TPM_CreateEndorsementKeyPair( + const TPM_KEY_PARMS* keyInfo, + TPM_PUBKEY* pubEK); + +TPM_RESULT TPM_TransmitData( + BYTE* in, + UINT32 insize, + BYTE* out, + UINT32* outsize); + +#endif //TPM_H diff -Nru xen-4.2.2/stubdom/vtpmmgr/tpmrsa.c xen-4.3.0/stubdom/vtpmmgr/tpmrsa.c --- xen-4.2.2/stubdom/vtpmmgr/tpmrsa.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/tpmrsa.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,175 @@ +/* + * The RSA public-key cryptosystem + * + * Copyright (C) 2006-2011, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* + * RSA was designed by Ron Rivest, Adi Shamir and Len Adleman. + * + * http://theory.lcs.mit.edu/~rivest/rsapaper.pdf + * http://www.cacr.math.uwaterloo.ca/hac/about/chap8.pdf + */ + +#include "tcg.h" +#include "polarssl/sha1.h" + +#include +#include + +#include "tpmrsa.h" + +#define HASH_LEN 20 + +void tpmrsa_set_pubkey(tpmrsa_context* ctx, + const unsigned char* key, + int keylen, + const unsigned char* exponent, + int explen) { + + tpmrsa_free(ctx); + + if(explen == 0) { //Default e= 2^16+1 + mpi_lset(&ctx->E, 65537); + } else { + mpi_read_binary(&ctx->E, exponent, explen); + } + mpi_read_binary(&ctx->N, key, keylen); + + ctx->len = ( mpi_msb(&ctx->N) + 7) >> 3; +} + +static TPM_RESULT tpmrsa_public( tpmrsa_context *ctx, + const unsigned char *input, + unsigned char *output ) +{ + int ret; + size_t olen; + mpi T; + + mpi_init( &T ); + + MPI_CHK( mpi_read_binary( &T, input, ctx->len ) ); + + if( mpi_cmp_mpi( &T, &ctx->N ) >= 0 ) + { + mpi_free( &T ); + return TPM_ENCRYPT_ERROR; + } + + olen = ctx->len; + MPI_CHK( mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) ); + MPI_CHK( mpi_write_binary( &T, output, olen ) ); + +cleanup: + + mpi_free( &T ); + + if( ret != 0 ) + return TPM_ENCRYPT_ERROR; + + return TPM_SUCCESS; +} + +static void mgf_mask( unsigned char *dst, int dlen, unsigned char *src, int slen) +{ + unsigned char mask[HASH_LEN]; + unsigned char counter[4] = {0, 0, 0, 0}; + int i; + sha1_context mctx; + + //We always hash the src with the counter, so save the partial hash + sha1_starts(&mctx); + sha1_update(&mctx, src, slen); + + // Generate and apply dbMask + while(dlen > 0) { + //Copy the sha1 context + sha1_context ctx = mctx; + + //compute hash for input || counter + sha1_update(&ctx, counter, sizeof(counter)); + sha1_finish(&ctx, mask); + + //Apply the mask + for(i = 0; i < (dlen < HASH_LEN ? dlen : HASH_LEN); ++i) { + *(dst++) ^= mask[i]; + } + + //Increment counter + ++counter[3]; + + dlen -= HASH_LEN; + } +} + +/* + * Add the message padding, then do an RSA operation + */ +TPM_RESULT tpmrsa_pub_encrypt_oaep( tpmrsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + size_t ilen, + const unsigned char *input, + unsigned char *output ) +{ + int ret; + int olen; + unsigned char* seed = output + 1; + unsigned char* db = output + HASH_LEN +1; + + olen = ctx->len-1; + + if( f_rng == NULL ) + return TPM_ENCRYPT_ERROR; + + if( ilen > olen - 2 * HASH_LEN - 1) + return TPM_ENCRYPT_ERROR; + + output[0] = 0; + + //Encoding parameter p + sha1((unsigned char*)"TCPA", 4, db); + + //PS + memset(db + HASH_LEN, 0, + olen - ilen - 2 * HASH_LEN - 1); + + //constant 1 byte + db[olen - ilen - HASH_LEN -1] = 0x01; + + //input string + memcpy(db + olen - ilen - HASH_LEN, + input, ilen); + + //Generate random seed + if( ( ret = f_rng( p_rng, seed, HASH_LEN ) ) != 0 ) + return TPM_ENCRYPT_ERROR; + + // maskedDB: Apply dbMask to DB + mgf_mask( db, olen - HASH_LEN, seed, HASH_LEN); + + // maskedSeed: Apply seedMask to seed + mgf_mask( seed, HASH_LEN, db, olen - HASH_LEN); + + // Do the crypto op + return tpmrsa_public(ctx, output, output); +} diff -Nru xen-4.2.2/stubdom/vtpmmgr/tpmrsa.h xen-4.3.0/stubdom/vtpmmgr/tpmrsa.h --- xen-4.2.2/stubdom/vtpmmgr/tpmrsa.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/tpmrsa.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,67 @@ +/** + * \file rsa.h + * + * \brief The RSA public-key cryptosystem + * + * Copyright (C) 2006-2010, Brainspark B.V. + * + * This file is part of PolarSSL (http://www.polarssl.org) + * Lead Maintainer: Paul Bakker + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +#ifndef TPMRSA_H +#define TPMRSA_H + +#include "tcg.h" +#include + +/* tpm software key */ +typedef struct +{ + size_t len; /*!< size(N) in chars */ + + mpi N; /*!< public modulus */ + mpi E; /*!< public exponent */ + + mpi RN; /*!< cached R^2 mod N */ +} +tpmrsa_context; + +#define TPMRSA_CTX_INIT { 0, {0, 0, NULL}, {0, 0, NULL}, {0, 0, NULL}} + +/* Setup the rsa context using tpm public key data */ +void tpmrsa_set_pubkey(tpmrsa_context* ctx, + const unsigned char* key, + int keylen, + const unsigned char* exponent, + int explen); + +/* Do rsa public crypto */ +TPM_RESULT tpmrsa_pub_encrypt_oaep( tpmrsa_context *ctx, + int (*f_rng)(void *, unsigned char *, size_t), + void *p_rng, + size_t ilen, + const unsigned char *input, + unsigned char *output ); + +/* free tpmrsa key */ +inline void tpmrsa_free( tpmrsa_context *ctx ) { + mpi_free( &ctx->RN ); mpi_free( &ctx->E ); mpi_free( &ctx->N ); +} + +#endif /* tpmrsa.h */ diff -Nru xen-4.2.2/stubdom/vtpmmgr/uuid.h xen-4.3.0/stubdom/vtpmmgr/uuid.h --- xen-4.2.2/stubdom/vtpmmgr/uuid.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/uuid.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef VTPMMGR_UUID_H +#define VTPMMGR_UUID_H + +#define UUID_FMT "%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx" +#define UUID_FMTLEN ((2*16)+4) /* 16 hex bytes plus 4 hypens */ +#define UUID_BYTES(uuid) uuid[0], uuid[1], uuid[2], uuid[3], \ + uuid[4], uuid[5], uuid[6], uuid[7], \ + uuid[8], uuid[9], uuid[10], uuid[11], \ + uuid[12], uuid[13], uuid[14], uuid[15] + + +typedef uint8_t uuid_t[16]; + +#endif diff -Nru xen-4.2.2/stubdom/vtpmmgr/vtpm_cmd_handler.c xen-4.3.0/stubdom/vtpmmgr/vtpm_cmd_handler.c --- xen-4.2.2/stubdom/vtpmmgr/vtpm_cmd_handler.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/vtpm_cmd_handler.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include + +#include "marshal.h" +#include "log.h" +#include "vtpm_storage.h" +#include "vtpmmgr.h" +#include "tpm.h" +#include "tcg.h" + +static TPM_RESULT vtpmmgr_SaveHashKey( + const uuid_t uuid, + tpmcmd_t* tpmcmd) +{ + TPM_RESULT status = TPM_SUCCESS; + + if(tpmcmd->req_len != VTPM_COMMAND_HEADER_SIZE + HASHKEYSZ) { + vtpmlogerror(VTPM_LOG_VTPM, "VTPM_ORD_SAVEHASHKEY hashkey too short!\n"); + status = TPM_BAD_PARAMETER; + goto abort_egress; + } + + /* Do the command */ + TPMTRYRETURN(vtpm_storage_save_hashkey(uuid, tpmcmd->req + VTPM_COMMAND_HEADER_SIZE)); + +abort_egress: + pack_TPM_RSP_HEADER(tpmcmd->resp, + VTPM_TAG_RSP, VTPM_COMMAND_HEADER_SIZE, status); + tpmcmd->resp_len = VTPM_COMMAND_HEADER_SIZE; + + return status; +} + +static TPM_RESULT vtpmmgr_LoadHashKey( + const uuid_t uuid, + tpmcmd_t* tpmcmd) { + TPM_RESULT status = TPM_SUCCESS; + + tpmcmd->resp_len = VTPM_COMMAND_HEADER_SIZE; + + TPMTRYRETURN(vtpm_storage_load_hashkey(uuid, tpmcmd->resp + VTPM_COMMAND_HEADER_SIZE)); + + tpmcmd->resp_len += HASHKEYSZ; + +abort_egress: + pack_TPM_RSP_HEADER(tpmcmd->resp, + VTPM_TAG_RSP, tpmcmd->resp_len, status); + + return status; +} + + +TPM_RESULT vtpmmgr_handle_cmd( + const uuid_t uuid, + tpmcmd_t* tpmcmd) +{ + TPM_RESULT status = TPM_SUCCESS; + TPM_TAG tag; + UINT32 size; + TPM_COMMAND_CODE ord; + + unpack_TPM_RQU_HEADER(tpmcmd->req, + &tag, &size, &ord); + + /* Handle the command now */ + switch(tag) { + case VTPM_TAG_REQ: + //This is a vTPM command + switch(ord) { + case VTPM_ORD_SAVEHASHKEY: + return vtpmmgr_SaveHashKey(uuid, tpmcmd); + case VTPM_ORD_LOADHASHKEY: + return vtpmmgr_LoadHashKey(uuid, tpmcmd); + default: + vtpmlogerror(VTPM_LOG_VTPM, "Invalid vTPM Ordinal %" PRIu32 "\n", ord); + status = TPM_BAD_ORDINAL; + } + break; + case TPM_TAG_RQU_COMMAND: + case TPM_TAG_RQU_AUTH1_COMMAND: + case TPM_TAG_RQU_AUTH2_COMMAND: + //This is a TPM passthrough command + switch(ord) { + case TPM_ORD_GetRandom: + vtpmloginfo(VTPM_LOG_VTPM, "Passthrough: TPM_GetRandom\n"); + break; + case TPM_ORD_PcrRead: + vtpmloginfo(VTPM_LOG_VTPM, "Passthrough: TPM_PcrRead\n"); + break; + default: + vtpmlogerror(VTPM_LOG_VTPM, "TPM Disallowed Passthrough ord=%" PRIu32 "\n", ord); + status = TPM_DISABLED_CMD; + goto abort_egress; + } + + size = TCPA_MAX_BUFFER_LENGTH; + TPMTRYRETURN(TPM_TransmitData(tpmcmd->req, tpmcmd->req_len, tpmcmd->resp, &size)); + tpmcmd->resp_len = size; + + unpack_TPM_RESULT(tpmcmd->resp + sizeof(TPM_TAG) + sizeof(UINT32), &status); + return status; + + break; + default: + vtpmlogerror(VTPM_LOG_VTPM, "Invalid tag=%" PRIu16 "\n", tag); + status = TPM_BADTAG; + } + +abort_egress: + tpmcmd->resp_len = VTPM_COMMAND_HEADER_SIZE; + pack_TPM_RSP_HEADER(tpmcmd->resp, + tag + 3, tpmcmd->resp_len, status); + + return status; +} diff -Nru xen-4.2.2/stubdom/vtpmmgr/vtpm_manager.h xen-4.3.0/stubdom/vtpmmgr/vtpm_manager.h --- xen-4.2.2/stubdom/vtpmmgr/vtpm_manager.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/vtpm_manager.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef VTPM_MANAGER_H +#define VTPM_MANAGER_H + +#define VTPM_TAG_REQ 0x01c1 +#define VTPM_TAG_RSP 0x01c4 +#define COMMAND_BUFFER_SIZE 4096 + +// Header size +#define VTPM_COMMAND_HEADER_SIZE ( 2 + 4 + 4) + +//************************ Command Codes **************************** +#define VTPM_ORD_BASE 0x0000 +#define VTPM_PRIV_MASK 0x01000000 // Priviledged VTPM Command +#define VTPM_PRIV_BASE (VTPM_ORD_BASE | VTPM_PRIV_MASK) + +// Non-priviledged VTPM Commands (From DMI's) +#define VTPM_ORD_SAVEHASHKEY (VTPM_ORD_BASE + 1) // DMI requests encryption key for persistent storage +#define VTPM_ORD_LOADHASHKEY (VTPM_ORD_BASE + 2) // DMI requests symkey to be regenerated + +//************************ Return Codes **************************** +#define VTPM_SUCCESS 0 +#define VTPM_FAIL 1 +#define VTPM_UNSUPPORTED 2 +#define VTPM_FORBIDDEN 3 +#define VTPM_RESTORE_CONTEXT_FAILED 4 +#define VTPM_INVALID_REQUEST 5 + +#endif diff -Nru xen-4.2.2/stubdom/vtpmmgr/vtpm_storage.c xen-4.3.0/stubdom/vtpmmgr/vtpm_storage.c --- xen-4.2.2/stubdom/vtpmmgr/vtpm_storage.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/vtpm_storage.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,794 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * THIS SOFTWARE AND ITS DOCUMENTATION ARE PROVIDED AS IS AND WITHOUT + * ANY EXPRESS OR IMPLIED WARRANTIES WHATSOEVER. ALL WARRANTIES + * INCLUDING, BUT NOT LIMITED TO, PERFORMANCE, MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT ARE HEREBY + * DISCLAIMED. USERS ASSUME THE ENTIRE RISK AND LIABILITY OF USING THE + * SOFTWARE. + */ + +/*************************************************************** + * DISK IMAGE LAYOUT + * ************************************************************* + * All data is stored in BIG ENDIAN format + * ************************************************************* + * Section 1: Header + * + * 10 bytes id ID String "VTPMMGRDOM" + * uint32_t version Disk Image version number (current == 1) + * uint32_t storage_key_len Length of the storage Key + * TPM_KEY storage_key Marshalled TPM_KEY structure (See TPM spec v2) + * RSA_BLOCK aes_crypto Encrypted aes key data (RSA_CIPHER_SIZE bytes), bound by the storage_key + * BYTE[32] aes_key Aes key for encrypting the uuid table + * uint32_t cipher_sz Encrypted size of the uuid table + * + * ************************************************************* + * Section 2: Uuid Table + * + * This table is encrypted by the aes_key in the header. The cipher text size is just + * large enough to hold all of the entries plus required padding. + * + * Each entry is as follows + * BYTE[16] uuid Uuid of a vtpm that is stored on this disk + * uint32_t offset Disk offset where the vtpm data is stored + * + * ************************************************************* + * Section 3: Vtpm Table + * + * The rest of the disk stores vtpms. Each vtpm is an RSA_BLOCK encrypted + * by the storage key. Each vtpm must exist on an RSA_BLOCK aligned boundary, + * starting at the first RSA_BLOCK aligned offset after the uuid table. + * As the uuid table grows, vtpms may be relocated. + * + * RSA_BLOCK vtpm_crypto Vtpm data encrypted by storage_key + * BYTE[20] hash Sha1 hash of vtpm encrypted data + * BYTE[16] vtpm_aes_key Encryption key for vtpm data + * + ************************************************************* + */ +#define DISKVERS 1 +#define IDSTR "VTPMMGRDOM" +#define IDSTRLEN 10 +#define AES_BLOCK_SIZE 16 +#define AES_KEY_BITS 256 +#define AES_KEY_SIZE (AES_KEY_BITS/8) +#define BUF_SIZE 4096 + +#define UUID_TBL_ENT_SIZE (sizeof(uuid_t) + sizeof(uint32_t)) + +#define HEADERSZ (10 + 4 + 4) + +#define TRY_READ(buf, size, msg) do {\ + int rc; \ + if((rc = read(blkfront_fd, buf, (size))) != (size)) { \ + vtpmlogerror(VTPM_LOG_VTPM, "read() failed! " msg " : rc=(%d/%d), error=(%s)\n", rc, (int)(size), strerror(errno)); \ + status = TPM_IOERROR;\ + goto abort_egress;\ + } \ +} while(0) + +#define TRY_WRITE(buf, size, msg) do {\ + int rc; \ + if((rc = write(blkfront_fd, buf, (size))) != (size)) { \ + vtpmlogerror(VTPM_LOG_VTPM, "write() failed! " msg " : rc=(%d/%d), error=(%s)\n", rc, (int)(size), strerror(errno)); \ + status = TPM_IOERROR;\ + goto abort_egress;\ + } \ +} while(0) + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "vtpm_manager.h" +#include "log.h" +#include "marshal.h" +#include "tpm.h" +#include "uuid.h" + +#include "vtpmmgr.h" +#include "vtpm_storage.h" + +#define MAX(a,b) ( ((a) > (b)) ? (a) : (b) ) +#define MIN(a,b) ( ((a) < (b)) ? (a) : (b) ) + +/* blkfront device objets */ +static struct blkfront_dev* blkdev = NULL; +static int blkfront_fd = -1; + +struct Vtpm { + uuid_t uuid; + int offset; +}; +struct Storage { + int aes_offset; + int uuid_offset; + int end_offset; + + int num_vtpms; + int num_vtpms_alloced; + struct Vtpm* vtpms; +}; + +/* Global storage data */ +static struct Storage g_store = { + .vtpms = NULL, +}; + +static int get_offset(void) { + return lseek(blkfront_fd, 0, SEEK_CUR); +} + +static void reset_store(void) { + g_store.aes_offset = 0; + g_store.uuid_offset = 0; + g_store.end_offset = 0; + + g_store.num_vtpms = 0; + g_store.num_vtpms_alloced = 0; + free(g_store.vtpms); + g_store.vtpms = NULL; +} + +static int vtpm_get_index(const uuid_t uuid) { + int st = 0; + int ed = g_store.num_vtpms-1; + while(st <= ed) { + int mid = ((unsigned int)st + (unsigned int)ed) >> 1; //avoid overflow + int c = memcmp(uuid, &g_store.vtpms[mid].uuid, sizeof(uuid_t)); + if(c == 0) { + return mid; + } else if(c > 0) { + st = mid + 1; + } else { + ed = mid - 1; + } + } + return -(st + 1); +} + +static void vtpm_add(const uuid_t uuid, int offset, int index) { + /* Realloc more space if needed */ + if(g_store.num_vtpms >= g_store.num_vtpms_alloced) { + g_store.num_vtpms_alloced += 16; + g_store.vtpms = realloc( + g_store.vtpms, + sizeof(struct Vtpm) * g_store.num_vtpms_alloced); + } + + /* Move everybody after the new guy */ + for(int i = g_store.num_vtpms; i > index; --i) { + g_store.vtpms[i] = g_store.vtpms[i-1]; + } + + vtpmloginfo(VTPM_LOG_VTPM, "Registered vtpm " UUID_FMT "\n", UUID_BYTES(uuid)); + + /* Finally add new one */ + memcpy(g_store.vtpms[index].uuid, uuid, sizeof(uuid_t)); + g_store.vtpms[index].offset = offset; + ++g_store.num_vtpms; +} + +#if 0 +static void vtpm_remove(int index) { + for(i = index; i < g_store.num_vtpms; ++i) { + g_store.vtpms[i] = g_store.vtpms[i+1]; + } + --g_store.num_vtpms; +} +#endif + +static int pack_uuid_table(uint8_t* table, int size, int* nvtpms) { + uint8_t* ptr = table; + while(*nvtpms < g_store.num_vtpms && size >= 0) + { + /* Pack the uuid */ + memcpy(ptr, (uint8_t*)g_store.vtpms[*nvtpms].uuid, sizeof(uuid_t)); + ptr+= sizeof(uuid_t); + + + /* Pack the offset */ + ptr = pack_UINT32(ptr, g_store.vtpms[*nvtpms].offset); + + ++*nvtpms; + size -= UUID_TBL_ENT_SIZE; + } + return ptr - table; +} + +/* Extract the uuids */ +static int extract_uuid_table(uint8_t* table, int size) { + uint8_t* ptr = table; + for(;size >= UUID_TBL_ENT_SIZE; size -= UUID_TBL_ENT_SIZE) { + int index; + uint32_t v32; + + /*uuid_t is just an array of bytes, so we can do a direct cast here */ + uint8_t* uuid = ptr; + ptr += sizeof(uuid_t); + + /* Get the offset of the key */ + ptr = unpack_UINT32(ptr, &v32); + + /* Insert the new vtpm in sorted order */ + if((index = vtpm_get_index(uuid)) >= 0) { + vtpmlogerror(VTPM_LOG_VTPM, "Vtpm (" UUID_FMT ") exists multiple times! ignoring...\n", UUID_BYTES(uuid)); + continue; + } + index = -index -1; + + vtpm_add(uuid, v32, index); + + } + return ptr - table; +} + +static void vtpm_decrypt_block(aes_context* aes, + uint8_t* iv, + uint8_t* cipher, + uint8_t* plain, + int cipher_sz, + int* overlap) +{ + int bytes_ext; + /* Decrypt */ + aes_crypt_cbc(aes, AES_DECRYPT, + cipher_sz, + iv, cipher, plain + *overlap); + + /* Extract */ + bytes_ext = extract_uuid_table(plain, cipher_sz + *overlap); + + /* Copy left overs to the beginning */ + *overlap = cipher_sz + *overlap - bytes_ext; + memcpy(plain, plain + bytes_ext, *overlap); +} + +static int vtpm_encrypt_block(aes_context* aes, + uint8_t* iv, + uint8_t* plain, + uint8_t* cipher, + int block_sz, + int* overlap, + int* num_vtpms) +{ + int bytes_to_crypt; + int bytes_packed; + + /* Pack the uuid table */ + bytes_packed = *overlap + pack_uuid_table(plain + *overlap, block_sz - *overlap, num_vtpms); + bytes_to_crypt = MIN(bytes_packed, block_sz); + + /* Add padding if we aren't on a multiple of the block size */ + if(bytes_to_crypt & (AES_BLOCK_SIZE-1)) { + int oldsz = bytes_to_crypt; + //add padding + bytes_to_crypt += AES_BLOCK_SIZE - (bytes_to_crypt & (AES_BLOCK_SIZE-1)); + //fill padding with random bytes + vtpmmgr_rand(plain + oldsz, bytes_to_crypt - oldsz); + *overlap = 0; + } else { + *overlap = bytes_packed - bytes_to_crypt; + } + + /* Encrypt this chunk */ + aes_crypt_cbc(aes, AES_ENCRYPT, + bytes_to_crypt, + iv, plain, cipher); + + /* Copy the left over partials to the beginning */ + memcpy(plain, plain + bytes_to_crypt, *overlap); + + return bytes_to_crypt; +} + +static TPM_RESULT vtpm_storage_new_vtpm(const uuid_t uuid, int index) { + TPM_RESULT status = TPM_SUCCESS; + uint8_t plain[BUF_SIZE + AES_BLOCK_SIZE]; + uint8_t buf[BUF_SIZE]; + uint8_t* ptr; + int cipher_sz; + aes_context aes; + + /* Add new vtpm to the table */ + vtpm_add(uuid, g_store.end_offset, index); + g_store.end_offset += RSA_CIPHER_SIZE; + + /* Compute the new end location of the encrypted uuid table */ + cipher_sz = AES_BLOCK_SIZE; //IV + cipher_sz += g_store.num_vtpms * UUID_TBL_ENT_SIZE; //uuid table + cipher_sz += (AES_BLOCK_SIZE - (cipher_sz & (AES_BLOCK_SIZE -1))) & (AES_BLOCK_SIZE-1); //aes padding + + /* Does this overlap any key data? If so they need to be relocated */ + int uuid_end = (g_store.uuid_offset + cipher_sz + RSA_CIPHER_SIZE) & ~(RSA_CIPHER_SIZE -1); + for(int i = 0; i < g_store.num_vtpms; ++i) { + if(g_store.vtpms[i].offset < uuid_end) { + + vtpmloginfo(VTPM_LOG_VTPM, "Relocating vtpm data\n"); + + //Read the hashkey cipher text + lseek(blkfront_fd, g_store.vtpms[i].offset, SEEK_SET); + TRY_READ(buf, RSA_CIPHER_SIZE, "vtpm hashkey relocate"); + + //Write the cipher text to new offset + lseek(blkfront_fd, g_store.end_offset, SEEK_SET); + TRY_WRITE(buf, RSA_CIPHER_SIZE, "vtpm hashkey relocate"); + + //Save new offset + g_store.vtpms[i].offset = g_store.end_offset; + g_store.end_offset += RSA_CIPHER_SIZE; + } + } + + vtpmloginfo(VTPM_LOG_VTPM, "Generating a new symmetric key\n"); + + /* Generate an aes key */ + TPMTRYRETURN(vtpmmgr_rand(plain, AES_KEY_SIZE)); + aes_setkey_enc(&aes, plain, AES_KEY_BITS); + ptr = plain + AES_KEY_SIZE; + + /* Pack the crypted size */ + ptr = pack_UINT32(ptr, cipher_sz); + + vtpmloginfo(VTPM_LOG_VTPM, "Binding encrypted key\n"); + + /* Seal the key and size */ + TPMTRYRETURN(TPM_Bind(&vtpm_globals.storage_key, + plain, + ptr - plain, + buf)); + + /* Write the sealed key to disk */ + lseek(blkfront_fd, g_store.aes_offset, SEEK_SET); + TRY_WRITE(buf, RSA_CIPHER_SIZE, "vtpm aes key"); + + /* ENCRYPT AND WRITE UUID TABLE */ + + vtpmloginfo(VTPM_LOG_VTPM, "Encrypting the uuid table\n"); + + int num_vtpms = 0; + int overlap = 0; + int bytes_crypted; + uint8_t iv[AES_BLOCK_SIZE]; + + /* Generate the iv for the first block */ + TPMTRYRETURN(vtpmmgr_rand(iv, AES_BLOCK_SIZE)); + + /* Copy the iv to the cipher text buffer to be written to disk */ + memcpy(buf, iv, AES_BLOCK_SIZE); + ptr = buf + AES_BLOCK_SIZE; + + /* Encrypt the first block of the uuid table */ + bytes_crypted = vtpm_encrypt_block(&aes, + iv, //iv + plain, //plaintext + ptr, //cipher text + BUF_SIZE - AES_BLOCK_SIZE, + &overlap, + &num_vtpms); + + /* Write the iv followed by the crypted table*/ + TRY_WRITE(buf, bytes_crypted + AES_BLOCK_SIZE, "vtpm uuid table"); + + /* Decrement the number of bytes encrypted */ + cipher_sz -= bytes_crypted + AES_BLOCK_SIZE; + + /* If there are more vtpms, encrypt and write them block by block */ + while(cipher_sz > 0) { + /* Encrypt the next block of the uuid table */ + bytes_crypted = vtpm_encrypt_block(&aes, + iv, + plain, + buf, + BUF_SIZE, + &overlap, + &num_vtpms); + + /* Write the cipher text to disk */ + TRY_WRITE(buf, bytes_crypted, "vtpm uuid table"); + + cipher_sz -= bytes_crypted; + } + + goto egress; +abort_egress: +egress: + return status; +} + + +/************************************** + * PUBLIC FUNCTIONS + * ***********************************/ + +int vtpm_storage_init(void) { + struct blkfront_info info; + if((blkdev = init_blkfront(NULL, &info)) == NULL) { + return -1; + } + if((blkfront_fd = blkfront_open(blkdev)) < 0) { + return -1; + } + return 0; +} + +void vtpm_storage_shutdown(void) { + reset_store(); + close(blkfront_fd); +} + +TPM_RESULT vtpm_storage_load_hashkey(const uuid_t uuid, uint8_t hashkey[HASHKEYSZ]) +{ + TPM_RESULT status = TPM_SUCCESS; + int index; + uint8_t cipher[RSA_CIPHER_SIZE]; + uint8_t clear[RSA_CIPHER_SIZE]; + UINT32 clear_size; + + /* Find the index of this uuid */ + if((index = vtpm_get_index(uuid)) < 0) { + index = -index-1; + vtpmlogerror(VTPM_LOG_VTPM, "LoadKey failure: Unrecognized uuid! " UUID_FMT "\n", UUID_BYTES(uuid)); + status = TPM_BAD_PARAMETER; + goto abort_egress; + } + + /* Read the table entry */ + lseek(blkfront_fd, g_store.vtpms[index].offset, SEEK_SET); + TRY_READ(cipher, RSA_CIPHER_SIZE, "vtpm hashkey data"); + + /* Decrypt the table entry */ + TPMTRYRETURN(TPM_UnBind( + vtpm_globals.storage_key_handle, + RSA_CIPHER_SIZE, + cipher, + &clear_size, + clear, + (const TPM_AUTHDATA*)&vtpm_globals.storage_key_usage_auth, + &vtpm_globals.oiap)); + + if(clear_size < HASHKEYSZ) { + vtpmloginfo(VTPM_LOG_VTPM, "Decrypted Hash key size (%" PRIu32 ") was too small!\n", clear_size); + status = TPM_RESOURCES; + goto abort_egress; + } + + memcpy(hashkey, clear, HASHKEYSZ); + + vtpmloginfo(VTPM_LOG_VTPM, "Loaded hash and key for vtpm " UUID_FMT "\n", UUID_BYTES(uuid)); + goto egress; +abort_egress: + vtpmlogerror(VTPM_LOG_VTPM, "Failed to load key\n"); +egress: + return status; +} + +TPM_RESULT vtpm_storage_save_hashkey(const uuid_t uuid, uint8_t hashkey[HASHKEYSZ]) +{ + TPM_RESULT status = TPM_SUCCESS; + int index; + uint8_t buf[RSA_CIPHER_SIZE]; + + /* Find the index of this uuid */ + if((index = vtpm_get_index(uuid)) < 0) { + index = -index-1; + /* Create a new vtpm */ + TPMTRYRETURN( vtpm_storage_new_vtpm(uuid, index) ); + } + + /* Encrypt the hash and key */ + TPMTRYRETURN( TPM_Bind(&vtpm_globals.storage_key, + hashkey, + HASHKEYSZ, + buf)); + + /* Write to disk */ + lseek(blkfront_fd, g_store.vtpms[index].offset, SEEK_SET); + TRY_WRITE(buf, RSA_CIPHER_SIZE, "vtpm hashkey data"); + + vtpmloginfo(VTPM_LOG_VTPM, "Saved hash and key for vtpm " UUID_FMT "\n", UUID_BYTES(uuid)); + goto egress; +abort_egress: + vtpmlogerror(VTPM_LOG_VTPM, "Failed to save key\n"); +egress: + return status; +} + +TPM_RESULT vtpm_storage_new_header() +{ + TPM_RESULT status = TPM_SUCCESS; + uint8_t buf[BUF_SIZE]; + uint8_t keybuf[AES_KEY_SIZE + sizeof(uint32_t)]; + uint8_t* ptr = buf; + uint8_t* sptr; + + /* Clear everything first */ + reset_store(); + + vtpmloginfo(VTPM_LOG_VTPM, "Creating new disk image header\n"); + + /*Copy the ID string */ + memcpy(ptr, IDSTR, IDSTRLEN); + ptr += IDSTRLEN; + + /*Copy the version */ + ptr = pack_UINT32(ptr, DISKVERS); + + /*Save the location of the key size */ + sptr = ptr; + ptr += sizeof(UINT32); + + vtpmloginfo(VTPM_LOG_VTPM, "Saving root storage key..\n"); + + /* Copy the storage key */ + ptr = pack_TPM_KEY(ptr, &vtpm_globals.storage_key); + + /* Now save the size */ + pack_UINT32(sptr, ptr - (sptr + 4)); + + /* Create a fake aes key and set cipher text size to 0 */ + memset(keybuf, 0, sizeof(keybuf)); + + vtpmloginfo(VTPM_LOG_VTPM, "Binding uuid table symmetric key..\n"); + + /* Save the location of the aes key */ + g_store.aes_offset = ptr - buf; + + /* Store the fake aes key and vtpm count */ + TPMTRYRETURN(TPM_Bind(&vtpm_globals.storage_key, + keybuf, + sizeof(keybuf), + ptr)); + ptr+= RSA_CIPHER_SIZE; + + /* Write the header to disk */ + lseek(blkfront_fd, 0, SEEK_SET); + TRY_WRITE(buf, ptr-buf, "vtpm header"); + + /* Save the location of the uuid table */ + g_store.uuid_offset = get_offset(); + + /* Save the end offset */ + g_store.end_offset = (g_store.uuid_offset + RSA_CIPHER_SIZE) & ~(RSA_CIPHER_SIZE -1); + + vtpmloginfo(VTPM_LOG_VTPM, "Saved new manager disk header.\n"); + + goto egress; +abort_egress: +egress: + return status; +} + + +TPM_RESULT vtpm_storage_load_header(void) +{ + TPM_RESULT status = TPM_SUCCESS; + uint32_t v32; + uint8_t buf[BUF_SIZE]; + uint8_t* ptr = buf; + aes_context aes; + + /* Clear everything first */ + reset_store(); + + /* Read the header from disk */ + lseek(blkfront_fd, 0, SEEK_SET); + TRY_READ(buf, IDSTRLEN + sizeof(UINT32) + sizeof(UINT32), "vtpm header"); + + vtpmloginfo(VTPM_LOG_VTPM, "Loading disk image header\n"); + + /* Verify the ID string */ + if(memcmp(ptr, IDSTR, IDSTRLEN)) { + vtpmlogerror(VTPM_LOG_VTPM, "Invalid ID string in disk image!\n"); + status = TPM_FAIL; + goto abort_egress; + } + ptr+=IDSTRLEN; + + /* Unpack the version */ + ptr = unpack_UINT32(ptr, &v32); + + /* Verify the version */ + if(v32 != DISKVERS) { + vtpmlogerror(VTPM_LOG_VTPM, "Unsupported disk image version number %" PRIu32 "\n", v32); + status = TPM_FAIL; + goto abort_egress; + } + + /* Size of the storage key */ + ptr = unpack_UINT32(ptr, &v32); + + /* Sanity check */ + if(v32 > BUF_SIZE) { + vtpmlogerror(VTPM_LOG_VTPM, "Size of storage key (%" PRIu32 ") is too large!\n", v32); + status = TPM_IOERROR; + goto abort_egress; + } + + /* read the storage key */ + TRY_READ(buf, v32, "storage pub key"); + + vtpmloginfo(VTPM_LOG_VTPM, "Unpacking storage key\n"); + + /* unpack the storage key */ + ptr = unpack_TPM_KEY(buf, &vtpm_globals.storage_key, UNPACK_ALLOC); + + /* Load Storage Key into the TPM */ + TPMTRYRETURN( TPM_LoadKey( + TPM_SRK_KEYHANDLE, + &vtpm_globals.storage_key, + &vtpm_globals.storage_key_handle, + (const TPM_AUTHDATA*)&vtpm_globals.srk_auth, + &vtpm_globals.oiap)); + + /* Initialize the storage key auth */ + memset(vtpm_globals.storage_key_usage_auth, 0, sizeof(TPM_AUTHDATA)); + + /* Store the offset of the aes key */ + g_store.aes_offset = get_offset(); + + /* Read the rsa cipher text for the aes key */ + TRY_READ(buf, RSA_CIPHER_SIZE, "aes key"); + ptr = buf + RSA_CIPHER_SIZE; + + vtpmloginfo(VTPM_LOG_VTPM, "Unbinding uuid table symmetric key\n"); + + /* Decrypt the aes key protecting the uuid table */ + UINT32 datalen; + TPMTRYRETURN(TPM_UnBind( + vtpm_globals.storage_key_handle, + RSA_CIPHER_SIZE, + buf, + &datalen, + ptr, + (const TPM_AUTHDATA*)&vtpm_globals.storage_key_usage_auth, + &vtpm_globals.oiap)); + + /* Validate the length of the output buffer */ + if(datalen < AES_KEY_SIZE + sizeof(UINT32)) { + vtpmlogerror(VTPM_LOG_VTPM, "Unbound AES key size (%d) was too small! expected (%zu)\n", datalen, AES_KEY_SIZE + sizeof(UINT32)); + status = TPM_IOERROR; + goto abort_egress; + } + + /* Extract the aes key */ + aes_setkey_dec(&aes, ptr, AES_KEY_BITS); + ptr+= AES_KEY_SIZE; + + /* Extract the ciphertext size */ + ptr = unpack_UINT32(ptr, &v32); + int cipher_size = v32; + + /* Sanity check */ + if(cipher_size & (AES_BLOCK_SIZE-1)) { + vtpmlogerror(VTPM_LOG_VTPM, "Cipher text size (%" PRIu32 ") is not a multiple of the aes block size! (%d)\n", v32, AES_BLOCK_SIZE); + status = TPM_IOERROR; + goto abort_egress; + } + + /* Save the location of the uuid table */ + g_store.uuid_offset = get_offset(); + + /* Only decrypt the table if there are vtpms to decrypt */ + if(cipher_size > 0) { + int rbytes; + int overlap = 0; + uint8_t plain[BUF_SIZE + AES_BLOCK_SIZE]; + uint8_t iv[AES_BLOCK_SIZE]; + + vtpmloginfo(VTPM_LOG_VTPM, "Decrypting uuid table\n"); + + /* Pre allocate the vtpm array */ + g_store.num_vtpms_alloced = cipher_size / UUID_TBL_ENT_SIZE; + g_store.vtpms = malloc(sizeof(struct Vtpm) * g_store.num_vtpms_alloced); + + /* Read the iv and the first chunk of cipher text */ + rbytes = MIN(cipher_size, BUF_SIZE); + TRY_READ(buf, rbytes, "vtpm uuid table\n"); + cipher_size -= rbytes; + + /* Copy the iv */ + memcpy(iv, buf, AES_BLOCK_SIZE); + ptr = buf + AES_BLOCK_SIZE; + + /* Remove the iv from the number of bytes to decrypt */ + rbytes -= AES_BLOCK_SIZE; + + /* Decrypt and extract vtpms */ + vtpm_decrypt_block(&aes, + iv, ptr, plain, + rbytes, &overlap); + + /* Read the rest of the table if there is more */ + while(cipher_size > 0) { + /* Read next chunk of cipher text */ + rbytes = MIN(cipher_size, BUF_SIZE); + TRY_READ(buf, rbytes, "vtpm uuid table"); + cipher_size -= rbytes; + + /* Decrypt a block of text */ + vtpm_decrypt_block(&aes, + iv, buf, plain, + rbytes, &overlap); + + } + vtpmloginfo(VTPM_LOG_VTPM, "Loaded %d vtpms!\n", g_store.num_vtpms); + } + + /* The end of the key table, new vtpms go here */ + int uuid_end = (get_offset() + RSA_CIPHER_SIZE) & ~(RSA_CIPHER_SIZE -1); + g_store.end_offset = uuid_end; + + /* Compute the end offset while validating vtpms*/ + for(int i = 0; i < g_store.num_vtpms; ++i) { + /* offset must not collide with previous data */ + if(g_store.vtpms[i].offset < uuid_end) { + vtpmlogerror(VTPM_LOG_VTPM, "vtpm: " UUID_FMT + " offset (%d) is before end of uuid table (%d)!\n", + UUID_BYTES(g_store.vtpms[i].uuid), + g_store.vtpms[i].offset, uuid_end); + status = TPM_IOERROR; + goto abort_egress; + } + /* offset must be at a multiple of cipher size */ + if(g_store.vtpms[i].offset & (RSA_CIPHER_SIZE-1)) { + vtpmlogerror(VTPM_LOG_VTPM, "vtpm: " UUID_FMT + " offset(%d) is not at a multiple of the rsa cipher text size (%d)!\n", + UUID_BYTES(g_store.vtpms[i].uuid), + g_store.vtpms[i].offset, RSA_CIPHER_SIZE); + status = TPM_IOERROR; + goto abort_egress; + } + /* Save the last offset */ + if(g_store.vtpms[i].offset >= g_store.end_offset) { + g_store.end_offset = g_store.vtpms[i].offset + RSA_CIPHER_SIZE; + } + } + + goto egress; +abort_egress: + //An error occured somewhere + vtpmlogerror(VTPM_LOG_VTPM, "Failed to load manager data!\n"); + + //Clear the data store + reset_store(); + + //Reset the storage key structure + free_TPM_KEY(&vtpm_globals.storage_key); + { + TPM_KEY key = TPM_KEY_INIT; + vtpm_globals.storage_key = key; + } + + //Reset the storage key handle + TPM_EvictKey(vtpm_globals.storage_key_handle); + vtpm_globals.storage_key_handle = 0; +egress: + return status; +} + +#if 0 +/* For testing disk IO */ +void add_fake_vtpms(int num) { + for(int i = 0; i < num; ++i) { + uint32_t ind = cpu_to_be32(i); + + uuid_t uuid; + memset(uuid, 0, sizeof(uuid_t)); + memcpy(uuid, &ind, sizeof(ind)); + int index = vtpm_get_index(uuid); + index = -index-1; + + vtpm_storage_new_vtpm(uuid, index); + } +} +#endif diff -Nru xen-4.2.2/stubdom/vtpmmgr/vtpm_storage.h xen-4.3.0/stubdom/vtpmmgr/vtpm_storage.h --- xen-4.2.2/stubdom/vtpmmgr/vtpm_storage.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/vtpm_storage.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef VTPM_STORAGE_H +#define VTPM_STORAGE_h + +#include "uuid.h" + +#define VTPM_NVMKEY_SIZE 32 +#define HASHKEYSZ (sizeof(TPM_DIGEST) + VTPM_NVMKEY_SIZE) + +/* Initialize the storage system and its virtual disk */ +int vtpm_storage_init(void); + +/* Shutdown the storage system and its virtual disk */ +void vtpm_storage_shutdown(void); + +/* Loads Sha1 hash and 256 bit AES key from disk and stores them + * packed together in outbuf. outbuf must be freed + * by the caller using buffer_free() + */ +TPM_RESULT vtpm_storage_load_hashkey(const uuid_t uuid, uint8_t hashkey[HASHKEYSZ]); + +/* inbuf must contain a sha1 hash followed by a 256 bit AES key. + * Encrypts and stores the hash and key to disk */ +TPM_RESULT vtpm_storage_save_hashkey(const uuid_t uuid, uint8_t hashkey[HASHKEYSZ]); + +/* Load the vtpm manager data - call this on startup */ +TPM_RESULT vtpm_storage_load_header(void); + +/* Saves the vtpm manager data - call this on shutdown */ +TPM_RESULT vtpm_storage_new_header(void); + + +#endif diff -Nru xen-4.2.2/stubdom/vtpmmgr/vtpmmgr.c xen-4.3.0/stubdom/vtpmmgr/vtpmmgr.c --- xen-4.2.2/stubdom/vtpmmgr/vtpmmgr.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/vtpmmgr.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include +#include +#include +#include +#include "log.h" + +#include "vtpmmgr.h" +#include "tcg.h" + + +void main_loop(void) { + tpmcmd_t* tpmcmd; + uint8_t respbuf[TCPA_MAX_BUFFER_LENGTH]; + + while(1) { + /* Wait for requests from a vtpm */ + vtpmloginfo(VTPM_LOG_VTPM, "Waiting for commands from vTPM's:\n"); + if((tpmcmd = tpmback_req_any()) == NULL) { + vtpmlogerror(VTPM_LOG_VTPM, "NULL tpmcmd\n"); + continue; + } + + tpmcmd->resp = respbuf; + + /* Process the command */ + vtpmmgr_handle_cmd(tpmcmd->opaque, tpmcmd); + + /* Send response */ + tpmback_resp(tpmcmd); + } +} + +int main(int argc, char** argv) +{ + int rc = 0; + sleep(2); + vtpmloginfo(VTPM_LOG_VTPM, "Starting vTPM manager domain\n"); + + /* Initialize the vtpm manager */ + if(vtpmmgr_init(argc, argv) != TPM_SUCCESS) { + vtpmlogerror(VTPM_LOG_VTPM, "Unable to initialize vtpmmgr domain!\n"); + rc = -1; + goto exit; + } + + main_loop(); + + vtpmloginfo(VTPM_LOG_VTPM, "vTPM Manager shutting down...\n"); + + vtpmmgr_shutdown(); + +exit: + return rc; + +} diff -Nru xen-4.2.2/stubdom/vtpmmgr/vtpmmgr.h xen-4.3.0/stubdom/vtpmmgr/vtpmmgr.h --- xen-4.2.2/stubdom/vtpmmgr/vtpmmgr.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/stubdom/vtpmmgr/vtpmmgr.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2010-2012 United States Government, as represented by + * the Secretary of Defense. All rights reserved. + * + * based off of the original tools/vtpm_manager code base which is: + * Copyright (c) 2005, Intel Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef VTPMMGR_H +#define VTPMMGR_H + +#include +#include +#include + +#include "uuid.h" +#include "tcg.h" +#include "vtpm_manager.h" + +#define RSA_KEY_SIZE 0x0800 +#define RSA_CIPHER_SIZE (RSA_KEY_SIZE / 8) + +struct vtpm_globals { + int tpm_fd; + TPM_KEY storage_key; + TPM_HANDLE storage_key_handle; // Key used by persistent store + TPM_AUTH_SESSION oiap; // OIAP session for storageKey + TPM_AUTHDATA storage_key_usage_auth; + + TPM_AUTHDATA owner_auth; + TPM_AUTHDATA srk_auth; + + entropy_context entropy; + ctr_drbg_context ctr_drbg; +}; + +// --------------------------- Global Values -------------------------- +extern struct vtpm_globals vtpm_globals; // Key info and DMI states + +TPM_RESULT vtpmmgr_init(int argc, char** argv); +void vtpmmgr_shutdown(void); + +TPM_RESULT vtpmmgr_handle_cmd(const uuid_t uuid, tpmcmd_t* tpmcmd); + +inline TPM_RESULT vtpmmgr_rand(unsigned char* bytes, size_t num_bytes) { + return ctr_drbg_random(&vtpm_globals.ctr_drbg, bytes, num_bytes) == 0 ? 0 : TPM_FAIL; +} + +#endif diff -Nru xen-4.2.2/tools/Makefile xen-4.3.0/tools/Makefile --- xen-4.2.2/tools/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -18,12 +18,12 @@ SUBDIRS-$(CONFIG_X86) += firmware SUBDIRS-y += console SUBDIRS-y += xenmon -SUBDIRS-$(VTPM_TOOLS) += vtpm_manager -SUBDIRS-$(VTPM_TOOLS) += vtpm SUBDIRS-y += xenstat SUBDIRS-$(CONFIG_Linux) += $(SUBDIRS-libaio) SUBDIRS-$(CONFIG_Linux) += memshr +ifeq ($(CONFIG_X86),y) SUBDIRS-$(CONFIG_Linux) += blktap +endif SUBDIRS-$(CONFIG_Linux) += blktap2 SUBDIRS-$(CONFIG_NetBSD) += $(SUBDIRS-libaio) SUBDIRS-$(CONFIG_NetBSD) += blktap2 @@ -188,6 +188,7 @@ fi; \ cd qemu-xen-dir; \ $$source/configure --enable-xen --target-list=i386-softmmu \ + --prefix=$(PREFIX) \ --source-path=$$source \ --extra-cflags="-I$(XEN_ROOT)/tools/include \ -I$(XEN_ROOT)/tools/libxc \ @@ -199,6 +200,7 @@ --bindir=$(LIBEXEC) \ --datadir=$(SHAREDIR)/qemu-xen \ --disable-kvm \ + --disable-docs \ --python=$(PYTHON) \ $(IOEMU_CONFIGURE_CROSS); \ $(MAKE) all diff -Nru xen-4.2.2/tools/Rules.mk xen-4.3.0/tools/Rules.mk --- xen-4.2.2/tools/Rules.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/Rules.mk 2013-07-09 10:46:56.000000000 +0000 @@ -62,14 +62,15 @@ CFLAGS += -D__XEN_TOOLS__ # Get gcc to generate the dependencies for us. -CFLAGS += -MMD -MF .$(@F).d +CFLAGS += -MMD -MF .$(if $(filter-out .,$(@D)),$(subst /,@,$(@D))@)$(@F).d DEPS = .*.d +ifneq ($(FILE_OFFSET_BITS),) +CFLAGS += -D_FILE_OFFSET_BITS=$(FILE_OFFSET_BITS) +endif ifneq ($(XEN_OS),NetBSD) # Enable implicit LFS support *and* explicit LFS names. -CFLAGS += $(shell getconf LFS_CFLAGS) CFLAGS += -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -LDFLAGS += $(shell getconf LFS_LDFLAGS) endif # 32-bit x86 does not perform well with -ve segment accesses on Xen. @@ -78,11 +79,6 @@ CFLAGS += $(EXTRA_CFLAGS_XEN_TOOLS) -# Require GCC v3.4+ (to avoid issues with alignment constraints in Xen headers) -check-$(CONFIG_X86) = $(call cc-ver-check,CC,0x030400,\ - "Xen requires at least gcc-3.4") -$(eval $(check-y)) - INSTALL_PYTHON_PROG = \ $(XEN_ROOT)/tools/python/install-wrap "$(PYTHON_PATH)" $(INSTALL_PROG) diff -Nru xen-4.2.2/tools/blktap/lib/Makefile xen-4.3.0/tools/blktap/lib/Makefile --- xen-4.2.2/tools/blktap/lib/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/blktap/lib/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -23,23 +23,25 @@ OBJS_PIC = $(SRCS:.c=.opic) IBINS := -LIB = libblktap.a libblktap.so.$(MAJOR).$(MINOR) +LIB = libblktap.a +LIB_SO = libblktap.so.$(MAJOR).$(MINOR) .PHONY: all -all: $(LIB) +all: $(LIB) $(LIB_SO) .PHONY: install install: all $(INSTALL_DIR) $(DESTDIR)$(LIBDIR) $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR) - $(INSTALL_PROG) $(LIB) $(DESTDIR)$(LIBDIR) + $(INSTALL_PROG) $(LIB_SO) $(DESTDIR)$(LIBDIR) + $(INSTALL_DATA) $(LIB) $(DESTDIR)$(LIBDIR) ln -sf libblktap.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libblktap.so.$(MAJOR) ln -sf libblktap.so.$(MAJOR) $(DESTDIR)$(LIBDIR)/libblktap.so $(INSTALL_DATA) blktaplib.h $(DESTDIR)$(INCLUDEDIR) .PHONY: clean clean: - rm -rf *.a *.so* *.o *.opic *.rpm $(LIB) *~ $(DEPS) xen TAGS + rm -rf *.a *.so* *.o *.opic *.rpm $(LIB) $(LIB_SO) *~ $(DEPS) xen TAGS libblktap.so.$(MAJOR).$(MINOR): $(OBJS_PIC) $(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,$(SONAME) $(SHLIB_LDFLAGS) \ diff -Nru xen-4.2.2/tools/blktap2/drivers/hashtable.c xen-4.3.0/tools/blktap2/drivers/hashtable.c --- xen-4.2.2/tools/blktap2/drivers/hashtable.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/blktap2/drivers/hashtable.c 2013-07-09 10:46:56.000000000 +0000 @@ -3,7 +3,6 @@ /* * There are duplicates of this code in: * - tools/xenstore/hashtable.c - * - tools/vtpm_manager/util/hashtable.c */ #include "hashtable.h" diff -Nru xen-4.2.2/tools/blktap2/drivers/hashtable.h xen-4.3.0/tools/blktap2/drivers/hashtable.h --- xen-4.2.2/tools/blktap2/drivers/hashtable.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/blktap2/drivers/hashtable.h 2013-07-09 10:46:56.000000000 +0000 @@ -3,7 +3,6 @@ /* * There are duplicates of this code in: * - tools/xenstore/hashtable.h - * - tools/vtpm_manager/util/hashtable.h */ #ifndef __HASHTABLE_CWC22_H__ diff -Nru xen-4.2.2/tools/blktap2/drivers/hashtable_itr.c xen-4.3.0/tools/blktap2/drivers/hashtable_itr.c --- xen-4.2.2/tools/blktap2/drivers/hashtable_itr.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/blktap2/drivers/hashtable_itr.c 2013-07-09 10:46:56.000000000 +0000 @@ -1,10 +1,5 @@ /* Copyright (C) 2002, 2004 Christopher Clark */ -/* - * There are duplicates of this code in: - * - tools/vtpm_manager/util/hashtable_itr.c - */ - #include "hashtable.h" #include "hashtable_private.h" #include "hashtable_itr.h" diff -Nru xen-4.2.2/tools/blktap2/drivers/hashtable_itr.h xen-4.3.0/tools/blktap2/drivers/hashtable_itr.h --- xen-4.2.2/tools/blktap2/drivers/hashtable_itr.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/blktap2/drivers/hashtable_itr.h 2013-07-09 10:46:56.000000000 +0000 @@ -1,10 +1,5 @@ /* Copyright (C) 2002, 2004 Christopher Clark */ -/* - * There are duplicates of this code in: - * - tools/vtpm_manager/util/hashtable_itr.h - */ - #ifndef __HASHTABLE_ITR_CWC22__ #define __HASHTABLE_ITR_CWC22__ #include "hashtable.h" diff -Nru xen-4.2.2/tools/blktap2/drivers/hashtable_private.h xen-4.3.0/tools/blktap2/drivers/hashtable_private.h --- xen-4.2.2/tools/blktap2/drivers/hashtable_private.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/blktap2/drivers/hashtable_private.h 2013-07-09 10:46:56.000000000 +0000 @@ -3,7 +3,6 @@ /* * There are duplicates of this code in: * - tools/xenstore/hashtable_private.h - * - tools/vtpm_manager/util/hashtable_private.h */ #ifndef __HASHTABLE_PRIVATE_CWC22_H__ diff -Nru xen-4.2.2/tools/blktap2/drivers/libaio-compat.h xen-4.3.0/tools/blktap2/drivers/libaio-compat.h --- xen-4.2.2/tools/blktap2/drivers/libaio-compat.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/blktap2/drivers/libaio-compat.h 2013-07-09 10:46:56.000000000 +0000 @@ -29,6 +29,7 @@ #ifndef __LIBAIO_COMPAT #define __LIBAIO_COMPAT +#include "../../config.h" #include #include #include @@ -50,6 +51,16 @@ c->resfd = eventfd; } +#ifdef HAVE_SYS_EVENTFD_H + +#include + +static inline int tapdisk_sys_eventfd(int initval) +{ + return eventfd(initval, 0); +} + +#else /* Fallback */ #ifndef SYS_eventfd #ifndef __NR_eventfd # if defined(__alpha__) @@ -88,5 +99,6 @@ { return syscall(SYS_eventfd, initval, 0); } +#endif #endif /* __LIBAIO_COMPAT */ diff -Nru xen-4.2.2/tools/blktap2/vhd/lib/Makefile xen-4.3.0/tools/blktap2/vhd/lib/Makefile --- xen-4.2.2/tools/blktap2/vhd/lib/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/blktap2/vhd/lib/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -68,7 +68,7 @@ install: all $(INSTALL_DIR) -p $(DESTDIR)$(INST-DIR) - $(INSTALL_PROG) libvhd.a $(DESTDIR)$(INST-DIR) + $(INSTALL_DATA) libvhd.a $(DESTDIR)$(INST-DIR) $(INSTALL_PROG) libvhd.so.$(LIBVHD-MAJOR).$(LIBVHD-MINOR) $(DESTDIR)$(INST-DIR) ln -sf libvhd.so.$(LIBVHD-MAJOR).$(LIBVHD-MINOR) $(DESTDIR)$(INST-DIR)/libvhd.so.$(LIBVHD-MAJOR) ln -sf libvhd.so.$(LIBVHD-MAJOR) $(DESTDIR)$(INST-DIR)/libvhd.so diff -Nru xen-4.2.2/tools/config.guess xen-4.3.0/tools/config.guess --- xen-4.2.2/tools/config.guess 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/config.guess 1970-01-01 00:00:00.000000000 +0000 @@ -1,1502 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 -# Free Software Foundation, Inc. - -timestamp='2009-12-30' - -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] - -Output the configuration name of the system \`$me' is run on. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.guess ($timestamp) - -Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" >&2 - exit 1 ;; - * ) - break ;; - esac -done - -if test $# != 0; then - echo "$me: too many arguments$help" >&2 - exit 1 -fi - -trap 'exit 1' 1 2 15 - -# CC_FOR_BUILD -- compiler used by this script. Note that the use of a -# compiler to aid in system detection is discouraged as it requires -# temporary files to be created and, as you can see below, it is a -# headache to deal with in a portable fashion. - -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. - -# Portable tmp directory creation inspired by the Autoconf team. - -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - *:NetBSD:*:*) - # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, - # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently - # switched to ELF, *-*-netbsd* would select the old - # object file format. This provides both forward - # compatibility and a consistent mechanism for selecting the - # object file format. - # - # Note: NetBSD doesn't particularly care about the vendor - # portion of the name. We always set it to "unknown". - sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in - armeb) machine=armeb-unknown ;; - arm*) machine=arm-unknown ;; - sh3el) machine=shl-unknown ;; - sh3eb) machine=sh-unknown ;; - sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; - esac - # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build - if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ELF__ - then - # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). - # Return netbsd for either. FIX? - os=netbsd - else - os=netbsdelf - fi - ;; - *) - os=netbsd - ;; - esac - # The OS release - # Debian GNU/NetBSD machines have a different userland, and - # thus, need a distinct triplet. However, they do not need - # kernel version information, so it can be replaced with a - # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in - Debian*) - release='-gnu' - ;; - *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - ;; - esac - # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: - # contains redundant information, the shorter form: - # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; - *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; - macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; - *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; - alpha:OSF1:*:*) - case $UNAME_RELEASE in - *4.0) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` - ;; - *5.*) - UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` - ;; - esac - # According to Compaq, /usr/sbin/psrinfo has been available on - # OSF/1 and Tru64 systems produced since 1995. I hope that - # covers most systems running today. This code pipes the CPU - # types through head -n 1, so we only detect the type of CPU 0. - ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` - case "$ALPHA_CPU_TYPE" in - "EV4 (21064)") - UNAME_MACHINE="alpha" ;; - "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; - "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; - "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; - "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; - "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; - "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; - "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; - "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; - "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; - "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; - "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; - "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; - "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; - esac - # A Pn.n version is a patched version. - # A Vn.n version is a released version. - # A Tn.n version is a released field test version. - # A Xn.n version is an unreleased experimental baselevel. - # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - exit ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; - Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; - *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; - *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; - *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; - *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; - *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; - SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; - Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) - # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit ;; - NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; - DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; - DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) - case `/usr/bin/uname -p` in - sparc) echo sparc-icl-nx7; exit ;; - esac ;; - s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; - i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" - # If there is a compiler, see if it is configured for 64-bit objects. - # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. - # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - SUN_ARCH="x86_64" - fi - fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; - sun*:*:4.2BSD:*) - UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 - case "`/bin/arch`" in - sun3) - echo m68k-sun-sunos${UNAME_RELEASE} - ;; - sun4) - echo sparc-sun-sunos${UNAME_RELEASE} - ;; - esac - exit ;; - aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; - # The situation for MiNT is a little confusing. The machine name - # can be virtually everything (everything which is not - # "atarist" or "atariste" at least should have a processor - # > m68000). The system name ranges from "MiNT" over "FreeMiNT" - # to the lowercase version "mint" (or "freemint"). Finally - # the system name "TOS" denotes a system which is actually not - # MiNT. But MiNT is downward compatible to TOS, so this should - # be no problem. - atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; - milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; - hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; - *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; - m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; - powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; - RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; - 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; - mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c -#ifdef __cplusplus -#include /* for printf() prototype */ - int main (int argc, char *argv[]) { -#else - int main (argc, argv) int argc; char *argv[]; { -#endif - #if defined (host_mips) && defined (MIPSEB) - #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); - #endif - #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); - #endif - #endif - exit (-1); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && - { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} - exit ;; - Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; - Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; - Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; - AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] - then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] - then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - else - echo i586-dg-dgux${UNAME_RELEASE} - fi - exit ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; - ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` - then - echo "$SYSTEM_NAME" - else - echo rs6000-ibm-aix3.2.5 - fi - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit ;; - *:AIX:*:[456]) - IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; - 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/[678][0-9][0-9]) - if [ -x /usr/bin/getconf ]; then - sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` - sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 - 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 - esac ;; - esac - fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - - #define _HPUX_SOURCE - #include - #include - - int main () - { - #if defined(_SC_KERNEL_BITS) - long bits = sysconf(_SC_KERNEL_BITS); - #endif - long cpu = sysconf (_SC_CPU_VERSION); - - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1"); break; - case CPU_PA_RISC2_0: - #if defined(_SC_KERNEL_BITS) - switch (bits) - { - case 64: puts ("hppa2.0w"); break; - case 32: puts ("hppa2.0n"); break; - default: puts ("hppa2.0"); break; - } break; - #else /* !defined(_SC_KERNEL_BITS) */ - puts ("hppa2.0"); break; - #endif - default: puts ("hppa1.0"); break; - } - exit (0); - } -EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` - test -z "$HP_ARCH" && HP_ARCH=hppa - fi ;; - esac - if [ ${HP_ARCH} = "hppa2.0w" ] - then - eval $set_cc_for_build - - # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating - # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler - # generating 64-bit code. GNU and HP use different nomenclature: - # - # $ CC_FOR_BUILD=cc ./config.guess - # => hppa2.0w-hp-hpux11.23 - # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess - # => hppa64-hp-hpux11.23 - - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | - grep -q __LP64__ - then - HP_ARCH="hppa2.0w" - else - HP_ARCH="hppa64" - fi - fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; - ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; - 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - echo unknown-hitachi-hiuxwe2 - exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; - *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; - i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk - else - echo ${UNAME_MACHINE}-unknown-osf1 - fi - exit ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ - | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ - -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ - -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; - F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` - echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` - echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" - exit ;; - i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; - sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; - *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - esac - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; - i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; - *:Interix*:*) - case ${UNAME_MACHINE} in - x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; - authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; - IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; - esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; - i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin - exit ;; - amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; - prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; - *:GNU:*:*) - # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; - *:GNU/*:*:*) - # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in - EV5) UNAME_MACHINE=alphaev5 ;; - EV56) UNAME_MACHINE=alphaev56 ;; - PCA56) UNAME_MACHINE=alphapca56 ;; - PCA57) UNAME_MACHINE=alphapca56 ;; - EV6) UNAME_MACHINE=alphaev6 ;; - EV67) UNAME_MACHINE=alphaev67 ;; - EV68*) UNAME_MACHINE=alphaev68 ;; - esac - objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; - arm*:Linux:*:*) - eval $set_cc_for_build - if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_EABI__ - then - echo ${UNAME_MACHINE}-unknown-linux-gnu - else - echo ${UNAME_MACHINE}-unknown-linux-gnueabi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - cris:Linux:*:*) - echo cris-axis-linux-gnu - exit ;; - crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu - exit ;; - frv:Linux:*:*) - echo frv-unknown-linux-gnu - exit ;; - i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el - #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el - #else - #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} - #else - CPU= - #endif - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } - ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; - parisc:Linux:*:* | hppa:Linux:*:*) - # Look for CPU level - case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; - x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; - i*86:DYNIX/ptx:4*:*) - # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. - # earlier versions are messed up and put the nodename in both - # sysname and nodename. - echo i386-sequent-sysv4 - exit ;; - i*86:UNIX_SV:4.2MP:2.*) - # Unixware is an offshoot of SVR4, but it has its own version - # number series starting with 2... - # I am not positive that other SVR4 systems won't match this, - # I just have to hope. -- rms. - # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} - exit ;; - i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility - # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx - exit ;; - i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; - i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; - i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; - i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; - i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp - exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} - else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} - fi - exit ;; - i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. - case `/bin/uname -X | grep "^Machine"` in - *486*) UNAME_MACHINE=i486 ;; - *Pentium) UNAME_MACHINE=i586 ;; - *Pent*|*Celeron) UNAME_MACHINE=i686 ;; - esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} - exit ;; - i*86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` - (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 - (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ - && UNAME_MACHINE=i586 - (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ - && UNAME_MACHINE=i686 - (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ - && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-pc-sysv32 - fi - exit ;; - pc:*:*:*) - # Left here for compatibility: - # uname -m prints for DJGPP always 'pc', but it prints nothing about - # the processor, so we play safe by assuming i586. - # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that - # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; - Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit ;; - mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; - M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; - M68*:*:R3V[5678]*:*) - test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; - 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) - OS_REL='' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4; exit; } ;; - NCR*:*:4.2:* | MPRAS*:*:4.2:*) - OS_REL='.3' - test -r /etc/.relid \ - && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` - /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } - /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; - m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; - mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; - TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; - rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; - PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; - SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; - RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; - *:UNIX_System_V:4*:FTX*) - # From Gerald Hewes . - # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; - *:*:*:FTX*) - # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; - i*86:VOS:*:*) - # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; - *:VOS:*:*) - # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; - news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; - R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} - else - echo mips-unknown-sysv${UNAME_RELEASE} - fi - exit ;; - BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; - BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; - BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; - BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; - SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; - SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; - SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; - SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; - SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; - SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; - Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; - *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; - *:procnto*:*:* | *:QNX:[0123456789]*:*) - UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then - UNAME_PROCESSOR=i386 - UNAME_MACHINE=pc - fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; - *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; - BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; - DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; - *:Plan9:*:*) - # "uname -m" is not consistent, so use $cputype instead. 386 - # is converted to i386 for consistency with other x86 - # operating systems. - if test "$cputype" = "386"; then - UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" - fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; - *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; - *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; - KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; - XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; - *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; - *:ITS:*:*) - echo pdp10-unknown-its - exit ;; - SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; - *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - *:*VMS:*:*) - UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in - A*) echo alpha-dec-vms ; exit ;; - I*) echo ia64-dec-vms ; exit ;; - V*) echo vax-dec-vms ; exit ;; - esac ;; - *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; - i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; - i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -eval $set_cc_for_build -cat >$dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - if (version < 4) - printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); - else - printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-pc-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && - { echo "$SYSTEM_NAME"; exit; } - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit ;; - c34*) - echo c34-convex-bsd - exit ;; - c38*) - echo c38-convex-bsd - exit ;; - c4*) - echo c4-convex-bsd - exit ;; - esac -fi - -cat >&2 < in order to provide the needed -information to handle your system. - -config.guess timestamp = $timestamp - -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null` - -hostinfo = `(hostinfo) 2>/dev/null` -/bin/universe = `(/bin/universe) 2>/dev/null` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` -/bin/arch = `(/bin/arch) 2>/dev/null` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` - -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} -EOF - -exit 1 - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff -Nru xen-4.2.2/tools/config.h.in xen-4.3.0/tools/config.h.in --- xen-4.2.2/tools/config.h.in 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/config.h.in 2013-07-09 10:46:56.000000000 +0000 @@ -27,6 +27,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_EVENTFD_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H @@ -68,3 +71,9 @@ /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES diff -Nru xen-4.2.2/tools/config.sub xen-4.3.0/tools/config.sub --- xen-4.2.2/tools/config.sub 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/config.sub 1970-01-01 00:00:00.000000000 +0000 @@ -1,1714 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 -# Free Software Foundation, Inc. - -timestamp='2010-01-22' - -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. -# -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or in some cases, the newer four-part form: -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -me=`echo "$0" | sed -e 's,.*/,,'` - -usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS - -Canonicalize a configuration name. - -Operation modes: - -h, --help print this help, then exit - -t, --time-stamp print date of last modification, then exit - -v, --version print version number, then exit - -Report bugs and patches to ." - -version="\ -GNU config.sub ($timestamp) - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free -Software Foundation, Inc. - -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -help=" -Try \`$me --help' for more information." - -# Parse command line -while test $# -gt 0 ; do - case $1 in - --time-stamp | --time* | -t ) - echo "$timestamp" ; exit ;; - --version | -v ) - echo "$version" ; exit ;; - --help | --h* | -h ) - echo "$usage"; exit ;; - -- ) # Stop option processing - shift; break ;; - - ) # Use stdin as input. - break ;; - -* ) - echo "$me: invalid option $1$help" - exit 1 ;; - - *local*) - # First pass through any local machine types. - echo $1 - exit ;; - - * ) - break ;; - esac -done - -case $# in - 0) echo "$me: missing argument$help" >&2 - exit 1;; - 1) ;; - *) echo "$me: too many arguments$help" >&2 - exit 1;; -esac - -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ - uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) - os= - basic_machine=$1 - ;; - -bluegene*) - os=-cnk - ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 - ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nios | nios2 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | picochip) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - # We use `pc' rather than `unknown' - # because (1) that's what they normally are, and - # (2) the word "unknown" tends to confuse beginning users. - i*86 | x86_64) - basic_machine=$basic_machine-pc - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile-* | tilegx-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze) - basic_machine=microblaze-xilinx - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pc98) - basic_machine=i386-pc - ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc - ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc - ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc - ;; - pentium4) - basic_machine=i786-pc - ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tic54x | c54x*) - basic_machine=tic54x-unknown - os=-coff - ;; - tic55x | c55x*) - basic_machine=tic55x-unknown - os=-coff - ;; - tic6x | c6x*) - basic_machine=tic6x-unknown - os=-coff - ;; - # This must be matched before tile*. - tilegx*) - basic_machine=tilegx-unknown - os=-linux-gnu - ;; - tile*) - basic_machine=tile-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond - ;; - op50n) - basic_machine=hppa1.1-oki - ;; - op60c) - basic_machine=hppa1.1-oki - ;; - romp) - basic_machine=romp-ibm - ;; - mmix) - basic_machine=mmix-knuth - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown - ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple - ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple - ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux - ;; - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -svr4*) - os=-sysv4 - ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) - ;; - *) - os=-nto$os - ;; - esac - ;; - -nto-qnx*) - ;; - -nto*) - os=`echo $os | sed -e 's|nto|nto-qnx|'` - ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) - ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` - ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) - os=`echo $os | sed -e 's|linux|linux-gnu|'` - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -opened*) - os=-openedition - ;; - -os400*) - os=-os400 - ;; - -wince*) - os=-wince - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -atheos*) - os=-atheos - ;; - -syllable*) - os=-syllable - ;; - -386bsd) - os=-bsd - ;; - -ctix* | -uts*) - os=-sysv - ;; - -nova*) - os=-rtmk-nova - ;; - -ns2 ) - os=-nextstep2 - ;; - -nsk*) - os=-nsk - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -tpf*) - os=-tpf - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -ose*) - os=-ose - ;; - -es1800*) - os=-ose - ;; - -xenix) - os=-xenix - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint - ;; - -aros*) - os=-aros - ;; - -kaos*) - os=-kaos - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - score-*) - os=-elf - ;; - spu-*) - os=-elf - ;; - *-acorn) - os=-riscix1.2 - ;; - arm*-rebel) - os=-linux - ;; - arm*-semi) - os=-aout - ;; - c4x-* | tic4x-*) - os=-coff - ;; - # This must come before the *-dec entry. - pdp10-*) - os=-tops20 - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - m68*-cisco) - os=-aout - ;; - mep-*) - os=-elf - ;; - mips*-cisco) - os=-elf - ;; - mips*-*) - os=-elf - ;; - or32-*) - os=-coff - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-be) - os=-beos - ;; - *-haiku) - os=-haiku - ;; - *-ibm) - os=-aix - ;; - *-knuth) - os=-mmixware - ;; - *-wec) - os=-proelf - ;; - *-winbond) - os=-proelf - ;; - *-oki) - os=-proelf - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigaos - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - f30[01]-fujitsu | f700-fujitsu) - os=-uxpv - ;; - *-rom68k) - os=-coff - ;; - *-*bug) - os=-coff - ;; - *-apple) - os=-macos - ;; - *-atari*) - os=-mint - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -cnk*|-aix*) - vendor=ibm - ;; - -beos*) - vendor=be - ;; - -hpux*) - vendor=hp - ;; - -mpeix*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs* | -opened*) - vendor=ibm - ;; - -os400*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -tpf*) - vendor=ibm - ;; - -vxsim* | -vxworks* | -windiss*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - -hms*) - vendor=hitachi - ;; - -mpw* | -macos*) - vendor=apple - ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - vendor=atari - ;; - -vos*) - vendor=stratus - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os -exit - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "timestamp='" -# time-stamp-format: "%:y-%02m-%02d" -# time-stamp-end: "'" -# End: diff -Nru xen-4.2.2/tools/configure xen-4.3.0/tools/configure --- xen-4.2.2/tools/configure 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/configure 2013-07-09 10:46:56.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.67 for Xen Hypervisor 4.2. +# Generated by GNU Autoconf 2.67 for Xen Hypervisor Tools 4.3. # # Report bugs to . # @@ -550,15 +550,14 @@ MAKEFLAGS= # Identity of this package. -PACKAGE_NAME='Xen Hypervisor' -PACKAGE_TARNAME='xen-hypervisor' -PACKAGE_VERSION='4.2' -PACKAGE_STRING='Xen Hypervisor 4.2' +PACKAGE_NAME='Xen Hypervisor Tools' +PACKAGE_TARNAME='xen' +PACKAGE_VERSION='4.3' +PACKAGE_STRING='Xen Hypervisor Tools 4.3' PACKAGE_BUGREPORT='xen-devel@lists.xen.org' -PACKAGE_URL='' +PACKAGE_URL='http://www.xen.org/' ac_unique_file="libxl/libxl.c" -ac_default_prefix=/usr # Factoring default headers for most tests. ac_includes_default="\ #include @@ -606,6 +605,9 @@ EXTFS_LIBS system_aio zlib +FETCHER +FTP +WGET glib_LIBS glib_CFLAGS PKG_CONFIG_LIBDIR @@ -617,6 +619,8 @@ CPP pyconfig PYTHONPATH +CHECKPOLICY +OCAMLFIND OCAMLBUILD OCAMLDOC OCAMLMKLIB @@ -634,13 +638,6 @@ INSTALL_SCRIPT INSTALL_PROGRAM SET_MAKE -OBJEXT -EXEEXT -ac_ct_CC -CPPFLAGS -LDFLAGS -CFLAGS -CC IASL BCC LD86 @@ -663,11 +660,19 @@ ovmf lomount miniterm +xsmpolicy ocamltools xenapi -vtpm monitors githttp +FILE_OFFSET_BITS +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC host_os host_vendor host_cpu @@ -717,11 +722,12 @@ ac_subst_files='' ac_user_opts=' enable_option_checking +enable_largefile enable_githttp enable_monitors -enable_vtpm enable_xenapi enable_ocamltools +enable_xsmpolicy enable_miniterm enable_lomount enable_ovmf @@ -732,6 +738,11 @@ ac_precious_vars='build_alias host_alias target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS PREPEND_INCLUDES PREPEND_LIB APPEND_INCLUDES @@ -748,11 +759,6 @@ LD86 BCC IASL -CC -CFLAGS -LDFLAGS -LIBS -CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH @@ -1301,7 +1307,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Xen Hypervisor 4.2 to adapt to many kinds of systems. +\`configure' configures Xen Hypervisor Tools 4.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1349,7 +1355,7 @@ --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/xen-hypervisor] + --docdir=DIR documentation root [DATAROOTDIR/doc/xen] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] @@ -1366,7 +1372,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Xen Hypervisor 4.2:";; + short | recursive ) echo "Configuration of Xen Hypervisor Tools 4.3:";; esac cat <<\_ACEOF @@ -1374,14 +1380,14 @@ --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-largefile omit support for large files --enable-githttp Download GIT repositories via HTTP (default is DISABLED) --disable-monitors Disable xenstat and xentop monitoring tools (default is ENABLED) - --enable-vtpm Enable Virtual Trusted Platform Module (default is - DISABLED) --enable-xenapi Enable Xen API Bindings (default is DISABLED) --disable-ocamltools Disable Ocaml tools (default is ENABLED) + --disable-xsmpolicy Disable XSM policy compilation (default is ENABLED) --enable-miniterm Enable miniterm (default is DISABLED) --enable-lomount Enable lomount (default is DISABLED) --enable-ovmf Enable OVMF (default is DISABLED) @@ -1390,6 +1396,13 @@ --disable-debug Disable debug build of tools (default is ENABLED) Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory PREPEND_INCLUDES List of include folders to prepend to CFLAGS (without -I) PREPEND_LIB List of library folders to prepend to LDFLAGS (without -L) @@ -1408,13 +1421,6 @@ LD86 Path to ld86 tool BCC Path to bcc tool IASL Path to iasl tool - CC C compiler command - CFLAGS C compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if - you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH @@ -1428,6 +1434,7 @@ it to find libraries and programs with nonstandard names/locations. Report bugs to . +Xen Hypervisor Tools home page: . _ACEOF ac_status=$? fi @@ -1490,7 +1497,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Xen Hypervisor configure 4.2 +Xen Hypervisor Tools configure 4.3 generated by GNU Autoconf 2.67 Copyright (C) 2010 Free Software Foundation, Inc. @@ -1792,7 +1799,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Xen Hypervisor $as_me 4.2, which was +It was created by Xen Hypervisor Tools $as_me 4.3, which was generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ @@ -2145,9 +2152,8 @@ ac_config_headers="$ac_config_headers config.h" - ac_aux_dir= -for ac_dir in . "$srcdir"/.; do +for ac_dir in ../ "$srcdir"/../; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" @@ -2163,7 +2169,7 @@ fi done if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in . \"$srcdir\"/." "$LINENO" 5 + as_fn_error $? "cannot find install-sh, install.sh, or shtool in ../ \"$srcdir\"/../" "$LINENO" 5 fi # These three variables are undocumented and unsupported, @@ -2261,12 +2267,1012 @@ -# M4 Macro includes - - - - - +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5 ; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5 ; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5 ; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if test "${ac_cv_sys_largefile_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test "${ac_cv_sys_file_offset_bits+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if test "${ac_cv_sys_large_files+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi +fi + + +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) + FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits +;; +esac + + +# M4 Macro includes + + + + + + + @@ -2391,6 +3397,8 @@ + + # Enable/disable options # Check whether --enable-githttp was given. @@ -2412,53 +3420,30 @@ ax_cv_githttp="n" fi -githttp=$ax_cv_githttp - - - -# Check whether --enable-monitors was given. -if test "${enable_monitors+set}" = set; then : - enableval=$enable_monitors; -fi - - -if test "x$enable_monitors" = "xno"; then : - - ax_cv_monitors="n" - -elif test "x$enable_monitors" = "xyes"; then : - - ax_cv_monitors="y" - -elif test -z $ax_cv_monitors; then : - - ax_cv_monitors="y" - -fi -monitors=$ax_cv_monitors +githttp=$ax_cv_githttp -# Check whether --enable-vtpm was given. -if test "${enable_vtpm+set}" = set; then : - enableval=$enable_vtpm; +# Check whether --enable-monitors was given. +if test "${enable_monitors+set}" = set; then : + enableval=$enable_monitors; fi -if test "x$enable_vtpm" = "xno"; then : +if test "x$enable_monitors" = "xno"; then : - ax_cv_vtpm="n" + ax_cv_monitors="n" -elif test "x$enable_vtpm" = "xyes"; then : +elif test "x$enable_monitors" = "xyes"; then : - ax_cv_vtpm="y" + ax_cv_monitors="y" -elif test -z $ax_cv_vtpm; then : +elif test -z $ax_cv_monitors; then : - ax_cv_vtpm="n" + ax_cv_monitors="y" fi -vtpm=$ax_cv_vtpm +monitors=$ax_cv_monitors @@ -2508,6 +3493,29 @@ +# Check whether --enable-xsmpolicy was given. +if test "${enable_xsmpolicy+set}" = set; then : + enableval=$enable_xsmpolicy; +fi + + +if test "x$enable_xsmpolicy" = "xno"; then : + + ax_cv_xsmpolicy="n" + +elif test "x$enable_xsmpolicy" = "xyes"; then : + + ax_cv_xsmpolicy="y" + +elif test -z $ax_cv_xsmpolicy; then : + + ax_cv_xsmpolicy="y" + +fi +xsmpolicy=$ax_cv_xsmpolicy + + + # Check whether --enable-miniterm was given. if test "${enable_miniterm+set}" = set; then : enableval=$enable_miniterm; @@ -3005,263 +4013,13 @@ sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 - cat conftest.er1 >&5 - fi - rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -done - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` - -# The possible output files: -ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" - -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { { ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5 ; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } -ac_exeext=$ac_cv_exeext - -rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } -if { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5 ; } -fi -rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -FILE *f = fopen ("conftest.out", "w"); - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -ac_clean_files="$ac_clean_files conftest.out" -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } -if test "$cross_compiling" != yes; then - { { ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } - if { ac_try='./conftest$ac_cv_exeext' - { { case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5 ; } - fi - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } - -rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out -ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { { ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac + test $ac_status = 0; } done -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5 ; } -fi -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : @@ -3719,7 +4477,7 @@ fi -if test x"${PERL}" == x"no" +if test x"${PERL}" = x"no" then as_fn_error $? "Unable to find perl, please install perl" "$LINENO" 5 fi @@ -3766,7 +4524,7 @@ fi -if test x"${CURL}" == x"no" +if test x"${CURL}" = x"no" then as_fn_error $? "Unable to find curl-config, please install curl-config" "$LINENO" 5 fi @@ -3811,7 +4569,7 @@ fi -if test x"${XML}" == x"no" +if test x"${XML}" = x"no" then as_fn_error $? "Unable to find xml2-config, please install xml2-config" "$LINENO" 5 fi @@ -4817,7 +5575,103 @@ fi - if test "x$OCAMLC" = "xno"; then : + + # checking for ocamlfind + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ocamlfind", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlfind; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OCAMLFIND+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLFIND"; then + ac_cv_prog_OCAMLFIND="$OCAMLFIND" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OCAMLFIND="${ac_tool_prefix}ocamlfind" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OCAMLFIND=$ac_cv_prog_OCAMLFIND +if test -n "$OCAMLFIND"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLFIND" >&5 +$as_echo "$OCAMLFIND" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OCAMLFIND"; then + ac_ct_OCAMLFIND=$OCAMLFIND + # Extract the first word of "ocamlfind", so it can be a program name with args. +set dummy ocamlfind; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OCAMLFIND+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OCAMLFIND"; then + ac_cv_prog_ac_ct_OCAMLFIND="$ac_ct_OCAMLFIND" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OCAMLFIND="ocamlfind" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OCAMLFIND=$ac_cv_prog_ac_ct_OCAMLFIND +if test -n "$ac_ct_OCAMLFIND"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLFIND" >&5 +$as_echo "$ac_ct_OCAMLFIND" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OCAMLFIND" = x; then + OCAMLFIND="no" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OCAMLFIND=$ac_ct_OCAMLFIND + fi +else + OCAMLFIND="$ac_cv_prog_OCAMLFIND" +fi + + + + if test "x$OCAMLC" = "xno" || test "x$OCAMLFIND" = "xno"; then : if test "x$enable_ocamltools" = "xyes"; then : @@ -4828,6 +5682,120 @@ fi fi +if test "x$xsmpolicy" = "xy"; then : + + # check for a checkpolicy binary with support for -t xen + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}checkpolicy", so it can be a program name with args. +set dummy ${ac_tool_prefix}checkpolicy; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CHECKPOLICY+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CHECKPOLICY"; then + ac_cv_prog_CHECKPOLICY="$CHECKPOLICY" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CHECKPOLICY="${ac_tool_prefix}checkpolicy" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CHECKPOLICY=$ac_cv_prog_CHECKPOLICY +if test -n "$CHECKPOLICY"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECKPOLICY" >&5 +$as_echo "$CHECKPOLICY" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CHECKPOLICY"; then + ac_ct_CHECKPOLICY=$CHECKPOLICY + # Extract the first word of "checkpolicy", so it can be a program name with args. +set dummy checkpolicy; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CHECKPOLICY+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CHECKPOLICY"; then + ac_cv_prog_ac_ct_CHECKPOLICY="$ac_ct_CHECKPOLICY" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CHECKPOLICY="checkpolicy" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CHECKPOLICY=$ac_cv_prog_ac_ct_CHECKPOLICY +if test -n "$ac_ct_CHECKPOLICY"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CHECKPOLICY" >&5 +$as_echo "$ac_ct_CHECKPOLICY" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CHECKPOLICY" = x; then + CHECKPOLICY="no" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CHECKPOLICY=$ac_ct_CHECKPOLICY + fi +else + CHECKPOLICY="$ac_cv_prog_CHECKPOLICY" +fi + + + if test "$CHECKPOLICY" != "no"; then + CHECKPOLICYHELP=`$CHECKPOLICY -h | grep xen` + if test "$CHECKPOLICYHELP" = ""; then + CHECKPOLICY=no + fi + fi + + if test "x$CHECKPOLICY" = "xno"; then : + + if test "x$enable_xsmpolicy" = "xyes"; then : + + as_fn_error $? "XSM policy compilation enabled, but unable to find checkpolicy" "$LINENO" 5 +fi + xsmpolicy="n" + +fi + +fi # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -4869,7 +5837,7 @@ fi -if test x"${BASH}" == x"no" +if test x"${BASH}" = x"no" then as_fn_error $? "Unable to find bash, please install bash" "$LINENO" 5 fi @@ -4924,7 +5892,7 @@ fi -if test x"${PYTHONPATH}" == x"no" +if test x"${PYTHONPATH}" = x"no" then as_fn_error $? "Unable to find $PYTHON, please install $PYTHON" "$LINENO" 5 fi @@ -5339,6 +6307,8 @@ done +if test "$cross_compiling" != yes; then : + ac_previous_cppflags=$CPPFLAGS ac_previous_ldflags=$LDFLAGS @@ -5385,7 +6355,7 @@ fi -if test x"$pyconfig" == x"no"; then : +if test x"$pyconfig" = x"no"; then : CPPFLAGS="$CFLAGS `$PYTHON -c 'import distutils.sysconfig; \ print "-I" + distutils.sysconfig.get_config_var("INCLUDEPY")'`" @@ -5470,6 +6440,9 @@ CPPFLAGS=$ac_previous_cppflags LDLFAGS=$ac_previous_ldflags + +fi + # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -5511,7 +6484,7 @@ fi -if test x"${XGETTEXT}" == x"no" +if test x"${XGETTEXT}" = x"no" then as_fn_error $? "Unable to find xgettext, please install xgettext" "$LINENO" 5 fi @@ -5558,7 +6531,7 @@ fi -if test x"${AS86}" == x"no" +if test x"${AS86}" = x"no" then as_fn_error $? "Unable to find as86, please install as86" "$LINENO" 5 fi @@ -5603,7 +6576,7 @@ fi -if test x"${LD86}" == x"no" +if test x"${LD86}" = x"no" then as_fn_error $? "Unable to find ld86, please install ld86" "$LINENO" 5 fi @@ -5648,7 +6621,7 @@ fi -if test x"${BCC}" == x"no" +if test x"${BCC}" = x"no" then as_fn_error $? "Unable to find bcc, please install bcc" "$LINENO" 5 fi @@ -5693,7 +6666,7 @@ fi -if test x"${IASL}" == x"no" +if test x"${IASL}" = x"no" then as_fn_error $? "Unable to find iasl, please install iasl" "$LINENO" 5 fi @@ -6094,6 +7067,108 @@ fi +# Extract the first word of "wget", so it can be a program name with args. +set dummy wget; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_WGET+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $WGET in + [\\/]* | ?:[\\/]*) + ac_cv_path_WGET="$WGET" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="no" + ;; +esac +fi +WGET=$ac_cv_path_WGET +if test -n "$WGET"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5 +$as_echo "$WGET" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test x"$WGET" != x"no"; then : + + FETCHER="$WGET -c -O" + +else + + # Extract the first word of "ftp", so it can be a program name with args. +set dummy ftp; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_FTP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $FTP in + [\\/]* | ?:[\\/]*) + ac_cv_path_FTP="$FTP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_FTP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_FTP" && ac_cv_path_FTP="no" + ;; +esac +fi +FTP=$ac_cv_path_FTP +if test -n "$FTP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FTP" >&5 +$as_echo "$FTP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$FTP" != x"no"; then : + + FETCHER="$FTP -o" + +else + + as_fn_error $? "cannot find wget or ftp" "$LINENO" 5 + +fi + +fi + + + # Checks for libraries. ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default" if test "x$ac_cv_header_bzlib_h" = x""yes; then : @@ -6746,12 +7821,13 @@ # Checks for header files. -for ac_header in yajl/yajl_version.h +for ac_header in yajl/yajl_version.h sys/eventfd.h do : - ac_fn_c_check_header_mongrel "$LINENO" "yajl/yajl_version.h" "ac_cv_header_yajl_yajl_version_h" "$ac_includes_default" -if test "x$ac_cv_header_yajl_yajl_version_h" = x""yes; then : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF -#define HAVE_YAJL_YAJL_VERSION_H 1 +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi @@ -7265,7 +8341,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Xen Hypervisor $as_me 4.2, which was +This file was extended by Xen Hypervisor Tools $as_me 4.3, which was generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -7321,13 +8397,14 @@ Configuration headers: $config_headers -Report bugs to ." +Report bugs to . +Xen Hypervisor Tools home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -Xen Hypervisor config.status 4.2 +Xen Hypervisor Tools config.status 4.3 configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" diff -Nru xen-4.2.2/tools/configure.ac xen-4.3.0/tools/configure.ac --- xen-4.2.2/tools/configure.ac 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/configure.ac 2013-07-09 10:46:56.000000000 +0000 @@ -2,13 +2,12 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ([2.67]) -AC_INIT([Xen Hypervisor], m4_esyscmd([../version.sh ../xen/Makefile]), - [xen-devel@lists.xen.org]) +AC_INIT([Xen Hypervisor Tools], m4_esyscmd([../version.sh ../xen/Makefile]), + [xen-devel@lists.xen.org], [xen], [http://www.xen.org/]) AC_CONFIG_SRCDIR([libxl/libxl.c]) AC_CONFIG_FILES([../config/Tools.mk]) AC_CONFIG_HEADERS([config.h]) -AC_PREFIX_DEFAULT([/usr]) -AC_CONFIG_AUX_DIR([.]) +AC_CONFIG_AUX_DIR([../]) # Check if CFLAGS, LDFLAGS, LIBS, CPPFLAGS or CPP is set and print a warning @@ -21,27 +20,39 @@ AC_CANONICAL_HOST +AC_SYS_LARGEFILE + +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) + FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits +;; +esac +AC_SUBST(FILE_OFFSET_BITS) + # M4 Macro includes -m4_include([m4/savevar.m4]) -m4_include([m4/features.m4]) -m4_include([m4/path_or_fail.m4]) -m4_include([m4/python_version.m4]) -m4_include([m4/python_devel.m4]) -m4_include([m4/ocaml.m4]) -m4_include([m4/set_cflags_ldflags.m4]) -m4_include([m4/uuid.m4]) -m4_include([m4/pkg.m4]) -m4_include([m4/curses.m4]) -m4_include([m4/pthread.m4]) -m4_include([m4/ptyfuncs.m4]) -m4_include([m4/extfs.m4]) +m4_include([../m4/savevar.m4]) +m4_include([../m4/features.m4]) +m4_include([../m4/path_or_fail.m4]) +m4_include([../m4/python_version.m4]) +m4_include([../m4/python_devel.m4]) +m4_include([../m4/ocaml.m4]) +m4_include([../m4/checkpolicy.m4]) +m4_include([../m4/set_cflags_ldflags.m4]) +m4_include([../m4/uuid.m4]) +m4_include([../m4/pkg.m4]) +m4_include([../m4/curses.m4]) +m4_include([../m4/pthread.m4]) +m4_include([../m4/ptyfuncs.m4]) +m4_include([../m4/extfs.m4]) +m4_include([../m4/fetcher.m4]) # Enable/disable options AX_ARG_DEFAULT_DISABLE([githttp], [Download GIT repositories via HTTP]) AX_ARG_DEFAULT_ENABLE([monitors], [Disable xenstat and xentop monitoring tools]) -AX_ARG_DEFAULT_DISABLE([vtpm], [Enable Virtual Trusted Platform Module]) AX_ARG_DEFAULT_DISABLE([xenapi], [Enable Xen API Bindings]) AX_ARG_DEFAULT_ENABLE([ocamltools], [Disable Ocaml tools]) +AX_ARG_DEFAULT_ENABLE([xsmpolicy], [Disable XSM policy compilation]) AX_ARG_DEFAULT_DISABLE([miniterm], [Enable miniterm]) AX_ARG_DEFAULT_DISABLE([lomount], [Enable lomount]) AX_ARG_DEFAULT_DISABLE([ovmf], [Enable OVMF]) @@ -86,12 +97,21 @@ ]) AS_IF([test "x$ocamltools" = "xy"], [ AC_PROG_OCAML - AS_IF([test "x$OCAMLC" = "xno"], [ + AC_PROG_FINDLIB + AS_IF([test "x$OCAMLC" = "xno" || test "x$OCAMLFIND" = "xno"], [ AS_IF([test "x$enable_ocamltools" = "xyes"], [ AC_MSG_ERROR([Ocaml tools enabled, but unable to find Ocaml])]) ocamltools="n" ]) ]) +AS_IF([test "x$xsmpolicy" = "xy"], [ + AC_PROG_CHECKPOLICY + AS_IF([test "x$CHECKPOLICY" = "xno"], [ + AS_IF([test "x$enable_xsmpolicy" = "xyes"], [ + AC_MSG_ERROR([XSM policy compilation enabled, but unable to find checkpolicy])]) + xsmpolicy="n" + ]) +]) AX_PATH_PROG_OR_FAIL([BASH], [bash]) AS_IF([echo "$PYTHON" | grep -q "^/"], [ PYTHONPATH=$PYTHON @@ -100,7 +120,11 @@ [AC_MSG_ERROR([PYTHON specified, but is not an absolute path])]) AX_PATH_PROG_OR_FAIL([PYTHONPATH], [$PYTHON]) AX_CHECK_PYTHON_VERSION([2], [3]) - AX_CHECK_PYTHON_DEVEL() + +AS_IF([test "$cross_compiling" != yes], [ + AX_CHECK_PYTHON_DEVEL() +]) + AX_PATH_PROG_OR_FAIL([XGETTEXT], [xgettext]) dnl as86, ld86, bcc and iasl are only required when the host system is x86*. dnl "host" here means the platform on which the hypervisor and tools is @@ -117,6 +141,7 @@ AX_CHECK_UUID AX_CHECK_CURSES PKG_CHECK_MODULES(glib, [glib-2.0 >= 2.12]) +AX_CHECK_FETCHER # Checks for libraries. AC_CHECK_HEADER([bzlib.h], [ @@ -144,6 +169,6 @@ AC_SUBST(libiconv) # Checks for header files. -AC_CHECK_HEADERS([yajl/yajl_version.h]) +AC_CHECK_HEADERS([yajl/yajl_version.h sys/eventfd.h]) AC_OUTPUT() diff -Nru xen-4.2.2/tools/console/daemon/io.c xen-4.3.0/tools/console/daemon/io.c --- xen-4.2.2/tools/console/daemon/io.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/console/daemon/io.c 2013-07-09 10:46:56.000000000 +0000 @@ -24,11 +24,12 @@ #include "io.h" #include #include +#include #include #include #include -#include +#include #include #include #include @@ -66,9 +67,14 @@ static int log_time_hv_needts = 1; static int log_time_guest_needts = 1; static int log_hv_fd = -1; -static evtchn_port_or_error_t log_hv_evtchn = -1; -static xc_interface *xch; /* why does xenconsoled have two xc handles ? */ -static xc_evtchn *xce_handle = NULL; + +static xc_gnttab *xcg_handle = NULL; + +static struct pollfd *fds; +static unsigned int current_array_size; +static unsigned int nr_fds; + +#define ROUNDUP(_x,_w) (((unsigned long)(_x)+(1UL<<(_w))-1) & ~((1UL<<(_w))-1)) struct buffer { char *data; @@ -81,6 +87,7 @@ struct domain { int domid; int master_fd; + int master_pollfd_idx; int slave_fd; int log_fd; bool is_dead; @@ -92,6 +99,7 @@ evtchn_port_or_error_t local_port; evtchn_port_or_error_t remote_port; xc_evtchn *xce_handle; + int xce_pollfd_idx; struct xencons_interface *interface; int event_count; long long next_period; @@ -501,6 +509,18 @@ va_end(ap); return ret; } + +static void domain_unmap_interface(struct domain *dom) +{ + if (dom->interface == NULL) + return; + if (xcg_handle && dom->ring_ref == -1) + xc_gnttab_munmap(xcg_handle, dom->interface, 1); + else + munmap(dom->interface, getpagesize()); + dom->interface = NULL; + dom->ring_ref = -1; +} static int domain_create_ring(struct domain *dom) { @@ -522,9 +542,19 @@ } free(type); - if (ring_ref != dom->ring_ref) { - if (dom->interface != NULL) - munmap(dom->interface, getpagesize()); + /* If using ring_ref and it has changed, remap */ + if (ring_ref != dom->ring_ref && dom->ring_ref != -1) + domain_unmap_interface(dom); + + if (!dom->interface && xcg_handle) { + /* Prefer using grant table */ + dom->interface = xc_gnttab_map_grant_ref(xcg_handle, + dom->domid, GNTTAB_RESERVED_CONSOLE, + PROT_READ|PROT_WRITE); + dom->ring_ref = -1; + } + if (!dom->interface) { + /* Fall back to xc_map_foreign_range */ dom->interface = xc_map_foreign_range( xc, dom->domid, getpagesize(), PROT_READ|PROT_WRITE, @@ -621,7 +651,7 @@ return NULL; } - dom = (struct domain *)malloc(sizeof(struct domain)); + dom = calloc(1, sizeof *dom); if (dom == NULL) { dolog(LOG_ERR, "Out of memory %s:%s():L%d", __FILE__, __FUNCTION__, __LINE__); @@ -639,24 +669,16 @@ strcat(dom->conspath, "/console"); dom->master_fd = -1; + dom->master_pollfd_idx = -1; dom->slave_fd = -1; dom->log_fd = -1; + dom->xce_pollfd_idx = -1; - dom->is_dead = false; - dom->buffer.data = 0; - dom->buffer.consumed = 0; - dom->buffer.size = 0; - dom->buffer.capacity = 0; - dom->buffer.max_capacity = 0; - dom->event_count = 0; dom->next_period = ((long long)ts.tv_sec * 1000) + (ts.tv_nsec / 1000000) + RATE_LIMIT_PERIOD; - dom->next = NULL; dom->ring_ref = -1; dom->local_port = -1; dom->remote_port = -1; - dom->interface = NULL; - dom->xce_handle = NULL; if (!watch_domain(dom, true)) goto out; @@ -720,9 +742,7 @@ { d->is_dead = true; watch_domain(d, false); - if (d->interface != NULL) - munmap(d->interface, getpagesize()); - d->interface = NULL; + domain_unmap_interface(d); if (d->xce_handle != NULL) xc_evtchn_close(d->xce_handle); d->xce_handle = NULL; @@ -730,7 +750,7 @@ static unsigned enum_pass = 0; -void enum_domains(void) +static void enum_domains(void) { int domid = 1; xc_dominfo_t dominfo; @@ -769,6 +789,17 @@ return (sizeof(intf->in) - space); } +static void domain_handle_broken_tty(struct domain *dom, int recreate) +{ + domain_close_tty(dom); + + if (recreate) { + domain_create_tty(dom); + } else { + shutdown_domain(dom); + } +} + static void handle_tty_read(struct domain *dom) { ssize_t len = 0; @@ -794,13 +825,7 @@ * keep the slave open for the duration. */ if (len < 0) { - domain_close_tty(dom); - - if (domain_is_valid(dom->domid)) { - domain_create_tty(dom); - } else { - shutdown_domain(dom); - } + domain_handle_broken_tty(dom, domain_is_valid(dom->domid)); } else if (domain_is_valid(dom->domid)) { prod = intf->in_prod; for (i = 0; i < len; i++) { @@ -828,14 +853,7 @@ if (len < 1) { dolog(LOG_DEBUG, "Write failed on domain %d: %zd, %d\n", dom->domid, len, errno); - - domain_close_tty(dom); - - if (domain_is_valid(dom->domid)) { - domain_create_tty(dom); - } else { - shutdown_domain(dom); - } + domain_handle_broken_tty(dom, domain_is_valid(dom->domid)); } else { buffer_advance(&dom->buffer, len); } @@ -883,7 +901,7 @@ free(vec); } -static void handle_hv_logs(void) +static void handle_hv_logs(xc_evtchn *xce_handle) { char buffer[1024*16]; char *bufptr = buffer; @@ -894,7 +912,7 @@ if ((port = xc_evtchn_pending(xce_handle)) == -1) return; - if (xc_readconsolering(xch, bufptr, &size, 0, 1, &index) == 0 && size > 0) { + if (xc_readconsolering(xc, bufptr, &size, 0, 1, &index) == 0 && size > 0) { int logret; if (log_time_hv) logret = write_with_timestamp(log_hv_fd, buffer, size, @@ -928,18 +946,56 @@ } } +/* Returns index inside fds array if succees, -1 if fail */ +static int set_fds(int fd, short events) +{ + int ret; + if (current_array_size < nr_fds + 1) { + struct pollfd *new_fds = NULL; + unsigned long newsize; + + /* Round up to 2^8 boundary, in practice this just + * make newsize larger than current_array_size. + */ + newsize = ROUNDUP(nr_fds + 1, 8); + + new_fds = realloc(fds, sizeof(struct pollfd)*newsize); + if (!new_fds) + goto fail; + fds = new_fds; + + memset(&fds[0] + current_array_size, 0, + sizeof(struct pollfd) * (newsize-current_array_size)); + current_array_size = newsize; + } + + fds[nr_fds].fd = fd; + fds[nr_fds].events = events; + ret = nr_fds; + nr_fds++; + + return ret; +fail: + dolog(LOG_ERR, "realloc failed, ignoring fd %d\n", fd); + return -1; +} + +static void reset_fds(void) +{ + nr_fds = 0; + if (fds) + memset(fds, 0, sizeof(struct pollfd) * current_array_size); +} + void handle_io(void) { - fd_set readfds, writefds; int ret; + evtchn_port_or_error_t log_hv_evtchn = -1; + int xce_pollfd_idx = -1; + int xs_pollfd_idx = -1; + xc_evtchn *xce_handle = NULL; if (log_hv) { - xch = xc_interface_open(0,0,0); - if (!xch) { - dolog(LOG_ERR, "Failed to open xc handle: %d (%s)", - errno, strerror(errno)); - goto out; - } xce_handle = xc_evtchn_open(NULL, 0); if (xce_handle == NULL) { dolog(LOG_ERR, "Failed to open xce handle: %d (%s)", @@ -957,23 +1013,27 @@ } } + xcg_handle = xc_gnttab_open(NULL, 0); + if (xcg_handle == NULL) { + dolog(LOG_DEBUG, "Failed to open xcg handle: %d (%s)", + errno, strerror(errno)); + } + + enum_domains(); + for (;;) { struct domain *d, *n; - int max_fd = -1; - struct timeval timeout; + int poll_timeout; /* timeout in milliseconds */ struct timespec ts; long long now, next_timeout = 0; - FD_ZERO(&readfds); - FD_ZERO(&writefds); + reset_fds(); - FD_SET(xs_fileno(xs), &readfds); - max_fd = MAX(xs_fileno(xs), max_fd); + xs_pollfd_idx = set_fds(xs_fileno(xs), POLLIN|POLLPRI); - if (log_hv) { - FD_SET(xc_evtchn_fd(xce_handle), &readfds); - max_fd = MAX(xc_evtchn_fd(xce_handle), max_fd); - } + if (log_hv) + xce_pollfd_idx = set_fds(xc_evtchn_fd(xce_handle), + POLLIN|POLLPRI); if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) return; @@ -982,10 +1042,12 @@ /* Re-calculate any event counter allowances & unblock domains with new allowance */ for (d = dom_head; d; d = d->next) { - /* Add 5ms of fuzz since select() often returns - a couple of ms sooner than requested. Without - the fuzz we typically do an extra spin in select() - with a 1/2 ms timeout every other iteration */ + /* CS 16257:955ee4fa1345 introduces a 5ms fuzz + * for select(), it is not clear poll() has + * similar behavior (returning a couple of ms + * sooner than requested) as well. Just leave + * the fuzz here. Remove it with a separate + * patch if necessary */ if ((now+5) > d->next_period) { d->next_period = now + RATE_LIMIT_PERIOD; if (d->event_count >= RATE_LIMIT_ALLOWANCE) { @@ -1006,75 +1068,107 @@ !d->buffer.max_capacity || d->buffer.size < d->buffer.max_capacity) { int evtchn_fd = xc_evtchn_fd(d->xce_handle); - FD_SET(evtchn_fd, &readfds); - max_fd = MAX(evtchn_fd, max_fd); + d->xce_pollfd_idx = set_fds(evtchn_fd, + POLLIN|POLLPRI); } } if (d->master_fd != -1) { + short events = 0; if (!d->is_dead && ring_free_bytes(d)) - FD_SET(d->master_fd, &readfds); + events |= POLLIN; if (!buffer_empty(&d->buffer)) - FD_SET(d->master_fd, &writefds); - max_fd = MAX(d->master_fd, max_fd); + events |= POLLOUT; + + if (events) + d->master_pollfd_idx = + set_fds(d->master_fd, + events|POLLPRI); } } /* If any domain has been rate limited, we need to work - out what timeout to supply to select */ + out what timeout to supply to poll */ if (next_timeout) { long long duration = (next_timeout - now); if (duration <= 0) /* sanity check */ duration = 1; - timeout.tv_sec = duration / 1000; - timeout.tv_usec = ((duration - (timeout.tv_sec * 1000)) - * 1000); + poll_timeout = (int)duration; } - ret = select(max_fd + 1, &readfds, &writefds, 0, - next_timeout ? &timeout : NULL); + ret = poll(fds, nr_fds, next_timeout ? poll_timeout : -1); if (log_reload) { handle_log_reload(); log_reload = 0; } - /* Abort if select failed, except for EINTR cases + /* Abort if poll failed, except for EINTR cases which indicate a possible log reload */ if (ret == -1) { if (errno == EINTR) continue; - dolog(LOG_ERR, "Failure in select: %d (%s)", + dolog(LOG_ERR, "Failure in poll: %d (%s)", errno, strerror(errno)); break; } - if (log_hv && FD_ISSET(xc_evtchn_fd(xce_handle), &readfds)) - handle_hv_logs(); + if (log_hv && xce_pollfd_idx != -1) { + if (fds[xce_pollfd_idx].revents & ~(POLLIN|POLLOUT|POLLPRI)) { + dolog(LOG_ERR, + "Failure in poll xce_handle: %d (%s)", + errno, strerror(errno)); + break; + } else if (fds[xce_pollfd_idx].revents & POLLIN) + handle_hv_logs(xce_handle); + + xce_pollfd_idx = -1; + } if (ret <= 0) continue; - if (FD_ISSET(xs_fileno(xs), &readfds)) - handle_xs(); + if (xs_pollfd_idx != -1) { + if (fds[xs_pollfd_idx].revents & ~(POLLIN|POLLOUT|POLLPRI)) { + dolog(LOG_ERR, + "Failure in poll xs_handle: %d (%s)", + errno, strerror(errno)); + break; + } else if (fds[xs_pollfd_idx].revents & POLLIN) + handle_xs(); + + xs_pollfd_idx = -1; + } for (d = dom_head; d; d = n) { n = d->next; if (d->event_count < RATE_LIMIT_ALLOWANCE) { if (d->xce_handle != NULL && - FD_ISSET(xc_evtchn_fd(d->xce_handle), - &readfds)) - handle_ring_read(d); + d->xce_pollfd_idx != -1 && + !(fds[d->xce_pollfd_idx].revents & + ~(POLLIN|POLLOUT|POLLPRI)) && + (fds[d->xce_pollfd_idx].revents & + POLLIN)) + handle_ring_read(d); + } + + if (d->master_fd != -1 && d->master_pollfd_idx != -1) { + if (fds[d->master_pollfd_idx].revents & + ~(POLLIN|POLLOUT|POLLPRI)) + domain_handle_broken_tty(d, + domain_is_valid(d->domid)); + else { + if (fds[d->master_pollfd_idx].revents & + POLLIN) + handle_tty_read(d); + if (fds[d->master_pollfd_idx].revents & + POLLOUT) + handle_tty_write(d); + } } - if (d->master_fd != -1 && FD_ISSET(d->master_fd, - &readfds)) - handle_tty_read(d); - - if (d->master_fd != -1 && FD_ISSET(d->master_fd, - &writefds)) - handle_tty_write(d); + d->xce_pollfd_idx = d->master_pollfd_idx = -1; if (d->last_seen != enum_pass) shutdown_domain(d); @@ -1084,19 +1178,22 @@ } } + free(fds); + current_array_size = 0; + out: if (log_hv_fd != -1) { close(log_hv_fd); log_hv_fd = -1; } - if (xch) { - xc_interface_close(xch); - xch = 0; - } if (xce_handle != NULL) { xc_evtchn_close(xce_handle); xce_handle = NULL; } + if (xcg_handle != NULL) { + xc_gnttab_close(xcg_handle); + xcg_handle = NULL; + } log_hv_evtchn = -1; } diff -Nru xen-4.2.2/tools/console/daemon/io.h xen-4.3.0/tools/console/daemon/io.h --- xen-4.2.2/tools/console/daemon/io.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/console/daemon/io.h 2013-07-09 10:46:56.000000000 +0000 @@ -21,7 +21,6 @@ #ifndef CONSOLED_IO_H #define CONSOLED_IO_H -void enum_domains(void); void handle_io(void); #endif diff -Nru xen-4.2.2/tools/console/daemon/main.c xen-4.3.0/tools/console/daemon/main.c --- xen-4.2.2/tools/console/daemon/main.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/console/daemon/main.c 2013-07-09 10:46:56.000000000 +0000 @@ -161,8 +161,6 @@ if (!xen_setup()) exit(1); - enum_domains(); - handle_io(); closelog(); diff -Nru xen-4.2.2/tools/debugger/gdbsx/xg/xg_main.c xen-4.3.0/tools/debugger/gdbsx/xg/xg_main.c --- xen-4.2.2/tools/debugger/gdbsx/xg/xg_main.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/gdbsx/xg/xg_main.c 2013-07-09 10:46:56.000000000 +0000 @@ -34,6 +34,7 @@ * XGTRC(): generic trace utility */ +#include #include #include #include diff -Nru xen-4.2.2/tools/debugger/kdd/Makefile xen-4.3.0/tools/debugger/kdd/Makefile --- xen-4.2.2/tools/debugger/kdd/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/kdd/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -14,7 +14,7 @@ .PHONY: clean clean: - rm -f $(OBJS) kdd + rm -f $(OBJS) $(DEPS) kdd .PHONY: install install: all diff -Nru xen-4.2.2/tools/debugger/xenitp/Makefile xen-4.3.0/tools/debugger/xenitp/Makefile --- xen-4.2.2/tools/debugger/xenitp/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -XEN_ROOT=$(CURDIR)/../../.. -include $(XEN_ROOT)/tools/Rules.mk - -#CFLAGS += -Werror -g -O0 - -CFLAGS += $(CFLAGS_libxenctrl) - -LIBBIN = - -ifeq ($(XEN_TARGET_ARCH),ia64) -LIBBIN += xenitp -endif - -.PHONY: all -all: build - -.PHONY: build -build: $(LIBBIN) - -.PHONY: install -install: build - [ -z "$(LIBBIN)" ] || $(INSTALL_DIR) $(DESTDIR)$(PRIVATE_BINDIR) - [ -z "$(LIBBIN)" ] || $(INSTALL_PROG) $(LIBBIN) $(DESTDIR)$(PRIVATE_BINDIR) - -.PHONY: clean -clean: - $(RM) *.a *.so *.o *.rpm $(LIBBIN) - -XENITP_OBJS=xenitp.o ia64-dis.o ia64-opc.o cpu-ia64-opc.o - -xenitp: $(XENITP_OBJS) - $(CC) $(CFLAGS) -o $@ $(XENITP_OBJS) $(LDLIBS_libxenctrl) diff -Nru xen-4.2.2/tools/debugger/xenitp/README xen-4.3.0/tools/debugger/xenitp/README --- xen-4.2.2/tools/debugger/xenitp/README 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/README 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -xenitp README -************* - - -Xenitp is a low-level, non-symbolic debugger. It only works on ia64. - -* Building xenitp -First do 'make tools' at the top level to build libxc and includes. Then -cd to tools/debugger/xenitp and do make. - -* Using xenitp -Usage is: xenitp DOM -DOM is a domain number. -'help' shows all the command available. -When the domain is running, C-c stops it. - -* Source origin -All these files come from binutils: -cpu-ia64-opc.c -dis-asm.h -ia64-asmtab.c -ia64-asmtab.h -ia64-dis.c -ia64-gen.c -ia64.h -ia64-opc-a.c -ia64-opc-b.c -ia64-opc.c -ia64-opc-d.c -ia64-opc-f.c -ia64-opc.h -ia64-opc-i.c -ia64-opc-m.c -ia64-opc-x.c - -xenitp.c is based on xenctxt.c diff -Nru xen-4.2.2/tools/debugger/xenitp/cpu-ia64-opc.c xen-4.3.0/tools/debugger/xenitp/cpu-ia64-opc.c --- xen-4.2.2/tools/debugger/xenitp/cpu-ia64-opc.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/cpu-ia64-opc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,615 +0,0 @@ -/* Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006 - Free Software Foundation, Inc. - Contributed by David Mosberger-Tang - -This file is part of BFD, the Binary File Descriptor library. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ - -/* Logically, this code should be part of libopcode but since some of - the operand insertion/extraction functions help bfd to implement - relocations, this code is included as part of cpu-ia64.c. This - avoids circular dependencies between libopcode and libbfd and also - obviates the need for applications to link in libopcode when all - they really want is libbfd. - - --davidm Mon Apr 13 22:14:02 1998 */ - -#include "ia64-opc.h" - -#define NELEMS(a) ((int) (sizeof (a) / sizeof ((a)[0]))) - -static const char* -ins_rsvd (const struct ia64_operand *self ATTRIBUTE_UNUSED, - ia64_insn value ATTRIBUTE_UNUSED, ia64_insn *code ATTRIBUTE_UNUSED) -{ - return "internal error---this shouldn't happen"; -} - -static const char* -ext_rsvd (const struct ia64_operand *self ATTRIBUTE_UNUSED, - ia64_insn code ATTRIBUTE_UNUSED, ia64_insn *valuep ATTRIBUTE_UNUSED) -{ - return "internal error---this shouldn't happen"; -} - -static const char* -ins_const (const struct ia64_operand *self ATTRIBUTE_UNUSED, - ia64_insn value ATTRIBUTE_UNUSED, ia64_insn *code ATTRIBUTE_UNUSED) -{ - return 0; -} - -static const char* -ext_const (const struct ia64_operand *self ATTRIBUTE_UNUSED, - ia64_insn code ATTRIBUTE_UNUSED, ia64_insn *valuep ATTRIBUTE_UNUSED) -{ - return 0; -} - -static const char* -ins_reg (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - if (value >= 1u << self->field[0].bits) - return "register number out of range"; - - *code |= value << self->field[0].shift; - return 0; -} - -static const char* -ext_reg (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - *valuep = ((code >> self->field[0].shift) - & ((1u << self->field[0].bits) - 1)); - return 0; -} - -static const char* -ins_immu (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - ia64_insn new = 0; - int i; - - for (i = 0; i < NELEMS (self->field) && self->field[i].bits; ++i) - { - new |= ((value & ((((ia64_insn) 1) << self->field[i].bits) - 1)) - << self->field[i].shift); - value >>= self->field[i].bits; - } - if (value) - return "integer operand out of range"; - - *code |= new; - return 0; -} - -static const char* -ext_immu (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - BFD_HOST_U_64_BIT value = 0; - int i, bits = 0, total = 0; - - for (i = 0; i < NELEMS (self->field) && self->field[i].bits; ++i) - { - bits = self->field[i].bits; - value |= ((code >> self->field[i].shift) - & ((((BFD_HOST_U_64_BIT) 1) << bits) - 1)) << total; - total += bits; - } - *valuep = value; - return 0; -} - -static const char* -ins_immu5b (const struct ia64_operand *self, ia64_insn value, - ia64_insn *code) -{ - if (value < 32 || value > 63) - return "value must be between 32 and 63"; - return ins_immu (self, value - 32, code); -} - -static const char* -ext_immu5b (const struct ia64_operand *self, ia64_insn code, - ia64_insn *valuep) -{ - const char *result; - - result = ext_immu (self, code, valuep); - if (result) - return result; - - *valuep = *valuep + 32; - return 0; -} - -static const char* -ins_immus8 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - if (value & 0x7) - return "value not an integer multiple of 8"; - return ins_immu (self, value >> 3, code); -} - -static const char* -ext_immus8 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - const char *result; - - result = ext_immu (self, code, valuep); - if (result) - return result; - - *valuep = *valuep << 3; - return 0; -} - -static const char* -ins_imms_scaled (const struct ia64_operand *self, ia64_insn value, - ia64_insn *code, int scale) -{ - BFD_HOST_64_BIT svalue = value, sign_bit = 0; - ia64_insn new = 0; - int i; - - svalue >>= scale; - - for (i = 0; i < NELEMS (self->field) && self->field[i].bits; ++i) - { - new |= ((svalue & ((((ia64_insn) 1) << self->field[i].bits) - 1)) - << self->field[i].shift); - sign_bit = (svalue >> (self->field[i].bits - 1)) & 1; - svalue >>= self->field[i].bits; - } - if ((!sign_bit && svalue != 0) || (sign_bit && svalue != -1)) - return "integer operand out of range"; - - *code |= new; - return 0; -} - -static const char* -ext_imms_scaled (const struct ia64_operand *self, ia64_insn code, - ia64_insn *valuep, int scale) -{ - int i, bits = 0, total = 0; - BFD_HOST_64_BIT val = 0, sign; - - for (i = 0; i < NELEMS (self->field) && self->field[i].bits; ++i) - { - bits = self->field[i].bits; - val |= ((code >> self->field[i].shift) - & ((((BFD_HOST_U_64_BIT) 1) << bits) - 1)) << total; - total += bits; - } - /* sign extend: */ - sign = (BFD_HOST_64_BIT) 1 << (total - 1); - val = (val ^ sign) - sign; - - *valuep = (val << scale); - return 0; -} - -static const char* -ins_imms (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - return ins_imms_scaled (self, value, code, 0); -} - -static const char* -ins_immsu4 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - value = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000; - - return ins_imms_scaled (self, value, code, 0); -} - -static const char* -ext_imms (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - return ext_imms_scaled (self, code, valuep, 0); -} - -static const char* -ins_immsm1 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - --value; - return ins_imms_scaled (self, value, code, 0); -} - -static const char* -ins_immsm1u4 (const struct ia64_operand *self, ia64_insn value, - ia64_insn *code) -{ - value = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000; - - --value; - return ins_imms_scaled (self, value, code, 0); -} - -static const char* -ext_immsm1 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - const char *res = ext_imms_scaled (self, code, valuep, 0); - - ++*valuep; - return res; -} - -static const char* -ins_imms1 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - return ins_imms_scaled (self, value, code, 1); -} - -static const char* -ext_imms1 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - return ext_imms_scaled (self, code, valuep, 1); -} - -static const char* -ins_imms4 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - return ins_imms_scaled (self, value, code, 4); -} - -static const char* -ext_imms4 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - return ext_imms_scaled (self, code, valuep, 4); -} - -static const char* -ins_imms16 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - return ins_imms_scaled (self, value, code, 16); -} - -static const char* -ext_imms16 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - return ext_imms_scaled (self, code, valuep, 16); -} - -static const char* -ins_cimmu (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - ia64_insn mask = (((ia64_insn) 1) << self->field[0].bits) - 1; - return ins_immu (self, value ^ mask, code); -} - -static const char* -ext_cimmu (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - const char *result; - ia64_insn mask; - - mask = (((ia64_insn) 1) << self->field[0].bits) - 1; - result = ext_immu (self, code, valuep); - if (!result) - { - mask = (((ia64_insn) 1) << self->field[0].bits) - 1; - *valuep ^= mask; - } - return result; -} - -static const char* -ins_cnt (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - --value; - if (value >= ((BFD_HOST_U_64_BIT) 1) << self->field[0].bits) - return "count out of range"; - - *code |= value << self->field[0].shift; - return 0; -} - -static const char* -ext_cnt (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - *valuep = ((code >> self->field[0].shift) - & ((((BFD_HOST_U_64_BIT) 1) << self->field[0].bits) - 1)) + 1; - return 0; -} - -static const char* -ins_cnt2b (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - --value; - - if (value > 2) - return "count must be in range 1..3"; - - *code |= value << self->field[0].shift; - return 0; -} - -static const char* -ext_cnt2b (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - *valuep = ((code >> self->field[0].shift) & 0x3) + 1; - return 0; -} - -static const char* -ins_cnt2c (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - switch (value) - { - case 0: value = 0; break; - case 7: value = 1; break; - case 15: value = 2; break; - case 16: value = 3; break; - default: return "count must be 0, 7, 15, or 16"; - } - *code |= value << self->field[0].shift; - return 0; -} - -static const char* -ext_cnt2c (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - ia64_insn value; - - value = (code >> self->field[0].shift) & 0x3; - switch (value) - { - case 0: value = 0; break; - case 1: value = 7; break; - case 2: value = 15; break; - case 3: value = 16; break; - } - *valuep = value; - return 0; -} - -static const char* -ins_inc3 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code) -{ - BFD_HOST_64_BIT val = value; - BFD_HOST_U_64_BIT sign = 0; - - if (val < 0) - { - sign = 0x4; - value = -value; - } - switch (value) - { - case 1: value = 3; break; - case 4: value = 2; break; - case 8: value = 1; break; - case 16: value = 0; break; - default: return "count must be +/- 1, 4, 8, or 16"; - } - *code |= (sign | value) << self->field[0].shift; - return 0; -} - -static const char* -ext_inc3 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep) -{ - BFD_HOST_64_BIT val; - int negate; - - val = (code >> self->field[0].shift) & 0x7; - negate = val & 0x4; - switch (val & 0x3) - { - case 0: val = 16; break; - case 1: val = 8; break; - case 2: val = 4; break; - case 3: val = 1; break; - } - if (negate) - val = -val; - - *valuep = val; - return 0; -} - -#define CST IA64_OPND_CLASS_CST -#define REG IA64_OPND_CLASS_REG -#define IND IA64_OPND_CLASS_IND -#define ABS IA64_OPND_CLASS_ABS -#define REL IA64_OPND_CLASS_REL - -#define SDEC IA64_OPND_FLAG_DECIMAL_SIGNED -#define UDEC IA64_OPND_FLAG_DECIMAL_UNSIGNED - -const struct ia64_operand elf64_ia64_operands[IA64_OPND_COUNT] = - { - /* constants: */ - { CST, ins_const, ext_const, "NIL", {{ 0, 0}}, 0, "" }, - { CST, ins_const, ext_const, "ar.csd", {{ 0, 0}}, 0, "ar.csd" }, - { CST, ins_const, ext_const, "ar.ccv", {{ 0, 0}}, 0, "ar.ccv" }, - { CST, ins_const, ext_const, "ar.pfs", {{ 0, 0}}, 0, "ar.pfs" }, - { CST, ins_const, ext_const, "1", {{ 0, 0}}, 0, "1" }, - { CST, ins_const, ext_const, "8", {{ 0, 0}}, 0, "8" }, - { CST, ins_const, ext_const, "16", {{ 0, 0}}, 0, "16" }, - { CST, ins_const, ext_const, "r0", {{ 0, 0}}, 0, "r0" }, - { CST, ins_const, ext_const, "ip", {{ 0, 0}}, 0, "ip" }, - { CST, ins_const, ext_const, "pr", {{ 0, 0}}, 0, "pr" }, - { CST, ins_const, ext_const, "pr.rot", {{ 0, 0}}, 0, "pr.rot" }, - { CST, ins_const, ext_const, "psr", {{ 0, 0}}, 0, "psr" }, - { CST, ins_const, ext_const, "psr.l", {{ 0, 0}}, 0, "psr.l" }, - { CST, ins_const, ext_const, "psr.um", {{ 0, 0}}, 0, "psr.um" }, - - /* register operands: */ - { REG, ins_reg, ext_reg, "ar", {{ 7, 20}}, 0, /* AR3 */ - "an application register" }, - { REG, ins_reg, ext_reg, "b", {{ 3, 6}}, 0, /* B1 */ - "a branch register" }, - { REG, ins_reg, ext_reg, "b", {{ 3, 13}}, 0, /* B2 */ - "a branch register"}, - { REG, ins_reg, ext_reg, "cr", {{ 7, 20}}, 0, /* CR */ - "a control register"}, - { REG, ins_reg, ext_reg, "f", {{ 7, 6}}, 0, /* F1 */ - "a floating-point register" }, - { REG, ins_reg, ext_reg, "f", {{ 7, 13}}, 0, /* F2 */ - "a floating-point register" }, - { REG, ins_reg, ext_reg, "f", {{ 7, 20}}, 0, /* F3 */ - "a floating-point register" }, - { REG, ins_reg, ext_reg, "f", {{ 7, 27}}, 0, /* F4 */ - "a floating-point register" }, - { REG, ins_reg, ext_reg, "p", {{ 6, 6}}, 0, /* P1 */ - "a predicate register" }, - { REG, ins_reg, ext_reg, "p", {{ 6, 27}}, 0, /* P2 */ - "a predicate register" }, - { REG, ins_reg, ext_reg, "r", {{ 7, 6}}, 0, /* R1 */ - "a general register" }, - { REG, ins_reg, ext_reg, "r", {{ 7, 13}}, 0, /* R2 */ - "a general register" }, - { REG, ins_reg, ext_reg, "r", {{ 7, 20}}, 0, /* R3 */ - "a general register" }, - { REG, ins_reg, ext_reg, "r", {{ 2, 20}}, 0, /* R3_2 */ - "a general register r0-r3" }, - - /* memory operands: */ - { IND, ins_reg, ext_reg, "", {{7, 20}}, 0, /* MR3 */ - "a memory address" }, - - /* indirect operands: */ - { IND, ins_reg, ext_reg, "cpuid", {{7, 20}}, 0, /* CPUID_R3 */ - "a cpuid register" }, - { IND, ins_reg, ext_reg, "dbr", {{7, 20}}, 0, /* DBR_R3 */ - "a dbr register" }, - { IND, ins_reg, ext_reg, "dtr", {{7, 20}}, 0, /* DTR_R3 */ - "a dtr register" }, - { IND, ins_reg, ext_reg, "itr", {{7, 20}}, 0, /* ITR_R3 */ - "an itr register" }, - { IND, ins_reg, ext_reg, "ibr", {{7, 20}}, 0, /* IBR_R3 */ - "an ibr register" }, - { IND, ins_reg, ext_reg, "msr", {{7, 20}}, 0, /* MSR_R3 */ - "an msr register" }, - { IND, ins_reg, ext_reg, "pkr", {{7, 20}}, 0, /* PKR_R3 */ - "a pkr register" }, - { IND, ins_reg, ext_reg, "pmc", {{7, 20}}, 0, /* PMC_R3 */ - "a pmc register" }, - { IND, ins_reg, ext_reg, "pmd", {{7, 20}}, 0, /* PMD_R3 */ - "a pmd register" }, - { IND, ins_reg, ext_reg, "rr", {{7, 20}}, 0, /* RR_R3 */ - "an rr register" }, - - /* immediate operands: */ - { ABS, ins_cimmu, ext_cimmu, 0, {{ 5, 20 }}, UDEC, /* CCNT5 */ - "a 5-bit count (0-31)" }, - { ABS, ins_cnt, ext_cnt, 0, {{ 2, 27 }}, UDEC, /* CNT2a */ - "a 2-bit count (1-4)" }, - { ABS, ins_cnt2b, ext_cnt2b, 0, {{ 2, 27 }}, UDEC, /* CNT2b */ - "a 2-bit count (1-3)" }, - { ABS, ins_cnt2c, ext_cnt2c, 0, {{ 2, 30 }}, UDEC, /* CNT2c */ - "a count (0, 7, 15, or 16)" }, - { ABS, ins_immu, ext_immu, 0, {{ 5, 14}}, UDEC, /* CNT5 */ - "a 5-bit count (0-31)" }, - { ABS, ins_immu, ext_immu, 0, {{ 6, 27}}, UDEC, /* CNT6 */ - "a 6-bit count (0-63)" }, - { ABS, ins_cimmu, ext_cimmu, 0, {{ 6, 20}}, UDEC, /* CPOS6a */ - "a 6-bit bit pos (0-63)" }, - { ABS, ins_cimmu, ext_cimmu, 0, {{ 6, 14}}, UDEC, /* CPOS6b */ - "a 6-bit bit pos (0-63)" }, - { ABS, ins_cimmu, ext_cimmu, 0, {{ 6, 31}}, UDEC, /* CPOS6c */ - "a 6-bit bit pos (0-63)" }, - { ABS, ins_imms, ext_imms, 0, {{ 1, 36}}, SDEC, /* IMM1 */ - "a 1-bit integer (-1, 0)" }, - { ABS, ins_immu, ext_immu, 0, {{ 2, 13}}, UDEC, /* IMMU2 */ - "a 2-bit unsigned (0-3)" }, - { ABS, ins_immu5b, ext_immu5b, 0, {{ 5, 14}}, UDEC, /* IMMU5b */ - "a 5-bit unsigned (32 + (0-31))" }, - { ABS, ins_immu, ext_immu, 0, {{ 7, 13}}, 0, /* IMMU7a */ - "a 7-bit unsigned (0-127)" }, - { ABS, ins_immu, ext_immu, 0, {{ 7, 20}}, 0, /* IMMU7b */ - "a 7-bit unsigned (0-127)" }, - { ABS, ins_immu, ext_immu, 0, {{ 7, 13}}, UDEC, /* SOF */ - "a frame size (register count)" }, - { ABS, ins_immu, ext_immu, 0, {{ 7, 20}}, UDEC, /* SOL */ - "a local register count" }, - { ABS, ins_immus8,ext_immus8,0, {{ 4, 27}}, UDEC, /* SOR */ - "a rotating register count (integer multiple of 8)" }, - { ABS, ins_imms, ext_imms, 0, /* IMM8 */ - {{ 7, 13}, { 1, 36}}, SDEC, - "an 8-bit integer (-128-127)" }, - { ABS, ins_immsu4, ext_imms, 0, /* IMM8U4 */ - {{ 7, 13}, { 1, 36}}, SDEC, - "an 8-bit signed integer for 32-bit unsigned compare (-128-127)" }, - { ABS, ins_immsm1, ext_immsm1, 0, /* IMM8M1 */ - {{ 7, 13}, { 1, 36}}, SDEC, - "an 8-bit integer (-127-128)" }, - { ABS, ins_immsm1u4, ext_immsm1, 0, /* IMM8M1U4 */ - {{ 7, 13}, { 1, 36}}, SDEC, - "an 8-bit integer for 32-bit unsigned compare (-127-(-1),1-128,0x100000000)" }, - { ABS, ins_immsm1, ext_immsm1, 0, /* IMM8M1U8 */ - {{ 7, 13}, { 1, 36}}, SDEC, - "an 8-bit integer for 64-bit unsigned compare (-127-(-1),1-128,0x10000000000000000)" }, - { ABS, ins_immu, ext_immu, 0, {{ 2, 33}, { 7, 20}}, 0, /* IMMU9 */ - "a 9-bit unsigned (0-511)" }, - { ABS, ins_imms, ext_imms, 0, /* IMM9a */ - {{ 7, 6}, { 1, 27}, { 1, 36}}, SDEC, - "a 9-bit integer (-256-255)" }, - { ABS, ins_imms, ext_imms, 0, /* IMM9b */ - {{ 7, 13}, { 1, 27}, { 1, 36}}, SDEC, - "a 9-bit integer (-256-255)" }, - { ABS, ins_imms, ext_imms, 0, /* IMM14 */ - {{ 7, 13}, { 6, 27}, { 1, 36}}, SDEC, - "a 14-bit integer (-8192-8191)" }, - { ABS, ins_imms1, ext_imms1, 0, /* IMM17 */ - {{ 7, 6}, { 8, 24}, { 1, 36}}, 0, - "a 17-bit integer (-65536-65535)" }, - { ABS, ins_immu, ext_immu, 0, {{20, 6}, { 1, 36}}, 0, /* IMMU21 */ - "a 21-bit unsigned" }, - { ABS, ins_imms, ext_imms, 0, /* IMM22 */ - {{ 7, 13}, { 9, 27}, { 5, 22}, { 1, 36}}, SDEC, - "a 22-bit signed integer" }, - { ABS, ins_immu, ext_immu, 0, /* IMMU24 */ - {{21, 6}, { 2, 31}, { 1, 36}}, 0, - "a 24-bit unsigned" }, - { ABS, ins_imms16,ext_imms16,0, {{27, 6}, { 1, 36}}, 0, /* IMM44 */ - "a 44-bit unsigned (least 16 bits ignored/zeroes)" }, - { ABS, ins_rsvd, ext_rsvd, 0, {{0, 0}}, 0, /* IMMU62 */ - "a 62-bit unsigned" }, - { ABS, ins_rsvd, ext_rsvd, 0, {{0, 0}}, 0, /* IMMU64 */ - "a 64-bit unsigned" }, - { ABS, ins_inc3, ext_inc3, 0, {{ 3, 13}}, SDEC, /* INC3 */ - "an increment (+/- 1, 4, 8, or 16)" }, - { ABS, ins_cnt, ext_cnt, 0, {{ 4, 27}}, UDEC, /* LEN4 */ - "a 4-bit length (1-16)" }, - { ABS, ins_cnt, ext_cnt, 0, {{ 6, 27}}, UDEC, /* LEN6 */ - "a 6-bit length (1-64)" }, - { ABS, ins_immu, ext_immu, 0, {{ 4, 20}}, 0, /* MBTYPE4 */ - "a mix type (@rev, @mix, @shuf, @alt, or @brcst)" }, - { ABS, ins_immu, ext_immu, 0, {{ 8, 20}}, 0, /* MBTYPE8 */ - "an 8-bit mix type" }, - { ABS, ins_immu, ext_immu, 0, {{ 6, 14}}, UDEC, /* POS6 */ - "a 6-bit bit pos (0-63)" }, - { REL, ins_imms4, ext_imms4, 0, {{ 7, 6}, { 2, 33}}, 0, /* TAG13 */ - "a branch tag" }, - { REL, ins_imms4, ext_imms4, 0, {{ 9, 24}}, 0, /* TAG13b */ - "a branch tag" }, - { REL, ins_imms4, ext_imms4, 0, {{20, 6}, { 1, 36}}, 0, /* TGT25 */ - "a branch target" }, - { REL, ins_imms4, ext_imms4, 0, /* TGT25b */ - {{ 7, 6}, {13, 20}, { 1, 36}}, 0, - "a branch target" }, - { REL, ins_imms4, ext_imms4, 0, {{20, 13}, { 1, 36}}, 0, /* TGT25c */ - "a branch target" }, - { REL, ins_rsvd, ext_rsvd, 0, {{0, 0}}, 0, /* TGT64 */ - "a branch target" }, - - { ABS, ins_const, ext_const, 0, {{0, 0}}, 0, /* LDXMOV */ - "ldxmov target" }, - }; diff -Nru xen-4.2.2/tools/debugger/xenitp/dis-asm.h xen-4.3.0/tools/debugger/xenitp/dis-asm.h --- xen-4.2.2/tools/debugger/xenitp/dis-asm.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/dis-asm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,548 +0,0 @@ -/* Interface between the opcode library and its callers. - - Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that 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., 51 Franklin Street - Fifth Floor, - Boston, MA 02110-1301, USA. - - Written by Cygnus Support, 1993. - - The opcode library (libopcodes.a) provides instruction decoders for - a large variety of instruction sets, callable with an identical - interface, for making instruction-processing programs more independent - of the instruction set being processed. */ - -#ifndef DIS_ASM_H -#define DIS_ASM_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include -#include -#include - -#define PARAMS(x) x -typedef void *PTR; -typedef uint64_t bfd_vma; -typedef int64_t bfd_signed_vma; -typedef uint8_t bfd_byte; -typedef int bfd_boolean; -#define BFD_HOST_U_64_BIT unsigned long -#define BFD_HOST_64_BIT long -#define sprintf_vma(s,x) sprintf (s, "%0" PRIx64, x) - -extern unsigned long bfd_getl64 (const bfd_byte *addr); - -#define BFD64 -#define ATTRIBUTE_FPTR_PRINTF_2 -#define ATTRIBUTE_UNUSED __attribute__((unused)) - -enum bfd_flavour { - bfd_target_unknown_flavour, - bfd_target_aout_flavour, - bfd_target_coff_flavour, - bfd_target_ecoff_flavour, - bfd_target_elf_flavour, - bfd_target_ieee_flavour, - bfd_target_nlm_flavour, - bfd_target_oasys_flavour, - bfd_target_tekhex_flavour, - bfd_target_srec_flavour, - bfd_target_ihex_flavour, - bfd_target_som_flavour, - bfd_target_os9k_flavour, - bfd_target_versados_flavour, - bfd_target_msdos_flavour, - bfd_target_evax_flavour -}; - -enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN }; - -enum bfd_architecture -{ - bfd_arch_unknown, /* File arch not known */ - bfd_arch_obscure, /* Arch known, not one of these */ - bfd_arch_m68k, /* Motorola 68xxx */ -#define bfd_mach_m68000 1 -#define bfd_mach_m68008 2 -#define bfd_mach_m68010 3 -#define bfd_mach_m68020 4 -#define bfd_mach_m68030 5 -#define bfd_mach_m68040 6 -#define bfd_mach_m68060 7 -#define bfd_mach_cpu32 8 -#define bfd_mach_mcf5200 9 -#define bfd_mach_mcf5206e 10 -#define bfd_mach_mcf5307 11 -#define bfd_mach_mcf5407 12 -#define bfd_mach_mcf528x 13 -#define bfd_mach_mcfv4e 14 -#define bfd_mach_mcf521x 15 -#define bfd_mach_mcf5249 16 -#define bfd_mach_mcf547x 17 -#define bfd_mach_mcf548x 18 - bfd_arch_vax, /* DEC Vax */ - bfd_arch_i960, /* Intel 960 */ - /* The order of the following is important. - lower number indicates a machine type that - only accepts a subset of the instructions - available to machines with higher numbers. - The exception is the "ca", which is - incompatible with all other machines except - "core". */ - -#define bfd_mach_i960_core 1 -#define bfd_mach_i960_ka_sa 2 -#define bfd_mach_i960_kb_sb 3 -#define bfd_mach_i960_mc 4 -#define bfd_mach_i960_xa 5 -#define bfd_mach_i960_ca 6 -#define bfd_mach_i960_jx 7 -#define bfd_mach_i960_hx 8 - - bfd_arch_a29k, /* AMD 29000 */ - bfd_arch_sparc, /* SPARC */ -#define bfd_mach_sparc 1 -/* The difference between v8plus and v9 is that v9 is a true 64 bit env. */ -#define bfd_mach_sparc_sparclet 2 -#define bfd_mach_sparc_sparclite 3 -#define bfd_mach_sparc_v8plus 4 -#define bfd_mach_sparc_v8plusa 5 /* with ultrasparc add'ns. */ -#define bfd_mach_sparc_sparclite_le 6 -#define bfd_mach_sparc_v9 7 -#define bfd_mach_sparc_v9a 8 /* with ultrasparc add'ns. */ -#define bfd_mach_sparc_v8plusb 9 /* with cheetah add'ns. */ -#define bfd_mach_sparc_v9b 10 /* with cheetah add'ns. */ -/* Nonzero if MACH has the v9 instruction set. */ -#define bfd_mach_sparc_v9_p(mach) \ - ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9b \ - && (mach) != bfd_mach_sparc_sparclite_le) - bfd_arch_mips, /* MIPS Rxxxx */ -#define bfd_mach_mips3000 3000 -#define bfd_mach_mips3900 3900 -#define bfd_mach_mips4000 4000 -#define bfd_mach_mips4010 4010 -#define bfd_mach_mips4100 4100 -#define bfd_mach_mips4300 4300 -#define bfd_mach_mips4400 4400 -#define bfd_mach_mips4600 4600 -#define bfd_mach_mips4650 4650 -#define bfd_mach_mips5000 5000 -#define bfd_mach_mips6000 6000 -#define bfd_mach_mips8000 8000 -#define bfd_mach_mips10000 10000 -#define bfd_mach_mips16 16 - bfd_arch_i386, /* Intel 386 */ -#define bfd_mach_i386_i386 0 -#define bfd_mach_i386_i8086 1 -#define bfd_mach_i386_i386_intel_syntax 2 -#define bfd_mach_x86_64 3 -#define bfd_mach_x86_64_intel_syntax 4 - bfd_arch_we32k, /* AT&T WE32xxx */ - bfd_arch_tahoe, /* CCI/Harris Tahoe */ - bfd_arch_i860, /* Intel 860 */ - bfd_arch_romp, /* IBM ROMP PC/RT */ - bfd_arch_alliant, /* Alliant */ - bfd_arch_convex, /* Convex */ - bfd_arch_m88k, /* Motorola 88xxx */ - bfd_arch_pyramid, /* Pyramid Technology */ - bfd_arch_h8300, /* Hitachi H8/300 */ -#define bfd_mach_h8300 1 -#define bfd_mach_h8300h 2 -#define bfd_mach_h8300s 3 - bfd_arch_powerpc, /* PowerPC */ -#define bfd_mach_ppc 0 -#define bfd_mach_ppc64 1 -#define bfd_mach_ppc_403 403 -#define bfd_mach_ppc_403gc 4030 -#define bfd_mach_ppc_505 505 -#define bfd_mach_ppc_601 601 -#define bfd_mach_ppc_602 602 -#define bfd_mach_ppc_603 603 -#define bfd_mach_ppc_ec603e 6031 -#define bfd_mach_ppc_604 604 -#define bfd_mach_ppc_620 620 -#define bfd_mach_ppc_630 630 -#define bfd_mach_ppc_750 750 -#define bfd_mach_ppc_860 860 -#define bfd_mach_ppc_a35 35 -#define bfd_mach_ppc_rs64ii 642 -#define bfd_mach_ppc_rs64iii 643 -#define bfd_mach_ppc_7400 7400 - bfd_arch_rs6000, /* IBM RS/6000 */ - bfd_arch_hppa, /* HP PA RISC */ - bfd_arch_d10v, /* Mitsubishi D10V */ - bfd_arch_z8k, /* Zilog Z8000 */ -#define bfd_mach_z8001 1 -#define bfd_mach_z8002 2 - bfd_arch_h8500, /* Hitachi H8/500 */ - bfd_arch_sh, /* Hitachi SH */ -#define bfd_mach_sh 1 -#define bfd_mach_sh2 0x20 -#define bfd_mach_sh_dsp 0x2d -#define bfd_mach_sh2a 0x2a -#define bfd_mach_sh2a_nofpu 0x2b -#define bfd_mach_sh2e 0x2e -#define bfd_mach_sh3 0x30 -#define bfd_mach_sh3_nommu 0x31 -#define bfd_mach_sh3_dsp 0x3d -#define bfd_mach_sh3e 0x3e -#define bfd_mach_sh4 0x40 -#define bfd_mach_sh4_nofpu 0x41 -#define bfd_mach_sh4_nommu_nofpu 0x42 -#define bfd_mach_sh4a 0x4a -#define bfd_mach_sh4a_nofpu 0x4b -#define bfd_mach_sh4al_dsp 0x4d -#define bfd_mach_sh5 0x50 - bfd_arch_alpha, /* Dec Alpha */ -#define bfd_mach_alpha 1 - bfd_arch_arm, /* Advanced Risc Machines ARM */ -#define bfd_mach_arm_2 1 -#define bfd_mach_arm_2a 2 -#define bfd_mach_arm_3 3 -#define bfd_mach_arm_3M 4 -#define bfd_mach_arm_4 5 -#define bfd_mach_arm_4T 6 - bfd_arch_ns32k, /* National Semiconductors ns32000 */ - bfd_arch_w65, /* WDC 65816 */ - bfd_arch_tic30, /* Texas Instruments TMS320C30 */ - bfd_arch_v850, /* NEC V850 */ -#define bfd_mach_v850 0 - bfd_arch_arc, /* Argonaut RISC Core */ -#define bfd_mach_arc_base 0 - bfd_arch_m32r, /* Mitsubishi M32R/D */ -#define bfd_mach_m32r 0 /* backwards compatibility */ - bfd_arch_mn10200, /* Matsushita MN10200 */ - bfd_arch_mn10300, /* Matsushita MN10300 */ - bfd_arch_last - }; - -typedef struct symbol_cache_entry -{ - const char *name; - union - { - PTR p; - bfd_vma i; - } udata; -} asymbol; - -typedef int (*fprintf_ftype) (void *, const char*, ...) ATTRIBUTE_FPTR_PRINTF_2; - -enum dis_insn_type { - dis_noninsn, /* Not a valid instruction */ - dis_nonbranch, /* Not a branch instruction */ - dis_branch, /* Unconditional branch */ - dis_condbranch, /* Conditional branch */ - dis_jsr, /* Jump to subroutine */ - dis_condjsr, /* Conditional jump to subroutine */ - dis_dref, /* Data reference instruction */ - dis_dref2 /* Two data references in instruction */ -}; - -/* This struct is passed into the instruction decoding routine, - and is passed back out into each callback. The various fields are used - for conveying information from your main routine into your callbacks, - for passing information into the instruction decoders (such as the - addresses of the callback functions), or for passing information - back from the instruction decoders to their callers. - - It must be initialized before it is first passed; this can be done - by hand, or using one of the initialization macros below. */ - -typedef struct disassemble_info { - fprintf_ftype fprintf_func; - void *stream; - void *application_data; - - /* Target description. We could replace this with a pointer to the bfd, - but that would require one. There currently isn't any such requirement - so to avoid introducing one we record these explicitly. */ - /* The bfd_flavour. This can be bfd_target_unknown_flavour. */ - enum bfd_flavour flavour; - /* The bfd_arch value. */ - enum bfd_architecture arch; - /* The bfd_mach value. */ - unsigned long mach; - /* Endianness (for bi-endian cpus). Mono-endian cpus can ignore this. */ - enum bfd_endian endian; - /* An arch/mach-specific bitmask of selected instruction subsets, mainly - for processors with run-time-switchable instruction sets. The default, - zero, means that there is no constraint. CGEN-based opcodes ports - may use ISA_foo masks. */ - void *insn_sets; - - /* Some targets need information about the current section to accurately - display insns. If this is NULL, the target disassembler function - will have to make its best guess. */ - //asection *section; - - /* An array of pointers to symbols either at the location being disassembled - or at the start of the function being disassembled. The array is sorted - so that the first symbol is intended to be the one used. The others are - present for any misc. purposes. This is not set reliably, but if it is - not NULL, it is correct. */ - asymbol **symbols; - /* Number of symbols in array. */ - int num_symbols; - - /* For use by the disassembler. - The top 16 bits are reserved for public use (and are documented here). - The bottom 16 bits are for the internal use of the disassembler. */ - unsigned long flags; -#define INSN_HAS_RELOC 0x80000000 - void *private_data; - - /* Function used to get bytes to disassemble. MEMADDR is the - address of the stuff to be disassembled, MYADDR is the address to - put the bytes in, and LENGTH is the number of bytes to read. - INFO is a pointer to this struct. - Returns an errno value or 0 for success. */ - int (*read_memory_func) - (bfd_vma memaddr, bfd_byte *myaddr, unsigned int length, - struct disassemble_info *info); - - /* Function which should be called if we get an error that we can't - recover from. STATUS is the errno value from read_memory_func and - MEMADDR is the address that we were trying to read. INFO is a - pointer to this struct. */ - void (*memory_error_func) - (int status, bfd_vma memaddr, struct disassemble_info *info); - - /* Function called to print ADDR. */ - void (*print_address_func) - (bfd_vma addr, struct disassemble_info *info); - - /* Function called to determine if there is a symbol at the given ADDR. - If there is, the function returns 1, otherwise it returns 0. - This is used by ports which support an overlay manager where - the overlay number is held in the top part of an address. In - some circumstances we want to include the overlay number in the - address, (normally because there is a symbol associated with - that address), but sometimes we want to mask out the overlay bits. */ - int (* symbol_at_address_func) - (bfd_vma addr, struct disassemble_info * info); - - /* Function called to check if a SYMBOL is can be displayed to the user. - This is used by some ports that want to hide special symbols when - displaying debugging outout. */ - bfd_boolean (* symbol_is_valid) - (asymbol *, struct disassemble_info * info); - - /* These are for buffer_read_memory. */ - bfd_byte *buffer; - bfd_vma buffer_vma; - unsigned int buffer_length; - - /* This variable may be set by the instruction decoder. It suggests - the number of bytes objdump should display on a single line. If - the instruction decoder sets this, it should always set it to - the same value in order to get reasonable looking output. */ - int bytes_per_line; - - /* The next two variables control the way objdump displays the raw data. */ - /* For example, if bytes_per_line is 8 and bytes_per_chunk is 4, the */ - /* output will look like this: - 00: 00000000 00000000 - with the chunks displayed according to "display_endian". */ - int bytes_per_chunk; - enum bfd_endian display_endian; - - /* Number of octets per incremented target address - Normally one, but some DSPs have byte sizes of 16 or 32 bits. */ - unsigned int octets_per_byte; - - /* The number of zeroes we want to see at the end of a section before we - start skipping them. */ - unsigned int skip_zeroes; - - /* The number of zeroes to skip at the end of a section. If the number - of zeroes at the end is between SKIP_ZEROES_AT_END and SKIP_ZEROES, - they will be disassembled. If there are fewer than - SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic - attempt to avoid disassembling zeroes inserted by section - alignment. */ - unsigned int skip_zeroes_at_end; - - /* Whether the disassembler always needs the relocations. */ - bfd_boolean disassembler_needs_relocs; - - /* Results from instruction decoders. Not all decoders yet support - this information. This info is set each time an instruction is - decoded, and is only valid for the last such instruction. - - To determine whether this decoder supports this information, set - insn_info_valid to 0, decode an instruction, then check it. */ - - char insn_info_valid; /* Branch info has been set. */ - char branch_delay_insns; /* How many sequential insn's will run before - a branch takes effect. (0 = normal) */ - char data_size; /* Size of data reference in insn, in bytes */ - enum dis_insn_type insn_type; /* Type of instruction */ - bfd_vma target; /* Target address of branch or dref, if known; - zero if unknown. */ - bfd_vma target2; /* Second target address for dref2 */ - - /* Command line options specific to the target disassembler. */ - char * disassembler_options; - -} disassemble_info; - - -/* Standard disassemblers. Disassemble one instruction at the given - target address. Return number of octets processed. */ -typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *); - -extern int print_insn_big_mips (bfd_vma, disassemble_info *); -extern int print_insn_little_mips (bfd_vma, disassemble_info *); -extern int print_insn_i386 (bfd_vma, disassemble_info *); -extern int print_insn_i386_att (bfd_vma, disassemble_info *); -extern int print_insn_i386_intel (bfd_vma, disassemble_info *); -extern int print_insn_ia64 (bfd_vma, disassemble_info *); -extern int print_insn_i370 (bfd_vma, disassemble_info *); -extern int print_insn_m68hc11 (bfd_vma, disassemble_info *); -extern int print_insn_m68hc12 (bfd_vma, disassemble_info *); -extern int print_insn_m68k (bfd_vma, disassemble_info *); -extern int print_insn_z80 (bfd_vma, disassemble_info *); -extern int print_insn_z8001 (bfd_vma, disassemble_info *); -extern int print_insn_z8002 (bfd_vma, disassemble_info *); -extern int print_insn_h8300 (bfd_vma, disassemble_info *); -extern int print_insn_h8300h (bfd_vma, disassemble_info *); -extern int print_insn_h8300s (bfd_vma, disassemble_info *); -extern int print_insn_h8500 (bfd_vma, disassemble_info *); -extern int print_insn_alpha (bfd_vma, disassemble_info *); -extern int print_insn_big_arm (bfd_vma, disassemble_info *); -extern int print_insn_little_arm (bfd_vma, disassemble_info *); -extern int print_insn_sparc (bfd_vma, disassemble_info *); -extern int print_insn_avr (bfd_vma, disassemble_info *); -extern int print_insn_bfin (bfd_vma, disassemble_info *); -extern int print_insn_d10v (bfd_vma, disassemble_info *); -extern int print_insn_d30v (bfd_vma, disassemble_info *); -extern int print_insn_dlx (bfd_vma, disassemble_info *); -extern int print_insn_fr30 (bfd_vma, disassemble_info *); -extern int print_insn_hppa (bfd_vma, disassemble_info *); -extern int print_insn_i860 (bfd_vma, disassemble_info *); -extern int print_insn_i960 (bfd_vma, disassemble_info *); -extern int print_insn_ip2k (bfd_vma, disassemble_info *); -extern int print_insn_m32r (bfd_vma, disassemble_info *); -extern int print_insn_m88k (bfd_vma, disassemble_info *); -extern int print_insn_maxq_little (bfd_vma, disassemble_info *); -extern int print_insn_maxq_big (bfd_vma, disassemble_info *); -extern int print_insn_mcore (bfd_vma, disassemble_info *); -extern int print_insn_mmix (bfd_vma, disassemble_info *); -extern int print_insn_mn10200 (bfd_vma, disassemble_info *); -extern int print_insn_mn10300 (bfd_vma, disassemble_info *); -extern int print_insn_mt (bfd_vma, disassemble_info *); -extern int print_insn_msp430 (bfd_vma, disassemble_info *); -extern int print_insn_ns32k (bfd_vma, disassemble_info *); -extern int print_insn_crx (bfd_vma, disassemble_info *); -extern int print_insn_openrisc (bfd_vma, disassemble_info *); -extern int print_insn_big_or32 (bfd_vma, disassemble_info *); -extern int print_insn_little_or32 (bfd_vma, disassemble_info *); -extern int print_insn_pdp11 (bfd_vma, disassemble_info *); -extern int print_insn_pj (bfd_vma, disassemble_info *); -extern int print_insn_big_powerpc (bfd_vma, disassemble_info *); -extern int print_insn_little_powerpc (bfd_vma, disassemble_info *); -extern int print_insn_rs6000 (bfd_vma, disassemble_info *); -extern int print_insn_s390 (bfd_vma, disassemble_info *); -extern int print_insn_sh (bfd_vma, disassemble_info *); -extern int print_insn_tic30 (bfd_vma, disassemble_info *); -extern int print_insn_tic4x (bfd_vma, disassemble_info *); -extern int print_insn_tic54x (bfd_vma, disassemble_info *); -extern int print_insn_tic80 (bfd_vma, disassemble_info *); -extern int print_insn_v850 (bfd_vma, disassemble_info *); -extern int print_insn_vax (bfd_vma, disassemble_info *); -extern int print_insn_w65 (bfd_vma, disassemble_info *); -extern int print_insn_xstormy16 (bfd_vma, disassemble_info *); -extern int print_insn_xtensa (bfd_vma, disassemble_info *); -extern int print_insn_sh64 (bfd_vma, disassemble_info *); -extern int print_insn_sh64x_media (bfd_vma, disassemble_info *); -extern int print_insn_frv (bfd_vma, disassemble_info *); -extern int print_insn_iq2000 (bfd_vma, disassemble_info *); -extern int print_insn_xc16x (bfd_vma, disassemble_info *); -extern int print_insn_m32c (bfd_vma, disassemble_info *); - -extern disassembler_ftype arc_get_disassembler (void *); -//extern disassembler_ftype cris_get_disassembler (bfd *); - -extern void print_mips_disassembler_options (FILE *); -extern void print_ppc_disassembler_options (FILE *); -extern void print_arm_disassembler_options (FILE *); -extern void parse_arm_disassembler_option (char *); -extern int get_arm_regname_num_options (void); -extern int set_arm_regname_option (int); -extern int get_arm_regnames (int, const char **, const char **, const char *const **); -extern bfd_boolean arm_symbol_is_valid (asymbol *, struct disassemble_info *); - -/* Fetch the disassembler for a given BFD, if that support is available. */ -//extern disassembler_ftype disassembler (bfd *); - -/* Amend the disassemble_info structure as necessary for the target architecture. - Should only be called after initialising the info->arch field. */ -extern void disassemble_init_for_target (struct disassemble_info * info); - -/* Document any target specific options available from the disassembler. */ -extern void disassembler_usage (FILE *); - - -/* This block of definitions is for particular callers who read instructions - into a buffer before calling the instruction decoder. */ - -/* Here is a function which callers may wish to use for read_memory_func. - It gets bytes from a buffer. */ -extern int buffer_read_memory - (bfd_vma, bfd_byte *, unsigned int, struct disassemble_info *); - -/* This function goes with buffer_read_memory. - It prints a message using info->fprintf_func and info->stream. */ -extern void perror_memory (int, bfd_vma, struct disassemble_info *); - - -/* Just print the address in hex. This is included for completeness even - though both GDB and objdump provide their own (to print symbolic - addresses). */ -extern void generic_print_address - (bfd_vma, struct disassemble_info *); - -/* Always true. */ -extern int generic_symbol_at_address - (bfd_vma, struct disassemble_info *); - -/* Also always true. */ -extern bfd_boolean generic_symbol_is_valid - (asymbol *, struct disassemble_info *); - -/* Method to initialize a disassemble_info struct. This should be - called by all applications creating such a struct. */ -extern void init_disassemble_info (struct disassemble_info *info, void *stream, - fprintf_ftype fprintf_func); - -/* For compatibility with existing code. */ -#define INIT_DISASSEMBLE_INFO(INFO, STREAM, FPRINTF_FUNC) \ - init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC)) -#define INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) \ - init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC)) - - -#ifdef __cplusplus -} -#endif - -#endif /* ! defined (DIS_ASM_H) */ diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-asmtab.c xen-4.3.0/tools/debugger/xenitp/ia64-asmtab.c --- xen-4.2.2/tools/debugger/xenitp/ia64-asmtab.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-asmtab.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,8774 +0,0 @@ -/* This file is automatically generated by ia64-gen. Do not edit! */ -static const char * const ia64_strings[] = { - "", "0", "1", "a", "acq", "add", "addl", "addp4", "adds", "alloc", "and", - "andcm", "b", "bias", "br", "break", "brl", "brp", "bsw", "c", "call", - "cexit", "chk", "cloop", "clr", "clrrrb", "cmp", "cmp4", "cmp8xchg16", - "cmpxchg1", "cmpxchg2", "cmpxchg4", "cmpxchg8", "cond", "cover", "ctop", - "czx1", "czx2", "d", "dep", "dpnt", "dptk", "e", "epc", "eq", "excl", - "exit", "exp", "extr", "f", "fabs", "fadd", "famax", "famin", "fand", - "fandcm", "fault", "fc", "fchkf", "fclass", "fclrf", "fcmp", "fcvt", - "fetchadd4", "fetchadd8", "few", "fill", "flushrs", "fma", "fmax", - "fmerge", "fmin", "fmix", "fmpy", "fms", "fneg", "fnegabs", "fnma", - "fnmpy", "fnorm", "for", "fpabs", "fpack", "fpamax", "fpamin", "fpcmp", - "fpcvt", "fpma", "fpmax", "fpmerge", "fpmin", "fpmpy", "fpms", "fpneg", - "fpnegabs", "fpnma", "fpnmpy", "fprcpa", "fprsqrta", "frcpa", "frsqrta", - "fselect", "fsetc", "fsub", "fswap", "fsxt", "fwb", "fx", "fxor", "fxu", - "g", "ga", "ge", "getf", "geu", "gt", "gtu", "h", "hint", "hu", "i", "ia", - "imp", "invala", "itc", "itr", "l", "ld1", "ld16", "ld2", "ld4", "ld8", - "ldf", "ldf8", "ldfd", "ldfe", "ldfp8", "ldfpd", "ldfps", "ldfs", "le", - "leu", "lfetch", "loadrs", "loop", "lr", "lt", "ltu", "lu", "m", "many", - "mf", "mix1", "mix2", "mix4", "mov", "movl", "mux1", "mux2", "nc", "ne", - "neq", "nge", "ngt", "nl", "nle", "nlt", "nm", "nop", "nr", "ns", "nt1", - "nt2", "nta", "nz", "or", "orcm", "ord", "pack2", "pack4", "padd1", - "padd2", "padd4", "pavg1", "pavg2", "pavgsub1", "pavgsub2", "pcmp1", - "pcmp2", "pcmp4", "pmax1", "pmax2", "pmin1", "pmin2", "pmpy2", "pmpyshr2", - "popcnt", "pr", "probe", "psad1", "pshl2", "pshl4", "pshladd2", "pshr2", - "pshr4", "pshradd2", "psub1", "psub2", "psub4", "ptc", "ptr", "r", "raz", - "rel", "ret", "rfi", "rsm", "rum", "rw", "s", "s0", "s1", "s2", "s3", - "sa", "se", "setf", "shl", "shladd", "shladdp4", "shr", "shrp", "sig", - "spill", "spnt", "sptk", "srlz", "ssm", "sss", "st1", "st16", "st2", - "st4", "st8", "stf", "stf8", "stfd", "stfe", "stfs", "sub", "sum", "sxt1", - "sxt2", "sxt4", "sync", "tak", "tbit", "tf", "thash", "tnat", "tpa", - "trunc", "ttag", "u", "unc", "unord", "unpack1", "unpack2", "unpack4", - "uss", "uus", "uuu", "vmsw", "w", "wexit", "wtop", "x", "xchg1", "xchg2", - "xchg4", "xchg8", "xf", "xma", "xmpy", "xor", "xuf", "z", "zxt1", "zxt2", - "zxt4", -}; - -static const struct ia64_dependency -dependencies[] = { - { "ALAT", 0, 0, 0, -1, NULL, }, - { "AR[BSP]", 26, 0, 2, 17, NULL, }, - { "AR[BSPSTORE]", 26, 0, 2, 18, NULL, }, - { "AR[CCV]", 26, 0, 2, 32, NULL, }, - { "AR[CFLG]", 26, 0, 2, 27, NULL, }, - { "AR[CSD]", 26, 0, 2, 25, NULL, }, - { "AR[EC]", 26, 0, 2, 66, NULL, }, - { "AR[EFLAG]", 26, 0, 2, 24, NULL, }, - { "AR[FCR]", 26, 0, 2, 21, NULL, }, - { "AR[FDR]", 26, 0, 2, 30, NULL, }, - { "AR[FIR]", 26, 0, 2, 29, NULL, }, - { "AR[FPSR].sf0.controls", 30, 0, 2, -1, NULL, }, - { "AR[FPSR].sf1.controls", 30, 0, 2, -1, NULL, }, - { "AR[FPSR].sf2.controls", 30, 0, 2, -1, NULL, }, - { "AR[FPSR].sf3.controls", 30, 0, 2, -1, NULL, }, - { "AR[FPSR].sf0.flags", 30, 0, 2, -1, NULL, }, - { "AR[FPSR].sf1.flags", 30, 0, 2, -1, NULL, }, - { "AR[FPSR].sf2.flags", 30, 0, 2, -1, NULL, }, - { "AR[FPSR].sf3.flags", 30, 0, 2, -1, NULL, }, - { "AR[FPSR].traps", 30, 0, 2, -1, NULL, }, - { "AR[FPSR].rv", 30, 0, 2, -1, NULL, }, - { "AR[FSR]", 26, 0, 2, 28, NULL, }, - { "AR[ITC]", 26, 0, 2, 44, NULL, }, - { "AR[K%], % in 0 - 7", 1, 0, 2, -1, NULL, }, - { "AR[LC]", 26, 0, 2, 65, NULL, }, - { "AR[PFS]", 26, 0, 2, 64, NULL, }, - { "AR[PFS]", 26, 0, 2, 64, NULL, }, - { "AR[PFS]", 26, 0, 0, 64, NULL, }, - { "AR[RNAT]", 26, 0, 2, 19, NULL, }, - { "AR[RSC]", 26, 0, 2, 16, NULL, }, - { "AR[SSD]", 26, 0, 2, 26, NULL, }, - { "AR[UNAT]{%}, % in 0 - 63", 2, 0, 2, -1, NULL, }, - { "AR%, % in 8-15, 20, 22-23, 31, 33-35, 37-39, 41-43, 45-47, 67-111", 3, 0, 0, -1, NULL, }, - { "AR%, % in 48-63, 112-127", 4, 0, 2, -1, NULL, }, - { "BR%, % in 0 - 7", 5, 0, 2, -1, NULL, }, - { "BR%, % in 0 - 7", 5, 0, 0, -1, NULL, }, - { "BR%, % in 0 - 7", 5, 0, 2, -1, NULL, }, - { "CFM", 6, 0, 2, -1, NULL, }, - { "CFM", 6, 0, 2, -1, NULL, }, - { "CFM", 6, 0, 2, -1, NULL, }, - { "CFM", 6, 0, 2, -1, NULL, }, - { "CFM", 6, 0, 0, -1, NULL, }, - { "CPUID#", 7, 0, 5, -1, NULL, }, - { "CR[CMCV]", 27, 0, 3, 74, NULL, }, - { "CR[DCR]", 27, 0, 3, 0, NULL, }, - { "CR[EOI]", 27, 0, 7, 67, "SC Section 5.8.3.4, \"End of External Interrupt Register (EOI Ð CR67)\" on page 2:119", }, - { "CR[GPTA]", 27, 0, 3, 9, NULL, }, - { "CR[IFA]", 27, 0, 1, 20, NULL, }, - { "CR[IFA]", 27, 0, 3, 20, NULL, }, - { "CR[IFS]", 27, 0, 3, 23, NULL, }, - { "CR[IFS]", 27, 0, 1, 23, NULL, }, - { "CR[IFS]", 27, 0, 1, 23, NULL, }, - { "CR[IHA]", 27, 0, 3, 25, NULL, }, - { "CR[IIM]", 27, 0, 3, 24, NULL, }, - { "CR[IIP]", 27, 0, 3, 19, NULL, }, - { "CR[IIP]", 27, 0, 1, 19, NULL, }, - { "CR[IIPA]", 27, 0, 3, 22, NULL, }, - { "CR[IPSR]", 27, 0, 3, 16, NULL, }, - { "CR[IPSR]", 27, 0, 1, 16, NULL, }, - { "CR[IRR%], % in 0 - 3", 8, 0, 3, -1, NULL, }, - { "CR[ISR]", 27, 0, 3, 17, NULL, }, - { "CR[ITIR]", 27, 0, 3, 21, NULL, }, - { "CR[ITIR]", 27, 0, 1, 21, NULL, }, - { "CR[ITM]", 27, 0, 3, 1, NULL, }, - { "CR[ITV]", 27, 0, 3, 72, NULL, }, - { "CR[IVA]", 27, 0, 4, 2, NULL, }, - { "CR[IVR]", 27, 0, 7, 65, "SC Section 5.8.3.2, \"External Interrupt Vector Register (IVR Ð CR65)\" on page 2:118", }, - { "CR[LID]", 27, 0, 7, 64, "SC Section 5.8.3.1, \"Local ID (LID Ð CR64)\" on page 2:117", }, - { "CR[LRR%], % in 0 - 1", 9, 0, 3, -1, NULL, }, - { "CR[PMV]", 27, 0, 3, 73, NULL, }, - { "CR[PTA]", 27, 0, 3, 8, NULL, }, - { "CR[TPR]", 27, 0, 3, 66, NULL, }, - { "CR[TPR]", 27, 0, 7, 66, "SC Section 5.8.3.3, \"Task Priority Register (TPR Ð CR66)\" on page 2:119", }, - { "CR[TPR]", 27, 0, 1, 66, NULL, }, - { "CR%, % in 3-7, 10-15, 18, 26-63, 75-79, 82-127", 10, 0, 0, -1, NULL, }, - { "DBR#", 11, 0, 2, -1, NULL, }, - { "DBR#", 11, 0, 3, -1, NULL, }, - { "DTC", 0, 0, 3, -1, NULL, }, - { "DTC", 0, 0, 2, -1, NULL, }, - { "DTC", 0, 0, 0, -1, NULL, }, - { "DTC", 0, 0, 2, -1, NULL, }, - { "DTC_LIMIT*", 0, 0, 2, -1, NULL, }, - { "DTR", 0, 0, 3, -1, NULL, }, - { "DTR", 0, 0, 2, -1, NULL, }, - { "DTR", 0, 0, 3, -1, NULL, }, - { "DTR", 0, 0, 0, -1, NULL, }, - { "DTR", 0, 0, 2, -1, NULL, }, - { "FR%, % in 0 - 1", 12, 0, 0, -1, NULL, }, - { "FR%, % in 2 - 127", 13, 0, 2, -1, NULL, }, - { "FR%, % in 2 - 127", 13, 0, 0, -1, NULL, }, - { "GR0", 14, 0, 0, -1, NULL, }, - { "GR%, % in 1 - 127", 15, 0, 0, -1, NULL, }, - { "GR%, % in 1 - 127", 15, 0, 2, -1, NULL, }, - { "IBR#", 16, 0, 2, -1, NULL, }, - { "InService*", 17, 0, 3, -1, NULL, }, - { "InService*", 17, 0, 2, -1, NULL, }, - { "InService*", 17, 0, 2, -1, NULL, }, - { "IP", 0, 0, 0, -1, NULL, }, - { "ITC", 0, 0, 4, -1, NULL, }, - { "ITC", 0, 0, 2, -1, NULL, }, - { "ITC", 0, 0, 0, -1, NULL, }, - { "ITC", 0, 0, 4, -1, NULL, }, - { "ITC", 0, 0, 2, -1, NULL, }, - { "ITC_LIMIT*", 0, 0, 2, -1, NULL, }, - { "ITR", 0, 0, 2, -1, NULL, }, - { "ITR", 0, 0, 4, -1, NULL, }, - { "ITR", 0, 0, 2, -1, NULL, }, - { "ITR", 0, 0, 0, -1, NULL, }, - { "ITR", 0, 0, 4, -1, NULL, }, - { "memory", 0, 0, 0, -1, NULL, }, - { "MSR#", 18, 0, 5, -1, NULL, }, - { "PKR#", 19, 0, 3, -1, NULL, }, - { "PKR#", 19, 0, 0, -1, NULL, }, - { "PKR#", 19, 0, 2, -1, NULL, }, - { "PKR#", 19, 0, 2, -1, NULL, }, - { "PMC#", 20, 0, 2, -1, NULL, }, - { "PMC#", 20, 0, 7, -1, "SC Section 7.2.1, \"Generic Performance Counter Registers\" for PMC[0].fr on page 2:150", }, - { "PMD#", 21, 0, 2, -1, NULL, }, - { "PR0", 0, 0, 0, -1, NULL, }, - { "PR%, % in 1 - 15", 22, 0, 2, -1, NULL, }, - { "PR%, % in 1 - 15", 22, 0, 2, -1, NULL, }, - { "PR%, % in 1 - 15", 22, 0, 0, -1, NULL, }, - { "PR%, % in 16 - 62", 23, 0, 2, -1, NULL, }, - { "PR%, % in 16 - 62", 23, 0, 2, -1, NULL, }, - { "PR%, % in 16 - 62", 23, 0, 0, -1, NULL, }, - { "PR63", 24, 0, 2, -1, NULL, }, - { "PR63", 24, 0, 2, -1, NULL, }, - { "PR63", 24, 0, 0, -1, NULL, }, - { "PSR.ac", 28, 0, 1, 3, NULL, }, - { "PSR.ac", 28, 0, 3, 3, NULL, }, - { "PSR.ac", 28, 0, 2, 3, NULL, }, - { "PSR.ac", 28, 0, 2, 3, NULL, }, - { "PSR.be", 28, 0, 1, 1, NULL, }, - { "PSR.be", 28, 0, 3, 1, NULL, }, - { "PSR.be", 28, 0, 2, 1, NULL, }, - { "PSR.be", 28, 0, 2, 1, NULL, }, - { "PSR.bn", 28, 0, 2, 44, NULL, }, - { "PSR.cpl", 28, 0, 1, 32, NULL, }, - { "PSR.cpl", 28, 0, 2, 32, NULL, }, - { "PSR.da", 28, 0, 2, 38, NULL, }, - { "PSR.db", 28, 0, 3, 24, NULL, }, - { "PSR.db", 28, 0, 2, 24, NULL, }, - { "PSR.db", 28, 0, 2, 24, NULL, }, - { "PSR.dd", 28, 0, 2, 39, NULL, }, - { "PSR.dfh", 28, 0, 3, 19, NULL, }, - { "PSR.dfh", 28, 0, 2, 19, NULL, }, - { "PSR.dfh", 28, 0, 2, 19, NULL, }, - { "PSR.dfl", 28, 0, 3, 18, NULL, }, - { "PSR.dfl", 28, 0, 2, 18, NULL, }, - { "PSR.dfl", 28, 0, 2, 18, NULL, }, - { "PSR.di", 28, 0, 3, 22, NULL, }, - { "PSR.di", 28, 0, 2, 22, NULL, }, - { "PSR.di", 28, 0, 2, 22, NULL, }, - { "PSR.dt", 28, 0, 3, 17, NULL, }, - { "PSR.dt", 28, 0, 2, 17, NULL, }, - { "PSR.dt", 28, 0, 2, 17, NULL, }, - { "PSR.ed", 28, 0, 2, 43, NULL, }, - { "PSR.i", 28, 0, 2, 14, NULL, }, - { "PSR.ia", 28, 0, 0, 14, NULL, }, - { "PSR.ic", 28, 0, 2, 13, NULL, }, - { "PSR.ic", 28, 0, 3, 13, NULL, }, - { "PSR.ic", 28, 0, 2, 13, NULL, }, - { "PSR.id", 28, 0, 0, 14, NULL, }, - { "PSR.is", 28, 0, 0, 14, NULL, }, - { "PSR.it", 28, 0, 2, 14, NULL, }, - { "PSR.lp", 28, 0, 2, 25, NULL, }, - { "PSR.lp", 28, 0, 3, 25, NULL, }, - { "PSR.lp", 28, 0, 2, 25, NULL, }, - { "PSR.mc", 28, 0, 2, 35, NULL, }, - { "PSR.mfh", 28, 0, 2, 5, NULL, }, - { "PSR.mfl", 28, 0, 2, 4, NULL, }, - { "PSR.pk", 28, 0, 3, 15, NULL, }, - { "PSR.pk", 28, 0, 2, 15, NULL, }, - { "PSR.pk", 28, 0, 2, 15, NULL, }, - { "PSR.pp", 28, 0, 2, 21, NULL, }, - { "PSR.ri", 28, 0, 0, 41, NULL, }, - { "PSR.rt", 28, 0, 2, 27, NULL, }, - { "PSR.rt", 28, 0, 3, 27, NULL, }, - { "PSR.rt", 28, 0, 2, 27, NULL, }, - { "PSR.si", 28, 0, 2, 23, NULL, }, - { "PSR.si", 28, 0, 3, 23, NULL, }, - { "PSR.si", 28, 0, 2, 23, NULL, }, - { "PSR.sp", 28, 0, 2, 20, NULL, }, - { "PSR.sp", 28, 0, 3, 20, NULL, }, - { "PSR.sp", 28, 0, 2, 20, NULL, }, - { "PSR.ss", 28, 0, 2, 40, NULL, }, - { "PSR.tb", 28, 0, 3, 26, NULL, }, - { "PSR.tb", 28, 0, 2, 26, NULL, }, - { "PSR.tb", 28, 0, 2, 26, NULL, }, - { "PSR.up", 28, 0, 2, 2, NULL, }, - { "PSR.vm", 28, 0, 1, 46, NULL, }, - { "PSR.vm", 28, 0, 2, 46, NULL, }, - { "RR#", 25, 0, 3, -1, NULL, }, - { "RR#", 25, 0, 2, -1, NULL, }, - { "RSE", 29, 0, 2, -1, NULL, }, - { "ALAT", 0, 1, 0, -1, NULL, }, - { "AR[BSP]", 26, 1, 2, 17, NULL, }, - { "AR[BSPSTORE]", 26, 1, 2, 18, NULL, }, - { "AR[CCV]", 26, 1, 2, 32, NULL, }, - { "AR[CFLG]", 26, 1, 2, 27, NULL, }, - { "AR[CSD]", 26, 1, 2, 25, NULL, }, - { "AR[EC]", 26, 1, 2, 66, NULL, }, - { "AR[EFLAG]", 26, 1, 2, 24, NULL, }, - { "AR[FCR]", 26, 1, 2, 21, NULL, }, - { "AR[FDR]", 26, 1, 2, 30, NULL, }, - { "AR[FIR]", 26, 1, 2, 29, NULL, }, - { "AR[FPSR].sf0.controls", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf1.controls", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf2.controls", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf3.controls", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf0.flags", 30, 1, 0, -1, NULL, }, - { "AR[FPSR].sf0.flags", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf0.flags", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf1.flags", 30, 1, 0, -1, NULL, }, - { "AR[FPSR].sf1.flags", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf1.flags", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf2.flags", 30, 1, 0, -1, NULL, }, - { "AR[FPSR].sf2.flags", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf2.flags", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf3.flags", 30, 1, 0, -1, NULL, }, - { "AR[FPSR].sf3.flags", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].sf3.flags", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].rv", 30, 1, 2, -1, NULL, }, - { "AR[FPSR].traps", 30, 1, 2, -1, NULL, }, - { "AR[FSR]", 26, 1, 2, 28, NULL, }, - { "AR[ITC]", 26, 1, 2, 44, NULL, }, - { "AR[K%], % in 0 - 7", 1, 1, 2, -1, NULL, }, - { "AR[LC]", 26, 1, 2, 65, NULL, }, - { "AR[PFS]", 26, 1, 0, 64, NULL, }, - { "AR[PFS]", 26, 1, 2, 64, NULL, }, - { "AR[PFS]", 26, 1, 2, 64, NULL, }, - { "AR[RNAT]", 26, 1, 2, 19, NULL, }, - { "AR[RSC]", 26, 1, 2, 16, NULL, }, - { "AR[SSD]", 26, 1, 2, 26, NULL, }, - { "AR[UNAT]{%}, % in 0 - 63", 2, 1, 2, -1, NULL, }, - { "AR%, % in 8-15, 20, 22-23, 31, 33-35, 37-39, 41-43, 45-47, 67-111", 3, 1, 0, -1, NULL, }, - { "AR%, % in 48 - 63, 112-127", 4, 1, 2, -1, NULL, }, - { "BR%, % in 0 - 7", 5, 1, 2, -1, NULL, }, - { "BR%, % in 0 - 7", 5, 1, 2, -1, NULL, }, - { "BR%, % in 0 - 7", 5, 1, 2, -1, NULL, }, - { "BR%, % in 0 - 7", 5, 1, 0, -1, NULL, }, - { "CFM", 6, 1, 2, -1, NULL, }, - { "CPUID#", 7, 1, 0, -1, NULL, }, - { "CR[CMCV]", 27, 1, 2, 74, NULL, }, - { "CR[DCR]", 27, 1, 2, 0, NULL, }, - { "CR[EOI]", 27, 1, 7, 67, "SC Section 5.8.3.4, \"End of External Interrupt Register (EOI Ð CR67)\" on page 2:119", }, - { "CR[GPTA]", 27, 1, 2, 9, NULL, }, - { "CR[IFA]", 27, 1, 2, 20, NULL, }, - { "CR[IFS]", 27, 1, 2, 23, NULL, }, - { "CR[IHA]", 27, 1, 2, 25, NULL, }, - { "CR[IIM]", 27, 1, 2, 24, NULL, }, - { "CR[IIP]", 27, 1, 2, 19, NULL, }, - { "CR[IIPA]", 27, 1, 2, 22, NULL, }, - { "CR[IPSR]", 27, 1, 2, 16, NULL, }, - { "CR[IRR%], % in 0 - 3", 8, 1, 2, -1, NULL, }, - { "CR[ISR]", 27, 1, 2, 17, NULL, }, - { "CR[ITIR]", 27, 1, 2, 21, NULL, }, - { "CR[ITM]", 27, 1, 2, 1, NULL, }, - { "CR[ITV]", 27, 1, 2, 72, NULL, }, - { "CR[IVA]", 27, 1, 2, 2, NULL, }, - { "CR[IVR]", 27, 1, 7, 65, "SC", }, - { "CR[LID]", 27, 1, 7, 64, "SC", }, - { "CR[LRR%], % in 0 - 1", 9, 1, 2, -1, NULL, }, - { "CR[PMV]", 27, 1, 2, 73, NULL, }, - { "CR[PTA]", 27, 1, 2, 8, NULL, }, - { "CR[TPR]", 27, 1, 2, 66, NULL, }, - { "CR%, % in 3-7, 10-15, 18, 26-63, 75-79, 82-127", 10, 1, 0, -1, NULL, }, - { "DBR#", 11, 1, 2, -1, NULL, }, - { "DTC", 0, 1, 0, -1, NULL, }, - { "DTC", 0, 1, 2, -1, NULL, }, - { "DTC", 0, 1, 2, -1, NULL, }, - { "DTC_LIMIT*", 0, 1, 2, -1, NULL, }, - { "DTR", 0, 1, 2, -1, NULL, }, - { "DTR", 0, 1, 2, -1, NULL, }, - { "DTR", 0, 1, 2, -1, NULL, }, - { "DTR", 0, 1, 0, -1, NULL, }, - { "FR%, % in 0 - 1", 12, 1, 0, -1, NULL, }, - { "FR%, % in 2 - 127", 13, 1, 2, -1, NULL, }, - { "GR0", 14, 1, 0, -1, NULL, }, - { "GR%, % in 1 - 127", 15, 1, 2, -1, NULL, }, - { "IBR#", 16, 1, 2, -1, NULL, }, - { "InService*", 17, 1, 7, -1, "SC", }, - { "IP", 0, 1, 0, -1, NULL, }, - { "ITC", 0, 1, 0, -1, NULL, }, - { "ITC", 0, 1, 2, -1, NULL, }, - { "ITC", 0, 1, 2, -1, NULL, }, - { "ITR", 0, 1, 2, -1, NULL, }, - { "ITR", 0, 1, 2, -1, NULL, }, - { "ITR", 0, 1, 0, -1, NULL, }, - { "memory", 0, 1, 0, -1, NULL, }, - { "MSR#", 18, 1, 7, -1, "SC", }, - { "PKR#", 19, 1, 0, -1, NULL, }, - { "PKR#", 19, 1, 0, -1, NULL, }, - { "PKR#", 19, 1, 2, -1, NULL, }, - { "PMC#", 20, 1, 2, -1, NULL, }, - { "PMD#", 21, 1, 2, -1, NULL, }, - { "PR0", 0, 1, 0, -1, NULL, }, - { "PR%, % in 1 - 15", 22, 1, 0, -1, NULL, }, - { "PR%, % in 1 - 15", 22, 1, 0, -1, NULL, }, - { "PR%, % in 1 - 15", 22, 1, 2, -1, NULL, }, - { "PR%, % in 1 - 15", 22, 1, 2, -1, NULL, }, - { "PR%, % in 16 - 62", 23, 1, 0, -1, NULL, }, - { "PR%, % in 16 - 62", 23, 1, 0, -1, NULL, }, - { "PR%, % in 16 - 62", 23, 1, 2, -1, NULL, }, - { "PR%, % in 16 - 62", 23, 1, 2, -1, NULL, }, - { "PR63", 24, 1, 0, -1, NULL, }, - { "PR63", 24, 1, 0, -1, NULL, }, - { "PR63", 24, 1, 2, -1, NULL, }, - { "PR63", 24, 1, 2, -1, NULL, }, - { "PSR.ac", 28, 1, 2, 3, NULL, }, - { "PSR.be", 28, 1, 2, 1, NULL, }, - { "PSR.bn", 28, 1, 2, 44, NULL, }, - { "PSR.cpl", 28, 1, 2, 32, NULL, }, - { "PSR.da", 28, 1, 2, 38, NULL, }, - { "PSR.db", 28, 1, 2, 24, NULL, }, - { "PSR.dd", 28, 1, 2, 39, NULL, }, - { "PSR.dfh", 28, 1, 2, 19, NULL, }, - { "PSR.dfl", 28, 1, 2, 18, NULL, }, - { "PSR.di", 28, 1, 2, 22, NULL, }, - { "PSR.dt", 28, 1, 2, 17, NULL, }, - { "PSR.ed", 28, 1, 2, 43, NULL, }, - { "PSR.i", 28, 1, 2, 14, NULL, }, - { "PSR.ia", 28, 1, 2, 14, NULL, }, - { "PSR.ic", 28, 1, 2, 13, NULL, }, - { "PSR.id", 28, 1, 2, 14, NULL, }, - { "PSR.is", 28, 1, 2, 14, NULL, }, - { "PSR.it", 28, 1, 2, 14, NULL, }, - { "PSR.lp", 28, 1, 2, 25, NULL, }, - { "PSR.mc", 28, 1, 2, 35, NULL, }, - { "PSR.mfh", 28, 1, 0, 5, NULL, }, - { "PSR.mfh", 28, 1, 2, 5, NULL, }, - { "PSR.mfh", 28, 1, 2, 5, NULL, }, - { "PSR.mfl", 28, 1, 0, 4, NULL, }, - { "PSR.mfl", 28, 1, 2, 4, NULL, }, - { "PSR.mfl", 28, 1, 2, 4, NULL, }, - { "PSR.pk", 28, 1, 2, 15, NULL, }, - { "PSR.pp", 28, 1, 2, 21, NULL, }, - { "PSR.ri", 28, 1, 2, 41, NULL, }, - { "PSR.rt", 28, 1, 2, 27, NULL, }, - { "PSR.si", 28, 1, 2, 23, NULL, }, - { "PSR.sp", 28, 1, 2, 20, NULL, }, - { "PSR.ss", 28, 1, 2, 40, NULL, }, - { "PSR.tb", 28, 1, 2, 26, NULL, }, - { "PSR.up", 28, 1, 2, 2, NULL, }, - { "PSR.vm", 28, 1, 2, 46, NULL, }, - { "RR#", 25, 1, 2, -1, NULL, }, - { "RSE", 29, 1, 2, -1, NULL, }, - { "PR63", 24, 2, 6, -1, NULL, }, -}; - -static const unsigned short dep0[] = { - 97, 282, 2140, 2327, -}; - -static const unsigned short dep1[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, - 2327, 4135, 20616, -}; - -static const unsigned short dep2[] = { - 97, 282, 2166, 2167, 2169, 2170, 2172, 2173, 2175, 2344, 2347, 2348, 2351, - 2352, 2355, 2356, -}; - -static const unsigned short dep3[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, - 2344, 2347, 2348, 2351, 2352, 2355, 2356, 4135, 20616, -}; - -static const unsigned short dep4[] = { - 97, 282, 22646, 22647, 22649, 22650, 22652, 22653, 22655, 22824, 22827, 22828, - 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep5[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, - 4135, 20616, 22824, 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep6[] = { - 97, 282, 2166, 2167, 2169, 2170, 2172, 2173, 2175, 2344, 2345, 2347, 2349, - 2351, 2353, 2355, -}; - -static const unsigned short dep7[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, - 2344, 2345, 2348, 2349, 2352, 2353, 2356, 4135, 20616, -}; - -static const unsigned short dep8[] = { - 97, 282, 2166, 2167, 2169, 2170, 2172, 2173, 2175, 2344, 2346, 2348, 2350, - 2352, 2354, 2356, -}; - -static const unsigned short dep9[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, - 2344, 2346, 2347, 2350, 2351, 2354, 2355, 4135, 20616, -}; - -static const unsigned short dep10[] = { - 97, 282, 2166, 2167, 2169, 2170, 2172, 2173, 2175, 2344, 2345, 2346, 2347, - 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, -}; - -static const unsigned short dep11[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, - 2344, 2345, 2346, 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, - 4135, 20616, -}; - -static const unsigned short dep12[] = { - 97, 282, 2395, -}; - -static const unsigned short dep13[] = { - 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 282, 2082, 2083, 2166, 2168, - 2169, 2171, 2172, 2174, 2175, 4135, -}; - -static const unsigned short dep14[] = { - 97, 163, 282, 325, 2395, 28866, 29018, -}; - -static const unsigned short dep15[] = { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 40, 41, 97, 150, 152, 158, 162, - 164, 175, 185, 186, 188, 282, 325, 2082, 2083, 2166, 2168, 2169, 2171, 2172, - 2174, 2175, 4135, 28866, 29018, -}; - -static const unsigned short dep16[] = { - 1, 6, 40, 97, 137, 196, 201, 241, 282, 312, 2395, 28866, 29018, -}; - -static const unsigned short dep17[] = { - 1, 25, 27, 38, 40, 41, 97, 158, 162, 164, 166, 167, 175, 185, 186, 188, 196, - 201, 241, 282, 312, 2082, 2083, 2166, 2168, 2169, 2171, 2172, 2174, 2175, - 4135, 28866, 29018, -}; - -static const unsigned short dep18[] = { - 1, 40, 51, 97, 196, 241, 248, 282, 28866, 29018, -}; - -static const unsigned short dep19[] = { - 1, 38, 40, 41, 97, 158, 160, 161, 162, 175, 185, 190, 191, 196, 241, 248, - 282, 4135, 28866, 29018, -}; - -static const unsigned short dep20[] = { - 40, 97, 241, 282, -}; - -static const unsigned short dep21[] = { - 97, 158, 162, 175, 185, 241, 282, -}; - -static const unsigned short dep22[] = { - 1, 40, 97, 131, 135, 136, 138, 139, 142, 143, 146, 149, 152, 155, 156, 157, - 158, 161, 162, 163, 164, 167, 168, 169, 170, 173, 174, 175, 178, 181, 184, - 185, 188, 189, 191, 196, 241, 282, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 330, 331, 333, - 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 28866, 29018, -}; - -static const unsigned short dep23[] = { - 1, 38, 40, 41, 50, 51, 55, 58, 73, 97, 137, 138, 158, 162, 175, 185, 190, - 191, 196, 241, 282, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 328, 330, 331, 333, 334, 335, 336, - 337, 338, 339, 340, 341, 342, 343, 344, 4135, 28866, 29018, -}; - -static const unsigned short dep24[] = { - 97, 136, 282, 311, -}; - -static const unsigned short dep25[] = { - 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 311, -}; - -static const unsigned short dep26[] = { - 97, 137, 282, 312, -}; - -static const unsigned short dep27[] = { - 25, 26, 97, 98, 101, 105, 108, 137, 138, 158, 162, 164, 175, 185, 282, 312, - -}; - -static const unsigned short dep28[] = { - 97, 190, 282, 344, -}; - -static const unsigned short dep29[] = { - 97, 98, 101, 105, 108, 137, 138, 158, 162, 164, 175, 185, 282, 344, -}; - -static const unsigned short dep30[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2166, 2168, 2169, 2171, 2172, 2174, 2175, - 4135, -}; - -static const unsigned short dep31[] = { - 1, 25, 40, 97, 196, 228, 229, 241, 282, 2082, 2285, 2288, 2395, 28866, 29018, - -}; - -static const unsigned short dep32[] = { - 1, 6, 38, 40, 41, 97, 137, 138, 158, 162, 164, 175, 185, 186, 188, 196, 228, - 230, 241, 282, 2082, 2083, 2166, 2168, 2169, 2171, 2172, 2174, 2175, 2286, - 2288, 4135, 28866, 29018, -}; - -static const unsigned short dep33[] = { - 97, 282, -}; - -static const unsigned short dep34[] = { - 97, 158, 162, 175, 185, 282, 2082, 2084, -}; - -static const unsigned short dep35[] = { - 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 282, 2166, 2168, 2169, 2171, - 2172, 2174, 2175, 4135, -}; - -static const unsigned short dep36[] = { - 6, 37, 38, 39, 97, 125, 126, 201, 241, 282, 307, 308, 2395, -}; - -static const unsigned short dep37[] = { - 6, 37, 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 201, 241, 282, 307, - 308, 347, 2166, 2168, 2169, 2171, 2172, 2174, 2175, 4135, -}; - -static const unsigned short dep38[] = { - 24, 97, 227, 282, 2395, -}; - -static const unsigned short dep39[] = { - 24, 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 227, 282, 2166, 2168, 2169, - 2171, 2172, 2174, 2175, 4135, -}; - -static const unsigned short dep40[] = { - 6, 24, 37, 38, 39, 97, 125, 126, 201, 227, 241, 282, 307, 308, 2395, -}; - -static const unsigned short dep41[] = { - 6, 24, 37, 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 201, 227, 241, 282, - 307, 308, 347, 2166, 2168, 2169, 2171, 2172, 2174, 2175, 4135, -}; - -static const unsigned short dep42[] = { - 1, 6, 38, 40, 41, 97, 137, 138, 158, 162, 164, 175, 185, 186, 188, 196, 228, - 230, 241, 282, 2166, 2168, 2169, 2171, 2172, 2174, 2175, 2286, 2288, 4135, - 28866, 29018, -}; - -static const unsigned short dep43[] = { - 97, 158, 162, 175, 185, 282, -}; - -static const unsigned short dep44[] = { - 15, 97, 210, 211, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, - 22646, 22647, 22648, 22650, 22651, 22653, 22654, 22824, 22827, 22828, 22831, - 22832, 22835, 22836, -}; - -static const unsigned short dep45[] = { - 11, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, - 18764, 18766, 22824, 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep46[] = { - 15, 16, 17, 18, 97, 210, 211, 213, 214, 216, 217, 219, 220, 282, 2136, 2325, - 18601, 18602, 18761, 18762, 18764, 18765, 22646, 22647, 22648, 22650, 22651, - 22653, 22654, 22824, 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep47[] = { - 11, 12, 13, 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 213, 215, - 216, 218, 219, 221, 282, 2135, 2136, 2137, 2166, 2167, 2170, 2173, 2325, 4135, - 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, 22824, 22827, 22828, - 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep48[] = { - 16, 97, 213, 214, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, - 22646, 22647, 22648, 22650, 22651, 22653, 22654, 22824, 22827, 22828, 22831, - 22832, 22835, 22836, -}; - -static const unsigned short dep49[] = { - 12, 19, 20, 40, 41, 97, 158, 162, 175, 185, 213, 215, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, - 18764, 18766, 22824, 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep50[] = { - 17, 97, 216, 217, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, - 22646, 22647, 22648, 22650, 22651, 22653, 22654, 22824, 22827, 22828, 22831, - 22832, 22835, 22836, -}; - -static const unsigned short dep51[] = { - 13, 19, 20, 40, 41, 97, 158, 162, 175, 185, 216, 218, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, - 18764, 18766, 22824, 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep52[] = { - 18, 97, 219, 220, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, - 22646, 22647, 22648, 22650, 22651, 22653, 22654, 22824, 22827, 22828, 22831, - 22832, 22835, 22836, -}; - -static const unsigned short dep53[] = { - 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 219, 221, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, - 18764, 18766, 22824, 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep54[] = { - 15, 97, 210, 211, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, - -}; - -static const unsigned short dep55[] = { - 11, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, - 18764, 18766, -}; - -static const unsigned short dep56[] = { - 15, 16, 17, 18, 97, 210, 211, 213, 214, 216, 217, 219, 220, 282, 2136, 2325, - 18601, 18602, 18761, 18762, 18764, 18765, -}; - -static const unsigned short dep57[] = { - 11, 12, 13, 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 213, 215, - 216, 218, 219, 221, 282, 2135, 2136, 2137, 2166, 2167, 2170, 2173, 2325, 4135, - 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, -}; - -static const unsigned short dep58[] = { - 16, 97, 213, 214, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, - -}; - -static const unsigned short dep59[] = { - 12, 19, 20, 40, 41, 97, 158, 162, 175, 185, 213, 215, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, - 18764, 18766, -}; - -static const unsigned short dep60[] = { - 17, 97, 216, 217, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, - -}; - -static const unsigned short dep61[] = { - 13, 19, 20, 40, 41, 97, 158, 162, 175, 185, 216, 218, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, - 18764, 18766, -}; - -static const unsigned short dep62[] = { - 18, 97, 219, 220, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, - -}; - -static const unsigned short dep63[] = { - 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 219, 221, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, - 18764, 18766, -}; - -static const unsigned short dep64[] = { - 97, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, -}; - -static const unsigned short dep65[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2135, 2136, 2137, 2166, 2167, 2170, 2173, - 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, -}; - -static const unsigned short dep66[] = { - 11, 97, 206, 282, -}; - -static const unsigned short dep67[] = { - 11, 40, 41, 97, 158, 162, 175, 185, 206, 282, 2166, 2167, 2170, 2173, 4135, - -}; - -static const unsigned short dep68[] = { - 11, 40, 41, 97, 158, 162, 175, 185, 282, 2166, 2167, 2170, 2173, 4135, -}; - -static const unsigned short dep69[] = { - 12, 97, 207, 282, -}; - -static const unsigned short dep70[] = { - 11, 40, 41, 97, 158, 162, 175, 185, 207, 282, 2166, 2167, 2170, 2173, 4135, - -}; - -static const unsigned short dep71[] = { - 13, 97, 208, 282, -}; - -static const unsigned short dep72[] = { - 11, 40, 41, 97, 158, 162, 175, 185, 208, 282, 2166, 2167, 2170, 2173, 4135, - -}; - -static const unsigned short dep73[] = { - 14, 97, 209, 282, -}; - -static const unsigned short dep74[] = { - 11, 40, 41, 97, 158, 162, 175, 185, 209, 282, 2166, 2167, 2170, 2173, 4135, - -}; - -static const unsigned short dep75[] = { - 15, 97, 211, 212, 282, -}; - -static const unsigned short dep76[] = { - 40, 41, 97, 158, 162, 175, 185, 211, 212, 282, 2166, 2167, 2170, 2173, 4135, - -}; - -static const unsigned short dep77[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2166, 2167, 2170, 2173, 4135, -}; - -static const unsigned short dep78[] = { - 16, 97, 214, 215, 282, -}; - -static const unsigned short dep79[] = { - 40, 41, 97, 158, 162, 175, 185, 214, 215, 282, 2166, 2167, 2170, 2173, 4135, - -}; - -static const unsigned short dep80[] = { - 17, 97, 217, 218, 282, -}; - -static const unsigned short dep81[] = { - 40, 41, 97, 158, 162, 175, 185, 217, 218, 282, 2166, 2167, 2170, 2173, 4135, - -}; - -static const unsigned short dep82[] = { - 18, 97, 220, 221, 282, -}; - -static const unsigned short dep83[] = { - 40, 41, 97, 158, 162, 175, 185, 220, 221, 282, 2166, 2167, 2170, 2173, 4135, - -}; - -static const unsigned short dep84[] = { - 15, 19, 20, 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 282, 2166, 2167, - 2170, 2173, 4135, -}; - -static const unsigned short dep85[] = { - 15, 16, 19, 20, 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 282, 2166, - 2167, 2170, 2173, 4135, -}; - -static const unsigned short dep86[] = { - 15, 17, 19, 20, 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 282, 2166, - 2167, 2170, 2173, 4135, -}; - -static const unsigned short dep87[] = { - 15, 18, 19, 20, 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 282, 2166, - 2167, 2170, 2173, 4135, -}; - -static const unsigned short dep88[] = { - 15, 97, 210, 211, 282, -}; - -static const unsigned short dep89[] = { - 11, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 282, 2166, 2167, 2170, - 2173, 4135, -}; - -static const unsigned short dep90[] = { - 15, 16, 17, 18, 97, 210, 211, 213, 214, 216, 217, 219, 220, 282, -}; - -static const unsigned short dep91[] = { - 11, 12, 13, 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 213, 215, - 216, 218, 219, 221, 282, 2166, 2167, 2170, 2173, 4135, -}; - -static const unsigned short dep92[] = { - 16, 97, 213, 214, 282, -}; - -static const unsigned short dep93[] = { - 12, 19, 20, 40, 41, 97, 158, 162, 175, 185, 213, 215, 282, 2166, 2167, 2170, - 2173, 4135, -}; - -static const unsigned short dep94[] = { - 17, 97, 216, 217, 282, -}; - -static const unsigned short dep95[] = { - 13, 19, 20, 40, 41, 97, 158, 162, 175, 185, 216, 218, 282, 2166, 2167, 2170, - 2173, 4135, -}; - -static const unsigned short dep96[] = { - 18, 97, 219, 220, 282, -}; - -static const unsigned short dep97[] = { - 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 219, 221, 282, 2166, 2167, 2170, - 2173, 4135, -}; - -static const unsigned short dep98[] = { - 15, 97, 210, 211, 282, 2166, 2167, 2168, 2170, 2171, 2173, 2174, 2344, 2347, - 2348, 2351, 2352, 2355, 2356, -}; - -static const unsigned short dep99[] = { - 11, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2344, 2347, 2348, 2351, 2352, 2355, 2356, 4135, 16528, - 16530, 16531, 16533, -}; - -static const unsigned short dep100[] = { - 15, 16, 17, 18, 97, 210, 211, 213, 214, 216, 217, 219, 220, 282, 2166, 2167, - 2168, 2170, 2171, 2173, 2174, 2344, 2347, 2348, 2351, 2352, 2355, 2356, -}; - -static const unsigned short dep101[] = { - 11, 12, 13, 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 213, 215, - 216, 218, 219, 221, 282, 2135, 2136, 2137, 2166, 2167, 2170, 2173, 2344, 2347, - 2348, 2351, 2352, 2355, 2356, 4135, 16528, 16530, 16531, 16533, -}; - -static const unsigned short dep102[] = { - 16, 97, 213, 214, 282, 2166, 2167, 2168, 2170, 2171, 2173, 2174, 2344, 2347, - 2348, 2351, 2352, 2355, 2356, -}; - -static const unsigned short dep103[] = { - 12, 19, 20, 40, 41, 97, 158, 162, 175, 185, 213, 215, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2344, 2347, 2348, 2351, 2352, 2355, 2356, 4135, 16528, - 16530, 16531, 16533, -}; - -static const unsigned short dep104[] = { - 17, 97, 216, 217, 282, 2166, 2167, 2168, 2170, 2171, 2173, 2174, 2344, 2347, - 2348, 2351, 2352, 2355, 2356, -}; - -static const unsigned short dep105[] = { - 13, 19, 20, 40, 41, 97, 158, 162, 175, 185, 216, 218, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2344, 2347, 2348, 2351, 2352, 2355, 2356, 4135, 16528, - 16530, 16531, 16533, -}; - -static const unsigned short dep106[] = { - 18, 97, 219, 220, 282, 2166, 2167, 2168, 2170, 2171, 2173, 2174, 2344, 2347, - 2348, 2351, 2352, 2355, 2356, -}; - -static const unsigned short dep107[] = { - 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 219, 221, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 2344, 2347, 2348, 2351, 2352, 2355, 2356, 4135, 16528, - 16530, 16531, 16533, -}; - -static const unsigned short dep108[] = { - 15, 97, 210, 211, 282, 22646, 22647, 22648, 22650, 22651, 22653, 22654, 22824, - 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep109[] = { - 11, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 4135, 16528, 16530, 16531, 16533, 22824, 22827, 22828, - 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep110[] = { - 15, 16, 17, 18, 97, 210, 211, 213, 214, 216, 217, 219, 220, 282, 22646, 22647, - 22648, 22650, 22651, 22653, 22654, 22824, 22827, 22828, 22831, 22832, 22835, - 22836, -}; - -static const unsigned short dep111[] = { - 11, 12, 13, 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 210, 212, 213, 215, - 216, 218, 219, 221, 282, 2135, 2136, 2137, 2166, 2167, 2170, 2173, 4135, 16528, - 16530, 16531, 16533, 22824, 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep112[] = { - 16, 97, 213, 214, 282, 22646, 22647, 22648, 22650, 22651, 22653, 22654, 22824, - 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep113[] = { - 12, 19, 20, 40, 41, 97, 158, 162, 175, 185, 213, 215, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 4135, 16528, 16530, 16531, 16533, 22824, 22827, 22828, - 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep114[] = { - 17, 97, 216, 217, 282, 22646, 22647, 22648, 22650, 22651, 22653, 22654, 22824, - 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep115[] = { - 13, 19, 20, 40, 41, 97, 158, 162, 175, 185, 216, 218, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 4135, 16528, 16530, 16531, 16533, 22824, 22827, 22828, - 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep116[] = { - 18, 97, 219, 220, 282, 22646, 22647, 22648, 22650, 22651, 22653, 22654, 22824, - 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep117[] = { - 14, 19, 20, 40, 41, 97, 158, 162, 175, 185, 219, 221, 282, 2135, 2136, 2137, - 2166, 2167, 2170, 2173, 4135, 16528, 16530, 16531, 16533, 22824, 22827, 22828, - 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep118[] = { - 97, 282, 2166, 2167, 2168, 2170, 2171, 2173, 2174, 2344, 2347, 2348, 2351, - 2352, 2355, 2356, -}; - -static const unsigned short dep119[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2135, 2136, 2137, 2166, 2167, 2170, 2173, - 2344, 2347, 2348, 2351, 2352, 2355, 2356, 4135, 16528, 16530, 16531, 16533, - -}; - -static const unsigned short dep120[] = { - 97, 282, 22646, 22647, 22648, 22650, 22651, 22653, 22654, 22824, 22827, 22828, - 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep121[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2135, 2136, 2137, 2166, 2167, 2170, 2173, - 4135, 16528, 16530, 16531, 16533, 22824, 22827, 22828, 22831, 22832, 22835, - 22836, -}; - -static const unsigned short dep122[] = { - 19, 20, 40, 41, 97, 158, 162, 175, 185, 282, 2135, 2136, 2137, 2166, 2167, - 2170, 2173, 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, - -}; - -static const unsigned short dep123[] = { - 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 282, 2138, 2139, 2140, 2166, - 2167, 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep124[] = { - 97, 282, 2083, 2084, 2286, 2287, -}; - -static const unsigned short dep125[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, - 2285, 2287, 4135, 20616, -}; - -static const unsigned short dep126[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2082, 2084, 2166, 2167, 2170, 2173, 2327, - 4135, 20616, -}; - -static const unsigned short dep127[] = { - 97, 282, 14455, 14457, 14458, 14460, 14461, 14463, 14635, 14636, 14639, 14640, - 14643, 14644, -}; - -static const unsigned short dep128[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 4135, 14635, 14636, - 14639, 14640, 14643, 14644, 20616, 24694, 24695, 24698, 24701, -}; - -static const unsigned short dep129[] = { - 97, 122, 124, 125, 127, 282, 303, 304, 307, 308, -}; - -static const unsigned short dep130[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 303, 304, 307, 308, 4135, 24694, 24695, - 24698, 24701, -}; - -static const unsigned short dep131[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2166, 2167, 2170, 2173, 2327, 4135, 20616, - -}; - -static const unsigned short dep132[] = { - 40, 41, 97, 119, 122, 125, 158, 162, 175, 185, 282, 2327, 4135, 20616, 24694, - -}; - -static const unsigned short dep133[] = { - 6, 24, 26, 27, 97, 201, 227, 230, 282, 2081, 2284, -}; - -static const unsigned short dep134[] = { - 40, 41, 97, 158, 162, 175, 185, 201, 227, 229, 282, 2138, 2139, 2140, 2166, - 2167, 2170, 2173, 2284, 4135, 20616, -}; - -static const unsigned short dep135[] = { - 6, 24, 25, 26, 40, 41, 97, 158, 162, 175, 185, 282, 2081, 2166, 2167, 2170, - 2173, 2327, 4135, 20616, -}; - -static const unsigned short dep136[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2166, 2167, 2170, 2173, 2344, 2347, 2348, - 2351, 2352, 2355, 2356, 4135, -}; - -static const unsigned short dep137[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2166, 2167, 2170, 2173, 4135, 22824, - 22827, 22828, 22831, 22832, 22835, 22836, -}; - -static const unsigned short dep138[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2166, 2167, 2170, 2173, 2344, 2345, 2348, - 2349, 2352, 2353, 2356, 4135, -}; - -static const unsigned short dep139[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2166, 2167, 2170, 2173, 2344, 2346, 2347, - 2350, 2351, 2354, 2355, 4135, -}; - -static const unsigned short dep140[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2166, 2167, 2170, 2173, 2344, 2345, 2346, - 2347, 2348, 2349, 2350, 2351, 2352, 2353, 2354, 2355, 2356, 4135, -}; - -static const unsigned short dep141[] = { - 0, 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 282, 2166, 2167, 2170, 2173, - 4135, -}; - -static const unsigned short dep142[] = { - 0, 97, 195, 282, -}; - -static const unsigned short dep143[] = { - 0, 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 195, 282, 2166, 2167, 2170, - 2173, 4135, -}; - -static const unsigned short dep144[] = { - 40, 41, 97, 158, 162, 175, 185, 195, 282, 2166, 2167, 2170, 2173, 4135, -}; - -static const unsigned short dep145[] = { - 2, 28, 97, 197, 231, 282, 28866, 29018, -}; - -static const unsigned short dep146[] = { - 1, 2, 28, 29, 97, 158, 162, 175, 177, 178, 185, 197, 231, 282, 28866, 29018, - -}; - -static const unsigned short dep147[] = { - 1, 28, 29, 38, 40, 41, 97, 158, 162, 175, 177, 178, 185, 197, 231, 282, 4135, - 28866, 29018, -}; - -static const unsigned short dep148[] = { - 0, 40, 41, 97, 158, 162, 175, 185, 195, 282, 2166, 2167, 2170, 2173, 4135, - -}; - -static const unsigned short dep149[] = { - 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 28, 29, 30, 31, 97, 196, 197, 198, 199, 200, 202, 203, 204, 205, 206, 207, - 208, 209, 211, 212, 214, 215, 217, 218, 220, 221, 222, 223, 224, 225, 231, - 232, 233, 234, 282, 2071, 2081, 2274, 2284, 28866, 29018, -}; - -static const unsigned short dep150[] = { - 29, 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 196, 197, 198, 199, - 200, 202, 203, 204, 205, 206, 207, 208, 209, 211, 212, 214, 215, 217, 218, - 220, 221, 222, 223, 224, 225, 231, 232, 233, 234, 282, 2138, 2139, 2140, 2166, - 2167, 2170, 2173, 2274, 2284, 4135, 20616, 28866, 29018, -}; - -static const unsigned short dep151[] = { - 97, 282, 14464, 14466, 14468, 14470, 14505, 14506, 14525, 14645, 14646, 14666, - 14667, 14669, 14670, 14679, -}; - -static const unsigned short dep152[] = { - 40, 41, 97, 158, 162, 175, 183, 184, 185, 282, 2166, 2167, 2170, 2173, 4135, - 14645, 14646, 14666, 14667, 14669, 14670, 14679, -}; - -static const unsigned short dep153[] = { - 14464, 14466, 14468, 14470, 14505, 14506, 14525, 14645, 14646, 14666, 14667, - 14669, 14670, 14679, -}; - -static const unsigned short dep154[] = { - 183, 184, 14645, 14646, 14666, 14667, 14669, 14670, 14679, -}; - -static const unsigned short dep155[] = { - 97, 282, 14465, 14466, 14469, 14470, 14480, 14481, 14483, 14484, 14486, 14487, - 14489, 14490, 14493, 14495, 14496, 14505, 14506, 14507, 14508, 14510, 14515, - 14516, 14518, 14519, 14525, 14645, 14646, 14652, 14653, 14654, 14655, 14657, - 14659, 14666, 14667, 14669, 14670, 14671, 14672, 14675, 14676, 14679, -}; - -static const unsigned short dep156[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2166, 2167, 2170, - 2173, 4135, 14645, 14646, 14652, 14653, 14654, 14655, 14657, 14659, 14666, - 14667, 14669, 14670, 14671, 14672, 14675, 14676, 14679, 34888, -}; - -static const unsigned short dep157[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2166, 2167, 2170, - 2173, 4135, 14645, 14646, 14652, 14653, 14654, 14655, 14657, 14659, 14666, - 14667, 14669, 14670, 14671, 14672, 14675, 14676, 14679, -}; - -static const unsigned short dep158[] = { - 1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 28, 29, 30, 31, 40, 41, 97, 137, 138, 158, 162, 175, 180, 181, 185, 190, 191, - 282, 2071, 2081, 2166, 2167, 2170, 2173, 2327, 4135, 20616, 28866, -}; - -static const unsigned short dep159[] = { - 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62, 63, - 64, 65, 67, 69, 70, 71, 72, 73, 94, 96, 97, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 255, 256, 257, 258, 259, 261, 263, 264, 265, 281, - 282, 2116, 2310, -}; - -static const unsigned short dep160[] = { - 40, 41, 96, 97, 137, 138, 158, 160, 161, 162, 175, 185, 190, 191, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 255, 256, 257, 258, 259, 261, - 263, 264, 265, 281, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2310, 4135, - 20616, -}; - -static const unsigned short dep161[] = { - 59, 95, 97, 254, 281, 282, 2140, 2327, -}; - -static const unsigned short dep162[] = { - 40, 41, 43, 44, 46, 48, 49, 51, 52, 53, 54, 56, 57, 60, 61, 63, 64, 65, 66, - 67, 69, 70, 71, 94, 95, 97, 137, 138, 158, 160, 161, 162, 175, 185, 190, 191, - 254, 281, 282, 2107, 2116, 2166, 2167, 2170, 2173, 2327, 4135, 20616, -}; - -static const unsigned short dep163[] = { - 2, 28, 41, 97, 197, 231, 241, 282, 2140, 2327, 28866, 29018, -}; - -static const unsigned short dep164[] = { - 2, 25, 26, 28, 29, 38, 40, 41, 97, 158, 162, 175, 177, 178, 185, 197, 231, - 241, 282, 2327, 4135, 20616, 28866, 29018, -}; - -static const unsigned short dep165[] = { - 97, 129, 130, 133, 134, 140, 141, 144, 145, 147, 148, 150, 151, 153, 154, - 157, 159, 160, 165, 166, 169, 170, 171, 172, 174, 176, 177, 179, 180, 182, - 183, 186, 187, 189, 282, 309, 310, 314, 316, 317, 318, 319, 321, 323, 327, - 330, 331, 333, 334, 335, 336, 338, 339, 340, 342, 343, -}; - -static const unsigned short dep166[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 309, 310, 314, 316, - 317, 318, 319, 321, 323, 327, 330, 331, 333, 334, 335, 336, 338, 339, 340, - 342, 343, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 4135, 20616, 34888, -}; - -static const unsigned short dep167[] = { - 97, 128, 130, 132, 134, 169, 170, 189, 282, 309, 310, 330, 331, 333, 334, - 343, -}; - -static const unsigned short dep168[] = { - 40, 41, 97, 158, 162, 175, 183, 184, 185, 282, 309, 310, 330, 331, 333, 334, - 343, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep169[] = { - 40, 41, 97, 130, 131, 134, 135, 137, 138, 141, 142, 145, 146, 148, 149, 151, - 152, 154, 155, 157, 158, 159, 161, 162, 164, 165, 167, 168, 169, 170, 172, - 173, 174, 175, 176, 178, 179, 181, 182, 184, 185, 187, 188, 189, 190, 191, - 282, 2166, 2167, 2170, 2173, 2327, 4135, 20616, -}; - -static const unsigned short dep170[] = { - 40, 41, 97, 130, 131, 134, 135, 158, 162, 169, 170, 175, 185, 189, 282, 2166, - 2167, 2170, 2173, 2327, 4135, 20616, -}; - -static const unsigned short dep171[] = { - 40, 41, 70, 76, 77, 82, 84, 97, 111, 137, 138, 153, 155, 158, 162, 171, 173, - 175, 185, 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, - 20616, -}; - -static const unsigned short dep172[] = { - 40, 41, 70, 76, 77, 82, 84, 97, 111, 137, 138, 139, 140, 142, 143, 153, 155, - 158, 162, 171, 173, 175, 185, 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, - 2173, 4135, 20616, -}; - -static const unsigned short dep173[] = { - 77, 78, 97, 101, 102, 269, 270, 282, 284, 285, -}; - -static const unsigned short dep174[] = { - 40, 41, 47, 62, 78, 80, 86, 97, 99, 102, 137, 138, 158, 160, 161, 162, 175, - 185, 190, 191, 192, 269, 270, 282, 284, 285, 2138, 2139, 2140, 2166, 2167, - 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep175[] = { - 40, 41, 47, 62, 78, 80, 97, 99, 102, 104, 106, 137, 138, 158, 160, 161, 162, - 175, 185, 190, 191, 192, 269, 270, 282, 284, 285, 2138, 2139, 2140, 2166, - 2167, 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep176[] = { - 97, 282, 12480, 12481, 12633, -}; - -static const unsigned short dep177[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 4135, 12633, 20616, -}; - -static const unsigned short dep178[] = { - 97, 282, 6219, 6220, 6411, -}; - -static const unsigned short dep179[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 4135, 6411, 20616, -}; - -static const unsigned short dep180[] = { - 97, 282, 6237, 6424, -}; - -static const unsigned short dep181[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 4135, 6424, 20616, -}; - -static const unsigned short dep182[] = { - 97, 282, 6255, 6256, 6257, 6258, 6435, 6437, 8484, -}; - -static const unsigned short dep183[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 4135, 6258, 6436, 6437, 8304, 8483, 20616, -}; - -static const unsigned short dep184[] = { - 97, 282, 6259, 6260, 6438, -}; - -static const unsigned short dep185[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 4135, 6438, 20616, -}; - -static const unsigned short dep186[] = { - 97, 282, 6261, 6439, -}; - -static const unsigned short dep187[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 4135, 6439, 20616, -}; - -static const unsigned short dep188[] = { - 97, 282, 10350, 10530, -}; - -static const unsigned short dep189[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 4135, 10530, 20616, -}; - -static const unsigned short dep190[] = { - 77, 78, 82, 83, 97, 101, 102, 269, 270, 272, 273, 282, 284, 285, -}; - -static const unsigned short dep191[] = { - 40, 41, 47, 62, 78, 80, 83, 86, 97, 99, 102, 137, 138, 158, 160, 161, 162, - 175, 185, 190, 191, 192, 269, 270, 272, 274, 282, 284, 285, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep192[] = { - 77, 78, 97, 101, 102, 104, 105, 269, 270, 282, 284, 285, 286, 287, -}; - -static const unsigned short dep193[] = { - 40, 41, 47, 62, 78, 80, 97, 99, 102, 104, 106, 137, 138, 158, 160, 161, 162, - 175, 185, 190, 191, 192, 269, 270, 282, 284, 285, 286, 287, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep194[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 2327, 4135, 12481, 20616, -}; - -static const unsigned short dep195[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 2327, 4135, 6219, 20616, -}; - -static const unsigned short dep196[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 2327, 4135, 6237, 20616, -}; - -static const unsigned short dep197[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 2327, 4135, 6257, 8303, 20616, -}; - -static const unsigned short dep198[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 2327, 4135, 6259, 20616, -}; - -static const unsigned short dep199[] = { - 40, 41, 97, 137, 138, 158, 162, 175, 183, 184, 185, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 2327, 4135, 6260, 6261, 20616, -}; - -static const unsigned short dep200[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, - 2327, 4135, 10350, 20616, -}; - -static const unsigned short dep201[] = { - 40, 41, 97, 158, 162, 175, 185, 190, 191, 282, 2138, 2139, 2140, 2166, 2167, - 2170, 2173, 2327, 4135, 6186, 20616, -}; - -static const unsigned short dep202[] = { - 77, 79, 80, 97, 98, 99, 100, 268, 269, 282, 283, 284, -}; - -static const unsigned short dep203[] = { - 40, 41, 78, 79, 83, 85, 97, 100, 102, 104, 107, 137, 138, 158, 162, 175, 185, - 190, 191, 192, 268, 270, 282, 283, 285, 2138, 2139, 2140, 2166, 2167, 2170, - 2173, 4135, 20616, -}; - -static const unsigned short dep204[] = { - 77, 79, 80, 81, 97, 98, 99, 100, 103, 268, 269, 271, 282, 283, 284, -}; - -static const unsigned short dep205[] = { - 40, 41, 78, 79, 81, 83, 85, 97, 100, 102, 103, 104, 107, 137, 138, 158, 162, - 175, 185, 190, 191, 192, 268, 270, 271, 282, 283, 285, 2138, 2139, 2140, 2166, - 2167, 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep206[] = { - 77, 79, 80, 84, 85, 86, 97, 98, 99, 100, 268, 269, 274, 275, 282, 283, 284, - -}; - -static const unsigned short dep207[] = { - 40, 41, 78, 79, 83, 85, 97, 100, 102, 137, 138, 158, 162, 175, 185, 190, 191, - 192, 268, 270, 273, 275, 282, 283, 285, 2138, 2139, 2140, 2166, 2167, 2170, - 2173, 4135, 20616, -}; - -static const unsigned short dep208[] = { - 77, 79, 80, 97, 98, 99, 100, 106, 107, 108, 268, 269, 282, 283, 284, 287, - 288, -}; - -static const unsigned short dep209[] = { - 40, 41, 78, 79, 97, 100, 102, 104, 107, 137, 138, 158, 162, 175, 185, 190, - 191, 192, 268, 270, 282, 283, 285, 286, 288, 2138, 2139, 2140, 2166, 2167, - 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep210[] = { - 40, 41, 46, 70, 97, 158, 162, 175, 185, 190, 191, 192, 282, 2138, 2139, 2140, - 2166, 2167, 2170, 2173, 2327, 4135, 20616, -}; - -static const unsigned short dep211[] = { - 40, 41, 97, 158, 162, 175, 185, 190, 191, 192, 282, 2138, 2139, 2140, 2166, - 2167, 2170, 2173, 2327, 4135, 20616, -}; - -static const unsigned short dep212[] = { - 40, 41, 70, 77, 82, 84, 97, 137, 138, 153, 155, 158, 162, 175, 185, 190, 191, - 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, 20616, -}; - -static const unsigned short dep213[] = { - 40, 41, 97, 158, 162, 164, 175, 185, 186, 188, 282, 2135, 2136, 2137, 2138, - 2139, 2140, 2166, 2167, 2170, 2173, 4135, 16528, 16530, 16531, 16533, 20616, - -}; - -static const unsigned short dep214[] = { - 40, 41, 70, 77, 82, 84, 97, 153, 155, 158, 162, 175, 185, 192, 282, 2138, - 2139, 2140, 2166, 2167, 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep215[] = { - 40, 41, 78, 79, 97, 100, 137, 138, 158, 162, 175, 185, 190, 191, 268, 270, - 282, 283, 285, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 4135, 20616, -}; - -static const unsigned short dep216[] = { - 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, 20616, -}; - -static const unsigned short dep217[] = { - 5, 97, 200, 282, 2140, 2327, -}; - -static const unsigned short dep218[] = { - 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 200, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, 20616, - -}; - -static const unsigned short dep219[] = { - 40, 41, 44, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, - 137, 138, 139, 140, 142, 143, 153, 155, 156, 158, 162, 171, 173, 175, 185, - 190, 191, 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, - 20616, -}; - -static const unsigned short dep220[] = { - 0, 97, 195, 282, 2140, 2327, -}; - -static const unsigned short dep221[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, - 137, 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, - 191, 192, 195, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, - 20616, -}; - -static const unsigned short dep222[] = { - 0, 40, 41, 44, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, - 135, 137, 138, 139, 140, 142, 143, 153, 155, 156, 158, 162, 171, 173, 175, - 185, 190, 191, 192, 195, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, - 4135, 20616, -}; - -static const unsigned short dep223[] = { - 31, 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, - 137, 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, - 191, 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, 20616, - -}; - -static const unsigned short dep224[] = { - 0, 97, 195, 282, 2327, 26715, -}; - -static const unsigned short dep225[] = { - 0, 97, 109, 195, 282, 289, -}; - -static const unsigned short dep226[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 195, 282, 289, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 4135, 20616, - -}; - -static const unsigned short dep227[] = { - 0, 5, 40, 41, 70, 76, 77, 82, 84, 97, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 195, 282, 289, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 4135, 20616, - -}; - -static const unsigned short dep228[] = { - 0, 31, 97, 109, 195, 234, 282, 289, -}; - -static const unsigned short dep229[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 195, 234, 282, 289, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 4135, 20616, - -}; - -static const unsigned short dep230[] = { - 0, 97, 109, 195, 282, 289, 2140, 2327, -}; - -static const unsigned short dep231[] = { - 0, 3, 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, - 137, 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, - 191, 192, 195, 282, 289, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, - 20616, -}; - -static const unsigned short dep232[] = { - 0, 3, 5, 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, - 135, 137, 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, - 190, 191, 192, 195, 282, 289, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, - 4135, 20616, -}; - -static const unsigned short dep233[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, - 137, 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, - 191, 192, 195, 282, 289, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, - 20616, -}; - -static const unsigned short dep234[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2135, 2136, 2137, 2166, 2167, 2170, 2173, - 2327, 4135, 16528, 16530, 16531, 16533, 20616, -}; - -static const unsigned short dep235[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 195, 282, 289, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, - 20616, -}; - -static const unsigned short dep236[] = { - 0, 31, 97, 109, 195, 234, 282, 289, 2140, 2327, -}; - -static const unsigned short dep237[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 195, 234, 282, 289, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2327, 4135, - 20616, -}; - -static const unsigned short dep238[] = { - 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2325, 4135, 16528, 16530, - 16531, 16533, 18761, 18763, 18764, 18766, 20616, -}; - -static const unsigned short dep239[] = { - 40, 41, 44, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, - 137, 138, 139, 140, 142, 143, 153, 155, 156, 158, 162, 171, 173, 175, 185, - 190, 191, 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2325, 4135, - 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, 20616, -}; - -static const unsigned short dep240[] = { - 0, 97, 195, 282, 2136, 2325, 18601, 18602, 18761, 18762, 18764, 18765, -}; - -static const unsigned short dep241[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, - 137, 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, - 191, 192, 195, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2325, 4135, - 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, 20616, -}; - -static const unsigned short dep242[] = { - 0, 40, 41, 44, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, - 135, 137, 138, 139, 140, 142, 143, 153, 155, 156, 158, 162, 171, 173, 175, - 185, 190, 191, 192, 195, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2325, - 4135, 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, 20616, -}; - -static const unsigned short dep243[] = { - 0, 97, 195, 282, 2137, 2325, 18601, 18602, 18761, 18762, 18764, 18765, -}; - -static const unsigned short dep244[] = { - 97, 282, 2136, 2140, 2325, 2327, 18601, 18602, 18761, 18762, 18764, 18765, - -}; - -static const unsigned short dep245[] = { - 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2325, 2327, 4135, 16528, - 16530, 16531, 16533, 18761, 18763, 18764, 18766, 20616, -}; - -static const unsigned short dep246[] = { - 40, 41, 44, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, - 137, 138, 139, 140, 142, 143, 153, 155, 156, 158, 162, 171, 173, 175, 185, - 190, 191, 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2325, 2327, - 4135, 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, 20616, -}; - -static const unsigned short dep247[] = { - 0, 97, 195, 282, 2136, 2140, 2325, 2327, 18601, 18602, 18761, 18762, 18764, - 18765, -}; - -static const unsigned short dep248[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, 135, - 137, 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, - 191, 192, 195, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2325, 2327, - 4135, 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, 20616, -}; - -static const unsigned short dep249[] = { - 0, 40, 41, 44, 70, 76, 77, 82, 84, 97, 109, 111, 128, 129, 131, 132, 133, - 135, 137, 138, 139, 140, 142, 143, 153, 155, 156, 158, 162, 171, 173, 175, - 185, 190, 191, 192, 195, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, 2325, - 2327, 4135, 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, 20616, - -}; - -static const unsigned short dep250[] = { - 0, 97, 195, 282, 2137, 2140, 2325, 2327, 18601, 18602, 18761, 18762, 18764, - 18765, -}; - -static const unsigned short dep251[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 195, 282, 289, 2135, 2136, 2137, 2138, 2139, 2140, 2166, 2167, 2170, - 2173, 4135, 16528, 16530, 16531, 16533, 20616, -}; - -static const unsigned short dep252[] = { - 40, 41, 70, 76, 77, 82, 84, 97, 137, 138, 139, 140, 142, 143, 153, 155, 156, - 158, 162, 171, 173, 175, 185, 192, 282, 2166, 2167, 2170, 2173, 4135, -}; - -static const unsigned short dep253[] = { - 40, 41, 70, 76, 77, 82, 84, 97, 137, 138, 139, 140, 142, 143, 153, 155, 156, - 158, 162, 171, 173, 175, 185, 192, 282, 2138, 2139, 2140, 2166, 2167, 2170, - 2173, 2327, 4135, 20616, -}; - -static const unsigned short dep254[] = { - 40, 41, 97, 158, 162, 175, 185, 282, 2138, 2139, 2140, 2166, 2167, 2170, 2173, - 2325, 4135, 16528, 16530, 16531, 16533, 18761, 18763, 18764, 18766, 20616, - -}; - -static const unsigned short dep255[] = { - 0, 40, 41, 70, 76, 77, 82, 84, 97, 111, 128, 129, 131, 132, 133, 135, 137, - 138, 139, 140, 142, 143, 153, 155, 158, 162, 171, 173, 175, 185, 190, 191, - 192, 195, 282, 289, 2135, 2136, 2137, 2138, 2139, 2140, 2166, 2167, 2170, - 2173, 2327, 4135, 16528, 16530, 16531, 16533, 20616, -}; - -static const unsigned short dep256[] = { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 24, 26, 27, 28, 29, 30, 31, 97, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 211, 212, 214, 215, 217, 218, 220, 221, 222, - 223, 224, 225, 227, 230, 231, 232, 233, 234, 282, 2071, 2081, 2140, 2274, - 2284, 2327, 28866, 29018, -}; - -static const unsigned short dep257[] = { - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 24, 25, 26, 28, 29, 30, 31, 40, 41, 97, 137, 138, 158, 162, 175, 180, - 181, 185, 190, 191, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 211, 212, 214, 215, 217, 218, 220, 221, 222, 223, 224, 225, - 227, 229, 231, 232, 233, 234, 282, 2071, 2081, 2138, 2139, 2140, 2166, 2167, - 2170, 2173, 2274, 2284, 2327, 4135, 20616, 28866, 29018, -}; - -#define NELS(X) (sizeof(X)/sizeof(X[0])) -static const struct ia64_opcode_dependency -op_dependencies[] = { - { NELS(dep1), dep1, NELS(dep0), dep0, }, - { NELS(dep3), dep3, NELS(dep2), dep2, }, - { NELS(dep5), dep5, NELS(dep4), dep4, }, - { NELS(dep7), dep7, NELS(dep6), dep6, }, - { NELS(dep9), dep9, NELS(dep8), dep8, }, - { NELS(dep11), dep11, NELS(dep10), dep10, }, - { NELS(dep13), dep13, NELS(dep12), dep12, }, - { NELS(dep15), dep15, NELS(dep14), dep14, }, - { NELS(dep17), dep17, NELS(dep16), dep16, }, - { NELS(dep19), dep19, NELS(dep18), dep18, }, - { NELS(dep21), dep21, NELS(dep20), dep20, }, - { NELS(dep23), dep23, NELS(dep22), dep22, }, - { NELS(dep25), dep25, NELS(dep24), dep24, }, - { NELS(dep27), dep27, NELS(dep26), dep26, }, - { NELS(dep29), dep29, NELS(dep28), dep28, }, - { NELS(dep30), dep30, NELS(dep12), dep12, }, - { NELS(dep32), dep32, NELS(dep31), dep31, }, - { NELS(dep34), dep34, NELS(dep33), dep33, }, - { NELS(dep35), dep35, NELS(dep12), dep12, }, - { NELS(dep37), dep37, NELS(dep36), dep36, }, - { NELS(dep39), dep39, NELS(dep38), dep38, }, - { NELS(dep41), dep41, NELS(dep40), dep40, }, - { NELS(dep42), dep42, NELS(dep31), dep31, }, - { NELS(dep43), dep43, NELS(dep33), dep33, }, - { NELS(dep45), dep45, NELS(dep44), dep44, }, - { NELS(dep47), dep47, NELS(dep46), dep46, }, - { NELS(dep49), dep49, NELS(dep48), dep48, }, - { NELS(dep51), dep51, NELS(dep50), dep50, }, - { NELS(dep53), dep53, NELS(dep52), dep52, }, - { NELS(dep55), dep55, NELS(dep54), dep54, }, - { NELS(dep57), dep57, NELS(dep56), dep56, }, - { NELS(dep59), dep59, NELS(dep58), dep58, }, - { NELS(dep61), dep61, NELS(dep60), dep60, }, - { NELS(dep63), dep63, NELS(dep62), dep62, }, - { NELS(dep65), dep65, NELS(dep64), dep64, }, - { NELS(dep67), dep67, NELS(dep66), dep66, }, - { NELS(dep68), dep68, NELS(dep33), dep33, }, - { NELS(dep70), dep70, NELS(dep69), dep69, }, - { NELS(dep72), dep72, NELS(dep71), dep71, }, - { NELS(dep74), dep74, NELS(dep73), dep73, }, - { NELS(dep76), dep76, NELS(dep75), dep75, }, - { NELS(dep77), dep77, NELS(dep33), dep33, }, - { NELS(dep79), dep79, NELS(dep78), dep78, }, - { NELS(dep81), dep81, NELS(dep80), dep80, }, - { NELS(dep83), dep83, NELS(dep82), dep82, }, - { NELS(dep84), dep84, NELS(dep33), dep33, }, - { NELS(dep85), dep85, NELS(dep33), dep33, }, - { NELS(dep86), dep86, NELS(dep33), dep33, }, - { NELS(dep87), dep87, NELS(dep33), dep33, }, - { NELS(dep89), dep89, NELS(dep88), dep88, }, - { NELS(dep91), dep91, NELS(dep90), dep90, }, - { NELS(dep93), dep93, NELS(dep92), dep92, }, - { NELS(dep95), dep95, NELS(dep94), dep94, }, - { NELS(dep97), dep97, NELS(dep96), dep96, }, - { NELS(dep99), dep99, NELS(dep98), dep98, }, - { NELS(dep101), dep101, NELS(dep100), dep100, }, - { NELS(dep103), dep103, NELS(dep102), dep102, }, - { NELS(dep105), dep105, NELS(dep104), dep104, }, - { NELS(dep107), dep107, NELS(dep106), dep106, }, - { NELS(dep109), dep109, NELS(dep108), dep108, }, - { NELS(dep111), dep111, NELS(dep110), dep110, }, - { NELS(dep113), dep113, NELS(dep112), dep112, }, - { NELS(dep115), dep115, NELS(dep114), dep114, }, - { NELS(dep117), dep117, NELS(dep116), dep116, }, - { NELS(dep119), dep119, NELS(dep118), dep118, }, - { NELS(dep121), dep121, NELS(dep120), dep120, }, - { NELS(dep122), dep122, NELS(dep64), dep64, }, - { NELS(dep123), dep123, NELS(dep33), dep33, }, - { NELS(dep125), dep125, NELS(dep124), dep124, }, - { NELS(dep126), dep126, NELS(dep0), dep0, }, - { NELS(dep128), dep128, NELS(dep127), dep127, }, - { NELS(dep130), dep130, NELS(dep129), dep129, }, - { NELS(dep131), dep131, NELS(dep0), dep0, }, - { NELS(dep132), dep132, NELS(dep0), dep0, }, - { NELS(dep134), dep134, NELS(dep133), dep133, }, - { NELS(dep135), dep135, NELS(dep0), dep0, }, - { NELS(dep136), dep136, NELS(dep2), dep2, }, - { NELS(dep137), dep137, NELS(dep4), dep4, }, - { NELS(dep138), dep138, NELS(dep6), dep6, }, - { NELS(dep139), dep139, NELS(dep8), dep8, }, - { NELS(dep140), dep140, NELS(dep10), dep10, }, - { NELS(dep141), dep141, NELS(dep33), dep33, }, - { NELS(dep143), dep143, NELS(dep142), dep142, }, - { NELS(dep144), dep144, NELS(dep142), dep142, }, - { NELS(dep146), dep146, NELS(dep145), dep145, }, - { NELS(dep147), dep147, NELS(dep145), dep145, }, - { NELS(dep148), dep148, NELS(dep142), dep142, }, - { NELS(dep150), dep150, NELS(dep149), dep149, }, - { NELS(dep152), dep152, NELS(dep151), dep151, }, - { NELS(dep154), dep154, NELS(dep153), dep153, }, - { NELS(dep156), dep156, NELS(dep155), dep155, }, - { NELS(dep157), dep157, NELS(dep155), dep155, }, - { NELS(dep158), dep158, NELS(dep0), dep0, }, - { NELS(dep160), dep160, NELS(dep159), dep159, }, - { NELS(dep162), dep162, NELS(dep161), dep161, }, - { NELS(dep164), dep164, NELS(dep163), dep163, }, - { NELS(dep166), dep166, NELS(dep165), dep165, }, - { NELS(dep168), dep168, NELS(dep167), dep167, }, - { NELS(dep169), dep169, NELS(dep0), dep0, }, - { NELS(dep170), dep170, NELS(dep0), dep0, }, - { NELS(dep171), dep171, NELS(dep0), dep0, }, - { NELS(dep172), dep172, NELS(dep33), dep33, }, - { NELS(dep174), dep174, NELS(dep173), dep173, }, - { NELS(dep175), dep175, NELS(dep173), dep173, }, - { NELS(dep177), dep177, NELS(dep176), dep176, }, - { NELS(dep179), dep179, NELS(dep178), dep178, }, - { NELS(dep181), dep181, NELS(dep180), dep180, }, - { NELS(dep183), dep183, NELS(dep182), dep182, }, - { NELS(dep185), dep185, NELS(dep184), dep184, }, - { NELS(dep187), dep187, NELS(dep186), dep186, }, - { NELS(dep189), dep189, NELS(dep188), dep188, }, - { NELS(dep191), dep191, NELS(dep190), dep190, }, - { NELS(dep193), dep193, NELS(dep192), dep192, }, - { NELS(dep194), dep194, NELS(dep0), dep0, }, - { NELS(dep195), dep195, NELS(dep0), dep0, }, - { NELS(dep196), dep196, NELS(dep0), dep0, }, - { NELS(dep197), dep197, NELS(dep0), dep0, }, - { NELS(dep198), dep198, NELS(dep0), dep0, }, - { NELS(dep199), dep199, NELS(dep0), dep0, }, - { NELS(dep200), dep200, NELS(dep0), dep0, }, - { NELS(dep201), dep201, NELS(dep0), dep0, }, - { NELS(dep203), dep203, NELS(dep202), dep202, }, - { NELS(dep205), dep205, NELS(dep204), dep204, }, - { NELS(dep207), dep207, NELS(dep206), dep206, }, - { NELS(dep209), dep209, NELS(dep208), dep208, }, - { NELS(dep210), dep210, NELS(dep0), dep0, }, - { NELS(dep211), dep211, NELS(dep0), dep0, }, - { NELS(dep212), dep212, NELS(dep0), dep0, }, - { NELS(dep213), dep213, NELS(dep33), dep33, }, - { NELS(dep214), dep214, NELS(dep33), dep33, }, - { NELS(dep215), dep215, NELS(dep202), dep202, }, - { NELS(dep216), dep216, NELS(dep0), dep0, }, - { NELS(dep218), dep218, NELS(dep217), dep217, }, - { NELS(dep219), dep219, NELS(dep0), dep0, }, - { NELS(dep221), dep221, NELS(dep220), dep220, }, - { NELS(dep222), dep222, NELS(dep220), dep220, }, - { NELS(dep223), dep223, NELS(dep0), dep0, }, - { NELS(dep221), dep221, NELS(dep224), dep224, }, - { NELS(dep226), dep226, NELS(dep225), dep225, }, - { NELS(dep227), dep227, NELS(dep225), dep225, }, - { NELS(dep229), dep229, NELS(dep228), dep228, }, - { NELS(dep231), dep231, NELS(dep230), dep230, }, - { NELS(dep232), dep232, NELS(dep230), dep230, }, - { NELS(dep233), dep233, NELS(dep230), dep230, }, - { NELS(dep234), dep234, NELS(dep0), dep0, }, - { NELS(dep235), dep235, NELS(dep230), dep230, }, - { NELS(dep237), dep237, NELS(dep236), dep236, }, - { NELS(dep238), dep238, NELS(dep64), dep64, }, - { NELS(dep239), dep239, NELS(dep64), dep64, }, - { NELS(dep241), dep241, NELS(dep240), dep240, }, - { NELS(dep242), dep242, NELS(dep240), dep240, }, - { NELS(dep241), dep241, NELS(dep243), dep243, }, - { NELS(dep245), dep245, NELS(dep244), dep244, }, - { NELS(dep246), dep246, NELS(dep244), dep244, }, - { NELS(dep248), dep248, NELS(dep247), dep247, }, - { NELS(dep249), dep249, NELS(dep247), dep247, }, - { NELS(dep248), dep248, NELS(dep250), dep250, }, - { NELS(dep251), dep251, NELS(dep225), dep225, }, - { NELS(dep252), dep252, NELS(dep33), dep33, }, - { NELS(dep253), dep253, NELS(dep0), dep0, }, - { NELS(dep254), dep254, NELS(dep64), dep64, }, - { NELS(dep255), dep255, NELS(dep230), dep230, }, - { 0, NULL, 0, NULL, }, - { NELS(dep257), dep257, NELS(dep256), dep256, }, -}; - -static const struct ia64_completer_table -completer_table[] = { - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 95 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 95 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 594, -1, 0, 1, 6 }, - { 0x0, 0x0, 0, 657, -1, 0, 1, 18 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 162 }, - { 0x0, 0x0, 0, 756, -1, 0, 1, 18 }, - { 0x0, 0x0, 0, 2198, -1, 0, 1, 10 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 9 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 13 }, - { 0x1, 0x1, 0, -1, -1, 13, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, 2406, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, 1140, -1, 0, 1, 129 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 45 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 84 }, - { 0x0, 0x0, 0, 2246, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, 2473, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, 2250, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, 2252, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, 2482, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, 2485, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, 2507, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, 2510, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 25 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 25 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 25 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 25 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 36 }, - { 0x0, 0x0, 0, 2518, -1, 0, 1, 30 }, - { 0x0, 0x0, 0, 1409, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 162 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 83 }, - { 0x0, 0x0, 0, 1457, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1466, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1475, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1477, -1, 0, 1, 132 }, - { 0x0, 0x0, 0, 1479, -1, 0, 1, 132 }, - { 0x0, 0x0, 0, 1488, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1497, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1506, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1515, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1524, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1533, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1543, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1553, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1563, -1, 0, 1, 131 }, - { 0x0, 0x0, 0, 1572, -1, 0, 1, 147 }, - { 0x0, 0x0, 0, 1578, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1584, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1590, -1, 0, 1, 147 }, - { 0x0, 0x0, 0, 1596, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1602, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1608, -1, 0, 1, 147 }, - { 0x0, 0x0, 0, 1614, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1620, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1626, -1, 0, 1, 147 }, - { 0x0, 0x0, 0, 1632, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1638, -1, 0, 1, 147 }, - { 0x0, 0x0, 0, 1644, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1650, -1, 0, 1, 147 }, - { 0x0, 0x0, 0, 1656, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1662, -1, 0, 1, 147 }, - { 0x0, 0x0, 0, 1668, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1674, -1, 0, 1, 152 }, - { 0x0, 0x0, 0, 1678, -1, 0, 1, 158 }, - { 0x0, 0x0, 0, 1682, -1, 0, 1, 159 }, - { 0x0, 0x0, 0, 1686, -1, 0, 1, 159 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 85 }, - { 0x0, 0x0, 0, 258, -1, 0, 1, 41 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 68 }, - { 0x1, 0x1, 0, 1166, -1, 20, 1, 68 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 69 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 70 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 70 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 71 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 72 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 73 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 93 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 94 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 96 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 97 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 98 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 99 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 104 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 105 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 106 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 107 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 108 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 109 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 110 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 113 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 114 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 115 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 116 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 117 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 118 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 119 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 120 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 163 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 163 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 163 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 72 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 162 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2858, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2859, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2210, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2211, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2873, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2874, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2875, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2876, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2877, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2860, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, 2861, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 11 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 91 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 89 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x1, 0x1, 0, -1, -1, 13, 1, 0 }, - { 0x0, 0x0, 0, 2879, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 90 }, - { 0x0, 0x0, 0, 1966, -1, 0, 1, 138 }, - { 0x0, 0x0, 0, 1968, -1, 0, 1, 145 }, - { 0x0, 0x0, 0, 1970, -1, 0, 1, 139 }, - { 0x0, 0x0, 0, 1972, -1, 0, 1, 139 }, - { 0x0, 0x0, 0, 1974, -1, 0, 1, 138 }, - { 0x0, 0x0, 0, 1976, -1, 0, 1, 145 }, - { 0x0, 0x0, 0, 1978, -1, 0, 1, 138 }, - { 0x0, 0x0, 0, 1980, -1, 0, 1, 145 }, - { 0x0, 0x0, 0, 1983, -1, 0, 1, 138 }, - { 0x0, 0x0, 0, 1986, -1, 0, 1, 145 }, - { 0x0, 0x0, 0, 1989, -1, 0, 1, 157 }, - { 0x0, 0x0, 0, 1990, -1, 0, 1, 161 }, - { 0x0, 0x0, 0, 1991, -1, 0, 1, 157 }, - { 0x0, 0x0, 0, 1992, -1, 0, 1, 161 }, - { 0x0, 0x0, 0, 1993, -1, 0, 1, 157 }, - { 0x0, 0x0, 0, 1994, -1, 0, 1, 161 }, - { 0x0, 0x0, 0, 1995, -1, 0, 1, 157 }, - { 0x0, 0x0, 0, 1996, -1, 0, 1, 161 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 88 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 127 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 125 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 127 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 126 }, - { 0x0, 0x0, 0, 1687, -1, 0, 1, 143 }, - { 0x0, 0x0, 0, 1688, -1, 0, 1, 143 }, - { 0x0, 0x0, 0, 1689, -1, 0, 1, 143 }, - { 0x0, 0x0, 0, 1690, -1, 0, 1, 143 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 0, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 1, 224, -1, 0, 1, 12 }, - { 0x0, 0x0, 1, 225, -1, 0, 1, 14 }, - { 0x1, 0x1, 2, -1, -1, 27, 1, 12 }, - { 0x1, 0x1, 2, -1, -1, 27, 1, 14 }, - { 0x0, 0x0, 3, -1, 1340, 0, 0, -1 }, - { 0x0, 0x0, 3, -1, 1341, 0, 0, -1 }, - { 0x1, 0x1, 3, 2749, 1450, 33, 1, 134 }, - { 0x1, 0x1, 3, 2750, 1459, 33, 1, 134 }, - { 0x1, 0x1, 3, 2751, 1468, 33, 1, 134 }, - { 0x1, 0x1, 3, 2752, 1481, 33, 1, 134 }, - { 0x1, 0x1, 3, 2753, 1490, 33, 1, 134 }, - { 0x1, 0x1, 3, 2754, 1499, 33, 1, 134 }, - { 0x1, 0x1, 3, 2755, 1508, 33, 1, 134 }, - { 0x1, 0x1, 3, 2756, 1517, 33, 1, 134 }, - { 0x1, 0x1, 3, 2757, 1526, 33, 1, 134 }, - { 0x1, 0x1, 3, 2758, 1535, 33, 1, 134 }, - { 0x1, 0x1, 3, 2759, 1545, 33, 1, 134 }, - { 0x1, 0x1, 3, 2760, 1555, 33, 1, 134 }, - { 0x1, 0x1, 3, 2761, 1568, 33, 1, 149 }, - { 0x1, 0x1, 3, 2762, 1574, 33, 1, 154 }, - { 0x1, 0x1, 3, 2763, 1580, 33, 1, 154 }, - { 0x1, 0x1, 3, 2764, 1586, 33, 1, 149 }, - { 0x1, 0x1, 3, 2765, 1592, 33, 1, 154 }, - { 0x1, 0x1, 3, 2766, 1598, 33, 1, 154 }, - { 0x1, 0x1, 3, 2767, 1604, 33, 1, 149 }, - { 0x1, 0x1, 3, 2768, 1610, 33, 1, 154 }, - { 0x1, 0x1, 3, 2769, 1616, 33, 1, 154 }, - { 0x1, 0x1, 3, 2770, 1622, 33, 1, 149 }, - { 0x1, 0x1, 3, 2771, 1628, 33, 1, 154 }, - { 0x1, 0x1, 3, 2772, 1634, 33, 1, 149 }, - { 0x1, 0x1, 3, 2773, 1640, 33, 1, 154 }, - { 0x1, 0x1, 3, 2774, 1646, 33, 1, 149 }, - { 0x1, 0x1, 3, 2775, 1652, 33, 1, 154 }, - { 0x1, 0x1, 3, 2776, 1658, 33, 1, 149 }, - { 0x1, 0x1, 3, 2777, 1664, 33, 1, 154 }, - { 0x1, 0x1, 3, 2778, 1670, 33, 1, 154 }, - { 0x1, 0x1, 3, -1, -1, 27, 1, 41 }, - { 0x0, 0x0, 4, 2212, 1425, 0, 1, 142 }, - { 0x0, 0x0, 4, 2213, 1427, 0, 1, 142 }, - { 0x0, 0x0, 4, 2214, 1429, 0, 1, 141 }, - { 0x0, 0x0, 4, 2215, 1431, 0, 1, 141 }, - { 0x0, 0x0, 4, 2216, 1433, 0, 1, 141 }, - { 0x0, 0x0, 4, 2217, 1435, 0, 1, 141 }, - { 0x0, 0x0, 4, 2218, 1437, 0, 1, 141 }, - { 0x0, 0x0, 4, 2219, 1439, 0, 1, 141 }, - { 0x0, 0x0, 4, 2220, 1441, 0, 1, 141 }, - { 0x0, 0x0, 4, 2221, 1443, 0, 1, 141 }, - { 0x0, 0x0, 4, 2222, 1445, 0, 1, 143 }, - { 0x0, 0x0, 4, 2223, 1447, 0, 1, 143 }, - { 0x1, 0x1, 4, -1, 1454, 33, 1, 137 }, - { 0x5, 0x5, 4, 552, 1453, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1463, 33, 1, 137 }, - { 0x5, 0x5, 4, 553, 1462, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1472, 33, 1, 137 }, - { 0x5, 0x5, 4, 554, 1471, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1476, 32, 1, 132 }, - { 0x1, 0x1, 4, -1, 1478, 32, 1, 132 }, - { 0x1, 0x1, 4, -1, 1485, 33, 1, 137 }, - { 0x5, 0x5, 4, 555, 1484, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1494, 33, 1, 137 }, - { 0x5, 0x5, 4, 556, 1493, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1503, 33, 1, 137 }, - { 0x5, 0x5, 4, 557, 1502, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1512, 33, 1, 137 }, - { 0x5, 0x5, 4, 558, 1511, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1521, 33, 1, 137 }, - { 0x5, 0x5, 4, 559, 1520, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1530, 33, 1, 137 }, - { 0x5, 0x5, 4, 560, 1529, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1540, 33, 1, 137 }, - { 0x5, 0x5, 4, 1036, 1538, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1550, 33, 1, 137 }, - { 0x5, 0x5, 4, 1037, 1548, 32, 1, 131 }, - { 0x1, 0x1, 4, -1, 1560, 33, 1, 137 }, - { 0x5, 0x5, 4, 1038, 1558, 32, 1, 131 }, - { 0x1, 0x21, 10, 2013, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2014, -1, 12, 1, 3 }, - { 0x1, 0x21, 10, 420, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2074, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, -1, 2075, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2076, 0, 0, -1 }, - { 0x0, 0x0, 10, 2017, -1, 0, 1, 3 }, - { 0x1, 0x1, 10, 2018, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 2019, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2020, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, 430, -1, 0, 1, 3 }, - { 0x1, 0x1, 10, 2080, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 434, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2082, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, 438, -1, 0, 1, 3 }, - { 0x1, 0x1, 10, 2084, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 442, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2086, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, 446, -1, 0, 1, 3 }, - { 0x1, 0x1, 10, 2088, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 450, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2090, -1, 12, 1, 3 }, - { 0x1, 0x21, 10, 2033, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2034, -1, 12, 1, 3 }, - { 0x1, 0x21, 10, 460, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2096, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, -1, 2097, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2098, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2101, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2102, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2103, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2104, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2105, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2106, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2107, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2108, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2109, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2110, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2111, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2112, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2113, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2114, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2115, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2116, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2117, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2118, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2119, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2120, 0, 0, -1 }, - { 0x1, 0x21, 10, 2037, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2038, -1, 12, 1, 3 }, - { 0x1, 0x21, 10, 468, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2122, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, -1, 2123, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2124, 0, 0, -1 }, - { 0x0, 0x0, 10, 2041, -1, 0, 1, 3 }, - { 0x1, 0x1, 10, 2042, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 2043, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2044, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, 478, -1, 0, 1, 3 }, - { 0x1, 0x1, 10, 2128, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 482, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2130, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, 486, -1, 0, 1, 3 }, - { 0x1, 0x1, 10, 2132, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 490, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2134, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, 494, -1, 0, 1, 3 }, - { 0x1, 0x1, 10, 2136, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 498, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2138, -1, 12, 1, 3 }, - { 0x1, 0x21, 10, 2057, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2058, -1, 12, 1, 3 }, - { 0x1, 0x21, 10, 508, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 10, 2144, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, -1, 2145, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2146, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2149, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2150, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2151, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2152, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2153, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2154, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2155, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2156, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2157, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2158, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2159, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2160, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2161, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2162, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2163, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2164, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2165, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2166, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2167, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2168, 0, 0, -1 }, - { 0x1, 0x1, 10, 2061, -1, 36, 1, 3 }, - { 0x1000001, 0x1000001, 10, 2062, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 2063, -1, 36, 1, 3 }, - { 0x1000001, 0x1000001, 10, 2064, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, -1, 2169, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2171, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2173, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2175, 0, 0, -1 }, - { 0x1, 0x1, 10, 2065, -1, 36, 1, 78 }, - { 0x1000001, 0x1000001, 10, 2066, -1, 12, 1, 78 }, - { 0x1, 0x1, 10, 2067, -1, 36, 1, 78 }, - { 0x1000001, 0x1000001, 10, 2068, -1, 12, 1, 78 }, - { 0x0, 0x0, 10, -1, 2177, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2179, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2181, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2183, 0, 0, -1 }, - { 0x1, 0x1, 10, 2069, -1, 36, 1, 3 }, - { 0x1000001, 0x1000001, 10, 2070, -1, 12, 1, 3 }, - { 0x1, 0x1, 10, 2071, -1, 36, 1, 3 }, - { 0x1000001, 0x1000001, 10, 2072, -1, 12, 1, 3 }, - { 0x0, 0x0, 10, -1, 2185, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2187, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2189, 0, 0, -1 }, - { 0x0, 0x0, 10, -1, 2191, 0, 0, -1 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x4200001, 11, 2015, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 300, -1, 33, 1, 3 }, - { 0x0, 0x0, 11, 2077, -1, 0, 1, 3 }, - { 0x1, 0x1, 11, 2078, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 2021, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x0, 0x0, 11, 308, -1, 0, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x200001, 11, 2023, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 310, -1, 33, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 2025, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x0, 0x0, 11, 312, -1, 0, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x200001, 11, 2027, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 314, -1, 33, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 2029, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x0, 0x0, 11, 316, -1, 0, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x200001, 11, 2031, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 318, -1, 33, 1, 3 }, - { 0x0, 0x0, 11, 2091, -1, 0, 1, 3 }, - { 0x1, 0x1, 11, 2092, -1, 12, 1, 3 }, - { 0x1, 0x1, 11, 2093, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 11, 2094, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x4200001, 11, 2035, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 322, -1, 33, 1, 3 }, - { 0x0, 0x0, 11, 2099, -1, 0, 1, 3 }, - { 0x1, 0x1, 11, 2100, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x4200001, 11, 2039, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 348, -1, 33, 1, 3 }, - { 0x0, 0x0, 11, 2125, -1, 0, 1, 3 }, - { 0x1, 0x1, 11, 2126, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 2045, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x0, 0x0, 11, 356, -1, 0, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x200001, 11, 2047, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 358, -1, 33, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 2049, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x0, 0x0, 11, 360, -1, 0, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x200001, 11, 2051, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 362, -1, 33, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 2053, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x0, 0x0, 11, 364, -1, 0, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x200001, 11, 2055, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 366, -1, 33, 1, 3 }, - { 0x0, 0x0, 11, 2139, -1, 0, 1, 3 }, - { 0x1, 0x1, 11, 2140, -1, 12, 1, 3 }, - { 0x1, 0x1, 11, 2141, -1, 33, 1, 3 }, - { 0x200001, 0x200001, 11, 2142, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x200001, 0x4200001, 11, 2059, -1, 12, 1, 3 }, - { 0x2, 0x3, 11, -1, -1, 37, 1, 5 }, - { 0x1, 0x1, 11, 370, -1, 33, 1, 3 }, - { 0x0, 0x0, 11, 2147, -1, 0, 1, 3 }, - { 0x1, 0x1, 11, 2148, -1, 12, 1, 3 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 5 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 5 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 5 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 5 }, - { 0x1, 0x1, 11, 2170, -1, 36, 1, 3 }, - { 0x1000001, 0x1000001, 11, 2172, -1, 12, 1, 3 }, - { 0x1, 0x1, 11, 2174, -1, 36, 1, 3 }, - { 0x1000001, 0x1000001, 11, 2176, -1, 12, 1, 3 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 80 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 80 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 80 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 80 }, - { 0x1, 0x1, 11, 2178, -1, 36, 1, 78 }, - { 0x1000001, 0x1000001, 11, 2180, -1, 12, 1, 78 }, - { 0x1, 0x1, 11, 2182, -1, 36, 1, 78 }, - { 0x1000001, 0x1000001, 11, 2184, -1, 12, 1, 78 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 5 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 5 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 5 }, - { 0x1, 0x1, 11, -1, -1, 36, 1, 5 }, - { 0x1, 0x1, 11, 2186, -1, 36, 1, 3 }, - { 0x1000001, 0x1000001, 11, 2188, -1, 12, 1, 3 }, - { 0x1, 0x1, 11, 2190, -1, 36, 1, 3 }, - { 0x1000001, 0x1000001, 11, 2192, -1, 12, 1, 3 }, - { 0x0, 0x0, 12, -1, -1, 0, 1, 15 }, - { 0x0, 0x0, 12, -1, -1, 0, 1, 15 }, - { 0x0, 0x0, 12, -1, -1, 0, 1, 15 }, - { 0x1, 0x1, 13, 272, 1452, 34, 1, 131 }, - { 0x1, 0x1, 13, 274, 1461, 34, 1, 131 }, - { 0x1, 0x1, 13, 276, 1470, 34, 1, 131 }, - { 0x1, 0x1, 13, 280, 1483, 34, 1, 131 }, - { 0x1, 0x1, 13, 282, 1492, 34, 1, 131 }, - { 0x1, 0x1, 13, 284, 1501, 34, 1, 131 }, - { 0x1, 0x1, 13, 286, 1510, 34, 1, 131 }, - { 0x1, 0x1, 13, 288, 1519, 34, 1, 131 }, - { 0x1, 0x1, 13, 290, 1528, 34, 1, 131 }, - { 0x1, 0x1, 13, 292, 1537, 34, 1, 131 }, - { 0x1, 0x1, 13, 294, 1547, 34, 1, 131 }, - { 0x1, 0x1, 13, 296, 1557, 34, 1, 131 }, - { 0x0, 0x0, 19, -1, 795, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 796, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 797, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 798, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 799, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 800, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 801, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 802, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 803, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 804, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 805, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 806, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 807, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 808, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 809, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 810, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 811, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 812, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 813, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 814, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 815, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 816, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 817, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 818, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 819, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 820, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 821, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 822, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 823, 0, 0, -1 }, - { 0x0, 0x0, 19, -1, 824, 0, 0, -1 }, - { 0x0, 0x0, 20, -1, 2827, 0, 0, -1 }, - { 0x0, 0x0, 20, -1, 2828, 0, 0, -1 }, - { 0x0, 0x0, 20, -1, 2843, 0, 0, -1 }, - { 0x0, 0x0, 20, -1, 2844, 0, 0, -1 }, - { 0x0, 0x0, 20, -1, 2849, 0, 0, -1 }, - { 0x0, 0x0, 20, -1, 2850, 0, 0, -1 }, - { 0x0, 0x0, 21, 831, 2839, 0, 0, -1 }, - { 0x0, 0x0, 21, 832, 2841, 0, 0, -1 }, - { 0x0, 0x0, 23, -1, 2837, 0, 0, -1 }, - { 0x0, 0x0, 23, -1, 2838, 0, 0, -1 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, 1272, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 6 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 7 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 8 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 16 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, 1293, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 19 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 20 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 21 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, 1326, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 18 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 35, 1, 22 }, - { 0x1, 0x1, 24, -1, -1, 33, 1, 82 }, - { 0x1, 0x1, 24, -1, -1, 33, 1, 82 }, - { 0x1, 0x1, 24, 1342, 1455, 35, 1, 137 }, - { 0x1, 0x1, 24, 1343, 1464, 35, 1, 137 }, - { 0x1, 0x1, 24, 1344, 1473, 35, 1, 137 }, - { 0x1, 0x1, 24, 1345, 1486, 35, 1, 137 }, - { 0x1, 0x1, 24, 1346, 1495, 35, 1, 137 }, - { 0x1, 0x1, 24, 1347, 1504, 35, 1, 137 }, - { 0x1, 0x1, 24, 1348, 1513, 35, 1, 137 }, - { 0x1, 0x1, 24, 1349, 1522, 35, 1, 137 }, - { 0x1, 0x1, 24, 1350, 1531, 35, 1, 137 }, - { 0x1, 0x1, 24, 1351, 1541, 35, 1, 137 }, - { 0x1, 0x1, 24, 1352, 1551, 35, 1, 137 }, - { 0x1, 0x1, 24, 1353, 1561, 35, 1, 137 }, - { 0x1, 0x1, 24, 1354, 1570, 35, 1, 151 }, - { 0x1, 0x1, 24, 1355, 1576, 35, 1, 156 }, - { 0x1, 0x1, 24, 1356, 1582, 35, 1, 156 }, - { 0x1, 0x1, 24, 1357, 1588, 35, 1, 151 }, - { 0x1, 0x1, 24, 1358, 1594, 35, 1, 156 }, - { 0x1, 0x1, 24, 1359, 1600, 35, 1, 156 }, - { 0x1, 0x1, 24, 1360, 1606, 35, 1, 151 }, - { 0x1, 0x1, 24, 1361, 1612, 35, 1, 156 }, - { 0x1, 0x1, 24, 1362, 1618, 35, 1, 156 }, - { 0x1, 0x1, 24, 1363, 1624, 35, 1, 151 }, - { 0x1, 0x1, 24, 1364, 1630, 35, 1, 156 }, - { 0x1, 0x1, 24, 1365, 1636, 35, 1, 151 }, - { 0x1, 0x1, 24, 1366, 1642, 35, 1, 156 }, - { 0x1, 0x1, 24, 1367, 1648, 35, 1, 151 }, - { 0x1, 0x1, 24, 1368, 1654, 35, 1, 156 }, - { 0x1, 0x1, 24, 1369, 1660, 35, 1, 151 }, - { 0x1, 0x1, 24, 1370, 1666, 35, 1, 156 }, - { 0x1, 0x1, 24, 1371, 1672, 35, 1, 156 }, - { 0x0, 0x0, 33, 2821, 2819, 0, 0, -1 }, - { 0x0, 0x0, 33, 2824, 2822, 0, 0, -1 }, - { 0x0, 0x0, 33, 2830, 2829, 0, 0, -1 }, - { 0x0, 0x0, 33, 2832, 2831, 0, 0, -1 }, - { 0x0, 0x0, 33, 2846, 2845, 0, 0, -1 }, - { 0x0, 0x0, 33, 2848, 2847, 0, 0, -1 }, - { 0x0, 0x0, 35, -1, 2840, 0, 0, -1 }, - { 0x0, 0x0, 35, -1, 2842, 0, 0, -1 }, - { 0x1, 0x1, 38, -1, 2290, 37, 1, 30 }, - { 0x1, 0x1, 38, -1, 2349, 37, 1, 30 }, - { 0x0, 0x0, 38, -1, 2352, 0, 0, -1 }, - { 0x1, 0x1, 38, -1, -1, 37, 1, 30 }, - { 0x1, 0x1, 38, -1, 2357, 37, 1, 30 }, - { 0x0, 0x0, 38, -1, 2360, 0, 0, -1 }, - { 0x1, 0x1, 38, -1, -1, 37, 1, 30 }, - { 0x0, 0x0, 38, -1, 2363, 0, 0, -1 }, - { 0x1, 0x1, 38, -1, -1, 37, 1, 30 }, - { 0x1, 0x1, 38, -1, 2366, 37, 1, 30 }, - { 0x1, 0x1, 38, -1, 2369, 37, 1, 30 }, - { 0x1, 0x1, 38, -1, 2402, 37, 1, 30 }, - { 0x3, 0x3, 38, -1, -1, 30, 1, 144 }, - { 0x0, 0x0, 38, 1142, -1, 0, 1, 102 }, - { 0x0, 0x0, 38, -1, -1, 0, 1, 111 }, - { 0x0, 0x0, 38, 1148, -1, 0, 1, 123 }, - { 0x3, 0x3, 38, -1, -1, 30, 1, 160 }, - { 0x0, 0x0, 38, 1149, -1, 0, 1, 41 }, - { 0x0, 0x0, 40, -1, 973, 0, 0, -1 }, - { 0x0, 0x0, 40, -1, 981, 0, 0, -1 }, - { 0x0, 0x0, 40, 1151, 977, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 622, 33, 1, 6 }, - { 0x18000001, 0x18000001, 40, -1, 630, 6, 1, 7 }, - { 0x3, 0x3, 40, 1152, 626, 33, 1, 6 }, - { 0x0, 0x0, 40, -1, 985, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 642, 33, 1, 8 }, - { 0x0, 0x0, 40, -1, 989, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 654, 33, 1, 16 }, - { 0x0, 0x0, 40, -1, 994, 0, 0, -1 }, - { 0x0, 0x0, 40, -1, 998, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 677, 33, 1, 18 }, - { 0x3, 0x3, 40, -1, 681, 33, 1, 18 }, - { 0x0, 0x0, 40, -1, 1002, 0, 0, -1 }, - { 0x0, 0x0, 40, -1, 1006, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 701, 33, 1, 19 }, - { 0x18000001, 0x18000001, 40, -1, 705, 6, 1, 19 }, - { 0x0, 0x0, 40, -1, 1010, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 717, 33, 1, 20 }, - { 0x0, 0x0, 40, -1, 1014, 0, 0, -1 }, - { 0x0, 0x0, 40, -1, 1018, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 737, 33, 1, 21 }, - { 0x18000001, 0x18000001, 40, -1, 741, 6, 1, 21 }, - { 0x0, 0x0, 40, -1, 1022, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 753, 33, 1, 22 }, - { 0x0, 0x0, 40, -1, 1027, 0, 0, -1 }, - { 0x0, 0x0, 40, -1, 1031, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 776, 33, 1, 18 }, - { 0x3, 0x3, 40, -1, 780, 33, 1, 18 }, - { 0x0, 0x0, 40, -1, 1035, 0, 0, -1 }, - { 0x3, 0x3, 40, -1, 792, 33, 1, 22 }, - { 0x0, 0x0, 41, 851, 972, 0, 0, -1 }, - { 0x0, 0x0, 41, 852, 980, 0, 0, -1 }, - { 0x0, 0x0, 41, 853, 976, 0, 0, -1 }, - { 0x1, 0x1, 41, 854, 621, 34, 1, 6 }, - { 0x10000001, 0x10000001, 41, 855, 629, 6, 1, 7 }, - { 0x1, 0x1, 41, 856, 625, 34, 1, 6 }, - { 0x0, 0x0, 41, 857, 984, 0, 0, -1 }, - { 0x1, 0x1, 41, 858, 641, 34, 1, 8 }, - { 0x0, 0x0, 41, 859, 988, 0, 0, -1 }, - { 0x1, 0x1, 41, 860, 653, 34, 1, 16 }, - { 0x0, 0x0, 41, 861, 993, 0, 0, -1 }, - { 0x0, 0x0, 41, 862, 997, 0, 0, -1 }, - { 0x1, 0x1, 41, 863, 676, 34, 1, 18 }, - { 0x1, 0x1, 41, 864, 680, 34, 1, 18 }, - { 0x0, 0x0, 41, 865, 1001, 0, 0, -1 }, - { 0x0, 0x0, 41, 866, 1005, 0, 0, -1 }, - { 0x1, 0x1, 41, 867, 700, 34, 1, 19 }, - { 0x10000001, 0x10000001, 41, 868, 704, 6, 1, 19 }, - { 0x0, 0x0, 41, 869, 1009, 0, 0, -1 }, - { 0x1, 0x1, 41, 870, 716, 34, 1, 20 }, - { 0x0, 0x0, 41, 871, 1013, 0, 0, -1 }, - { 0x0, 0x0, 41, 872, 1017, 0, 0, -1 }, - { 0x1, 0x1, 41, 873, 736, 34, 1, 21 }, - { 0x10000001, 0x10000001, 41, 874, 740, 6, 1, 21 }, - { 0x0, 0x0, 41, 875, 1021, 0, 0, -1 }, - { 0x1, 0x1, 41, 876, 752, 34, 1, 22 }, - { 0x0, 0x0, 41, 877, 1026, 0, 0, -1 }, - { 0x0, 0x0, 41, 878, 1030, 0, 0, -1 }, - { 0x1, 0x1, 41, 879, 775, 34, 1, 18 }, - { 0x1, 0x1, 41, 880, 779, 34, 1, 18 }, - { 0x0, 0x0, 41, 881, 1034, 0, 0, -1 }, - { 0x1, 0x1, 41, 882, 791, 34, 1, 22 }, - { 0x800001, 0x800001, 41, -1, 1156, 4, 1, 17 }, - { 0x1, 0x1, 41, 2236, 1154, 4, 1, 17 }, - { 0x1, 0x1, 41, 957, 1159, 4, 1, 23 }, - { 0x2, 0x3, 41, -1, 1164, 20, 1, 68 }, - { 0x1, 0x1, 41, 2237, 1162, 21, 1, 68 }, - { 0x0, 0x0, 42, -1, -1, 0, 1, 86 }, - { 0x0, 0x0, 42, -1, -1, 0, 1, 86 }, - { 0x0, 0x0, 42, -1, -1, 0, 1, 130 }, - { 0x1, 0x1, 44, 1372, 297, 38, 1, 1 }, - { 0x1, 0x1, 44, 1373, 299, 38, 1, 1 }, - { 0x0, 0x0, 44, -1, 302, 0, 0, -1 }, - { 0x0, 0x0, 44, -1, 424, 0, 0, -1 }, - { 0x1, 0x1, 44, 1377, 319, 38, 1, 1 }, - { 0x1, 0x1, 44, 1378, 321, 38, 1, 1 }, - { 0x0, 0x0, 44, -1, 324, 0, 0, -1 }, - { 0x0, 0x0, 44, -1, 464, 0, 0, -1 }, - { 0x0, 0x0, 44, -1, 326, 0, 0, -1 }, - { 0x0, 0x0, 44, -1, 344, 0, 0, -1 }, - { 0x1, 0x1, 44, 1384, 345, 38, 1, 1 }, - { 0x1, 0x1, 44, 1385, 347, 38, 1, 1 }, - { 0x0, 0x0, 44, -1, 350, 0, 0, -1 }, - { 0x0, 0x0, 44, -1, 472, 0, 0, -1 }, - { 0x1, 0x1, 44, 1389, 367, 38, 1, 1 }, - { 0x1, 0x1, 44, 1390, 369, 38, 1, 1 }, - { 0x0, 0x0, 44, -1, 372, 0, 0, -1 }, - { 0x0, 0x0, 44, -1, 512, 0, 0, -1 }, - { 0x0, 0x0, 44, -1, 374, 0, 0, -1 }, - { 0x0, 0x0, 44, -1, 392, 0, 0, -1 }, - { 0x0, 0x0, 44, 1248, 2297, 0, 0, -1 }, - { 0x0, 0x0, 44, 1249, 2305, 0, 1, 55 }, - { 0x0, 0x0, 44, 1250, 2972, 0, 1, 55 }, - { 0x0, 0x0, 44, 1251, 2373, 0, 0, -1 }, - { 0x0, 0x0, 44, 1252, -1, 0, 1, 50 }, - { 0x0, 0x0, 44, 1120, -1, 0, 1, 0 }, - { 0x0, 0x0, 44, 1121, -1, 0, 1, 0 }, - { 0x0, 0x0, 44, 1122, -1, 0, 1, 0 }, - { 0x1, 0x1, 45, -1, 1676, 30, 1, 158 }, - { 0x1, 0x1, 45, 963, 1675, 30, 1, 158 }, - { 0x1, 0x1, 45, -1, 1680, 30, 1, 159 }, - { 0x1, 0x1, 45, 964, 1679, 30, 1, 159 }, - { 0x1, 0x1, 45, -1, 1684, 30, 1, 159 }, - { 0x1, 0x1, 45, 965, 1683, 30, 1, 159 }, - { 0x3, 0x3, 46, -1, 1160, 3, 1, 23 }, - { 0x1, 0x1, 47, 2257, -1, 30, 1, 144 }, - { 0x1, 0x1, 47, 2288, -1, 30, 1, 160 }, - { 0x0, 0x0, 49, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 49, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 49, -1, -1, 0, 1, 41 }, - { 0x1, 0x1, 56, -1, 1677, 31, 1, 158 }, - { 0x1, 0x1, 56, -1, 1681, 31, 1, 159 }, - { 0x1, 0x1, 56, -1, 1685, 31, 1, 159 }, - { 0x0, 0x0, 56, -1, -1, 0, 1, 101 }, - { 0x2, 0x3, 56, -1, -1, 27, 1, 101 }, - { 0x1, 0x1, 56, -1, -1, 28, 1, 101 }, - { 0x0, 0x0, 65, 14, 592, 0, 1, 6 }, - { 0x0, 0x0, 65, 1273, 595, 0, 1, 6 }, - { 0x1, 0x1, 65, 1274, 597, 33, 1, 6 }, - { 0x1, 0x1, 65, 1275, 599, 34, 1, 6 }, - { 0x3, 0x3, 65, 1276, 601, 33, 1, 6 }, - { 0x0, 0x0, 65, 1277, 603, 0, 1, 6 }, - { 0x1, 0x1, 65, 1278, 605, 33, 1, 6 }, - { 0x1, 0x1, 65, 1279, 607, 34, 1, 6 }, - { 0x3, 0x3, 65, 1280, 609, 33, 1, 6 }, - { 0x1, 0x1, 65, 1281, 611, 6, 1, 7 }, - { 0x8000001, 0x8000001, 65, 1282, 613, 6, 1, 7 }, - { 0x10000001, 0x10000001, 65, 1283, 615, 6, 1, 7 }, - { 0x18000001, 0x18000001, 65, 1284, 617, 6, 1, 7 }, - { 0x0, 0x0, 65, 1285, 631, 0, 1, 8 }, - { 0x1, 0x1, 65, 1286, 633, 33, 1, 8 }, - { 0x1, 0x1, 65, 1287, 635, 34, 1, 8 }, - { 0x3, 0x3, 65, 1288, 637, 33, 1, 8 }, - { 0x0, 0x0, 65, 1289, 643, 0, 1, 16 }, - { 0x1, 0x1, 65, 1290, 645, 33, 1, 16 }, - { 0x1, 0x1, 65, 1291, 647, 34, 1, 16 }, - { 0x3, 0x3, 65, 1292, 649, 33, 1, 16 }, - { 0x0, 0x0, 65, 15, 655, 0, 1, 18 }, - { 0x0, 0x0, 65, 1294, 658, 0, 1, 18 }, - { 0x1, 0x1, 65, 1295, 660, 33, 1, 18 }, - { 0x1, 0x1, 65, 1296, 662, 34, 1, 18 }, - { 0x3, 0x3, 65, 1297, 664, 33, 1, 18 }, - { 0x0, 0x0, 65, 1298, 666, 0, 1, 18 }, - { 0x1, 0x1, 65, 1299, 668, 33, 1, 18 }, - { 0x1, 0x1, 65, 1300, 670, 34, 1, 18 }, - { 0x3, 0x3, 65, 1301, 672, 33, 1, 18 }, - { 0x0, 0x0, 65, 1302, 682, 0, 1, 19 }, - { 0x1, 0x1, 65, 1303, 684, 33, 1, 19 }, - { 0x1, 0x1, 65, 1304, 686, 34, 1, 19 }, - { 0x3, 0x3, 65, 1305, 688, 33, 1, 19 }, - { 0x1, 0x1, 65, 1306, 690, 6, 1, 19 }, - { 0x8000001, 0x8000001, 65, 1307, 692, 6, 1, 19 }, - { 0x10000001, 0x10000001, 65, 1308, 694, 6, 1, 19 }, - { 0x18000001, 0x18000001, 65, 1309, 696, 6, 1, 19 }, - { 0x0, 0x0, 65, 1310, 706, 0, 1, 20 }, - { 0x1, 0x1, 65, 1311, 708, 33, 1, 20 }, - { 0x1, 0x1, 65, 1312, 710, 34, 1, 20 }, - { 0x3, 0x3, 65, 1313, 712, 33, 1, 20 }, - { 0x0, 0x0, 65, 1314, 718, 0, 1, 21 }, - { 0x1, 0x1, 65, 1315, 720, 33, 1, 21 }, - { 0x1, 0x1, 65, 1316, 722, 34, 1, 21 }, - { 0x3, 0x3, 65, 1317, 724, 33, 1, 21 }, - { 0x1, 0x1, 65, 1318, 726, 6, 1, 21 }, - { 0x8000001, 0x8000001, 65, 1319, 728, 6, 1, 21 }, - { 0x10000001, 0x10000001, 65, 1320, 730, 6, 1, 21 }, - { 0x18000001, 0x18000001, 65, 1321, 732, 6, 1, 21 }, - { 0x0, 0x0, 65, 1322, 742, 0, 1, 22 }, - { 0x1, 0x1, 65, 1323, 744, 33, 1, 22 }, - { 0x1, 0x1, 65, 1324, 746, 34, 1, 22 }, - { 0x3, 0x3, 65, 1325, 748, 33, 1, 22 }, - { 0x0, 0x0, 65, 17, 754, 0, 1, 18 }, - { 0x0, 0x0, 65, 1327, 757, 0, 1, 18 }, - { 0x1, 0x1, 65, 1328, 759, 33, 1, 18 }, - { 0x1, 0x1, 65, 1329, 761, 34, 1, 18 }, - { 0x3, 0x3, 65, 1330, 763, 33, 1, 18 }, - { 0x0, 0x0, 65, 1331, 765, 0, 1, 18 }, - { 0x1, 0x1, 65, 1332, 767, 33, 1, 18 }, - { 0x1, 0x1, 65, 1333, 769, 34, 1, 18 }, - { 0x3, 0x3, 65, 1334, 771, 33, 1, 18 }, - { 0x0, 0x0, 65, 1335, 781, 0, 1, 22 }, - { 0x1, 0x1, 65, 1336, 783, 33, 1, 22 }, - { 0x1, 0x1, 65, 1337, 785, 34, 1, 22 }, - { 0x3, 0x3, 65, 1338, 787, 33, 1, 22 }, - { 0x3, 0x3, 66, 561, 1539, 33, 1, 136 }, - { 0x3, 0x3, 66, 562, 1549, 33, 1, 136 }, - { 0x3, 0x3, 66, 563, 1559, 33, 1, 136 }, - { 0x0, 0x0, 66, -1, 1564, 0, 1, 147 }, - { 0x0, 0x0, 66, -1, 1565, 0, 1, 152 }, - { 0x0, 0x0, 66, -1, 1566, 0, 1, 152 }, - { 0x0, 0x0, 107, 1046, 2345, 0, 0, -1 }, - { 0x0, 0x0, 107, 1047, 2864, 0, 1, 30 }, - { 0x0, 0x0, 107, 1048, 2386, 0, 0, -1 }, - { 0x0, 0x0, 107, 1049, 2868, 0, 1, 30 }, - { 0x0, 0x0, 109, -1, 2347, 0, 0, -1 }, - { 0x1, 0x1, 109, -1, 2865, 27, 1, 30 }, - { 0x0, 0x0, 109, -1, 2388, 0, 0, -1 }, - { 0x1, 0x1, 109, -1, 2869, 27, 1, 30 }, - { 0x0, 0x0, 110, 1051, -1, 0, 1, 122 }, - { 0x1, 0x1, 111, -1, -1, 27, 1, 122 }, - { 0x0, 0x0, 112, 1082, 2894, 0, 1, 1 }, - { 0x0, 0x0, 112, 1083, 2897, 0, 1, 1 }, - { 0x0, 0x0, 112, 1224, 305, 0, 0, -1 }, - { 0x0, 0x0, 112, 1225, 309, 0, 0, -1 }, - { 0x0, 0x0, 112, 1185, 440, 0, 0, -1 }, - { 0x0, 0x0, 112, 1186, 448, 0, 0, -1 }, - { 0x0, 0x0, 112, -1, 456, 0, 0, -1 }, - { 0x0, 0x0, 112, 1084, 2910, 0, 1, 1 }, - { 0x0, 0x0, 112, 1085, 2913, 0, 1, 1 }, - { 0x0, 0x0, 112, -1, 330, 0, 0, -1 }, - { 0x0, 0x0, 112, -1, 334, 0, 0, -1 }, - { 0x0, 0x0, 112, 1233, 335, 0, 0, -1 }, - { 0x0, 0x0, 112, 1234, 339, 0, 0, -1 }, - { 0x0, 0x0, 112, 1086, 2934, 0, 1, 1 }, - { 0x0, 0x0, 112, 1087, 2937, 0, 1, 1 }, - { 0x0, 0x0, 112, 1237, 353, 0, 0, -1 }, - { 0x0, 0x0, 112, 1238, 357, 0, 0, -1 }, - { 0x0, 0x0, 112, 1198, 488, 0, 0, -1 }, - { 0x0, 0x0, 112, 1199, 496, 0, 0, -1 }, - { 0x0, 0x0, 112, -1, 504, 0, 0, -1 }, - { 0x0, 0x0, 112, 1391, 2948, 0, 1, 1 }, - { 0x0, 0x0, 112, 1392, 2950, 0, 1, 1 }, - { 0x0, 0x0, 112, -1, 378, 0, 0, -1 }, - { 0x0, 0x0, 112, -1, 382, 0, 0, -1 }, - { 0x0, 0x0, 112, 1246, 383, 0, 0, -1 }, - { 0x0, 0x0, 112, 1247, 387, 0, 0, -1 }, - { 0x0, 0x0, 112, -1, 2315, 0, 0, -1 }, - { 0x1, 0x9, 112, -1, 2319, 33, 1, 55 }, - { 0x1, 0x9, 112, -1, 2981, 33, 1, 55 }, - { 0x2, 0x3, 112, 1408, 2382, 27, 1, 50 }, - { 0x1, 0x1, 114, 1374, 2895, 37, 1, 1 }, - { 0x1, 0x1, 114, 1375, 2898, 37, 1, 1 }, - { 0x1, 0x1, 114, 1379, 2911, 37, 1, 1 }, - { 0x1, 0x1, 114, 1380, 2914, 37, 1, 1 }, - { 0x1, 0x1, 114, 1386, 2935, 37, 1, 1 }, - { 0x1, 0x1, 114, 1387, 2938, 37, 1, 1 }, - { 0x0, 0x0, 114, -1, 2958, 0, 1, 1 }, - { 0x0, 0x0, 114, -1, 2959, 0, 1, 1 }, - { 0x0, 0x0, 115, 1123, 2890, 0, 1, 1 }, - { 0x0, 0x0, 115, 1124, 2892, 0, 1, 1 }, - { 0x0, 0x0, 115, 1183, 303, 0, 0, -1 }, - { 0x0, 0x0, 115, 1184, 307, 0, 0, -1 }, - { 0x0, 0x0, 115, -1, 444, 0, 0, -1 }, - { 0x0, 0x0, 115, -1, 452, 0, 0, -1 }, - { 0x0, 0x0, 115, 1228, 454, 0, 0, -1 }, - { 0x0, 0x0, 115, -1, 2908, 0, 1, 1 }, - { 0x0, 0x0, 115, -1, 2909, 0, 1, 1 }, - { 0x0, 0x0, 115, 1231, 328, 0, 0, -1 }, - { 0x0, 0x0, 115, 1232, 332, 0, 0, -1 }, - { 0x0, 0x0, 115, 1192, 337, 0, 0, -1 }, - { 0x0, 0x0, 115, 1193, 341, 0, 0, -1 }, - { 0x0, 0x0, 115, 1127, 2930, 0, 1, 1 }, - { 0x0, 0x0, 115, 1128, 2932, 0, 1, 1 }, - { 0x0, 0x0, 115, 1196, 351, 0, 0, -1 }, - { 0x0, 0x0, 115, 1197, 355, 0, 0, -1 }, - { 0x0, 0x0, 115, -1, 492, 0, 0, -1 }, - { 0x0, 0x0, 115, -1, 500, 0, 0, -1 }, - { 0x0, 0x0, 115, 1241, 502, 0, 0, -1 }, - { 0x0, 0x0, 115, -1, 2946, 0, 1, 1 }, - { 0x0, 0x0, 115, -1, 2947, 0, 1, 1 }, - { 0x0, 0x0, 115, 1244, 376, 0, 0, -1 }, - { 0x0, 0x0, 115, 1245, 380, 0, 0, -1 }, - { 0x0, 0x0, 115, 1205, 385, 0, 0, -1 }, - { 0x0, 0x0, 115, 1206, 389, 0, 0, -1 }, - { 0x0, 0x0, 115, 1078, 2313, 0, 0, -1 }, - { 0x0, 0x0, 115, 1079, 2317, 0, 1, 55 }, - { 0x0, 0x0, 115, 1080, 2980, 0, 1, 55 }, - { 0x0, 0x0, 115, 1081, 2381, 0, 1, 50 }, - { 0x1, 0x1, 115, -1, -1, 27, 1, 0 }, - { 0x1, 0x1, 115, -1, -1, 27, 1, 0 }, - { 0x1, 0x1, 115, -1, -1, 27, 1, 0 }, - { 0x1, 0x1, 116, -1, 2891, 37, 1, 1 }, - { 0x1, 0x1, 116, -1, 2893, 37, 1, 1 }, - { 0x0, 0x0, 116, -1, 2918, 0, 1, 1 }, - { 0x0, 0x0, 116, -1, 2919, 0, 1, 1 }, - { 0x1, 0x1, 116, -1, 2931, 37, 1, 1 }, - { 0x1, 0x1, 116, -1, 2933, 37, 1, 1 }, - { 0x0, 0x0, 116, -1, 2956, 0, 1, 1 }, - { 0x0, 0x0, 116, -1, 2957, 0, 1, 1 }, - { 0x0, 0x0, 117, 1176, -1, 0, 1, 0 }, - { 0x0, 0x0, 117, 1177, -1, 0, 1, 0 }, - { 0x0, 0x0, 117, 1178, -1, 0, 1, 0 }, - { 0x3, 0x3, 117, 1136, -1, 34, 1, 34 }, - { 0x3, 0x3, 117, 1137, -1, 34, 1, 41 }, - { 0x1, 0x1, 119, -1, -1, 35, 1, 34 }, - { 0x1, 0x1, 119, -1, -1, 35, 1, 41 }, - { 0x0, 0x0, 120, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 120, -1, -1, 0, 1, 67 }, - { 0x1, 0x1, 120, -1, -1, 36, 1, 129 }, - { 0x0, 0x0, 120, -1, -1, 0, 1, 41 }, - { 0x1, 0x1, 120, -1, -1, 27, 1, 103 }, - { 0x0, 0x0, 120, -1, -1, 0, 1, 112 }, - { 0x0, 0x0, 120, -1, -1, 0, 1, 74 }, - { 0x0, 0x0, 120, -1, -1, 0, 1, 74 }, - { 0x0, 0x0, 120, -1, -1, 0, 1, 75 }, - { 0x0, 0x0, 120, -1, -1, 0, 1, 41 }, - { 0x1, 0x1, 120, -1, -1, 27, 1, 124 }, - { 0x1, 0x1, 120, -1, -1, 27, 1, 41 }, - { 0x0, 0x0, 120, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 121, -1, 2820, 0, 0, -1 }, - { 0x0, 0x0, 121, -1, 2823, 0, 0, -1 }, - { 0x1, 0x1, 122, -1, -1, 35, 1, 17 }, - { 0x1, 0x1, 122, -1, -1, 35, 1, 17 }, - { 0x1, 0x1, 122, -1, -1, 35, 1, 17 }, - { 0x1, 0x1, 122, -1, -1, 35, 1, 17 }, - { 0x1, 0x1, 122, -1, -1, 35, 1, 23 }, - { 0x1, 0x1, 122, -1, -1, 35, 1, 23 }, - { 0x1, 0x1, 122, -1, -1, 35, 1, 23 }, - { 0x1, 0x1, 122, -1, -1, 35, 1, 23 }, - { 0x1, 0x1, 122, -1, -1, 23, 1, 68 }, - { 0x1, 0x1, 122, -1, -1, 23, 1, 68 }, - { 0x1, 0x1, 122, -1, -1, 23, 1, 68 }, - { 0x1, 0x1, 122, -1, -1, 23, 1, 68 }, - { 0x1, 0x1, 122, 918, -1, 23, 1, 68 }, - { 0x9, 0x9, 122, 919, -1, 20, 1, 68 }, - { 0x0, 0x0, 126, 2199, -1, 0, 1, 0 }, - { 0x0, 0x0, 126, 2200, -1, 0, 1, 0 }, - { 0x1, 0x1, 126, -1, -1, 28, 1, 34 }, - { 0x1, 0x1, 126, -1, -1, 27, 1, 34 }, - { 0x1, 0x1, 126, -1, -1, 29, 1, 0 }, - { 0x1, 0x1, 126, -1, -1, 29, 1, 0 }, - { 0x1, 0x1, 126, -1, -1, 29, 1, 0 }, - { 0x1, 0x1, 126, -1, -1, 29, 1, 0 }, - { 0x0, 0x0, 126, -1, -1, 0, 1, 121 }, - { 0x1, 0x1, 126, -1, -1, 29, 1, 0 }, - { 0x1, 0x1, 126, -1, -1, 29, 1, 0 }, - { 0x1, 0x1, 126, -1, -1, 29, 1, 0 }, - { 0x0, 0x0, 126, 1134, -1, 0, 1, 34 }, - { 0x0, 0x0, 126, 1262, -1, 0, 1, 41 }, - { 0x0, 0x0, 140, 1212, 2886, 0, 1, 1 }, - { 0x0, 0x0, 140, 1213, 2888, 0, 1, 1 }, - { 0x0, 0x0, 140, 1054, 304, 0, 0, -1 }, - { 0x0, 0x0, 140, 1055, 432, 0, 0, -1 }, - { 0x0, 0x0, 140, 1094, 313, 0, 0, -1 }, - { 0x0, 0x0, 140, 1095, 317, 0, 0, -1 }, - { 0x0, 0x0, 140, 1096, 453, 0, 0, -1 }, - { 0x0, 0x0, 140, -1, 2906, 0, 1, 1 }, - { 0x0, 0x0, 140, -1, 2907, 0, 1, 1 }, - { 0x0, 0x0, 140, 1099, 327, 0, 0, -1 }, - { 0x0, 0x0, 140, 1100, 331, 0, 0, -1 }, - { 0x0, 0x0, 140, -1, 338, 0, 0, -1 }, - { 0x0, 0x0, 140, -1, 342, 0, 0, -1 }, - { 0x0, 0x0, 140, 1216, 2926, 0, 1, 1 }, - { 0x0, 0x0, 140, 1217, 2928, 0, 1, 1 }, - { 0x0, 0x0, 140, 1067, 352, 0, 0, -1 }, - { 0x0, 0x0, 140, 1068, 480, 0, 0, -1 }, - { 0x0, 0x0, 140, 1107, 361, 0, 0, -1 }, - { 0x0, 0x0, 140, 1108, 365, 0, 0, -1 }, - { 0x0, 0x0, 140, 1109, 501, 0, 0, -1 }, - { 0x0, 0x0, 140, -1, 2944, 0, 1, 1 }, - { 0x0, 0x0, 140, -1, 2945, 0, 1, 1 }, - { 0x0, 0x0, 140, 1112, 375, 0, 0, -1 }, - { 0x0, 0x0, 140, 1113, 379, 0, 0, -1 }, - { 0x0, 0x0, 140, -1, 386, 0, 0, -1 }, - { 0x0, 0x0, 140, -1, 390, 0, 0, -1 }, - { 0x0, 0x0, 140, 3012, 2301, 0, 0, -1 }, - { 0x1, 0x1, 140, 3013, 2309, 33, 1, 55 }, - { 0x1, 0x1, 140, 3014, 2974, 33, 1, 55 }, - { 0x0, 0x0, 140, 3015, 2375, 0, 0, -1 }, - { 0x1, 0x1, 140, 3016, -1, 28, 1, 50 }, - { 0x1, 0x1, 141, -1, 2887, 37, 1, 1 }, - { 0x1, 0x1, 141, -1, 2889, 37, 1, 1 }, - { 0x0, 0x0, 141, -1, 2916, 0, 1, 1 }, - { 0x0, 0x0, 141, -1, 2917, 0, 1, 1 }, - { 0x1, 0x1, 141, -1, 2927, 37, 1, 1 }, - { 0x1, 0x1, 141, -1, 2929, 37, 1, 1 }, - { 0x0, 0x0, 141, -1, 2954, 0, 1, 1 }, - { 0x0, 0x0, 141, -1, 2955, 0, 1, 1 }, - { 0x1, 0x1, 144, 917, 1158, 3, 1, 23 }, - { 0x0, 0x0, 145, 2201, -1, 0, 1, 34 }, - { 0x0, 0x0, 146, 923, 2880, 0, 1, 1 }, - { 0x0, 0x0, 146, 924, 2883, 0, 1, 1 }, - { 0x0, 0x0, 146, -1, 306, 0, 0, -1 }, - { 0x0, 0x0, 146, -1, 436, 0, 0, -1 }, - { 0x0, 0x0, 146, 1056, 311, 0, 0, -1 }, - { 0x0, 0x0, 146, 1057, 315, 0, 0, -1 }, - { 0x0, 0x0, 146, 1058, 455, 0, 0, -1 }, - { 0x0, 0x0, 146, 927, 2900, 0, 1, 1 }, - { 0x0, 0x0, 146, 928, 2903, 0, 1, 1 }, - { 0x0, 0x0, 146, 1061, 329, 0, 0, -1 }, - { 0x0, 0x0, 146, 1062, 333, 0, 0, -1 }, - { 0x0, 0x0, 146, 1101, 336, 0, 0, -1 }, - { 0x0, 0x0, 146, 1102, 340, 0, 0, -1 }, - { 0x0, 0x0, 146, 933, 2920, 0, 1, 1 }, - { 0x0, 0x0, 146, 934, 2923, 0, 1, 1 }, - { 0x0, 0x0, 146, -1, 354, 0, 0, -1 }, - { 0x0, 0x0, 146, -1, 484, 0, 0, -1 }, - { 0x0, 0x0, 146, 1069, 359, 0, 0, -1 }, - { 0x0, 0x0, 146, 1070, 363, 0, 0, -1 }, - { 0x0, 0x0, 146, 1071, 503, 0, 0, -1 }, - { 0x0, 0x0, 146, 937, 2940, 0, 1, 1 }, - { 0x0, 0x0, 146, 938, 2942, 0, 1, 1 }, - { 0x0, 0x0, 146, 1074, 377, 0, 0, -1 }, - { 0x0, 0x0, 146, 1075, 381, 0, 0, -1 }, - { 0x0, 0x0, 146, 1114, 384, 0, 0, -1 }, - { 0x0, 0x0, 146, 1115, 388, 0, 0, -1 }, - { 0x0, 0x0, 146, 1207, 2299, 0, 0, -1 }, - { 0x1, 0x1, 146, 1208, 2307, 36, 1, 55 }, - { 0x1, 0x1, 146, 1209, 2973, 36, 1, 55 }, - { 0x0, 0x0, 146, 1210, 2374, 0, 0, -1 }, - { 0x1, 0x1, 146, 1211, -1, 27, 1, 50 }, - { 0x1, 0x1, 147, -1, 2882, 37, 1, 1 }, - { 0x1, 0x1, 147, -1, 2885, 37, 1, 1 }, - { 0x1, 0x1, 147, -1, 2902, 37, 1, 1 }, - { 0x1, 0x1, 147, -1, 2905, 37, 1, 1 }, - { 0x1, 0x1, 147, -1, 2922, 37, 1, 1 }, - { 0x1, 0x1, 147, -1, 2925, 37, 1, 1 }, - { 0x0, 0x0, 147, -1, 2952, 0, 1, 1 }, - { 0x0, 0x0, 147, -1, 2953, 0, 1, 1 }, - { 0x0, 0x0, 148, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 148, 1135, -1, 0, 1, 41 }, - { 0x0, 0x0, 149, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 149, -1, -1, 0, 1, 67 }, - { 0x0, 0x0, 149, -1, 2960, 0, 1, 64 }, - { 0x0, 0x0, 149, -1, 2961, 0, 1, 64 }, - { 0x0, 0x0, 149, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 149, -1, -1, 0, 1, 87 }, - { 0x0, 0x0, 149, -1, -1, 0, 1, 87 }, - { 0x0, 0x0, 149, -1, -1, 0, 1, 92 }, - { 0x0, 0x0, 149, -1, -1, 0, 1, 41 }, - { 0x1, 0x1, 150, -1, 593, 12, 1, 6 }, - { 0x1, 0x1, 150, -1, 596, 12, 1, 6 }, - { 0x200001, 0x200001, 150, -1, 598, 12, 1, 6 }, - { 0x400001, 0x400001, 150, -1, 600, 12, 1, 6 }, - { 0x600001, 0x600001, 150, -1, 602, 12, 1, 6 }, - { 0x1, 0x1, 150, -1, 604, 12, 1, 6 }, - { 0x200001, 0x200001, 150, -1, 606, 12, 1, 6 }, - { 0x400001, 0x400001, 150, -1, 608, 12, 1, 6 }, - { 0x600001, 0x600001, 150, -1, 610, 12, 1, 6 }, - { 0x41, 0x41, 150, -1, 612, 6, 1, 7 }, - { 0x8000041, 0x8000041, 150, -1, 614, 6, 1, 7 }, - { 0x10000041, 0x10000041, 150, -1, 616, 6, 1, 7 }, - { 0x18000041, 0x18000041, 150, -1, 618, 6, 1, 7 }, - { 0x1, 0x1, 150, -1, 632, 12, 1, 8 }, - { 0x200001, 0x200001, 150, -1, 634, 12, 1, 8 }, - { 0x400001, 0x400001, 150, -1, 636, 12, 1, 8 }, - { 0x600001, 0x600001, 150, -1, 638, 12, 1, 8 }, - { 0x1, 0x1, 150, -1, 644, 12, 1, 16 }, - { 0x200001, 0x200001, 150, -1, 646, 12, 1, 16 }, - { 0x400001, 0x400001, 150, -1, 648, 12, 1, 16 }, - { 0x600001, 0x600001, 150, -1, 650, 12, 1, 16 }, - { 0x1, 0x1, 150, -1, 656, 12, 1, 18 }, - { 0x1, 0x1, 150, -1, 659, 12, 1, 18 }, - { 0x200001, 0x200001, 150, -1, 661, 12, 1, 18 }, - { 0x400001, 0x400001, 150, -1, 663, 12, 1, 18 }, - { 0x600001, 0x600001, 150, -1, 665, 12, 1, 18 }, - { 0x1, 0x1, 150, -1, 667, 12, 1, 18 }, - { 0x200001, 0x200001, 150, -1, 669, 12, 1, 18 }, - { 0x400001, 0x400001, 150, -1, 671, 12, 1, 18 }, - { 0x600001, 0x600001, 150, -1, 673, 12, 1, 18 }, - { 0x1, 0x1, 150, -1, 683, 12, 1, 19 }, - { 0x200001, 0x200001, 150, -1, 685, 12, 1, 19 }, - { 0x400001, 0x400001, 150, -1, 687, 12, 1, 19 }, - { 0x600001, 0x600001, 150, -1, 689, 12, 1, 19 }, - { 0x41, 0x41, 150, -1, 691, 6, 1, 19 }, - { 0x8000041, 0x8000041, 150, -1, 693, 6, 1, 19 }, - { 0x10000041, 0x10000041, 150, -1, 695, 6, 1, 19 }, - { 0x18000041, 0x18000041, 150, -1, 697, 6, 1, 19 }, - { 0x1, 0x1, 150, -1, 707, 12, 1, 20 }, - { 0x200001, 0x200001, 150, -1, 709, 12, 1, 20 }, - { 0x400001, 0x400001, 150, -1, 711, 12, 1, 20 }, - { 0x600001, 0x600001, 150, -1, 713, 12, 1, 20 }, - { 0x1, 0x1, 150, -1, 719, 12, 1, 21 }, - { 0x200001, 0x200001, 150, -1, 721, 12, 1, 21 }, - { 0x400001, 0x400001, 150, -1, 723, 12, 1, 21 }, - { 0x600001, 0x600001, 150, -1, 725, 12, 1, 21 }, - { 0x41, 0x41, 150, -1, 727, 6, 1, 21 }, - { 0x8000041, 0x8000041, 150, -1, 729, 6, 1, 21 }, - { 0x10000041, 0x10000041, 150, -1, 731, 6, 1, 21 }, - { 0x18000041, 0x18000041, 150, -1, 733, 6, 1, 21 }, - { 0x1, 0x1, 150, -1, 743, 12, 1, 22 }, - { 0x200001, 0x200001, 150, -1, 745, 12, 1, 22 }, - { 0x400001, 0x400001, 150, -1, 747, 12, 1, 22 }, - { 0x600001, 0x600001, 150, -1, 749, 12, 1, 22 }, - { 0x1, 0x1, 150, -1, 755, 12, 1, 18 }, - { 0x1, 0x1, 150, -1, 758, 12, 1, 18 }, - { 0x200001, 0x200001, 150, -1, 760, 12, 1, 18 }, - { 0x400001, 0x400001, 150, -1, 762, 12, 1, 18 }, - { 0x600001, 0x600001, 150, -1, 764, 12, 1, 18 }, - { 0x1, 0x1, 150, -1, 766, 12, 1, 18 }, - { 0x200001, 0x200001, 150, -1, 768, 12, 1, 18 }, - { 0x400001, 0x400001, 150, -1, 770, 12, 1, 18 }, - { 0x600001, 0x600001, 150, -1, 772, 12, 1, 18 }, - { 0x1, 0x1, 150, -1, 782, 12, 1, 22 }, - { 0x200001, 0x200001, 150, -1, 784, 12, 1, 22 }, - { 0x400001, 0x400001, 150, -1, 786, 12, 1, 22 }, - { 0x600001, 0x600001, 150, -1, 788, 12, 1, 22 }, - { 0x0, 0x0, 155, -1, -1, 0, 1, 131 }, - { 0x0, 0x0, 159, 793, -1, 0, 1, 81 }, - { 0x0, 0x0, 159, 794, -1, 0, 1, 81 }, - { 0x9, 0x9, 159, -1, 1456, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1465, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1474, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1487, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1496, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1505, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1514, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1523, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1532, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1542, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1552, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1562, 32, 1, 137 }, - { 0x9, 0x9, 159, -1, 1571, 32, 1, 151 }, - { 0x9, 0x9, 159, -1, 1577, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1583, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1589, 32, 1, 151 }, - { 0x9, 0x9, 159, -1, 1595, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1601, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1607, 32, 1, 151 }, - { 0x9, 0x9, 159, -1, 1613, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1619, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1625, 32, 1, 151 }, - { 0x9, 0x9, 159, -1, 1631, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1637, 32, 1, 151 }, - { 0x9, 0x9, 159, -1, 1643, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1649, 32, 1, 151 }, - { 0x9, 0x9, 159, -1, 1655, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1661, 32, 1, 151 }, - { 0x9, 0x9, 159, -1, 1667, 32, 1, 156 }, - { 0x9, 0x9, 159, -1, 1673, 32, 1, 156 }, - { 0x0, 0x0, 160, 1253, 298, 0, 0, -1 }, - { 0x0, 0x0, 160, 1254, 422, 0, 0, -1 }, - { 0x1, 0x1, 160, -1, 2896, 38, 1, 1 }, - { 0x1, 0x1, 160, 925, 2899, 38, 1, 1 }, - { 0x0, 0x0, 160, 926, 423, 0, 0, -1 }, - { 0x0, 0x0, 160, 1255, 320, 0, 0, -1 }, - { 0x0, 0x0, 160, 1256, 462, 0, 0, -1 }, - { 0x1, 0x1, 160, -1, 2912, 38, 1, 1 }, - { 0x1, 0x1, 160, 929, 2915, 38, 1, 1 }, - { 0x0, 0x0, 160, 930, 463, 0, 0, -1 }, - { 0x0, 0x0, 160, 931, 325, 0, 0, -1 }, - { 0x0, 0x0, 160, 932, 343, 0, 0, -1 }, - { 0x0, 0x0, 160, 1257, 346, 0, 0, -1 }, - { 0x0, 0x0, 160, 1258, 470, 0, 0, -1 }, - { 0x1, 0x1, 160, -1, 2936, 38, 1, 1 }, - { 0x1, 0x1, 160, 935, 2939, 38, 1, 1 }, - { 0x0, 0x0, 160, 936, 471, 0, 0, -1 }, - { 0x0, 0x0, 160, -1, 368, 0, 0, -1 }, - { 0x0, 0x0, 160, -1, 510, 0, 0, -1 }, - { 0x1, 0x1, 160, -1, 2949, 38, 1, 1 }, - { 0x1, 0x1, 160, 939, 2951, 38, 1, 1 }, - { 0x0, 0x0, 160, 940, 511, 0, 0, -1 }, - { 0x0, 0x0, 160, 941, 373, 0, 0, -1 }, - { 0x0, 0x0, 160, 942, 391, 0, 0, -1 }, - { 0x0, 0x0, 161, 1415, 2321, 0, 0, -1 }, - { 0x0, 0x0, 161, 1416, 2329, 0, 1, 55 }, - { 0x0, 0x0, 161, 1417, 2990, 0, 1, 55 }, - { 0x0, 0x0, 161, 1418, 2377, 0, 0, -1 }, - { 0x1, 0x1, 161, 1419, -1, 29, 1, 50 }, - { 0x0, 0x0, 162, -1, 2339, 0, 0, -1 }, - { 0x1, 0x9, 162, -1, 2343, 33, 1, 55 }, - { 0x1, 0x9, 162, -1, 2999, 33, 1, 55 }, - { 0x6, 0x7, 162, -1, 2384, 27, 1, 50 }, - { 0x0, 0x0, 163, 1401, 2337, 0, 0, -1 }, - { 0x0, 0x0, 163, 1402, 2341, 0, 1, 55 }, - { 0x0, 0x0, 163, 1403, 2998, 0, 1, 55 }, - { 0x1, 0x1, 163, 1404, 2383, 29, 1, 50 }, - { 0x1, 0x1, 164, 1422, -1, 27, 1, 34 }, - { 0x0, 0x0, 165, 2193, 2325, 0, 0, -1 }, - { 0x1, 0x1, 165, 2194, 2333, 33, 1, 55 }, - { 0x1, 0x1, 165, 2195, 2992, 33, 1, 55 }, - { 0x0, 0x0, 165, 2196, 2379, 0, 0, -1 }, - { 0x3, 0x3, 165, 2197, -1, 28, 1, 50 }, - { 0x0, 0x0, 166, 1410, 2323, 0, 0, -1 }, - { 0x1, 0x1, 166, 1411, 2331, 36, 1, 55 }, - { 0x1, 0x1, 166, 1412, 2991, 36, 1, 55 }, - { 0x0, 0x0, 166, 1413, 2378, 0, 0, -1 }, - { 0x5, 0x5, 166, 1414, -1, 27, 1, 50 }, - { 0x0, 0x0, 167, -1, 2962, 0, 1, 64 }, - { 0x0, 0x0, 167, -1, 2963, 0, 1, 64 }, - { 0x1, 0x1, 169, -1, -1, 28, 1, 34 }, - { 0x1, 0x1, 170, 2779, -1, 27, 1, 34 }, - { 0x1, 0x1, 170, 2780, -1, 27, 1, 34 }, - { 0x1, 0x1, 171, 1703, -1, 28, 1, 142 }, - { 0x1, 0x1, 171, 1704, -1, 28, 1, 142 }, - { 0x1, 0x1, 171, 1705, -1, 28, 1, 142 }, - { 0x1, 0x1, 171, 1706, -1, 28, 1, 142 }, - { 0x1, 0x1, 171, 1707, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1708, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1709, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1710, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1711, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1712, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1713, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1714, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1715, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1716, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1717, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1718, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1719, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1720, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1721, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1722, -1, 28, 1, 141 }, - { 0x1, 0x1, 171, 1723, -1, 28, 1, 143 }, - { 0x1, 0x1, 171, 1724, -1, 28, 1, 143 }, - { 0x1, 0x1, 171, 1725, -1, 28, 1, 143 }, - { 0x1, 0x1, 171, 1726, -1, 28, 1, 143 }, - { 0x1, 0x1, 171, 1727, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1728, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1729, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1730, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1731, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1732, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1733, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1734, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1735, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1736, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1737, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1738, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1739, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1740, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1741, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1742, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1743, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1744, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1745, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1746, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1747, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1748, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1749, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1750, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1751, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1752, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1753, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1754, -1, 28, 1, 132 }, - { 0x1, 0x1, 171, 1755, -1, 28, 1, 132 }, - { 0x1, 0x1, 171, 1756, -1, 28, 1, 132 }, - { 0x1, 0x1, 171, 1757, -1, 28, 1, 132 }, - { 0x1, 0x1, 171, 1758, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1759, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1760, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1761, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1762, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1763, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1764, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1765, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1766, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1767, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1768, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1769, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1770, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1771, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1772, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1773, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1774, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1775, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1776, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1777, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1778, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1779, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1780, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1781, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1782, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1783, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1784, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1785, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1786, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1787, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1788, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1789, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1790, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1791, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1792, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1793, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1794, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1795, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1796, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1797, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1798, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1799, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1800, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1801, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1802, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1803, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1804, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1805, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1806, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1807, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1808, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1809, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1810, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1811, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1812, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1813, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1814, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1815, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1816, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1817, -1, 28, 1, 136 }, - { 0x1, 0x1, 171, 1818, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1819, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1820, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1821, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1822, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1823, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1824, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1825, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1826, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1827, -1, 28, 1, 136 }, - { 0x1, 0x1, 171, 1828, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1829, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1830, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1831, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1832, -1, 28, 1, 133 }, - { 0x1, 0x1, 171, 1833, -1, 28, 1, 134 }, - { 0x1, 0x1, 171, 1834, -1, 28, 1, 135 }, - { 0x1, 0x1, 171, 1835, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1836, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1837, -1, 28, 1, 136 }, - { 0x1, 0x1, 171, 1838, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1839, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1840, -1, 28, 1, 137 }, - { 0x1, 0x1, 171, 1841, -1, 28, 1, 131 }, - { 0x1, 0x1, 171, 1842, -1, 28, 1, 147 }, - { 0x1, 0x1, 171, 1843, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1844, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1845, -1, 28, 1, 148 }, - { 0x1, 0x1, 171, 1846, -1, 28, 1, 149 }, - { 0x1, 0x1, 171, 1847, -1, 28, 1, 150 }, - { 0x1, 0x1, 171, 1848, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1849, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1850, -1, 28, 1, 147 }, - { 0x1, 0x1, 171, 1851, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1852, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1853, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1854, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1855, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1856, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1857, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1858, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1859, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1860, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1861, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1862, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1863, -1, 28, 1, 148 }, - { 0x1, 0x1, 171, 1864, -1, 28, 1, 149 }, - { 0x1, 0x1, 171, 1865, -1, 28, 1, 150 }, - { 0x1, 0x1, 171, 1866, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1867, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1868, -1, 28, 1, 147 }, - { 0x1, 0x1, 171, 1869, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1870, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1871, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1872, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1873, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1874, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1875, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1876, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1877, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1878, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1879, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1880, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1881, -1, 28, 1, 148 }, - { 0x1, 0x1, 171, 1882, -1, 28, 1, 149 }, - { 0x1, 0x1, 171, 1883, -1, 28, 1, 150 }, - { 0x1, 0x1, 171, 1884, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1885, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1886, -1, 28, 1, 147 }, - { 0x1, 0x1, 171, 1887, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1888, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1889, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1890, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1891, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1892, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1893, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1894, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1895, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1896, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1897, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1898, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1899, -1, 28, 1, 148 }, - { 0x1, 0x1, 171, 1900, -1, 28, 1, 149 }, - { 0x1, 0x1, 171, 1901, -1, 28, 1, 150 }, - { 0x1, 0x1, 171, 1902, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1903, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1904, -1, 28, 1, 147 }, - { 0x1, 0x1, 171, 1905, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1906, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1907, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1908, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1909, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1910, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1911, -1, 28, 1, 148 }, - { 0x1, 0x1, 171, 1912, -1, 28, 1, 149 }, - { 0x1, 0x1, 171, 1913, -1, 28, 1, 150 }, - { 0x1, 0x1, 171, 1914, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1915, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1916, -1, 28, 1, 147 }, - { 0x1, 0x1, 171, 1917, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1918, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1919, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1920, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1921, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1922, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1923, -1, 28, 1, 148 }, - { 0x1, 0x1, 171, 1924, -1, 28, 1, 149 }, - { 0x1, 0x1, 171, 1925, -1, 28, 1, 150 }, - { 0x1, 0x1, 171, 1926, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1927, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1928, -1, 28, 1, 147 }, - { 0x1, 0x1, 171, 1929, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1930, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1931, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1932, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1933, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1934, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1935, -1, 28, 1, 148 }, - { 0x1, 0x1, 171, 1936, -1, 28, 1, 149 }, - { 0x1, 0x1, 171, 1937, -1, 28, 1, 150 }, - { 0x1, 0x1, 171, 1938, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1939, -1, 28, 1, 151 }, - { 0x1, 0x1, 171, 1940, -1, 28, 1, 147 }, - { 0x1, 0x1, 171, 1941, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1942, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1943, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1944, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1945, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1946, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1947, -1, 28, 1, 153 }, - { 0x1, 0x1, 171, 1948, -1, 28, 1, 154 }, - { 0x1, 0x1, 171, 1949, -1, 28, 1, 155 }, - { 0x1, 0x1, 171, 1950, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1951, -1, 28, 1, 156 }, - { 0x1, 0x1, 171, 1952, -1, 28, 1, 152 }, - { 0x1, 0x1, 171, 1691, -1, 28, 1, 158 }, - { 0x1, 0x1, 171, 1692, -1, 28, 1, 158 }, - { 0x1, 0x1, 171, 1693, -1, 28, 1, 158 }, - { 0x1, 0x1, 171, 1694, -1, 28, 1, 158 }, - { 0x1, 0x1, 171, 1695, -1, 28, 1, 159 }, - { 0x1, 0x1, 171, 1696, -1, 28, 1, 159 }, - { 0x1, 0x1, 171, 1697, -1, 28, 1, 159 }, - { 0x1, 0x1, 171, 1698, -1, 28, 1, 159 }, - { 0x1, 0x1, 171, 1699, -1, 28, 1, 159 }, - { 0x1, 0x1, 171, 1700, -1, 28, 1, 159 }, - { 0x1, 0x1, 171, 1701, -1, 28, 1, 159 }, - { 0x1, 0x1, 171, 1702, -1, 28, 1, 159 }, - { 0x1, 0x1, 171, 1997, -1, 28, 1, 143 }, - { 0x1, 0x1, 171, 1998, -1, 28, 1, 143 }, - { 0x1, 0x1, 171, 1999, -1, 28, 1, 143 }, - { 0x1, 0x1, 171, 2000, -1, 28, 1, 143 }, - { 0x1, 0x1, 172, 1953, -1, 29, 1, 158 }, - { 0x1, 0x1, 172, 1954, -1, 29, 1, 158 }, - { 0x1, 0x1, 172, 1955, -1, 29, 1, 158 }, - { 0x1, 0x1, 172, 1956, -1, 29, 1, 158 }, - { 0x1, 0x1, 172, 1957, -1, 29, 1, 159 }, - { 0x1, 0x1, 172, 1958, -1, 29, 1, 159 }, - { 0x1, 0x1, 172, 1959, -1, 29, 1, 159 }, - { 0x1, 0x1, 172, 1960, -1, 29, 1, 159 }, - { 0x1, 0x1, 172, 1961, -1, 29, 1, 159 }, - { 0x1, 0x1, 172, 1962, -1, 29, 1, 159 }, - { 0x1, 0x1, 172, 1963, -1, 29, 1, 159 }, - { 0x1, 0x1, 172, 1964, -1, 29, 1, 159 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 142 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 142 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 142 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 142 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 141 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 143 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 143 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 143 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 143 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 271, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2258, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 273, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2259, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 275, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2260, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 132 }, - { 0x3, 0x3, 173, 277, -1, 28, 1, 132 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 132 }, - { 0x3, 0x3, 173, 278, -1, 28, 1, 132 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 279, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2261, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 281, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2262, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 283, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2263, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 285, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2264, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 287, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2265, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 289, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2266, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 136 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 291, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2267, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 136 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 293, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2268, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 133 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 134 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 135 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 136 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 295, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 137 }, - { 0x3, 0x3, 173, 2269, -1, 28, 1, 131 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 147 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 148 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 149 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 150 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, 2270, -1, 28, 1, 147 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2271, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2272, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 148 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 149 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 150 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, 2273, -1, 28, 1, 147 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2274, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2275, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 148 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 149 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 150 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, 2276, -1, 28, 1, 147 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2277, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2278, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 148 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 149 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 150 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, 2279, -1, 28, 1, 147 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2280, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 148 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 149 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 150 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, 2281, -1, 28, 1, 147 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2282, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 148 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 149 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 150 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, 2283, -1, 28, 1, 147 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2284, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 148 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 149 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 150 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 151 }, - { 0x3, 0x3, 173, 2285, -1, 28, 1, 147 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2286, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 153 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 154 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 155 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 156 }, - { 0x3, 0x3, 173, 2287, -1, 28, 1, 152 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 158 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 158 }, - { 0x3, 0x3, 173, 951, -1, 28, 1, 158 }, - { 0x3, 0x3, 173, 952, -1, 28, 1, 158 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 159 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 159 }, - { 0x3, 0x3, 173, 953, -1, 28, 1, 159 }, - { 0x3, 0x3, 173, 954, -1, 28, 1, 159 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 159 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 159 }, - { 0x3, 0x3, 173, 955, -1, 28, 1, 159 }, - { 0x3, 0x3, 173, 956, -1, 28, 1, 159 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 138 }, - { 0x3, 0x3, 173, 2224, -1, 28, 1, 138 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 145 }, - { 0x3, 0x3, 173, 2225, -1, 28, 1, 145 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 139 }, - { 0x3, 0x3, 173, 2226, -1, 28, 1, 139 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 139 }, - { 0x3, 0x3, 173, 2227, -1, 28, 1, 139 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 138 }, - { 0x3, 0x3, 173, 2228, -1, 28, 1, 138 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 145 }, - { 0x3, 0x3, 173, 2229, -1, 28, 1, 145 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 138 }, - { 0x3, 0x3, 173, 2230, -1, 28, 1, 138 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 145 }, - { 0x3, 0x3, 173, 2231, -1, 28, 1, 145 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 138 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 140 }, - { 0x3, 0x3, 173, 2232, -1, 28, 1, 138 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 145 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 146 }, - { 0x3, 0x3, 173, 2233, -1, 28, 1, 145 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 157 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 161 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 157 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 161 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 157 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 161 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 157 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 161 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 157 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 161 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 143 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 143 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 143 }, - { 0x3, 0x3, 173, -1, -1, 28, 1, 143 }, - { 0x0, 0x0, 174, -1, 394, 0, 0, -1 }, - { 0x0, 0x0, 174, -1, 396, 0, 0, -1 }, - { 0x0, 0x0, 174, 3042, 3002, 0, 1, 1 }, - { 0x0, 0x0, 174, 3043, 3003, 0, 1, 1 }, - { 0x0, 0x0, 174, -1, 402, 0, 0, -1 }, - { 0x0, 0x0, 174, -1, 404, 0, 0, -1 }, - { 0x0, 0x0, 174, 3046, 3006, 0, 1, 76 }, - { 0x0, 0x0, 174, 3047, 3007, 0, 1, 76 }, - { 0x0, 0x0, 174, -1, 410, 0, 0, -1 }, - { 0x0, 0x0, 174, -1, 412, 0, 0, -1 }, - { 0x0, 0x0, 174, 3050, 3010, 0, 1, 1 }, - { 0x0, 0x0, 174, 3051, 3011, 0, 1, 1 }, - { 0x11, 0x31, 175, 2881, 417, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 418, 12, 1, 4 }, - { 0x11, 0x31, 175, 2073, 419, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 421, 12, 1, 4 }, - { 0x1, 0x1, 175, -1, 425, 37, 1, 4 }, - { 0x2000001, 0x2000001, 175, -1, 426, 12, 1, 4 }, - { 0x11, 0x11, 175, -1, 427, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 428, 12, 1, 4 }, - { 0x1, 0x1, 175, 2079, 429, 37, 1, 4 }, - { 0x2000001, 0x2000001, 175, -1, 431, 12, 1, 4 }, - { 0x11, 0x11, 175, 2081, 433, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 435, 12, 1, 4 }, - { 0x1, 0x1, 175, 2083, 437, 37, 1, 4 }, - { 0x2000001, 0x2000001, 175, -1, 439, 12, 1, 4 }, - { 0x11, 0x11, 175, 2085, 441, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 443, 12, 1, 4 }, - { 0x1, 0x1, 175, 2087, 445, 37, 1, 4 }, - { 0x2000001, 0x2000001, 175, -1, 447, 12, 1, 4 }, - { 0x11, 0x11, 175, 2089, 449, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 451, 12, 1, 4 }, - { 0x11, 0x31, 175, 2901, 457, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 458, 12, 1, 4 }, - { 0x11, 0x31, 175, 2095, 459, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 461, 12, 1, 4 }, - { 0x11, 0x31, 175, 2921, 465, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 466, 12, 1, 4 }, - { 0x11, 0x31, 175, 2121, 467, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 469, 12, 1, 4 }, - { 0x1, 0x1, 175, -1, 473, 37, 1, 4 }, - { 0x2000001, 0x2000001, 175, -1, 474, 12, 1, 4 }, - { 0x11, 0x11, 175, -1, 475, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 476, 12, 1, 4 }, - { 0x1, 0x1, 175, 2127, 477, 37, 1, 4 }, - { 0x2000001, 0x2000001, 175, -1, 479, 12, 1, 4 }, - { 0x11, 0x11, 175, 2129, 481, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 483, 12, 1, 4 }, - { 0x1, 0x1, 175, 2131, 485, 37, 1, 4 }, - { 0x2000001, 0x2000001, 175, -1, 487, 12, 1, 4 }, - { 0x11, 0x11, 175, 2133, 489, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 491, 12, 1, 4 }, - { 0x1, 0x1, 175, 2135, 493, 37, 1, 4 }, - { 0x2000001, 0x2000001, 175, -1, 495, 12, 1, 4 }, - { 0x11, 0x11, 175, 2137, 497, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 499, 12, 1, 4 }, - { 0x11, 0x31, 175, 2941, 505, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 506, 12, 1, 4 }, - { 0x11, 0x31, 175, 2143, 507, 33, 1, 4 }, - { 0x2200001, 0x2200001, 175, -1, 509, 12, 1, 4 }, - { 0x1, 0x1, 175, -1, 513, 33, 1, 4 }, - { 0x200001, 0x200001, 175, -1, 514, 12, 1, 4 }, - { 0x1, 0x1, 175, -1, 515, 33, 1, 4 }, - { 0x200001, 0x200001, 175, -1, 516, 12, 1, 4 }, - { 0x1, 0x1, 175, -1, 521, 33, 1, 79 }, - { 0x200001, 0x200001, 175, -1, 522, 12, 1, 79 }, - { 0x1, 0x1, 175, -1, 523, 33, 1, 79 }, - { 0x200001, 0x200001, 175, -1, 524, 12, 1, 79 }, - { 0x1, 0x1, 175, -1, 529, 33, 1, 4 }, - { 0x200001, 0x200001, 175, -1, 530, 12, 1, 4 }, - { 0x1, 0x1, 175, -1, 531, 33, 1, 4 }, - { 0x200001, 0x200001, 175, -1, 532, 12, 1, 4 }, - { 0x2200001, 0x6200001, 176, 2884, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2016, -1, 33, 1, 4 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x4200001, 0x4200001, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 37, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x1, 0x1, 176, 2022, -1, 37, 1, 4 }, - { 0x2200001, 0x2200001, 176, -1, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2024, -1, 33, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x1, 0x1, 176, 2026, -1, 37, 1, 4 }, - { 0x2200001, 0x2200001, 176, -1, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2028, -1, 33, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x1, 0x1, 176, 2030, -1, 37, 1, 4 }, - { 0x2200001, 0x2200001, 176, -1, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2032, -1, 33, 1, 4 }, - { 0x1, 0x1, 176, -1, -1, 37, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, -1, -1, 33, 1, 4 }, - { 0x2200001, 0x2200001, 176, -1, -1, 12, 1, 4 }, - { 0x2200001, 0x6200001, 176, 2904, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2036, -1, 33, 1, 4 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x4200001, 0x4200001, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 37, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x200001, 0x200001, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x200001, 0x200001, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x200001, 0x200001, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x200001, 0x200001, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x2200001, 0x6200001, 176, 2924, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2040, -1, 33, 1, 4 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x4200001, 0x4200001, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 37, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x1, 0x1, 176, 2046, -1, 37, 1, 4 }, - { 0x2200001, 0x2200001, 176, -1, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2048, -1, 33, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x1, 0x1, 176, 2050, -1, 37, 1, 4 }, - { 0x2200001, 0x2200001, 176, -1, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2052, -1, 33, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x1, 0x1, 176, 2054, -1, 37, 1, 4 }, - { 0x2200001, 0x2200001, 176, -1, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2056, -1, 33, 1, 4 }, - { 0x1, 0x1, 176, -1, -1, 37, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, -1, -1, 33, 1, 4 }, - { 0x2200001, 0x2200001, 176, -1, -1, 12, 1, 4 }, - { 0x2200001, 0x6200001, 176, 2943, -1, 12, 1, 4 }, - { 0x11, 0x11, 176, 2060, -1, 33, 1, 4 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x4200001, 0x4200001, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 37, 1, 4 }, - { 0x2000001, 0x2000001, 176, -1, -1, 12, 1, 4 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x200001, 0x200001, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x200001, 0x200001, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x200001, 0x200001, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 33, 1, 5 }, - { 0x200001, 0x200001, 176, -1, -1, 12, 1, 5 }, - { 0x0, 0x0, 176, -1, -1, 0, 1, 5 }, - { 0x1, 0x1, 176, -1, -1, 12, 1, 5 }, - { 0x9, 0x9, 176, -1, -1, 33, 1, 5 }, - { 0x1, 0x1, 176, 397, -1, 33, 1, 4 }, - { 0x1200001, 0x1200001, 176, -1, -1, 12, 1, 5 }, - { 0x200001, 0x200001, 176, 398, -1, 12, 1, 4 }, - { 0x9, 0x9, 176, -1, -1, 33, 1, 5 }, - { 0x1, 0x1, 176, 399, -1, 33, 1, 4 }, - { 0x1200001, 0x1200001, 176, -1, -1, 12, 1, 5 }, - { 0x200001, 0x200001, 176, 400, -1, 12, 1, 4 }, - { 0x9, 0x9, 176, -1, -1, 33, 1, 80 }, - { 0x1, 0x1, 176, 405, -1, 33, 1, 79 }, - { 0x1200001, 0x1200001, 176, -1, -1, 12, 1, 80 }, - { 0x200001, 0x200001, 176, 406, -1, 12, 1, 79 }, - { 0x9, 0x9, 176, -1, -1, 33, 1, 80 }, - { 0x1, 0x1, 176, 407, -1, 33, 1, 79 }, - { 0x1200001, 0x1200001, 176, -1, -1, 12, 1, 80 }, - { 0x200001, 0x200001, 176, 408, -1, 12, 1, 79 }, - { 0x9, 0x9, 176, -1, -1, 33, 1, 5 }, - { 0x1, 0x1, 176, 413, -1, 33, 1, 4 }, - { 0x1200001, 0x1200001, 176, -1, -1, 12, 1, 5 }, - { 0x200001, 0x200001, 176, 414, -1, 12, 1, 4 }, - { 0x9, 0x9, 176, -1, -1, 33, 1, 5 }, - { 0x1, 0x1, 176, 415, -1, 33, 1, 4 }, - { 0x1200001, 0x1200001, 176, -1, -1, 12, 1, 5 }, - { 0x200001, 0x200001, 176, 416, -1, 12, 1, 4 }, - { 0x0, 0x0, 177, -1, 2327, 0, 0, -1 }, - { 0x9, 0x9, 177, -1, 2335, 33, 1, 50 }, - { 0x9, 0x9, 177, -1, 2993, 33, 1, 50 }, - { 0x0, 0x0, 177, -1, 2380, 0, 0, -1 }, - { 0x7, 0x7, 177, -1, -1, 27, 1, 50 }, - { 0x1, 0x1, 197, -1, -1, 27, 1, 10 }, - { 0x1, 0x1, 211, -1, -1, 29, 1, 0 }, - { 0x1, 0x1, 211, -1, -1, 29, 1, 0 }, - { 0x2, 0x3, 211, 1169, -1, 27, 1, 34 }, - { 0x0, 0x0, 211, 1170, -1, 0, 1, 34 }, - { 0x0, 0x0, 211, 1171, -1, 0, 1, 0 }, - { 0x0, 0x0, 211, 1172, -1, 0, 1, 0 }, - { 0x0, 0x0, 211, 1173, -1, 0, 1, 0 }, - { 0x0, 0x0, 211, 1174, -1, 0, 1, 0 }, - { 0x0, 0x0, 211, 3026, -1, 0, 1, 100 }, - { 0x0, 0x0, 211, 3027, -1, 0, 1, 100 }, - { 0x0, 0x0, 211, 3028, 967, 0, 0, -1 }, - { 0x1, 0x1, 212, -1, -1, 27, 1, 0 }, - { 0x1, 0x1, 212, -1, -1, 27, 1, 0 }, - { 0x1, 0x1, 213, -1, 1426, 32, 1, 142 }, - { 0x1, 0x1, 213, -1, 1428, 32, 1, 142 }, - { 0x1, 0x1, 213, -1, 1430, 32, 1, 141 }, - { 0x1, 0x1, 213, -1, 1432, 32, 1, 141 }, - { 0x1, 0x1, 213, -1, 1434, 32, 1, 141 }, - { 0x1, 0x1, 213, -1, 1436, 32, 1, 141 }, - { 0x1, 0x1, 213, -1, 1438, 32, 1, 141 }, - { 0x1, 0x1, 213, -1, 1440, 32, 1, 141 }, - { 0x1, 0x1, 213, -1, 1442, 32, 1, 141 }, - { 0x1, 0x1, 213, -1, 1444, 32, 1, 141 }, - { 0x1, 0x1, 213, -1, 1446, 32, 1, 143 }, - { 0x1, 0x1, 213, -1, 1448, 32, 1, 143 }, - { 0x1, 0x1, 213, -1, 1965, 32, 1, 138 }, - { 0x1, 0x1, 213, -1, 1967, 32, 1, 145 }, - { 0x1, 0x1, 213, -1, 1969, 32, 1, 139 }, - { 0x1, 0x1, 213, -1, 1971, 32, 1, 139 }, - { 0x1, 0x1, 213, -1, 1973, 32, 1, 138 }, - { 0x1, 0x1, 213, -1, 1975, 32, 1, 145 }, - { 0x1, 0x1, 213, -1, 1977, 32, 1, 138 }, - { 0x1, 0x1, 213, -1, 1979, 32, 1, 145 }, - { 0x1, 0x1, 213, 2783, 1981, 32, 1, 138 }, - { 0x1, 0x1, 213, 2784, 1984, 32, 1, 145 }, - { 0x0, 0x0, 214, -1, 2825, 0, 0, -1 }, - { 0x0, 0x0, 214, -1, 2826, 0, 0, -1 }, - { 0x0, 0x0, 214, -1, 2851, 0, 0, -1 }, - { 0x5, 0x5, 214, -1, 2854, 20, 1, 68 }, - { 0x0, 0x0, 218, 2209, 966, 0, 0, -1 }, - { 0x0, 0x0, 219, -1, 1139, 0, 0, -1 }, - { 0x0, 0x0, 219, -1, 1264, 0, 0, -1 }, - { 0x0, 0x0, 219, -1, -1, 0, 1, 128 }, - { 0x0, 0x0, 219, -1, -1, 0, 1, 67 }, - { 0x1, 0x1, 219, 833, 2289, 36, 1, 66 }, - { 0x1, 0x1, 219, 834, 2348, 36, 1, 66 }, - { 0x0, 0x0, 219, 835, 2351, 0, 0, -1 }, - { 0x1, 0x1, 219, 836, -1, 36, 1, 66 }, - { 0x0, 0x0, 219, 1423, -1, 0, 1, 34 }, - { 0x1, 0x1, 219, 837, 2356, 36, 1, 66 }, - { 0x0, 0x0, 219, 838, 2359, 0, 0, -1 }, - { 0x1, 0x1, 219, 839, -1, 36, 1, 66 }, - { 0x0, 0x0, 219, 840, 2362, 0, 0, -1 }, - { 0x1, 0x1, 219, 841, -1, 36, 1, 66 }, - { 0x1, 0x1, 219, 842, 2365, 36, 1, 66 }, - { 0x1, 0x1, 219, 843, 2368, 36, 1, 66 }, - { 0x0, 0x0, 219, 1424, -1, 0, 1, 34 }, - { 0x1, 0x1, 219, 844, 2401, 36, 1, 66 }, - { 0x1, 0x1, 219, 845, -1, 31, 1, 144 }, - { 0x1, 0x1, 219, 228, 1449, 32, 1, 133 }, - { 0x1, 0x1, 219, 229, 1458, 32, 1, 133 }, - { 0x1, 0x1, 219, 230, 1467, 32, 1, 133 }, - { 0x1, 0x1, 219, 231, 1480, 32, 1, 133 }, - { 0x1, 0x1, 219, 232, 1489, 32, 1, 133 }, - { 0x1, 0x1, 219, 233, 1498, 32, 1, 133 }, - { 0x1, 0x1, 219, 234, 1507, 32, 1, 133 }, - { 0x1, 0x1, 219, 235, 1516, 32, 1, 133 }, - { 0x1, 0x1, 219, 236, 1525, 32, 1, 133 }, - { 0x1, 0x1, 219, 237, 1534, 32, 1, 133 }, - { 0x1, 0x1, 219, 238, 1544, 32, 1, 133 }, - { 0x1, 0x1, 219, 239, 1554, 32, 1, 133 }, - { 0x1, 0x1, 219, 240, 1567, 32, 1, 148 }, - { 0x1, 0x1, 219, 241, 1573, 32, 1, 153 }, - { 0x1, 0x1, 219, 242, 1579, 32, 1, 153 }, - { 0x1, 0x1, 219, 243, 1585, 32, 1, 148 }, - { 0x1, 0x1, 219, 244, 1591, 32, 1, 153 }, - { 0x1, 0x1, 219, 245, 1597, 32, 1, 153 }, - { 0x1, 0x1, 219, 246, 1603, 32, 1, 148 }, - { 0x1, 0x1, 219, 247, 1609, 32, 1, 153 }, - { 0x1, 0x1, 219, 248, 1615, 32, 1, 153 }, - { 0x1, 0x1, 219, 249, 1621, 32, 1, 148 }, - { 0x1, 0x1, 219, 250, 1627, 32, 1, 153 }, - { 0x1, 0x1, 219, 251, 1633, 32, 1, 148 }, - { 0x1, 0x1, 219, 252, 1639, 32, 1, 153 }, - { 0x1, 0x1, 219, 253, 1645, 32, 1, 148 }, - { 0x1, 0x1, 219, 254, 1651, 32, 1, 153 }, - { 0x1, 0x1, 219, 255, 1657, 32, 1, 148 }, - { 0x1, 0x1, 219, 256, 1663, 32, 1, 153 }, - { 0x1, 0x1, 219, 257, 1669, 32, 1, 153 }, - { 0x1, 0x1, 219, 849, -1, 31, 1, 160 }, - { 0x0, 0x0, 220, 2404, -1, 0, 1, 66 }, - { 0x0, 0x0, 220, 2405, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 25, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2407, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2408, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2409, -1, 0, 1, 45 }, - { 0x0, 0x0, 220, 2410, -1, 0, 1, 40 }, - { 0x1, 0x1, 220, 2411, -1, 12, 1, 59 }, - { 0x0, 0x0, 220, 2412, -1, 0, 1, 54 }, - { 0x1000001, 0x1000001, 220, 2413, -1, 12, 1, 59 }, - { 0x1, 0x1, 220, 2414, -1, 36, 1, 54 }, - { 0x200001, 0x200001, 220, 2415, -1, 12, 1, 59 }, - { 0x1, 0x1, 220, 2416, -1, 33, 1, 54 }, - { 0x1200001, 0x1200001, 220, 2417, -1, 12, 1, 49 }, - { 0x9, 0x9, 220, 2418, -1, 33, 1, 49 }, - { 0x0, 0x0, 220, 2419, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2420, -1, 0, 1, 54 }, - { 0x0, 0x0, 220, 2421, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2422, -1, 0, 1, 54 }, - { 0x0, 0x0, 220, 2423, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2424, -1, 0, 1, 54 }, - { 0x0, 0x0, 220, 2425, -1, 0, 1, 49 }, - { 0x0, 0x0, 220, 2426, -1, 0, 1, 49 }, - { 0x1, 0x1, 220, 2427, -1, 12, 1, 59 }, - { 0x0, 0x0, 220, 2428, -1, 0, 1, 54 }, - { 0x200001, 0x1200001, 220, 2429, -1, 12, 1, 59 }, - { 0x1, 0x9, 220, 2430, -1, 33, 1, 54 }, - { 0x0, 0x0, 220, 2431, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2432, -1, 0, 1, 54 }, - { 0x0, 0x0, 220, 2433, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2434, -1, 0, 1, 54 }, - { 0x1, 0x1, 220, 2435, -1, 12, 1, 59 }, - { 0x0, 0x0, 220, 2436, -1, 0, 1, 54 }, - { 0x1000001, 0x1000001, 220, 2437, -1, 12, 1, 59 }, - { 0x1, 0x1, 220, 2438, -1, 36, 1, 54 }, - { 0x200001, 0x200001, 220, 2439, -1, 12, 1, 59 }, - { 0x1, 0x1, 220, 2440, -1, 33, 1, 54 }, - { 0x1200001, 0x1200001, 220, 2441, -1, 12, 1, 49 }, - { 0x9, 0x9, 220, 2442, -1, 33, 1, 49 }, - { 0x0, 0x0, 220, 2443, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2444, -1, 0, 1, 54 }, - { 0x0, 0x0, 220, 2445, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2446, -1, 0, 1, 54 }, - { 0x0, 0x0, 220, 2447, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2448, -1, 0, 1, 54 }, - { 0x0, 0x0, 220, 2449, -1, 0, 1, 49 }, - { 0x0, 0x0, 220, 2450, -1, 0, 1, 49 }, - { 0x1, 0x1, 220, 2451, -1, 12, 1, 59 }, - { 0x0, 0x0, 220, 2452, -1, 0, 1, 54 }, - { 0x200001, 0x1200001, 220, 2453, -1, 12, 1, 59 }, - { 0x1, 0x9, 220, 2454, -1, 33, 1, 54 }, - { 0x0, 0x0, 220, 2455, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2456, -1, 0, 1, 54 }, - { 0x0, 0x0, 220, 2457, -1, 0, 1, 59 }, - { 0x0, 0x0, 220, 2458, -1, 0, 1, 54 }, - { 0x1, 0x1, 220, 2459, -1, 28, 1, 29 }, - { 0x0, 0x0, 220, 2460, -1, 0, 1, 29 }, - { 0x3, 0x3, 220, 2461, -1, 27, 1, 29 }, - { 0x1, 0x1, 220, 2462, -1, 27, 1, 29 }, - { 0x0, 0x0, 220, 2463, -1, 0, 1, 66 }, - { 0x0, 0x0, 220, 2464, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2465, -1, 0, 1, 29 }, - { 0x1, 0x1, 220, 2466, -1, 36, 1, 66 }, - { 0x1, 0x1, 220, 2467, -1, 37, 1, 29 }, - { 0x0, 0x0, 220, 2468, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2469, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2470, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2471, -1, 0, 1, 66 }, - { 0x0, 0x0, 220, 2472, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 37, -1, 0, 1, 29 }, - { 0x1, 0x1, 220, 2474, -1, 36, 1, 66 }, - { 0x1, 0x1, 220, 2475, -1, 37, 1, 29 }, - { 0x0, 0x0, 220, 2476, -1, 0, 1, 29 }, - { 0x1, 0x1, 220, 2477, -1, 36, 1, 66 }, - { 0x1, 0x1, 220, 2478, -1, 37, 1, 29 }, - { 0x0, 0x0, 220, 2479, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2480, -1, 0, 1, 66 }, - { 0x0, 0x0, 220, 2481, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 42, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2483, -1, 0, 1, 66 }, - { 0x0, 0x0, 220, 2484, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 43, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2486, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2487, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2488, -1, 0, 1, 49 }, - { 0x1, 0x1, 220, 2489, -1, 27, 1, 49 }, - { 0x1, 0x1, 220, 2490, -1, 28, 1, 49 }, - { 0x3, 0x3, 220, 2491, -1, 27, 1, 49 }, - { 0x1, 0x1, 220, 2492, -1, 29, 1, 49 }, - { 0x5, 0x5, 220, 2493, -1, 27, 1, 49 }, - { 0x3, 0x3, 220, 2494, -1, 28, 1, 49 }, - { 0x7, 0x7, 220, 2495, -1, 27, 1, 49 }, - { 0x0, 0x0, 220, 2496, -1, 0, 1, 49 }, - { 0x0, 0x0, 220, 2497, -1, 0, 1, 49 }, - { 0x0, 0x0, 220, 2498, -1, 0, 1, 49 }, - { 0x0, 0x0, 220, 2499, -1, 0, 1, 49 }, - { 0x1, 0x1, 220, 2500, -1, 28, 1, 29 }, - { 0x0, 0x0, 220, 2501, -1, 0, 1, 29 }, - { 0x3, 0x3, 220, 2502, -1, 27, 1, 29 }, - { 0x1, 0x1, 220, 2503, -1, 27, 1, 29 }, - { 0x0, 0x0, 220, 2504, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2505, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2506, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 52, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2508, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2509, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 57, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 2511, -1, 0, 1, 24 }, - { 0x0, 0x0, 220, 2512, -1, 0, 1, 24 }, - { 0x0, 0x0, 220, 2513, -1, 0, 1, 24 }, - { 0x0, 0x0, 220, 2514, -1, 0, 1, 24 }, - { 0x0, 0x0, 220, 2515, -1, 0, 1, 35 }, - { 0x0, 0x0, 220, 2516, -1, 0, 1, 66 }, - { 0x0, 0x0, 220, 2517, -1, 0, 1, 29 }, - { 0x0, 0x0, 220, 64, -1, 0, 1, 29 }, - { 0x1, 0x1, 221, 2519, -1, 34, 1, 66 }, - { 0x1, 0x1, 221, 2520, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2521, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2522, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2523, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2524, -1, 34, 1, 46 }, - { 0x1, 0x1, 221, 2525, -1, 34, 1, 42 }, - { 0x400001, 0x400001, 221, 2526, -1, 12, 1, 61 }, - { 0x1, 0x1, 221, 2527, -1, 34, 1, 56 }, - { 0x1400001, 0x1400001, 221, 2528, -1, 12, 1, 61 }, - { 0x5, 0x5, 221, 2529, -1, 34, 1, 56 }, - { 0x600001, 0x600001, 221, 2530, -1, 12, 1, 61 }, - { 0x3, 0x3, 221, 2531, -1, 33, 1, 56 }, - { 0x1600001, 0x1600001, 221, 2532, -1, 12, 1, 51 }, - { 0xb, 0xb, 221, 2533, -1, 33, 1, 51 }, - { 0x1, 0x1, 221, 2534, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2535, -1, 34, 1, 56 }, - { 0x1, 0x1, 221, 2536, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2537, -1, 34, 1, 56 }, - { 0x1, 0x1, 221, 2538, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2539, -1, 34, 1, 56 }, - { 0x1, 0x1, 221, 2540, -1, 34, 1, 51 }, - { 0x1, 0x1, 221, 2541, -1, 34, 1, 51 }, - { 0x400001, 0x400001, 221, 2542, -1, 12, 1, 61 }, - { 0x1, 0x1, 221, 2543, -1, 34, 1, 56 }, - { 0x600001, 0x1600001, 221, 2544, -1, 12, 1, 61 }, - { 0x3, 0xb, 221, 2545, -1, 33, 1, 56 }, - { 0x1, 0x1, 221, 2546, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2547, -1, 34, 1, 56 }, - { 0x1, 0x1, 221, 2548, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2549, -1, 34, 1, 56 }, - { 0x400001, 0x400001, 221, 2550, -1, 12, 1, 61 }, - { 0x1, 0x1, 221, 2551, -1, 34, 1, 56 }, - { 0x1400001, 0x1400001, 221, 2552, -1, 12, 1, 61 }, - { 0x5, 0x5, 221, 2553, -1, 34, 1, 56 }, - { 0x600001, 0x600001, 221, 2554, -1, 12, 1, 61 }, - { 0x3, 0x3, 221, 2555, -1, 33, 1, 56 }, - { 0x1600001, 0x1600001, 221, 2556, -1, 12, 1, 51 }, - { 0xb, 0xb, 221, 2557, -1, 33, 1, 51 }, - { 0x1, 0x1, 221, 2558, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2559, -1, 34, 1, 56 }, - { 0x1, 0x1, 221, 2560, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2561, -1, 34, 1, 56 }, - { 0x1, 0x1, 221, 2562, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2563, -1, 34, 1, 56 }, - { 0x1, 0x1, 221, 2564, -1, 34, 1, 51 }, - { 0x1, 0x1, 221, 2565, -1, 34, 1, 51 }, - { 0x400001, 0x400001, 221, 2566, -1, 12, 1, 61 }, - { 0x1, 0x1, 221, 2567, -1, 34, 1, 56 }, - { 0x600001, 0x1600001, 221, 2568, -1, 12, 1, 61 }, - { 0x3, 0xb, 221, 2569, -1, 33, 1, 56 }, - { 0x1, 0x1, 221, 2570, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2571, -1, 34, 1, 56 }, - { 0x1, 0x1, 221, 2572, -1, 34, 1, 61 }, - { 0x1, 0x1, 221, 2573, -1, 34, 1, 56 }, - { 0x41, 0x41, 221, 2574, -1, 28, 1, 31 }, - { 0x1, 0x1, 221, 2575, -1, 34, 1, 31 }, - { 0x83, 0x83, 221, 2576, -1, 27, 1, 31 }, - { 0x81, 0x81, 221, 2577, -1, 27, 1, 31 }, - { 0x1, 0x1, 221, 2578, -1, 34, 1, 66 }, - { 0x1, 0x1, 221, 2579, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2580, -1, 34, 1, 31 }, - { 0x5, 0x5, 221, 2581, -1, 34, 1, 66 }, - { 0x9, 0x9, 221, 2582, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2583, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2584, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2585, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2586, -1, 34, 1, 66 }, - { 0x1, 0x1, 221, 2587, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2588, -1, 34, 1, 31 }, - { 0x5, 0x5, 221, 2589, -1, 34, 1, 66 }, - { 0x9, 0x9, 221, 2590, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2591, -1, 34, 1, 31 }, - { 0x5, 0x5, 221, 2592, -1, 34, 1, 66 }, - { 0x9, 0x9, 221, 2593, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2594, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2595, -1, 34, 1, 66 }, - { 0x1, 0x1, 221, 2596, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2597, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2598, -1, 34, 1, 66 }, - { 0x1, 0x1, 221, 2599, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2600, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2601, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2602, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2603, -1, 34, 1, 51 }, - { 0x81, 0x81, 221, 2604, -1, 27, 1, 51 }, - { 0x41, 0x41, 221, 2605, -1, 28, 1, 51 }, - { 0x83, 0x83, 221, 2606, -1, 27, 1, 51 }, - { 0x21, 0x21, 221, 2607, -1, 29, 1, 51 }, - { 0x85, 0x85, 221, 2608, -1, 27, 1, 51 }, - { 0x43, 0x43, 221, 2609, -1, 28, 1, 51 }, - { 0x87, 0x87, 221, 2610, -1, 27, 1, 51 }, - { 0x1, 0x1, 221, 2611, -1, 34, 1, 51 }, - { 0x1, 0x1, 221, 2612, -1, 34, 1, 51 }, - { 0x1, 0x1, 221, 2613, -1, 34, 1, 51 }, - { 0x1, 0x1, 221, 2614, -1, 34, 1, 51 }, - { 0x41, 0x41, 221, 2615, -1, 28, 1, 31 }, - { 0x1, 0x1, 221, 2616, -1, 34, 1, 31 }, - { 0x83, 0x83, 221, 2617, -1, 27, 1, 31 }, - { 0x81, 0x81, 221, 2618, -1, 27, 1, 31 }, - { 0x1, 0x1, 221, 2619, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2620, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2621, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2622, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2623, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2624, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2625, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2626, -1, 34, 1, 26 }, - { 0x1, 0x1, 221, 2627, -1, 34, 1, 26 }, - { 0x1, 0x1, 221, 2628, -1, 34, 1, 26 }, - { 0x1, 0x1, 221, 2629, -1, 34, 1, 26 }, - { 0x1, 0x1, 221, 2630, -1, 34, 1, 37 }, - { 0x1, 0x1, 221, 2631, -1, 34, 1, 66 }, - { 0x1, 0x1, 221, 2632, -1, 34, 1, 31 }, - { 0x1, 0x1, 221, 2633, -1, 34, 1, 31 }, - { 0x1, 0x1, 222, 2634, -1, 35, 1, 66 }, - { 0x1, 0x1, 222, 2635, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2636, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2637, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2638, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2639, -1, 35, 1, 47 }, - { 0x1, 0x1, 222, 2640, -1, 35, 1, 43 }, - { 0x800001, 0x800001, 222, 2641, -1, 12, 1, 62 }, - { 0x1, 0x1, 222, 2642, -1, 35, 1, 57 }, - { 0x1800001, 0x1800001, 222, 2643, -1, 12, 1, 62 }, - { 0x3, 0x3, 222, 2644, -1, 35, 1, 57 }, - { 0xa00001, 0xa00001, 222, 2645, -1, 12, 1, 62 }, - { 0x5, 0x5, 222, 2646, -1, 33, 1, 57 }, - { 0x1a00001, 0x1a00001, 222, 2647, -1, 12, 1, 52 }, - { 0xd, 0xd, 222, 2648, -1, 33, 1, 52 }, - { 0x1, 0x1, 222, 2649, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2650, -1, 35, 1, 57 }, - { 0x1, 0x1, 222, 2651, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2652, -1, 35, 1, 57 }, - { 0x1, 0x1, 222, 2653, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2654, -1, 35, 1, 57 }, - { 0x1, 0x1, 222, 2655, -1, 35, 1, 52 }, - { 0x1, 0x1, 222, 2656, -1, 35, 1, 52 }, - { 0x800001, 0x800001, 222, 2657, -1, 12, 1, 62 }, - { 0x1, 0x1, 222, 2658, -1, 35, 1, 57 }, - { 0xa00001, 0x1a00001, 222, 2659, -1, 12, 1, 62 }, - { 0x5, 0xd, 222, 2660, -1, 33, 1, 57 }, - { 0x1, 0x1, 222, 2661, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2662, -1, 35, 1, 57 }, - { 0x1, 0x1, 222, 2663, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2664, -1, 35, 1, 57 }, - { 0x800001, 0x800001, 222, 2665, -1, 12, 1, 62 }, - { 0x1, 0x1, 222, 2666, -1, 35, 1, 57 }, - { 0x1800001, 0x1800001, 222, 2667, -1, 12, 1, 62 }, - { 0x3, 0x3, 222, 2668, -1, 35, 1, 57 }, - { 0xa00001, 0xa00001, 222, 2669, -1, 12, 1, 62 }, - { 0x5, 0x5, 222, 2670, -1, 33, 1, 57 }, - { 0x1a00001, 0x1a00001, 222, 2671, -1, 12, 1, 52 }, - { 0xd, 0xd, 222, 2672, -1, 33, 1, 52 }, - { 0x1, 0x1, 222, 2673, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2674, -1, 35, 1, 57 }, - { 0x1, 0x1, 222, 2675, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2676, -1, 35, 1, 57 }, - { 0x1, 0x1, 222, 2677, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2678, -1, 35, 1, 57 }, - { 0x1, 0x1, 222, 2679, -1, 35, 1, 52 }, - { 0x1, 0x1, 222, 2680, -1, 35, 1, 52 }, - { 0x800001, 0x800001, 222, 2681, -1, 12, 1, 62 }, - { 0x1, 0x1, 222, 2682, -1, 35, 1, 57 }, - { 0xa00001, 0x1a00001, 222, 2683, -1, 12, 1, 62 }, - { 0x5, 0xd, 222, 2684, -1, 33, 1, 57 }, - { 0x1, 0x1, 222, 2685, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2686, -1, 35, 1, 57 }, - { 0x1, 0x1, 222, 2687, -1, 35, 1, 62 }, - { 0x1, 0x1, 222, 2688, -1, 35, 1, 57 }, - { 0x81, 0x81, 222, 2689, -1, 28, 1, 32 }, - { 0x1, 0x1, 222, 2690, -1, 35, 1, 32 }, - { 0x103, 0x103, 222, 2691, -1, 27, 1, 32 }, - { 0x101, 0x101, 222, 2692, -1, 27, 1, 32 }, - { 0x1, 0x1, 222, 2693, -1, 35, 1, 66 }, - { 0x1, 0x1, 222, 2694, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2695, -1, 35, 1, 32 }, - { 0x3, 0x3, 222, 2696, -1, 35, 1, 66 }, - { 0x5, 0x5, 222, 2697, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2698, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2699, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2700, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2701, -1, 35, 1, 66 }, - { 0x1, 0x1, 222, 2702, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2703, -1, 35, 1, 32 }, - { 0x3, 0x3, 222, 2704, -1, 35, 1, 66 }, - { 0x5, 0x5, 222, 2705, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2706, -1, 35, 1, 32 }, - { 0x3, 0x3, 222, 2707, -1, 35, 1, 66 }, - { 0x5, 0x5, 222, 2708, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2709, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2710, -1, 35, 1, 66 }, - { 0x1, 0x1, 222, 2711, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2712, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2713, -1, 35, 1, 66 }, - { 0x1, 0x1, 222, 2714, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2715, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2716, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2717, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2718, -1, 35, 1, 52 }, - { 0x101, 0x101, 222, 2719, -1, 27, 1, 52 }, - { 0x81, 0x81, 222, 2720, -1, 28, 1, 52 }, - { 0x103, 0x103, 222, 2721, -1, 27, 1, 52 }, - { 0x41, 0x41, 222, 2722, -1, 29, 1, 52 }, - { 0x105, 0x105, 222, 2723, -1, 27, 1, 52 }, - { 0x83, 0x83, 222, 2724, -1, 28, 1, 52 }, - { 0x107, 0x107, 222, 2725, -1, 27, 1, 52 }, - { 0x1, 0x1, 222, 2726, -1, 35, 1, 52 }, - { 0x1, 0x1, 222, 2727, -1, 35, 1, 52 }, - { 0x1, 0x1, 222, 2728, -1, 35, 1, 52 }, - { 0x1, 0x1, 222, 2729, -1, 35, 1, 52 }, - { 0x81, 0x81, 222, 2730, -1, 28, 1, 32 }, - { 0x1, 0x1, 222, 2731, -1, 35, 1, 32 }, - { 0x103, 0x103, 222, 2732, -1, 27, 1, 32 }, - { 0x101, 0x101, 222, 2733, -1, 27, 1, 32 }, - { 0x1, 0x1, 222, 2734, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2735, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2736, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2737, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2738, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2739, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2740, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2741, -1, 35, 1, 27 }, - { 0x1, 0x1, 222, 2742, -1, 35, 1, 27 }, - { 0x1, 0x1, 222, 2743, -1, 35, 1, 27 }, - { 0x1, 0x1, 222, 2744, -1, 35, 1, 27 }, - { 0x1, 0x1, 222, 2745, -1, 35, 1, 38 }, - { 0x1, 0x1, 222, 2746, -1, 35, 1, 66 }, - { 0x1, 0x1, 222, 2747, -1, 35, 1, 32 }, - { 0x1, 0x1, 222, 2748, -1, 35, 1, 32 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 66 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, 2243, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 48 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 44 }, - { 0xc00001, 0xc00001, 223, -1, -1, 12, 1, 63 }, - { 0x3, 0x3, 223, 2964, -1, 34, 1, 58 }, - { 0x1c00001, 0x1c00001, 223, -1, -1, 12, 1, 63 }, - { 0x7, 0x7, 223, 2965, -1, 34, 1, 58 }, - { 0xe00001, 0xe00001, 223, -1, -1, 12, 1, 63 }, - { 0x7, 0x7, 223, 2966, -1, 33, 1, 58 }, - { 0x1e00001, 0x1e00001, 223, -1, -1, 12, 1, 53 }, - { 0xf, 0xf, 223, 2967, -1, 33, 1, 53 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2968, -1, 34, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2969, -1, 34, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2970, -1, 34, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 53 }, - { 0x3, 0x3, 223, 2971, -1, 34, 1, 53 }, - { 0xc00001, 0xc00001, 223, -1, -1, 12, 1, 63 }, - { 0x3, 0x3, 223, 2976, -1, 34, 1, 58 }, - { 0xe00001, 0x1e00001, 223, -1, -1, 12, 1, 63 }, - { 0x7, 0xf, 223, 2977, -1, 33, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2978, -1, 34, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2979, -1, 34, 1, 58 }, - { 0xc00001, 0xc00001, 223, -1, -1, 12, 1, 63 }, - { 0x3, 0x3, 223, 2982, -1, 34, 1, 58 }, - { 0x1c00001, 0x1c00001, 223, -1, -1, 12, 1, 63 }, - { 0x7, 0x7, 223, 2983, -1, 34, 1, 58 }, - { 0xe00001, 0xe00001, 223, -1, -1, 12, 1, 63 }, - { 0x7, 0x7, 223, 2984, -1, 33, 1, 58 }, - { 0x1e00001, 0x1e00001, 223, -1, -1, 12, 1, 53 }, - { 0xf, 0xf, 223, 2985, -1, 33, 1, 53 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2986, -1, 34, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2987, -1, 34, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2988, -1, 34, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 53 }, - { 0x3, 0x3, 223, 2989, -1, 34, 1, 53 }, - { 0xc00001, 0xc00001, 223, -1, -1, 12, 1, 63 }, - { 0x3, 0x3, 223, 2994, -1, 34, 1, 58 }, - { 0xe00001, 0x1e00001, 223, -1, -1, 12, 1, 63 }, - { 0x7, 0xf, 223, 2995, -1, 33, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2996, -1, 34, 1, 58 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 63 }, - { 0x3, 0x3, 223, 2997, -1, 34, 1, 58 }, - { 0xc1, 0xc1, 223, -1, -1, 28, 1, 33 }, - { 0x3, 0x3, 223, 2862, -1, 34, 1, 33 }, - { 0x183, 0x183, 223, -1, -1, 27, 1, 33 }, - { 0x181, 0x181, 223, 2863, -1, 27, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 66 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, 2244, -1, 34, 1, 33 }, - { 0x7, 0x7, 223, -1, -1, 34, 1, 66 }, - { 0xb, 0xb, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, 2245, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 66 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, 2248, -1, 34, 1, 33 }, - { 0x7, 0x7, 223, -1, -1, 34, 1, 66 }, - { 0xb, 0xb, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, 2249, -1, 34, 1, 33 }, - { 0x7, 0x7, 223, -1, -1, 34, 1, 66 }, - { 0xb, 0xb, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, 2251, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 66 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, 2253, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 66 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, 2254, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 53 }, - { 0x181, 0x181, 223, -1, -1, 27, 1, 53 }, - { 0xc1, 0xc1, 223, -1, -1, 28, 1, 53 }, - { 0x183, 0x183, 223, -1, -1, 27, 1, 53 }, - { 0x61, 0x61, 223, -1, -1, 29, 1, 53 }, - { 0x185, 0x185, 223, -1, -1, 27, 1, 53 }, - { 0xc3, 0xc3, 223, -1, -1, 28, 1, 53 }, - { 0x187, 0x187, 223, -1, -1, 27, 1, 53 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 53 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 53 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 53 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 53 }, - { 0xc1, 0xc1, 223, -1, -1, 28, 1, 33 }, - { 0x3, 0x3, 223, 2866, -1, 34, 1, 33 }, - { 0x183, 0x183, 223, -1, -1, 27, 1, 33 }, - { 0x181, 0x181, 223, 2867, -1, 27, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 28 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 28 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 28 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 28 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 39 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 66 }, - { 0x3, 0x3, 223, -1, -1, 34, 1, 33 }, - { 0x3, 0x3, 223, 2256, -1, 34, 1, 33 }, - { 0x3, 0x3, 224, 540, 1451, 32, 1, 135 }, - { 0x3, 0x3, 224, 541, 1460, 32, 1, 135 }, - { 0x3, 0x3, 224, 542, 1469, 32, 1, 135 }, - { 0x3, 0x3, 224, 543, 1482, 32, 1, 135 }, - { 0x3, 0x3, 224, 544, 1491, 32, 1, 135 }, - { 0x3, 0x3, 224, 545, 1500, 32, 1, 135 }, - { 0x3, 0x3, 224, 546, 1509, 32, 1, 135 }, - { 0x3, 0x3, 224, 547, 1518, 32, 1, 135 }, - { 0x3, 0x3, 224, 548, 1527, 32, 1, 135 }, - { 0x3, 0x3, 224, 549, 1536, 32, 1, 135 }, - { 0x3, 0x3, 224, 550, 1546, 32, 1, 135 }, - { 0x3, 0x3, 224, 551, 1556, 32, 1, 135 }, - { 0x3, 0x3, 224, 564, 1569, 32, 1, 150 }, - { 0x3, 0x3, 224, 565, 1575, 32, 1, 155 }, - { 0x3, 0x3, 224, 566, 1581, 32, 1, 155 }, - { 0x3, 0x3, 224, 567, 1587, 32, 1, 150 }, - { 0x3, 0x3, 224, 568, 1593, 32, 1, 155 }, - { 0x3, 0x3, 224, 569, 1599, 32, 1, 155 }, - { 0x3, 0x3, 224, 570, 1605, 32, 1, 150 }, - { 0x3, 0x3, 224, 571, 1611, 32, 1, 155 }, - { 0x3, 0x3, 224, 572, 1617, 32, 1, 155 }, - { 0x3, 0x3, 224, 573, 1623, 32, 1, 150 }, - { 0x3, 0x3, 224, 574, 1629, 32, 1, 155 }, - { 0x3, 0x3, 224, 575, 1635, 32, 1, 150 }, - { 0x3, 0x3, 224, 576, 1641, 32, 1, 155 }, - { 0x3, 0x3, 224, 577, 1647, 32, 1, 150 }, - { 0x3, 0x3, 224, 578, 1653, 32, 1, 155 }, - { 0x3, 0x3, 224, 579, 1659, 32, 1, 150 }, - { 0x3, 0x3, 224, 580, 1665, 32, 1, 155 }, - { 0x3, 0x3, 224, 581, 1671, 32, 1, 155 }, - { 0x1, 0x1, 225, -1, -1, 28, 1, 34 }, - { 0x1, 0x1, 225, -1, -1, 28, 1, 34 }, - { 0x0, 0x0, 232, 958, -1, 0, 1, 144 }, - { 0x0, 0x0, 232, 959, -1, 0, 1, 160 }, - { 0x1, 0x1, 233, -1, 1982, 33, 1, 140 }, - { 0x1, 0x1, 233, -1, 1985, 33, 1, 146 }, - { 0x0, 0x0, 233, -1, 1987, 0, 1, 157 }, - { 0x0, 0x0, 233, -1, 1988, 0, 1, 161 }, - { 0x0, 0x0, 234, 883, 971, 0, 0, -1 }, - { 0x0, 0x0, 234, 884, 979, 0, 0, -1 }, - { 0x0, 0x0, 234, 885, 975, 0, 0, -1 }, - { 0x1, 0x1, 234, 886, 620, 33, 1, 6 }, - { 0x8000001, 0x8000001, 234, 887, 628, 6, 1, 7 }, - { 0x1, 0x1, 234, 888, 624, 33, 1, 6 }, - { 0x0, 0x0, 234, 889, 983, 0, 0, -1 }, - { 0x1, 0x1, 234, 890, 640, 33, 1, 8 }, - { 0x0, 0x0, 234, 891, 987, 0, 0, -1 }, - { 0x1, 0x1, 234, 892, 652, 33, 1, 16 }, - { 0x0, 0x0, 234, 893, 992, 0, 0, -1 }, - { 0x0, 0x0, 234, 894, 996, 0, 0, -1 }, - { 0x1, 0x1, 234, 895, 675, 33, 1, 18 }, - { 0x1, 0x1, 234, 896, 679, 33, 1, 18 }, - { 0x0, 0x0, 234, 897, 1000, 0, 0, -1 }, - { 0x0, 0x0, 234, 898, 1004, 0, 0, -1 }, - { 0x1, 0x1, 234, 899, 699, 33, 1, 19 }, - { 0x8000001, 0x8000001, 234, 900, 703, 6, 1, 19 }, - { 0x0, 0x0, 234, 901, 1008, 0, 0, -1 }, - { 0x1, 0x1, 234, 902, 715, 33, 1, 20 }, - { 0x0, 0x0, 234, 903, 1012, 0, 0, -1 }, - { 0x0, 0x0, 234, 904, 1016, 0, 0, -1 }, - { 0x1, 0x1, 234, 905, 735, 33, 1, 21 }, - { 0x8000001, 0x8000001, 234, 906, 739, 6, 1, 21 }, - { 0x0, 0x0, 234, 907, 1020, 0, 0, -1 }, - { 0x1, 0x1, 234, 908, 751, 33, 1, 22 }, - { 0x0, 0x0, 234, 909, 1025, 0, 0, -1 }, - { 0x0, 0x0, 234, 910, 1029, 0, 0, -1 }, - { 0x1, 0x1, 234, 911, 774, 33, 1, 18 }, - { 0x1, 0x1, 234, 912, 778, 33, 1, 18 }, - { 0x0, 0x0, 234, 913, 1033, 0, 0, -1 }, - { 0x1, 0x1, 234, 914, 790, 33, 1, 22 }, - { 0x0, 0x0, 235, 2787, 970, 0, 0, -1 }, - { 0x0, 0x0, 235, 2788, 978, 0, 0, -1 }, - { 0x0, 0x0, 235, 2789, 974, 0, 0, -1 }, - { 0x0, 0x0, 235, 2790, 619, 0, 1, 6 }, - { 0x1, 0x1, 235, 2791, 627, 6, 1, 7 }, - { 0x0, 0x0, 235, 2792, 623, 0, 1, 6 }, - { 0x0, 0x0, 235, 2793, 982, 0, 0, -1 }, - { 0x0, 0x0, 235, 2794, 639, 0, 1, 8 }, - { 0x0, 0x0, 235, 2795, 986, 0, 0, -1 }, - { 0x0, 0x0, 235, 2796, 651, 0, 1, 16 }, - { 0x0, 0x0, 235, 2797, 991, 0, 0, -1 }, - { 0x0, 0x0, 235, 2798, 995, 0, 0, -1 }, - { 0x0, 0x0, 235, 2799, 674, 0, 1, 18 }, - { 0x0, 0x0, 235, 2800, 678, 0, 1, 18 }, - { 0x0, 0x0, 235, 2801, 999, 0, 0, -1 }, - { 0x0, 0x0, 235, 2802, 1003, 0, 0, -1 }, - { 0x0, 0x0, 235, 2803, 698, 0, 1, 19 }, - { 0x1, 0x1, 235, 2804, 702, 6, 1, 19 }, - { 0x0, 0x0, 235, 2805, 1007, 0, 0, -1 }, - { 0x0, 0x0, 235, 2806, 714, 0, 1, 20 }, - { 0x0, 0x0, 235, 2807, 1011, 0, 0, -1 }, - { 0x0, 0x0, 235, 2808, 1015, 0, 0, -1 }, - { 0x0, 0x0, 235, 2809, 734, 0, 1, 21 }, - { 0x1, 0x1, 235, 2810, 738, 6, 1, 21 }, - { 0x0, 0x0, 235, 2811, 1019, 0, 0, -1 }, - { 0x0, 0x0, 235, 2812, 750, 0, 1, 22 }, - { 0x0, 0x0, 235, 2813, 1024, 0, 0, -1 }, - { 0x0, 0x0, 235, 2814, 1028, 0, 0, -1 }, - { 0x0, 0x0, 235, 2815, 773, 0, 1, 18 }, - { 0x0, 0x0, 235, 2816, 777, 0, 1, 18 }, - { 0x0, 0x0, 235, 2817, 1032, 0, 0, -1 }, - { 0x0, 0x0, 235, 2818, 789, 0, 1, 22 }, - { 0x1, 0x1, 235, 915, 1155, 27, 1, 17 }, - { 0x0, 0x0, 235, 916, 1153, 0, 1, 17 }, - { 0x0, 0x0, 235, 1220, 1157, 0, 1, 23 }, - { 0x0, 0x1, 235, 1165, 1163, 20, 1, 68 }, - { 0x0, 0x0, 235, 111, 1161, 0, 1, 68 }, - { 0x1, 0x1, 238, -1, -1, 29, 1, 0 }, - { 0x0, 0x0, 238, -1, -1, 0, 1, 0 }, - { 0x1, 0x1, 238, 3022, -1, 27, 1, 0 }, - { 0x1, 0x1, 238, 3023, -1, 27, 1, 0 }, - { 0x1, 0x1, 238, 3024, -1, 27, 1, 0 }, - { 0x1, 0x1, 238, 3025, -1, 27, 1, 0 }, - { 0x0, 0x0, 261, -1, 2344, 0, 0, -1 }, - { 0x0, 0x0, 261, -1, 2346, 0, 0, -1 }, - { 0x1, 0x1, 261, -1, -1, 28, 1, 30 }, - { 0x1, 0x1, 261, -1, -1, 28, 1, 30 }, - { 0x0, 0x0, 261, -1, 2385, 0, 0, -1 }, - { 0x0, 0x0, 261, -1, 2387, 0, 0, -1 }, - { 0x1, 0x1, 261, -1, -1, 28, 1, 30 }, - { 0x1, 0x1, 261, -1, -1, 28, 1, 30 }, - { 0x0, 0x0, 263, 23, -1, 0, 1, 0 }, - { 0x0, 0x0, 263, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 263, -1, -1, 0, 1, 0 }, - { 0x0, 0x1, 263, -1, -1, 29, 1, 0 }, - { 0x0, 0x1, 263, -1, -1, 29, 1, 0 }, - { 0x0, 0x1, 263, -1, -1, 29, 1, 0 }, - { 0x0, 0x1, 263, -1, -1, 29, 1, 0 }, - { 0x0, 0x1, 263, -1, -1, 29, 1, 0 }, - { 0x0, 0x0, 263, 180, -1, 0, 1, 0 }, - { 0x0, 0x1, 263, -1, -1, 29, 1, 0 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 301, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 323, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 349, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 371, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 65 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 65 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 65 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 65 }, - { 0x0, 0x0, 264, -1, 2296, 0, 0, -1 }, - { 0x0, 0x0, 264, -1, 2298, 0, 0, -1 }, - { 0x0, 0x0, 264, -1, 2300, 0, 0, -1 }, - { 0x0, 0x0, 264, -1, 2302, 0, 0, -1 }, - { 0x1, 0x1, 264, -1, 2304, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, 2306, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, 2308, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, 2310, 12, 1, 50 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 50 }, - { 0x0, 0x0, 264, -1, 2312, 0, 0, -1 }, - { 0x0, 0x0, 264, -1, 2314, 0, 0, -1 }, - { 0x1, 0x1, 264, -1, 2316, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, 2318, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x0, 0x0, 264, -1, 2320, 0, 0, -1 }, - { 0x0, 0x0, 264, -1, 2322, 0, 0, -1 }, - { 0x0, 0x0, 264, -1, 2324, 0, 0, -1 }, - { 0x0, 0x0, 264, -1, 2326, 0, 0, -1 }, - { 0x1, 0x1, 264, -1, 2328, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, 2330, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, 2332, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, 2334, 12, 1, 50 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 50 }, - { 0x0, 0x0, 264, -1, 2336, 0, 0, -1 }, - { 0x0, 0x0, 264, -1, 2338, 0, 0, -1 }, - { 0x1, 0x1, 264, -1, 2340, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, 2342, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x1, 0x1, 264, -1, -1, 12, 1, 60 }, - { 0x1, 0x1, 264, 393, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 395, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 517, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 519, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 401, -1, 12, 1, 77 }, - { 0x1, 0x1, 264, 403, -1, 12, 1, 77 }, - { 0x1, 0x1, 264, 525, -1, 12, 1, 77 }, - { 0x1, 0x1, 264, 527, -1, 12, 1, 77 }, - { 0x1, 0x1, 264, 409, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 411, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 533, -1, 12, 1, 2 }, - { 0x1, 0x1, 264, 535, -1, 12, 1, 2 }, - { 0x0, 0x0, 265, -1, 2303, 0, 0, -1 }, - { 0x9, 0x9, 265, -1, 2311, 33, 1, 50 }, - { 0x9, 0x9, 265, -1, 2975, 33, 1, 50 }, - { 0x0, 0x0, 265, 1399, 2376, 0, 0, -1 }, - { 0x3, 0x3, 265, 1400, -1, 27, 1, 50 }, - { 0x0, 0x0, 269, 2856, -1, 0, 1, 0 }, - { 0x3, 0x3, 270, -1, -1, 27, 1, 0 }, - { 0x3, 0x3, 270, -1, -1, 27, 1, 0 }, - { 0x3, 0x3, 270, -1, -1, 27, 1, 0 }, - { 0x3, 0x3, 270, -1, -1, 27, 1, 0 }, - { 0x1, 0x1, 271, 3018, -1, 28, 1, 0 }, - { 0x1, 0x1, 271, 3019, -1, 28, 1, 0 }, - { 0x1, 0x1, 271, 3020, -1, 28, 1, 0 }, - { 0x1, 0x1, 271, 3021, -1, 28, 1, 0 }, - { 0x1, 0x1, 273, -1, -1, 27, 1, 100 }, - { 0x1, 0x1, 273, -1, -1, 27, 1, 100 }, - { 0x0, 0x0, 273, -1, 968, 0, 0, -1 }, - { 0x0, 0x0, 274, 3031, 2833, 0, 0, -1 }, - { 0x0, 0x0, 274, 3032, 2835, 0, 0, -1 }, - { 0x0, 0x0, 275, -1, 2834, 0, 0, -1 }, - { 0x0, 0x0, 275, -1, 2836, 0, 0, -1 }, - { 0x0, 0x0, 276, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 276, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 276, -1, -1, 0, 1, 41 }, - { 0x0, 0x0, 281, -1, -1, 0, 1, 34 }, - { 0x0, 0x0, 285, -1, 2350, 0, 1, 30 }, - { 0x0, 0x0, 286, -1, -1, 0, 1, 0 }, - { 0x0, 0x0, 286, -1, -1, 0, 1, 72 }, - { 0x0, 0x0, 286, 2001, 3000, 0, 1, 1 }, - { 0x0, 0x0, 286, 2002, 3001, 0, 1, 1 }, - { 0x0, 0x0, 286, -1, 518, 0, 0, -1 }, - { 0x0, 0x0, 286, -1, 520, 0, 0, -1 }, - { 0x0, 0x0, 286, 2005, 3004, 0, 1, 76 }, - { 0x0, 0x0, 286, 2006, 3005, 0, 1, 76 }, - { 0x0, 0x0, 286, -1, 526, 0, 0, -1 }, - { 0x0, 0x0, 286, -1, 528, 0, 0, -1 }, - { 0x0, 0x0, 286, 2009, 3008, 0, 1, 1 }, - { 0x0, 0x0, 286, 2010, 3009, 0, 1, 1 }, - { 0x0, 0x0, 286, -1, 534, 0, 0, -1 }, - { 0x0, 0x0, 286, -1, 536, 0, 0, -1 }, -}; - -static const struct ia64_main_table -main_table[] = { - { 5, 1, 1, 0x0000010000000000ull, 0x000001eff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 0, }, - { 5, 1, 1, 0x0000010008000000ull, 0x000001eff8000000ull, { 24, 25, 26, 4, 0 }, 0x0, 1, }, - { 5, 7, 1, 0x0000000000000000ull, 0x0000000000000000ull, { 24, 67, 27, 0, 0 }, 0x0, 2, }, - { 5, 7, 1, 0x0000000000000000ull, 0x0000000000000000ull, { 24, 64, 26, 0, 0 }, 0x0, 3, }, - { 6, 1, 1, 0x0000012000000000ull, 0x000001e000000000ull, { 24, 67, 27, 0, 0 }, 0x0, 4, }, - { 7, 1, 1, 0x0000010040000000ull, 0x000001eff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 5, }, - { 7, 1, 1, 0x0000010c00000000ull, 0x000001ee00000000ull, { 24, 64, 26, 0, 0 }, 0x0, 6, }, - { 8, 1, 1, 0x0000010800000000ull, 0x000001ee00000000ull, { 24, 64, 26, 0, 0 }, 0x0, 7, }, - { 9, 3, 1, 0x0000002c00000000ull, 0x000001ee00000000ull, { 24, 3, 53, 54, 55 }, 0x221, 8, }, - { 9, 3, 1, 0x0000002c00000000ull, 0x000001ee00000000ull, { 24, 53, 54, 55, 0 }, 0x261, 9, }, - { 10, 1, 1, 0x0000010060000000ull, 0x000001eff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 10, }, - { 10, 1, 1, 0x0000010160000000ull, 0x000001eff8000000ull, { 24, 56, 26, 0, 0 }, 0x0, 11, }, - { 11, 1, 1, 0x0000010068000000ull, 0x000001eff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 12, }, - { 11, 1, 1, 0x0000010168000000ull, 0x000001eff8000000ull, { 24, 56, 26, 0, 0 }, 0x0, 13, }, - { 14, 4, 0, 0x0000000100000000ull, 0x000001eff80011ffull, { 16, 0, 0, 0, 0 }, 0x40, 969, }, - { 14, 4, 0, 0x0000000100000000ull, 0x000001eff80011c0ull, { 16, 0, 0, 0, 0 }, 0x0, 825, }, - { 14, 4, 0, 0x0000000100000000ull, 0x000001eff80011c0ull, { 16, 0, 0, 0, 0 }, 0x40, 826, }, - { 14, 4, 0, 0x0000000108000100ull, 0x000001eff80011c0ull, { 16, 0, 0, 0, 0 }, 0x200, 2234, }, - { 14, 4, 0, 0x0000000108000100ull, 0x000001eff80011c0ull, { 16, 0, 0, 0, 0 }, 0x240, 2235, }, - { 14, 4, 1, 0x0000002100000000ull, 0x000001ef00001000ull, { 15, 16, 0, 0, 0 }, 0x0, 582, }, - { 14, 4, 1, 0x0000002100000000ull, 0x000001ef00001000ull, { 15, 16, 0, 0, 0 }, 0x40, 583, }, - { 14, 4, 0, 0x0000008000000000ull, 0x000001ee000011ffull, { 82, 0, 0, 0, 0 }, 0x40, 990, }, - { 14, 4, 0, 0x0000008000000000ull, 0x000001ee000011c0ull, { 82, 0, 0, 0, 0 }, 0x0, 827, }, - { 14, 4, 0, 0x0000008000000000ull, 0x000001ee000011c0ull, { 82, 0, 0, 0, 0 }, 0x40, 828, }, - { 14, 4, 0, 0x0000008000000080ull, 0x000001ee000011c0ull, { 82, 0, 0, 0, 0 }, 0x210, 3029, }, - { 14, 4, 0, 0x0000008000000080ull, 0x000001ee000011c0ull, { 82, 0, 0, 0, 0 }, 0x250, 3030, }, - { 14, 4, 0, 0x0000008000000140ull, 0x000001ee000011c0ull, { 82, 0, 0, 0, 0 }, 0x30, 590, }, - { 14, 4, 0, 0x0000008000000140ull, 0x000001ee000011c0ull, { 82, 0, 0, 0, 0 }, 0x70, 591, }, - { 14, 4, 0, 0x0000008000000180ull, 0x000001ee000011c0ull, { 82, 0, 0, 0, 0 }, 0x230, 588, }, - { 14, 4, 0, 0x0000008000000180ull, 0x000001ee000011c0ull, { 82, 0, 0, 0, 0 }, 0x270, 589, }, - { 14, 4, 1, 0x000000a000000000ull, 0x000001ee00001000ull, { 15, 82, 0, 0, 0 }, 0x0, 584, }, - { 14, 4, 1, 0x000000a000000000ull, 0x000001ee00001000ull, { 15, 82, 0, 0, 0 }, 0x40, 585, }, - { 15, 4, 0, 0x0000000000000000ull, 0x000001e1f8000000ull, { 66, 0, 0, 0, 0 }, 0x0, 537, }, - { 15, 5, 0, 0x0000000000000000ull, 0x000001e3f8000000ull, { 66, 0, 0, 0, 0 }, 0x0, 960, }, - { 15, 2, 0, 0x0000000000000000ull, 0x000001eff8000000ull, { 66, 0, 0, 0, 0 }, 0x2, 1138, }, - { 15, 3, 0, 0x0000000000000000ull, 0x000001eff8000000ull, { 66, 0, 0, 0, 0 }, 0x0, 1263, }, - { 15, 6, 0, 0x0000000000000000ull, 0x000001eff8000000ull, { 70, 0, 0, 0, 0 }, 0x0, 3033, }, - { 15, 7, 0, 0x0000000000000000ull, 0x0000000000000000ull, { 66, 0, 0, 0, 0 }, 0x0, 16, }, - { 16, 6, 0, 0x0000018000000000ull, 0x000001ee000011ffull, { 83, 0, 0, 0, 0 }, 0x40, 1023, }, - { 16, 6, 0, 0x0000018000000000ull, 0x000001ee000011c0ull, { 83, 0, 0, 0, 0 }, 0x0, 829, }, - { 16, 6, 0, 0x0000018000000000ull, 0x000001ee000011c0ull, { 83, 0, 0, 0, 0 }, 0x40, 830, }, - { 16, 6, 1, 0x000001a000000000ull, 0x000001ee00001000ull, { 15, 83, 0, 0, 0 }, 0x0, 586, }, - { 16, 6, 1, 0x000001a000000000ull, 0x000001ee00001000ull, { 15, 83, 0, 0, 0 }, 0x40, 587, }, - { 17, 4, 0, 0x0000004080000000ull, 0x000001e9f8000018ull, { 16, 78, 0, 0, 0 }, 0x20, 2852, }, - { 17, 4, 0, 0x000000e000000000ull, 0x000001e800000018ull, { 82, 78, 0, 0, 0 }, 0x20, 2853, }, - { 18, 4, 0, 0x0000000060000000ull, 0x000001e1f8000000ull, { 0, 0, 0, 0, 0 }, 0x2c, 222, }, - { 22, 2, 0, 0x0000000200000000ull, 0x000001ee00000000ull, { 25, 81, 0, 0, 0 }, 0x0, 2239, }, - { 22, 3, 0, 0x0000000800000000ull, 0x000001ee00000000ull, { 24, 82, 0, 0, 0 }, 0x0, 226, }, - { 22, 3, 0, 0x0000000c00000000ull, 0x000001ee00000000ull, { 18, 82, 0, 0, 0 }, 0x0, 227, }, - { 22, 3, 0, 0x0000002200000000ull, 0x000001ee00000000ull, { 25, 81, 0, 0, 0 }, 0x0, 2240, }, - { 22, 3, 0, 0x0000002600000000ull, 0x000001ee00000000ull, { 19, 81, 0, 0, 0 }, 0x0, 2241, }, - { 22, 7, 0, 0x0000000000000000ull, 0x0000000000000000ull, { 25, 81, 0, 0, 0 }, 0x0, 2242, }, - { 25, 4, 0, 0x0000000020000000ull, 0x000001e1f8000000ull, { 0, 0, 0, 0, 0 }, 0x224, 18, }, - { 26, 1, 2, 0x0000018000000000ull, 0x000001fe00001000ull, { 22, 23, 25, 26, 0 }, 0x0, 1222, }, - { 26, 1, 1, 0x0000018000000000ull, 0x000001fe00001000ull, { 22, 25, 26, 0, 0 }, 0x40, 1223, }, - { 26, 1, 2, 0x0000018000000000ull, 0x000001fe00001000ull, { 23, 22, 26, 25, 0 }, 0x0, 1181, }, - { 26, 1, 1, 0x0000018000000000ull, 0x000001fe00001000ull, { 23, 26, 25, 0, 0 }, 0x40, 1182, }, - { 26, 1, 2, 0x0000018000000000ull, 0x000001fe00001000ull, { 22, 23, 26, 25, 0 }, 0x0, 1090, }, - { 26, 1, 1, 0x0000018000000000ull, 0x000001fe00001000ull, { 22, 26, 25, 0, 0 }, 0x40, 1091, }, - { 26, 1, 2, 0x0000018000000000ull, 0x000001fe00001000ull, { 23, 22, 25, 26, 0 }, 0x0, 1052, }, - { 26, 1, 1, 0x0000018000000000ull, 0x000001fe00001000ull, { 23, 25, 26, 0, 0 }, 0x40, 1053, }, - { 26, 1, 2, 0x0000018200000000ull, 0x000001fe00001000ull, { 22, 23, 25, 26, 0 }, 0x40, 1376, }, - { 26, 1, 2, 0x0000019000000000ull, 0x000001fe00001000ull, { 22, 23, 7, 26, 0 }, 0x0, 1092, }, - { 26, 1, 1, 0x0000019000000000ull, 0x000001fe00001000ull, { 22, 7, 26, 0, 0 }, 0x40, 1093, }, - { 26, 1, 2, 0x0000019000000000ull, 0x000001fe00001000ull, { 22, 23, 26, 7, 0 }, 0x40, 1226, }, - { 26, 1, 1, 0x0000019000000000ull, 0x000001fe00001000ull, { 22, 26, 7, 0, 0 }, 0x40, 1227, }, - { 26, 1, 2, 0x0000019000000000ull, 0x000001fe00001000ull, { 22, 23, 7, 26, 0 }, 0x40, 1187, }, - { 26, 1, 2, 0x0000018800000000ull, 0x000001ee00001000ull, { 22, 23, 56, 26, 0 }, 0x0, 1229, }, - { 26, 1, 1, 0x0000018800000000ull, 0x000001ee00001000ull, { 22, 56, 26, 0, 0 }, 0x40, 1230, }, - { 26, 1, 2, 0x0000018800000000ull, 0x000001ee00001000ull, { 22, 23, 58, 26, 0 }, 0x0, 1188, }, - { 26, 1, 1, 0x0000018800000000ull, 0x000001ee00001000ull, { 22, 58, 26, 0, 0 }, 0x40, 1189, }, - { 26, 1, 2, 0x0000018800000000ull, 0x000001ee00001000ull, { 23, 22, 58, 26, 0 }, 0x0, 1097, }, - { 26, 1, 1, 0x0000018800000000ull, 0x000001ee00001000ull, { 23, 58, 26, 0, 0 }, 0x40, 1098, }, - { 26, 1, 2, 0x0000018800000000ull, 0x000001ee00001000ull, { 23, 22, 56, 26, 0 }, 0x0, 1059, }, - { 26, 1, 1, 0x0000018800000000ull, 0x000001ee00001000ull, { 23, 56, 26, 0, 0 }, 0x40, 1060, }, - { 26, 1, 2, 0x0000018a00000000ull, 0x000001ee00001000ull, { 22, 23, 56, 26, 0 }, 0x40, 1381, }, - { 26, 1, 2, 0x000001a800000000ull, 0x000001ee00001000ull, { 22, 23, 60, 26, 0 }, 0x0, 1214, }, - { 26, 1, 1, 0x000001a800000000ull, 0x000001ee00001000ull, { 22, 60, 26, 0, 0 }, 0x40, 1215, }, - { 26, 1, 2, 0x000001a800000000ull, 0x000001ee00001000ull, { 23, 22, 60, 26, 0 }, 0x0, 1125, }, - { 26, 1, 1, 0x000001a800000000ull, 0x000001ee00001000ull, { 23, 60, 26, 0, 0 }, 0x40, 1126, }, - { 26, 1, 2, 0x000001c200000000ull, 0x000001fe00001000ull, { 23, 22, 25, 26, 0 }, 0x40, 1382, }, - { 26, 1, 2, 0x000001d000000000ull, 0x000001fe00001000ull, { 23, 22, 7, 26, 0 }, 0x40, 1190, }, - { 26, 1, 1, 0x000001d000000000ull, 0x000001fe00001000ull, { 23, 7, 26, 0, 0 }, 0x40, 1191, }, - { 26, 1, 2, 0x000001d000000000ull, 0x000001fe00001000ull, { 23, 22, 26, 7, 0 }, 0x40, 1063, }, - { 26, 1, 1, 0x000001d000000000ull, 0x000001fe00001000ull, { 23, 26, 7, 0, 0 }, 0x40, 1064, }, - { 26, 1, 2, 0x000001ca00000000ull, 0x000001ee00001000ull, { 23, 22, 56, 26, 0 }, 0x40, 1383, }, - { 27, 1, 2, 0x0000018400000000ull, 0x000001fe00001000ull, { 22, 23, 25, 26, 0 }, 0x0, 1235, }, - { 27, 1, 1, 0x0000018400000000ull, 0x000001fe00001000ull, { 22, 25, 26, 0, 0 }, 0x40, 1236, }, - { 27, 1, 2, 0x0000018400000000ull, 0x000001fe00001000ull, { 23, 22, 26, 25, 0 }, 0x0, 1194, }, - { 27, 1, 1, 0x0000018400000000ull, 0x000001fe00001000ull, { 23, 26, 25, 0, 0 }, 0x40, 1195, }, - { 27, 1, 2, 0x0000018400000000ull, 0x000001fe00001000ull, { 22, 23, 26, 25, 0 }, 0x0, 1103, }, - { 27, 1, 1, 0x0000018400000000ull, 0x000001fe00001000ull, { 22, 26, 25, 0, 0 }, 0x40, 1104, }, - { 27, 1, 2, 0x0000018400000000ull, 0x000001fe00001000ull, { 23, 22, 25, 26, 0 }, 0x0, 1065, }, - { 27, 1, 1, 0x0000018400000000ull, 0x000001fe00001000ull, { 23, 25, 26, 0, 0 }, 0x40, 1066, }, - { 27, 1, 2, 0x0000018600000000ull, 0x000001fe00001000ull, { 22, 23, 25, 26, 0 }, 0x40, 1388, }, - { 27, 1, 2, 0x0000019400000000ull, 0x000001fe00001000ull, { 22, 23, 7, 26, 0 }, 0x0, 1105, }, - { 27, 1, 1, 0x0000019400000000ull, 0x000001fe00001000ull, { 22, 7, 26, 0, 0 }, 0x40, 1106, }, - { 27, 1, 2, 0x0000019400000000ull, 0x000001fe00001000ull, { 22, 23, 26, 7, 0 }, 0x40, 1239, }, - { 27, 1, 1, 0x0000019400000000ull, 0x000001fe00001000ull, { 22, 26, 7, 0, 0 }, 0x40, 1240, }, - { 27, 1, 2, 0x0000019400000000ull, 0x000001fe00001000ull, { 22, 23, 7, 26, 0 }, 0x40, 1200, }, - { 27, 1, 2, 0x0000018c00000000ull, 0x000001ee00001000ull, { 22, 23, 56, 26, 0 }, 0x0, 1242, }, - { 27, 1, 1, 0x0000018c00000000ull, 0x000001ee00001000ull, { 22, 56, 26, 0, 0 }, 0x40, 1243, }, - { 27, 1, 2, 0x0000018c00000000ull, 0x000001ee00001000ull, { 22, 23, 58, 26, 0 }, 0x0, 1201, }, - { 27, 1, 1, 0x0000018c00000000ull, 0x000001ee00001000ull, { 22, 58, 26, 0, 0 }, 0x40, 1202, }, - { 27, 1, 2, 0x0000018c00000000ull, 0x000001ee00001000ull, { 23, 22, 58, 26, 0 }, 0x0, 1110, }, - { 27, 1, 1, 0x0000018c00000000ull, 0x000001ee00001000ull, { 23, 58, 26, 0, 0 }, 0x40, 1111, }, - { 27, 1, 2, 0x0000018c00000000ull, 0x000001ee00001000ull, { 23, 22, 56, 26, 0 }, 0x0, 1072, }, - { 27, 1, 1, 0x0000018c00000000ull, 0x000001ee00001000ull, { 23, 56, 26, 0, 0 }, 0x40, 1073, }, - { 27, 1, 2, 0x0000018e00000000ull, 0x000001ee00001000ull, { 22, 23, 56, 26, 0 }, 0x40, 1393, }, - { 27, 1, 2, 0x000001ac00000000ull, 0x000001ee00001000ull, { 22, 23, 57, 26, 0 }, 0x0, 1259, }, - { 27, 1, 1, 0x000001ac00000000ull, 0x000001ee00001000ull, { 22, 57, 26, 0, 0 }, 0x40, 1260, }, - { 27, 1, 2, 0x000001ac00000000ull, 0x000001ee00001000ull, { 22, 23, 59, 26, 0 }, 0x0, 1218, }, - { 27, 1, 1, 0x000001ac00000000ull, 0x000001ee00001000ull, { 22, 59, 26, 0, 0 }, 0x40, 1219, }, - { 27, 1, 2, 0x000001ac00000000ull, 0x000001ee00001000ull, { 23, 22, 59, 26, 0 }, 0x0, 1129, }, - { 27, 1, 1, 0x000001ac00000000ull, 0x000001ee00001000ull, { 23, 59, 26, 0, 0 }, 0x40, 1130, }, - { 27, 1, 2, 0x000001ac00000000ull, 0x000001ee00001000ull, { 23, 22, 57, 26, 0 }, 0x0, 1088, }, - { 27, 1, 1, 0x000001ac00000000ull, 0x000001ee00001000ull, { 23, 57, 26, 0, 0 }, 0x40, 1089, }, - { 27, 1, 2, 0x000001c600000000ull, 0x000001fe00001000ull, { 23, 22, 25, 26, 0 }, 0x40, 1394, }, - { 27, 1, 2, 0x000001d400000000ull, 0x000001fe00001000ull, { 23, 22, 7, 26, 0 }, 0x40, 1203, }, - { 27, 1, 1, 0x000001d400000000ull, 0x000001fe00001000ull, { 23, 7, 26, 0, 0 }, 0x40, 1204, }, - { 27, 1, 2, 0x000001d400000000ull, 0x000001fe00001000ull, { 23, 22, 26, 7, 0 }, 0x40, 1076, }, - { 27, 1, 1, 0x000001d400000000ull, 0x000001fe00001000ull, { 23, 26, 7, 0, 0 }, 0x40, 1077, }, - { 27, 1, 2, 0x000001ce00000000ull, 0x000001ee00001000ull, { 23, 22, 56, 26, 0 }, 0x40, 1395, }, - { 28, 3, 1, 0x0000008808000000ull, 0x000001fff8000000ull, { 24, 28, 25, 1, 2 }, 0x0, 259, }, - { 28, 3, 1, 0x0000008808000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x40, 260, }, - { 29, 3, 1, 0x0000008008000000ull, 0x000001fff8000000ull, { 24, 28, 25, 2, 0 }, 0x0, 261, }, - { 29, 3, 1, 0x0000008008000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x40, 262, }, - { 30, 3, 1, 0x0000008048000000ull, 0x000001fff8000000ull, { 24, 28, 25, 2, 0 }, 0x0, 263, }, - { 30, 3, 1, 0x0000008048000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x40, 264, }, - { 31, 3, 1, 0x0000008088000000ull, 0x000001fff8000000ull, { 24, 28, 25, 2, 0 }, 0x0, 265, }, - { 31, 3, 1, 0x0000008088000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x40, 266, }, - { 32, 3, 1, 0x00000080c8000000ull, 0x000001fff8000000ull, { 24, 28, 25, 2, 0 }, 0x0, 267, }, - { 32, 3, 1, 0x00000080c8000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x40, 268, }, - { 34, 4, 0, 0x0000000010000000ull, 0x000001e1f8000000ull, { 0, 0, 0, 0, 0 }, 0x224, 19, }, - { 36, 2, 1, 0x00000000c0000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 1167, }, - { 37, 2, 1, 0x00000000c8000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 1168, }, - { 39, 2, 1, 0x0000008000000000ull, 0x000001e000000000ull, { 24, 25, 26, 47, 73 }, 0x0, 20, }, - { 39, 2, 1, 0x000000a600000000ull, 0x000001ee04000000ull, { 24, 25, 45, 74, 0 }, 0x0, 3038, }, - { 39, 2, 1, 0x000000a604000000ull, 0x000001ee04000000ull, { 24, 56, 45, 74, 0 }, 0x0, 3039, }, - { 39, 2, 1, 0x000000ae00000000ull, 0x000001ee00000000ull, { 24, 48, 26, 46, 74 }, 0x0, 21, }, - { 43, 4, 0, 0x0000000080000000ull, 0x000001e1f8000000ull, { 0, 0, 0, 0, 0 }, 0x20, 22, }, - { 48, 2, 1, 0x000000a400000000ull, 0x000001ee00002000ull, { 24, 26, 77, 74, 0 }, 0x0, 2870, }, - { 50, 5, 1, 0x0000000080000000ull, 0x000001e3f80fe000ull, { 18, 20, 0, 0, 0 }, 0x40, 24, }, - { 51, 5, 1, 0x0000010008000000ull, 0x000001fff8000000ull, { 18, 20, 19, 0, 0 }, 0x40, 2291, }, - { 52, 5, 1, 0x00000000b8000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2292, }, - { 52, 5, 1, 0x00000000b8000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x40, 26, }, - { 53, 5, 1, 0x00000000b0000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2293, }, - { 53, 5, 1, 0x00000000b0000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x40, 27, }, - { 54, 5, 1, 0x0000000160000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 28, }, - { 55, 5, 1, 0x0000000168000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 29, }, - { 57, 3, 0, 0x0000002180000000ull, 0x000001fff8000000ull, { 26, 0, 0, 0, 0 }, 0x0, 30, }, - { 58, 5, 0, 0x0000000040000000ull, 0x000001eff8000000ull, { 80, 0, 0, 0, 0 }, 0x0, 2294, }, - { 58, 5, 0, 0x0000000040000000ull, 0x000001eff8000000ull, { 80, 0, 0, 0, 0 }, 0x40, 31, }, - { 59, 5, 2, 0x000000a000000000ull, 0x000001e000001000ull, { 22, 23, 19, 61, 0 }, 0x0, 1265, }, - { 59, 5, 1, 0x000000a000000000ull, 0x000001e000001000ull, { 22, 19, 61, 0, 0 }, 0x40, 1266, }, - { 59, 5, 2, 0x000000a000000000ull, 0x000001e000001000ull, { 23, 22, 19, 61, 0 }, 0x40, 1420, }, - { 59, 5, 1, 0x000000a000000000ull, 0x000001e000001000ull, { 23, 19, 61, 0, 0 }, 0x40, 1421, }, - { 60, 5, 0, 0x0000000028000000ull, 0x000001eff8000000ull, { 0, 0, 0, 0, 0 }, 0x0, 2295, }, - { 60, 5, 0, 0x0000000028000000ull, 0x000001eff8000000ull, { 0, 0, 0, 0, 0 }, 0x40, 32, }, - { 61, 5, 2, 0x0000008000000000ull, 0x000001fe00001000ull, { 22, 23, 19, 20, 0 }, 0x0, 943, }, - { 61, 5, 1, 0x0000008000000000ull, 0x000001fe00001000ull, { 22, 19, 20, 0, 0 }, 0x40, 944, }, - { 61, 5, 2, 0x0000008000000000ull, 0x000001fe00001000ull, { 22, 23, 19, 20, 0 }, 0x40, 945, }, - { 61, 5, 2, 0x0000009000000000ull, 0x000001fe00001000ull, { 22, 23, 20, 19, 0 }, 0x0, 1116, }, - { 61, 5, 1, 0x0000009000000000ull, 0x000001fe00001000ull, { 22, 20, 19, 0, 0 }, 0x40, 1117, }, - { 61, 5, 2, 0x0000009000000000ull, 0x000001fe00001000ull, { 22, 23, 20, 19, 0 }, 0x40, 1118, }, - { 61, 5, 2, 0x0000008000000000ull, 0x000001fe00001000ull, { 23, 22, 19, 20, 0 }, 0x0, 1396, }, - { 61, 5, 1, 0x0000008000000000ull, 0x000001fe00001000ull, { 23, 19, 20, 0, 0 }, 0x40, 1397, }, - { 61, 5, 2, 0x0000008000000000ull, 0x000001fe00001000ull, { 23, 22, 19, 20, 0 }, 0x40, 1398, }, - { 61, 5, 2, 0x0000009000000000ull, 0x000001fe00001000ull, { 23, 22, 20, 19, 0 }, 0x0, 1405, }, - { 61, 5, 1, 0x0000009000000000ull, 0x000001fe00001000ull, { 23, 20, 19, 0, 0 }, 0x40, 1406, }, - { 61, 5, 2, 0x0000009000000000ull, 0x000001fe00001000ull, { 23, 22, 20, 19, 0 }, 0x40, 1407, }, - { 62, 5, 1, 0x00000000c0000000ull, 0x000001eff8000000ull, { 18, 19, 0, 0, 0 }, 0x0, 1042, }, - { 62, 5, 1, 0x00000000c0000000ull, 0x000001eff8000000ull, { 18, 19, 0, 0, 0 }, 0x40, 1043, }, - { 62, 5, 1, 0x00000000e0000000ull, 0x000001e3f8000000ull, { 18, 19, 0, 0, 0 }, 0x0, 3036, }, - { 62, 5, 1, 0x0000010008000000ull, 0x000001fff80fe000ull, { 18, 20, 0, 0, 0 }, 0x40, 3037, }, - { 63, 3, 1, 0x0000008488000000ull, 0x000001fff8000000ull, { 24, 28, 72, 0, 0 }, 0x0, 269, }, - { 64, 3, 1, 0x00000084c8000000ull, 0x000001fff8000000ull, { 24, 28, 72, 0, 0 }, 0x0, 270, }, - { 67, 3, 0, 0x0000000060000000ull, 0x000001eff8000000ull, { 0, 0, 0, 0, 0 }, 0x21, 33, }, - { 68, 5, 1, 0x0000010000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x0, 2353, }, - { 68, 5, 1, 0x0000010000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x40, 34, }, - { 69, 5, 1, 0x00000000a8000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2354, }, - { 69, 5, 1, 0x00000000a8000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x40, 35, }, - { 70, 5, 1, 0x0000000080000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2247, }, - { 71, 5, 1, 0x00000000a0000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2355, }, - { 71, 5, 1, 0x00000000a0000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x40, 36, }, - { 72, 5, 1, 0x00000001c8000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 1221, }, - { 73, 5, 1, 0x0000010000000000ull, 0x000001fc000fe000ull, { 18, 20, 21, 0, 0 }, 0x40, 2358, }, - { 74, 5, 1, 0x0000014000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x0, 2361, }, - { 74, 5, 1, 0x0000014000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x40, 38, }, - { 75, 5, 1, 0x0000000088000000ull, 0x000001e3f8000000ull, { 18, 20, 0, 0, 0 }, 0xc0, 39, }, - { 76, 5, 1, 0x0000000088000000ull, 0x000001e3f80fe000ull, { 18, 20, 0, 0, 0 }, 0x40, 40, }, - { 77, 5, 1, 0x0000018000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x0, 2364, }, - { 77, 5, 1, 0x0000018000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x40, 41, }, - { 78, 5, 1, 0x0000018000000000ull, 0x000001fc000fe000ull, { 18, 20, 21, 0, 0 }, 0x40, 2367, }, - { 79, 5, 1, 0x0000010008000000ull, 0x000001fff80fe000ull, { 18, 20, 0, 0, 0 }, 0x40, 2370, }, - { 80, 5, 1, 0x0000000170000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 44, }, - { 81, 5, 1, 0x0000002080000000ull, 0x000001e3f80fe000ull, { 18, 20, 0, 0, 0 }, 0x40, 45, }, - { 82, 5, 1, 0x0000000140000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 46, }, - { 83, 5, 1, 0x00000020b8000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2371, }, - { 83, 5, 1, 0x00000020b8000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x40, 47, }, - { 84, 5, 1, 0x00000020b0000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2372, }, - { 84, 5, 1, 0x00000020b0000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x40, 48, }, - { 85, 5, 1, 0x0000002180000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 946, }, - { 85, 5, 1, 0x0000002180000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x40, 947, }, - { 85, 5, 1, 0x0000002188000000ull, 0x000001eff8000000ull, { 18, 20, 19, 0, 0 }, 0x40, 1119, }, - { 86, 5, 1, 0x00000020c0000000ull, 0x000001eff8000000ull, { 18, 19, 0, 0, 0 }, 0x0, 1044, }, - { 86, 5, 1, 0x00000020c0000000ull, 0x000001eff8000000ull, { 18, 19, 0, 0, 0 }, 0x40, 1045, }, - { 87, 5, 1, 0x0000013000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x0, 2389, }, - { 87, 5, 1, 0x0000013000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x40, 49, }, - { 88, 5, 1, 0x00000020a8000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2390, }, - { 88, 5, 1, 0x00000020a8000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x40, 50, }, - { 89, 5, 1, 0x0000002080000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2255, }, - { 90, 5, 1, 0x00000020a0000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2391, }, - { 90, 5, 1, 0x00000020a0000000ull, 0x000001eff8000000ull, { 18, 19, 20, 0, 0 }, 0x40, 51, }, - { 91, 5, 1, 0x0000013000000000ull, 0x000001fc000fe000ull, { 18, 20, 21, 0, 0 }, 0x40, 2392, }, - { 92, 5, 1, 0x0000017000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x0, 2393, }, - { 92, 5, 1, 0x0000017000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x40, 53, }, - { 93, 5, 1, 0x0000002088000000ull, 0x000001e3f8000000ull, { 18, 20, 0, 0, 0 }, 0xc0, 54, }, - { 94, 5, 1, 0x0000002088000000ull, 0x000001e3f80fe000ull, { 18, 20, 0, 0, 0 }, 0x40, 55, }, - { 95, 5, 1, 0x000001b000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x0, 2394, }, - { 95, 5, 1, 0x000001b000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x40, 56, }, - { 96, 5, 1, 0x000001b000000000ull, 0x000001fc000fe000ull, { 18, 20, 21, 0, 0 }, 0x40, 2395, }, - { 97, 5, 2, 0x0000002200000000ull, 0x000001fe00000000ull, { 18, 23, 19, 20, 0 }, 0x0, 2396, }, - { 97, 5, 2, 0x0000002200000000ull, 0x000001fe00000000ull, { 18, 23, 19, 20, 0 }, 0x40, 58, }, - { 98, 5, 2, 0x0000003200000000ull, 0x000001fe00000000ull, { 18, 23, 20, 0, 0 }, 0x0, 2397, }, - { 98, 5, 2, 0x0000003200000000ull, 0x000001fe00000000ull, { 18, 23, 20, 0, 0 }, 0x40, 59, }, - { 99, 5, 2, 0x0000000200000000ull, 0x000001fe00000000ull, { 18, 23, 19, 20, 0 }, 0x0, 2398, }, - { 99, 5, 2, 0x0000000200000000ull, 0x000001fe00000000ull, { 18, 23, 19, 20, 0 }, 0x40, 60, }, - { 100, 5, 2, 0x0000001200000000ull, 0x000001fe00000000ull, { 18, 23, 20, 0, 0 }, 0x0, 2399, }, - { 100, 5, 2, 0x0000001200000000ull, 0x000001fe00000000ull, { 18, 23, 20, 0, 0 }, 0x40, 61, }, - { 101, 5, 1, 0x000001c000000000ull, 0x000001f000000000ull, { 18, 20, 21, 19, 0 }, 0x0, 62, }, - { 102, 5, 0, 0x0000000020000000ull, 0x000001eff8000000ull, { 51, 52, 0, 0, 0 }, 0x0, 2400, }, - { 102, 5, 0, 0x0000000020000000ull, 0x000001eff8000000ull, { 51, 52, 0, 0, 0 }, 0x40, 63, }, - { 103, 5, 1, 0x0000014008000000ull, 0x000001fff8000000ull, { 18, 20, 19, 0, 0 }, 0x40, 2403, }, - { 104, 5, 1, 0x00000001a0000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 65, }, - { 105, 5, 1, 0x00000001e0000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 2202, }, - { 106, 3, 0, 0x0000000100000000ull, 0x000001eff8000000ull, { 0, 0, 0, 0, 0 }, 0x0, 66, }, - { 108, 5, 1, 0x0000000178000000ull, 0x000001e3f8000000ull, { 18, 19, 20, 0, 0 }, 0x0, 67, }, - { 113, 3, 1, 0x0000008708000000ull, 0x000001ffc8000000ull, { 24, 19, 0, 0, 0 }, 0x0, 2781, }, - { 118, 4, 0, 0x0000004008000000ull, 0x000001e1f8000000ull, { 66, 0, 0, 0, 0 }, 0x0, 538, }, - { 118, 5, 0, 0x000000000c000000ull, 0x000001e3fc000000ull, { 66, 0, 0, 0, 0 }, 0x0, 961, }, - { 118, 2, 0, 0x000000000c000000ull, 0x000001effc000000ull, { 66, 0, 0, 0, 0 }, 0x2, 1141, }, - { 118, 3, 0, 0x000000000c000000ull, 0x000001effc000000ull, { 66, 0, 0, 0, 0 }, 0x0, 1267, }, - { 118, 6, 0, 0x000000000c000000ull, 0x000001effc000000ull, { 70, 0, 0, 0, 0 }, 0x0, 3034, }, - { 118, 7, 0, 0x0000000000000000ull, 0x0000000000000000ull, { 66, 0, 0, 0, 0 }, 0x0, 68, }, - { 123, 3, 0, 0x0000000080000000ull, 0x000001eff8000000ull, { 0, 0, 0, 0, 0 }, 0x0, 69, }, - { 123, 3, 0, 0x0000000090000000ull, 0x000001eff8000000ull, { 24, 0, 0, 0, 0 }, 0x0, 920, }, - { 123, 3, 0, 0x0000000098000000ull, 0x000001eff8000000ull, { 18, 0, 0, 0, 0 }, 0x0, 921, }, - { 124, 3, 0, 0x0000002170000000ull, 0x000001eff8000000ull, { 25, 0, 0, 0, 0 }, 0xc, 846, }, - { 125, 3, 1, 0x0000002070000000ull, 0x000001eff8000000ull, { 31, 25, 0, 0, 0 }, 0x8, 847, }, - { 125, 3, 1, 0x0000002078000000ull, 0x000001eff8000000ull, { 32, 25, 0, 0, 0 }, 0x8, 1143, }, - { 127, 3, 1, 0x0000008000000000ull, 0x000001fff8000000ull, { 24, 28, 0, 0, 0 }, 0x0, 70, }, - { 127, 3, 1, 0x0000009000000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x400, 71, }, - { 127, 3, 1, 0x000000a000000000ull, 0x000001eff0000000ull, { 24, 28, 63, 0, 0 }, 0x400, 72, }, - { 128, 3, 2, 0x0000008a08000000ull, 0x000001fff8000000ull, { 24, 1, 28, 0, 0 }, 0x0, 73, }, - { 128, 3, 1, 0x0000008a08000000ull, 0x000001fff8000000ull, { 24, 28, 0, 0, 0 }, 0x40, 74, }, - { 129, 3, 1, 0x0000008040000000ull, 0x000001fff8000000ull, { 24, 28, 0, 0, 0 }, 0x0, 75, }, - { 129, 3, 1, 0x0000009040000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x400, 76, }, - { 129, 3, 1, 0x000000a040000000ull, 0x000001eff0000000ull, { 24, 28, 63, 0, 0 }, 0x400, 77, }, - { 130, 3, 1, 0x0000008080000000ull, 0x000001fff8000000ull, { 24, 28, 0, 0, 0 }, 0x0, 78, }, - { 130, 3, 1, 0x0000009080000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x400, 79, }, - { 130, 3, 1, 0x000000a080000000ull, 0x000001eff0000000ull, { 24, 28, 63, 0, 0 }, 0x400, 80, }, - { 131, 3, 1, 0x00000080c0000000ull, 0x000001fff8000000ull, { 24, 28, 0, 0, 0 }, 0x0, 81, }, - { 131, 3, 1, 0x00000080c0000000ull, 0x000001fff8000000ull, { 24, 28, 84, 0, 0 }, 0x0, 1339, }, - { 131, 3, 1, 0x00000090c0000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x400, 82, }, - { 131, 3, 1, 0x000000a0c0000000ull, 0x000001eff0000000ull, { 24, 28, 63, 0, 0 }, 0x400, 83, }, - { 132, 3, 1, 0x000000c6c0000000ull, 0x000001fff8000000ull, { 18, 28, 0, 0, 0 }, 0x0, 1039, }, - { 132, 3, 1, 0x000000d6c0000000ull, 0x000001fff8000000ull, { 18, 28, 25, 0, 0 }, 0x400, 1040, }, - { 132, 3, 1, 0x000000e6c0000000ull, 0x000001eff0000000ull, { 18, 28, 63, 0, 0 }, 0x400, 1041, }, - { 133, 3, 1, 0x000000c040000000ull, 0x000001fff8000000ull, { 18, 28, 0, 0, 0 }, 0x0, 84, }, - { 133, 3, 1, 0x000000d040000000ull, 0x000001fff8000000ull, { 18, 28, 25, 0, 0 }, 0x400, 85, }, - { 133, 3, 1, 0x000000e040000000ull, 0x000001eff0000000ull, { 18, 28, 63, 0, 0 }, 0x400, 86, }, - { 134, 3, 1, 0x000000c0c0000000ull, 0x000001fff8000000ull, { 18, 28, 0, 0, 0 }, 0x0, 87, }, - { 134, 3, 1, 0x000000d0c0000000ull, 0x000001fff8000000ull, { 18, 28, 25, 0, 0 }, 0x400, 88, }, - { 134, 3, 1, 0x000000e0c0000000ull, 0x000001eff0000000ull, { 18, 28, 63, 0, 0 }, 0x400, 89, }, - { 135, 3, 1, 0x000000c000000000ull, 0x000001fff8000000ull, { 18, 28, 0, 0, 0 }, 0x0, 90, }, - { 135, 3, 1, 0x000000d000000000ull, 0x000001fff8000000ull, { 18, 28, 25, 0, 0 }, 0x400, 91, }, - { 135, 3, 1, 0x000000e000000000ull, 0x000001eff0000000ull, { 18, 28, 63, 0, 0 }, 0x400, 92, }, - { 136, 3, 2, 0x000000c048000000ull, 0x000001fff8000000ull, { 18, 19, 28, 0, 0 }, 0x0, 93, }, - { 136, 3, 2, 0x000000d048000000ull, 0x000001fff8000000ull, { 18, 19, 28, 6, 0 }, 0x400, 94, }, - { 137, 3, 2, 0x000000c0c8000000ull, 0x000001fff8000000ull, { 18, 19, 28, 0, 0 }, 0x0, 95, }, - { 137, 3, 2, 0x000000d0c8000000ull, 0x000001fff8000000ull, { 18, 19, 28, 6, 0 }, 0x400, 96, }, - { 138, 3, 2, 0x000000c088000000ull, 0x000001fff8000000ull, { 18, 19, 28, 0, 0 }, 0x0, 97, }, - { 138, 3, 2, 0x000000d088000000ull, 0x000001fff8000000ull, { 18, 19, 28, 5, 0 }, 0x400, 98, }, - { 139, 3, 1, 0x000000c080000000ull, 0x000001fff8000000ull, { 18, 28, 0, 0, 0 }, 0x0, 99, }, - { 139, 3, 1, 0x000000d080000000ull, 0x000001fff8000000ull, { 18, 28, 25, 0, 0 }, 0x400, 100, }, - { 139, 3, 1, 0x000000e080000000ull, 0x000001eff0000000ull, { 18, 28, 63, 0, 0 }, 0x400, 101, }, - { 142, 3, 0, 0x000000cb00000000ull, 0x000001fff8000000ull, { 28, 0, 0, 0, 0 }, 0x0, 102, }, - { 142, 3, 0, 0x000000db00000000ull, 0x000001fff8000000ull, { 28, 25, 0, 0, 0 }, 0x400, 103, }, - { 142, 3, 0, 0x000000eb00000000ull, 0x000001eff0000000ull, { 28, 63, 0, 0, 0 }, 0x400, 104, }, - { 143, 3, 0, 0x0000000050000000ull, 0x000001eff8000000ull, { 0, 0, 0, 0, 0 }, 0x21, 105, }, - { 151, 3, 0, 0x0000000110000000ull, 0x000001eff8000000ull, { 0, 0, 0, 0, 0 }, 0x0, 106, }, - { 152, 2, 1, 0x000000e880000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 2203, }, - { 153, 2, 1, 0x000000ea80000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 2204, }, - { 154, 2, 1, 0x000000f880000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 2205, }, - { 155, 1, 1, 0x0000010800000000ull, 0x000001fff80fe000ull, { 24, 26, 0, 0, 0 }, 0x0, 107, }, - { 155, 1, 1, 0x0000012000000000ull, 0x000001e000300000ull, { 24, 67, 0, 0, 0 }, 0x40, 108, }, - { 155, 5, 1, 0x0000000080000000ull, 0x000001e3f8000000ull, { 18, 20, 0, 0, 0 }, 0xc0, 109, }, - { 155, 2, 1, 0x0000000e00100000ull, 0x000001ee00f00000ull, { 15, 25, 0, 0, 0 }, 0x40, 110, }, - { 155, 2, 1, 0x0000000e00000000ull, 0x000001ee00f00000ull, { 15, 25, 79, 0, 0 }, 0x0, 2855, }, - { 155, 2, 1, 0x0000000188000000ull, 0x000001eff8000000ull, { 24, 16, 0, 0, 0 }, 0x0, 112, }, - { 155, 2, 1, 0x0000000600000000ull, 0x000001ee00000000ull, { 9, 25, 65, 0, 0 }, 0x0, 113, }, - { 155, 2, 1, 0x00000016ff001fc0ull, 0x000001feff001fc0ull, { 9, 25, 0, 0, 0 }, 0x40, 114, }, - { 155, 2, 1, 0x0000000400000000ull, 0x000001ee00000000ull, { 10, 69, 0, 0, 0 }, 0x0, 115, }, - { 155, 2, 1, 0x0000000180000000ull, 0x000001eff8000000ull, { 24, 8, 0, 0, 0 }, 0x0, 116, }, - { 155, 2, 1, 0x0000000198000000ull, 0x000001eff8000000ull, { 24, 9, 0, 0, 0 }, 0x0, 117, }, - { 155, 2, 1, 0x0000000150000000ull, 0x000001eff8000000ull, { 14, 25, 0, 0, 0 }, 0x0, 1144, }, - { 155, 2, 1, 0x0000000050000000ull, 0x000001eff8000000ull, { 14, 56, 0, 0, 0 }, 0x0, 1145, }, - { 155, 2, 1, 0x0000000190000000ull, 0x000001eff8000000ull, { 24, 14, 0, 0, 0 }, 0x0, 1146, }, - { 155, 3, 1, 0x0000000140000000ull, 0x000001eff8000000ull, { 14, 56, 0, 0, 0 }, 0x0, 1268, }, - { 155, 3, 1, 0x0000002150000000ull, 0x000001eff8000000ull, { 14, 25, 0, 0, 0 }, 0x0, 1269, }, - { 155, 3, 1, 0x0000002110000000ull, 0x000001eff8000000ull, { 24, 14, 0, 0, 0 }, 0x0, 1270, }, - { 155, 3, 1, 0x0000002160000000ull, 0x000001eff8000000ull, { 17, 25, 0, 0, 0 }, 0x8, 118, }, - { 155, 3, 1, 0x0000002120000000ull, 0x000001eff8000000ull, { 24, 17, 0, 0, 0 }, 0x8, 119, }, - { 155, 3, 1, 0x0000002168000000ull, 0x000001eff8000000ull, { 12, 25, 0, 0, 0 }, 0x8, 120, }, - { 155, 3, 1, 0x0000002148000000ull, 0x000001eff8000000ull, { 13, 25, 0, 0, 0 }, 0x0, 121, }, - { 155, 3, 1, 0x0000002128000000ull, 0x000001eff8000000ull, { 24, 11, 0, 0, 0 }, 0x8, 122, }, - { 155, 3, 1, 0x0000002108000000ull, 0x000001eff8000000ull, { 24, 13, 0, 0, 0 }, 0x0, 123, }, - { 155, 3, 1, 0x0000002000000000ull, 0x000001eff8000000ull, { 38, 25, 0, 0, 0 }, 0x8, 124, }, - { 155, 3, 1, 0x0000002008000000ull, 0x000001eff8000000ull, { 30, 25, 0, 0, 0 }, 0x8, 125, }, - { 155, 3, 1, 0x0000002010000000ull, 0x000001eff8000000ull, { 33, 25, 0, 0, 0 }, 0x8, 126, }, - { 155, 3, 1, 0x0000002018000000ull, 0x000001eff8000000ull, { 35, 25, 0, 0, 0 }, 0x8, 127, }, - { 155, 3, 1, 0x0000002020000000ull, 0x000001eff8000000ull, { 36, 25, 0, 0, 0 }, 0x8, 128, }, - { 155, 3, 1, 0x0000002028000000ull, 0x000001eff8000000ull, { 37, 25, 0, 0, 0 }, 0x8, 129, }, - { 155, 3, 1, 0x0000002030000000ull, 0x000001eff8000000ull, { 34, 25, 0, 0, 0 }, 0x8, 130, }, - { 155, 3, 1, 0x0000002080000000ull, 0x000001eff8000000ull, { 24, 38, 0, 0, 0 }, 0x8, 131, }, - { 155, 3, 1, 0x0000002088000000ull, 0x000001eff8000000ull, { 24, 30, 0, 0, 0 }, 0x8, 132, }, - { 155, 3, 1, 0x0000002090000000ull, 0x000001eff8000000ull, { 24, 33, 0, 0, 0 }, 0x8, 133, }, - { 155, 3, 1, 0x0000002098000000ull, 0x000001eff8000000ull, { 24, 35, 0, 0, 0 }, 0x8, 134, }, - { 155, 3, 1, 0x00000020a0000000ull, 0x000001eff8000000ull, { 24, 36, 0, 0, 0 }, 0x8, 135, }, - { 155, 3, 1, 0x00000020a8000000ull, 0x000001eff8000000ull, { 24, 37, 0, 0, 0 }, 0x0, 136, }, - { 155, 3, 1, 0x00000020b0000000ull, 0x000001eff8000000ull, { 24, 34, 0, 0, 0 }, 0x8, 137, }, - { 155, 3, 1, 0x00000020b8000000ull, 0x000001eff8000000ull, { 24, 29, 0, 0, 0 }, 0x0, 138, }, - { 155, 7, 1, 0x0000000000000000ull, 0x0000000000000000ull, { 24, 14, 0, 0, 0 }, 0x0, 139, }, - { 155, 7, 1, 0x0000000000000000ull, 0x0000000000000000ull, { 14, 56, 0, 0, 0 }, 0x0, 140, }, - { 155, 7, 1, 0x0000000000000000ull, 0x0000000000000000ull, { 14, 25, 0, 0, 0 }, 0x0, 141, }, - { 156, 6, 1, 0x000000c000000000ull, 0x000001e000100000ull, { 24, 71, 0, 0, 0 }, 0x0, 142, }, - { 157, 2, 1, 0x000000eca0000000ull, 0x000001fff0000000ull, { 24, 25, 75, 0, 0 }, 0x0, 143, }, - { 158, 2, 1, 0x000000eea0000000ull, 0x000001fff0000000ull, { 24, 25, 76, 0, 0 }, 0x0, 144, }, - { 168, 4, 0, 0x0000004000000000ull, 0x000001e1f8000000ull, { 66, 0, 0, 0, 0 }, 0x0, 539, }, - { 168, 5, 0, 0x0000000008000000ull, 0x000001e3fc000000ull, { 66, 0, 0, 0, 0 }, 0x0, 962, }, - { 168, 2, 0, 0x0000000008000000ull, 0x000001effc000000ull, { 66, 0, 0, 0, 0 }, 0x2, 1147, }, - { 168, 3, 0, 0x0000000008000000ull, 0x000001effc000000ull, { 66, 0, 0, 0, 0 }, 0x0, 1271, }, - { 168, 6, 0, 0x0000000008000000ull, 0x000001effc000000ull, { 70, 0, 0, 0, 0 }, 0x0, 3035, }, - { 168, 7, 0, 0x0000000000000000ull, 0x0000000000000000ull, { 66, 0, 0, 0, 0 }, 0x0, 145, }, - { 175, 1, 1, 0x0000010070000000ull, 0x000001eff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 146, }, - { 175, 1, 1, 0x0000010170000000ull, 0x000001eff8000000ull, { 24, 56, 26, 0, 0 }, 0x0, 147, }, - { 178, 2, 1, 0x000000ea00000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 3017, }, - { 179, 2, 1, 0x000000f820000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 2857, }, - { 180, 1, 1, 0x0000010400000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 148, }, - { 181, 1, 1, 0x0000010600000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 149, }, - { 182, 1, 1, 0x0000011400000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 150, }, - { 183, 1, 1, 0x0000010450000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 151, }, - { 184, 1, 1, 0x0000010650000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 152, }, - { 185, 1, 1, 0x0000010470000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 153, }, - { 186, 1, 1, 0x0000010670000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 154, }, - { 187, 1, 1, 0x0000010520000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 948, }, - { 188, 1, 1, 0x0000010720000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 949, }, - { 189, 1, 1, 0x0000011520000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 950, }, - { 190, 2, 1, 0x000000e850000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 2871, }, - { 191, 2, 1, 0x000000ea70000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 155, }, - { 192, 2, 1, 0x000000e810000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 2872, }, - { 193, 2, 1, 0x000000ea30000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 156, }, - { 194, 2, 1, 0x000000ead0000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 2206, }, - { 195, 2, 1, 0x000000e230000000ull, 0x000001ff30000000ull, { 24, 25, 26, 42, 0 }, 0x0, 157, }, - { 196, 2, 1, 0x000000e690000000ull, 0x000001fff0000000ull, { 24, 26, 0, 0, 0 }, 0x0, 158, }, - { 198, 3, 1, 0x00000021c0000000ull, 0x000001eff8000000ull, { 24, 26, 25, 0, 0 }, 0x0, 2207, }, - { 198, 3, 1, 0x00000020c0000000ull, 0x000001eff8000000ull, { 24, 26, 49, 0, 0 }, 0x0, 2208, }, - { 198, 3, 0, 0x0000002188000000ull, 0x000001eff8000000ull, { 26, 49, 0, 0, 0 }, 0x0, 2238, }, - { 199, 2, 1, 0x000000e8b0000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 159, }, - { 200, 2, 1, 0x000000e240000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 160, }, - { 200, 2, 1, 0x000000ee50000000ull, 0x000001fff0000000ull, { 24, 25, 39, 0, 0 }, 0x0, 161, }, - { 201, 2, 1, 0x000000f040000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 162, }, - { 201, 2, 1, 0x000000fc50000000ull, 0x000001fff0000000ull, { 24, 25, 39, 0, 0 }, 0x0, 163, }, - { 202, 1, 1, 0x0000010680000000ull, 0x000001ffe0000000ull, { 24, 25, 41, 26, 0 }, 0x0, 164, }, - { 203, 2, 1, 0x000000e220000000ull, 0x000001fff0000000ull, { 24, 26, 25, 0, 0 }, 0x0, 165, }, - { 203, 2, 1, 0x000000e630000000ull, 0x000001fff0000000ull, { 24, 26, 43, 0, 0 }, 0x0, 166, }, - { 204, 2, 1, 0x000000f020000000ull, 0x000001fff0000000ull, { 24, 26, 25, 0, 0 }, 0x0, 167, }, - { 204, 2, 1, 0x000000f430000000ull, 0x000001fff0000000ull, { 24, 26, 43, 0, 0 }, 0x0, 168, }, - { 205, 1, 1, 0x00000106c0000000ull, 0x000001ffe0000000ull, { 24, 25, 41, 26, 0 }, 0x0, 169, }, - { 206, 1, 1, 0x0000010420000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 170, }, - { 207, 1, 1, 0x0000010620000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 171, }, - { 208, 1, 1, 0x0000011420000000ull, 0x000001fff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 172, }, - { 209, 3, 0, 0x0000002048000000ull, 0x000001eff8000000ull, { 26, 25, 0, 0, 0 }, 0x8, 1175, }, - { 209, 3, 0, 0x0000002050000000ull, 0x000001eff8000000ull, { 26, 25, 0, 0, 0 }, 0xc, 1050, }, - { 209, 3, 0, 0x00000021a0000000ull, 0x000001eff8000000ull, { 26, 0, 0, 0, 0 }, 0x8, 922, }, - { 210, 3, 0, 0x0000002060000000ull, 0x000001eff8000000ull, { 26, 25, 0, 0, 0 }, 0x8, 848, }, - { 215, 4, 0, 0x0000000040000000ull, 0x000001e1f8000000ull, { 0, 0, 0, 0, 0 }, 0x22c, 173, }, - { 216, 3, 0, 0x0000000038000000ull, 0x000001ee78000000ull, { 68, 0, 0, 0, 0 }, 0x8, 174, }, - { 217, 3, 0, 0x0000000028000000ull, 0x000001ee78000000ull, { 68, 0, 0, 0, 0 }, 0x0, 175, }, - { 226, 3, 1, 0x000000c708000000ull, 0x000001ffc8000000ull, { 18, 25, 0, 0, 0 }, 0x0, 2782, }, - { 227, 2, 1, 0x000000a600000000ull, 0x000001ee04000000ull, { 24, 25, 45, 0, 0 }, 0x140, 176, }, - { 227, 2, 1, 0x000000f240000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 177, }, - { 228, 1, 1, 0x0000010080000000ull, 0x000001efe0000000ull, { 24, 25, 40, 26, 0 }, 0x0, 178, }, - { 229, 1, 1, 0x00000100c0000000ull, 0x000001efe0000000ull, { 24, 25, 40, 26, 0 }, 0x0, 179, }, - { 230, 2, 1, 0x000000a400000000ull, 0x000001ee00002000ull, { 24, 26, 77, 0, 0 }, 0x140, 2878, }, - { 230, 2, 1, 0x000000f220000000ull, 0x000001fff0000000ull, { 24, 26, 25, 0, 0 }, 0x0, 181, }, - { 231, 2, 1, 0x000000ac00000000ull, 0x000001ee00000000ull, { 24, 25, 26, 44, 0 }, 0x0, 182, }, - { 236, 3, 0, 0x0000000180000000ull, 0x000001eff8000000ull, { 0, 0, 0, 0, 0 }, 0x0, 850, }, - { 237, 3, 0, 0x0000000030000000ull, 0x000001ee78000000ull, { 68, 0, 0, 0, 0 }, 0x8, 183, }, - { 239, 3, 1, 0x0000008c00000000ull, 0x000001fff8000000ull, { 28, 25, 0, 0, 0 }, 0x0, 184, }, - { 239, 3, 1, 0x000000ac00000000ull, 0x000001eff0000000ull, { 28, 25, 62, 0, 0 }, 0x400, 185, }, - { 240, 3, 1, 0x0000008c08000000ull, 0x000001fff8000000ull, { 28, 25, 1, 0, 0 }, 0x0, 186, }, - { 240, 3, 1, 0x0000008c08000000ull, 0x000001fff8000000ull, { 28, 25, 0, 0, 0 }, 0x40, 187, }, - { 241, 3, 1, 0x0000008c40000000ull, 0x000001fff8000000ull, { 28, 25, 0, 0, 0 }, 0x0, 188, }, - { 241, 3, 1, 0x000000ac40000000ull, 0x000001eff0000000ull, { 28, 25, 62, 0, 0 }, 0x400, 189, }, - { 242, 3, 1, 0x0000008c80000000ull, 0x000001fff8000000ull, { 28, 25, 0, 0, 0 }, 0x0, 190, }, - { 242, 3, 1, 0x000000ac80000000ull, 0x000001eff0000000ull, { 28, 25, 62, 0, 0 }, 0x400, 191, }, - { 243, 3, 1, 0x0000008cc0000000ull, 0x000001fff8000000ull, { 28, 25, 0, 0, 0 }, 0x0, 192, }, - { 243, 3, 1, 0x000000acc0000000ull, 0x000001eff0000000ull, { 28, 25, 62, 0, 0 }, 0x400, 193, }, - { 244, 3, 1, 0x000000cec0000000ull, 0x000001fff8000000ull, { 28, 19, 0, 0, 0 }, 0x0, 2785, }, - { 244, 3, 1, 0x000000eec0000000ull, 0x000001eff0000000ull, { 28, 19, 62, 0, 0 }, 0x400, 2786, }, - { 245, 3, 1, 0x000000cc40000000ull, 0x000001fff8000000ull, { 28, 19, 0, 0, 0 }, 0x0, 194, }, - { 245, 3, 1, 0x000000ec40000000ull, 0x000001eff0000000ull, { 28, 19, 62, 0, 0 }, 0x400, 195, }, - { 246, 3, 1, 0x000000ccc0000000ull, 0x000001fff8000000ull, { 28, 19, 0, 0, 0 }, 0x0, 196, }, - { 246, 3, 1, 0x000000ecc0000000ull, 0x000001eff0000000ull, { 28, 19, 62, 0, 0 }, 0x400, 197, }, - { 247, 3, 1, 0x000000cc00000000ull, 0x000001fff8000000ull, { 28, 19, 0, 0, 0 }, 0x0, 198, }, - { 247, 3, 1, 0x000000ec00000000ull, 0x000001eff0000000ull, { 28, 19, 62, 0, 0 }, 0x400, 199, }, - { 248, 3, 1, 0x000000cc80000000ull, 0x000001fff8000000ull, { 28, 19, 0, 0, 0 }, 0x0, 200, }, - { 248, 3, 1, 0x000000ec80000000ull, 0x000001eff0000000ull, { 28, 19, 62, 0, 0 }, 0x400, 201, }, - { 249, 1, 1, 0x0000010028000000ull, 0x000001eff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 202, }, - { 249, 1, 1, 0x0000010020000000ull, 0x000001eff8000000ull, { 24, 25, 26, 4, 0 }, 0x0, 203, }, - { 249, 1, 1, 0x0000010128000000ull, 0x000001eff8000000ull, { 24, 56, 26, 0, 0 }, 0x0, 204, }, - { 250, 3, 0, 0x0000000020000000ull, 0x000001ee78000000ull, { 68, 0, 0, 0, 0 }, 0x0, 205, }, - { 251, 2, 1, 0x00000000a0000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 206, }, - { 252, 2, 1, 0x00000000a8000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 207, }, - { 253, 2, 1, 0x00000000b0000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 208, }, - { 254, 3, 0, 0x0000000198000000ull, 0x000001eff8000000ull, { 0, 0, 0, 0, 0 }, 0x0, 1150, }, - { 255, 3, 1, 0x00000020f8000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x8, 209, }, - { 256, 2, 2, 0x000000a000000000ull, 0x000001fe00003000ull, { 22, 23, 26, 77, 0 }, 0x0, 3040, }, - { 256, 2, 1, 0x000000a000000000ull, 0x000001fe00003000ull, { 22, 26, 77, 0, 0 }, 0x40, 3041, }, - { 256, 2, 2, 0x000000a000000000ull, 0x000001fe00003000ull, { 23, 22, 26, 77, 0 }, 0x40, 2003, }, - { 256, 2, 1, 0x000000a000000000ull, 0x000001fe00003000ull, { 23, 26, 77, 0, 0 }, 0x40, 2004, }, - { 257, 2, 2, 0x000000a000082000ull, 0x000001fe00083000ull, { 22, 23, 50, 0, 0 }, 0x0, 3044, }, - { 257, 2, 1, 0x000000a000082000ull, 0x000001fe00083000ull, { 22, 50, 0, 0, 0 }, 0x40, 3045, }, - { 257, 2, 2, 0x000000a000082000ull, 0x000001fe00083000ull, { 23, 22, 50, 0, 0 }, 0x40, 2007, }, - { 257, 2, 1, 0x000000a000082000ull, 0x000001fe00083000ull, { 23, 50, 0, 0, 0 }, 0x40, 2008, }, - { 258, 3, 1, 0x00000020d0000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 210, }, - { 259, 2, 2, 0x000000a000002000ull, 0x000001fe00003000ull, { 22, 23, 26, 0, 0 }, 0x0, 3048, }, - { 259, 2, 1, 0x000000a000002000ull, 0x000001fe00003000ull, { 22, 26, 0, 0, 0 }, 0x40, 3049, }, - { 259, 2, 2, 0x000000a000002000ull, 0x000001fe00003000ull, { 23, 22, 26, 0, 0 }, 0x40, 2011, }, - { 259, 2, 1, 0x000000a000002000ull, 0x000001fe00003000ull, { 23, 26, 0, 0, 0 }, 0x40, 2012, }, - { 260, 3, 1, 0x00000020f0000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x8, 211, }, - { 262, 3, 1, 0x00000020d8000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 212, }, - { 266, 2, 1, 0x000000e840000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 1131, }, - { 267, 2, 1, 0x000000ea40000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 1132, }, - { 268, 2, 1, 0x000000f840000000ull, 0x000001fff0000000ull, { 24, 25, 26, 0, 0 }, 0x0, 1133, }, - { 272, 4, 0, 0x00000000c0000000ull, 0x000001e1f8000000ull, { 0, 0, 0, 0, 0 }, 0x28, 223, }, - { 277, 3, 1, 0x0000008208000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x0, 213, }, - { 278, 3, 1, 0x0000008248000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x0, 214, }, - { 279, 3, 1, 0x0000008288000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x0, 215, }, - { 280, 3, 1, 0x00000082c8000000ull, 0x000001fff8000000ull, { 24, 28, 25, 0, 0 }, 0x0, 216, }, - { 282, 5, 1, 0x000001d000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x0, 1179, }, - { 282, 5, 1, 0x000001d000000000ull, 0x000001fc00000000ull, { 18, 20, 21, 19, 0 }, 0x40, 1261, }, - { 283, 5, 1, 0x000001d000000000ull, 0x000001fc000fe000ull, { 18, 20, 21, 0, 0 }, 0x40, 1180, }, - { 284, 1, 1, 0x0000010078000000ull, 0x000001eff8000000ull, { 24, 25, 26, 0, 0 }, 0x0, 217, }, - { 284, 1, 1, 0x0000010178000000ull, 0x000001eff8000000ull, { 24, 56, 26, 0, 0 }, 0x0, 218, }, - { 287, 2, 1, 0x0000000080000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 219, }, - { 288, 2, 1, 0x0000000088000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 220, }, - { 289, 2, 1, 0x0000000090000000ull, 0x000001eff8000000ull, { 24, 26, 0, 0, 0 }, 0x0, 221, }, -}; - -static const char dis_table[] = { -0xa0, 0xc7, 0xc8, 0xa0, 0x2e, 0xd8, 0xa0, 0x2c, 0xc0, 0xa0, 0x1c, 0x00, -0x98, 0xb0, 0x02, 0x50, 0x90, 0x50, 0x90, 0x28, 0x24, 0x39, 0x28, 0x24, -0x39, 0x20, 0x90, 0x28, 0x24, 0x39, 0x18, 0x24, 0x39, 0x10, 0x91, 0x60, -0x90, 0x28, 0x24, 0x39, 0x00, 0x10, 0x10, 0x58, 0x41, 0x61, 0xc7, 0xc0, -0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, -0x10, 0x10, 0x52, 0xc0, 0xc0, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, -0x10, 0x10, 0x10, 0x24, 0x24, 0x70, 0x90, 0x28, 0x24, 0x38, 0xf0, 0x24, -0x38, 0xe8, 0xa8, 0x0b, 0x48, 0x15, 0x20, 0x97, 0x20, 0x95, 0xc8, 0x9a, -0xb8, 0x05, 0x38, 0x91, 0x18, 0x90, 0xa0, 0x90, 0x60, 0x80, 0x90, 0x20, -0x34, 0xa6, 0xa4, 0x25, 0x00, 0x34, 0xa3, 0x80, 0xa4, 0x36, 0xa0, 0x36, -0xd9, 0x90, 0x50, 0x90, 0x28, 0x80, 0x36, 0xcf, 0x80, 0x34, 0x86, 0x81, -0x33, 0xe2, 0x90, 0xe0, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x24, 0x10, 0x34, -0x83, 0xa4, 0x1f, 0x08, 0x34, 0x80, 0x90, 0x38, 0xa4, 0x38, 0xa0, 0x37, -0x1a, 0xa4, 0x38, 0x48, 0x37, 0x0e, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x37, -0x20, 0x36, 0xef, 0xa4, 0x36, 0xf8, 0x36, 0xea, 0x80, 0xa4, 0x23, 0xf0, -0x34, 0x7f, 0x92, 0x18, 0x91, 0xc0, 0x80, 0x91, 0x80, 0x90, 0xf8, 0xdb, -0x84, 0x60, 0xf9, 0x40, 0xc0, 0xc0, 0x80, 0xa4, 0x42, 0x68, 0x8c, 0x43, -0xc8, 0x84, 0x38, 0x83, 0xc0, 0xc0, 0x80, 0xa4, 0x42, 0x58, 0x8c, 0x43, -0xa8, 0x84, 0x38, 0x81, 0xd3, 0x82, 0x40, 0x50, 0xc0, 0xc0, 0x81, 0x38, -0x35, 0x50, 0xc0, 0xc0, 0x81, 0x38, 0x33, 0xa4, 0x1f, 0x18, 0x33, 0xe4, -0x80, 0x90, 0x28, 0x80, 0x33, 0xe0, 0x80, 0x34, 0x88, 0x81, 0x90, 0x38, -0xa4, 0x24, 0x80, 0x34, 0x8b, 0xa4, 0x24, 0x48, 0x34, 0x85, 0xc0, 0x40, -0x10, 0x10, 0x90, 0x38, 0xa4, 0x1e, 0xf0, 0x33, 0xdf, 0xa4, 0x1e, 0xe0, -0x33, 0xdd, 0x18, 0x24, 0x24, 0xf8, 0x83, 0x90, 0xa8, 0xd3, 0x82, 0xc0, -0xc0, 0xc0, 0x80, 0xa4, 0x42, 0x38, 0x38, 0x6d, 0xc0, 0xc0, 0x80, 0xa4, -0x42, 0x28, 0x38, 0x69, 0xd3, 0x82, 0x40, 0x50, 0xc0, 0xc0, 0x81, 0x38, -0x2f, 0x50, 0xc0, 0xc0, 0x81, 0x38, 0x2d, 0x92, 0xb8, 0x99, 0x84, 0x24, -0x68, 0x90, 0x78, 0x90, 0x50, 0x10, 0x10, 0x80, 0xa4, 0x36, 0x98, 0x36, -0xd8, 0x82, 0x36, 0xce, 0x90, 0x80, 0x10, 0x10, 0x90, 0x38, 0xa4, 0x38, -0x98, 0x37, 0x19, 0xa4, 0x38, 0x40, 0x37, 0x0d, 0x80, 0x90, 0x38, 0xa4, -0x37, 0x18, 0x36, 0xee, 0xa4, 0x36, 0xf0, 0x36, 0xe9, 0x83, 0x90, 0xa8, -0xd3, 0x82, 0xc0, 0xc0, 0xc0, 0x80, 0xa4, 0x42, 0x08, 0x38, 0x61, 0xc0, -0xc0, 0x80, 0xa4, 0x41, 0xf8, 0x38, 0x5d, 0xd3, 0x82, 0x40, 0x50, 0xc0, -0xc0, 0x81, 0x38, 0x29, 0x50, 0xc0, 0xc0, 0x81, 0x38, 0x27, 0x18, 0x24, -0x24, 0x78, 0x83, 0x90, 0xa8, 0xd3, 0x82, 0xc0, 0xc0, 0xc0, 0x80, 0xa4, -0x41, 0xd8, 0x38, 0x55, 0xc0, 0xc0, 0x80, 0xa4, 0x41, 0xc8, 0x38, 0x51, -0xd3, 0x82, 0x40, 0x50, 0xc0, 0xc0, 0x81, 0x38, 0x23, 0x50, 0xc0, 0xc0, -0x81, 0x38, 0x21, 0x94, 0x50, 0x92, 0xf8, 0x99, 0x84, 0x1f, 0x48, 0x90, -0x78, 0x90, 0x50, 0x10, 0x10, 0x80, 0xa4, 0x36, 0x90, 0x36, 0xd7, 0x82, -0x36, 0xcd, 0x90, 0x80, 0x10, 0x10, 0x90, 0x38, 0xa4, 0x38, 0x90, 0x37, -0x18, 0xa4, 0x38, 0x38, 0x37, 0x0c, 0x80, 0x90, 0x38, 0xa4, 0x37, 0x10, -0x36, 0xed, 0xa4, 0x36, 0xe8, 0x36, 0xe8, 0x83, 0x90, 0xe8, 0xd3, 0x83, -0xc0, 0xc0, 0xc0, 0x80, 0xa4, 0x42, 0x78, 0x8c, 0x43, 0xe8, 0x84, 0x38, -0x85, 0xc0, 0xc0, 0x80, 0xa4, 0x42, 0x60, 0x8c, 0x43, 0xb8, 0x84, 0x38, -0x82, 0xd3, 0x82, 0x40, 0x50, 0xc0, 0xc0, 0x81, 0x38, 0x37, 0x50, 0xc0, -0xc0, 0x81, 0x38, 0x34, 0x18, 0x24, 0x1f, 0x40, 0x83, 0x90, 0xa8, 0xd3, -0x82, 0xc0, 0xc0, 0xc0, 0x80, 0xa4, 0x42, 0x48, 0x38, 0x71, 0xc0, 0xc0, -0x80, 0xa4, 0x42, 0x30, 0x38, 0x6b, 0xd3, 0x82, 0x40, 0x50, 0xc0, 0xc0, -0x81, 0x38, 0x31, 0x50, 0xc0, 0xc0, 0x81, 0x38, 0x2e, 0x92, 0xb8, 0x99, -0x84, 0x1f, 0x38, 0x90, 0x78, 0x90, 0x50, 0x10, 0x10, 0x80, 0xa4, 0x36, -0x88, 0x36, 0xd6, 0x82, 0x36, 0xcc, 0x90, 0x80, 0x10, 0x10, 0x90, 0x38, -0xa4, 0x38, 0x88, 0x37, 0x17, 0xa4, 0x38, 0x30, 0x37, 0x0b, 0x80, 0x90, -0x38, 0xa4, 0x37, 0x08, 0x36, 0xec, 0xa4, 0x36, 0xe0, 0x36, 0xe7, 0x83, -0x90, 0xa8, 0xd3, 0x82, 0xc0, 0xc0, 0xc0, 0x80, 0xa4, 0x42, 0x18, 0x38, -0x65, 0xc0, 0xc0, 0x80, 0xa4, 0x42, 0x00, 0x38, 0x5f, 0xd3, 0x82, 0x40, -0x50, 0xc0, 0xc0, 0x81, 0x38, 0x2b, 0x50, 0xc0, 0xc0, 0x81, 0x38, 0x28, -0x18, 0x20, 0x01, 0x48, 0x83, 0x90, 0xa8, 0xd3, 0x82, 0xc0, 0xc0, 0xc0, -0x80, 0xa4, 0x41, 0xe8, 0x38, 0x59, 0xc0, 0xc0, 0x80, 0xa4, 0x41, 0xd0, -0x38, 0x53, 0xd3, 0x82, 0x40, 0x50, 0xc0, 0xc0, 0x81, 0x38, 0x25, 0x50, -0xc0, 0xc0, 0x81, 0x38, 0x22, 0xda, 0x06, 0xe0, 0xf9, 0x80, 0x90, 0x60, -0x90, 0x38, 0xa4, 0x24, 0xe8, 0x34, 0x9b, 0x80, 0x34, 0x98, 0x90, 0x38, -0xa4, 0x24, 0x90, 0x34, 0x96, 0x80, 0x34, 0x93, 0x90, 0x60, 0x90, 0x38, -0xa4, 0x24, 0xd0, 0x34, 0x9c, 0x80, 0x34, 0x99, 0x90, 0x38, 0xa4, 0x24, -0xa8, 0x34, 0x97, 0x80, 0x34, 0x94, 0xc8, 0x40, 0x19, 0x00, 0x91, 0x58, -0x90, 0x60, 0x82, 0x90, 0x20, 0x36, 0xcb, 0xa4, 0x36, 0x48, 0x36, 0xca, -0x90, 0xc0, 0x80, 0x90, 0x90, 0x90, 0x48, 0xc9, 0xe1, 0xc1, 0x00, 0x85, -0x37, 0x03, 0xc9, 0xe1, 0xc0, 0x40, 0x85, 0x37, 0x00, 0x80, 0x36, 0xff, -0x10, 0x10, 0x81, 0x36, 0xdb, 0x90, 0xa8, 0x10, 0x10, 0x90, 0x28, 0x81, -0x36, 0xf9, 0x90, 0x38, 0xa4, 0x37, 0xa0, 0x36, 0xf5, 0xa4, 0x37, 0x90, -0x36, 0xf3, 0x90, 0x70, 0x10, 0x10, 0x90, 0x38, 0xa4, 0x37, 0xb8, 0x36, -0xf8, 0x80, 0x36, 0xf6, 0x90, 0x60, 0x90, 0x28, 0x24, 0x37, 0xf0, 0xa4, -0x37, 0xe0, 0x36, 0xfd, 0x80, 0xa4, 0x37, 0xd0, 0x36, 0xfb, 0x80, 0x90, -0xf8, 0x90, 0x90, 0x90, 0x50, 0x90, 0x28, 0x80, 0x38, 0x17, 0x80, 0x38, -0x20, 0x80, 0xa4, 0x40, 0xf0, 0x38, 0x1f, 0x90, 0x28, 0x81, 0x38, 0x1d, -0x80, 0xa4, 0x40, 0xd8, 0x38, 0x1c, 0x90, 0x28, 0x82, 0x38, 0x1a, 0x81, -0xa4, 0x40, 0xc0, 0x38, 0x19, 0x98, 0xe8, 0x01, 0xb0, 0x90, 0x88, 0x90, -0x60, 0xa4, 0x36, 0x38, 0x10, 0x10, 0x10, 0x10, 0x83, 0x33, 0xb7, 0x24, -0x36, 0x30, 0x90, 0x28, 0x24, 0x36, 0x28, 0x24, 0x36, 0x20, 0x90, 0x88, -0x90, 0x60, 0xa4, 0x36, 0x10, 0x10, 0x10, 0x10, 0x10, 0x83, 0x33, 0xb6, -0x24, 0x36, 0x08, 0x90, 0x28, 0x24, 0x36, 0x00, 0x24, 0x35, 0xf8, 0xa8, -0x09, 0x00, 0x0e, 0x20, 0x96, 0x48, 0x95, 0xe8, 0x93, 0x38, 0x91, 0xa0, -0x90, 0xd0, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x1e, 0x60, 0x33, 0xcd, 0xa4, -0x1e, 0x50, 0x33, 0xcb, 0x90, 0x38, 0xa4, 0x1e, 0x40, 0x33, 0xc9, 0x80, -0x33, 0xc7, 0x90, 0x60, 0x90, 0x28, 0x24, 0x1e, 0x00, 0xa4, 0x1d, 0xf0, -0x33, 0xbf, 0x90, 0x38, 0xa4, 0x1d, 0xe0, 0x33, 0xbd, 0xa4, 0x1e, 0x28, -0x33, 0xc6, 0x90, 0xe0, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x1e, 0x18, 0x33, -0xc4, 0xa4, 0x1e, 0x08, 0x33, 0xc2, 0x90, 0x38, 0xa4, 0x35, 0xb0, 0x36, -0xbc, 0xa4, 0x35, 0x50, 0x36, 0xb0, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x32, -0x90, 0x36, 0x5e, 0xa4, 0x32, 0x60, 0x36, 0x58, 0x10, 0x10, 0xa4, 0x1d, -0xd0, 0x33, 0xbb, 0x99, 0x60, 0x02, 0x70, 0x90, 0x90, 0x90, 0x50, 0x90, -0x28, 0x24, 0x1e, 0x90, 0x80, 0x33, 0xda, 0x80, 0xa4, 0x1e, 0x98, 0x33, -0xd8, 0x90, 0x50, 0x90, 0x28, 0x24, 0x1e, 0xa0, 0x80, 0x33, 0xdb, 0x90, -0x38, 0xa4, 0x1e, 0xa8, 0x33, 0xd9, 0xa4, 0x1e, 0x70, 0x33, 0xcf, 0x90, -0xe0, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x34, 0xe8, 0x36, 0xa5, 0xa4, 0x34, -0x48, 0x36, 0x92, 0x90, 0x38, 0xa4, 0x33, 0xe0, 0x36, 0x83, 0xa4, 0x33, -0x50, 0x36, 0x72, 0x81, 0xa4, 0x1e, 0x80, 0x33, 0xd1, 0xe4, 0xa2, 0x04, -0x40, 0x38, 0x13, 0x18, 0x24, 0x1d, 0xc8, 0xe4, 0xe2, 0x02, 0xc0, 0x38, -0x0d, 0x92, 0x40, 0x91, 0x08, 0x10, 0x10, 0x90, 0x80, 0x10, 0x10, 0x90, -0x38, 0xa4, 0x35, 0xa8, 0x36, 0xbb, 0xa4, 0x35, 0x48, 0x36, 0xaf, 0x80, -0x90, 0x38, 0xa4, 0x32, 0x88, 0x36, 0x5d, 0xa4, 0x32, 0x58, 0x36, 0x57, -0x18, 0x20, 0x00, 0xf8, 0x80, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x34, 0xd8, -0x36, 0xa4, 0xa4, 0x34, 0x40, 0x36, 0x90, 0x90, 0x38, 0xa4, 0x33, 0xd0, -0x36, 0x82, 0xa4, 0x33, 0x48, 0x36, 0x70, 0xe4, 0xa2, 0x01, 0x40, 0x38, -0x07, 0x18, 0x24, 0x1d, 0xc0, 0xe4, 0xe1, 0xff, 0xc0, 0x38, 0x01, 0x92, -0x90, 0x92, 0x40, 0x91, 0x08, 0x10, 0x10, 0x90, 0x80, 0x10, 0x10, 0x90, -0x38, 0xa4, 0x35, 0xa0, 0x36, 0xba, 0xa4, 0x35, 0x40, 0x36, 0xae, 0x80, -0x90, 0x38, 0xa4, 0x32, 0x80, 0x36, 0x5c, 0xa4, 0x32, 0x50, 0x36, 0x56, -0x18, 0x20, 0x00, 0xf8, 0x80, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x34, 0xc8, -0x36, 0xa3, 0xa4, 0x34, 0x38, 0x36, 0x8e, 0x90, 0x38, 0xa4, 0x33, 0xc0, -0x36, 0x81, 0xa4, 0x33, 0x40, 0x36, 0x6e, 0xe4, 0xa2, 0x04, 0x80, 0x38, -0x15, 0x10, 0x10, 0xe4, 0xe2, 0x03, 0x00, 0x38, 0x0f, 0x92, 0x50, 0x99, -0x1c, 0x1e, 0xb0, 0x10, 0x10, 0x90, 0x80, 0x10, 0x10, 0x90, 0x38, 0xa4, -0x35, 0x98, 0x36, 0xb9, 0xa4, 0x35, 0x38, 0x36, 0xad, 0x80, 0x90, 0x38, -0xa4, 0x32, 0x78, 0x36, 0x5b, 0xa4, 0x32, 0x48, 0x36, 0x55, 0x18, 0x20, -0x00, 0xf8, 0x80, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x34, 0xb8, 0x36, 0xa2, -0xa4, 0x34, 0x30, 0x36, 0x8c, 0x90, 0x38, 0xa4, 0x33, 0xb0, 0x36, 0x80, -0xa4, 0x33, 0x38, 0x36, 0x6c, 0xe4, 0xa2, 0x01, 0x80, 0x38, 0x09, 0x10, -0x10, 0xe4, 0xe2, 0x00, 0x00, 0x38, 0x03, 0xc0, 0x40, 0x80, 0x10, 0x10, -0x81, 0x90, 0x90, 0x90, 0x48, 0xc9, 0xe1, 0x98, 0x80, 0x85, 0x36, 0x66, -0xc9, 0xe1, 0x99, 0x00, 0x85, 0x36, 0x63, 0x80, 0x36, 0x61, 0x80, 0xd8, -0x47, 0x80, 0x0d, 0xc0, 0xc0, 0x80, 0x10, 0x10, 0x82, 0x90, 0x58, 0xd5, -0x81, 0x80, 0x80, 0x37, 0xfd, 0x80, 0x37, 0xfb, 0xd5, 0x81, 0x80, 0x80, -0x37, 0xf9, 0x80, 0x37, 0xf7, 0xc0, 0x80, 0x10, 0x10, 0x82, 0x90, 0x58, -0xd5, 0x81, 0x80, 0x80, 0x37, 0xfe, 0x80, 0x37, 0xfc, 0xd5, 0x81, 0x80, -0x80, 0x37, 0xfa, 0x80, 0x37, 0xf8, 0xc0, 0x80, 0x83, 0xa4, 0x3f, 0xa8, -0x37, 0xf6, 0xa0, 0x59, 0x60, 0xa0, 0x41, 0xe0, 0xa8, 0x1e, 0xb0, 0x34, -0x88, 0xa0, 0x12, 0x38, 0xa0, 0x0b, 0x48, 0x96, 0x00, 0x9a, 0xf0, 0x05, -0xc0, 0x91, 0x70, 0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x15, 0x58, -0x33, 0xb5, 0xa4, 0x15, 0x78, 0x33, 0xb4, 0x10, 0x10, 0xa4, 0x15, 0x68, -0x33, 0xb3, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x14, 0xf8, 0x33, 0x9a, 0xa4, -0x15, 0x18, 0x33, 0x99, 0x10, 0x10, 0xa4, 0x15, 0x08, 0x33, 0x98, 0x90, -0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x14, 0x98, 0x33, 0x7f, 0xa4, 0x14, -0xb8, 0x33, 0x7e, 0x10, 0x10, 0xa4, 0x14, 0xa8, 0x33, 0x7d, 0x90, 0x70, -0x90, 0x38, 0xa4, 0x14, 0x38, 0x33, 0x63, 0xa4, 0x14, 0x58, 0x33, 0x62, -0x10, 0x10, 0xa4, 0x14, 0x48, 0x33, 0x61, 0x91, 0x70, 0x90, 0xb8, 0x90, -0x70, 0x90, 0x38, 0xa4, 0x15, 0x28, 0x33, 0xb0, 0xa4, 0x15, 0x48, 0x33, -0xb2, 0x10, 0x10, 0xa4, 0x15, 0x38, 0x33, 0xb1, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x14, 0xc8, 0x33, 0x95, 0xa4, 0x14, 0xe8, 0x33, 0x97, 0x10, 0x10, -0xa4, 0x14, 0xd8, 0x33, 0x96, 0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, -0x14, 0x68, 0x33, 0x7a, 0xa4, 0x14, 0x88, 0x33, 0x7c, 0x10, 0x10, 0xa4, -0x14, 0x78, 0x33, 0x7b, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x14, 0x08, 0x33, -0x5e, 0xa4, 0x14, 0x28, 0x33, 0x60, 0x10, 0x10, 0xa4, 0x14, 0x18, 0x33, -0x5f, 0xe4, 0xe1, 0x8b, 0x40, 0x36, 0x41, 0x9a, 0xf0, 0x05, 0x00, 0x91, -0x70, 0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x13, 0xa0, 0x33, 0xad, -0xa4, 0x13, 0x98, 0x33, 0xaf, 0x10, 0x10, 0xa4, 0x13, 0x90, 0x33, 0xae, -0x90, 0x70, 0x90, 0x38, 0xa4, 0x13, 0x88, 0x33, 0x92, 0xa4, 0x13, 0x80, -0x33, 0x94, 0x10, 0x10, 0xa4, 0x13, 0x78, 0x33, 0x93, 0x90, 0xb8, 0x90, -0x70, 0x90, 0x38, 0xa4, 0x13, 0x70, 0x33, 0x77, 0xa4, 0x13, 0x68, 0x33, -0x79, 0x10, 0x10, 0xa4, 0x13, 0x60, 0x33, 0x78, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x13, 0x58, 0x33, 0x5b, 0xa4, 0x13, 0x50, 0x33, 0x5d, 0x10, 0x10, -0xa4, 0x13, 0x48, 0x33, 0x5c, 0x91, 0x10, 0x90, 0x88, 0x90, 0x50, 0x90, -0x28, 0x80, 0x33, 0xaa, 0x80, 0x33, 0xac, 0x10, 0x10, 0x80, 0x33, 0xab, -0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x8f, 0x80, 0x33, 0x91, 0x10, 0x10, -0x80, 0x33, 0x90, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x74, -0x80, 0x33, 0x76, 0x10, 0x10, 0x80, 0x33, 0x75, 0x90, 0x50, 0x90, 0x28, -0x80, 0x33, 0x58, 0x80, 0x33, 0x5a, 0x10, 0x10, 0x80, 0x33, 0x59, 0xe4, -0xe1, 0x66, 0x40, 0x35, 0xc1, 0x95, 0x40, 0x9a, 0x90, 0x05, 0x00, 0x91, -0x10, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0xa7, 0x80, 0x33, -0xa9, 0x10, 0x10, 0x80, 0x33, 0xa8, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, -0x8c, 0x80, 0x33, 0x8e, 0x10, 0x10, 0x80, 0x33, 0x8d, 0x90, 0xb8, 0x90, -0x70, 0x90, 0x38, 0xa4, 0x13, 0x30, 0x33, 0x71, 0xa4, 0x13, 0x40, 0x33, -0x73, 0x10, 0x10, 0xa4, 0x13, 0x38, 0x33, 0x72, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x13, 0x00, 0x33, 0x55, 0xa4, 0x13, 0x10, 0x33, 0x57, 0x10, 0x10, -0xa4, 0x13, 0x08, 0x33, 0x56, 0x91, 0x10, 0x90, 0x88, 0x90, 0x50, 0x90, -0x28, 0x80, 0x33, 0xa4, 0x80, 0x33, 0xa6, 0x10, 0x10, 0x80, 0x33, 0xa5, -0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x89, 0x80, 0x33, 0x8b, 0x10, 0x10, -0x80, 0x33, 0x8a, 0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x13, 0x18, -0x33, 0x6e, 0xa4, 0x13, 0x28, 0x33, 0x70, 0x10, 0x10, 0xa4, 0x13, 0x20, -0x33, 0x6f, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x12, 0xe8, 0x33, 0x52, 0xa4, -0x12, 0xf8, 0x33, 0x54, 0x10, 0x10, 0xa4, 0x12, 0xf0, 0x33, 0x53, 0xe4, -0xe1, 0x8a, 0x40, 0x36, 0x3d, 0x98, 0xb8, 0x01, 0x68, 0x10, 0x10, 0x10, -0x10, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x4f, 0x80, 0x33, 0x51, 0x10, -0x10, 0x80, 0x33, 0x50, 0x90, 0x60, 0x90, 0x30, 0x60, 0xa0, 0x97, 0x00, -0x60, 0xa0, 0x96, 0xc0, 0x90, 0x30, 0x60, 0xa0, 0x96, 0x80, 0x60, 0xa0, -0x96, 0x40, 0xe4, 0xe1, 0x64, 0x40, 0x35, 0xb9, 0xa0, 0x08, 0x08, 0x94, -0xe0, 0x9a, 0x60, 0x04, 0xa0, 0x91, 0x40, 0x90, 0xb8, 0x90, 0x70, 0x90, -0x38, 0xa4, 0x13, 0xd8, 0x33, 0x9e, 0xa4, 0x13, 0xf8, 0x33, 0xa3, 0x10, -0x10, 0xa4, 0x13, 0xe8, 0x33, 0xa2, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, -0x83, 0x80, 0x33, 0x88, 0x10, 0x10, 0x80, 0x33, 0x87, 0x90, 0x88, 0x90, -0x50, 0x90, 0x28, 0x80, 0x33, 0x68, 0x80, 0x33, 0x6d, 0x10, 0x10, 0x80, -0x33, 0x6c, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x49, 0x80, 0x33, 0x4e, -0x10, 0x10, 0x80, 0x33, 0x4d, 0x91, 0x40, 0x90, 0xb8, 0x90, 0x70, 0x90, -0x38, 0xa4, 0x13, 0xa8, 0x33, 0x9b, 0xa4, 0x13, 0xc8, 0x33, 0x9d, 0x10, -0x10, 0xa4, 0x13, 0xb8, 0x33, 0x9c, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, -0x80, 0x80, 0x33, 0x82, 0x10, 0x10, 0x80, 0x33, 0x81, 0x90, 0x88, 0x90, -0x50, 0x90, 0x28, 0x80, 0x33, 0x65, 0x80, 0x33, 0x67, 0x10, 0x10, 0x80, -0x33, 0x66, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x46, 0x80, 0x33, 0x48, -0x10, 0x10, 0x80, 0x33, 0x47, 0xe4, 0xe1, 0x89, 0x40, 0x36, 0x39, 0x9a, -0x60, 0x02, 0xe0, 0x91, 0x40, 0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, -0x1a, 0x20, 0x33, 0x9f, 0xa4, 0x1a, 0x10, 0x33, 0xa1, 0x10, 0x10, 0xa4, -0x1a, 0x00, 0x33, 0xa0, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x84, 0x80, -0x33, 0x86, 0x10, 0x10, 0x80, 0x33, 0x85, 0x90, 0x88, 0x90, 0x50, 0x90, -0x28, 0x80, 0x33, 0x69, 0x80, 0x33, 0x6b, 0x10, 0x10, 0x80, 0x33, 0x6a, -0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x4a, 0x80, 0x33, 0x4c, 0x10, 0x10, -0x80, 0x33, 0x4b, 0x81, 0x90, 0x50, 0x90, 0x28, 0x24, 0x19, 0xd0, 0x24, -0x19, 0xf0, 0x10, 0x10, 0x24, 0x19, 0xe0, 0xe4, 0xe1, 0x62, 0x40, 0x35, -0xb1, 0x93, 0x90, 0x99, 0xb8, 0x03, 0x50, 0x90, 0xe8, 0x90, 0x88, 0x90, -0x40, 0x80, 0xa4, 0x15, 0xb8, 0x32, 0xca, 0x10, 0x10, 0xa4, 0x15, 0xa8, -0x32, 0xc9, 0x90, 0x28, 0x81, 0x32, 0xc6, 0x10, 0x10, 0x80, 0x32, 0xc5, -0x90, 0x60, 0x90, 0x28, 0x81, 0x32, 0xc2, 0x10, 0x10, 0x80, 0x32, 0xc1, -0x90, 0x28, 0x81, 0x32, 0xbe, 0x10, 0x10, 0x80, 0x32, 0xbd, 0x90, 0xe8, -0x90, 0x88, 0x90, 0x40, 0x80, 0xa4, 0x15, 0x88, 0x32, 0xc7, 0x10, 0x10, -0xa4, 0x15, 0x98, 0x32, 0xc8, 0x90, 0x28, 0x81, 0x32, 0xc3, 0x10, 0x10, -0x80, 0x32, 0xc4, 0x90, 0x60, 0x90, 0x28, 0x81, 0x32, 0xbf, 0x10, 0x10, -0x80, 0x32, 0xc0, 0x90, 0x28, 0x81, 0x32, 0xbb, 0x10, 0x10, 0x80, 0x32, -0xbc, 0xe4, 0xe1, 0x88, 0x40, 0x36, 0x35, 0x88, 0x00, 0x88, 0x10, 0x10, -0x10, 0x10, 0x90, 0x28, 0x81, 0x32, 0xb9, 0x10, 0x10, 0x80, 0x32, 0xba, -0xe4, 0xe1, 0x60, 0x40, 0x35, 0xa9, 0xa0, 0x0e, 0x80, 0xa0, 0x09, 0x08, -0x94, 0x80, 0x9a, 0x30, 0x04, 0x40, 0x91, 0x10, 0x90, 0x88, 0x90, 0x50, -0x90, 0x28, 0x80, 0x33, 0x39, 0x80, 0x33, 0x38, 0x10, 0x10, 0x80, 0x33, -0x37, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x1e, 0x80, 0x33, 0x1d, 0x10, -0x10, 0x80, 0x33, 0x1c, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, -0x03, 0x80, 0x33, 0x02, 0x10, 0x10, 0x80, 0x33, 0x01, 0x90, 0x50, 0x90, -0x28, 0x80, 0x32, 0xe8, 0x80, 0x32, 0xe7, 0x10, 0x10, 0x80, 0x32, 0xe6, -0x91, 0x10, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x34, 0x80, -0x33, 0x36, 0x10, 0x10, 0x80, 0x33, 0x35, 0x90, 0x50, 0x90, 0x28, 0x80, -0x33, 0x19, 0x80, 0x33, 0x1b, 0x10, 0x10, 0x80, 0x33, 0x1a, 0x90, 0x88, -0x90, 0x50, 0x90, 0x28, 0x80, 0x32, 0xfe, 0x80, 0x33, 0x00, 0x10, 0x10, -0x80, 0x32, 0xff, 0x90, 0x50, 0x90, 0x28, 0x80, 0x32, 0xe3, 0x80, 0x32, -0xe5, 0x10, 0x10, 0x80, 0x32, 0xe4, 0xe4, 0xe1, 0x7a, 0x40, 0x36, 0x11, -0x9a, 0x30, 0x04, 0x40, 0x91, 0x10, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, -0x80, 0x33, 0x31, 0x80, 0x33, 0x33, 0x10, 0x10, 0x80, 0x33, 0x32, 0x90, -0x50, 0x90, 0x28, 0x80, 0x33, 0x16, 0x80, 0x33, 0x18, 0x10, 0x10, 0x80, -0x33, 0x17, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x32, 0xfb, 0x80, -0x32, 0xfd, 0x10, 0x10, 0x80, 0x32, 0xfc, 0x90, 0x50, 0x90, 0x28, 0x80, -0x32, 0xe0, 0x80, 0x32, 0xe2, 0x10, 0x10, 0x80, 0x32, 0xe1, 0x91, 0x10, -0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x2e, 0x80, 0x33, 0x30, -0x10, 0x10, 0x80, 0x33, 0x2f, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x13, -0x80, 0x33, 0x15, 0x10, 0x10, 0x80, 0x33, 0x14, 0x90, 0x88, 0x90, 0x50, -0x90, 0x28, 0x80, 0x32, 0xf8, 0x80, 0x32, 0xfa, 0x10, 0x10, 0x80, 0x32, -0xf9, 0x90, 0x50, 0x90, 0x28, 0x80, 0x32, 0xdd, 0x80, 0x32, 0xdf, 0x10, -0x10, 0x80, 0x32, 0xde, 0xe4, 0xe1, 0x59, 0x40, 0x35, 0x79, 0x94, 0x80, -0x9a, 0x30, 0x04, 0x40, 0x91, 0x10, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, -0x80, 0x33, 0x2b, 0x80, 0x33, 0x2d, 0x10, 0x10, 0x80, 0x33, 0x2c, 0x90, -0x50, 0x90, 0x28, 0x80, 0x33, 0x10, 0x80, 0x33, 0x12, 0x10, 0x10, 0x80, -0x33, 0x11, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x32, 0xf5, 0x80, -0x32, 0xf7, 0x10, 0x10, 0x80, 0x32, 0xf6, 0x90, 0x50, 0x90, 0x28, 0x80, -0x32, 0xda, 0x80, 0x32, 0xdc, 0x10, 0x10, 0x80, 0x32, 0xdb, 0x91, 0x10, -0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x28, 0x80, 0x33, 0x2a, -0x10, 0x10, 0x80, 0x33, 0x29, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x0d, -0x80, 0x33, 0x0f, 0x10, 0x10, 0x80, 0x33, 0x0e, 0x90, 0x88, 0x90, 0x50, -0x90, 0x28, 0x80, 0x32, 0xf2, 0x80, 0x32, 0xf4, 0x10, 0x10, 0x80, 0x32, -0xf3, 0x90, 0x50, 0x90, 0x28, 0x80, 0x32, 0xd7, 0x80, 0x32, 0xd9, 0x10, -0x10, 0x80, 0x32, 0xd8, 0xe4, 0xe1, 0x78, 0x40, 0x36, 0x09, 0x88, 0x00, -0xb0, 0x10, 0x10, 0x10, 0x10, 0x90, 0x50, 0x90, 0x28, 0x80, 0x32, 0xd4, -0x80, 0x32, 0xd6, 0x10, 0x10, 0x80, 0x32, 0xd5, 0xe4, 0xe1, 0x58, 0x40, -0x35, 0x75, 0x96, 0xe8, 0x94, 0x80, 0x9a, 0x30, 0x04, 0x40, 0x91, 0x10, -0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x22, 0x80, 0x33, 0x27, -0x10, 0x10, 0x80, 0x33, 0x26, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x07, -0x80, 0x33, 0x0c, 0x10, 0x10, 0x80, 0x33, 0x0b, 0x90, 0x88, 0x90, 0x50, -0x90, 0x28, 0x80, 0x32, 0xec, 0x80, 0x32, 0xf1, 0x10, 0x10, 0x80, 0x32, -0xf0, 0x90, 0x50, 0x90, 0x28, 0x80, 0x32, 0xce, 0x80, 0x32, 0xd3, 0x10, -0x10, 0x80, 0x32, 0xd2, 0x91, 0x10, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, -0x80, 0x33, 0x1f, 0x80, 0x33, 0x21, 0x10, 0x10, 0x80, 0x33, 0x20, 0x90, -0x50, 0x90, 0x28, 0x80, 0x33, 0x04, 0x80, 0x33, 0x06, 0x10, 0x10, 0x80, -0x33, 0x05, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x32, 0xe9, 0x80, -0x32, 0xeb, 0x10, 0x10, 0x80, 0x32, 0xea, 0x90, 0x50, 0x90, 0x28, 0x80, -0x32, 0xcb, 0x80, 0x32, 0xcd, 0x10, 0x10, 0x80, 0x32, 0xcc, 0xe4, 0xe1, -0x76, 0x40, 0x36, 0x01, 0x88, 0x02, 0x28, 0x91, 0x10, 0x90, 0x88, 0x90, -0x50, 0x90, 0x28, 0x80, 0x33, 0x23, 0x80, 0x33, 0x25, 0x10, 0x10, 0x80, -0x33, 0x24, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0x08, 0x80, 0x33, 0x0a, -0x10, 0x10, 0x80, 0x33, 0x09, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, -0x32, 0xed, 0x80, 0x32, 0xef, 0x10, 0x10, 0x80, 0x32, 0xee, 0x90, 0x50, -0x90, 0x28, 0x80, 0x32, 0xcf, 0x80, 0x32, 0xd1, 0x10, 0x10, 0x80, 0x32, -0xd0, 0xe4, 0xe1, 0x57, 0x40, 0x35, 0x71, 0x90, 0x40, 0xe5, 0x21, 0x74, -0x40, 0x35, 0xf9, 0xe5, 0x21, 0x56, 0x40, 0x35, 0x6d, 0x9e, 0xb4, 0x23, -0xe8, 0x93, 0x70, 0x91, 0xd8, 0xd5, 0x07, 0x80, 0xd0, 0xc4, 0x40, 0x90, -0x48, 0x80, 0x8c, 0x3f, 0x38, 0x84, 0x37, 0xf1, 0xa4, 0x3d, 0x18, 0x37, -0xbb, 0x90, 0x28, 0x24, 0x3c, 0x58, 0xa4, 0x3a, 0xd8, 0x37, 0x73, 0xd0, -0xc4, 0x40, 0x90, 0x48, 0x80, 0x8c, 0x3f, 0x18, 0x84, 0x37, 0xef, 0xa4, -0x3d, 0x08, 0x37, 0xb9, 0x90, 0x28, 0x24, 0x3c, 0x48, 0xa4, 0x3a, 0xc8, -0x37, 0x71, 0xd5, 0x06, 0x80, 0xd0, 0xc3, 0x40, 0x90, 0x28, 0x80, 0x37, -0xdb, 0xa4, 0x3c, 0xe8, 0x37, 0xb5, 0x90, 0x28, 0x24, 0x3c, 0x28, 0xa4, -0x3a, 0xa8, 0x37, 0x6d, 0xd0, 0xc3, 0x40, 0x90, 0x28, 0x80, 0x37, 0xd7, -0xa4, 0x3c, 0xd8, 0x37, 0xb3, 0x90, 0x28, 0x24, 0x3c, 0x18, 0xa4, 0x3a, -0x98, 0x37, 0x6b, 0x91, 0x98, 0xd5, 0x06, 0x80, 0xd0, 0xc3, 0x40, 0x90, -0x28, 0x80, 0x37, 0xcf, 0xa4, 0x3c, 0xb8, 0x37, 0xaf, 0x90, 0x28, 0x24, -0x3b, 0xf8, 0xa4, 0x3a, 0x78, 0x37, 0x67, 0xd0, 0xc3, 0x40, 0x90, 0x28, -0x80, 0x37, 0xcb, 0xa4, 0x3c, 0xa8, 0x37, 0xad, 0x90, 0x28, 0x24, 0x3b, -0xe8, 0xa4, 0x3a, 0x68, 0x37, 0x65, 0xd5, 0x06, 0x80, 0xd0, 0xc3, 0x40, -0x90, 0x28, 0x80, 0x37, 0xc3, 0xa4, 0x3c, 0x88, 0x37, 0xa9, 0x90, 0x28, -0x24, 0x3b, 0xc8, 0xa4, 0x3a, 0x48, 0x37, 0x61, 0xd0, 0xc3, 0x40, 0x90, -0x28, 0x80, 0x37, 0xbf, 0xa4, 0x3c, 0x78, 0x37, 0xa7, 0x90, 0x28, 0x24, -0x3b, 0xb8, 0xa4, 0x3a, 0x38, 0x37, 0x5f, 0x93, 0x70, 0x91, 0xd8, 0xd5, -0x07, 0x80, 0xd0, 0xc4, 0x40, 0x90, 0x48, 0x80, 0x8c, 0x3f, 0x58, 0x84, -0x37, 0xf3, 0xa4, 0x3d, 0x28, 0x37, 0xbd, 0x90, 0x28, 0x24, 0x3c, 0x68, -0xa4, 0x3a, 0xe8, 0x37, 0x75, 0xd0, 0xc4, 0x40, 0x90, 0x48, 0x80, 0x8c, -0x3f, 0x28, 0x84, 0x37, 0xf0, 0xa4, 0x3d, 0x10, 0x37, 0xba, 0x90, 0x28, -0x24, 0x3c, 0x50, 0xa4, 0x3a, 0xd0, 0x37, 0x72, 0xd5, 0x06, 0x80, 0xd0, -0xc3, 0x40, 0x90, 0x28, 0x80, 0x37, 0xdf, 0xa4, 0x3c, 0xf8, 0x37, 0xb7, -0x90, 0x28, 0x24, 0x3c, 0x38, 0xa4, 0x3a, 0xb8, 0x37, 0x6f, 0xd0, 0xc3, -0x40, 0x90, 0x28, 0x80, 0x37, 0xd9, 0xa4, 0x3c, 0xe0, 0x37, 0xb4, 0x90, -0x28, 0x24, 0x3c, 0x20, 0xa4, 0x3a, 0xa0, 0x37, 0x6c, 0x91, 0x98, 0xd5, -0x06, 0x80, 0xd0, 0xc3, 0x40, 0x90, 0x28, 0x80, 0x37, 0xd3, 0xa4, 0x3c, -0xc8, 0x37, 0xb1, 0x90, 0x28, 0x24, 0x3c, 0x08, 0xa4, 0x3a, 0x88, 0x37, -0x69, 0xd0, 0xc3, 0x40, 0x90, 0x28, 0x80, 0x37, 0xcd, 0xa4, 0x3c, 0xb0, -0x37, 0xae, 0x90, 0x28, 0x24, 0x3b, 0xf0, 0xa4, 0x3a, 0x70, 0x37, 0x66, -0xd5, 0x06, 0x80, 0xd0, 0xc3, 0x40, 0x90, 0x28, 0x80, 0x37, 0xc7, 0xa4, -0x3c, 0x98, 0x37, 0xab, 0x90, 0x28, 0x24, 0x3b, 0xd8, 0xa4, 0x3a, 0x58, -0x37, 0x63, 0xd0, 0xc3, 0x40, 0x90, 0x28, 0x80, 0x37, 0xc1, 0xa4, 0x3c, -0x80, 0x37, 0xa8, 0x90, 0x28, 0x24, 0x3b, 0xc0, 0xa4, 0x3a, 0x40, 0x37, -0x60, 0x99, 0xd8, 0x03, 0x90, 0x81, 0x90, 0xe0, 0x5b, 0x41, 0x40, 0x03, -0x40, 0x51, 0x40, 0xc0, 0xa4, 0x23, 0x80, 0x34, 0x60, 0xd1, 0x42, 0x00, -0xa4, 0x22, 0x80, 0x34, 0x40, 0xa4, 0x21, 0x80, 0x34, 0x20, 0x5b, 0x41, -0x40, 0x03, 0x40, 0x51, 0x40, 0xc0, 0xa4, 0x22, 0xa0, 0x34, 0x64, 0xd1, -0x42, 0x00, 0xa4, 0x21, 0xa0, 0x34, 0x44, 0xa4, 0x20, 0xa0, 0x34, 0x24, -0x81, 0x90, 0xe0, 0x5b, 0x41, 0x40, 0x03, 0x40, 0x51, 0x40, 0xc0, 0xa4, -0x22, 0xe0, 0x34, 0x6c, 0xd1, 0x42, 0x00, 0xa4, 0x21, 0xe0, 0x34, 0x4c, -0xa4, 0x20, 0xe0, 0x34, 0x2c, 0x5b, 0x41, 0x40, 0x03, 0x40, 0x51, 0x40, -0xc0, 0xa4, 0x22, 0xc0, 0x34, 0x68, 0xd1, 0x42, 0x00, 0xa4, 0x21, 0xc0, -0x34, 0x48, 0xa4, 0x20, 0xc0, 0x34, 0x28, 0xa8, 0x0b, 0x18, 0x13, 0xa8, -0x96, 0x80, 0x93, 0x40, 0x99, 0x90, 0x03, 0x00, 0x90, 0xc0, 0x90, 0x60, -0x90, 0x38, 0xa4, 0x12, 0xb8, 0x32, 0x58, 0x24, 0x12, 0xb0, 0x90, 0x38, -0xa4, 0x11, 0xe0, 0x32, 0x3d, 0x24, 0x11, 0xd8, 0x90, 0x60, 0x90, 0x38, -0xa4, 0x11, 0x08, 0x32, 0x22, 0x24, 0x11, 0x00, 0x90, 0x38, 0xa4, 0x10, -0x30, 0x32, 0x07, 0x24, 0x10, 0x28, 0x90, 0xc0, 0x90, 0x60, 0x90, 0x38, -0xa4, 0x12, 0xa8, 0x32, 0x53, 0x24, 0x12, 0xa0, 0x90, 0x38, 0xa4, 0x11, -0xd0, 0x32, 0x38, 0x24, 0x11, 0xc8, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x10, -0xf8, 0x32, 0x1d, 0x24, 0x10, 0xf0, 0x90, 0x38, 0xa4, 0x10, 0x20, 0x32, -0x02, 0x24, 0x10, 0x18, 0xe4, 0xe1, 0xd0, 0x40, 0x37, 0x43, 0x99, 0x90, -0x03, 0x00, 0x90, 0xc0, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x12, 0x90, 0x32, -0x50, 0x24, 0x12, 0x88, 0x90, 0x38, 0xa4, 0x11, 0xb8, 0x32, 0x35, 0x24, -0x11, 0xb0, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x10, 0xe0, 0x32, 0x1a, 0x24, -0x10, 0xd8, 0x90, 0x38, 0xa4, 0x10, 0x08, 0x31, 0xff, 0x24, 0x10, 0x00, -0x90, 0xc0, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x12, 0x78, 0x32, 0x4d, 0x24, -0x12, 0x70, 0x90, 0x38, 0xa4, 0x11, 0xa0, 0x32, 0x32, 0x24, 0x11, 0x98, -0x90, 0x60, 0x90, 0x38, 0xa4, 0x10, 0xc8, 0x32, 0x17, 0x24, 0x10, 0xc0, -0x90, 0x38, 0xa4, 0x0f, 0xf0, 0x31, 0xfc, 0x24, 0x0f, 0xe8, 0xe4, 0xe1, -0xce, 0xc0, 0x37, 0x3d, 0x93, 0x78, 0x99, 0x90, 0x03, 0x00, 0x90, 0xc0, -0x90, 0x60, 0x90, 0x38, 0xa4, 0x12, 0x60, 0x32, 0x4a, 0x24, 0x12, 0x58, -0x90, 0x38, 0xa4, 0x11, 0x88, 0x32, 0x2f, 0x24, 0x11, 0x80, 0x90, 0x60, -0x90, 0x38, 0xa4, 0x10, 0xb0, 0x32, 0x14, 0x24, 0x10, 0xa8, 0x90, 0x38, -0xa4, 0x0f, 0xd8, 0x31, 0xf9, 0x24, 0x0f, 0xd0, 0x90, 0xc0, 0x90, 0x60, -0x90, 0x38, 0xa4, 0x12, 0x48, 0x32, 0x47, 0x24, 0x12, 0x40, 0x90, 0x38, -0xa4, 0x11, 0x70, 0x32, 0x2c, 0x24, 0x11, 0x68, 0x90, 0x60, 0x90, 0x38, -0xa4, 0x10, 0x98, 0x32, 0x11, 0x24, 0x10, 0x90, 0x90, 0x38, 0xa4, 0x0f, -0xc0, 0x31, 0xf6, 0x24, 0x0f, 0xb8, 0xec, 0xa1, 0x1e, 0x00, 0x02, 0x00, -0x34, 0x7a, 0xa4, 0x39, 0xa8, 0x37, 0x37, 0x88, 0x00, 0x88, 0x10, 0x10, -0x10, 0x10, 0x90, 0x38, 0xa4, 0x0f, 0xa8, 0x31, 0xf3, 0x24, 0x0f, 0xa0, -0xe9, 0x61, 0x1d, 0x40, 0x02, 0x00, 0x34, 0x76, 0xe3, 0x61, 0xcb, 0xc0, -0x37, 0x31, 0x95, 0x08, 0x93, 0x40, 0x99, 0x90, 0x03, 0x00, 0x90, 0xc0, -0x90, 0x60, 0x90, 0x38, 0xa4, 0x12, 0x30, 0x32, 0x41, 0x24, 0x12, 0x28, -0x90, 0x38, 0xa4, 0x11, 0x58, 0x32, 0x26, 0x24, 0x11, 0x50, 0x90, 0x60, -0x90, 0x38, 0xa4, 0x10, 0x80, 0x32, 0x0b, 0x24, 0x10, 0x78, 0x90, 0x38, -0xa4, 0x0f, 0x90, 0x31, 0xed, 0x24, 0x0f, 0x88, 0x90, 0xc0, 0x90, 0x60, -0x90, 0x38, 0xa4, 0x12, 0x00, 0x32, 0x3e, 0x24, 0x11, 0xf8, 0x90, 0x38, -0xa4, 0x11, 0x28, 0x32, 0x23, 0x24, 0x11, 0x20, 0x90, 0x60, 0x90, 0x38, -0xa4, 0x10, 0x50, 0x32, 0x08, 0x24, 0x10, 0x48, 0x90, 0x38, 0xa4, 0x0f, -0x60, 0x31, 0xea, 0x24, 0x0f, 0x58, 0xe4, 0xe1, 0xd0, 0x80, 0x37, 0x45, -0x88, 0x01, 0x88, 0x90, 0xc0, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x12, 0x20, -0x32, 0x42, 0x24, 0x12, 0x18, 0x90, 0x38, 0xa4, 0x11, 0x48, 0x32, 0x27, -0x24, 0x11, 0x40, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x10, 0x70, 0x32, 0x0c, -0x24, 0x10, 0x68, 0x90, 0x38, 0xa4, 0x0f, 0x80, 0x31, 0xee, 0x24, 0x0f, -0x78, 0xe4, 0xe1, 0xcf, 0x00, 0x37, 0x3f, 0x92, 0xd0, 0x99, 0x50, 0x02, -0x80, 0x90, 0xa0, 0x90, 0x50, 0x90, 0x28, 0x80, 0x31, 0xe9, 0x24, 0x0f, -0x40, 0x90, 0x28, 0x80, 0x31, 0xe5, 0x24, 0x0f, 0x20, 0x90, 0x50, 0x90, -0x28, 0x80, 0x31, 0xe1, 0x24, 0x0f, 0x00, 0x90, 0x28, 0x80, 0x31, 0xdd, -0x24, 0x0e, 0xe0, 0x90, 0xa0, 0x90, 0x50, 0x90, 0x28, 0x80, 0x31, 0xe6, -0x24, 0x0f, 0x38, 0x90, 0x28, 0x80, 0x31, 0xe2, 0x24, 0x0f, 0x18, 0x90, -0x50, 0x90, 0x28, 0x80, 0x31, 0xde, 0x24, 0x0e, 0xf8, 0x90, 0x28, 0x80, -0x31, 0xda, 0x24, 0x0e, 0xd8, 0xec, 0xe1, 0xcd, 0xa1, 0x1f, 0x00, 0x37, -0x39, 0x88, 0x00, 0x78, 0x10, 0x10, 0x10, 0x10, 0x90, 0x28, 0x80, 0x31, -0xd8, 0x24, 0x0e, 0xc8, 0xec, 0xe1, 0xcc, 0x21, 0x1d, 0x00, 0x37, 0x33, -0xe5, 0xa1, 0x55, 0x40, 0x35, 0x51, 0xa0, 0x2a, 0x10, 0xa8, 0x16, 0x60, -0x29, 0xd8, 0xa0, 0x0c, 0x48, 0xa0, 0x0a, 0xc8, 0x95, 0x60, 0x92, 0xb0, -0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x31, 0xa1, 0x80, -0x31, 0xa0, 0x10, 0x10, 0x80, 0x31, 0x9f, 0x90, 0x70, 0x90, 0x38, 0xa4, -0x08, 0x98, 0x31, 0xb3, 0xa4, 0x08, 0x90, 0x31, 0xb2, 0x10, 0x10, 0xa4, -0x08, 0x88, 0x31, 0xb1, 0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x09, -0xb8, 0x31, 0xd7, 0xa4, 0x09, 0xb0, 0x31, 0xd6, 0x10, 0x10, 0xa4, 0x09, -0xa8, 0x31, 0xd5, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x09, 0x28, 0x31, 0xc5, -0xa4, 0x09, 0x20, 0x31, 0xc4, 0x10, 0x10, 0xa4, 0x09, 0x18, 0x31, 0xc3, -0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x31, 0x9c, 0x80, -0x31, 0x9e, 0x10, 0x10, 0x80, 0x31, 0x9d, 0x90, 0x70, 0x90, 0x38, 0xa4, -0x08, 0x70, 0x31, 0xae, 0xa4, 0x08, 0x80, 0x31, 0xb0, 0x10, 0x10, 0xa4, -0x08, 0x78, 0x31, 0xaf, 0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x09, -0x90, 0x31, 0xd2, 0xa4, 0x09, 0xa0, 0x31, 0xd4, 0x10, 0x10, 0xa4, 0x09, -0x98, 0x31, 0xd3, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x09, 0x00, 0x31, 0xc0, -0xa4, 0x09, 0x10, 0x31, 0xc2, 0x10, 0x10, 0xa4, 0x09, 0x08, 0x31, 0xc1, -0x92, 0xb0, 0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x31, -0x99, 0x80, 0x31, 0x9b, 0x10, 0x10, 0x80, 0x31, 0x9a, 0x90, 0x70, 0x90, -0x38, 0xa4, 0x08, 0x58, 0x31, 0xab, 0xa4, 0x08, 0x68, 0x31, 0xad, 0x10, -0x10, 0xa4, 0x08, 0x60, 0x31, 0xac, 0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x09, 0x78, 0x31, 0xcf, 0xa4, 0x09, 0x88, 0x31, 0xd1, 0x10, 0x10, -0xa4, 0x09, 0x80, 0x31, 0xd0, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x08, 0xe8, -0x31, 0xbd, 0xa4, 0x08, 0xf8, 0x31, 0xbf, 0x10, 0x10, 0xa4, 0x08, 0xf0, -0x31, 0xbe, 0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, 0x31, -0x96, 0x80, 0x31, 0x98, 0x10, 0x10, 0x80, 0x31, 0x97, 0x90, 0x70, 0x90, -0x38, 0xa4, 0x08, 0x40, 0x31, 0xa8, 0xa4, 0x08, 0x50, 0x31, 0xaa, 0x10, -0x10, 0xa4, 0x08, 0x48, 0x31, 0xa9, 0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x09, 0x60, 0x31, 0xcc, 0xa4, 0x09, 0x70, 0x31, 0xce, 0x10, 0x10, -0xa4, 0x09, 0x68, 0x31, 0xcd, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x08, 0xd0, -0x31, 0xba, 0xa4, 0x08, 0xe0, 0x31, 0xbc, 0x10, 0x10, 0xa4, 0x08, 0xd8, -0x31, 0xbb, 0x10, 0x10, 0x90, 0xa8, 0x10, 0x10, 0x10, 0x10, 0x90, 0x50, -0x90, 0x28, 0x80, 0x31, 0x8d, 0x80, 0x31, 0x8f, 0x10, 0x10, 0x80, 0x31, -0x8e, 0x90, 0x60, 0x90, 0x30, 0x60, 0xa0, 0x2a, 0xc0, 0x60, 0xa0, 0x2a, -0x80, 0x90, 0x30, 0x60, 0xa0, 0x2a, 0x40, 0x60, 0xa0, 0x2a, 0x00, 0x97, -0xf0, 0x95, 0x60, 0x92, 0xb0, 0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, -0x28, 0x80, 0x31, 0x93, 0x80, 0x31, 0x95, 0x10, 0x10, 0x80, 0x31, 0x94, -0x90, 0x70, 0x90, 0x38, 0xa4, 0x08, 0x28, 0x31, 0xa5, 0xa4, 0x08, 0x38, -0x31, 0xa7, 0x10, 0x10, 0xa4, 0x08, 0x30, 0x31, 0xa6, 0x90, 0xb8, 0x90, -0x70, 0x90, 0x38, 0xa4, 0x09, 0x48, 0x31, 0xc9, 0xa4, 0x09, 0x58, 0x31, -0xcb, 0x10, 0x10, 0xa4, 0x09, 0x50, 0x31, 0xca, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x08, 0xb8, 0x31, 0xb7, 0xa4, 0x08, 0xc8, 0x31, 0xb9, 0x10, 0x10, -0xa4, 0x08, 0xc0, 0x31, 0xb8, 0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, -0x28, 0x80, 0x31, 0x90, 0x80, 0x31, 0x92, 0x10, 0x10, 0x80, 0x31, 0x91, -0x90, 0x70, 0x90, 0x38, 0xa4, 0x08, 0x10, 0x31, 0xa2, 0xa4, 0x08, 0x20, -0x31, 0xa4, 0x10, 0x10, 0xa4, 0x08, 0x18, 0x31, 0xa3, 0x90, 0xb8, 0x90, -0x70, 0x90, 0x38, 0xa4, 0x09, 0x30, 0x31, 0xc6, 0xa4, 0x09, 0x40, 0x31, -0xc8, 0x10, 0x10, 0xa4, 0x09, 0x38, 0x31, 0xc7, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x08, 0xa0, 0x31, 0xb4, 0xa4, 0x08, 0xb0, 0x31, 0xb6, 0x10, 0x10, -0xa4, 0x08, 0xa8, 0x31, 0xb5, 0x10, 0x10, 0x91, 0x40, 0x90, 0xa0, 0x90, -0x50, 0x90, 0x28, 0x80, 0x30, 0xcb, 0x80, 0x30, 0xca, 0x90, 0x28, 0x80, -0x30, 0xc9, 0x80, 0x30, 0xc8, 0x90, 0x50, 0x90, 0x28, 0x80, 0x30, 0xc4, -0x80, 0x30, 0xc7, 0x90, 0x28, 0x80, 0x30, 0xc6, 0x80, 0x30, 0xc5, 0x90, -0xa0, 0x90, 0x50, 0x90, 0x28, 0x80, 0x30, 0xbc, 0x80, 0x30, 0xc3, 0x90, -0x28, 0x80, 0x30, 0xc2, 0x80, 0x30, 0xc1, 0x90, 0x50, 0x90, 0x28, 0x80, -0x30, 0xbd, 0x80, 0x30, 0xc0, 0x90, 0x28, 0x80, 0x30, 0xbf, 0x80, 0x30, -0xbe, 0x91, 0x88, 0x80, 0x90, 0xc0, 0x90, 0x60, 0x90, 0x28, 0x81, 0x31, -0x3b, 0x10, 0x10, 0x80, 0x31, 0x3a, 0x90, 0x28, 0x81, 0x31, 0x3d, 0x10, -0x10, 0x80, 0x31, 0x3c, 0x90, 0x60, 0x90, 0x28, 0x81, 0x31, 0x41, 0x10, -0x10, 0x80, 0x31, 0x40, 0x90, 0x28, 0x81, 0x31, 0x3f, 0x10, 0x10, 0x80, -0x31, 0x3e, 0x80, 0x10, 0x10, 0x10, 0x10, 0x90, 0x28, 0x81, 0x31, 0x38, -0x10, 0x10, 0x80, 0x31, 0x39, 0xa0, 0x0b, 0x90, 0xa0, 0x0a, 0xc8, 0x95, -0x60, 0x92, 0xb0, 0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, -0x31, 0x56, 0x80, 0x31, 0x55, 0x10, 0x10, 0x80, 0x31, 0x54, 0x90, 0x70, -0x90, 0x38, 0xa4, 0x06, 0xe8, 0x31, 0x68, 0xa4, 0x06, 0xe0, 0x31, 0x67, -0x10, 0x10, 0xa4, 0x06, 0xd8, 0x31, 0x66, 0x90, 0xb8, 0x90, 0x70, 0x90, -0x38, 0xa4, 0x08, 0x08, 0x31, 0x8c, 0xa4, 0x08, 0x00, 0x31, 0x8b, 0x10, -0x10, 0xa4, 0x07, 0xf8, 0x31, 0x8a, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x07, -0x78, 0x31, 0x7a, 0xa4, 0x07, 0x70, 0x31, 0x79, 0x10, 0x10, 0xa4, 0x07, -0x68, 0x31, 0x78, 0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, 0x28, 0x80, -0x31, 0x51, 0x80, 0x31, 0x53, 0x10, 0x10, 0x80, 0x31, 0x52, 0x90, 0x70, -0x90, 0x38, 0xa4, 0x06, 0xc0, 0x31, 0x63, 0xa4, 0x06, 0xd0, 0x31, 0x65, -0x10, 0x10, 0xa4, 0x06, 0xc8, 0x31, 0x64, 0x90, 0xb8, 0x90, 0x70, 0x90, -0x38, 0xa4, 0x07, 0xe0, 0x31, 0x87, 0xa4, 0x07, 0xf0, 0x31, 0x89, 0x10, -0x10, 0xa4, 0x07, 0xe8, 0x31, 0x88, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x07, -0x50, 0x31, 0x75, 0xa4, 0x07, 0x60, 0x31, 0x77, 0x10, 0x10, 0xa4, 0x07, -0x58, 0x31, 0x76, 0x92, 0xb0, 0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, -0x28, 0x80, 0x31, 0x4e, 0x80, 0x31, 0x50, 0x10, 0x10, 0x80, 0x31, 0x4f, -0x90, 0x70, 0x90, 0x38, 0xa4, 0x06, 0xa8, 0x31, 0x60, 0xa4, 0x06, 0xb8, -0x31, 0x62, 0x10, 0x10, 0xa4, 0x06, 0xb0, 0x31, 0x61, 0x90, 0xb8, 0x90, -0x70, 0x90, 0x38, 0xa4, 0x07, 0xc8, 0x31, 0x84, 0xa4, 0x07, 0xd8, 0x31, -0x86, 0x10, 0x10, 0xa4, 0x07, 0xd0, 0x31, 0x85, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x07, 0x38, 0x31, 0x72, 0xa4, 0x07, 0x48, 0x31, 0x74, 0x10, 0x10, -0xa4, 0x07, 0x40, 0x31, 0x73, 0x91, 0x40, 0x90, 0x88, 0x90, 0x50, 0x90, -0x28, 0x80, 0x31, 0x4b, 0x80, 0x31, 0x4d, 0x10, 0x10, 0x80, 0x31, 0x4c, -0x90, 0x70, 0x90, 0x38, 0xa4, 0x06, 0x90, 0x31, 0x5d, 0xa4, 0x06, 0xa0, -0x31, 0x5f, 0x10, 0x10, 0xa4, 0x06, 0x98, 0x31, 0x5e, 0x90, 0xb8, 0x90, -0x70, 0x90, 0x38, 0xa4, 0x07, 0xb0, 0x31, 0x81, 0xa4, 0x07, 0xc0, 0x31, -0x83, 0x10, 0x10, 0xa4, 0x07, 0xb8, 0x31, 0x82, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x07, 0x20, 0x31, 0x6f, 0xa4, 0x07, 0x30, 0x31, 0x71, 0x10, 0x10, -0xa4, 0x07, 0x28, 0x31, 0x70, 0x10, 0x10, 0x80, 0x10, 0x10, 0x10, 0x10, -0x90, 0x50, 0x90, 0x28, 0x80, 0x31, 0x42, 0x80, 0x31, 0x44, 0x10, 0x10, -0x80, 0x31, 0x43, 0x80, 0x95, 0x60, 0x92, 0xb0, 0x91, 0x40, 0x90, 0x88, -0x90, 0x50, 0x90, 0x28, 0x80, 0x31, 0x48, 0x80, 0x31, 0x4a, 0x10, 0x10, -0x80, 0x31, 0x49, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x06, 0x78, 0x31, 0x5a, -0xa4, 0x06, 0x88, 0x31, 0x5c, 0x10, 0x10, 0xa4, 0x06, 0x80, 0x31, 0x5b, -0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x07, 0x98, 0x31, 0x7e, 0xa4, -0x07, 0xa8, 0x31, 0x80, 0x10, 0x10, 0xa4, 0x07, 0xa0, 0x31, 0x7f, 0x90, -0x70, 0x90, 0x38, 0xa4, 0x07, 0x08, 0x31, 0x6c, 0xa4, 0x07, 0x18, 0x31, -0x6e, 0x10, 0x10, 0xa4, 0x07, 0x10, 0x31, 0x6d, 0x91, 0x40, 0x90, 0x88, -0x90, 0x50, 0x90, 0x28, 0x80, 0x31, 0x45, 0x80, 0x31, 0x47, 0x10, 0x10, -0x80, 0x31, 0x46, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x06, 0x60, 0x31, 0x57, -0xa4, 0x06, 0x70, 0x31, 0x59, 0x10, 0x10, 0xa4, 0x06, 0x68, 0x31, 0x58, -0x90, 0xb8, 0x90, 0x70, 0x90, 0x38, 0xa4, 0x07, 0x80, 0x31, 0x7b, 0xa4, -0x07, 0x90, 0x31, 0x7d, 0x10, 0x10, 0xa4, 0x07, 0x88, 0x31, 0x7c, 0x90, -0x70, 0x90, 0x38, 0xa4, 0x06, 0xf0, 0x31, 0x69, 0xa4, 0x07, 0x00, 0x31, -0x6b, 0x10, 0x10, 0xa4, 0x06, 0xf8, 0x31, 0x6a, 0x10, 0x10, 0x91, 0x40, -0x90, 0xa0, 0x90, 0x50, 0x90, 0x28, 0x80, 0x30, 0xbb, 0x80, 0x30, 0xba, -0x90, 0x28, 0x80, 0x30, 0xb9, 0x80, 0x30, 0xb8, 0x90, 0x50, 0x90, 0x28, -0x80, 0x30, 0xb4, 0x80, 0x30, 0xb7, 0x90, 0x28, 0x80, 0x30, 0xb6, 0x80, -0x30, 0xb5, 0x90, 0xa0, 0x90, 0x50, 0x90, 0x28, 0x80, 0x30, 0xac, 0x80, -0x30, 0xb3, 0x90, 0x28, 0x80, 0x30, 0xb2, 0x80, 0x30, 0xb1, 0x90, 0x50, -0x90, 0x28, 0x80, 0x30, 0xad, 0x80, 0x30, 0xb0, 0x90, 0x28, 0x80, 0x30, -0xaf, 0x80, 0x30, 0xae, 0xc3, 0xc0, 0x30, 0x42, 0x9c, 0xe8, 0x07, 0x60, -0x91, 0x90, 0x90, 0xf0, 0x10, 0x10, 0x80, 0x88, 0x00, 0x80, 0x90, 0x50, -0x90, 0x28, 0x80, 0x33, 0xf8, 0x80, 0x33, 0xf9, 0x81, 0x33, 0xef, 0xd0, -0x41, 0x80, 0x24, 0x20, 0x90, 0x24, 0x20, 0x98, 0x10, 0x10, 0x80, 0x90, -0x58, 0x80, 0x90, 0x28, 0x24, 0x1f, 0x90, 0x24, 0x1f, 0x98, 0x81, 0x24, -0x1f, 0x50, 0x92, 0x68, 0x91, 0x00, 0x80, 0x90, 0x90, 0x90, 0x30, 0x80, -0x24, 0x20, 0x00, 0x90, 0x38, 0xa4, 0x1f, 0xf8, 0x34, 0x06, 0x80, 0x34, -0x05, 0x80, 0x90, 0x28, 0x80, 0x34, 0x0f, 0xa4, 0x1f, 0xe0, 0x34, 0x0e, -0x80, 0x90, 0xc0, 0x90, 0x60, 0x90, 0x28, 0x80, 0x34, 0x09, 0xa4, 0x1f, -0xf0, 0x34, 0x08, 0x90, 0x28, 0x80, 0x34, 0x04, 0xa4, 0x1f, 0xe8, 0x34, -0x03, 0x90, 0x50, 0x90, 0x28, 0x80, 0x34, 0x0d, 0x80, 0x34, 0x0c, 0x90, -0x28, 0x24, 0x20, 0x88, 0x24, 0x20, 0x80, 0x90, 0x58, 0x80, 0x10, 0x10, -0x80, 0x10, 0x10, 0x80, 0x33, 0xfb, 0x80, 0x90, 0x40, 0x10, 0x10, 0x80, -0x24, 0x1f, 0x60, 0x80, 0x10, 0x10, 0x80, 0x33, 0xfa, 0x91, 0x58, 0x91, -0x00, 0x90, 0x80, 0x81, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, 0xf6, 0x80, -0x33, 0xf7, 0x81, 0x33, 0xee, 0x81, 0x90, 0x50, 0x90, 0x28, 0x80, 0x33, -0xf4, 0x80, 0x33, 0xf5, 0x81, 0x33, 0xed, 0x83, 0x90, 0x28, 0x24, 0x1f, -0x80, 0x24, 0x1f, 0x88, 0x90, 0xe8, 0x81, 0x90, 0x88, 0x90, 0x38, 0x10, -0x10, 0x80, 0x34, 0x07, 0x90, 0x28, 0x80, 0x34, 0x02, 0x80, 0x34, 0x01, -0x80, 0x90, 0x28, 0x80, 0x34, 0x0b, 0x80, 0x34, 0x0a, 0x82, 0x10, 0x10, -0x80, 0x24, 0x1f, 0x58, 0x97, 0x10, 0x9e, 0x10, 0x06, 0x98, 0x93, 0x00, -0x91, 0x80, 0x90, 0xc0, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x03, 0x80, 0x30, -0x71, 0x24, 0x03, 0x78, 0x90, 0x38, 0xa4, 0x04, 0x10, 0x30, 0x83, 0x24, -0x04, 0x08, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x05, 0x30, 0x30, 0xa7, 0x24, -0x05, 0x28, 0x90, 0x38, 0xa4, 0x04, 0xa0, 0x30, 0x95, 0x24, 0x04, 0x98, -0x90, 0xc0, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x03, 0x70, 0x30, 0x6c, 0x24, -0x03, 0x68, 0x90, 0x38, 0xa4, 0x04, 0x00, 0x30, 0x7e, 0x24, 0x03, 0xf8, -0x90, 0x60, 0x90, 0x38, 0xa4, 0x05, 0x20, 0x30, 0xa2, 0x24, 0x05, 0x18, -0x90, 0x38, 0xa4, 0x04, 0x90, 0x30, 0x90, 0x24, 0x04, 0x88, 0x91, 0x80, -0x90, 0xc0, 0x90, 0x60, 0x90, 0x38, 0xa4, 0x03, 0x58, 0x30, 0x69, 0x24, -0x03, 0x50, 0x90, 0x38, 0xa4, 0x03, 0xe8, 0x30, 0x7b, 0x24, 0x03, 0xe0, -0x90, 0x60, 0x90, 0x38, 0xa4, 0x05, 0x08, 0x30, 0x9f, 0x24, 0x05, 0x00, -0x90, 0x38, 0xa4, 0x04, 0x78, 0x30, 0x8d, 0x24, 0x04, 0x70, 0x90, 0xc0, -0x90, 0x60, 0x90, 0x38, 0xa4, 0x03, 0x40, 0x30, 0x66, 0x24, 0x03, 0x38, -0x90, 0x38, 0xa4, 0x03, 0xd0, 0x30, 0x78, 0x24, 0x03, 0xc8, 0x90, 0x60, -0x90, 0x38, 0xa4, 0x04, 0xf0, 0x30, 0x9c, 0x24, 0x04, 0xe8, 0x90, 0x38, -0xa4, 0x04, 0x60, 0x30, 0x8a, 0x24, 0x04, 0x58, 0x10, 0x10, 0x80, 0x10, -0x10, 0x10, 0x10, 0x90, 0x38, 0xa4, 0x02, 0xf8, 0x30, 0x5d, 0x24, 0x02, -0xf0, 0xd7, 0x42, 0x00, 0xa4, 0x39, 0x58, 0x37, 0x2d, 0xa4, 0x39, 0x38, -0x37, 0x29, 0x9c, 0xe0, 0x06, 0x90, 0x93, 0x00, 0x91, 0x80, 0x90, 0xc0, -0x90, 0x60, 0x90, 0x38, 0xa4, 0x03, 0x28, 0x30, 0x63, 0x24, 0x03, 0x20, -0x90, 0x38, 0xa4, 0x03, 0xb8, 0x30, 0x75, 0x24, 0x03, 0xb0, 0x90, 0x60, -0x90, 0x38, 0xa4, 0x04, 0xd8, 0x30, 0x99, 0x24, 0x04, 0xd0, 0x90, 0x38, -0xa4, 0x04, 0x48, 0x30, 0x87, 0x24, 0x04, 0x40, 0x90, 0xc0, 0x90, 0x60, -0x90, 0x38, 0xa4, 0x03, 0x10, 0x30, 0x60, 0x24, 0x03, 0x08, 0x90, 0x38, -0xa4, 0x03, 0xa0, 0x30, 0x72, 0x24, 0x03, 0x98, 0x90, 0x60, 0x90, 0x38, -0xa4, 0x04, 0xc0, 0x30, 0x96, 0x24, 0x04, 0xb8, 0x90, 0x38, 0xa4, 0x04, -0x30, 0x30, 0x84, 0x24, 0x04, 0x28, 0x10, 0x10, 0x90, 0xe0, 0x90, 0x70, -0x90, 0x38, 0xa4, 0x02, 0x88, 0x30, 0x52, 0xa4, 0x02, 0x78, 0x30, 0x50, -0x90, 0x38, 0xa4, 0x02, 0x70, 0x30, 0x4b, 0xa4, 0x02, 0x60, 0x30, 0x4d, -0x90, 0x70, 0x90, 0x38, 0xa4, 0x02, 0x50, 0x30, 0x43, 0xa4, 0x02, 0x40, -0x30, 0x49, 0x90, 0x38, 0xa4, 0x02, 0x38, 0x30, 0x44, 0xa4, 0x02, 0x28, -0x30, 0x46, 0x91, 0x48, 0x80, 0x90, 0xa0, 0x90, 0x50, 0x90, 0x28, 0x80, -0x30, 0x56, 0x24, 0x02, 0xa8, 0x90, 0x28, 0x80, 0x30, 0x58, 0x24, 0x02, -0xb8, 0x90, 0x50, 0x90, 0x28, 0x80, 0x30, 0x5c, 0x24, 0x02, 0xd8, 0x90, -0x28, 0x80, 0x30, 0x5a, 0x24, 0x02, 0xc8, 0x80, 0x10, 0x10, 0x10, 0x10, -0x90, 0x28, 0x80, 0x30, 0x53, 0x24, 0x02, 0xa0, 0xd7, 0x42, 0x00, 0xa4, -0x39, 0x60, 0x37, 0x2e, 0xa4, 0x39, 0x40, 0x37, 0x2a, 0xa0, 0x14, 0x68, -0xa0, 0x10, 0x90, 0xa0, 0x0c, 0x60, 0x9e, 0x88, 0x09, 0xd0, 0x94, 0xf0, -0x90, 0xb0, 0x88, 0x00, 0x68, 0x84, 0x10, 0x10, 0xc9, 0xe1, 0x4c, 0x40, -0x85, 0x35, 0x4d, 0xcb, 0x61, 0x45, 0x00, 0x85, 0x35, 0x23, 0x9a, 0x00, -0x03, 0xf8, 0x91, 0x98, 0x80, 0x91, 0x10, 0x90, 0xa0, 0x90, 0x68, 0x90, -0x20, 0x3a, 0x75, 0xc9, 0xe2, 0x9c, 0xc0, 0x85, 0x35, 0x4b, 0xa4, 0x53, -0x88, 0x3a, 0x72, 0x90, 0x38, 0xa4, 0x53, 0x50, 0x3a, 0x6b, 0xa4, 0x53, -0x40, 0x3a, 0x69, 0x90, 0x48, 0x10, 0x10, 0xa4, 0x53, 0x08, 0x3a, 0x62, -0x10, 0x10, 0x80, 0x3a, 0x5e, 0x81, 0x10, 0x10, 0x80, 0xa4, 0x52, 0xd8, -0x3a, 0x5c, 0x91, 0xb0, 0x91, 0x60, 0x90, 0xe0, 0x90, 0x70, 0x90, 0x38, -0xa4, 0x53, 0x78, 0x3a, 0x70, 0xa4, 0x53, 0x68, 0x3a, 0x6e, 0x90, 0x38, -0xa4, 0x53, 0x30, 0x3a, 0x67, 0xa4, 0x53, 0x20, 0x3a, 0x65, 0x90, 0x48, -0x10, 0x10, 0xa4, 0x52, 0xf8, 0x3a, 0x60, 0x10, 0x10, 0x80, 0x3a, 0x5d, -0x90, 0x28, 0x80, 0x3a, 0x56, 0x80, 0x3a, 0x55, 0x81, 0x10, 0x10, 0x80, -0xa4, 0x52, 0xc8, 0x3a, 0x5a, 0xcb, 0x61, 0x44, 0xc0, 0x85, 0x35, 0x22, -0x90, 0xd8, 0x88, 0x00, 0x90, 0x84, 0x90, 0x38, 0xc1, 0xc0, 0x85, 0x3a, -0x78, 0xc9, 0xe1, 0x4c, 0x00, 0x85, 0x35, 0x49, 0xcb, 0x61, 0x44, 0x80, -0x85, 0x35, 0x21, 0x88, 0x00, 0x68, 0x84, 0x10, 0x10, 0xc9, 0xe1, 0x4b, -0xc0, 0x85, 0x35, 0x47, 0xcb, 0x61, 0x44, 0x40, 0x85, 0x35, 0x20, 0x91, -0xf8, 0x90, 0xb0, 0x88, 0x00, 0x68, 0x84, 0x10, 0x10, 0xc9, 0xe1, 0x4b, -0x40, 0x85, 0x35, 0x43, 0xcb, 0x61, 0x43, 0xc0, 0x85, 0x35, 0x1e, 0x88, -0x01, 0x00, 0x90, 0xa0, 0x81, 0x90, 0x70, 0x80, 0x90, 0x20, 0x3a, 0x6c, -0xc9, 0xe1, 0x4b, 0x00, 0x85, 0x35, 0x41, 0x81, 0x3a, 0x63, 0x81, 0x10, -0x10, 0x80, 0xa4, 0x52, 0xb8, 0x3a, 0x58, 0xcb, 0x61, 0x43, 0x80, 0x85, -0x35, 0x1d, 0x90, 0xb0, 0x88, 0x00, 0x68, 0x84, 0x10, 0x10, 0xc9, 0xe1, -0x4a, 0xc0, 0x85, 0x35, 0x3f, 0xcb, 0x61, 0x43, 0x40, 0x85, 0x35, 0x1c, -0x88, 0x00, 0x68, 0x84, 0x10, 0x10, 0xc9, 0xe1, 0x4a, 0x80, 0x85, 0x35, -0x3d, 0xcb, 0x61, 0x43, 0x00, 0x85, 0x35, 0x1b, 0x92, 0x38, 0x81, 0x91, -0x68, 0x91, 0x18, 0x90, 0x80, 0x90, 0x40, 0x80, 0xa4, 0x54, 0x38, 0x3a, -0x88, 0x80, 0xa4, 0x54, 0x30, 0x3a, 0x85, 0x90, 0x28, 0x81, 0x3a, 0x84, -0x90, 0x38, 0xa4, 0x54, 0x10, 0x3a, 0x83, 0xa4, 0x54, 0x00, 0x3a, 0x81, -0x90, 0x28, 0x80, 0x3a, 0x7f, 0x80, 0x3a, 0x7e, 0x80, 0x90, 0x40, 0x10, -0x10, 0x80, 0x24, 0x53, 0xe8, 0x10, 0x10, 0x90, 0x38, 0xa4, 0x53, 0xd8, -0x3a, 0x7c, 0xa4, 0x53, 0xc8, 0x3a, 0x7a, 0x90, 0x28, 0x80, 0x3a, 0x77, -0x80, 0x3a, 0x76, 0x9a, 0xd0, 0x03, 0xe0, 0x91, 0x60, 0x90, 0xb0, 0x88, -0x00, 0x68, 0x84, 0x10, 0x10, 0xc9, 0xe1, 0x4a, 0x00, 0x85, 0x35, 0x39, -0xcb, 0x61, 0x42, 0x80, 0x85, 0x35, 0x19, 0x88, 0x00, 0x68, 0x84, 0x10, -0x10, 0xc9, 0xe1, 0x49, 0xc0, 0x85, 0x35, 0x37, 0xcb, 0x61, 0x42, 0x40, -0x85, 0x35, 0x18, 0x90, 0xb0, 0x88, 0x00, 0x68, 0x84, 0x10, 0x10, 0xc9, -0xe1, 0x49, 0x80, 0x85, 0x35, 0x35, 0xcb, 0x61, 0x42, 0x00, 0x85, 0x35, -0x17, 0x88, 0x00, 0x68, 0x84, 0x10, 0x10, 0xc9, 0xe1, 0x49, 0x40, 0x85, -0x35, 0x33, 0xcb, 0x61, 0x41, 0xc0, 0x85, 0x35, 0x16, 0x90, 0x90, 0x90, -0x48, 0xcb, 0xa1, 0x40, 0x00, 0x85, 0x35, 0x05, 0xcb, 0xa1, 0x3f, 0xc0, -0x85, 0x35, 0x04, 0x90, 0x48, 0xcb, 0xa1, 0x3f, 0x80, 0x85, 0x35, 0x03, -0xcb, 0xa1, 0x3f, 0x40, 0x85, 0x35, 0x02, 0xcb, 0xa2, 0x94, 0xc0, 0x80, -0x3a, 0x54, 0x92, 0x40, 0x91, 0x20, 0x90, 0x90, 0x90, 0x48, 0x8c, 0x27, -0x60, 0x84, 0x24, 0x27, 0xd8, 0x8c, 0x27, 0x58, 0x84, 0x24, 0x27, 0xd0, -0x90, 0x48, 0x8c, 0x27, 0x50, 0x84, 0x24, 0x27, 0xc8, 0x8c, 0x27, 0x48, -0x84, 0x24, 0x27, 0xc0, 0x90, 0x90, 0x90, 0x48, 0x8c, 0x27, 0x38, 0x84, -0x24, 0x27, 0xb0, 0x8c, 0x27, 0x30, 0x84, 0x24, 0x27, 0xa8, 0x90, 0x48, -0x8c, 0x27, 0x28, 0x84, 0x24, 0x27, 0xa0, 0x8c, 0x27, 0x20, 0x84, 0x24, -0x27, 0x98, 0x91, 0x20, 0x90, 0x90, 0x90, 0x48, 0x8c, 0x27, 0x10, 0x84, -0x24, 0x27, 0x88, 0x8c, 0x27, 0x08, 0x84, 0x24, 0x27, 0x80, 0x90, 0x48, -0x8c, 0x27, 0x00, 0x84, 0x24, 0x27, 0x78, 0x8c, 0x26, 0xf8, 0x84, 0x24, -0x27, 0x70, 0x90, 0x38, 0xa4, 0x26, 0xe0, 0x34, 0xdd, 0xa4, 0x26, 0xd0, -0x34, 0xdb, 0xa0, 0x0f, 0x50, 0xa0, 0x09, 0x08, 0x9a, 0x30, 0x04, 0x40, -0x91, 0x90, 0x90, 0xc8, 0x98, 0x50, 0x00, 0x80, 0xe5, 0x22, 0x92, 0xc0, -0x3a, 0x43, 0xe5, 0x22, 0x8a, 0xc0, 0x3a, 0x3f, 0xcb, 0x61, 0x32, 0x40, -0x85, 0x34, 0xd8, 0x98, 0x50, 0x00, 0x80, 0xe5, 0x22, 0x82, 0xc0, 0x3a, -0x03, 0xe5, 0x22, 0x7a, 0xc0, 0x39, 0xff, 0xcb, 0x61, 0x32, 0x00, 0x85, -0x34, 0xd7, 0x90, 0x48, 0xcb, 0xa1, 0x31, 0xc0, 0x85, 0x34, 0xd6, 0xcb, -0xa1, 0x31, 0x80, 0x85, 0x34, 0xd5, 0x91, 0x90, 0x90, 0xc8, 0x98, 0x50, -0x00, 0x80, 0xe5, 0x22, 0x6c, 0xc0, 0x39, 0xcb, 0xe5, 0x22, 0x60, 0xc0, -0x39, 0x9b, 0xcb, 0x61, 0x31, 0x00, 0x85, 0x34, 0xd3, 0x98, 0x50, 0x00, -0x80, 0xe5, 0x22, 0x54, 0xc0, 0x39, 0x6b, 0xe5, 0x22, 0x48, 0xc0, 0x39, -0x3b, 0xcb, 0x61, 0x30, 0xc0, 0x85, 0x34, 0xd2, 0x90, 0x48, 0xcb, 0xa1, -0x30, 0x80, 0x85, 0x34, 0xd1, 0xcb, 0xa1, 0x30, 0x40, 0x85, 0x34, 0xd0, -0x92, 0x20, 0x91, 0x30, 0x90, 0xb8, 0xd5, 0x03, 0x00, 0xc0, 0xc0, 0x81, -0x8c, 0x01, 0xa0, 0x84, 0x30, 0x3e, 0xc0, 0xc0, 0x81, 0x8c, 0x01, 0x80, -0x84, 0x30, 0x3c, 0xd5, 0x02, 0x00, 0xc0, 0xc0, 0x81, 0x30, 0x28, 0xc0, -0xc0, 0x81, 0x30, 0x24, 0x90, 0x78, 0xd5, 0x02, 0x00, 0xc0, 0xc0, 0x81, -0x30, 0x1c, 0xc0, 0xc0, 0x81, 0x30, 0x18, 0xd5, 0x02, 0x00, 0xc0, 0xc0, -0x81, 0x30, 0x10, 0xc0, 0xc0, 0x81, 0x30, 0x0c, 0x91, 0x70, 0x90, 0xd8, -0xd5, 0x03, 0x80, 0xc8, 0xe2, 0x40, 0xc0, 0x81, 0x8c, 0x01, 0xc0, 0x84, -0x30, 0x40, 0xc8, 0xe2, 0x42, 0xc0, 0x81, 0x8c, 0x01, 0x90, 0x84, 0x30, -0x3d, 0xd5, 0x02, 0x80, 0xc8, 0xe2, 0x3f, 0xc0, 0x81, 0x30, 0x2c, 0xc8, -0xe2, 0x3a, 0x40, 0x81, 0x30, 0x26, 0x90, 0x98, 0xd5, 0x02, 0x80, 0xc8, -0xe2, 0x2f, 0x40, 0x81, 0x30, 0x20, 0xc8, 0xe2, 0x31, 0x40, 0x81, 0x30, -0x1a, 0xd5, 0x02, 0x80, 0xc8, 0xe2, 0x2e, 0x40, 0x81, 0x30, 0x14, 0xc8, -0xe2, 0x28, 0xc0, 0x81, 0x30, 0x0e, 0x9a, 0x30, 0x04, 0x40, 0x91, 0x90, -0x90, 0xc8, 0x98, 0x50, 0x00, 0x80, 0xe5, 0x22, 0x86, 0xc0, 0x3a, 0x13, -0xe5, 0x22, 0x88, 0xc0, 0x3a, 0x37, 0xcb, 0x61, 0x2f, 0xc0, 0x85, 0x34, -0xce, 0x98, 0x50, 0x00, 0x80, 0xe5, 0x22, 0x76, 0xc0, 0x39, 0xd3, 0xe5, -0x22, 0x78, 0xc0, 0x39, 0xf7, 0xcb, 0x61, 0x2f, 0x80, 0x85, 0x34, 0xcd, -0x90, 0x48, 0xcb, 0xa1, 0x2f, 0x40, 0x85, 0x34, 0xcc, 0xcb, 0xa1, 0x2f, -0x00, 0x85, 0x34, 0xcb, 0x91, 0x90, 0x90, 0xc8, 0x98, 0x50, 0x00, 0x80, -0xe5, 0x22, 0x68, 0xc0, 0x39, 0xbb, 0xe5, 0x22, 0x5c, 0xc0, 0x39, 0x8b, -0xcb, 0x61, 0x2d, 0x40, 0x85, 0x34, 0xba, 0x98, 0x50, 0x00, 0x80, 0xe5, -0x22, 0x50, 0xc0, 0x39, 0x5b, 0xe5, 0x22, 0x44, 0xc0, 0x39, 0x2b, 0xcb, -0x61, 0x2d, 0x00, 0x85, 0x34, 0xb9, 0x90, 0x48, 0xcb, 0xa1, 0x2c, 0xc0, -0x85, 0x34, 0xb8, 0xcb, 0xa1, 0x2c, 0x80, 0x85, 0x34, 0xb7, 0x91, 0x00, -0x90, 0x80, 0x90, 0x40, 0xe5, 0x20, 0x02, 0x40, 0x30, 0x0a, 0xe5, 0x20, -0x01, 0x80, 0x30, 0x07, 0x90, 0x40, 0xe5, 0x20, 0x00, 0xc0, 0x30, 0x04, -0xe5, 0x20, 0x00, 0x00, 0x30, 0x01, 0x90, 0x80, 0x90, 0x40, 0xe5, 0x22, -0x35, 0xc0, 0x38, 0xcd, 0xe5, 0x22, 0x38, 0x00, 0x38, 0xf5, 0x90, 0x40, -0xe5, 0x22, 0x24, 0x40, 0x38, 0x87, 0xe5, 0x22, 0x26, 0x80, 0x38, 0xaf, -0x80, 0x99, 0x28, 0x02, 0xf0, 0x8c, 0x25, 0x48, 0x90, 0x80, 0x90, 0x40, -0xe5, 0x22, 0x8c, 0xc0, 0x3a, 0x2f, 0xe5, 0x22, 0x89, 0xc0, 0x3a, 0x3b, -0x90, 0x40, 0xe5, 0x22, 0x7c, 0xc0, 0x39, 0xef, 0xe5, 0x22, 0x79, 0xc0, -0x39, 0xfb, 0x91, 0x48, 0x90, 0xc8, 0x98, 0x50, 0x00, 0x80, 0xe5, 0x22, -0x6a, 0xc0, 0x39, 0xc3, 0xe5, 0x22, 0x5e, 0xc0, 0x39, 0x93, 0xcb, 0x61, -0x2b, 0x00, 0x85, 0x34, 0xb0, 0x90, 0x40, 0xe5, 0x22, 0x52, 0xc0, 0x39, -0x63, 0xe5, 0x22, 0x46, 0xc0, 0x39, 0x33, 0x90, 0x48, 0xcb, 0xa1, 0x2a, -0x80, 0x85, 0x34, 0xae, 0xcb, 0xa1, 0x2a, 0xc0, 0x85, 0x34, 0xaf, 0x10, -0x10, 0x90, 0x80, 0x90, 0x40, 0xe5, 0x22, 0x3c, 0x40, 0x38, 0xed, 0xe5, -0x22, 0x39, 0x40, 0x38, 0xfb, 0x90, 0x40, 0xe5, 0x22, 0x2a, 0xc0, 0x38, -0xa7, 0xe5, 0x22, 0x27, 0xc0, 0x38, 0xb5, -}; - -static const struct ia64_dis_names ia64_dis_names[] = { -{ 0x51, 41, 0, 10 }, -{ 0x31, 41, 1, 20 }, -{ 0x11, 42, 0, 19 }, -{ 0x29, 41, 0, 12 }, -{ 0x19, 41, 1, 24 }, -{ 0x9, 42, 0, 23 }, -{ 0x15, 41, 0, 14 }, -{ 0xd, 41, 1, 28 }, -{ 0x5, 42, 0, 27 }, -{ 0xb, 41, 0, 16 }, -{ 0x7, 41, 1, 32 }, -{ 0x3, 42, 0, 31 }, -{ 0x51, 39, 1, 58 }, -{ 0x50, 39, 0, 34 }, -{ 0xd1, 39, 1, 57 }, -{ 0xd0, 39, 0, 33 }, -{ 0x31, 39, 1, 68 }, -{ 0x30, 39, 1, 44 }, -{ 0x11, 40, 1, 67 }, -{ 0x10, 40, 0, 43 }, -{ 0x71, 39, 1, 66 }, -{ 0x70, 39, 1, 42 }, -{ 0x31, 40, 1, 65 }, -{ 0x30, 40, 0, 41 }, -{ 0x29, 39, 1, 60 }, -{ 0x28, 39, 0, 36 }, -{ 0x69, 39, 1, 59 }, -{ 0x68, 39, 0, 35 }, -{ 0x19, 39, 1, 72 }, -{ 0x18, 39, 1, 48 }, -{ 0x9, 40, 1, 71 }, -{ 0x8, 40, 0, 47 }, -{ 0x39, 39, 1, 70 }, -{ 0x38, 39, 1, 46 }, -{ 0x19, 40, 1, 69 }, -{ 0x18, 40, 0, 45 }, -{ 0x15, 39, 1, 62 }, -{ 0x14, 39, 0, 38 }, -{ 0x35, 39, 1, 61 }, -{ 0x34, 39, 0, 37 }, -{ 0xd, 39, 1, 76 }, -{ 0xc, 39, 1, 52 }, -{ 0x5, 40, 1, 75 }, -{ 0x4, 40, 0, 51 }, -{ 0x1d, 39, 1, 74 }, -{ 0x1c, 39, 1, 50 }, -{ 0xd, 40, 1, 73 }, -{ 0xc, 40, 0, 49 }, -{ 0xb, 39, 1, 64 }, -{ 0xa, 39, 0, 40 }, -{ 0x1b, 39, 1, 63 }, -{ 0x1a, 39, 0, 39 }, -{ 0x7, 39, 1, 80 }, -{ 0x6, 39, 1, 56 }, -{ 0x3, 40, 1, 79 }, -{ 0x2, 40, 0, 55 }, -{ 0xf, 39, 1, 78 }, -{ 0xe, 39, 1, 54 }, -{ 0x7, 40, 1, 77 }, -{ 0x6, 40, 0, 53 }, -{ 0x8, 38, 0, 82 }, -{ 0x18, 38, 0, 81 }, -{ 0x1, 38, 1, 86 }, -{ 0x2, 38, 0, 85 }, -{ 0x3, 38, 1, 84 }, -{ 0x4, 38, 0, 83 }, -{ 0x1, 336, 0, 87 }, -{ 0x20, 289, 0, 98 }, -{ 0x220, 289, 0, 94 }, -{ 0x1220, 289, 0, 91 }, -{ 0xa20, 289, 0, 92 }, -{ 0x620, 289, 0, 93 }, -{ 0x120, 289, 0, 95 }, -{ 0xa0, 289, 0, 96 }, -{ 0x60, 289, 0, 97 }, -{ 0x10, 289, 0, 102 }, -{ 0x90, 289, 0, 99 }, -{ 0x50, 289, 0, 100 }, -{ 0x30, 289, 0, 101 }, -{ 0x8, 289, 0, 103 }, -{ 0x4, 289, 0, 104 }, -{ 0x2, 289, 0, 105 }, -{ 0x1, 289, 0, 106 }, -{ 0x1, 411, 0, 108 }, -{ 0x3, 411, 0, 107 }, -{ 0x2, 417, 0, 109 }, -{ 0x1, 417, 0, 110 }, -{ 0x2, 413, 0, 111 }, -{ 0x1, 413, 0, 112 }, -{ 0x2, 415, 0, 113 }, -{ 0x1, 415, 0, 114 }, -{ 0x2, 419, 0, 115 }, -{ 0x1, 419, 0, 116 }, -{ 0x1, 268, 0, 143 }, -{ 0x5, 268, 0, 141 }, -{ 0x3, 268, 0, 142 }, -{ 0x140, 277, 0, 119 }, -{ 0x540, 277, 0, 117 }, -{ 0x340, 277, 0, 118 }, -{ 0xc0, 277, 0, 131 }, -{ 0x2c0, 277, 0, 129 }, -{ 0x1c0, 277, 0, 130 }, -{ 0x20, 277, 0, 146 }, -{ 0xa0, 277, 0, 144 }, -{ 0x60, 277, 0, 145 }, -{ 0x10, 277, 0, 158 }, -{ 0x50, 277, 0, 156 }, -{ 0x30, 277, 0, 157 }, -{ 0x8, 277, 0, 170 }, -{ 0x28, 277, 0, 168 }, -{ 0x18, 277, 0, 169 }, -{ 0x4, 277, 0, 180 }, -{ 0x2, 277, 0, 181 }, -{ 0x1, 277, 0, 182 }, -{ 0x140, 271, 0, 122 }, -{ 0x540, 271, 0, 120 }, -{ 0x340, 271, 0, 121 }, -{ 0xc0, 271, 0, 134 }, -{ 0x2c0, 271, 0, 132 }, -{ 0x1c0, 271, 0, 133 }, -{ 0x20, 271, 0, 149 }, -{ 0xa0, 271, 0, 147 }, -{ 0x60, 271, 0, 148 }, -{ 0x10, 271, 0, 161 }, -{ 0x50, 271, 0, 159 }, -{ 0x30, 271, 0, 160 }, -{ 0x8, 271, 0, 173 }, -{ 0x28, 271, 0, 171 }, -{ 0x18, 271, 0, 172 }, -{ 0x4, 271, 0, 183 }, -{ 0x2, 271, 0, 184 }, -{ 0x1, 271, 0, 185 }, -{ 0x140, 274, 0, 125 }, -{ 0x540, 274, 0, 123 }, -{ 0x340, 274, 0, 124 }, -{ 0xc0, 274, 0, 137 }, -{ 0x2c0, 274, 0, 135 }, -{ 0x1c0, 274, 0, 136 }, -{ 0x20, 274, 0, 152 }, -{ 0xa0, 274, 0, 150 }, -{ 0x60, 274, 0, 151 }, -{ 0x10, 274, 0, 164 }, -{ 0x50, 274, 0, 162 }, -{ 0x30, 274, 0, 163 }, -{ 0x8, 274, 0, 176 }, -{ 0x28, 274, 0, 174 }, -{ 0x18, 274, 0, 175 }, -{ 0x4, 274, 0, 186 }, -{ 0x2, 274, 0, 187 }, -{ 0x1, 274, 0, 188 }, -{ 0x140, 286, 0, 128 }, -{ 0x540, 286, 0, 126 }, -{ 0x340, 286, 0, 127 }, -{ 0xc0, 286, 0, 140 }, -{ 0x2c0, 286, 0, 138 }, -{ 0x1c0, 286, 0, 139 }, -{ 0x20, 286, 0, 155 }, -{ 0xa0, 286, 0, 153 }, -{ 0x60, 286, 0, 154 }, -{ 0x10, 286, 0, 167 }, -{ 0x50, 286, 0, 165 }, -{ 0x30, 286, 0, 166 }, -{ 0x8, 286, 0, 179 }, -{ 0x28, 286, 0, 177 }, -{ 0x18, 286, 0, 178 }, -{ 0x4, 286, 0, 189 }, -{ 0x2, 286, 0, 190 }, -{ 0x1, 286, 0, 191 }, -{ 0x8, 390, 0, 192 }, -{ 0x4, 390, 0, 193 }, -{ 0x2, 390, 0, 194 }, -{ 0x1, 390, 0, 195 }, -{ 0x20, 288, 0, 203 }, -{ 0x220, 288, 0, 199 }, -{ 0x1220, 288, 0, 196 }, -{ 0xa20, 288, 0, 197 }, -{ 0x620, 288, 0, 198 }, -{ 0x120, 288, 0, 200 }, -{ 0xa0, 288, 0, 201 }, -{ 0x60, 288, 0, 202 }, -{ 0x10, 288, 0, 207 }, -{ 0x90, 288, 0, 204 }, -{ 0x50, 288, 0, 205 }, -{ 0x30, 288, 0, 206 }, -{ 0x8, 288, 0, 208 }, -{ 0x4, 288, 0, 209 }, -{ 0x2, 288, 0, 210 }, -{ 0x1, 288, 0, 211 }, -{ 0x20, 287, 0, 219 }, -{ 0x220, 287, 0, 215 }, -{ 0x1220, 287, 0, 212 }, -{ 0xa20, 287, 0, 213 }, -{ 0x620, 287, 0, 214 }, -{ 0x120, 287, 0, 216 }, -{ 0xa0, 287, 0, 217 }, -{ 0x60, 287, 0, 218 }, -{ 0x10, 287, 0, 223 }, -{ 0x90, 287, 0, 220 }, -{ 0x50, 287, 0, 221 }, -{ 0x30, 287, 0, 222 }, -{ 0x8, 287, 0, 224 }, -{ 0x4, 287, 0, 225 }, -{ 0x2, 287, 0, 226 }, -{ 0x1, 287, 0, 227 }, -{ 0x140, 279, 0, 230 }, -{ 0x540, 279, 0, 228 }, -{ 0x340, 279, 0, 229 }, -{ 0xc0, 279, 0, 239 }, -{ 0x2c0, 279, 0, 237 }, -{ 0x1c0, 279, 0, 238 }, -{ 0x20, 279, 0, 248 }, -{ 0xa0, 279, 0, 246 }, -{ 0x60, 279, 0, 247 }, -{ 0x10, 279, 0, 257 }, -{ 0x50, 279, 0, 255 }, -{ 0x30, 279, 0, 256 }, -{ 0x8, 279, 0, 266 }, -{ 0x28, 279, 0, 264 }, -{ 0x18, 279, 0, 265 }, -{ 0x4, 279, 0, 273 }, -{ 0x2, 279, 0, 274 }, -{ 0x1, 279, 0, 275 }, -{ 0x140, 281, 0, 233 }, -{ 0x540, 281, 0, 231 }, -{ 0x340, 281, 0, 232 }, -{ 0xc0, 281, 0, 242 }, -{ 0x2c0, 281, 0, 240 }, -{ 0x1c0, 281, 0, 241 }, -{ 0x20, 281, 0, 251 }, -{ 0xa0, 281, 0, 249 }, -{ 0x60, 281, 0, 250 }, -{ 0x10, 281, 0, 260 }, -{ 0x50, 281, 0, 258 }, -{ 0x30, 281, 0, 259 }, -{ 0x8, 281, 0, 269 }, -{ 0x28, 281, 0, 267 }, -{ 0x18, 281, 0, 268 }, -{ 0x4, 281, 0, 276 }, -{ 0x2, 281, 0, 277 }, -{ 0x1, 281, 0, 278 }, -{ 0x140, 283, 0, 236 }, -{ 0x540, 283, 0, 234 }, -{ 0x340, 283, 0, 235 }, -{ 0xc0, 283, 0, 245 }, -{ 0x2c0, 283, 0, 243 }, -{ 0x1c0, 283, 0, 244 }, -{ 0x20, 283, 0, 254 }, -{ 0xa0, 283, 0, 252 }, -{ 0x60, 283, 0, 253 }, -{ 0x10, 283, 0, 263 }, -{ 0x50, 283, 0, 261 }, -{ 0x30, 283, 0, 262 }, -{ 0x8, 283, 0, 272 }, -{ 0x28, 283, 0, 270 }, -{ 0x18, 283, 0, 271 }, -{ 0x4, 283, 0, 279 }, -{ 0x2, 283, 0, 280 }, -{ 0x1, 283, 0, 281 }, -{ 0x140, 278, 0, 284 }, -{ 0x540, 278, 0, 282 }, -{ 0x340, 278, 0, 283 }, -{ 0xc0, 278, 0, 293 }, -{ 0x2c0, 278, 0, 291 }, -{ 0x1c0, 278, 0, 292 }, -{ 0x20, 278, 0, 302 }, -{ 0xa0, 278, 0, 300 }, -{ 0x60, 278, 0, 301 }, -{ 0x10, 278, 0, 311 }, -{ 0x50, 278, 0, 309 }, -{ 0x30, 278, 0, 310 }, -{ 0x8, 278, 0, 320 }, -{ 0x28, 278, 0, 318 }, -{ 0x18, 278, 0, 319 }, -{ 0x4, 278, 0, 327 }, -{ 0x2, 278, 0, 328 }, -{ 0x1, 278, 0, 329 }, -{ 0x140, 280, 0, 287 }, -{ 0x540, 280, 0, 285 }, -{ 0x340, 280, 0, 286 }, -{ 0xc0, 280, 0, 296 }, -{ 0x2c0, 280, 0, 294 }, -{ 0x1c0, 280, 0, 295 }, -{ 0x20, 280, 0, 305 }, -{ 0xa0, 280, 0, 303 }, -{ 0x60, 280, 0, 304 }, -{ 0x10, 280, 0, 314 }, -{ 0x50, 280, 0, 312 }, -{ 0x30, 280, 0, 313 }, -{ 0x8, 280, 0, 323 }, -{ 0x28, 280, 0, 321 }, -{ 0x18, 280, 0, 322 }, -{ 0x4, 280, 0, 330 }, -{ 0x2, 280, 0, 331 }, -{ 0x1, 280, 0, 332 }, -{ 0x140, 282, 0, 290 }, -{ 0x540, 282, 0, 288 }, -{ 0x340, 282, 0, 289 }, -{ 0xc0, 282, 0, 299 }, -{ 0x2c0, 282, 0, 297 }, -{ 0x1c0, 282, 0, 298 }, -{ 0x20, 282, 0, 308 }, -{ 0xa0, 282, 0, 306 }, -{ 0x60, 282, 0, 307 }, -{ 0x10, 282, 0, 317 }, -{ 0x50, 282, 0, 315 }, -{ 0x30, 282, 0, 316 }, -{ 0x8, 282, 0, 326 }, -{ 0x28, 282, 0, 324 }, -{ 0x18, 282, 0, 325 }, -{ 0x4, 282, 0, 333 }, -{ 0x2, 282, 0, 334 }, -{ 0x1, 282, 0, 335 }, -{ 0x1, 410, 0, 337 }, -{ 0x3, 410, 0, 336 }, -{ 0x2, 416, 0, 338 }, -{ 0x1, 416, 0, 339 }, -{ 0x2, 412, 0, 340 }, -{ 0x1, 412, 0, 341 }, -{ 0x2, 414, 0, 342 }, -{ 0x1, 414, 0, 343 }, -{ 0x2, 418, 0, 344 }, -{ 0x1, 418, 0, 345 }, -{ 0x1, 267, 0, 372 }, -{ 0x5, 267, 0, 370 }, -{ 0x3, 267, 0, 371 }, -{ 0x140, 276, 0, 348 }, -{ 0x540, 276, 0, 346 }, -{ 0x340, 276, 0, 347 }, -{ 0xc0, 276, 0, 360 }, -{ 0x2c0, 276, 0, 358 }, -{ 0x1c0, 276, 0, 359 }, -{ 0x20, 276, 0, 375 }, -{ 0xa0, 276, 0, 373 }, -{ 0x60, 276, 0, 374 }, -{ 0x10, 276, 0, 387 }, -{ 0x50, 276, 0, 385 }, -{ 0x30, 276, 0, 386 }, -{ 0x8, 276, 0, 399 }, -{ 0x28, 276, 0, 397 }, -{ 0x18, 276, 0, 398 }, -{ 0x4, 276, 0, 409 }, -{ 0x2, 276, 0, 410 }, -{ 0x1, 276, 0, 411 }, -{ 0x140, 270, 0, 351 }, -{ 0x540, 270, 0, 349 }, -{ 0x340, 270, 0, 350 }, -{ 0xc0, 270, 0, 363 }, -{ 0x2c0, 270, 0, 361 }, -{ 0x1c0, 270, 0, 362 }, -{ 0x20, 270, 0, 378 }, -{ 0xa0, 270, 0, 376 }, -{ 0x60, 270, 0, 377 }, -{ 0x10, 270, 0, 390 }, -{ 0x50, 270, 0, 388 }, -{ 0x30, 270, 0, 389 }, -{ 0x8, 270, 0, 402 }, -{ 0x28, 270, 0, 400 }, -{ 0x18, 270, 0, 401 }, -{ 0x4, 270, 0, 412 }, -{ 0x2, 270, 0, 413 }, -{ 0x1, 270, 0, 414 }, -{ 0x140, 273, 0, 354 }, -{ 0x540, 273, 0, 352 }, -{ 0x340, 273, 0, 353 }, -{ 0xc0, 273, 0, 366 }, -{ 0x2c0, 273, 0, 364 }, -{ 0x1c0, 273, 0, 365 }, -{ 0x20, 273, 0, 381 }, -{ 0xa0, 273, 0, 379 }, -{ 0x60, 273, 0, 380 }, -{ 0x10, 273, 0, 393 }, -{ 0x50, 273, 0, 391 }, -{ 0x30, 273, 0, 392 }, -{ 0x8, 273, 0, 405 }, -{ 0x28, 273, 0, 403 }, -{ 0x18, 273, 0, 404 }, -{ 0x4, 273, 0, 415 }, -{ 0x2, 273, 0, 416 }, -{ 0x1, 273, 0, 417 }, -{ 0x140, 285, 0, 357 }, -{ 0x540, 285, 0, 355 }, -{ 0x340, 285, 0, 356 }, -{ 0xc0, 285, 0, 369 }, -{ 0x2c0, 285, 0, 367 }, -{ 0x1c0, 285, 0, 368 }, -{ 0x20, 285, 0, 384 }, -{ 0xa0, 285, 0, 382 }, -{ 0x60, 285, 0, 383 }, -{ 0x10, 285, 0, 396 }, -{ 0x50, 285, 0, 394 }, -{ 0x30, 285, 0, 395 }, -{ 0x8, 285, 0, 408 }, -{ 0x28, 285, 0, 406 }, -{ 0x18, 285, 0, 407 }, -{ 0x4, 285, 0, 418 }, -{ 0x2, 285, 0, 419 }, -{ 0x1, 285, 0, 420 }, -{ 0x1, 266, 0, 447 }, -{ 0x5, 266, 0, 445 }, -{ 0x3, 266, 0, 446 }, -{ 0x140, 275, 0, 423 }, -{ 0x540, 275, 0, 421 }, -{ 0x340, 275, 0, 422 }, -{ 0xc0, 275, 0, 435 }, -{ 0x2c0, 275, 0, 433 }, -{ 0x1c0, 275, 0, 434 }, -{ 0x20, 275, 0, 450 }, -{ 0xa0, 275, 0, 448 }, -{ 0x60, 275, 0, 449 }, -{ 0x10, 275, 0, 462 }, -{ 0x50, 275, 0, 460 }, -{ 0x30, 275, 0, 461 }, -{ 0x8, 275, 0, 474 }, -{ 0x28, 275, 0, 472 }, -{ 0x18, 275, 0, 473 }, -{ 0x4, 275, 0, 484 }, -{ 0x2, 275, 0, 485 }, -{ 0x1, 275, 0, 486 }, -{ 0x140, 269, 0, 426 }, -{ 0x540, 269, 0, 424 }, -{ 0x340, 269, 0, 425 }, -{ 0xc0, 269, 0, 438 }, -{ 0x2c0, 269, 0, 436 }, -{ 0x1c0, 269, 0, 437 }, -{ 0x20, 269, 0, 453 }, -{ 0xa0, 269, 0, 451 }, -{ 0x60, 269, 0, 452 }, -{ 0x10, 269, 0, 465 }, -{ 0x50, 269, 0, 463 }, -{ 0x30, 269, 0, 464 }, -{ 0x8, 269, 0, 477 }, -{ 0x28, 269, 0, 475 }, -{ 0x18, 269, 0, 476 }, -{ 0x4, 269, 0, 487 }, -{ 0x2, 269, 0, 488 }, -{ 0x1, 269, 0, 489 }, -{ 0x140, 272, 0, 429 }, -{ 0x540, 272, 0, 427 }, -{ 0x340, 272, 0, 428 }, -{ 0xc0, 272, 0, 441 }, -{ 0x2c0, 272, 0, 439 }, -{ 0x1c0, 272, 0, 440 }, -{ 0x20, 272, 0, 456 }, -{ 0xa0, 272, 0, 454 }, -{ 0x60, 272, 0, 455 }, -{ 0x10, 272, 0, 468 }, -{ 0x50, 272, 0, 466 }, -{ 0x30, 272, 0, 467 }, -{ 0x8, 272, 0, 480 }, -{ 0x28, 272, 0, 478 }, -{ 0x18, 272, 0, 479 }, -{ 0x4, 272, 0, 490 }, -{ 0x2, 272, 0, 491 }, -{ 0x1, 272, 0, 492 }, -{ 0x140, 284, 0, 432 }, -{ 0x540, 284, 0, 430 }, -{ 0x340, 284, 0, 431 }, -{ 0xc0, 284, 0, 444 }, -{ 0x2c0, 284, 0, 442 }, -{ 0x1c0, 284, 0, 443 }, -{ 0x20, 284, 0, 459 }, -{ 0xa0, 284, 0, 457 }, -{ 0x60, 284, 0, 458 }, -{ 0x10, 284, 0, 471 }, -{ 0x50, 284, 0, 469 }, -{ 0x30, 284, 0, 470 }, -{ 0x8, 284, 0, 483 }, -{ 0x28, 284, 0, 481 }, -{ 0x18, 284, 0, 482 }, -{ 0x4, 284, 0, 493 }, -{ 0x2, 284, 0, 494 }, -{ 0x1, 284, 0, 495 }, -{ 0x8, 409, 0, 497 }, -{ 0x18, 409, 0, 496 }, -{ 0x4, 409, 0, 499 }, -{ 0xc, 409, 0, 498 }, -{ 0x2, 409, 0, 506 }, -{ 0x1, 409, 0, 507 }, -{ 0x4, 407, 0, 501 }, -{ 0xc, 407, 0, 500 }, -{ 0x2, 407, 0, 508 }, -{ 0x1, 407, 0, 509 }, -{ 0x4, 405, 0, 503 }, -{ 0xc, 405, 0, 502 }, -{ 0x2, 405, 0, 510 }, -{ 0x1, 405, 0, 511 }, -{ 0x4, 401, 0, 505 }, -{ 0xc, 401, 0, 504 }, -{ 0x2, 401, 0, 512 }, -{ 0x1, 401, 0, 513 }, -{ 0xa00, 265, 0, 528 }, -{ 0x2a00, 265, 0, 526 }, -{ 0x1a00, 265, 0, 527 }, -{ 0x600, 265, 0, 540 }, -{ 0x2600, 265, 0, 516 }, -{ 0xa600, 265, 0, 514 }, -{ 0x6600, 265, 0, 515 }, -{ 0x1600, 265, 0, 538 }, -{ 0xe00, 265, 0, 539 }, -{ 0x100, 265, 0, 552 }, -{ 0x500, 265, 0, 550 }, -{ 0x300, 265, 0, 551 }, -{ 0x80, 265, 0, 555 }, -{ 0x280, 265, 0, 553 }, -{ 0x180, 265, 0, 554 }, -{ 0x40, 265, 0, 567 }, -{ 0x140, 265, 0, 565 }, -{ 0xc0, 265, 0, 566 }, -{ 0x20, 265, 0, 579 }, -{ 0xa0, 265, 0, 577 }, -{ 0x60, 265, 0, 578 }, -{ 0x10, 265, 0, 591 }, -{ 0x50, 265, 0, 589 }, -{ 0x30, 265, 0, 590 }, -{ 0x8, 265, 0, 603 }, -{ 0x28, 265, 0, 601 }, -{ 0x18, 265, 0, 602 }, -{ 0x4, 265, 0, 613 }, -{ 0x2, 265, 0, 614 }, -{ 0x1, 265, 0, 615 }, -{ 0x500, 261, 0, 531 }, -{ 0x1500, 261, 0, 529 }, -{ 0xd00, 261, 0, 530 }, -{ 0x300, 261, 0, 543 }, -{ 0x1300, 261, 0, 519 }, -{ 0x5300, 261, 0, 517 }, -{ 0x3300, 261, 0, 518 }, -{ 0xb00, 261, 0, 541 }, -{ 0x700, 261, 0, 542 }, -{ 0x80, 261, 0, 558 }, -{ 0x280, 261, 0, 556 }, -{ 0x180, 261, 0, 557 }, -{ 0x40, 261, 0, 570 }, -{ 0x140, 261, 0, 568 }, -{ 0xc0, 261, 0, 569 }, -{ 0x20, 261, 0, 582 }, -{ 0xa0, 261, 0, 580 }, -{ 0x60, 261, 0, 581 }, -{ 0x10, 261, 0, 594 }, -{ 0x50, 261, 0, 592 }, -{ 0x30, 261, 0, 593 }, -{ 0x8, 261, 0, 606 }, -{ 0x28, 261, 0, 604 }, -{ 0x18, 261, 0, 605 }, -{ 0x4, 261, 0, 616 }, -{ 0x2, 261, 0, 617 }, -{ 0x1, 261, 0, 618 }, -{ 0x500, 258, 0, 534 }, -{ 0x1500, 258, 0, 532 }, -{ 0xd00, 258, 0, 533 }, -{ 0x300, 258, 0, 546 }, -{ 0x1300, 258, 0, 522 }, -{ 0x5300, 258, 0, 520 }, -{ 0x3300, 258, 0, 521 }, -{ 0xb00, 258, 0, 544 }, -{ 0x700, 258, 0, 545 }, -{ 0x80, 258, 0, 561 }, -{ 0x280, 258, 0, 559 }, -{ 0x180, 258, 0, 560 }, -{ 0x40, 258, 0, 573 }, -{ 0x140, 258, 0, 571 }, -{ 0xc0, 258, 0, 572 }, -{ 0x20, 258, 0, 585 }, -{ 0xa0, 258, 0, 583 }, -{ 0x60, 258, 0, 584 }, -{ 0x10, 258, 0, 597 }, -{ 0x50, 258, 0, 595 }, -{ 0x30, 258, 0, 596 }, -{ 0x8, 258, 0, 609 }, -{ 0x28, 258, 0, 607 }, -{ 0x18, 258, 0, 608 }, -{ 0x4, 258, 0, 619 }, -{ 0x2, 258, 0, 620 }, -{ 0x1, 258, 0, 621 }, -{ 0x500, 253, 0, 537 }, -{ 0x1500, 253, 0, 535 }, -{ 0xd00, 253, 0, 536 }, -{ 0x300, 253, 0, 549 }, -{ 0x1300, 253, 0, 525 }, -{ 0x5300, 253, 0, 523 }, -{ 0x3300, 253, 0, 524 }, -{ 0xb00, 253, 0, 547 }, -{ 0x700, 253, 0, 548 }, -{ 0x80, 253, 0, 564 }, -{ 0x280, 253, 0, 562 }, -{ 0x180, 253, 0, 563 }, -{ 0x40, 253, 0, 576 }, -{ 0x140, 253, 0, 574 }, -{ 0xc0, 253, 0, 575 }, -{ 0x20, 253, 0, 588 }, -{ 0xa0, 253, 0, 586 }, -{ 0x60, 253, 0, 587 }, -{ 0x10, 253, 0, 600 }, -{ 0x50, 253, 0, 598 }, -{ 0x30, 253, 0, 599 }, -{ 0x8, 253, 0, 612 }, -{ 0x28, 253, 0, 610 }, -{ 0x18, 253, 0, 611 }, -{ 0x4, 253, 0, 622 }, -{ 0x2, 253, 0, 623 }, -{ 0x1, 253, 0, 624 }, -{ 0x8, 238, 0, 625 }, -{ 0x4, 238, 0, 626 }, -{ 0x2, 238, 0, 627 }, -{ 0x1, 238, 0, 628 }, -{ 0x2, 176, 0, 631 }, -{ 0xa, 176, 0, 629 }, -{ 0x6, 176, 0, 630 }, -{ 0x1, 176, 0, 637 }, -{ 0x5, 176, 0, 635 }, -{ 0x3, 176, 0, 636 }, -{ 0x2, 175, 0, 634 }, -{ 0xa, 175, 0, 632 }, -{ 0x6, 175, 0, 633 }, -{ 0x1, 175, 0, 640 }, -{ 0x5, 175, 0, 638 }, -{ 0x3, 175, 0, 639 }, -{ 0x4, 451, 0, 641 }, -{ 0x2, 451, 0, 642 }, -{ 0x1, 451, 0, 643 }, -{ 0x4, 450, 0, 644 }, -{ 0x2, 450, 0, 645 }, -{ 0x1, 450, 0, 646 }, -{ 0x4, 449, 0, 647 }, -{ 0x2, 449, 0, 648 }, -{ 0x1, 449, 0, 649 }, -{ 0x4, 448, 0, 650 }, -{ 0x2, 448, 0, 651 }, -{ 0x1, 448, 0, 652 }, -{ 0x2, 123, 1, 658 }, -{ 0x2, 124, 0, 657 }, -{ 0xa, 123, 1, 654 }, -{ 0xa, 124, 0, 653 }, -{ 0x6, 123, 1, 656 }, -{ 0x6, 124, 0, 655 }, -{ 0x1, 123, 1, 688 }, -{ 0x1, 124, 0, 687 }, -{ 0x5, 123, 1, 684 }, -{ 0x5, 124, 0, 683 }, -{ 0x3, 123, 1, 686 }, -{ 0x3, 124, 0, 685 }, -{ 0x2, 131, 1, 664 }, -{ 0x2, 132, 0, 663 }, -{ 0xa, 131, 1, 660 }, -{ 0xa, 132, 0, 659 }, -{ 0x6, 131, 1, 662 }, -{ 0x6, 132, 0, 661 }, -{ 0x1, 131, 1, 694 }, -{ 0x1, 132, 0, 693 }, -{ 0x5, 131, 1, 690 }, -{ 0x5, 132, 0, 689 }, -{ 0x3, 131, 1, 692 }, -{ 0x3, 132, 0, 691 }, -{ 0x2, 129, 1, 670 }, -{ 0x2, 130, 0, 669 }, -{ 0xa, 129, 1, 666 }, -{ 0xa, 130, 0, 665 }, -{ 0x6, 129, 1, 668 }, -{ 0x6, 130, 0, 667 }, -{ 0x1, 129, 1, 700 }, -{ 0x1, 130, 0, 699 }, -{ 0x5, 129, 1, 696 }, -{ 0x5, 130, 0, 695 }, -{ 0x3, 129, 1, 698 }, -{ 0x3, 130, 0, 697 }, -{ 0x2, 127, 1, 676 }, -{ 0x2, 128, 0, 675 }, -{ 0xa, 127, 1, 672 }, -{ 0xa, 128, 0, 671 }, -{ 0x6, 127, 1, 674 }, -{ 0x6, 128, 0, 673 }, -{ 0x1, 127, 1, 706 }, -{ 0x1, 128, 0, 705 }, -{ 0x5, 127, 1, 702 }, -{ 0x5, 128, 0, 701 }, -{ 0x3, 127, 1, 704 }, -{ 0x3, 128, 0, 703 }, -{ 0x2, 125, 1, 682 }, -{ 0x2, 126, 0, 681 }, -{ 0xa, 125, 1, 678 }, -{ 0xa, 126, 0, 677 }, -{ 0x6, 125, 1, 680 }, -{ 0x6, 126, 0, 679 }, -{ 0x1, 125, 1, 712 }, -{ 0x1, 126, 0, 711 }, -{ 0x5, 125, 1, 708 }, -{ 0x5, 126, 0, 707 }, -{ 0x3, 125, 1, 710 }, -{ 0x3, 126, 0, 709 }, -{ 0x4, 402, 1, 718 }, -{ 0x4, 403, 0, 717 }, -{ 0xc, 402, 1, 716 }, -{ 0xc, 403, 0, 715 }, -{ 0x2, 402, 1, 728 }, -{ 0x2, 403, 0, 727 }, -{ 0x1, 402, 1, 730 }, -{ 0x1, 403, 0, 729 }, -{ 0x8, 408, 0, 714 }, -{ 0x18, 408, 0, 713 }, -{ 0x4, 408, 0, 720 }, -{ 0xc, 408, 0, 719 }, -{ 0x2, 408, 0, 731 }, -{ 0x1, 408, 0, 732 }, -{ 0x4, 406, 0, 722 }, -{ 0xc, 406, 0, 721 }, -{ 0x2, 406, 0, 733 }, -{ 0x1, 406, 0, 734 }, -{ 0x4, 404, 0, 724 }, -{ 0xc, 404, 0, 723 }, -{ 0x2, 404, 0, 735 }, -{ 0x1, 404, 0, 736 }, -{ 0x4, 400, 0, 726 }, -{ 0xc, 400, 0, 725 }, -{ 0x2, 400, 0, 737 }, -{ 0x1, 400, 0, 738 }, -{ 0xa00, 264, 0, 753 }, -{ 0x2a00, 264, 0, 751 }, -{ 0x1a00, 264, 0, 752 }, -{ 0x600, 264, 0, 765 }, -{ 0x2600, 264, 0, 741 }, -{ 0xa600, 264, 0, 739 }, -{ 0x6600, 264, 0, 740 }, -{ 0x1600, 264, 0, 763 }, -{ 0xe00, 264, 0, 764 }, -{ 0x100, 264, 0, 777 }, -{ 0x500, 264, 0, 775 }, -{ 0x300, 264, 0, 776 }, -{ 0x80, 264, 0, 780 }, -{ 0x280, 264, 0, 778 }, -{ 0x180, 264, 0, 779 }, -{ 0x40, 264, 0, 792 }, -{ 0x140, 264, 0, 790 }, -{ 0xc0, 264, 0, 791 }, -{ 0x20, 264, 0, 804 }, -{ 0xa0, 264, 0, 802 }, -{ 0x60, 264, 0, 803 }, -{ 0x10, 264, 0, 816 }, -{ 0x50, 264, 0, 814 }, -{ 0x30, 264, 0, 815 }, -{ 0x8, 264, 0, 828 }, -{ 0x28, 264, 0, 826 }, -{ 0x18, 264, 0, 827 }, -{ 0x4, 264, 0, 838 }, -{ 0x2, 264, 0, 839 }, -{ 0x1, 264, 0, 840 }, -{ 0x500, 260, 0, 756 }, -{ 0x1500, 260, 0, 754 }, -{ 0xd00, 260, 0, 755 }, -{ 0x300, 260, 0, 768 }, -{ 0x1300, 260, 0, 744 }, -{ 0x5300, 260, 0, 742 }, -{ 0x3300, 260, 0, 743 }, -{ 0xb00, 260, 0, 766 }, -{ 0x700, 260, 0, 767 }, -{ 0x80, 260, 0, 783 }, -{ 0x280, 260, 0, 781 }, -{ 0x180, 260, 0, 782 }, -{ 0x40, 260, 0, 795 }, -{ 0x140, 260, 0, 793 }, -{ 0xc0, 260, 0, 794 }, -{ 0x20, 260, 0, 807 }, -{ 0xa0, 260, 0, 805 }, -{ 0x60, 260, 0, 806 }, -{ 0x10, 260, 0, 819 }, -{ 0x50, 260, 0, 817 }, -{ 0x30, 260, 0, 818 }, -{ 0x8, 260, 0, 831 }, -{ 0x28, 260, 0, 829 }, -{ 0x18, 260, 0, 830 }, -{ 0x4, 260, 0, 841 }, -{ 0x2, 260, 0, 842 }, -{ 0x1, 260, 0, 843 }, -{ 0x500, 257, 0, 759 }, -{ 0x1500, 257, 0, 757 }, -{ 0xd00, 257, 0, 758 }, -{ 0x300, 257, 0, 771 }, -{ 0x1300, 257, 0, 747 }, -{ 0x5300, 257, 0, 745 }, -{ 0x3300, 257, 0, 746 }, -{ 0xb00, 257, 0, 769 }, -{ 0x700, 257, 0, 770 }, -{ 0x80, 257, 0, 786 }, -{ 0x280, 257, 0, 784 }, -{ 0x180, 257, 0, 785 }, -{ 0x40, 257, 0, 798 }, -{ 0x140, 257, 0, 796 }, -{ 0xc0, 257, 0, 797 }, -{ 0x20, 257, 0, 810 }, -{ 0xa0, 257, 0, 808 }, -{ 0x60, 257, 0, 809 }, -{ 0x10, 257, 0, 822 }, -{ 0x50, 257, 0, 820 }, -{ 0x30, 257, 0, 821 }, -{ 0x8, 257, 0, 834 }, -{ 0x28, 257, 0, 832 }, -{ 0x18, 257, 0, 833 }, -{ 0x4, 257, 0, 844 }, -{ 0x2, 257, 0, 845 }, -{ 0x1, 257, 0, 846 }, -{ 0x500, 252, 0, 762 }, -{ 0x1500, 252, 0, 760 }, -{ 0xd00, 252, 0, 761 }, -{ 0x300, 252, 0, 774 }, -{ 0x1300, 252, 0, 750 }, -{ 0x5300, 252, 0, 748 }, -{ 0x3300, 252, 0, 749 }, -{ 0xb00, 252, 0, 772 }, -{ 0x700, 252, 0, 773 }, -{ 0x80, 252, 0, 789 }, -{ 0x280, 252, 0, 787 }, -{ 0x180, 252, 0, 788 }, -{ 0x40, 252, 0, 801 }, -{ 0x140, 252, 0, 799 }, -{ 0xc0, 252, 0, 800 }, -{ 0x20, 252, 0, 813 }, -{ 0xa0, 252, 0, 811 }, -{ 0x60, 252, 0, 812 }, -{ 0x10, 252, 0, 825 }, -{ 0x50, 252, 0, 823 }, -{ 0x30, 252, 0, 824 }, -{ 0x8, 252, 0, 837 }, -{ 0x28, 252, 0, 835 }, -{ 0x18, 252, 0, 836 }, -{ 0x4, 252, 0, 847 }, -{ 0x2, 252, 0, 848 }, -{ 0x1, 252, 0, 849 }, -{ 0x8, 254, 1, 895 }, -{ 0x8, 255, 0, 894 }, -{ 0x28, 254, 1, 891 }, -{ 0x28, 255, 0, 890 }, -{ 0x18, 254, 1, 893 }, -{ 0x18, 255, 0, 892 }, -{ 0x4, 254, 1, 957 }, -{ 0x4, 255, 0, 956 }, -{ 0x2, 254, 1, 959 }, -{ 0x2, 255, 0, 958 }, -{ 0x1, 254, 1, 961 }, -{ 0x1, 255, 0, 960 }, -{ 0xa00, 262, 0, 865 }, -{ 0x2a00, 262, 0, 863 }, -{ 0x1a00, 262, 0, 864 }, -{ 0x600, 262, 0, 877 }, -{ 0x2600, 262, 0, 853 }, -{ 0xa600, 262, 0, 851 }, -{ 0x6600, 262, 0, 852 }, -{ 0x1600, 262, 0, 875 }, -{ 0xe00, 262, 0, 876 }, -{ 0x100, 262, 0, 889 }, -{ 0x500, 262, 0, 887 }, -{ 0x300, 262, 0, 888 }, -{ 0x80, 262, 0, 898 }, -{ 0x280, 262, 0, 896 }, -{ 0x180, 262, 0, 897 }, -{ 0x40, 262, 0, 910 }, -{ 0x140, 262, 0, 908 }, -{ 0xc0, 262, 0, 909 }, -{ 0x20, 262, 0, 922 }, -{ 0xa0, 262, 0, 920 }, -{ 0x60, 262, 0, 921 }, -{ 0x10, 262, 0, 934 }, -{ 0x50, 262, 0, 932 }, -{ 0x30, 262, 0, 933 }, -{ 0x8, 262, 0, 946 }, -{ 0x28, 262, 0, 944 }, -{ 0x18, 262, 0, 945 }, -{ 0x4, 262, 0, 962 }, -{ 0x2, 262, 0, 963 }, -{ 0x1, 262, 1, 964 }, -{ 0x1, 263, 0, 850 }, -{ 0x500, 259, 0, 868 }, -{ 0x1500, 259, 0, 866 }, -{ 0xd00, 259, 0, 867 }, -{ 0x300, 259, 0, 880 }, -{ 0x1300, 259, 0, 856 }, -{ 0x5300, 259, 0, 854 }, -{ 0x3300, 259, 0, 855 }, -{ 0xb00, 259, 0, 878 }, -{ 0x700, 259, 0, 879 }, -{ 0x80, 259, 0, 901 }, -{ 0x280, 259, 0, 899 }, -{ 0x180, 259, 0, 900 }, -{ 0x40, 259, 0, 913 }, -{ 0x140, 259, 0, 911 }, -{ 0xc0, 259, 0, 912 }, -{ 0x20, 259, 0, 925 }, -{ 0xa0, 259, 0, 923 }, -{ 0x60, 259, 0, 924 }, -{ 0x10, 259, 0, 937 }, -{ 0x50, 259, 0, 935 }, -{ 0x30, 259, 0, 936 }, -{ 0x8, 259, 0, 949 }, -{ 0x28, 259, 0, 947 }, -{ 0x18, 259, 0, 948 }, -{ 0x4, 259, 0, 965 }, -{ 0x2, 259, 0, 966 }, -{ 0x1, 259, 0, 967 }, -{ 0x500, 256, 0, 871 }, -{ 0x1500, 256, 0, 869 }, -{ 0xd00, 256, 0, 870 }, -{ 0x300, 256, 0, 883 }, -{ 0x1300, 256, 0, 859 }, -{ 0x5300, 256, 0, 857 }, -{ 0x3300, 256, 0, 858 }, -{ 0xb00, 256, 0, 881 }, -{ 0x700, 256, 0, 882 }, -{ 0x80, 256, 0, 904 }, -{ 0x280, 256, 0, 902 }, -{ 0x180, 256, 0, 903 }, -{ 0x40, 256, 0, 916 }, -{ 0x140, 256, 0, 914 }, -{ 0xc0, 256, 0, 915 }, -{ 0x20, 256, 0, 928 }, -{ 0xa0, 256, 0, 926 }, -{ 0x60, 256, 0, 927 }, -{ 0x10, 256, 0, 940 }, -{ 0x50, 256, 0, 938 }, -{ 0x30, 256, 0, 939 }, -{ 0x8, 256, 0, 952 }, -{ 0x28, 256, 0, 950 }, -{ 0x18, 256, 0, 951 }, -{ 0x4, 256, 0, 968 }, -{ 0x2, 256, 0, 969 }, -{ 0x1, 256, 0, 970 }, -{ 0x500, 251, 0, 874 }, -{ 0x1500, 251, 0, 872 }, -{ 0xd00, 251, 0, 873 }, -{ 0x300, 251, 0, 886 }, -{ 0x1300, 251, 0, 862 }, -{ 0x5300, 251, 0, 860 }, -{ 0x3300, 251, 0, 861 }, -{ 0xb00, 251, 0, 884 }, -{ 0x700, 251, 0, 885 }, -{ 0x80, 251, 0, 907 }, -{ 0x280, 251, 0, 905 }, -{ 0x180, 251, 0, 906 }, -{ 0x40, 251, 0, 919 }, -{ 0x140, 251, 0, 917 }, -{ 0xc0, 251, 0, 918 }, -{ 0x20, 251, 0, 931 }, -{ 0xa0, 251, 0, 929 }, -{ 0x60, 251, 0, 930 }, -{ 0x10, 251, 0, 943 }, -{ 0x50, 251, 0, 941 }, -{ 0x30, 251, 0, 942 }, -{ 0x8, 251, 0, 955 }, -{ 0x28, 251, 0, 953 }, -{ 0x18, 251, 0, 954 }, -{ 0x4, 251, 0, 971 }, -{ 0x2, 251, 0, 972 }, -{ 0x1, 251, 0, 973 }, -{ 0x2, 150, 0, 975 }, -{ 0x1, 150, 0, 976 }, -{ 0x1, 50, 0, 977 }, -{ 0x3, 49, 0, 978 }, -{ 0x1, 428, 0, 979 }, -{ 0x1, 442, 0, 980 }, -{ 0x2, 386, 0, 983 }, -{ 0x1, 386, 0, 984 }, -{ 0x2, 384, 0, 985 }, -{ 0x1, 384, 0, 986 }, -{ 0x1, 383, 0, 987 }, -{ 0x1, 328, 0, 992 }, -{ 0x1, 327, 0, 993 }, -{ 0x1, 326, 0, 994 }, -{ 0x1, 325, 0, 995 }, -{ 0x1, 250, 0, 996 }, -{ 0x1, 249, 0, 997 }, -{ 0x1, 324, 0, 998 }, -{ 0x1, 323, 0, 999 }, -{ 0x1, 322, 0, 1000 }, -{ 0x1, 321, 0, 1001 }, -{ 0x1, 320, 0, 1002 }, -{ 0x1, 319, 0, 1003 }, -{ 0x1, 318, 0, 1004 }, -{ 0x2, 248, 0, 1005 }, -{ 0x1, 248, 0, 1006 }, -{ 0x2, 366, 0, 1012 }, -{ 0x1, 366, 0, 1013 }, -{ 0x1, 317, 0, 1014 }, -{ 0x1, 316, 0, 1015 }, -{ 0x1, 315, 0, 1016 }, -{ 0x1, 314, 0, 1017 }, -{ 0x1, 8, 1, 1019 }, -{ 0x1, 9, 0, 1018 }, -{ 0x1, 313, 0, 1020 }, -{ 0x1, 312, 0, 1021 }, -{ 0x1, 311, 0, 1022 }, -{ 0x1, 310, 0, 1023 }, -{ 0x1, 388, 0, 1024 }, -{ 0x1, 399, 0, 1025 }, -{ 0x1, 389, 0, 1026 }, -{ 0x1, 423, 0, 1027 }, -{ 0x1, 309, 0, 1031 }, -{ 0x1, 247, 0, 1032 }, -{ 0x1, 177, 0, 1035 }, -{ 0x2, 291, 0, 1039 }, -{ 0x1, 291, 0, 1040 }, -{ 0x1, 236, 0, 1041 }, -{ 0x5, 48, 0, 1043 }, -{ 0x3, 48, 0, 1044 }, -{ 0x5, 47, 0, 1045 }, -{ 0x3, 47, 0, 1046 }, -{ 0x1, 365, 0, 1047 }, -{ 0x1, 373, 0, 1048 }, -{ 0x1, 371, 0, 1049 }, -{ 0x1, 392, 0, 1050 }, -{ 0x1, 372, 0, 1051 }, -{ 0x1, 370, 0, 1052 }, -{ 0x2, 378, 0, 1053 }, -{ 0x1, 378, 0, 1055 }, -{ 0x2, 376, 0, 1054 }, -{ 0x1, 376, 0, 1056 }, -{ 0x2, 396, 0, 1057 }, -{ 0x1, 396, 0, 1060 }, -{ 0x2, 377, 0, 1058 }, -{ 0x1, 377, 0, 1061 }, -{ 0x2, 375, 0, 1059 }, -{ 0x1, 375, 0, 1062 }, -{ 0x1, 338, 0, 1063 }, -{ 0x1, 337, 0, 1064 }, -{ 0x1, 369, 0, 1065 }, -{ 0x1, 360, 0, 1066 }, -{ 0x1, 362, 0, 1067 }, -{ 0x1, 359, 0, 1068 }, -{ 0x1, 361, 0, 1069 }, -{ 0x2, 446, 0, 1070 }, -{ 0x1, 446, 0, 1073 }, -{ 0x2, 445, 0, 1071 }, -{ 0x1, 445, 0, 1074 }, -{ 0x2, 444, 0, 1072 }, -{ 0x1, 444, 0, 1075 }, -{ 0x1, 348, 0, 1076 }, -{ 0x2, 347, 0, 1077 }, -{ 0x1, 347, 0, 1078 }, -{ 0x2, 294, 0, 1079 }, -{ 0x1, 294, 0, 1082 }, -{ 0x2, 293, 0, 1080 }, -{ 0x1, 293, 0, 1083 }, -{ 0x2, 292, 0, 1081 }, -{ 0x1, 292, 0, 1084 }, -{ 0x2, 363, 0, 1085 }, -{ 0x1, 363, 0, 1086 }, -{ 0x2, 364, 0, 1087 }, -{ 0x1, 364, 0, 1088 }, -{ 0xa, 438, 1, 1100 }, -{ 0xa, 439, 1, 1099 }, -{ 0xa, 440, 1, 1098 }, -{ 0xa, 441, 0, 1097 }, -{ 0x1a, 438, 1, 1092 }, -{ 0x1a, 439, 1, 1091 }, -{ 0x32, 440, 1, 1090 }, -{ 0x32, 441, 0, 1089 }, -{ 0x6, 438, 1, 1108 }, -{ 0x6, 439, 1, 1107 }, -{ 0x6, 440, 1, 1106 }, -{ 0x6, 441, 0, 1105 }, -{ 0x1, 438, 1, 1120 }, -{ 0x1, 439, 1, 1119 }, -{ 0x1, 440, 1, 1118 }, -{ 0x1, 441, 0, 1117 }, -{ 0x9, 438, 1, 1104 }, -{ 0x9, 439, 1, 1103 }, -{ 0x9, 440, 1, 1102 }, -{ 0x9, 441, 0, 1101 }, -{ 0x19, 438, 1, 1096 }, -{ 0x19, 439, 1, 1095 }, -{ 0x31, 440, 1, 1094 }, -{ 0x31, 441, 0, 1093 }, -{ 0x5, 438, 1, 1112 }, -{ 0x5, 439, 1, 1111 }, -{ 0x5, 440, 1, 1110 }, -{ 0x5, 441, 0, 1109 }, -{ 0x3, 438, 1, 1116 }, -{ 0x3, 439, 1, 1115 }, -{ 0x3, 440, 1, 1114 }, -{ 0x3, 441, 0, 1113 }, -{ 0xa, 429, 1, 1132 }, -{ 0xa, 430, 1, 1131 }, -{ 0xa, 431, 1, 1130 }, -{ 0xa, 432, 0, 1129 }, -{ 0x1a, 429, 1, 1124 }, -{ 0x1a, 430, 1, 1123 }, -{ 0x32, 431, 1, 1122 }, -{ 0x32, 432, 0, 1121 }, -{ 0x6, 429, 1, 1140 }, -{ 0x6, 430, 1, 1139 }, -{ 0x6, 431, 1, 1138 }, -{ 0x6, 432, 0, 1137 }, -{ 0x1, 429, 1, 1152 }, -{ 0x1, 430, 1, 1151 }, -{ 0x1, 431, 1, 1150 }, -{ 0x1, 432, 0, 1149 }, -{ 0x9, 429, 1, 1136 }, -{ 0x9, 430, 1, 1135 }, -{ 0x9, 431, 1, 1134 }, -{ 0x9, 432, 0, 1133 }, -{ 0x19, 429, 1, 1128 }, -{ 0x19, 430, 1, 1127 }, -{ 0x31, 431, 1, 1126 }, -{ 0x31, 432, 0, 1125 }, -{ 0x5, 429, 1, 1144 }, -{ 0x5, 430, 1, 1143 }, -{ 0x5, 431, 1, 1142 }, -{ 0x5, 432, 0, 1141 }, -{ 0x3, 429, 1, 1148 }, -{ 0x3, 430, 1, 1147 }, -{ 0x3, 431, 1, 1146 }, -{ 0x3, 432, 0, 1145 }, -{ 0xa, 433, 1, 1164 }, -{ 0xa, 434, 1, 1163 }, -{ 0xa, 435, 1, 1162 }, -{ 0xa, 436, 0, 1161 }, -{ 0x1a, 433, 1, 1156 }, -{ 0x1a, 434, 1, 1155 }, -{ 0x32, 435, 1, 1154 }, -{ 0x32, 436, 0, 1153 }, -{ 0x6, 433, 1, 1172 }, -{ 0x6, 434, 1, 1171 }, -{ 0x6, 435, 1, 1170 }, -{ 0x6, 436, 0, 1169 }, -{ 0x1, 433, 1, 1184 }, -{ 0x1, 434, 1, 1183 }, -{ 0x1, 435, 1, 1182 }, -{ 0x1, 436, 0, 1181 }, -{ 0x9, 433, 1, 1168 }, -{ 0x9, 434, 1, 1167 }, -{ 0x9, 435, 1, 1166 }, -{ 0x9, 436, 0, 1165 }, -{ 0x19, 433, 1, 1160 }, -{ 0x19, 434, 1, 1159 }, -{ 0x31, 435, 1, 1158 }, -{ 0x31, 436, 0, 1157 }, -{ 0x5, 433, 1, 1176 }, -{ 0x5, 434, 1, 1175 }, -{ 0x5, 435, 1, 1174 }, -{ 0x5, 436, 0, 1173 }, -{ 0x3, 433, 1, 1180 }, -{ 0x3, 434, 1, 1179 }, -{ 0x3, 435, 1, 1178 }, -{ 0x3, 436, 0, 1177 }, -{ 0x1, 139, 0, 1185 }, -{ 0x1, 138, 0, 1186 }, -{ 0x1, 391, 1, 1188 }, -{ 0x1, 137, 0, 1187 }, -{ 0x2, 395, 1, 1190 }, -{ 0x2, 141, 0, 1189 }, -{ 0x1, 395, 1, 1192 }, -{ 0x1, 141, 0, 1191 }, -{ 0x1, 397, 0, 1193 }, -{ 0x1, 136, 0, 1194 }, -{ 0x2, 135, 0, 1195 }, -{ 0x2, 134, 0, 1196 }, -{ 0x1, 459, 1, 1202 }, -{ 0x1, 246, 0, 1033 }, -{ 0x1, 458, 0, 1203 }, -{ 0x1, 457, 1, 1204 }, -{ 0x1, 245, 0, 1042 }, -{ 0x1, 308, 0, 1205 }, -{ 0x1, 307, 1, 1206 }, -{ 0x1, 290, 0, 1034 }, -{ 0x1, 306, 0, 1207 }, -{ 0x1, 305, 1, 1208 }, -{ 0x1, 427, 0, 1036 }, -{ 0x1, 304, 1, 1209 }, -{ 0x1, 398, 0, 1038 }, -{ 0x1, 303, 0, 1210 }, -{ 0x1, 302, 0, 1211 }, -{ 0x1, 301, 0, 1212 }, -{ 0x1, 300, 1, 1213 }, -{ 0x2, 398, 0, 1037 }, -{ 0x10, 299, 0, 1217 }, -{ 0x90, 299, 0, 1215 }, -{ 0x190, 299, 0, 1214 }, -{ 0x50, 299, 0, 1216 }, -{ 0x30, 299, 0, 1219 }, -{ 0x70, 299, 0, 1218 }, -{ 0x8, 299, 0, 1221 }, -{ 0x18, 299, 0, 1220 }, -{ 0x4, 299, 0, 1222 }, -{ 0x1, 299, 0, 1225 }, -{ 0x3, 299, 0, 1224 }, -{ 0x1, 298, 1, 1226 }, -{ 0x2, 299, 0, 1223 }, -{ 0x3, 46, 0, 1227 }, -{ 0x1, 241, 1, 1228 }, -{ 0x1, 242, 1, 1028 }, -{ 0x1, 243, 0, 88 }, -{ 0x1, 341, 1, 1229 }, -{ 0x1, 342, 1, 1029 }, -{ 0x1, 343, 0, 89 }, -{ 0x1, 34, 1, 1230 }, -{ 0x1, 35, 1, 1030 }, -{ 0x1, 36, 0, 90 }, -{ 0x1, 230, 0, 1231 }, -{ 0x4, 452, 0, 1232 }, -{ 0x2, 452, 0, 1233 }, -{ 0x1, 452, 1, 1235 }, -{ 0x1, 453, 0, 1234 }, -{ 0x8, 454, 0, 1236 }, -{ 0x4, 454, 0, 1237 }, -{ 0x1, 454, 1, 1239 }, -{ 0x2, 454, 0, 1238 }, -{ 0x8, 219, 0, 1240 }, -{ 0x4, 219, 0, 1241 }, -{ 0x2, 219, 0, 1242 }, -{ 0x1, 219, 1, 1244 }, -{ 0x1, 220, 0, 1243 }, -{ 0x10, 221, 0, 1245 }, -{ 0x8, 221, 0, 1246 }, -{ 0x4, 221, 0, 1247 }, -{ 0x1, 221, 1, 1249 }, -{ 0x2, 221, 0, 1248 }, -{ 0x220, 191, 0, 1250 }, -{ 0x120, 191, 0, 1251 }, -{ 0xa0, 191, 0, 1252 }, -{ 0x60, 191, 1, 1254 }, -{ 0x4, 192, 0, 1253 }, -{ 0x110, 191, 0, 1260 }, -{ 0x90, 191, 0, 1261 }, -{ 0x50, 191, 0, 1262 }, -{ 0x30, 191, 1, 1264 }, -{ 0x2, 192, 0, 1263 }, -{ 0x8, 191, 0, 1265 }, -{ 0x4, 191, 0, 1266 }, -{ 0x2, 191, 0, 1267 }, -{ 0x1, 191, 1, 1269 }, -{ 0x1, 192, 0, 1268 }, -{ 0x440, 193, 0, 1255 }, -{ 0x240, 193, 0, 1256 }, -{ 0x140, 193, 0, 1257 }, -{ 0xc0, 193, 1, 1259 }, -{ 0x40, 193, 0, 1258 }, -{ 0x220, 193, 0, 1270 }, -{ 0x120, 193, 0, 1271 }, -{ 0xa0, 193, 0, 1272 }, -{ 0x60, 193, 1, 1274 }, -{ 0x20, 193, 0, 1273 }, -{ 0x10, 193, 0, 1275 }, -{ 0x8, 193, 0, 1276 }, -{ 0x4, 193, 0, 1277 }, -{ 0x1, 193, 1, 1279 }, -{ 0x2, 193, 0, 1278 }, -{ 0x8, 215, 0, 1280 }, -{ 0x4, 215, 0, 1281 }, -{ 0x2, 215, 0, 1282 }, -{ 0x1, 215, 1, 1284 }, -{ 0x1, 216, 0, 1283 }, -{ 0x220, 187, 0, 1285 }, -{ 0x120, 187, 0, 1286 }, -{ 0xa0, 187, 0, 1287 }, -{ 0x60, 187, 1, 1289 }, -{ 0x4, 188, 0, 1288 }, -{ 0x110, 187, 0, 1295 }, -{ 0x90, 187, 0, 1296 }, -{ 0x50, 187, 0, 1297 }, -{ 0x30, 187, 1, 1299 }, -{ 0x2, 188, 0, 1298 }, -{ 0x8, 187, 0, 1300 }, -{ 0x4, 187, 0, 1301 }, -{ 0x2, 187, 0, 1302 }, -{ 0x1, 187, 1, 1304 }, -{ 0x1, 188, 0, 1303 }, -{ 0x440, 233, 0, 1290 }, -{ 0x240, 233, 0, 1291 }, -{ 0x140, 233, 0, 1292 }, -{ 0xc0, 233, 1, 1294 }, -{ 0x40, 233, 0, 1293 }, -{ 0x220, 233, 0, 1305 }, -{ 0x120, 233, 0, 1306 }, -{ 0xa0, 233, 0, 1307 }, -{ 0x60, 233, 1, 1309 }, -{ 0x20, 233, 0, 1308 }, -{ 0x10, 233, 0, 1310 }, -{ 0x8, 233, 0, 1311 }, -{ 0x4, 233, 0, 1312 }, -{ 0x1, 233, 1, 1314 }, -{ 0x2, 233, 0, 1313 }, -{ 0x8, 207, 0, 1315 }, -{ 0x4, 207, 0, 1316 }, -{ 0x2, 207, 0, 1317 }, -{ 0x1, 207, 1, 1319 }, -{ 0x1, 208, 0, 1318 }, -{ 0x10, 214, 0, 1320 }, -{ 0x8, 214, 0, 1321 }, -{ 0x4, 214, 0, 1322 }, -{ 0x1, 214, 1, 1324 }, -{ 0x2, 214, 0, 1323 }, -{ 0x220, 178, 0, 1325 }, -{ 0x120, 178, 0, 1326 }, -{ 0xa0, 178, 0, 1327 }, -{ 0x60, 178, 1, 1329 }, -{ 0x4, 179, 0, 1328 }, -{ 0x110, 178, 0, 1350 }, -{ 0x90, 178, 0, 1351 }, -{ 0x50, 178, 0, 1352 }, -{ 0x30, 178, 1, 1354 }, -{ 0x2, 179, 0, 1353 }, -{ 0x8, 178, 0, 1355 }, -{ 0x4, 178, 0, 1356 }, -{ 0x2, 178, 0, 1357 }, -{ 0x1, 178, 1, 1359 }, -{ 0x1, 179, 0, 1358 }, -{ 0x440, 186, 0, 1330 }, -{ 0x240, 186, 0, 1331 }, -{ 0x140, 186, 0, 1332 }, -{ 0xc0, 186, 1, 1334 }, -{ 0x40, 186, 0, 1333 }, -{ 0x220, 186, 0, 1360 }, -{ 0x120, 186, 0, 1361 }, -{ 0xa0, 186, 0, 1362 }, -{ 0x60, 186, 1, 1364 }, -{ 0x20, 186, 0, 1363 }, -{ 0x10, 186, 0, 1365 }, -{ 0x8, 186, 0, 1366 }, -{ 0x4, 186, 0, 1367 }, -{ 0x1, 186, 1, 1369 }, -{ 0x2, 186, 0, 1368 }, -{ 0x440, 143, 0, 1335 }, -{ 0x240, 143, 0, 1336 }, -{ 0x140, 143, 0, 1337 }, -{ 0xc0, 143, 1, 1339 }, -{ 0x40, 143, 0, 1338 }, -{ 0x220, 143, 0, 1370 }, -{ 0x120, 143, 0, 1371 }, -{ 0xa0, 143, 0, 1372 }, -{ 0x60, 143, 1, 1374 }, -{ 0x20, 143, 0, 1373 }, -{ 0x10, 143, 0, 1375 }, -{ 0x8, 143, 0, 1376 }, -{ 0x1, 143, 1, 1379 }, -{ 0x2, 143, 0, 1378 }, -{ 0x440, 194, 1, 1345 }, -{ 0x441, 174, 0, 1340 }, -{ 0x240, 194, 1, 1346 }, -{ 0x241, 174, 0, 1341 }, -{ 0x140, 194, 1, 1347 }, -{ 0x141, 174, 0, 1342 }, -{ 0xc0, 194, 1, 1349 }, -{ 0x40, 194, 1, 1348 }, -{ 0xc1, 174, 1, 1344 }, -{ 0x41, 174, 0, 1343 }, -{ 0x220, 194, 1, 1390 }, -{ 0x221, 174, 0, 1380 }, -{ 0x120, 194, 1, 1391 }, -{ 0x121, 174, 0, 1381 }, -{ 0xa0, 194, 1, 1392 }, -{ 0xa1, 174, 0, 1382 }, -{ 0x60, 194, 1, 1394 }, -{ 0x20, 194, 1, 1393 }, -{ 0x61, 174, 1, 1384 }, -{ 0x21, 174, 0, 1383 }, -{ 0x10, 194, 1, 1395 }, -{ 0x11, 174, 0, 1385 }, -{ 0x8, 194, 1, 1396 }, -{ 0x9, 174, 0, 1386 }, -{ 0x4, 194, 1, 1397 }, -{ 0x5, 174, 0, 1387 }, -{ 0x1, 194, 1, 1399 }, -{ 0x2, 194, 1, 1398 }, -{ 0x3, 174, 1, 1389 }, -{ 0x1, 174, 0, 1388 }, -{ 0x1, 153, 1, 1407 }, -{ 0x1, 154, 1, 1406 }, -{ 0x1, 155, 1, 1405 }, -{ 0x1, 156, 0, 1404 }, -{ 0x3, 153, 1, 1403 }, -{ 0x3, 154, 1, 1402 }, -{ 0x3, 155, 1, 1401 }, -{ 0x3, 156, 0, 1400 }, -{ 0x1108, 159, 1, 1569 }, -{ 0x1108, 160, 1, 1568 }, -{ 0x1108, 165, 1, 1409 }, -{ 0x1108, 166, 0, 1408 }, -{ 0x908, 159, 1, 1571 }, -{ 0x908, 160, 1, 1570 }, -{ 0x908, 165, 1, 1411 }, -{ 0x908, 166, 0, 1410 }, -{ 0x508, 159, 1, 1573 }, -{ 0x508, 160, 1, 1572 }, -{ 0x508, 165, 1, 1413 }, -{ 0x508, 166, 0, 1412 }, -{ 0x308, 159, 1, 1577 }, -{ 0x308, 160, 1, 1576 }, -{ 0x108, 160, 1, 1574 }, -{ 0x18, 161, 1, 1575 }, -{ 0x308, 165, 1, 1417 }, -{ 0x308, 166, 1, 1416 }, -{ 0x108, 166, 1, 1414 }, -{ 0x18, 167, 0, 1415 }, -{ 0x88, 159, 1, 1609 }, -{ 0x88, 160, 1, 1608 }, -{ 0x88, 165, 1, 1489 }, -{ 0x88, 166, 0, 1488 }, -{ 0x48, 159, 1, 1611 }, -{ 0x48, 160, 1, 1610 }, -{ 0x48, 165, 1, 1491 }, -{ 0x48, 166, 0, 1490 }, -{ 0x28, 159, 1, 1613 }, -{ 0x28, 160, 1, 1612 }, -{ 0x28, 165, 1, 1493 }, -{ 0x28, 166, 0, 1492 }, -{ 0x18, 159, 1, 1617 }, -{ 0x18, 160, 1, 1616 }, -{ 0x8, 160, 1, 1614 }, -{ 0x8, 161, 1, 1615 }, -{ 0x18, 165, 1, 1497 }, -{ 0x18, 166, 1, 1496 }, -{ 0x8, 166, 1, 1494 }, -{ 0x8, 167, 0, 1495 }, -{ 0x884, 159, 1, 1579 }, -{ 0x884, 160, 1, 1578 }, -{ 0x442, 162, 1, 1469 }, -{ 0x442, 163, 1, 1468 }, -{ 0x884, 165, 1, 1439 }, -{ 0x884, 166, 1, 1438 }, -{ 0x442, 168, 1, 1419 }, -{ 0x442, 169, 0, 1418 }, -{ 0x484, 159, 1, 1581 }, -{ 0x484, 160, 1, 1580 }, -{ 0x242, 162, 1, 1471 }, -{ 0x242, 163, 1, 1470 }, -{ 0x484, 165, 1, 1441 }, -{ 0x484, 166, 1, 1440 }, -{ 0x242, 168, 1, 1421 }, -{ 0x242, 169, 0, 1420 }, -{ 0x284, 159, 1, 1583 }, -{ 0x284, 160, 1, 1582 }, -{ 0x142, 162, 1, 1473 }, -{ 0x142, 163, 1, 1472 }, -{ 0x284, 165, 1, 1443 }, -{ 0x284, 166, 1, 1442 }, -{ 0x142, 168, 1, 1423 }, -{ 0x142, 169, 0, 1422 }, -{ 0x184, 159, 1, 1587 }, -{ 0x184, 160, 1, 1586 }, -{ 0x84, 160, 1, 1584 }, -{ 0xc, 161, 1, 1585 }, -{ 0xc2, 162, 1, 1477 }, -{ 0xc2, 163, 1, 1476 }, -{ 0x42, 163, 1, 1474 }, -{ 0x6, 164, 1, 1475 }, -{ 0x184, 165, 1, 1447 }, -{ 0x184, 166, 1, 1446 }, -{ 0x84, 166, 1, 1444 }, -{ 0xc, 167, 1, 1445 }, -{ 0xc2, 168, 1, 1427 }, -{ 0xc2, 169, 1, 1426 }, -{ 0x42, 169, 1, 1424 }, -{ 0x6, 170, 0, 1425 }, -{ 0x44, 159, 1, 1619 }, -{ 0x44, 160, 1, 1618 }, -{ 0x22, 162, 1, 1549 }, -{ 0x22, 163, 1, 1548 }, -{ 0x44, 165, 1, 1519 }, -{ 0x44, 166, 1, 1518 }, -{ 0x22, 168, 1, 1499 }, -{ 0x22, 169, 0, 1498 }, -{ 0x24, 159, 1, 1621 }, -{ 0x24, 160, 1, 1620 }, -{ 0x12, 162, 1, 1551 }, -{ 0x12, 163, 1, 1550 }, -{ 0x24, 165, 1, 1521 }, -{ 0x24, 166, 1, 1520 }, -{ 0x12, 168, 1, 1501 }, -{ 0x12, 169, 0, 1500 }, -{ 0x14, 159, 1, 1623 }, -{ 0x14, 160, 1, 1622 }, -{ 0xa, 162, 1, 1553 }, -{ 0xa, 163, 1, 1552 }, -{ 0x14, 165, 1, 1523 }, -{ 0x14, 166, 1, 1522 }, -{ 0xa, 168, 1, 1503 }, -{ 0xa, 169, 0, 1502 }, -{ 0xc, 159, 1, 1627 }, -{ 0xc, 160, 1, 1626 }, -{ 0x4, 160, 1, 1624 }, -{ 0x4, 161, 1, 1625 }, -{ 0x6, 162, 1, 1557 }, -{ 0x6, 163, 1, 1556 }, -{ 0x2, 163, 1, 1554 }, -{ 0x2, 164, 1, 1555 }, -{ 0xc, 165, 1, 1527 }, -{ 0xc, 166, 1, 1526 }, -{ 0x4, 166, 1, 1524 }, -{ 0x4, 167, 1, 1525 }, -{ 0x6, 168, 1, 1507 }, -{ 0x6, 169, 1, 1506 }, -{ 0x2, 169, 1, 1504 }, -{ 0x2, 170, 0, 1505 }, -{ 0x442, 159, 1, 1589 }, -{ 0x442, 160, 1, 1588 }, -{ 0x221, 162, 1, 1479 }, -{ 0x221, 163, 1, 1478 }, -{ 0x442, 165, 1, 1449 }, -{ 0x442, 166, 1, 1448 }, -{ 0x221, 168, 1, 1429 }, -{ 0x221, 169, 0, 1428 }, -{ 0x242, 159, 1, 1591 }, -{ 0x242, 160, 1, 1590 }, -{ 0x121, 162, 1, 1481 }, -{ 0x121, 163, 1, 1480 }, -{ 0x242, 165, 1, 1451 }, -{ 0x242, 166, 1, 1450 }, -{ 0x121, 168, 1, 1431 }, -{ 0x121, 169, 0, 1430 }, -{ 0x142, 159, 1, 1593 }, -{ 0x142, 160, 1, 1592 }, -{ 0xa1, 162, 1, 1483 }, -{ 0xa1, 163, 1, 1482 }, -{ 0x142, 165, 1, 1453 }, -{ 0x142, 166, 1, 1452 }, -{ 0xa1, 168, 1, 1433 }, -{ 0xa1, 169, 0, 1432 }, -{ 0xc2, 159, 1, 1597 }, -{ 0xc2, 160, 1, 1596 }, -{ 0x42, 160, 1, 1594 }, -{ 0x6, 161, 1, 1595 }, -{ 0x61, 162, 1, 1487 }, -{ 0x61, 163, 1, 1486 }, -{ 0x21, 163, 1, 1484 }, -{ 0x3, 164, 1, 1485 }, -{ 0xc2, 165, 1, 1457 }, -{ 0xc2, 166, 1, 1456 }, -{ 0x42, 166, 1, 1454 }, -{ 0x6, 167, 1, 1455 }, -{ 0x61, 168, 1, 1437 }, -{ 0x61, 169, 1, 1436 }, -{ 0x21, 169, 1, 1434 }, -{ 0x3, 170, 0, 1435 }, -{ 0x22, 159, 1, 1629 }, -{ 0x22, 160, 1, 1628 }, -{ 0x11, 162, 1, 1559 }, -{ 0x11, 163, 1, 1558 }, -{ 0x22, 165, 1, 1529 }, -{ 0x22, 166, 1, 1528 }, -{ 0x11, 168, 1, 1509 }, -{ 0x11, 169, 0, 1508 }, -{ 0x12, 159, 1, 1631 }, -{ 0x12, 160, 1, 1630 }, -{ 0x9, 162, 1, 1561 }, -{ 0x9, 163, 1, 1560 }, -{ 0x12, 165, 1, 1531 }, -{ 0x12, 166, 1, 1530 }, -{ 0x9, 168, 1, 1511 }, -{ 0x9, 169, 0, 1510 }, -{ 0xa, 159, 1, 1633 }, -{ 0xa, 160, 1, 1632 }, -{ 0x5, 162, 1, 1563 }, -{ 0x5, 163, 1, 1562 }, -{ 0xa, 165, 1, 1533 }, -{ 0xa, 166, 1, 1532 }, -{ 0x5, 168, 1, 1513 }, -{ 0x5, 169, 0, 1512 }, -{ 0x6, 159, 1, 1637 }, -{ 0x6, 160, 1, 1636 }, -{ 0x2, 160, 1, 1634 }, -{ 0x2, 161, 1, 1635 }, -{ 0x3, 162, 1, 1567 }, -{ 0x3, 163, 1, 1566 }, -{ 0x1, 163, 1, 1564 }, -{ 0x1, 164, 1, 1565 }, -{ 0x6, 165, 1, 1537 }, -{ 0x6, 166, 1, 1536 }, -{ 0x2, 166, 1, 1534 }, -{ 0x2, 167, 1, 1535 }, -{ 0x3, 168, 1, 1517 }, -{ 0x3, 169, 1, 1516 }, -{ 0x1, 169, 1, 1514 }, -{ 0x1, 170, 0, 1515 }, -{ 0x221, 159, 1, 1599 }, -{ 0x221, 160, 1, 1598 }, -{ 0x221, 165, 1, 1459 }, -{ 0x221, 166, 0, 1458 }, -{ 0x121, 159, 1, 1601 }, -{ 0x121, 160, 1, 1600 }, -{ 0x121, 165, 1, 1461 }, -{ 0x121, 166, 0, 1460 }, -{ 0xa1, 159, 1, 1603 }, -{ 0xa1, 160, 1, 1602 }, -{ 0xa1, 165, 1, 1463 }, -{ 0xa1, 166, 0, 1462 }, -{ 0x61, 159, 1, 1607 }, -{ 0x61, 160, 1, 1606 }, -{ 0x21, 160, 1, 1604 }, -{ 0x3, 161, 1, 1605 }, -{ 0x61, 165, 1, 1467 }, -{ 0x61, 166, 1, 1466 }, -{ 0x21, 166, 1, 1464 }, -{ 0x3, 167, 0, 1465 }, -{ 0x11, 159, 1, 1639 }, -{ 0x11, 160, 1, 1638 }, -{ 0x11, 165, 1, 1539 }, -{ 0x11, 166, 0, 1538 }, -{ 0x9, 159, 1, 1641 }, -{ 0x9, 160, 1, 1640 }, -{ 0x9, 165, 1, 1541 }, -{ 0x9, 166, 0, 1540 }, -{ 0x5, 159, 1, 1643 }, -{ 0x5, 160, 1, 1642 }, -{ 0x5, 165, 1, 1543 }, -{ 0x5, 166, 0, 1542 }, -{ 0x3, 159, 1, 1647 }, -{ 0x3, 160, 1, 1646 }, -{ 0x1, 160, 1, 1644 }, -{ 0x1, 161, 1, 1645 }, -{ 0x3, 165, 1, 1547 }, -{ 0x3, 166, 1, 1546 }, -{ 0x1, 166, 1, 1544 }, -{ 0x1, 167, 0, 1545 }, -{ 0x442, 205, 0, 1648 }, -{ 0x242, 205, 0, 1649 }, -{ 0x142, 205, 0, 1650 }, -{ 0xc2, 205, 1, 1652 }, -{ 0x6, 206, 1, 1651 }, -{ 0x1, 443, 0, 981 }, -{ 0x22, 205, 0, 1658 }, -{ 0x12, 205, 0, 1659 }, -{ 0xa, 205, 0, 1660 }, -{ 0x6, 205, 1, 1662 }, -{ 0x2, 206, 1, 1661 }, -{ 0x2, 367, 0, 1010 }, -{ 0x221, 205, 0, 1653 }, -{ 0x121, 205, 0, 1654 }, -{ 0xa1, 205, 0, 1655 }, -{ 0x61, 205, 1, 1657 }, -{ 0x3, 206, 1, 1656 }, -{ 0x1, 437, 0, 982 }, -{ 0x11, 205, 0, 1663 }, -{ 0x9, 205, 0, 1664 }, -{ 0x5, 205, 0, 1665 }, -{ 0x3, 205, 1, 1667 }, -{ 0x1, 206, 1, 1666 }, -{ 0x1, 367, 0, 1011 }, -{ 0x4, 211, 0, 1668 }, -{ 0x1, 211, 0, 1670 }, -{ 0x1, 218, 0, 1671 }, -{ 0x1, 217, 1, 1672 }, -{ 0x2, 211, 0, 1669 }, -{ 0x1, 196, 0, 1673 }, -{ 0x880, 202, 0, 1674 }, -{ 0x480, 202, 0, 1675 }, -{ 0x280, 202, 0, 1676 }, -{ 0x180, 202, 1, 1678 }, -{ 0x80, 203, 0, 1677 }, -{ 0x440, 202, 1, 1689 }, -{ 0x88, 204, 0, 1679 }, -{ 0x240, 202, 1, 1690 }, -{ 0x48, 204, 0, 1680 }, -{ 0x140, 202, 1, 1691 }, -{ 0x28, 204, 0, 1681 }, -{ 0xc0, 202, 1, 1693 }, -{ 0x40, 203, 1, 1692 }, -{ 0x18, 204, 1, 1683 }, -{ 0x8, 204, 0, 1682 }, -{ 0x220, 202, 1, 1694 }, -{ 0x44, 204, 0, 1684 }, -{ 0x120, 202, 1, 1695 }, -{ 0x24, 204, 0, 1685 }, -{ 0xa0, 202, 1, 1696 }, -{ 0x14, 204, 0, 1686 }, -{ 0x60, 202, 1, 1698 }, -{ 0x20, 203, 1, 1697 }, -{ 0xc, 204, 1, 1688 }, -{ 0x4, 204, 0, 1687 }, -{ 0x110, 202, 0, 1699 }, -{ 0x90, 202, 0, 1700 }, -{ 0x50, 202, 0, 1701 }, -{ 0x30, 202, 1, 1703 }, -{ 0x10, 203, 1, 1702 }, -{ 0x1, 385, 0, 974 }, -{ 0x88, 202, 0, 1704 }, -{ 0x48, 202, 0, 1705 }, -{ 0x28, 202, 0, 1706 }, -{ 0x18, 202, 1, 1708 }, -{ 0x8, 203, 1, 1707 }, -{ 0xc, 368, 0, 1007 }, -{ 0x44, 202, 1, 1719 }, -{ 0x22, 204, 0, 1709 }, -{ 0x24, 202, 1, 1720 }, -{ 0x12, 204, 0, 1710 }, -{ 0x14, 202, 1, 1721 }, -{ 0xa, 204, 0, 1711 }, -{ 0xc, 202, 1, 1723 }, -{ 0x4, 203, 1, 1722 }, -{ 0x6, 204, 1, 1713 }, -{ 0x2, 204, 1, 1712 }, -{ 0x6, 368, 0, 1008 }, -{ 0x22, 202, 1, 1724 }, -{ 0x11, 204, 0, 1714 }, -{ 0x12, 202, 1, 1725 }, -{ 0x9, 204, 0, 1715 }, -{ 0xa, 202, 1, 1726 }, -{ 0x5, 204, 0, 1716 }, -{ 0x6, 202, 1, 1728 }, -{ 0x2, 203, 1, 1727 }, -{ 0x3, 204, 1, 1718 }, -{ 0x1, 204, 1, 1717 }, -{ 0x3, 368, 0, 1009 }, -{ 0x11, 202, 0, 1729 }, -{ 0x9, 202, 0, 1730 }, -{ 0x5, 202, 0, 1731 }, -{ 0x3, 202, 1, 1733 }, -{ 0x1, 203, 0, 1732 }, -{ 0x8, 198, 0, 1734 }, -{ 0x4, 198, 0, 1735 }, -{ 0x2, 198, 0, 1736 }, -{ 0x1, 198, 1, 1738 }, -{ 0x1, 199, 1, 1737 }, -{ 0x1, 332, 0, 988 }, -{ 0x8, 200, 0, 1739 }, -{ 0x4, 200, 0, 1740 }, -{ 0x2, 200, 0, 1741 }, -{ 0x1, 200, 1, 1743 }, -{ 0x1, 201, 1, 1742 }, -{ 0x1, 331, 0, 989 }, -{ 0x8, 209, 0, 1744 }, -{ 0x4, 209, 0, 1745 }, -{ 0x2, 209, 0, 1746 }, -{ 0x1, 209, 1, 1748 }, -{ 0x1, 210, 1, 1747 }, -{ 0x1, 330, 0, 990 }, -{ 0x8, 212, 0, 1749 }, -{ 0x4, 212, 0, 1750 }, -{ 0x2, 212, 0, 1751 }, -{ 0x1, 212, 1, 1753 }, -{ 0x1, 213, 1, 1752 }, -{ 0x1, 329, 0, 991 }, -{ 0x8, 224, 0, 1754 }, -{ 0x4, 224, 0, 1755 }, -{ 0x2, 224, 0, 1756 }, -{ 0x1, 224, 1, 1758 }, -{ 0x1, 225, 0, 1757 }, -{ 0x8, 222, 0, 1759 }, -{ 0x4, 222, 0, 1760 }, -{ 0x2, 222, 0, 1761 }, -{ 0x1, 222, 1, 1763 }, -{ 0x1, 223, 0, 1762 }, -{ 0x1, 240, 0, 1764 }, -{ 0x1, 340, 0, 1765 }, -{ 0x1, 33, 0, 1766 }, -{ 0x8, 151, 0, 1767 }, -{ 0x4, 151, 0, 1768 }, -{ 0x2, 151, 0, 1769 }, -{ 0x1, 151, 1, 1771 }, -{ 0x1, 152, 0, 1770 }, -{ 0x8, 157, 0, 1772 }, -{ 0x4, 157, 0, 1773 }, -{ 0x2, 157, 0, 1774 }, -{ 0x1, 157, 1, 1776 }, -{ 0x1, 158, 0, 1775 }, -{ 0x8, 231, 0, 1777 }, -{ 0x4, 231, 0, 1778 }, -{ 0x2, 231, 0, 1779 }, -{ 0x1, 231, 1, 1781 }, -{ 0x1, 232, 0, 1780 }, -{ 0x1, 173, 0, 1782 }, -{ 0x442, 171, 0, 1783 }, -{ 0x242, 171, 0, 1784 }, -{ 0x142, 171, 0, 1785 }, -{ 0xc2, 171, 1, 1787 }, -{ 0x6, 172, 0, 1786 }, -{ 0x22, 171, 0, 1793 }, -{ 0x12, 171, 0, 1794 }, -{ 0xa, 171, 0, 1795 }, -{ 0x6, 171, 1, 1797 }, -{ 0x2, 172, 1, 1796 }, -{ 0x1, 135, 0, 1197 }, -{ 0x221, 171, 0, 1788 }, -{ 0x121, 171, 0, 1789 }, -{ 0xa1, 171, 0, 1790 }, -{ 0x61, 171, 1, 1792 }, -{ 0x3, 172, 0, 1791 }, -{ 0x11, 171, 0, 1798 }, -{ 0x9, 171, 0, 1799 }, -{ 0x5, 171, 0, 1800 }, -{ 0x3, 171, 1, 1802 }, -{ 0x1, 172, 1, 1801 }, -{ 0x1, 134, 0, 1198 }, -{ 0x1, 237, 0, 1803 }, -{ 0x1, 195, 0, 1804 }, -{ 0x1, 149, 0, 1805 }, -{ 0x1, 148, 0, 1806 }, -{ 0x4, 234, 0, 1807 }, -{ 0x2, 234, 0, 1808 }, -{ 0x1, 234, 0, 1809 }, -{ 0x1, 197, 0, 1810 }, -{ 0x2, 235, 0, 1811 }, -{ 0x1, 235, 0, 1812 }, -{ 0x4, 185, 0, 1813 }, -{ 0x2, 185, 0, 1814 }, -{ 0x1, 185, 0, 1815 }, -{ 0x4, 182, 0, 1816 }, -{ 0x1, 190, 0, 1819 }, -{ 0x1, 189, 1, 1820 }, -{ 0x2, 182, 0, 1817 }, -{ 0x1, 142, 0, 1821 }, -{ 0x1, 297, 1, 1822 }, -{ 0x1, 182, 0, 1818 }, -{ 0x8, 144, 0, 1823 }, -{ 0x4, 144, 0, 1824 }, -{ 0x2, 144, 0, 1825 }, -{ 0x1, 144, 1, 1827 }, -{ 0x1, 145, 0, 1826 }, -{ 0x8, 146, 0, 1828 }, -{ 0x4, 146, 0, 1829 }, -{ 0x2, 146, 0, 1830 }, -{ 0x1, 146, 1, 1832 }, -{ 0x1, 147, 1, 1831 }, -{ 0x1, 426, 0, 1199 }, -{ 0x8, 180, 0, 1833 }, -{ 0x4, 180, 0, 1834 }, -{ 0x2, 180, 0, 1835 }, -{ 0x1, 180, 1, 1837 }, -{ 0x1, 181, 1, 1836 }, -{ 0x1, 425, 0, 1200 }, -{ 0x8, 183, 0, 1838 }, -{ 0x4, 183, 0, 1839 }, -{ 0x2, 183, 0, 1840 }, -{ 0x1, 183, 1, 1842 }, -{ 0x1, 184, 1, 1841 }, -{ 0x1, 424, 0, 1201 }, -{ 0x8, 228, 0, 1843 }, -{ 0x4, 228, 0, 1844 }, -{ 0x2, 228, 0, 1845 }, -{ 0x1, 228, 1, 1847 }, -{ 0x1, 229, 0, 1846 }, -{ 0x8, 226, 0, 1848 }, -{ 0x4, 226, 0, 1849 }, -{ 0x2, 226, 0, 1850 }, -{ 0x1, 226, 1, 1852 }, -{ 0x1, 227, 0, 1851 }, -{ 0x8, 44, 0, 1857 }, -{ 0x18, 44, 0, 1853 }, -{ 0x4, 44, 0, 1858 }, -{ 0xc, 44, 0, 1854 }, -{ 0x2, 44, 0, 1859 }, -{ 0x6, 44, 0, 1855 }, -{ 0x1, 44, 0, 1860 }, -{ 0x3, 44, 0, 1856 }, -{ 0x51, 30, 0, 1862 }, -{ 0xd1, 30, 0, 1861 }, -{ 0x31, 30, 1, 1872 }, -{ 0x11, 31, 0, 1871 }, -{ 0x71, 30, 1, 1870 }, -{ 0x31, 31, 0, 1869 }, -{ 0x29, 30, 0, 1864 }, -{ 0x69, 30, 0, 1863 }, -{ 0x19, 30, 1, 1876 }, -{ 0x9, 31, 0, 1875 }, -{ 0x39, 30, 1, 1874 }, -{ 0x19, 31, 0, 1873 }, -{ 0x15, 30, 0, 1866 }, -{ 0x35, 30, 0, 1865 }, -{ 0xd, 30, 1, 1880 }, -{ 0x5, 31, 0, 1879 }, -{ 0x1d, 30, 1, 1878 }, -{ 0xd, 31, 0, 1877 }, -{ 0xb, 30, 0, 1868 }, -{ 0x1b, 30, 0, 1867 }, -{ 0x7, 30, 1, 1884 }, -{ 0x3, 31, 0, 1883 }, -{ 0xf, 30, 1, 1882 }, -{ 0x7, 31, 0, 1881 }, -{ 0xa2, 28, 0, 1886 }, -{ 0x1a2, 28, 0, 1885 }, -{ 0x62, 28, 1, 1896 }, -{ 0x22, 29, 0, 1895 }, -{ 0xe2, 28, 1, 1894 }, -{ 0x62, 29, 0, 1893 }, -{ 0x52, 28, 0, 1888 }, -{ 0xd2, 28, 0, 1887 }, -{ 0x32, 28, 1, 1900 }, -{ 0x12, 29, 0, 1899 }, -{ 0x72, 28, 1, 1898 }, -{ 0x32, 29, 0, 1897 }, -{ 0x2a, 28, 0, 1890 }, -{ 0x6a, 28, 0, 1889 }, -{ 0x1a, 28, 1, 1904 }, -{ 0xa, 29, 0, 1903 }, -{ 0x3a, 28, 1, 1902 }, -{ 0x1a, 29, 0, 1901 }, -{ 0x16, 28, 0, 1892 }, -{ 0x36, 28, 0, 1891 }, -{ 0xe, 28, 1, 1908 }, -{ 0x6, 29, 0, 1907 }, -{ 0x1e, 28, 1, 1906 }, -{ 0xe, 29, 0, 1905 }, -{ 0x51, 28, 0, 1910 }, -{ 0xd1, 28, 0, 1909 }, -{ 0x31, 28, 1, 1920 }, -{ 0x11, 29, 0, 1919 }, -{ 0x71, 28, 1, 1918 }, -{ 0x31, 29, 0, 1917 }, -{ 0x29, 28, 0, 1912 }, -{ 0x69, 28, 0, 1911 }, -{ 0x19, 28, 1, 1924 }, -{ 0x9, 29, 0, 1923 }, -{ 0x39, 28, 1, 1922 }, -{ 0x19, 29, 0, 1921 }, -{ 0x15, 28, 0, 1914 }, -{ 0x35, 28, 0, 1913 }, -{ 0xd, 28, 1, 1928 }, -{ 0x5, 29, 0, 1927 }, -{ 0x1d, 28, 1, 1926 }, -{ 0xd, 29, 0, 1925 }, -{ 0xb, 28, 0, 1916 }, -{ 0x1b, 28, 0, 1915 }, -{ 0x7, 28, 1, 1932 }, -{ 0x3, 29, 0, 1931 }, -{ 0xf, 28, 1, 1930 }, -{ 0x7, 29, 0, 1929 }, -{ 0x51, 26, 0, 1934 }, -{ 0xd1, 26, 0, 1933 }, -{ 0x31, 26, 1, 1944 }, -{ 0x11, 27, 0, 1943 }, -{ 0x71, 26, 1, 1942 }, -{ 0x31, 27, 0, 1941 }, -{ 0x29, 26, 0, 1936 }, -{ 0x69, 26, 0, 1935 }, -{ 0x19, 26, 1, 1948 }, -{ 0x9, 27, 0, 1947 }, -{ 0x39, 26, 1, 1946 }, -{ 0x19, 27, 0, 1945 }, -{ 0x15, 26, 0, 1938 }, -{ 0x35, 26, 0, 1937 }, -{ 0xd, 26, 1, 1952 }, -{ 0x5, 27, 0, 1951 }, -{ 0x1d, 26, 1, 1950 }, -{ 0xd, 27, 0, 1949 }, -{ 0xb, 26, 0, 1940 }, -{ 0x1b, 26, 0, 1939 }, -{ 0x7, 26, 1, 1956 }, -{ 0x3, 27, 0, 1955 }, -{ 0xf, 26, 1, 1954 }, -{ 0x7, 27, 0, 1953 }, -{ 0xa2, 24, 0, 1958 }, -{ 0x1a2, 24, 0, 1957 }, -{ 0x62, 24, 1, 1968 }, -{ 0x22, 25, 0, 1967 }, -{ 0xe2, 24, 1, 1966 }, -{ 0x62, 25, 0, 1965 }, -{ 0x52, 24, 0, 1960 }, -{ 0xd2, 24, 0, 1959 }, -{ 0x32, 24, 1, 1972 }, -{ 0x12, 25, 0, 1971 }, -{ 0x72, 24, 1, 1970 }, -{ 0x32, 25, 0, 1969 }, -{ 0x2a, 24, 0, 1962 }, -{ 0x6a, 24, 0, 1961 }, -{ 0x1a, 24, 1, 1976 }, -{ 0xa, 25, 0, 1975 }, -{ 0x3a, 24, 1, 1974 }, -{ 0x1a, 25, 0, 1973 }, -{ 0x16, 24, 0, 1964 }, -{ 0x36, 24, 0, 1963 }, -{ 0xe, 24, 1, 1980 }, -{ 0x6, 25, 0, 1979 }, -{ 0x1e, 24, 1, 1978 }, -{ 0xe, 25, 0, 1977 }, -{ 0x51, 24, 0, 1982 }, -{ 0xd1, 24, 0, 1981 }, -{ 0x31, 24, 1, 1992 }, -{ 0x11, 25, 0, 1991 }, -{ 0x71, 24, 1, 1990 }, -{ 0x31, 25, 0, 1989 }, -{ 0x29, 24, 0, 1984 }, -{ 0x69, 24, 0, 1983 }, -{ 0x19, 24, 1, 1996 }, -{ 0x9, 25, 0, 1995 }, -{ 0x39, 24, 1, 1994 }, -{ 0x19, 25, 0, 1993 }, -{ 0x15, 24, 0, 1986 }, -{ 0x35, 24, 0, 1985 }, -{ 0xd, 24, 1, 2000 }, -{ 0x5, 25, 0, 1999 }, -{ 0x1d, 24, 1, 1998 }, -{ 0xd, 25, 0, 1997 }, -{ 0xb, 24, 0, 1988 }, -{ 0x1b, 24, 0, 1987 }, -{ 0x7, 24, 1, 2004 }, -{ 0x3, 25, 0, 2003 }, -{ 0xf, 24, 1, 2002 }, -{ 0x7, 25, 0, 2001 }, -{ 0x51, 22, 1, 2030 }, -{ 0x50, 22, 0, 2006 }, -{ 0xd1, 22, 1, 2029 }, -{ 0xd0, 22, 0, 2005 }, -{ 0x31, 22, 1, 2040 }, -{ 0x30, 22, 1, 2016 }, -{ 0x11, 23, 1, 2039 }, -{ 0x10, 23, 0, 2015 }, -{ 0x71, 22, 1, 2038 }, -{ 0x70, 22, 1, 2014 }, -{ 0x31, 23, 1, 2037 }, -{ 0x30, 23, 0, 2013 }, -{ 0x29, 22, 1, 2032 }, -{ 0x28, 22, 0, 2008 }, -{ 0x69, 22, 1, 2031 }, -{ 0x68, 22, 0, 2007 }, -{ 0x19, 22, 1, 2044 }, -{ 0x18, 22, 1, 2020 }, -{ 0x9, 23, 1, 2043 }, -{ 0x8, 23, 0, 2019 }, -{ 0x39, 22, 1, 2042 }, -{ 0x38, 22, 1, 2018 }, -{ 0x19, 23, 1, 2041 }, -{ 0x18, 23, 0, 2017 }, -{ 0x15, 22, 1, 2034 }, -{ 0x14, 22, 0, 2010 }, -{ 0x35, 22, 1, 2033 }, -{ 0x34, 22, 0, 2009 }, -{ 0xd, 22, 1, 2048 }, -{ 0xc, 22, 1, 2024 }, -{ 0x5, 23, 1, 2047 }, -{ 0x4, 23, 0, 2023 }, -{ 0x1d, 22, 1, 2046 }, -{ 0x1c, 22, 1, 2022 }, -{ 0xd, 23, 1, 2045 }, -{ 0xc, 23, 0, 2021 }, -{ 0xb, 22, 1, 2036 }, -{ 0xa, 22, 0, 2012 }, -{ 0x1b, 22, 1, 2035 }, -{ 0x1a, 22, 0, 2011 }, -{ 0x7, 22, 1, 2052 }, -{ 0x6, 22, 1, 2028 }, -{ 0x3, 23, 1, 2051 }, -{ 0x2, 23, 0, 2027 }, -{ 0xf, 22, 1, 2050 }, -{ 0xe, 22, 1, 2026 }, -{ 0x7, 23, 1, 2049 }, -{ 0x6, 23, 0, 2025 }, -{ 0x8, 21, 0, 2054 }, -{ 0x18, 21, 0, 2053 }, -{ 0x1, 21, 1, 2058 }, -{ 0x2, 21, 0, 2057 }, -{ 0x3, 21, 1, 2056 }, -{ 0x4, 21, 0, 2055 }, -{ 0x1, 239, 0, 2059 }, -{ 0x1, 339, 0, 2060 }, -{ 0x14, 43, 0, 2063 }, -{ 0x34, 43, 0, 2061 }, -{ 0xc, 43, 0, 2064 }, -{ 0x1c, 43, 0, 2062 }, -{ 0x2, 43, 0, 2067 }, -{ 0x6, 43, 0, 2065 }, -{ 0x1, 43, 0, 2068 }, -{ 0x3, 43, 0, 2066 }, -{ 0x51, 19, 0, 2070 }, -{ 0xd1, 19, 0, 2069 }, -{ 0x31, 19, 1, 2080 }, -{ 0x11, 20, 0, 2079 }, -{ 0x71, 19, 1, 2078 }, -{ 0x31, 20, 0, 2077 }, -{ 0x29, 19, 0, 2072 }, -{ 0x69, 19, 0, 2071 }, -{ 0x19, 19, 1, 2084 }, -{ 0x9, 20, 0, 2083 }, -{ 0x39, 19, 1, 2082 }, -{ 0x19, 20, 0, 2081 }, -{ 0x15, 19, 0, 2074 }, -{ 0x35, 19, 0, 2073 }, -{ 0xd, 19, 1, 2088 }, -{ 0x5, 20, 0, 2087 }, -{ 0x1d, 19, 1, 2086 }, -{ 0xd, 20, 0, 2085 }, -{ 0xb, 19, 0, 2076 }, -{ 0x1b, 19, 0, 2075 }, -{ 0x7, 19, 1, 2092 }, -{ 0x3, 20, 0, 2091 }, -{ 0xf, 19, 1, 2090 }, -{ 0x7, 20, 0, 2089 }, -{ 0x1, 32, 0, 2093 }, -{ 0x2, 447, 0, 2094 }, -{ 0x1, 447, 0, 2095 }, -{ 0x1, 140, 0, 2096 }, -{ 0x2, 45, 0, 2097 }, -{ 0x1, 45, 0, 2098 }, -{ 0x1, 387, 0, 2099 }, -{ 0x2, 52, 0, 2100 }, -{ 0x1, 52, 0, 2101 }, -{ 0x1, 133, 0, 2102 }, -{ 0x51, 17, 0, 2104 }, -{ 0xd1, 17, 0, 2103 }, -{ 0x31, 17, 1, 2114 }, -{ 0x11, 18, 0, 2113 }, -{ 0x71, 17, 1, 2112 }, -{ 0x31, 18, 0, 2111 }, -{ 0x29, 17, 0, 2106 }, -{ 0x69, 17, 0, 2105 }, -{ 0x19, 17, 1, 2118 }, -{ 0x9, 18, 0, 2117 }, -{ 0x39, 17, 1, 2116 }, -{ 0x19, 18, 0, 2115 }, -{ 0x15, 17, 0, 2108 }, -{ 0x35, 17, 0, 2107 }, -{ 0xd, 17, 1, 2122 }, -{ 0x5, 18, 0, 2121 }, -{ 0x1d, 17, 1, 2120 }, -{ 0xd, 18, 0, 2119 }, -{ 0xb, 17, 0, 2110 }, -{ 0x1b, 17, 0, 2109 }, -{ 0x7, 17, 1, 2126 }, -{ 0x3, 18, 0, 2125 }, -{ 0xf, 17, 1, 2124 }, -{ 0x7, 18, 0, 2123 }, -{ 0xa20, 15, 0, 2128 }, -{ 0x1a20, 15, 0, 2127 }, -{ 0x620, 15, 1, 2138 }, -{ 0x220, 16, 0, 2137 }, -{ 0xe20, 15, 1, 2136 }, -{ 0x620, 16, 0, 2135 }, -{ 0x520, 15, 0, 2130 }, -{ 0xd20, 15, 0, 2129 }, -{ 0x320, 15, 1, 2142 }, -{ 0x120, 16, 0, 2141 }, -{ 0x720, 15, 1, 2140 }, -{ 0x320, 16, 0, 2139 }, -{ 0x2a0, 15, 0, 2132 }, -{ 0x6a0, 15, 0, 2131 }, -{ 0x1a0, 15, 1, 2146 }, -{ 0xa0, 16, 0, 2145 }, -{ 0x3a0, 15, 1, 2144 }, -{ 0x1a0, 16, 0, 2143 }, -{ 0x160, 15, 0, 2134 }, -{ 0x360, 15, 0, 2133 }, -{ 0xe0, 15, 1, 2150 }, -{ 0x60, 16, 0, 2149 }, -{ 0x1e0, 15, 1, 2148 }, -{ 0xe0, 16, 0, 2147 }, -{ 0x51, 15, 1, 2176 }, -{ 0x50, 15, 0, 2152 }, -{ 0xd1, 15, 1, 2175 }, -{ 0xd0, 15, 0, 2151 }, -{ 0x31, 15, 1, 2186 }, -{ 0x30, 15, 1, 2162 }, -{ 0x11, 16, 1, 2185 }, -{ 0x10, 16, 0, 2161 }, -{ 0x71, 15, 1, 2184 }, -{ 0x70, 15, 1, 2160 }, -{ 0x31, 16, 1, 2183 }, -{ 0x30, 16, 0, 2159 }, -{ 0x29, 15, 1, 2178 }, -{ 0x28, 15, 0, 2154 }, -{ 0x69, 15, 1, 2177 }, -{ 0x68, 15, 0, 2153 }, -{ 0x19, 15, 1, 2190 }, -{ 0x18, 15, 1, 2166 }, -{ 0x9, 16, 1, 2189 }, -{ 0x8, 16, 0, 2165 }, -{ 0x39, 15, 1, 2188 }, -{ 0x38, 15, 1, 2164 }, -{ 0x19, 16, 1, 2187 }, -{ 0x18, 16, 0, 2163 }, -{ 0x15, 15, 1, 2180 }, -{ 0x14, 15, 0, 2156 }, -{ 0x35, 15, 1, 2179 }, -{ 0x34, 15, 0, 2155 }, -{ 0xd, 15, 1, 2194 }, -{ 0xc, 15, 1, 2170 }, -{ 0x5, 16, 1, 2193 }, -{ 0x4, 16, 0, 2169 }, -{ 0x1d, 15, 1, 2192 }, -{ 0x1c, 15, 1, 2168 }, -{ 0xd, 16, 1, 2191 }, -{ 0xc, 16, 0, 2167 }, -{ 0xb, 15, 1, 2182 }, -{ 0xa, 15, 0, 2158 }, -{ 0x1b, 15, 1, 2181 }, -{ 0x1a, 15, 0, 2157 }, -{ 0x7, 15, 1, 2198 }, -{ 0x6, 15, 1, 2174 }, -{ 0x3, 16, 1, 2197 }, -{ 0x2, 16, 0, 2173 }, -{ 0xf, 15, 1, 2196 }, -{ 0xe, 15, 1, 2172 }, -{ 0x7, 16, 1, 2195 }, -{ 0x6, 16, 0, 2171 }, -{ 0x8, 14, 0, 2200 }, -{ 0x18, 14, 0, 2199 }, -{ 0x1, 14, 1, 2204 }, -{ 0x2, 14, 0, 2203 }, -{ 0x3, 14, 1, 2202 }, -{ 0x4, 14, 0, 2201 }, -{ 0x1, 109, 1, 2356 }, -{ 0x1, 110, 1, 2355 }, -{ 0x1, 111, 1, 2354 }, -{ 0x1, 112, 1, 2353 }, -{ 0x1, 113, 1, 2352 }, -{ 0x1, 114, 1, 2351 }, -{ 0x1, 115, 1, 2350 }, -{ 0x1, 116, 1, 2349 }, -{ 0x39, 41, 1, 22 }, -{ 0x19, 42, 0, 21 }, -{ 0x3, 109, 1, 2348 }, -{ 0x3, 110, 1, 2347 }, -{ 0x3, 111, 1, 2346 }, -{ 0x3, 112, 1, 2345 }, -{ 0x3, 113, 1, 2344 }, -{ 0x3, 114, 1, 2343 }, -{ 0x3, 115, 1, 2342 }, -{ 0x3, 116, 1, 2341 }, -{ 0x69, 41, 0, 11 }, -{ 0x14, 100, 1, 2336 }, -{ 0x22, 101, 1, 2333 }, -{ 0x44, 101, 1, 2335 }, -{ 0xa, 108, 1, 2334 }, -{ 0xd1, 41, 0, 9 }, -{ 0x34, 100, 1, 2208 }, -{ 0xc4, 101, 1, 2207 }, -{ 0x1c, 107, 1, 2205 }, -{ 0xe, 122, 0, 2206 }, -{ 0xc, 100, 1, 2496 }, -{ 0xa, 101, 1, 2493 }, -{ 0x14, 101, 1, 2495 }, -{ 0x6, 108, 0, 2494 }, -{ 0x2, 100, 1, 2220 }, -{ 0x2, 101, 1, 2219 }, -{ 0x2, 106, 1, 2218 }, -{ 0x2, 107, 0, 2217 }, -{ 0x12, 100, 1, 2216 }, -{ 0x42, 101, 1, 2215 }, -{ 0x6, 106, 1, 2214 }, -{ 0x6, 107, 0, 2213 }, -{ 0xa, 100, 1, 2340 }, -{ 0x12, 101, 1, 2339 }, -{ 0x24, 101, 1, 2337 }, -{ 0x5, 108, 1, 2338 }, -{ 0x71, 41, 1, 18 }, -{ 0x31, 42, 0, 17 }, -{ 0x1a, 100, 1, 2212 }, -{ 0x32, 101, 1, 2211 }, -{ 0x1a, 107, 1, 2209 }, -{ 0x7, 122, 0, 2210 }, -{ 0x6, 100, 1, 2500 }, -{ 0x6, 101, 1, 2499 }, -{ 0xc, 101, 1, 2497 }, -{ 0x3, 108, 0, 2498 }, -{ 0x1, 100, 1, 2516 }, -{ 0x1, 101, 1, 2515 }, -{ 0x1, 102, 1, 2514 }, -{ 0x1, 103, 1, 2513 }, -{ 0x1, 104, 1, 2512 }, -{ 0x1, 105, 1, 2511 }, -{ 0x1, 106, 1, 2510 }, -{ 0x1, 107, 0, 2509 }, -{ 0x3, 100, 1, 2508 }, -{ 0x3, 101, 1, 2507 }, -{ 0x3, 102, 1, 2506 }, -{ 0x3, 103, 1, 2505 }, -{ 0x3, 104, 1, 2504 }, -{ 0x3, 105, 1, 2503 }, -{ 0x3, 106, 1, 2502 }, -{ 0x3, 107, 0, 2501 }, -{ 0x8, 67, 1, 2380 }, -{ 0x8, 68, 1, 2379 }, -{ 0x2, 73, 1, 2374 }, -{ 0x2, 74, 1, 2373 }, -{ 0x1, 76, 1, 2378 }, -{ 0x1, 77, 1, 2377 }, -{ 0x1, 78, 1, 2376 }, -{ 0x1, 79, 1, 2375 }, -{ 0xf, 41, 1, 30 }, -{ 0x7, 42, 0, 29 }, -{ 0x18, 67, 1, 2372 }, -{ 0x18, 68, 1, 2371 }, -{ 0x6, 73, 1, 2366 }, -{ 0x6, 74, 1, 2365 }, -{ 0x3, 76, 1, 2370 }, -{ 0x3, 77, 1, 2369 }, -{ 0x3, 78, 1, 2368 }, -{ 0x3, 79, 1, 2367 }, -{ 0x1b, 41, 0, 15 }, -{ 0x14, 67, 1, 2360 }, -{ 0x22, 68, 1, 2357 }, -{ 0x44, 68, 1, 2359 }, -{ 0xa, 75, 1, 2358 }, -{ 0x35, 41, 0, 13 }, -{ 0x34, 67, 1, 2224 }, -{ 0xc4, 68, 1, 2223 }, -{ 0x38, 74, 1, 2221 }, -{ 0xe, 85, 0, 2222 }, -{ 0xc, 67, 1, 2520 }, -{ 0xa, 68, 1, 2517 }, -{ 0x14, 68, 1, 2519 }, -{ 0x6, 75, 0, 2518 }, -{ 0x2, 67, 1, 2236 }, -{ 0x2, 68, 1, 2235 }, -{ 0x4, 73, 1, 2234 }, -{ 0x4, 74, 0, 2233 }, -{ 0x12, 67, 1, 2232 }, -{ 0x42, 68, 1, 2231 }, -{ 0xc, 73, 1, 2230 }, -{ 0xc, 74, 0, 2229 }, -{ 0xa, 67, 1, 2364 }, -{ 0x12, 68, 1, 2363 }, -{ 0x24, 68, 1, 2361 }, -{ 0x5, 75, 1, 2362 }, -{ 0x1d, 41, 1, 26 }, -{ 0xd, 42, 0, 25 }, -{ 0x1a, 67, 1, 2228 }, -{ 0x32, 68, 1, 2227 }, -{ 0x34, 74, 1, 2225 }, -{ 0x7, 85, 0, 2226 }, -{ 0x6, 67, 1, 2524 }, -{ 0x6, 68, 1, 2523 }, -{ 0xc, 68, 1, 2521 }, -{ 0x3, 75, 0, 2522 }, -{ 0x1, 67, 1, 2540 }, -{ 0x1, 68, 1, 2539 }, -{ 0x1, 69, 1, 2538 }, -{ 0x1, 70, 1, 2537 }, -{ 0x1, 71, 1, 2536 }, -{ 0x1, 72, 1, 2535 }, -{ 0x1, 73, 1, 2534 }, -{ 0x1, 74, 0, 2533 }, -{ 0x3, 67, 1, 2532 }, -{ 0x3, 68, 1, 2531 }, -{ 0x3, 69, 1, 2530 }, -{ 0x3, 70, 1, 2529 }, -{ 0x3, 71, 1, 2528 }, -{ 0x3, 72, 1, 2527 }, -{ 0x3, 73, 1, 2526 }, -{ 0x3, 74, 0, 2525 }, -{ 0x28, 95, 1, 2388 }, -{ 0x44, 96, 1, 2383 }, -{ 0x88, 96, 1, 2387 }, -{ 0x44, 97, 1, 2382 }, -{ 0x88, 97, 1, 2386 }, -{ 0x44, 98, 1, 2381 }, -{ 0x88, 98, 1, 2385 }, -{ 0x28, 99, 0, 2384 }, -{ 0x68, 95, 1, 2244 }, -{ 0x188, 96, 1, 2243 }, -{ 0x188, 97, 1, 2242 }, -{ 0x188, 98, 1, 2241 }, -{ 0x38, 118, 1, 2240 }, -{ 0x38, 119, 1, 2239 }, -{ 0x38, 120, 1, 2238 }, -{ 0x38, 121, 0, 2237 }, -{ 0x18, 95, 1, 2548 }, -{ 0x14, 96, 1, 2543 }, -{ 0x28, 96, 1, 2547 }, -{ 0x14, 97, 1, 2542 }, -{ 0x28, 97, 1, 2546 }, -{ 0x14, 98, 1, 2541 }, -{ 0x28, 98, 1, 2545 }, -{ 0x18, 99, 0, 2544 }, -{ 0x14, 95, 1, 2396 }, -{ 0x24, 96, 1, 2395 }, -{ 0x48, 96, 1, 2391 }, -{ 0x24, 97, 1, 2394 }, -{ 0x48, 97, 1, 2390 }, -{ 0x24, 98, 1, 2393 }, -{ 0x48, 98, 1, 2389 }, -{ 0x14, 99, 0, 2392 }, -{ 0x34, 95, 1, 2252 }, -{ 0x64, 96, 1, 2251 }, -{ 0x64, 97, 1, 2250 }, -{ 0x64, 98, 1, 2249 }, -{ 0x1c, 118, 1, 2248 }, -{ 0x1c, 119, 1, 2247 }, -{ 0x1c, 120, 1, 2246 }, -{ 0x1c, 121, 0, 2245 }, -{ 0xc, 95, 1, 2556 }, -{ 0xc, 96, 1, 2555 }, -{ 0x18, 96, 1, 2551 }, -{ 0xc, 97, 1, 2554 }, -{ 0x18, 97, 1, 2550 }, -{ 0xc, 98, 1, 2553 }, -{ 0x18, 98, 1, 2549 }, -{ 0xc, 99, 0, 2552 }, -{ 0xa, 95, 1, 2404 }, -{ 0x11, 96, 1, 2399 }, -{ 0x22, 96, 1, 2403 }, -{ 0x11, 97, 1, 2398 }, -{ 0x22, 97, 1, 2402 }, -{ 0x11, 98, 1, 2397 }, -{ 0x22, 98, 1, 2401 }, -{ 0xa, 99, 0, 2400 }, -{ 0x1a, 95, 1, 2260 }, -{ 0x62, 96, 1, 2259 }, -{ 0x62, 97, 1, 2258 }, -{ 0x62, 98, 1, 2257 }, -{ 0xe, 118, 1, 2256 }, -{ 0xe, 119, 1, 2255 }, -{ 0xe, 120, 1, 2254 }, -{ 0xe, 121, 0, 2253 }, -{ 0x6, 95, 1, 2564 }, -{ 0x5, 96, 1, 2559 }, -{ 0xa, 96, 1, 2563 }, -{ 0x5, 97, 1, 2558 }, -{ 0xa, 97, 1, 2562 }, -{ 0x5, 98, 1, 2557 }, -{ 0xa, 98, 1, 2561 }, -{ 0x6, 99, 0, 2560 }, -{ 0x5, 95, 1, 2412 }, -{ 0x9, 96, 1, 2411 }, -{ 0x12, 96, 1, 2407 }, -{ 0x9, 97, 1, 2410 }, -{ 0x12, 97, 1, 2406 }, -{ 0x9, 98, 1, 2409 }, -{ 0x12, 98, 1, 2405 }, -{ 0x5, 99, 0, 2408 }, -{ 0xd, 95, 1, 2268 }, -{ 0x19, 96, 1, 2267 }, -{ 0x19, 97, 1, 2266 }, -{ 0x19, 98, 1, 2265 }, -{ 0x7, 118, 1, 2264 }, -{ 0x7, 119, 1, 2263 }, -{ 0x7, 120, 1, 2262 }, -{ 0x7, 121, 0, 2261 }, -{ 0x3, 95, 1, 2572 }, -{ 0x3, 96, 1, 2571 }, -{ 0x6, 96, 1, 2567 }, -{ 0x3, 97, 1, 2570 }, -{ 0x6, 97, 1, 2566 }, -{ 0x3, 98, 1, 2569 }, -{ 0x6, 98, 1, 2565 }, -{ 0x3, 99, 0, 2568 }, -{ 0x28, 62, 1, 2420 }, -{ 0x44, 63, 1, 2415 }, -{ 0x88, 63, 1, 2419 }, -{ 0x44, 64, 1, 2414 }, -{ 0x88, 64, 1, 2418 }, -{ 0x44, 65, 1, 2413 }, -{ 0x88, 65, 1, 2417 }, -{ 0x28, 66, 0, 2416 }, -{ 0x68, 62, 1, 2276 }, -{ 0x188, 63, 1, 2275 }, -{ 0x188, 64, 1, 2274 }, -{ 0x188, 65, 1, 2273 }, -{ 0x38, 81, 1, 2272 }, -{ 0x38, 82, 1, 2271 }, -{ 0x38, 83, 1, 2270 }, -{ 0x38, 84, 0, 2269 }, -{ 0x18, 62, 1, 2580 }, -{ 0x14, 63, 1, 2575 }, -{ 0x28, 63, 1, 2579 }, -{ 0x14, 64, 1, 2574 }, -{ 0x28, 64, 1, 2578 }, -{ 0x14, 65, 1, 2573 }, -{ 0x28, 65, 1, 2577 }, -{ 0x18, 66, 0, 2576 }, -{ 0x14, 62, 1, 2428 }, -{ 0x24, 63, 1, 2427 }, -{ 0x48, 63, 1, 2423 }, -{ 0x24, 64, 1, 2426 }, -{ 0x48, 64, 1, 2422 }, -{ 0x24, 65, 1, 2425 }, -{ 0x48, 65, 1, 2421 }, -{ 0x14, 66, 0, 2424 }, -{ 0x34, 62, 1, 2284 }, -{ 0x64, 63, 1, 2283 }, -{ 0x64, 64, 1, 2282 }, -{ 0x64, 65, 1, 2281 }, -{ 0x1c, 81, 1, 2280 }, -{ 0x1c, 82, 1, 2279 }, -{ 0x1c, 83, 1, 2278 }, -{ 0x1c, 84, 0, 2277 }, -{ 0xc, 62, 1, 2588 }, -{ 0xc, 63, 1, 2587 }, -{ 0x18, 63, 1, 2583 }, -{ 0xc, 64, 1, 2586 }, -{ 0x18, 64, 1, 2582 }, -{ 0xc, 65, 1, 2585 }, -{ 0x18, 65, 1, 2581 }, -{ 0xc, 66, 0, 2584 }, -{ 0xa, 62, 1, 2436 }, -{ 0x11, 63, 1, 2431 }, -{ 0x22, 63, 1, 2435 }, -{ 0x11, 64, 1, 2430 }, -{ 0x22, 64, 1, 2434 }, -{ 0x11, 65, 1, 2429 }, -{ 0x22, 65, 1, 2433 }, -{ 0xa, 66, 0, 2432 }, -{ 0x1a, 62, 1, 2292 }, -{ 0x62, 63, 1, 2291 }, -{ 0x62, 64, 1, 2290 }, -{ 0x62, 65, 1, 2289 }, -{ 0xe, 81, 1, 2288 }, -{ 0xe, 82, 1, 2287 }, -{ 0xe, 83, 1, 2286 }, -{ 0xe, 84, 0, 2285 }, -{ 0x6, 62, 1, 2596 }, -{ 0x5, 63, 1, 2591 }, -{ 0xa, 63, 1, 2595 }, -{ 0x5, 64, 1, 2590 }, -{ 0xa, 64, 1, 2594 }, -{ 0x5, 65, 1, 2589 }, -{ 0xa, 65, 1, 2593 }, -{ 0x6, 66, 0, 2592 }, -{ 0x5, 62, 1, 2444 }, -{ 0x9, 63, 1, 2443 }, -{ 0x12, 63, 1, 2439 }, -{ 0x9, 64, 1, 2442 }, -{ 0x12, 64, 1, 2438 }, -{ 0x9, 65, 1, 2441 }, -{ 0x12, 65, 1, 2437 }, -{ 0x5, 66, 0, 2440 }, -{ 0xd, 62, 1, 2300 }, -{ 0x19, 63, 1, 2299 }, -{ 0x19, 64, 1, 2298 }, -{ 0x19, 65, 1, 2297 }, -{ 0x7, 81, 1, 2296 }, -{ 0x7, 82, 1, 2295 }, -{ 0x7, 83, 1, 2294 }, -{ 0x7, 84, 0, 2293 }, -{ 0x3, 62, 1, 2604 }, -{ 0x3, 63, 1, 2603 }, -{ 0x6, 63, 1, 2599 }, -{ 0x3, 64, 1, 2602 }, -{ 0x6, 64, 1, 2598 }, -{ 0x3, 65, 1, 2601 }, -{ 0x6, 65, 1, 2597 }, -{ 0x3, 66, 0, 2600 }, -{ 0x8, 86, 1, 2468 }, -{ 0x8, 87, 1, 2467 }, -{ 0x2, 88, 1, 2466 }, -{ 0x2, 89, 1, 2465 }, -{ 0x2, 90, 1, 2464 }, -{ 0x2, 91, 1, 2463 }, -{ 0x2, 92, 1, 2462 }, -{ 0x2, 93, 0, 2461 }, -{ 0x18, 86, 1, 2460 }, -{ 0x18, 87, 1, 2459 }, -{ 0x6, 88, 1, 2458 }, -{ 0x6, 89, 1, 2457 }, -{ 0x6, 90, 1, 2456 }, -{ 0x6, 91, 1, 2455 }, -{ 0x6, 92, 1, 2454 }, -{ 0x6, 93, 0, 2453 }, -{ 0x14, 86, 1, 2448 }, -{ 0x22, 87, 1, 2445 }, -{ 0x44, 87, 1, 2447 }, -{ 0xa, 94, 0, 2446 }, -{ 0x34, 86, 1, 2304 }, -{ 0xc4, 87, 1, 2303 }, -{ 0x38, 93, 1, 2301 }, -{ 0xe, 117, 0, 2302 }, -{ 0xc, 86, 1, 2608 }, -{ 0xa, 87, 1, 2605 }, -{ 0x14, 87, 1, 2607 }, -{ 0x6, 94, 0, 2606 }, -{ 0x2, 86, 1, 2316 }, -{ 0x2, 87, 1, 2315 }, -{ 0x4, 92, 1, 2314 }, -{ 0x4, 93, 0, 2313 }, -{ 0x12, 86, 1, 2312 }, -{ 0x42, 87, 1, 2311 }, -{ 0xc, 92, 1, 2310 }, -{ 0xc, 93, 0, 2309 }, -{ 0xa, 86, 1, 2452 }, -{ 0x12, 87, 1, 2451 }, -{ 0x24, 87, 1, 2449 }, -{ 0x5, 94, 0, 2450 }, -{ 0x1a, 86, 1, 2308 }, -{ 0x32, 87, 1, 2307 }, -{ 0x34, 93, 1, 2305 }, -{ 0x7, 117, 0, 2306 }, -{ 0x6, 86, 1, 2612 }, -{ 0x6, 87, 1, 2611 }, -{ 0xc, 87, 1, 2609 }, -{ 0x3, 94, 0, 2610 }, -{ 0x1, 86, 1, 2628 }, -{ 0x1, 87, 1, 2627 }, -{ 0x1, 88, 1, 2626 }, -{ 0x1, 89, 1, 2625 }, -{ 0x1, 90, 1, 2624 }, -{ 0x1, 91, 1, 2623 }, -{ 0x1, 92, 1, 2622 }, -{ 0x1, 93, 0, 2621 }, -{ 0x3, 86, 1, 2620 }, -{ 0x3, 87, 1, 2619 }, -{ 0x3, 88, 1, 2618 }, -{ 0x3, 89, 1, 2617 }, -{ 0x3, 90, 1, 2616 }, -{ 0x3, 91, 1, 2615 }, -{ 0x3, 92, 1, 2614 }, -{ 0x3, 93, 0, 2613 }, -{ 0x8, 53, 1, 2492 }, -{ 0x8, 54, 1, 2491 }, -{ 0x2, 55, 1, 2490 }, -{ 0x2, 56, 1, 2489 }, -{ 0x2, 57, 1, 2488 }, -{ 0x2, 58, 1, 2487 }, -{ 0x2, 59, 1, 2486 }, -{ 0x2, 60, 0, 2485 }, -{ 0x18, 53, 1, 2484 }, -{ 0x18, 54, 1, 2483 }, -{ 0x6, 55, 1, 2482 }, -{ 0x6, 56, 1, 2481 }, -{ 0x6, 57, 1, 2480 }, -{ 0x6, 58, 1, 2479 }, -{ 0x6, 59, 1, 2478 }, -{ 0x6, 60, 0, 2477 }, -{ 0x14, 53, 1, 2472 }, -{ 0x22, 54, 1, 2469 }, -{ 0x44, 54, 1, 2471 }, -{ 0xa, 61, 0, 2470 }, -{ 0x34, 53, 1, 2320 }, -{ 0xc4, 54, 1, 2319 }, -{ 0x38, 60, 1, 2317 }, -{ 0xe, 80, 0, 2318 }, -{ 0xc, 53, 1, 2632 }, -{ 0xa, 54, 1, 2629 }, -{ 0x14, 54, 1, 2631 }, -{ 0x6, 61, 0, 2630 }, -{ 0x2, 53, 1, 2332 }, -{ 0x2, 54, 1, 2331 }, -{ 0x4, 59, 1, 2330 }, -{ 0x4, 60, 0, 2329 }, -{ 0x12, 53, 1, 2328 }, -{ 0x42, 54, 1, 2327 }, -{ 0xc, 59, 1, 2326 }, -{ 0xc, 60, 0, 2325 }, -{ 0xa, 53, 1, 2476 }, -{ 0x12, 54, 1, 2475 }, -{ 0x24, 54, 1, 2473 }, -{ 0x5, 61, 0, 2474 }, -{ 0x1a, 53, 1, 2324 }, -{ 0x32, 54, 1, 2323 }, -{ 0x34, 60, 1, 2321 }, -{ 0x7, 80, 0, 2322 }, -{ 0x6, 53, 1, 2636 }, -{ 0x6, 54, 1, 2635 }, -{ 0xc, 54, 1, 2633 }, -{ 0x3, 61, 0, 2634 }, -{ 0x1, 53, 1, 2652 }, -{ 0x1, 54, 1, 2651 }, -{ 0x1, 55, 1, 2650 }, -{ 0x1, 56, 1, 2649 }, -{ 0x1, 57, 1, 2648 }, -{ 0x1, 58, 1, 2647 }, -{ 0x1, 59, 1, 2646 }, -{ 0x1, 60, 0, 2645 }, -{ 0x3, 53, 1, 2644 }, -{ 0x3, 54, 1, 2643 }, -{ 0x3, 55, 1, 2642 }, -{ 0x3, 56, 1, 2641 }, -{ 0x3, 57, 1, 2640 }, -{ 0x3, 58, 1, 2639 }, -{ 0x3, 59, 1, 2638 }, -{ 0x3, 60, 0, 2637 }, -{ 0x1, 4, 0, 2653 }, -{ 0x1, 296, 0, 2654 }, -{ 0x1, 379, 0, 2655 }, -{ 0x1, 374, 0, 2656 }, -{ 0x2, 358, 0, 2657 }, -{ 0x1, 358, 0, 2660 }, -{ 0x2, 357, 0, 2658 }, -{ 0x1, 357, 0, 2661 }, -{ 0x2, 356, 0, 2659 }, -{ 0x1, 356, 0, 2662 }, -{ 0x1, 355, 0, 2663 }, -{ 0x1, 354, 0, 2664 }, -{ 0x2, 353, 0, 2665 }, -{ 0x1, 353, 0, 2667 }, -{ 0x2, 352, 0, 2666 }, -{ 0x1, 352, 0, 2668 }, -{ 0x1, 382, 0, 2675 }, -{ 0x8, 381, 0, 2669 }, -{ 0x4, 381, 0, 2671 }, -{ 0x2, 381, 0, 2673 }, -{ 0x1, 381, 0, 2676 }, -{ 0x8, 380, 0, 2670 }, -{ 0x4, 380, 0, 2672 }, -{ 0x2, 380, 0, 2674 }, -{ 0x1, 380, 0, 2677 }, -{ 0x1, 351, 0, 2684 }, -{ 0x8, 350, 0, 2678 }, -{ 0x4, 350, 0, 2680 }, -{ 0x2, 350, 0, 2682 }, -{ 0x1, 350, 0, 2685 }, -{ 0x8, 349, 0, 2679 }, -{ 0x4, 349, 0, 2681 }, -{ 0x2, 349, 1, 2683 }, -{ 0x4, 143, 0, 1377 }, -{ 0x1, 349, 0, 2686 }, -{ 0x1, 6, 0, 2687 }, -{ 0x1, 7, 0, 2688 }, -{ 0x1, 295, 0, 2689 }, -{ 0x1, 456, 0, 2690 }, -{ 0x1, 346, 0, 2691 }, -{ 0x1, 13, 0, 2692 }, -{ 0x1, 11, 0, 2693 }, -{ 0x1, 422, 0, 2694 }, -{ 0x1, 394, 0, 2695 }, -{ 0x1, 393, 0, 2696 }, -{ 0x1, 455, 0, 2697 }, -{ 0x1, 345, 0, 2698 }, -{ 0x1, 12, 0, 2699 }, -{ 0x1, 10, 0, 2700 }, -{ 0x1, 5, 0, 2701 }, -{ 0x1, 421, 0, 2702 }, -{ 0x1, 420, 0, 2703 }, -{ 0x1, 1, 0, 2704 }, -{ 0x1, 0, 0, 2705 }, -}; - diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-asmtab.h xen-4.3.0/tools/debugger/xenitp/ia64-asmtab.h --- xen-4.2.2/tools/debugger/xenitp/ia64-asmtab.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-asmtab.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,148 +0,0 @@ -/* ia64-asmtab.h -- Header for compacted IA-64 opcode tables. - Copyright 1999, 2000 Free Software Foundation, Inc. - Contributed by Bob Manson of Cygnus Support - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#ifndef IA64_ASMTAB_H -#define IA64_ASMTAB_H - -#include "ia64.h" - -/* The primary opcode table is made up of the following: */ -struct ia64_main_table -{ - /* The entry in the string table that corresponds to the name of this - opcode. */ - unsigned short name_index; - - /* The type of opcode; corresponds to the TYPE field in - struct ia64_opcode. */ - unsigned char opcode_type; - - /* The number of outputs for this opcode. */ - unsigned char num_outputs; - - /* The base insn value for this opcode. It may be modified by completers. */ - ia64_insn opcode; - - /* The mask of valid bits in OPCODE. Zeros indicate operand fields. */ - ia64_insn mask; - - /* The operands of this instruction. Corresponds to the OPERANDS field - in struct ia64_opcode. */ - unsigned char operands[5]; - - /* The flags for this instruction. Corresponds to the FLAGS field in - struct ia64_opcode. */ - short flags; - - /* The tree of completers for this instruction; this is an offset into - completer_table. */ - short completers; -}; - -/* Each instruction has a set of possible "completers", or additional - suffixes that can alter the instruction's behavior, and which has - potentially different dependencies. - - The completer entries modify certain bits in the instruction opcode. - Which bits are to be modified are marked by the BITS, MASK and - OFFSET fields. The completer entry may also note dependencies for the - opcode. - - These completers are arranged in a DAG; the pointers are indexes - into the completer_table array. The completer DAG is searched by - find_completer () and ia64_find_matching_opcode (). - - Note that each completer needs to be applied in turn, so that if we - have the instruction - cmp.lt.unc - the completer entries for both "lt" and "unc" would need to be applied - to the opcode's value. - - Some instructions do not require any completers; these contain an - empty completer entry. Instructions that require a completer do - not contain an empty entry. - - Terminal completers (those completers that validly complete an - instruction) are marked by having the TERMINAL_COMPLETER flag set. - - Only dependencies listed in the terminal completer for an opcode are - considered to apply to that opcode instance. */ - -struct ia64_completer_table -{ - /* The bit value that this completer sets. */ - unsigned int bits; - - /* And its mask. 1s are bits that are to be modified in the - instruction. */ - unsigned int mask; - - /* The entry in the string table that corresponds to the name of this - completer. */ - unsigned short name_index; - - /* An alternative completer, or -1 if this is the end of the chain. */ - short alternative; - - /* A pointer to the DAG of completers that can potentially follow - this one, or -1. */ - short subentries; - - /* The bit offset in the instruction where BITS and MASK should be - applied. */ - unsigned char offset : 7; - - unsigned char terminal_completer : 1; - - /* Index into the dependency list table */ - short dependencies; -}; - -/* This contains sufficient information for the disassembler to resolve - the complete name of the original instruction. */ -struct ia64_dis_names -{ - /* COMPLETER_INDEX represents the tree of completers that make up - the instruction. The LSB represents the top of the tree for the - specified instruction. - - A 0 bit indicates to go to the next alternate completer via the - alternative field; a 1 bit indicates that the current completer - is part of the instruction, and to go down the subentries index. - We know we've reached the final completer when we run out of 1 - bits. - - There is always at least one 1 bit. */ - unsigned int completer_index : 20; - - /* The index in the main_table[] array for the instruction. */ - unsigned short insn_index : 11; - - /* If set, the next entry in this table is an alternate possibility - for this instruction encoding. Which one to use is determined by - the instruction type and other factors (see opcode_verify ()). */ - unsigned int next_flag : 1; - - /* The disassembly priority of this entry among instructions. */ - unsigned short priority; -}; - -#endif diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-dis.c xen-4.3.0/tools/debugger/xenitp/ia64-dis.c --- xen-4.2.2/tools/debugger/xenitp/ia64-dis.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-dis.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -/* ia64-dis.c -- Disassemble ia64 instructions - Copyright 1998, 1999, 2000, 2002 Free Software Foundation, Inc. - Contributed by David Mosberger-Tang - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#include -#include - -#include "dis-asm.h" -#include "ia64.h" - -#define NELEMS(a) ((int) (sizeof (a) / sizeof (a[0]))) - -/* Disassemble ia64 instruction. */ - -/* Return the instruction type for OPCODE found in unit UNIT. */ - -static enum ia64_insn_type -unit_to_type (ia64_insn opcode, enum ia64_unit unit) -{ - enum ia64_insn_type type; - int op; - - op = IA64_OP (opcode); - - if (op >= 8 && (unit == IA64_UNIT_I || unit == IA64_UNIT_M)) - { - type = IA64_TYPE_A; - } - else - { - switch (unit) - { - case IA64_UNIT_I: - type = IA64_TYPE_I; break; - case IA64_UNIT_M: - type = IA64_TYPE_M; break; - case IA64_UNIT_B: - type = IA64_TYPE_B; break; - case IA64_UNIT_F: - type = IA64_TYPE_F; break; - case IA64_UNIT_L: - case IA64_UNIT_X: - type = IA64_TYPE_X; break; - default: - type = -1; - } - } - return type; -} - -int -print_insn_ia64 (bfd_vma memaddr, struct disassemble_info *info) -{ - ia64_insn t0, t1, slot[3], template, s_bit, insn; - int slotnum, j, status, need_comma, retval, slot_multiplier; - const struct ia64_operand *odesc; - const struct ia64_opcode *idesc; - const char *err, *str, *tname; - BFD_HOST_U_64_BIT value; - bfd_byte bundle[16]; - enum ia64_unit unit; - char regname[16]; - - if (info->bytes_per_line == 0) - info->bytes_per_line = 6; - info->display_endian = info->endian; - - slot_multiplier = info->bytes_per_line; - retval = slot_multiplier; - - slotnum = (((long) memaddr) & 0xf) / slot_multiplier; - if (slotnum > 2) - return -1; - - memaddr -= (memaddr & 0xf); - status = (*info->read_memory_func) (memaddr, bundle, sizeof (bundle), info); - if (status != 0) - { - (*info->memory_error_func) (status, memaddr, info); - return -1; - } - /* bundles are always in little-endian byte order */ - t0 = bfd_getl64 (bundle); - t1 = bfd_getl64 (bundle + 8); - s_bit = t0 & 1; - template = (t0 >> 1) & 0xf; - slot[0] = (t0 >> 5) & 0x1ffffffffffLL; - slot[1] = ((t0 >> 46) & 0x3ffff) | ((t1 & 0x7fffff) << 18); - slot[2] = (t1 >> 23) & 0x1ffffffffffLL; - - tname = ia64_templ_desc[template].name; - if (slotnum == 0) - (*info->fprintf_func) (info->stream, "[%s] ", tname); - else - (*info->fprintf_func) (info->stream, " "); - - unit = ia64_templ_desc[template].exec_unit[slotnum]; - - if (template == 2 && slotnum == 1) - { - /* skip L slot in MLI template: */ - slotnum = 2; - retval += slot_multiplier; - } - - insn = slot[slotnum]; - - if (unit == IA64_UNIT_NIL) - goto decoding_failed; - - idesc = ia64_dis_opcode (insn, unit_to_type (insn, unit)); - if (idesc == NULL) - goto decoding_failed; - - /* print predicate, if any: */ - - if ((idesc->flags & IA64_OPCODE_NO_PRED) - || (insn & 0x3f) == 0) - (*info->fprintf_func) (info->stream, " "); - else - (*info->fprintf_func) (info->stream, "(p%02d) ", (int)(insn & 0x3f)); - - /* now the actual instruction: */ - - (*info->fprintf_func) (info->stream, "%s", idesc->name); - if (idesc->operands[0]) - (*info->fprintf_func) (info->stream, " "); - - need_comma = 0; - for (j = 0; j < NELEMS (idesc->operands) && idesc->operands[j]; ++j) - { - odesc = elf64_ia64_operands + idesc->operands[j]; - - if (need_comma) - (*info->fprintf_func) (info->stream, ","); - - if (odesc - elf64_ia64_operands == IA64_OPND_IMMU64) - { - /* special case of 64 bit immediate load: */ - value = ((insn >> 13) & 0x7f) | (((insn >> 27) & 0x1ff) << 7) - | (((insn >> 22) & 0x1f) << 16) | (((insn >> 21) & 0x1) << 21) - | (slot[1] << 22) | (((insn >> 36) & 0x1) << 63); - } - else if (odesc - elf64_ia64_operands == IA64_OPND_IMMU62) - { - /* 62-bit immediate for nop.x/break.x */ - value = ((slot[1] & 0x1ffffffffffLL) << 21) - | (((insn >> 36) & 0x1) << 20) - | ((insn >> 6) & 0xfffff); - } - else if (odesc - elf64_ia64_operands == IA64_OPND_TGT64) - { - /* 60-bit immediate for long branches. */ - value = (((insn >> 13) & 0xfffff) - | (((insn >> 36) & 1) << 59) - | (((slot[1] >> 2) & 0x7fffffffffLL) << 20)) << 4; - } - else - { - err = (*odesc->extract) (odesc, insn, &value); - if (err) - { - (*info->fprintf_func) (info->stream, "%s", err); - goto done; - } - } - - switch (odesc->class) - { - case IA64_OPND_CLASS_CST: - (*info->fprintf_func) (info->stream, "%s", odesc->str); - break; - - case IA64_OPND_CLASS_REG: - if (odesc->str[0] == 'a' && odesc->str[1] == 'r') - { - switch (value) - { - case 0: case 1: case 2: case 3: - case 4: case 5: case 6: case 7: - sprintf (regname, "ar.k%u", (unsigned int) value); - break; - case 16: strcpy (regname, "ar.rsc"); break; - case 17: strcpy (regname, "ar.bsp"); break; - case 18: strcpy (regname, "ar.bspstore"); break; - case 19: strcpy (regname, "ar.rnat"); break; - case 32: strcpy (regname, "ar.ccv"); break; - case 36: strcpy (regname, "ar.unat"); break; - case 40: strcpy (regname, "ar.fpsr"); break; - case 44: strcpy (regname, "ar.itc"); break; - case 64: strcpy (regname, "ar.pfs"); break; - case 65: strcpy (regname, "ar.lc"); break; - case 66: strcpy (regname, "ar.ec"); break; - default: - sprintf (regname, "ar%u", (unsigned int) value); - break; - } - (*info->fprintf_func) (info->stream, "%s", regname); - } - else if (odesc->str[0] == 'c' && odesc->str[1] == 'r') - { - switch (value) - { - case 0: strcpy (regname, "cr.dcr"); break; - case 1: strcpy (regname, "cr.itm"); break; - case 2: strcpy (regname, "cr.iva"); break; - case 8: strcpy (regname, "cr.pta"); break; - case 16: strcpy (regname, "cr.ipsr"); break; - case 17: strcpy (regname, "cr.isr"); break; - case 19: strcpy (regname, "cr.iip"); break; - case 20: strcpy (regname, "cr.ifa"); break; - case 21: strcpy (regname, "cr.itir"); break; - case 22: strcpy (regname, "cr.iipa"); break; - case 23: strcpy (regname, "cr.ifs"); break; - case 24: strcpy (regname, "cr.iim"); break; - case 25: strcpy (regname, "cr.iha"); break; - case 64: strcpy (regname, "cr.lid"); break; - case 65: strcpy (regname, "cr.ivr"); break; - case 66: strcpy (regname, "cr.tpr"); break; - case 67: strcpy (regname, "cr.eoi"); break; - case 68: strcpy (regname, "cr.irr0"); break; - case 69: strcpy (regname, "cr.irr1"); break; - case 70: strcpy (regname, "cr.irr2"); break; - case 71: strcpy (regname, "cr.irr3"); break; - case 72: strcpy (regname, "cr.itv"); break; - case 73: strcpy (regname, "cr.pmv"); break; - case 74: strcpy (regname, "cr.cmcv"); break; - case 80: strcpy (regname, "cr.lrr0"); break; - case 81: strcpy (regname, "cr.lrr1"); break; - default: - sprintf (regname, "cr%u", (unsigned int) value); - break; - } - (*info->fprintf_func) (info->stream, "%s", regname); - } - else - (*info->fprintf_func) (info->stream, "%s%d", odesc->str, (int)value); - break; - - case IA64_OPND_CLASS_IND: - (*info->fprintf_func) (info->stream, "%s[r%d]", odesc->str, (int)value); - break; - - case IA64_OPND_CLASS_ABS: - str = 0; - if (odesc - elf64_ia64_operands == IA64_OPND_MBTYPE4) - switch (value) - { - case 0x0: str = "@brcst"; break; - case 0x8: str = "@mix"; break; - case 0x9: str = "@shuf"; break; - case 0xa: str = "@alt"; break; - case 0xb: str = "@rev"; break; - } - - if (str) - (*info->fprintf_func) (info->stream, "%s", str); - else if (odesc->flags & IA64_OPND_FLAG_DECIMAL_SIGNED) - (*info->fprintf_func) (info->stream, "%lld", (long long) value); - else if (odesc->flags & IA64_OPND_FLAG_DECIMAL_UNSIGNED) - (*info->fprintf_func) (info->stream, "%llu", (long long) value); - else - (*info->fprintf_func) (info->stream, "0x%llx", (long long) value); - break; - - case IA64_OPND_CLASS_REL: - (*info->print_address_func) (memaddr + value, info); - break; - } - - need_comma = 1; - if (j + 1 == idesc->num_outputs) - { - (*info->fprintf_func) (info->stream, "="); - need_comma = 0; - } - } - if (slotnum + 1 == ia64_templ_desc[template].group_boundary - || ((slotnum == 2) && s_bit)) - (*info->fprintf_func) (info->stream, ";;"); - - done: - ia64_free_opcode ((struct ia64_opcode *)idesc); - failed: - if (slotnum == 2) - retval += 16 - 3*slot_multiplier; - return retval; - - decoding_failed: - (*info->fprintf_func) (info->stream, " data8 %#011llx", (long long) insn); - goto failed; -} diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-gen.c xen-4.3.0/tools/debugger/xenitp/ia64-gen.c --- xen-4.2.2/tools/debugger/xenitp/ia64-gen.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-gen.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,2865 +0,0 @@ -/* ia64-gen.c -- Generate a shrunk set of opcode tables - Copyright 1999, 2000, 2001, 2002, 2004, 2005, 2006 - Free Software Foundation, Inc. - Written by Bob Manson, Cygnus Solutions, - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -/* While the ia64-opc-* set of opcode tables are easy to maintain, - they waste a tremendous amount of space. ia64-gen rearranges the - instructions into a directed acyclic graph (DAG) of instruction opcodes and - their possible completers, as well as compacting the set of strings used. - - The disassembler table consists of a state machine that does - branching based on the bits of the opcode being disassembled. The - state encodings have been chosen to minimize the amount of space - required. - - The resource table is constructed based on some text dependency tables, - which are also easier to maintain than the final representation. */ - -#include -#include -#include - -#include "ansidecl.h" -#include "libiberty.h" -#include "safe-ctype.h" -#include "sysdep.h" -#include "getopt.h" -#include "ia64-opc.h" -#include "ia64-opc-a.c" -#include "ia64-opc-i.c" -#include "ia64-opc-m.c" -#include "ia64-opc-b.c" -#include "ia64-opc-f.c" -#include "ia64-opc-x.c" -#include "ia64-opc-d.c" - -#include -#define _(String) gettext (String) - -/* This is a copy of fprintf_vma from bfd/bfd-in2.h. We have to use this - always, because we might be compiled without BFD64 defined, if configured - for a 32-bit target and --enable-targets=all is used. This will work for - both 32-bit and 64-bit hosts. */ -#define _opcode_int64_low(x) ((unsigned long) (((x) & 0xffffffff))) -#define _opcode_int64_high(x) ((unsigned long) (((x) >> 32) & 0xffffffff)) -#define opcode_fprintf_vma(s,x) \ - fprintf ((s), "%08lx%08lx", _opcode_int64_high (x), _opcode_int64_low (x)) - -const char * program_name = NULL; -int debug = 0; - -#define NELEMS(a) (sizeof (a) / sizeof ((a)[0])) -#define tmalloc(X) (X *) xmalloc (sizeof (X)) - -/* The main opcode table entry. Each entry is a unique combination of - name and flags (no two entries in the table compare as being equal - via opcodes_eq). */ -struct main_entry -{ - /* The base name of this opcode. The names of its completers are - appended to it to generate the full instruction name. */ - struct string_entry *name; - /* The base opcode entry. Which one to use is a fairly arbitrary choice; - it uses the first one passed to add_opcode_entry. */ - struct ia64_opcode *opcode; - /* The list of completers that can be applied to this opcode. */ - struct completer_entry *completers; - /* Next entry in the chain. */ - struct main_entry *next; - /* Index in the main table. */ - int main_index; -} *maintable, **ordered_table; - -int otlen = 0; -int ottotlen = 0; -int opcode_count = 0; - -/* The set of possible completers for an opcode. */ -struct completer_entry -{ - /* This entry's index in the ia64_completer_table[] array. */ - int num; - - /* The name of the completer. */ - struct string_entry *name; - - /* This entry's parent. */ - struct completer_entry *parent; - - /* Set if this is a terminal completer (occurs at the end of an - opcode). */ - int is_terminal; - - /* An alternative completer. */ - struct completer_entry *alternative; - - /* Additional completers that can be appended to this one. */ - struct completer_entry *addl_entries; - - /* Before compute_completer_bits () is invoked, this contains the actual - instruction opcode for this combination of opcode and completers. - Afterwards, it contains those bits that are different from its - parent opcode. */ - ia64_insn bits; - - /* Bits set to 1 correspond to those bits in this completer's opcode - that are different from its parent completer's opcode (or from - the base opcode if the entry is the root of the opcode's completer - list). This field is filled in by compute_completer_bits (). */ - ia64_insn mask; - - /* Index into the opcode dependency list, or -1 if none. */ - int dependencies; - - /* Remember the order encountered in the opcode tables. */ - int order; -}; - -/* One entry in the disassembler name table. */ -struct disent -{ - /* The index into the ia64_name_dis array for this entry. */ - int ournum; - - /* The index into the main_table[] array. */ - int insn; - - /* The disassmbly priority of this entry. */ - int priority; - - /* The completer_index value for this entry. */ - int completer_index; - - /* How many other entries share this decode. */ - int nextcnt; - - /* The next entry sharing the same decode. */ - struct disent *nexte; - - /* The next entry in the name list. */ - struct disent *next_ent; -} *disinsntable = NULL; - -/* A state machine that will eventually be used to generate the - disassembler table. */ -struct bittree -{ - struct disent *disent; - struct bittree *bits[3]; /* 0, 1, and X (don't care). */ - int bits_to_skip; - int skip_flag; -} *bittree; - -/* The string table contains all opcodes and completers sorted in - alphabetical order. */ - -/* One entry in the string table. */ -struct string_entry -{ - /* The index in the ia64_strings[] array for this entry. */ - int num; - /* And the string. */ - char *s; -} **string_table = NULL; - -int strtablen = 0; -int strtabtotlen = 0; - - -/* Resource dependency entries. */ -struct rdep -{ - char *name; /* Resource name. */ - unsigned - mode:2, /* RAW, WAW, or WAR. */ - semantics:3; /* Dependency semantics. */ - char *extra; /* Additional semantics info. */ - int nchks; - int total_chks; /* Total #of terminal insns. */ - int *chks; /* Insn classes which read (RAW), write - (WAW), or write (WAR) this rsrc. */ - int *chknotes; /* Dependency notes for each class. */ - int nregs; - int total_regs; /* Total #of terminal insns. */ - int *regs; /* Insn class which write (RAW), write2 - (WAW), or read (WAR) this rsrc. */ - int *regnotes; /* Dependency notes for each class. */ - - int waw_special; /* Special WAW dependency note. */ -} **rdeps = NULL; - -static int rdepslen = 0; -static int rdepstotlen = 0; - -/* Array of all instruction classes. */ -struct iclass -{ - char *name; /* Instruction class name. */ - int is_class; /* Is a class, not a terminal. */ - int nsubs; - int *subs; /* Other classes within this class. */ - int nxsubs; - int xsubs[4]; /* Exclusions. */ - char *comment; /* Optional comment. */ - int note; /* Optional note. */ - int terminal_resolved; /* Did we match this with anything? */ - int orphan; /* Detect class orphans. */ -} **ics = NULL; - -static int iclen = 0; -static int ictotlen = 0; - -/* An opcode dependency (chk/reg pair of dependency lists). */ -struct opdep -{ - int chk; /* index into dlists */ - int reg; /* index into dlists */ -} **opdeps; - -static int opdeplen = 0; -static int opdeptotlen = 0; - -/* A generic list of dependencies w/notes encoded. These may be shared. */ -struct deplist -{ - int len; - unsigned short *deps; -} **dlists; - -static int dlistlen = 0; -static int dlisttotlen = 0; - - -static void fail (const char *, ...) ATTRIBUTE_PRINTF_1; -static void warn (const char *, ...) ATTRIBUTE_PRINTF_1; -static struct rdep * insert_resource (const char *, enum ia64_dependency_mode); -static int deplist_equals (struct deplist *, struct deplist *); -static short insert_deplist (int, unsigned short *); -static short insert_dependencies (int, unsigned short *, int, unsigned short *); -static void mark_used (struct iclass *, int); -static int fetch_insn_class (const char *, int); -static int sub_compare (const void *, const void *); -static void load_insn_classes (void); -static void parse_resource_users (const char *, int **, int *, int **); -static int parse_semantics (char *); -static void add_dep (const char *, const char *, const char *, int, int, char *, int); -static void load_depfile (const char *, enum ia64_dependency_mode); -static void load_dependencies (void); -static int irf_operand (int, const char *); -static int in_iclass_mov_x (struct ia64_opcode *, struct iclass *, const char *, const char *); -static int in_iclass (struct ia64_opcode *, struct iclass *, const char *, const char *, int *); -static int lookup_regindex (const char *, int); -static int lookup_specifier (const char *); -static void print_dependency_table (void); -static struct string_entry * insert_string (char *); -static void gen_dis_table (struct bittree *); -static void print_dis_table (void); -static void generate_disassembler (void); -static void print_string_table (void); -static int completer_entries_eq (struct completer_entry *, struct completer_entry *); -static struct completer_entry * insert_gclist (struct completer_entry *); -static int get_prefix_len (const char *); -static void compute_completer_bits (struct main_entry *, struct completer_entry *); -static void collapse_redundant_completers (void); -static int insert_opcode_dependencies (struct ia64_opcode *, struct completer_entry *); -static void insert_completer_entry (struct ia64_opcode *, struct main_entry *, int); -static void print_completer_entry (struct completer_entry *); -static void print_completer_table (void); -static int opcodes_eq (struct ia64_opcode *, struct ia64_opcode *); -static void add_opcode_entry (struct ia64_opcode *); -static void print_main_table (void); -static void shrink (struct ia64_opcode *); -static void print_version (void); -static void usage (FILE *, int); -static void finish_distable (void); -static void insert_bit_table_ent (struct bittree *, int, ia64_insn, ia64_insn, int, int, int); -static void add_dis_entry (struct bittree *, ia64_insn, ia64_insn, int, struct completer_entry *, int); -static void compact_distree (struct bittree *); -static struct bittree * make_bittree_entry (void); -static struct disent * add_dis_table_ent (struct disent *, int, int, int); - - -static void -fail (const char *message, ...) -{ - va_list args; - - va_start (args, message); - fprintf (stderr, _("%s: Error: "), program_name); - vfprintf (stderr, message, args); - va_end (args); - xexit (1); -} - -static void -warn (const char *message, ...) -{ - va_list args; - - va_start (args, message); - - fprintf (stderr, _("%s: Warning: "), program_name); - vfprintf (stderr, message, args); - va_end (args); -} - -/* Add NAME to the resource table, where TYPE is RAW or WAW. */ -static struct rdep * -insert_resource (const char *name, enum ia64_dependency_mode type) -{ - if (rdepslen == rdepstotlen) - { - rdepstotlen += 20; - rdeps = (struct rdep **) - xrealloc (rdeps, sizeof(struct rdep **) * rdepstotlen); - } - rdeps[rdepslen] = tmalloc(struct rdep); - memset((void *)rdeps[rdepslen], 0, sizeof(struct rdep)); - rdeps[rdepslen]->name = xstrdup (name); - rdeps[rdepslen]->mode = type; - rdeps[rdepslen]->waw_special = 0; - - return rdeps[rdepslen++]; -} - -/* Are the lists of dependency indexes equivalent? */ -static int -deplist_equals (struct deplist *d1, struct deplist *d2) -{ - int i; - - if (d1->len != d2->len) - return 0; - - for (i = 0; i < d1->len; i++) - if (d1->deps[i] != d2->deps[i]) - return 0; - - return 1; -} - -/* Add the list of dependencies to the list of dependency lists. */ -static short -insert_deplist (int count, unsigned short *deps) -{ - /* Sort the list, then see if an equivalent list exists already. - this results in a much smaller set of dependency lists. */ - struct deplist *list; - char set[0x10000]; - int i; - - memset ((void *)set, 0, sizeof (set)); - for (i = 0; i < count; i++) - set[deps[i]] = 1; - - count = 0; - for (i = 0; i < (int) sizeof (set); i++) - if (set[i]) - ++count; - - list = tmalloc (struct deplist); - list->len = count; - list->deps = (unsigned short *) malloc (sizeof (unsigned short) * count); - - for (i = 0, count = 0; i < (int) sizeof (set); i++) - if (set[i]) - list->deps[count++] = i; - - /* Does this list exist already? */ - for (i = 0; i < dlistlen; i++) - if (deplist_equals (list, dlists[i])) - { - free (list->deps); - free (list); - return i; - } - - if (dlistlen == dlisttotlen) - { - dlisttotlen += 20; - dlists = (struct deplist **) - xrealloc (dlists, sizeof(struct deplist **) * dlisttotlen); - } - dlists[dlistlen] = list; - - return dlistlen++; -} - -/* Add the given pair of dependency lists to the opcode dependency list. */ -static short -insert_dependencies (int nchks, unsigned short *chks, - int nregs, unsigned short *regs) -{ - struct opdep *pair; - int i; - int regind = -1; - int chkind = -1; - - if (nregs > 0) - regind = insert_deplist (nregs, regs); - if (nchks > 0) - chkind = insert_deplist (nchks, chks); - - for (i = 0; i < opdeplen; i++) - if (opdeps[i]->chk == chkind - && opdeps[i]->reg == regind) - return i; - - pair = tmalloc (struct opdep); - pair->chk = chkind; - pair->reg = regind; - - if (opdeplen == opdeptotlen) - { - opdeptotlen += 20; - opdeps = (struct opdep **) - xrealloc (opdeps, sizeof(struct opdep **) * opdeptotlen); - } - opdeps[opdeplen] = pair; - - return opdeplen++; -} - -static void -mark_used (struct iclass *ic, int clear_terminals) -{ - int i; - - ic->orphan = 0; - if (clear_terminals) - ic->terminal_resolved = 1; - - for (i = 0; i < ic->nsubs; i++) - mark_used (ics[ic->subs[i]], clear_terminals); - - for (i = 0; i < ic->nxsubs; i++) - mark_used (ics[ic->xsubs[i]], clear_terminals); -} - -/* Look up an instruction class; if CREATE make a new one if none found; - returns the index into the insn class array. */ -static int -fetch_insn_class (const char *full_name, int create) -{ - char *name; - char *notestr; - char *xsect; - char *comment; - int i, note = 0; - int ind; - int is_class = 0; - - if (strncmp (full_name, "IC:", 3) == 0) - { - name = xstrdup (full_name + 3); - is_class = 1; - } - else - name = xstrdup (full_name); - - if ((xsect = strchr(name, '\\')) != NULL) - is_class = 1; - if ((comment = strchr(name, '[')) != NULL) - is_class = 1; - if ((notestr = strchr(name, '+')) != NULL) - is_class = 1; - - /* If it is a composite class, then ignore comments and notes that come after - the '\\', since they don't apply to the part we are decoding now. */ - if (xsect) - { - if (comment > xsect) - comment = 0; - if (notestr > xsect) - notestr = 0; - } - - if (notestr) - { - char *nextnotestr; - - note = atoi (notestr + 1); - if ((nextnotestr = strchr (notestr + 1, '+')) != NULL) - { - if (strcmp (notestr, "+1+13") == 0) - note = 13; - else if (!xsect || nextnotestr < xsect) - warn (_("multiple note %s not handled\n"), notestr); - } - } - - /* If it's a composite class, leave the notes and comments in place so that - we have a unique name for the composite class. Otherwise, we remove - them. */ - if (!xsect) - { - if (notestr) - *notestr = 0; - if (comment) - *comment = 0; - } - - for (i = 0; i < iclen; i++) - if (strcmp (name, ics[i]->name) == 0 - && ((comment == NULL && ics[i]->comment == NULL) - || (comment != NULL && ics[i]->comment != NULL - && strncmp (ics[i]->comment, comment, - strlen (ics[i]->comment)) == 0)) - && note == ics[i]->note) - return i; - - if (!create) - return -1; - - /* Doesn't exist, so make a new one. */ - if (iclen == ictotlen) - { - ictotlen += 20; - ics = (struct iclass **) - xrealloc (ics, (ictotlen) * sizeof (struct iclass *)); - } - - ind = iclen++; - ics[ind] = tmalloc (struct iclass); - memset ((void *)ics[ind], 0, sizeof (struct iclass)); - ics[ind]->name = xstrdup (name); - ics[ind]->is_class = is_class; - ics[ind]->orphan = 1; - - if (comment) - { - ics[ind]->comment = xstrdup (comment + 1); - ics[ind]->comment[strlen (ics[ind]->comment)-1] = 0; - } - - if (notestr) - ics[ind]->note = note; - - /* If it's a composite class, there's a comment or note, look for an - existing class or terminal with the same name. */ - if ((xsect || comment || notestr) && is_class) - { - /* First, populate with the class we're based on. */ - char *subname = name; - - if (xsect) - *xsect = 0; - else if (comment) - *comment = 0; - else if (notestr) - *notestr = 0; - - ics[ind]->nsubs = 1; - ics[ind]->subs = tmalloc(int); - ics[ind]->subs[0] = fetch_insn_class (subname, 1); - } - - while (xsect) - { - char *subname = xsect + 1; - - xsect = strchr (subname, '\\'); - if (xsect) - *xsect = 0; - ics[ind]->xsubs[ics[ind]->nxsubs] = fetch_insn_class (subname,1); - ics[ind]->nxsubs++; - } - free (name); - - return ind; -} - -/* For sorting a class's sub-class list only; make sure classes appear before - terminals. */ -static int -sub_compare (const void *e1, const void *e2) -{ - struct iclass *ic1 = ics[*(int *)e1]; - struct iclass *ic2 = ics[*(int *)e2]; - - if (ic1->is_class) - { - if (!ic2->is_class) - return -1; - } - else if (ic2->is_class) - return 1; - - return strcmp (ic1->name, ic2->name); -} - -static void -load_insn_classes (void) -{ - FILE *fp = fopen ("ia64-ic.tbl", "r"); - char buf[2048]; - - if (fp == NULL) - fail (_("can't find ia64-ic.tbl for reading\n")); - - /* Discard first line. */ - fgets (buf, sizeof(buf), fp); - - while (!feof (fp)) - { - int iclass; - char *name; - char *tmp; - - if (fgets (buf, sizeof (buf), fp) == NULL) - break; - - while (ISSPACE (buf[strlen (buf) - 1])) - buf[strlen (buf) - 1] = '\0'; - - name = tmp = buf; - while (*tmp != ';') - { - ++tmp; - if (tmp == buf + sizeof (buf)) - abort (); - } - *tmp++ = '\0'; - - iclass = fetch_insn_class (name, 1); - ics[iclass]->is_class = 1; - - if (strcmp (name, "none") == 0) - { - ics[iclass]->is_class = 0; - ics[iclass]->terminal_resolved = 1; - continue; - } - - /* For this class, record all sub-classes. */ - while (*tmp) - { - char *subname; - int sub; - - while (*tmp && ISSPACE (*tmp)) - { - ++tmp; - if (tmp == buf + sizeof (buf)) - abort (); - } - subname = tmp; - while (*tmp && *tmp != ',') - { - ++tmp; - if (tmp == buf + sizeof (buf)) - abort (); - } - if (*tmp == ',') - *tmp++ = '\0'; - - ics[iclass]->subs = (int *) - xrealloc ((void *)ics[iclass]->subs, - (ics[iclass]->nsubs + 1) * sizeof (int)); - - sub = fetch_insn_class (subname, 1); - ics[iclass]->subs = (int *) - xrealloc (ics[iclass]->subs, (ics[iclass]->nsubs + 1) * sizeof (int)); - ics[iclass]->subs[ics[iclass]->nsubs++] = sub; - } - - /* Make sure classes come before terminals. */ - qsort ((void *)ics[iclass]->subs, - ics[iclass]->nsubs, sizeof(int), sub_compare); - } - fclose (fp); - - if (debug) - printf ("%d classes\n", iclen); -} - -/* Extract the insn classes from the given line. */ -static void -parse_resource_users (ref, usersp, nusersp, notesp) - const char *ref; - int **usersp; - int *nusersp; - int **notesp; -{ - int c; - char *line = xstrdup (ref); - char *tmp = line; - int *users = *usersp; - int count = *nusersp; - int *notes = *notesp; - - c = *tmp; - while (c != 0) - { - char *notestr; - int note; - char *xsect; - int iclass; - int create = 0; - char *name; - - while (ISSPACE (*tmp)) - ++tmp; - name = tmp; - while (*tmp && *tmp != ',') - ++tmp; - c = *tmp; - *tmp++ = '\0'; - - xsect = strchr (name, '\\'); - if ((notestr = strstr (name, "+")) != NULL) - { - char *nextnotestr; - - note = atoi (notestr + 1); - if ((nextnotestr = strchr (notestr + 1, '+')) != NULL) - { - /* Note 13 always implies note 1. */ - if (strcmp (notestr, "+1+13") == 0) - note = 13; - else if (!xsect || nextnotestr < xsect) - warn (_("multiple note %s not handled\n"), notestr); - } - if (!xsect) - *notestr = '\0'; - } - else - note = 0; - - /* All classes are created when the insn class table is parsed; - Individual instructions might not appear until the dependency tables - are read. Only create new classes if it's *not* an insn class, - or if it's a composite class (which wouldn't necessarily be in the IC - table). */ - if (strncmp (name, "IC:", 3) != 0 || xsect != NULL) - create = 1; - - iclass = fetch_insn_class (name, create); - if (iclass != -1) - { - users = (int *) - xrealloc ((void *) users,(count + 1) * sizeof (int)); - notes = (int *) - xrealloc ((void *) notes,(count + 1) * sizeof (int)); - notes[count] = note; - users[count++] = iclass; - mark_used (ics[iclass], 0); - } - else if (debug) - printf("Class %s not found\n", name); - } - /* Update the return values. */ - *usersp = users; - *nusersp = count; - *notesp = notes; - - free (line); -} - -static int -parse_semantics (char *sem) -{ - if (strcmp (sem, "none") == 0) - return IA64_DVS_NONE; - else if (strcmp (sem, "implied") == 0) - return IA64_DVS_IMPLIED; - else if (strcmp (sem, "impliedF") == 0) - return IA64_DVS_IMPLIEDF; - else if (strcmp (sem, "data") == 0) - return IA64_DVS_DATA; - else if (strcmp (sem, "instr") == 0) - return IA64_DVS_INSTR; - else if (strcmp (sem, "specific") == 0) - return IA64_DVS_SPECIFIC; - else if (strcmp (sem, "stop") == 0) - return IA64_DVS_STOP; - else - return IA64_DVS_OTHER; -} - -static void -add_dep (const char *name, const char *chk, const char *reg, - int semantics, int mode, char *extra, int flag) -{ - struct rdep *rs; - - rs = insert_resource (name, mode); - - parse_resource_users (chk, &rs->chks, &rs->nchks, &rs->chknotes); - parse_resource_users (reg, &rs->regs, &rs->nregs, &rs->regnotes); - - rs->semantics = semantics; - rs->extra = extra; - rs->waw_special = flag; -} - -static void -load_depfile (const char *filename, enum ia64_dependency_mode mode) -{ - FILE *fp = fopen (filename, "r"); - char buf[1024]; - - if (fp == NULL) - fail (_("can't find %s for reading\n"), filename); - - fgets (buf, sizeof(buf), fp); - while (!feof (fp)) - { - char *name, *tmp; - int semantics; - char *extra; - char *regp, *chkp; - - if (fgets (buf, sizeof(buf), fp) == NULL) - break; - - while (ISSPACE (buf[strlen (buf) - 1])) - buf[strlen (buf) - 1] = '\0'; - - name = tmp = buf; - while (*tmp != ';') - ++tmp; - *tmp++ = '\0'; - - while (ISSPACE (*tmp)) - ++tmp; - regp = tmp; - tmp = strchr (tmp, ';'); - if (!tmp) - abort (); - *tmp++ = 0; - while (ISSPACE (*tmp)) - ++tmp; - chkp = tmp; - tmp = strchr (tmp, ';'); - if (!tmp) - abort (); - *tmp++ = 0; - while (ISSPACE (*tmp)) - ++tmp; - semantics = parse_semantics (tmp); - extra = semantics == IA64_DVS_OTHER ? xstrdup (tmp) : NULL; - - /* For WAW entries, if the chks and regs differ, we need to enter the - entries in both positions so that the tables will be parsed properly, - without a lot of extra work. */ - if (mode == IA64_DV_WAW && strcmp (regp, chkp) != 0) - { - add_dep (name, chkp, regp, semantics, mode, extra, 0); - add_dep (name, regp, chkp, semantics, mode, extra, 1); - } - else - { - add_dep (name, chkp, regp, semantics, mode, extra, 0); - } - } - fclose (fp); -} - -static void -load_dependencies (void) -{ - load_depfile ("ia64-raw.tbl", IA64_DV_RAW); - load_depfile ("ia64-waw.tbl", IA64_DV_WAW); - load_depfile ("ia64-war.tbl", IA64_DV_WAR); - - if (debug) - printf ("%d RAW/WAW/WAR dependencies\n", rdepslen); -} - -/* Is the given operand an indirect register file operand? */ -static int -irf_operand (int op, const char *field) -{ - if (!field) - { - return op == IA64_OPND_RR_R3 || op == IA64_OPND_DBR_R3 - || op == IA64_OPND_IBR_R3 || op == IA64_OPND_PKR_R3 - || op == IA64_OPND_PMC_R3 || op == IA64_OPND_PMD_R3 - || op == IA64_OPND_MSR_R3 || op == IA64_OPND_CPUID_R3; - } - else - { - return ((op == IA64_OPND_RR_R3 && strstr (field, "rr")) - || (op == IA64_OPND_DBR_R3 && strstr (field, "dbr")) - || (op == IA64_OPND_IBR_R3 && strstr (field, "ibr")) - || (op == IA64_OPND_PKR_R3 && strstr (field, "pkr")) - || (op == IA64_OPND_PMC_R3 && strstr (field, "pmc")) - || (op == IA64_OPND_PMD_R3 && strstr (field, "pmd")) - || (op == IA64_OPND_MSR_R3 && strstr (field, "msr")) - || (op == IA64_OPND_CPUID_R3 && strstr (field, "cpuid"))); - } -} - -/* Handle mov_ar, mov_br, mov_cr, mov_indirect, mov_ip, mov_pr, mov_psr, and - mov_um insn classes. */ -static int -in_iclass_mov_x (struct ia64_opcode *idesc, struct iclass *ic, - const char *format, const char *field) -{ - int plain_mov = strcmp (idesc->name, "mov") == 0; - - if (!format) - return 0; - - switch (ic->name[4]) - { - default: - abort (); - case 'a': - { - int i = strcmp (idesc->name, "mov.i") == 0; - int m = strcmp (idesc->name, "mov.m") == 0; - int i2627 = i && idesc->operands[0] == IA64_OPND_AR3; - int i28 = i && idesc->operands[1] == IA64_OPND_AR3; - int m2930 = m && idesc->operands[0] == IA64_OPND_AR3; - int m31 = m && idesc->operands[1] == IA64_OPND_AR3; - int pseudo0 = plain_mov && idesc->operands[1] == IA64_OPND_AR3; - int pseudo1 = plain_mov && idesc->operands[0] == IA64_OPND_AR3; - - /* IC:mov ar */ - if (i2627) - return strstr (format, "I26") || strstr (format, "I27"); - if (i28) - return strstr (format, "I28") != NULL; - if (m2930) - return strstr (format, "M29") || strstr (format, "M30"); - if (m31) - return strstr (format, "M31") != NULL; - if (pseudo0 || pseudo1) - return 1; - } - break; - case 'b': - { - int i21 = idesc->operands[0] == IA64_OPND_B1; - int i22 = plain_mov && idesc->operands[1] == IA64_OPND_B2; - if (i22) - return strstr (format, "I22") != NULL; - if (i21) - return strstr (format, "I21") != NULL; - } - break; - case 'c': - { - int m32 = plain_mov && idesc->operands[0] == IA64_OPND_CR3; - int m33 = plain_mov && idesc->operands[1] == IA64_OPND_CR3; - if (m32) - return strstr (format, "M32") != NULL; - if (m33) - return strstr (format, "M33") != NULL; - } - break; - case 'i': - if (ic->name[5] == 'n') - { - int m42 = plain_mov && irf_operand (idesc->operands[0], field); - int m43 = plain_mov && irf_operand (idesc->operands[1], field); - if (m42) - return strstr (format, "M42") != NULL; - if (m43) - return strstr (format, "M43") != NULL; - } - else if (ic->name[5] == 'p') - { - return idesc->operands[1] == IA64_OPND_IP; - } - else - abort (); - break; - case 'p': - if (ic->name[5] == 'r') - { - int i25 = plain_mov && idesc->operands[1] == IA64_OPND_PR; - int i23 = plain_mov && idesc->operands[0] == IA64_OPND_PR; - int i24 = plain_mov && idesc->operands[0] == IA64_OPND_PR_ROT; - if (i23) - return strstr (format, "I23") != NULL; - if (i24) - return strstr (format, "I24") != NULL; - if (i25) - return strstr (format, "I25") != NULL; - } - else if (ic->name[5] == 's') - { - int m35 = plain_mov && idesc->operands[0] == IA64_OPND_PSR_L; - int m36 = plain_mov && idesc->operands[1] == IA64_OPND_PSR; - if (m35) - return strstr (format, "M35") != NULL; - if (m36) - return strstr (format, "M36") != NULL; - } - else - abort (); - break; - case 'u': - { - int m35 = plain_mov && idesc->operands[0] == IA64_OPND_PSR_UM; - int m36 = plain_mov && idesc->operands[1] == IA64_OPND_PSR_UM; - if (m35) - return strstr (format, "M35") != NULL; - if (m36) - return strstr (format, "M36") != NULL; - } - break; - } - return 0; -} - -/* Is the given opcode in the given insn class? */ -static int -in_iclass (struct ia64_opcode *idesc, struct iclass *ic, - const char *format, const char *field, int *notep) -{ - int i; - int resolved = 0; - - if (ic->comment) - { - if (!strncmp (ic->comment, "Format", 6)) - { - /* Assume that the first format seen is the most restrictive, and - only keep a later one if it looks like it's more restrictive. */ - if (format) - { - if (strlen (ic->comment) < strlen (format)) - { - warn (_("most recent format '%s'\nappears more restrictive than '%s'\n"), - ic->comment, format); - format = ic->comment; - } - } - else - format = ic->comment; - } - else if (!strncmp (ic->comment, "Field", 5)) - { - if (field) - warn (_("overlapping field %s->%s\n"), - ic->comment, field); - field = ic->comment; - } - } - - /* An insn class matches anything that is the same followed by completers, - except when the absence and presence of completers constitutes different - instructions. */ - if (ic->nsubs == 0 && ic->nxsubs == 0) - { - int is_mov = strncmp (idesc->name, "mov", 3) == 0; - int plain_mov = strcmp (idesc->name, "mov") == 0; - int len = strlen(ic->name); - - resolved = ((strncmp (ic->name, idesc->name, len) == 0) - && (idesc->name[len] == '\0' - || idesc->name[len] == '.')); - - /* All break, nop, and hint variations must match exactly. */ - if (resolved && - (strcmp (ic->name, "break") == 0 - || strcmp (ic->name, "nop") == 0 - || strcmp (ic->name, "hint") == 0)) - resolved = strcmp (ic->name, idesc->name) == 0; - - /* Assume restrictions in the FORMAT/FIELD negate resolution, - unless specifically allowed by clauses in this block. */ - if (resolved && field) - { - /* Check Field(sf)==sN against opcode sN. */ - if (strstr(field, "(sf)==") != NULL) - { - char *sf; - - if ((sf = strstr (idesc->name, ".s")) != 0) - resolved = strcmp (sf + 1, strstr (field, "==") + 2) == 0; - } - /* Check Field(lftype)==XXX. */ - else if (strstr (field, "(lftype)") != NULL) - { - if (strstr (idesc->name, "fault") != NULL) - resolved = strstr (field, "fault") != NULL; - else - resolved = strstr (field, "fault") == NULL; - } - /* Handle Field(ctype)==XXX. */ - else if (strstr (field, "(ctype)") != NULL) - { - if (strstr (idesc->name, "or.andcm")) - resolved = strstr (field, "or.andcm") != NULL; - else if (strstr (idesc->name, "and.orcm")) - resolved = strstr (field, "and.orcm") != NULL; - else if (strstr (idesc->name, "orcm")) - resolved = strstr (field, "or orcm") != NULL; - else if (strstr (idesc->name, "or")) - resolved = strstr (field, "or orcm") != NULL; - else if (strstr (idesc->name, "andcm")) - resolved = strstr (field, "and andcm") != NULL; - else if (strstr (idesc->name, "and")) - resolved = strstr (field, "and andcm") != NULL; - else if (strstr (idesc->name, "unc")) - resolved = strstr (field, "unc") != NULL; - else - resolved = strcmp (field, "Field(ctype)==") == 0; - } - } - - if (resolved && format) - { - if (strncmp (idesc->name, "dep", 3) == 0 - && strstr (format, "I13") != NULL) - resolved = idesc->operands[1] == IA64_OPND_IMM8; - else if (strncmp (idesc->name, "chk", 3) == 0 - && strstr (format, "M21") != NULL) - resolved = idesc->operands[0] == IA64_OPND_F2; - else if (strncmp (idesc->name, "lfetch", 6) == 0) - resolved = (strstr (format, "M14 M15") != NULL - && (idesc->operands[1] == IA64_OPND_R2 - || idesc->operands[1] == IA64_OPND_IMM9b)); - else if (strncmp (idesc->name, "br.call", 7) == 0 - && strstr (format, "B5") != NULL) - resolved = idesc->operands[1] == IA64_OPND_B2; - else if (strncmp (idesc->name, "br.call", 7) == 0 - && strstr (format, "B3") != NULL) - resolved = idesc->operands[1] == IA64_OPND_TGT25c; - else if (strncmp (idesc->name, "brp", 3) == 0 - && strstr (format, "B7") != NULL) - resolved = idesc->operands[0] == IA64_OPND_B2; - else if (strcmp (ic->name, "invala") == 0) - resolved = strcmp (idesc->name, ic->name) == 0; - else if (strncmp (idesc->name, "st", 2) == 0 - && (strstr (format, "M5") != NULL - || strstr (format, "M10") != NULL)) - resolved = idesc->flags & IA64_OPCODE_POSTINC; - else if (strncmp (idesc->name, "ld", 2) == 0 - && (strstr (format, "M2 M3") != NULL - || strstr (format, "M12") != NULL - || strstr (format, "M7 M8") != NULL)) - resolved = idesc->flags & IA64_OPCODE_POSTINC; - else - resolved = 0; - } - - /* Misc brl variations ('.cond' is optional); - plain brl matches brl.cond. */ - if (!resolved - && (strcmp (idesc->name, "brl") == 0 - || strncmp (idesc->name, "brl.", 4) == 0) - && strcmp (ic->name, "brl.cond") == 0) - { - resolved = 1; - } - - /* Misc br variations ('.cond' is optional). */ - if (!resolved - && (strcmp (idesc->name, "br") == 0 - || strncmp (idesc->name, "br.", 3) == 0) - && strcmp (ic->name, "br.cond") == 0) - { - if (format) - resolved = (strstr (format, "B4") != NULL - && idesc->operands[0] == IA64_OPND_B2) - || (strstr (format, "B1") != NULL - && idesc->operands[0] == IA64_OPND_TGT25c); - else - resolved = 1; - } - - /* probe variations. */ - if (!resolved && strncmp (idesc->name, "probe", 5) == 0) - { - resolved = strcmp (ic->name, "probe") == 0 - && !((strstr (idesc->name, "fault") != NULL) - ^ (format && strstr (format, "M40") != NULL)); - } - - /* mov variations. */ - if (!resolved && is_mov) - { - if (plain_mov) - { - /* mov alias for fmerge. */ - if (strcmp (ic->name, "fmerge") == 0) - { - resolved = idesc->operands[0] == IA64_OPND_F1 - && idesc->operands[1] == IA64_OPND_F3; - } - /* mov alias for adds (r3 or imm14). */ - else if (strcmp (ic->name, "adds") == 0) - { - resolved = (idesc->operands[0] == IA64_OPND_R1 - && (idesc->operands[1] == IA64_OPND_R3 - || (idesc->operands[1] == IA64_OPND_IMM14))); - } - /* mov alias for addl. */ - else if (strcmp (ic->name, "addl") == 0) - { - resolved = idesc->operands[0] == IA64_OPND_R1 - && idesc->operands[1] == IA64_OPND_IMM22; - } - } - - /* Some variants of mov and mov.[im]. */ - if (!resolved && strncmp (ic->name, "mov_", 4) == 0) - resolved = in_iclass_mov_x (idesc, ic, format, field); - } - - /* Keep track of this so we can flag any insn classes which aren't - mapped onto at least one real insn. */ - if (resolved) - ic->terminal_resolved = 1; - } - else for (i = 0; i < ic->nsubs; i++) - { - if (in_iclass (idesc, ics[ic->subs[i]], format, field, notep)) - { - int j; - - for (j = 0; j < ic->nxsubs; j++) - if (in_iclass (idesc, ics[ic->xsubs[j]], NULL, NULL, NULL)) - return 0; - - if (debug > 1) - printf ("%s is in IC %s\n", idesc->name, ic->name); - - resolved = 1; - break; - } - } - - /* If it's in this IC, add the IC note (if any) to the insn. */ - if (resolved) - { - if (ic->note && notep) - { - if (*notep && *notep != ic->note) - warn (_("overwriting note %d with note %d (IC:%s)\n"), - *notep, ic->note, ic->name); - - *notep = ic->note; - } - } - - return resolved; -} - - -static int -lookup_regindex (const char *name, int specifier) -{ - switch (specifier) - { - case IA64_RS_ARX: - if (strstr (name, "[RSC]")) - return 16; - if (strstr (name, "[BSP]")) - return 17; - else if (strstr (name, "[BSPSTORE]")) - return 18; - else if (strstr (name, "[RNAT]")) - return 19; - else if (strstr (name, "[FCR]")) - return 21; - else if (strstr (name, "[EFLAG]")) - return 24; - else if (strstr (name, "[CSD]")) - return 25; - else if (strstr (name, "[SSD]")) - return 26; - else if (strstr (name, "[CFLG]")) - return 27; - else if (strstr (name, "[FSR]")) - return 28; - else if (strstr (name, "[FIR]")) - return 29; - else if (strstr (name, "[FDR]")) - return 30; - else if (strstr (name, "[CCV]")) - return 32; - else if (strstr (name, "[ITC]")) - return 44; - else if (strstr (name, "[PFS]")) - return 64; - else if (strstr (name, "[LC]")) - return 65; - else if (strstr (name, "[EC]")) - return 66; - abort (); - case IA64_RS_CRX: - if (strstr (name, "[DCR]")) - return 0; - else if (strstr (name, "[ITM]")) - return 1; - else if (strstr (name, "[IVA]")) - return 2; - else if (strstr (name, "[PTA]")) - return 8; - else if (strstr (name, "[GPTA]")) - return 9; - else if (strstr (name, "[IPSR]")) - return 16; - else if (strstr (name, "[ISR]")) - return 17; - else if (strstr (name, "[IIP]")) - return 19; - else if (strstr (name, "[IFA]")) - return 20; - else if (strstr (name, "[ITIR]")) - return 21; - else if (strstr (name, "[IIPA]")) - return 22; - else if (strstr (name, "[IFS]")) - return 23; - else if (strstr (name, "[IIM]")) - return 24; - else if (strstr (name, "[IHA]")) - return 25; - else if (strstr (name, "[LID]")) - return 64; - else if (strstr (name, "[IVR]")) - return 65; - else if (strstr (name, "[TPR]")) - return 66; - else if (strstr (name, "[EOI]")) - return 67; - else if (strstr (name, "[ITV]")) - return 72; - else if (strstr (name, "[PMV]")) - return 73; - else if (strstr (name, "[CMCV]")) - return 74; - abort (); - case IA64_RS_PSR: - if (strstr (name, ".be")) - return 1; - else if (strstr (name, ".up")) - return 2; - else if (strstr (name, ".ac")) - return 3; - else if (strstr (name, ".mfl")) - return 4; - else if (strstr (name, ".mfh")) - return 5; - else if (strstr (name, ".ic")) - return 13; - else if (strstr (name, ".i")) - return 14; - else if (strstr (name, ".pk")) - return 15; - else if (strstr (name, ".dt")) - return 17; - else if (strstr (name, ".dfl")) - return 18; - else if (strstr (name, ".dfh")) - return 19; - else if (strstr (name, ".sp")) - return 20; - else if (strstr (name, ".pp")) - return 21; - else if (strstr (name, ".di")) - return 22; - else if (strstr (name, ".si")) - return 23; - else if (strstr (name, ".db")) - return 24; - else if (strstr (name, ".lp")) - return 25; - else if (strstr (name, ".tb")) - return 26; - else if (strstr (name, ".rt")) - return 27; - else if (strstr (name, ".cpl")) - return 32; - else if (strstr (name, ".rs")) - return 34; - else if (strstr (name, ".mc")) - return 35; - else if (strstr (name, ".it")) - return 36; - else if (strstr (name, ".id")) - return 37; - else if (strstr (name, ".da")) - return 38; - else if (strstr (name, ".dd")) - return 39; - else if (strstr (name, ".ss")) - return 40; - else if (strstr (name, ".ri")) - return 41; - else if (strstr (name, ".ed")) - return 43; - else if (strstr (name, ".bn")) - return 44; - else if (strstr (name, ".ia")) - return 45; - else if (strstr (name, ".vm")) - return 46; - else - abort (); - default: - break; - } - return REG_NONE; -} - -static int -lookup_specifier (const char *name) -{ - if (strchr (name, '%')) - { - if (strstr (name, "AR[K%]") != NULL) - return IA64_RS_AR_K; - if (strstr (name, "AR[UNAT]") != NULL) - return IA64_RS_AR_UNAT; - if (strstr (name, "AR%, % in 8") != NULL) - return IA64_RS_AR; - if (strstr (name, "AR%, % in 48") != NULL) - return IA64_RS_ARb; - if (strstr (name, "BR%") != NULL) - return IA64_RS_BR; - if (strstr (name, "CR[IRR%]") != NULL) - return IA64_RS_CR_IRR; - if (strstr (name, "CR[LRR%]") != NULL) - return IA64_RS_CR_LRR; - if (strstr (name, "CR%") != NULL) - return IA64_RS_CR; - if (strstr (name, "FR%, % in 0") != NULL) - return IA64_RS_FR; - if (strstr (name, "FR%, % in 2") != NULL) - return IA64_RS_FRb; - if (strstr (name, "GR%") != NULL) - return IA64_RS_GR; - if (strstr (name, "PR%, % in 1 ") != NULL) - return IA64_RS_PR; - if (strstr (name, "PR%, % in 16 ") != NULL) - return IA64_RS_PRr; - - warn (_("don't know how to specify %% dependency %s\n"), - name); - } - else if (strchr (name, '#')) - { - if (strstr (name, "CPUID#") != NULL) - return IA64_RS_CPUID; - if (strstr (name, "DBR#") != NULL) - return IA64_RS_DBR; - if (strstr (name, "IBR#") != NULL) - return IA64_RS_IBR; - if (strstr (name, "MSR#") != NULL) - return IA64_RS_MSR; - if (strstr (name, "PKR#") != NULL) - return IA64_RS_PKR; - if (strstr (name, "PMC#") != NULL) - return IA64_RS_PMC; - if (strstr (name, "PMD#") != NULL) - return IA64_RS_PMD; - if (strstr (name, "RR#") != NULL) - return IA64_RS_RR; - - warn (_("Don't know how to specify # dependency %s\n"), - name); - } - else if (strncmp (name, "AR[FPSR]", 8) == 0) - return IA64_RS_AR_FPSR; - else if (strncmp (name, "AR[", 3) == 0) - return IA64_RS_ARX; - else if (strncmp (name, "CR[", 3) == 0) - return IA64_RS_CRX; - else if (strncmp (name, "PSR.", 4) == 0) - return IA64_RS_PSR; - else if (strcmp (name, "InService*") == 0) - return IA64_RS_INSERVICE; - else if (strcmp (name, "GR0") == 0) - return IA64_RS_GR0; - else if (strcmp (name, "CFM") == 0) - return IA64_RS_CFM; - else if (strcmp (name, "PR63") == 0) - return IA64_RS_PR63; - else if (strcmp (name, "RSE") == 0) - return IA64_RS_RSE; - - return IA64_RS_ANY; -} - -static void -print_dependency_table () -{ - int i, j; - - if (debug) - { - for (i=0;i < iclen;i++) - { - if (ics[i]->is_class) - { - if (!ics[i]->nsubs) - { - if (ics[i]->comment) - warn (_("IC:%s [%s] has no terminals or sub-classes\n"), - ics[i]->name, ics[i]->comment); - else - warn (_("IC:%s has no terminals or sub-classes\n"), - ics[i]->name); - } - } - else - { - if (!ics[i]->terminal_resolved && !ics[i]->orphan) - { - if (ics[i]->comment) - warn (_("no insns mapped directly to terminal IC %s [%s]"), - ics[i]->name, ics[i]->comment); - else - warn (_("no insns mapped directly to terminal IC %s\n"), - ics[i]->name); - } - } - } - - for (i = 0; i < iclen; i++) - { - if (ics[i]->orphan) - { - mark_used (ics[i], 1); - warn (_("class %s is defined but not used\n"), - ics[i]->name); - } - } - - if (debug > 1) - for (i = 0; i < rdepslen; i++) - { - static const char *mode_str[] = { "RAW", "WAW", "WAR" }; - - if (rdeps[i]->total_chks == 0) - warn (_("Warning: rsrc %s (%s) has no chks%s\n"), - rdeps[i]->name, mode_str[rdeps[i]->mode], - rdeps[i]->total_regs ? "" : " or regs"); - else if (rdeps[i]->total_regs == 0) - warn (_("rsrc %s (%s) has no regs\n"), - rdeps[i]->name, mode_str[rdeps[i]->mode]); - } - } - - /* The dependencies themselves. */ - printf ("static const struct ia64_dependency\ndependencies[] = {\n"); - for (i = 0; i < rdepslen; i++) - { - /* '%', '#', AR[], CR[], or PSR. indicates we need to specify the actual - resource used. */ - int specifier = lookup_specifier (rdeps[i]->name); - int regindex = lookup_regindex (rdeps[i]->name, specifier); - - printf (" { \"%s\", %d, %d, %d, %d, ", - rdeps[i]->name, specifier, - (int)rdeps[i]->mode, (int)rdeps[i]->semantics, regindex); - if (rdeps[i]->semantics == IA64_DVS_OTHER) - { - const char *quote, *rest; - - putchar ('\"'); - rest = rdeps[i]->extra; - quote = strchr (rest, '\"'); - while (quote != NULL) - { - printf ("%.*s\\\"", (int) (quote - rest), rest); - rest = quote + 1; - quote = strchr (rest, '\"'); - } - printf ("%s\", ", rest); - } - else - printf ("NULL, "); - printf("},\n"); - } - printf ("};\n\n"); - - /* And dependency lists. */ - for (i=0;i < dlistlen;i++) - { - int len = 2; - printf ("static const unsigned short dep%d[] = {\n ", i); - for (j=0;j < dlists[i]->len; j++) - { - len += printf ("%d, ", dlists[i]->deps[j]); - if (len > 75) - { - printf("\n "); - len = 2; - } - } - printf ("\n};\n\n"); - } - - /* And opcode dependency list. */ - printf ("#define NELS(X) (sizeof(X)/sizeof(X[0]))\n"); - printf ("static const struct ia64_opcode_dependency\n"); - printf ("op_dependencies[] = {\n"); - for (i = 0; i < opdeplen; i++) - { - printf (" { "); - if (opdeps[i]->chk == -1) - printf ("0, NULL, "); - else - printf ("NELS(dep%d), dep%d, ", opdeps[i]->chk, opdeps[i]->chk); - if (opdeps[i]->reg == -1) - printf ("0, NULL, "); - else - printf ("NELS(dep%d), dep%d, ", opdeps[i]->reg, opdeps[i]->reg); - printf ("},\n"); - } - printf ("};\n\n"); -} - - -/* Add STR to the string table. */ -static struct string_entry * -insert_string (char *str) -{ - int start = 0, end = strtablen; - int i, x; - - if (strtablen == strtabtotlen) - { - strtabtotlen += 20; - string_table = (struct string_entry **) - xrealloc (string_table, - sizeof (struct string_entry **) * strtabtotlen); - } - - if (strtablen == 0) - { - strtablen = 1; - string_table[0] = tmalloc (struct string_entry); - string_table[0]->s = xstrdup (str); - string_table[0]->num = 0; - return string_table[0]; - } - - if (strcmp (str, string_table[strtablen - 1]->s) > 0) - i = end; - else if (strcmp (str, string_table[0]->s) < 0) - i = 0; - else - { - while (1) - { - int c; - - i = (start + end) / 2; - c = strcmp (str, string_table[i]->s); - - if (c < 0) - end = i - 1; - else if (c == 0) - return string_table[i]; - else - start = i + 1; - - if (start > end) - break; - } - } - - for (; i > 0 && i < strtablen; i--) - if (strcmp (str, string_table[i - 1]->s) > 0) - break; - - for (; i < strtablen; i++) - if (strcmp (str, string_table[i]->s) < 0) - break; - - for (x = strtablen - 1; x >= i; x--) - { - string_table[x + 1] = string_table[x]; - string_table[x + 1]->num = x + 1; - } - - string_table[i] = tmalloc (struct string_entry); - string_table[i]->s = xstrdup (str); - string_table[i]->num = i; - strtablen++; - - return string_table[i]; -} - -static struct bittree * -make_bittree_entry (void) -{ - struct bittree *res = tmalloc (struct bittree); - - res->disent = NULL; - res->bits[0] = NULL; - res->bits[1] = NULL; - res->bits[2] = NULL; - res->skip_flag = 0; - res->bits_to_skip = 0; - return res; -} - - -static struct disent * -add_dis_table_ent (which, insn, order, completer_index) - struct disent *which; - int insn; - int order; - int completer_index; -{ - int ci = 0; - struct disent *ent; - - if (which != NULL) - { - ent = which; - - ent->nextcnt++; - while (ent->nexte != NULL) - ent = ent->nexte; - - ent = (ent->nexte = tmalloc (struct disent)); - } - else - { - ent = tmalloc (struct disent); - ent->next_ent = disinsntable; - disinsntable = ent; - which = ent; - } - ent->nextcnt = 0; - ent->nexte = NULL; - ent->insn = insn; - ent->priority = order; - - while (completer_index != 1) - { - ci = (ci << 1) | (completer_index & 1); - completer_index >>= 1; - } - ent->completer_index = ci; - return which; -} - -static void -finish_distable () -{ - struct disent *ent = disinsntable; - struct disent *prev = ent; - - ent->ournum = 32768; - while ((ent = ent->next_ent) != NULL) - { - ent->ournum = prev->ournum + prev->nextcnt + 1; - prev = ent; - } -} - -static void -insert_bit_table_ent (curr_ent, bit, opcode, mask, - opcodenum, order, completer_index) - struct bittree *curr_ent; - int bit; - ia64_insn opcode; - ia64_insn mask; - int opcodenum; - int order; - int completer_index; -{ - ia64_insn m; - int b; - struct bittree *next; - - if (bit == -1) - { - struct disent *nent = add_dis_table_ent (curr_ent->disent, - opcodenum, order, - completer_index); - curr_ent->disent = nent; - return; - } - - m = ((ia64_insn) 1) << bit; - - if (mask & m) - b = (opcode & m) ? 1 : 0; - else - b = 2; - - next = curr_ent->bits[b]; - if (next == NULL) - { - next = make_bittree_entry (); - curr_ent->bits[b] = next; - } - insert_bit_table_ent (next, bit - 1, opcode, mask, opcodenum, order, - completer_index); -} - -static void -add_dis_entry (first, opcode, mask, opcodenum, ent, completer_index) - struct bittree *first; - ia64_insn opcode; - ia64_insn mask; - int opcodenum; - struct completer_entry *ent; - int completer_index; -{ - if (completer_index & (1 << 20)) - abort (); - - while (ent != NULL) - { - ia64_insn newopcode = (opcode & (~ ent->mask)) | ent->bits; - add_dis_entry (first, newopcode, mask, opcodenum, ent->addl_entries, - (completer_index << 1) | 1); - - if (ent->is_terminal) - { - insert_bit_table_ent (bittree, 40, newopcode, mask, - opcodenum, opcode_count - ent->order - 1, - (completer_index << 1) | 1); - } - completer_index <<= 1; - ent = ent->alternative; - } -} - -/* This optimization pass combines multiple "don't care" nodes. */ -static void -compact_distree (ent) - struct bittree *ent; -{ -#define IS_SKIP(ent) \ - ((ent->bits[2] !=NULL) \ - && (ent->bits[0] == NULL && ent->bits[1] == NULL && ent->skip_flag == 0)) - - int bitcnt = 0; - struct bittree *nent = ent; - int x; - - while (IS_SKIP (nent)) - { - bitcnt++; - nent = nent->bits[2]; - } - - if (bitcnt) - { - struct bittree *next = ent->bits[2]; - - ent->bits[0] = nent->bits[0]; - ent->bits[1] = nent->bits[1]; - ent->bits[2] = nent->bits[2]; - ent->disent = nent->disent; - ent->skip_flag = 1; - ent->bits_to_skip = bitcnt; - while (next != nent) - { - struct bittree *b = next; - next = next->bits[2]; - free (b); - } - free (nent); - } - - for (x = 0; x < 3; x++) - { - struct bittree *i = ent->bits[x]; - - if (i != NULL) - compact_distree (i); - } -} - -static unsigned char *insn_list; -static int insn_list_len = 0; -static int tot_insn_list_len = 0; - -/* Generate the disassembler state machine corresponding to the tree - in ENT. */ -static void -gen_dis_table (ent) - struct bittree *ent; -{ - int x; - int our_offset = insn_list_len; - int bitsused = 5; - int totbits = bitsused; - int needed_bytes; - int zero_count = 0; - int zero_dest = 0; /* Initialize this with 0 to keep gcc quiet... */ - - /* If this is a terminal entry, there's no point in skipping any - bits. */ - if (ent->skip_flag && ent->bits[0] == NULL && ent->bits[1] == NULL && - ent->bits[2] == NULL) - { - if (ent->disent == NULL) - abort (); - else - ent->skip_flag = 0; - } - - /* Calculate the amount of space needed for this entry, or at least - a conservatively large approximation. */ - if (ent->skip_flag) - totbits += 5; - - for (x = 1; x < 3; x++) - if (ent->bits[x] != NULL) - totbits += 16; - - if (ent->disent != NULL) - { - if (ent->bits[2] != NULL) - abort (); - - totbits += 16; - } - - /* Now allocate the space. */ - needed_bytes = (totbits + 7) / 8; - if ((needed_bytes + insn_list_len) > tot_insn_list_len) - { - tot_insn_list_len += 256; - insn_list = (unsigned char *) xrealloc (insn_list, tot_insn_list_len); - } - our_offset = insn_list_len; - insn_list_len += needed_bytes; - memset (insn_list + our_offset, 0, needed_bytes); - - /* Encode the skip entry by setting bit 6 set in the state op field, - and store the # of bits to skip immediately after. */ - if (ent->skip_flag) - { - bitsused += 5; - insn_list[our_offset + 0] |= 0x40 | ((ent->bits_to_skip >> 2) & 0xf); - insn_list[our_offset + 1] |= ((ent->bits_to_skip & 3) << 6); - } - -#define IS_ONLY_IFZERO(ENT) \ - ((ENT)->bits[0] != NULL && (ENT)->bits[1] == NULL && (ENT)->bits[2] == NULL \ - && (ENT)->disent == NULL && (ENT)->skip_flag == 0) - - /* Store an "if (bit is zero)" instruction by setting bit 7 in the - state op field. */ - if (ent->bits[0] != NULL) - { - struct bittree *nent = ent->bits[0]; - zero_count = 0; - - insn_list[our_offset] |= 0x80; - - /* We can encode sequences of multiple "if (bit is zero)" tests - by storing the # of zero bits to check in the lower 3 bits of - the instruction. However, this only applies if the state - solely tests for a zero bit. */ - - if (IS_ONLY_IFZERO (ent)) - { - while (IS_ONLY_IFZERO (nent) && zero_count < 7) - { - nent = nent->bits[0]; - zero_count++; - } - - insn_list[our_offset + 0] |= zero_count; - } - zero_dest = insn_list_len; - gen_dis_table (nent); - } - - /* Now store the remaining tests. We also handle a sole "termination - entry" by storing it as an "any bit" test. */ - - for (x = 1; x < 3; x++) - { - if (ent->bits[x] != NULL || (x == 2 && ent->disent != NULL)) - { - struct bittree *i = ent->bits[x]; - int idest; - int currbits = 15; - - if (i != NULL) - { - /* If the instruction being branched to only consists of - a termination entry, use the termination entry as the - place to branch to instead. */ - if (i->bits[0] == NULL && i->bits[1] == NULL - && i->bits[2] == NULL && i->disent != NULL) - { - idest = i->disent->ournum; - i = NULL; - } - else - idest = insn_list_len - our_offset; - } - else - idest = ent->disent->ournum; - - /* If the destination offset for the if (bit is 1) test is less - than 256 bytes away, we can store it as 8-bits instead of 16; - the instruction has bit 5 set for the 16-bit address, and bit - 4 for the 8-bit address. Since we've already allocated 16 - bits for the address we need to deallocate the space. - - Note that branchings within the table are relative, and - there are no branches that branch past our instruction yet - so we do not need to adjust any other offsets. */ - if (x == 1) - { - if (idest <= 256) - { - int start = our_offset + bitsused / 8 + 1; - - memmove (insn_list + start, - insn_list + start + 1, - insn_list_len - (start + 1)); - currbits = 7; - totbits -= 8; - needed_bytes--; - insn_list_len--; - insn_list[our_offset] |= 0x10; - idest--; - } - else - insn_list[our_offset] |= 0x20; - } - else - { - /* An instruction which solely consists of a termination - marker and whose disassembly name index is < 4096 - can be stored in 16 bits. The encoding is slightly - odd; the upper 4 bits of the instruction are 0x3, and - bit 3 loses its normal meaning. */ - - if (ent->bits[0] == NULL && ent->bits[1] == NULL - && ent->bits[2] == NULL && ent->skip_flag == 0 - && ent->disent != NULL - && ent->disent->ournum < (32768 + 4096)) - { - int start = our_offset + bitsused / 8 + 1; - - memmove (insn_list + start, - insn_list + start + 1, - insn_list_len - (start + 1)); - currbits = 11; - totbits -= 5; - bitsused--; - needed_bytes--; - insn_list_len--; - insn_list[our_offset] |= 0x30; - idest &= ~32768; - } - else - insn_list[our_offset] |= 0x08; - } - - if (debug) - { - int id = idest; - - if (i == NULL) - id |= 32768; - else if (! (id & 32768)) - id += our_offset; - - if (x == 1) - printf ("%d: if (1) goto %d\n", our_offset, id); - else - printf ("%d: try %d\n", our_offset, id); - } - - /* Store the address of the entry being branched to. */ - while (currbits >= 0) - { - unsigned char *byte = insn_list + our_offset + bitsused / 8; - - if (idest & (1 << currbits)) - *byte |= (1 << (7 - (bitsused % 8))); - - bitsused++; - currbits--; - } - - /* Now generate the states for the entry being branched to. */ - if (i != NULL) - gen_dis_table (i); - } - } - - if (debug) - { - if (ent->skip_flag) - printf ("%d: skipping %d\n", our_offset, ent->bits_to_skip); - - if (ent->bits[0] != NULL) - printf ("%d: if (0:%d) goto %d\n", our_offset, zero_count + 1, - zero_dest); - } - - if (bitsused != totbits) - abort (); -} - -static void -print_dis_table (void) -{ - int x; - struct disent *cent = disinsntable; - - printf ("static const char dis_table[] = {\n"); - for (x = 0; x < insn_list_len; x++) - { - if ((x > 0) && ((x % 12) == 0)) - printf ("\n"); - - printf ("0x%02x, ", insn_list[x]); - } - printf ("\n};\n\n"); - - printf ("static const struct ia64_dis_names ia64_dis_names[] = {\n"); - while (cent != NULL) - { - struct disent *ent = cent; - - while (ent != NULL) - { - printf ("{ 0x%x, %d, %d, %d },\n", ent->completer_index, - ent->insn, (ent->nexte != NULL ? 1 : 0), - ent->priority); - ent = ent->nexte; - } - cent = cent->next_ent; - } - printf ("};\n\n"); -} - -static void -generate_disassembler (void) -{ - int i; - - bittree = make_bittree_entry (); - - for (i = 0; i < otlen; i++) - { - struct main_entry *ptr = ordered_table[i]; - - if (ptr->opcode->type != IA64_TYPE_DYN) - add_dis_entry (bittree, - ptr->opcode->opcode, ptr->opcode->mask, - ptr->main_index, - ptr->completers, 1); - } - - compact_distree (bittree); - finish_distable (); - gen_dis_table (bittree); - - print_dis_table (); -} - -static void -print_string_table (void) -{ - int x; - char lbuf[80], buf[80]; - int blen = 0; - - printf ("static const char * const ia64_strings[] = {\n"); - lbuf[0] = '\0'; - - for (x = 0; x < strtablen; x++) - { - int len; - - if (strlen (string_table[x]->s) > 75) - abort (); - - sprintf (buf, " \"%s\",", string_table[x]->s); - len = strlen (buf); - - if ((blen + len) > 75) - { - printf (" %s\n", lbuf); - lbuf[0] = '\0'; - blen = 0; - } - strcat (lbuf, buf); - blen += len; - } - - if (blen > 0) - printf (" %s\n", lbuf); - - printf ("};\n\n"); -} - -static struct completer_entry **glist; -static int glistlen = 0; -static int glisttotlen = 0; - -/* If the completer trees ENT1 and ENT2 are equal, return 1. */ - -static int -completer_entries_eq (ent1, ent2) - struct completer_entry *ent1, *ent2; -{ - while (ent1 != NULL && ent2 != NULL) - { - if (ent1->name->num != ent2->name->num - || ent1->bits != ent2->bits - || ent1->mask != ent2->mask - || ent1->is_terminal != ent2->is_terminal - || ent1->dependencies != ent2->dependencies - || ent1->order != ent2->order) - return 0; - - if (! completer_entries_eq (ent1->addl_entries, ent2->addl_entries)) - return 0; - - ent1 = ent1->alternative; - ent2 = ent2->alternative; - } - - return ent1 == ent2; -} - -/* Insert ENT into the global list of completers and return it. If an - equivalent entry (according to completer_entries_eq) already exists, - it is returned instead. */ -static struct completer_entry * -insert_gclist (struct completer_entry *ent) -{ - if (ent != NULL) - { - int i; - int x; - int start = 0, end; - - ent->addl_entries = insert_gclist (ent->addl_entries); - ent->alternative = insert_gclist (ent->alternative); - - i = glistlen / 2; - end = glistlen; - - if (glisttotlen == glistlen) - { - glisttotlen += 20; - glist = (struct completer_entry **) - xrealloc (glist, sizeof (struct completer_entry *) * glisttotlen); - } - - if (glistlen == 0) - { - glist[0] = ent; - glistlen = 1; - return ent; - } - - if (ent->name->num < glist[0]->name->num) - i = 0; - else if (ent->name->num > glist[end - 1]->name->num) - i = end; - else - { - int c; - - while (1) - { - i = (start + end) / 2; - c = ent->name->num - glist[i]->name->num; - - if (c < 0) - end = i - 1; - else if (c == 0) - { - while (i > 0 - && ent->name->num == glist[i - 1]->name->num) - i--; - - break; - } - else - start = i + 1; - - if (start > end) - break; - } - - if (c == 0) - { - while (i < glistlen) - { - if (ent->name->num != glist[i]->name->num) - break; - - if (completer_entries_eq (ent, glist[i])) - return glist[i]; - - i++; - } - } - } - - for (; i > 0 && i < glistlen; i--) - if (ent->name->num >= glist[i - 1]->name->num) - break; - - for (; i < glistlen; i++) - if (ent->name->num < glist[i]->name->num) - break; - - for (x = glistlen - 1; x >= i; x--) - glist[x + 1] = glist[x]; - - glist[i] = ent; - glistlen++; - } - return ent; -} - -static int -get_prefix_len (name) - const char *name; -{ - char *c; - - if (name[0] == '\0') - return 0; - - c = strchr (name, '.'); - if (c != NULL) - return c - name; - else - return strlen (name); -} - -static void -compute_completer_bits (ment, ent) - struct main_entry *ment; - struct completer_entry *ent; -{ - while (ent != NULL) - { - compute_completer_bits (ment, ent->addl_entries); - - if (ent->is_terminal) - { - ia64_insn mask = 0; - ia64_insn our_bits = ent->bits; - struct completer_entry *p = ent->parent; - ia64_insn p_bits; - int x; - - while (p != NULL && ! p->is_terminal) - p = p->parent; - - if (p != NULL) - p_bits = p->bits; - else - p_bits = ment->opcode->opcode; - - for (x = 0; x < 64; x++) - { - ia64_insn m = ((ia64_insn) 1) << x; - - if ((p_bits & m) != (our_bits & m)) - mask |= m; - else - our_bits &= ~m; - } - ent->bits = our_bits; - ent->mask = mask; - } - else - { - ent->bits = 0; - ent->mask = 0; - } - - ent = ent->alternative; - } -} - -/* Find identical completer trees that are used in different - instructions and collapse their entries. */ -static void -collapse_redundant_completers (void) -{ - struct main_entry *ptr; - int x; - - for (ptr = maintable; ptr != NULL; ptr = ptr->next) - { - if (ptr->completers == NULL) - abort (); - - compute_completer_bits (ptr, ptr->completers); - ptr->completers = insert_gclist (ptr->completers); - } - - /* The table has been finalized, now number the indexes. */ - for (x = 0; x < glistlen; x++) - glist[x]->num = x; -} - - -/* Attach two lists of dependencies to each opcode. - 1) all resources which, when already marked in use, conflict with this - opcode (chks) - 2) all resources which must be marked in use when this opcode is used - (regs). */ -static int -insert_opcode_dependencies (opc, cmp) - struct ia64_opcode *opc; - struct completer_entry *cmp ATTRIBUTE_UNUSED; -{ - /* Note all resources which point to this opcode. rfi has the most chks - (79) and cmpxchng has the most regs (54) so 100 here should be enough. */ - int i; - int nregs = 0; - unsigned short regs[256]; - int nchks = 0; - unsigned short chks[256]; - /* Flag insns for which no class matched; there should be none. */ - int no_class_found = 1; - - for (i = 0; i < rdepslen; i++) - { - struct rdep *rs = rdeps[i]; - int j; - - if (strcmp (opc->name, "cmp.eq.and") == 0 - && strncmp (rs->name, "PR%", 3) == 0 - && rs->mode == 1) - no_class_found = 99; - - for (j=0; j < rs->nregs;j++) - { - int ic_note = 0; - - if (in_iclass (opc, ics[rs->regs[j]], NULL, NULL, &ic_note)) - { - /* We can ignore ic_note 11 for non PR resources. */ - if (ic_note == 11 && strncmp (rs->name, "PR", 2) != 0) - ic_note = 0; - - if (ic_note != 0 && rs->regnotes[j] != 0 - && ic_note != rs->regnotes[j] - && !(ic_note == 11 && rs->regnotes[j] == 1)) - warn (_("IC note %d in opcode %s (IC:%s) conflicts with resource %s note %d\n"), - ic_note, opc->name, ics[rs->regs[j]]->name, - rs->name, rs->regnotes[j]); - /* Instruction class notes override resource notes. - So far, only note 11 applies to an IC instead of a resource, - and note 11 implies note 1. */ - if (ic_note) - regs[nregs++] = RDEP(ic_note, i); - else - regs[nregs++] = RDEP(rs->regnotes[j], i); - no_class_found = 0; - ++rs->total_regs; - } - } - - for (j = 0; j < rs->nchks; j++) - { - int ic_note = 0; - - if (in_iclass (opc, ics[rs->chks[j]], NULL, NULL, &ic_note)) - { - /* We can ignore ic_note 11 for non PR resources. */ - if (ic_note == 11 && strncmp (rs->name, "PR", 2) != 0) - ic_note = 0; - - if (ic_note != 0 && rs->chknotes[j] != 0 - && ic_note != rs->chknotes[j] - && !(ic_note == 11 && rs->chknotes[j] == 1)) - warn (_("IC note %d for opcode %s (IC:%s) conflicts with resource %s note %d\n"), - ic_note, opc->name, ics[rs->chks[j]]->name, - rs->name, rs->chknotes[j]); - if (ic_note) - chks[nchks++] = RDEP(ic_note, i); - else - chks[nchks++] = RDEP(rs->chknotes[j], i); - no_class_found = 0; - ++rs->total_chks; - } - } - } - - if (no_class_found) - warn (_("opcode %s has no class (ops %d %d %d)\n"), - opc->name, - opc->operands[0], opc->operands[1], opc->operands[2]); - - return insert_dependencies (nchks, chks, nregs, regs); -} - -static void -insert_completer_entry (opc, tabent, order) - struct ia64_opcode *opc; - struct main_entry *tabent; - int order; -{ - struct completer_entry **ptr = &tabent->completers; - struct completer_entry *parent = NULL; - char pcopy[129], *prefix; - int at_end = 0; - - if (strlen (opc->name) > 128) - abort (); - - strcpy (pcopy, opc->name); - prefix = pcopy + get_prefix_len (pcopy); - - if (prefix[0] != '\0') - prefix++; - - while (! at_end) - { - int need_new_ent = 1; - int plen = get_prefix_len (prefix); - struct string_entry *sent; - - at_end = (prefix[plen] == '\0'); - prefix[plen] = '\0'; - sent = insert_string (prefix); - - while (*ptr != NULL) - { - int cmpres = sent->num - (*ptr)->name->num; - - if (cmpres == 0) - { - need_new_ent = 0; - break; - } - else - ptr = &((*ptr)->alternative); - } - - if (need_new_ent) - { - struct completer_entry *nent = tmalloc (struct completer_entry); - - nent->name = sent; - nent->parent = parent; - nent->addl_entries = NULL; - nent->alternative = *ptr; - *ptr = nent; - nent->is_terminal = 0; - nent->dependencies = -1; - } - - if (! at_end) - { - parent = *ptr; - ptr = &((*ptr)->addl_entries); - prefix += plen + 1; - } - } - - if ((*ptr)->is_terminal) - abort (); - - (*ptr)->is_terminal = 1; - (*ptr)->mask = (ia64_insn)-1; - (*ptr)->bits = opc->opcode; - (*ptr)->dependencies = insert_opcode_dependencies (opc, *ptr); - (*ptr)->order = order; -} - -static void -print_completer_entry (ent) - struct completer_entry *ent; -{ - int moffset = 0; - ia64_insn mask = ent->mask, bits = ent->bits; - - if (mask != 0) - { - while (! (mask & 1)) - { - moffset++; - mask = mask >> 1; - bits = bits >> 1; - } - - if (bits & 0xffffffff00000000LL) - abort (); - } - - printf (" { 0x%x, 0x%x, %d, %d, %d, %d, %d, %d },\n", - (int)bits, - (int)mask, - ent->name->num, - ent->alternative != NULL ? ent->alternative->num : -1, - ent->addl_entries != NULL ? ent->addl_entries->num : -1, - moffset, - ent->is_terminal ? 1 : 0, - ent->dependencies); -} - -static void -print_completer_table () -{ - int x; - - printf ("static const struct ia64_completer_table\ncompleter_table[] = {\n"); - for (x = 0; x < glistlen; x++) - print_completer_entry (glist[x]); - printf ("};\n\n"); -} - -static int -opcodes_eq (opc1, opc2) - struct ia64_opcode *opc1; - struct ia64_opcode *opc2; -{ - int x; - int plen1, plen2; - - if ((opc1->mask != opc2->mask) || (opc1->type != opc2->type) - || (opc1->num_outputs != opc2->num_outputs) - || (opc1->flags != opc2->flags)) - return 0; - - for (x = 0; x < 5; x++) - if (opc1->operands[x] != opc2->operands[x]) - return 0; - - plen1 = get_prefix_len (opc1->name); - plen2 = get_prefix_len (opc2->name); - - if (plen1 == plen2 && (memcmp (opc1->name, opc2->name, plen1) == 0)) - return 1; - - return 0; -} - -static void -add_opcode_entry (opc) - struct ia64_opcode *opc; -{ - struct main_entry **place; - struct string_entry *name; - char prefix[129]; - int found_it = 0; - - if (strlen (opc->name) > 128) - abort (); - - place = &maintable; - strcpy (prefix, opc->name); - prefix[get_prefix_len (prefix)] = '\0'; - name = insert_string (prefix); - - /* Walk the list of opcode table entries. If it's a new - instruction, allocate and fill in a new entry. Note - the main table is alphabetical by opcode name. */ - - while (*place != NULL) - { - if ((*place)->name->num == name->num - && opcodes_eq ((*place)->opcode, opc)) - { - found_it = 1; - break; - } - if ((*place)->name->num > name->num) - break; - - place = &((*place)->next); - } - if (! found_it) - { - struct main_entry *nent = tmalloc (struct main_entry); - - nent->name = name; - nent->opcode = opc; - nent->next = *place; - nent->completers = 0; - *place = nent; - - if (otlen == ottotlen) - { - ottotlen += 20; - ordered_table = (struct main_entry **) - xrealloc (ordered_table, sizeof (struct main_entry *) * ottotlen); - } - ordered_table[otlen++] = nent; - } - - insert_completer_entry (opc, *place, opcode_count++); -} - -static void -print_main_table (void) -{ - struct main_entry *ptr = maintable; - int index = 0; - - printf ("static const struct ia64_main_table\nmain_table[] = {\n"); - while (ptr != NULL) - { - printf (" { %d, %d, %d, 0x", - ptr->name->num, - ptr->opcode->type, - ptr->opcode->num_outputs); - opcode_fprintf_vma (stdout, ptr->opcode->opcode); - printf ("ull, 0x"); - opcode_fprintf_vma (stdout, ptr->opcode->mask); - printf ("ull, { %d, %d, %d, %d, %d }, 0x%x, %d, },\n", - ptr->opcode->operands[0], - ptr->opcode->operands[1], - ptr->opcode->operands[2], - ptr->opcode->operands[3], - ptr->opcode->operands[4], - ptr->opcode->flags, - ptr->completers->num); - - ptr->main_index = index++; - - ptr = ptr->next; - } - printf ("};\n\n"); -} - -static void -shrink (table) - struct ia64_opcode *table; -{ - int curr_opcode; - - for (curr_opcode = 0; table[curr_opcode].name != NULL; curr_opcode++) - { - add_opcode_entry (table + curr_opcode); - if (table[curr_opcode].num_outputs == 2 - && ((table[curr_opcode].operands[0] == IA64_OPND_P1 - && table[curr_opcode].operands[1] == IA64_OPND_P2) - || (table[curr_opcode].operands[0] == IA64_OPND_P2 - && table[curr_opcode].operands[1] == IA64_OPND_P1))) - { - struct ia64_opcode *alias = tmalloc(struct ia64_opcode); - unsigned i; - - *alias = table[curr_opcode]; - for (i = 2; i < NELEMS (alias->operands); ++i) - alias->operands[i - 1] = alias->operands[i]; - alias->operands[NELEMS (alias->operands) - 1] = IA64_OPND_NIL; - --alias->num_outputs; - alias->flags |= PSEUDO; - add_opcode_entry (alias); - } - } -} - - -/* Program options. */ -#define OPTION_SRCDIR 200 - -struct option long_options[] = -{ - {"srcdir", required_argument, NULL, OPTION_SRCDIR}, - {"debug", no_argument, NULL, 'd'}, - {"version", no_argument, NULL, 'V'}, - {"help", no_argument, NULL, 'h'}, - {0, no_argument, NULL, 0} -}; - -static void -print_version (void) -{ - printf ("%s: version 1.0\n", program_name); - xexit (0); -} - -static void -usage (FILE * stream, int status) -{ - fprintf (stream, "Usage: %s [-V | --version] [-d | --debug] [--srcdir=dirname] [--help]\n", - program_name); - xexit (status); -} - -int -main (int argc, char **argv) -{ - extern int chdir (char *); - char *srcdir = NULL; - int c; - - program_name = *argv; - xmalloc_set_program_name (program_name); - - while ((c = getopt_long (argc, argv, "vVdh", long_options, 0)) != EOF) - switch (c) - { - case OPTION_SRCDIR: - srcdir = optarg; - break; - case 'V': - case 'v': - print_version (); - break; - case 'd': - debug = 1; - break; - case 'h': - case '?': - usage (stderr, 0); - default: - case 0: - break; - } - - if (optind != argc) - usage (stdout, 1); - - if (srcdir != NULL) - if (chdir (srcdir) != 0) - fail (_("unable to change directory to \"%s\", errno = %s\n"), - srcdir, strerror (errno)); - - load_insn_classes (); - load_dependencies (); - - shrink (ia64_opcodes_a); - shrink (ia64_opcodes_b); - shrink (ia64_opcodes_f); - shrink (ia64_opcodes_i); - shrink (ia64_opcodes_m); - shrink (ia64_opcodes_x); - shrink (ia64_opcodes_d); - - collapse_redundant_completers (); - - printf ("/* This file is automatically generated by ia64-gen. Do not edit! */\n"); - print_string_table (); - print_dependency_table (); - print_completer_table (); - print_main_table (); - - generate_disassembler (); - - exit (0); -} diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-opc-a.c xen-4.3.0/tools/debugger/xenitp/ia64-opc-a.c --- xen-4.2.2/tools/debugger/xenitp/ia64-opc-a.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-opc-a.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,419 +0,0 @@ -/* ia64-opc-a.c -- IA-64 `A' opcode table. - Copyright 1998, 1999, 2000, 2001, 2002, 2004 - Free Software Foundation, Inc. - Contributed by David Mosberger-Tang - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#include "ia64-opc.h" - -#define A IA64_TYPE_A, 1 -#define A2 IA64_TYPE_A, 2 - -/* instruction bit fields: */ -#define bC(x) (((ia64_insn) ((x) & 0x1)) << 12) -#define bImm14(x) ((((ia64_insn) (((x) >> 0) & 0x7f)) << 13) | \ - (((ia64_insn) (((x) >> 7) & 0x3f)) << 27) | \ - (((ia64_insn) (((x) >> 13) & 0x01)) << 36)) -#define bR3a(x) (((ia64_insn) ((x) & 0x7f)) << 20) -#define bR3b(x) (((ia64_insn) ((x) & 0x3)) << 20) -#define bTa(x) (((ia64_insn) ((x) & 0x1)) << 33) -#define bTb(x) (((ia64_insn) ((x) & 0x1)) << 36) -#define bVe(x) (((ia64_insn) ((x) & 0x1)) << 33) -#define bX(x) (((ia64_insn) ((x) & 0x1)) << 33) -#define bX2(x) (((ia64_insn) ((x) & 0x3)) << 34) -#define bX2a(x) (((ia64_insn) ((x) & 0x3)) << 34) -#define bX2b(x) (((ia64_insn) ((x) & 0x3)) << 27) -#define bX4(x) (((ia64_insn) ((x) & 0xf)) << 29) -#define bZa(x) (((ia64_insn) ((x) & 0x1)) << 36) -#define bZb(x) (((ia64_insn) ((x) & 0x1)) << 33) - -/* instruction bit masks: */ -#define mC bC (-1) -#define mImm14 bImm14 (-1) -#define mR3a bR3a (-1) -#define mR3b bR3b (-1) -#define mTa bTa (-1) -#define mTb bTb (-1) -#define mVe bVe (-1) -#define mX bX (-1) -#define mX2 bX2 (-1) -#define mX2a bX2a (-1) -#define mX2b bX2b (-1) -#define mX4 bX4 (-1) -#define mZa bZa (-1) -#define mZb bZb (-1) - -#define OpR3b(a,b) (bOp (a) | bR3b (b)), (mOp | mR3b) -#define OpX2aVe(a,b,c) (bOp (a) | bX2a (b) | bVe (c)), \ - (mOp | mX2a | mVe) -#define OpX2aVeR3a(a,b,c,d) (bOp (a) | bX2a (b) | bVe (c) | bR3a (d)), \ - (mOp | mX2a | mVe | mR3a) -#define OpX2aVeImm14(a,b,c,d) (bOp (a) | bX2a (b) | bVe (c) | bImm14 (d)), \ - (mOp | mX2a | mVe | mImm14) -#define OpX2aVeX4(a,b,c,d) (bOp (a) | bX2a (b) | bVe (c) | bX4 (d)), \ - (mOp | mX2a | mVe | mX4) -#define OpX2aVeX4X2b(a,b,c,d,e) \ - (bOp (a) | bX2a (b) | bVe (c) | bX4 (d) | bX2b (e)), \ - (mOp | mX2a | mVe | mX4 | mX2b) -#define OpX2TbTaC(a,b,c,d,e) \ - (bOp (a) | bX2 (b) | bTb (c) | bTa (d) | bC (e)), \ - (mOp | mX2 | mTb | mTa | mC) -#define OpX2TaC(a,b,c,d) (bOp (a) | bX2 (b) | bTa (c) | bC (d)), \ - (mOp | mX2 | mTa | mC) -#define OpX2aZaZbX4(a,b,c,d,e) \ - (bOp (a) | bX2a (b) | bZa (c) | bZb (d) | bX4 (e)), \ - (mOp | mX2a | mZa | mZb | mX4) -#define OpX2aZaZbX4X2b(a,b,c,d,e,f) \ - (bOp (a) | bX2a (b) | bZa (c) | bZb (d) | bX4 (e) | bX2b (f)), \ - (mOp | mX2a | mZa | mZb | mX4 | mX2b) - -/* Used to initialise unused fields in ia64_opcode struct, - in order to stop gcc from complaining. */ -#define EMPTY 0,0,NULL - -struct ia64_opcode ia64_opcodes_a[] = - { - /* A-type instruction encodings (sorted according to major opcode). */ - - {"add", A, OpX2aVeX4X2b (8, 0, 0, 0, 0), {R1, R2, R3}, EMPTY}, - {"add", A, OpX2aVeX4X2b (8, 0, 0, 0, 1), {R1, R2, R3, C1}, EMPTY}, - {"sub", A, OpX2aVeX4X2b (8, 0, 0, 1, 1), {R1, R2, R3}, EMPTY}, - {"sub", A, OpX2aVeX4X2b (8, 0, 0, 1, 0), {R1, R2, R3, C1}, EMPTY}, - {"addp4", A, OpX2aVeX4X2b (8, 0, 0, 2, 0), {R1, R2, R3}, EMPTY}, - {"and", A, OpX2aVeX4X2b (8, 0, 0, 3, 0), {R1, R2, R3}, EMPTY}, - {"andcm", A, OpX2aVeX4X2b (8, 0, 0, 3, 1), {R1, R2, R3}, EMPTY}, - {"or", A, OpX2aVeX4X2b (8, 0, 0, 3, 2), {R1, R2, R3}, EMPTY}, - {"xor", A, OpX2aVeX4X2b (8, 0, 0, 3, 3), {R1, R2, R3}, EMPTY}, - {"shladd", A, OpX2aVeX4 (8, 0, 0, 4), {R1, R2, CNT2a, R3}, EMPTY}, - {"shladdp4", A, OpX2aVeX4 (8, 0, 0, 6), {R1, R2, CNT2a, R3}, EMPTY}, - {"sub", A, OpX2aVeX4X2b (8, 0, 0, 9, 1), {R1, IMM8, R3}, EMPTY}, - {"and", A, OpX2aVeX4X2b (8, 0, 0, 0xb, 0), {R1, IMM8, R3}, EMPTY}, - {"andcm", A, OpX2aVeX4X2b (8, 0, 0, 0xb, 1), {R1, IMM8, R3}, EMPTY}, - {"or", A, OpX2aVeX4X2b (8, 0, 0, 0xb, 2), {R1, IMM8, R3}, EMPTY}, - {"xor", A, OpX2aVeX4X2b (8, 0, 0, 0xb, 3), {R1, IMM8, R3}, EMPTY}, - {"mov", A, OpX2aVeImm14 (8, 2, 0, 0), {R1, R3}, EMPTY}, - /* A mov immediate pseudo for adds was deleted. It failed for immediate - operands requiring relocs, e.g. @pltoff(a). */ - {"adds", A, OpX2aVe (8, 2, 0), {R1, IMM14, R3}, EMPTY}, - {"addp4", A, OpX2aVe (8, 3, 0), {R1, IMM14, R3}, EMPTY}, - {"padd1", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 0, 0), {R1, R2, R3}, EMPTY}, - {"padd2", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 0, 0), {R1, R2, R3}, EMPTY}, - {"padd4", A, OpX2aZaZbX4X2b (8, 1, 1, 0, 0, 0), {R1, R2, R3}, EMPTY}, - {"padd1.sss", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 0, 1), {R1, R2, R3}, EMPTY}, - {"padd2.sss", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 0, 1), {R1, R2, R3}, EMPTY}, - {"padd1.uuu", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 0, 2), {R1, R2, R3}, EMPTY}, - {"padd2.uuu", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 0, 2), {R1, R2, R3}, EMPTY}, - {"padd1.uus", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 0, 3), {R1, R2, R3}, EMPTY}, - {"padd2.uus", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 0, 3), {R1, R2, R3}, EMPTY}, - {"psub1", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 1, 0), {R1, R2, R3}, EMPTY}, - {"psub2", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 1, 0), {R1, R2, R3}, EMPTY}, - {"psub4", A, OpX2aZaZbX4X2b (8, 1, 1, 0, 1, 0), {R1, R2, R3}, EMPTY}, - {"psub1.sss", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 1, 1), {R1, R2, R3}, EMPTY}, - {"psub2.sss", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 1, 1), {R1, R2, R3}, EMPTY}, - {"psub1.uuu", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 1, 2), {R1, R2, R3}, EMPTY}, - {"psub2.uuu", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 1, 2), {R1, R2, R3}, EMPTY}, - {"psub1.uus", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 1, 3), {R1, R2, R3}, EMPTY}, - {"psub2.uus", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 1, 3), {R1, R2, R3}, EMPTY}, - {"pavg1", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 2, 2), {R1, R2, R3}, EMPTY}, - {"pavg2", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 2, 2), {R1, R2, R3}, EMPTY}, - {"pavg1.raz", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 2, 3), {R1, R2, R3}, EMPTY}, - {"pavg2.raz", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 2, 3), {R1, R2, R3}, EMPTY}, - {"pavgsub1", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 3, 2), {R1, R2, R3}, EMPTY}, - {"pavgsub2", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 3, 2), {R1, R2, R3}, EMPTY}, - {"pcmp1.eq", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 9, 0), {R1, R2, R3}, EMPTY}, - {"pcmp2.eq", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 9, 0), {R1, R2, R3}, EMPTY}, - {"pcmp4.eq", A, OpX2aZaZbX4X2b (8, 1, 1, 0, 9, 0), {R1, R2, R3}, EMPTY}, - {"pcmp1.gt", A, OpX2aZaZbX4X2b (8, 1, 0, 0, 9, 1), {R1, R2, R3}, EMPTY}, - {"pcmp2.gt", A, OpX2aZaZbX4X2b (8, 1, 0, 1, 9, 1), {R1, R2, R3}, EMPTY}, - {"pcmp4.gt", A, OpX2aZaZbX4X2b (8, 1, 1, 0, 9, 1), {R1, R2, R3}, EMPTY}, - {"pshladd2", A, OpX2aZaZbX4 (8, 1, 0, 1, 4), {R1, R2, CNT2b, R3}, EMPTY}, - {"pshradd2", A, OpX2aZaZbX4 (8, 1, 0, 1, 6), {R1, R2, CNT2b, R3}, EMPTY}, - - {"mov", A, OpR3b (9, 0), {R1, IMM22}, PSEUDO, 0, NULL}, - {"addl", A, Op (9), {R1, IMM22, R3_2}, EMPTY}, - - {"cmp.lt", A2, OpX2TbTaC (0xc, 0, 0, 0, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp.le", A2, OpX2TbTaC (0xc, 0, 0, 0, 0), {P2, P1, R3, R2}, EMPTY}, - {"cmp.gt", A2, OpX2TbTaC (0xc, 0, 0, 0, 0), {P1, P2, R3, R2}, EMPTY}, - {"cmp.ge", A2, OpX2TbTaC (0xc, 0, 0, 0, 0), {P2, P1, R2, R3}, EMPTY}, - {"cmp.lt.unc", A2, OpX2TbTaC (0xc, 0, 0, 0, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp.le.unc", A2, OpX2TbTaC (0xc, 0, 0, 0, 1), {P2, P1, R3, R2}, EMPTY}, - {"cmp.gt.unc", A2, OpX2TbTaC (0xc, 0, 0, 0, 1), {P1, P2, R3, R2}, EMPTY}, - {"cmp.ge.unc", A2, OpX2TbTaC (0xc, 0, 0, 0, 1), {P2, P1, R2, R3}, EMPTY}, - {"cmp.eq.and", A2, OpX2TbTaC (0xc, 0, 0, 1, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp.ne.andcm", A2, OpX2TbTaC (0xc, 0, 0, 1, 0), {P1, P2, R2, R3}, PSEUDO, 0, NULL}, - {"cmp.ne.and", A2, OpX2TbTaC (0xc, 0, 0, 1, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp.eq.andcm", A2, OpX2TbTaC (0xc, 0, 0, 1, 1), {P1, P2, R2, R3}, PSEUDO, 0, NULL}, - {"cmp4.lt", A2, OpX2TbTaC (0xc, 1, 0, 0, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.le", A2, OpX2TbTaC (0xc, 1, 0, 0, 0), {P2, P1, R3, R2}, EMPTY}, - {"cmp4.gt", A2, OpX2TbTaC (0xc, 1, 0, 0, 0), {P1, P2, R3, R2}, EMPTY}, - {"cmp4.ge", A2, OpX2TbTaC (0xc, 1, 0, 0, 0), {P2, P1, R2, R3}, EMPTY}, - {"cmp4.lt.unc", A2, OpX2TbTaC (0xc, 1, 0, 0, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.le.unc", A2, OpX2TbTaC (0xc, 1, 0, 0, 1), {P2, P1, R3, R2}, EMPTY}, - {"cmp4.gt.unc", A2, OpX2TbTaC (0xc, 1, 0, 0, 1), {P1, P2, R3, R2}, EMPTY}, - {"cmp4.ge.unc", A2, OpX2TbTaC (0xc, 1, 0, 0, 1), {P2, P1, R2, R3}, EMPTY}, - {"cmp4.eq.and", A2, OpX2TbTaC (0xc, 1, 0, 1, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.ne.andcm", A2, OpX2TbTaC (0xc, 1, 0, 1, 0), {P1, P2, R2, R3}, PSEUDO, 0, NULL}, - {"cmp4.ne.and", A2, OpX2TbTaC (0xc, 1, 0, 1, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.eq.andcm", A2, OpX2TbTaC (0xc, 1, 0, 1, 1), {P1, P2, R2, R3}, PSEUDO, 0, NULL}, - {"cmp.gt.and", A2, OpX2TbTaC (0xc, 0, 1, 0, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.lt.and", A2, OpX2TbTaC (0xc, 0, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.le.andcm", A2, OpX2TbTaC (0xc, 0, 1, 0, 0), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.ge.andcm", A2, OpX2TbTaC (0xc, 0, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.le.and", A2, OpX2TbTaC (0xc, 0, 1, 0, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.ge.and", A2, OpX2TbTaC (0xc, 0, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.gt.andcm", A2, OpX2TbTaC (0xc, 0, 1, 0, 1), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.lt.andcm", A2, OpX2TbTaC (0xc, 0, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.ge.and", A2, OpX2TbTaC (0xc, 0, 1, 1, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.le.and", A2, OpX2TbTaC (0xc, 0, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.lt.andcm", A2, OpX2TbTaC (0xc, 0, 1, 1, 0), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.gt.andcm", A2, OpX2TbTaC (0xc, 0, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.lt.and", A2, OpX2TbTaC (0xc, 0, 1, 1, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.gt.and", A2, OpX2TbTaC (0xc, 0, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.ge.andcm", A2, OpX2TbTaC (0xc, 0, 1, 1, 1), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.le.andcm", A2, OpX2TbTaC (0xc, 0, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.gt.and", A2, OpX2TbTaC (0xc, 1, 1, 0, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.lt.and", A2, OpX2TbTaC (0xc, 1, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.le.andcm", A2, OpX2TbTaC (0xc, 1, 1, 0, 0), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.ge.andcm", A2, OpX2TbTaC (0xc, 1, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.le.and", A2, OpX2TbTaC (0xc, 1, 1, 0, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.ge.and", A2, OpX2TbTaC (0xc, 1, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.gt.andcm", A2, OpX2TbTaC (0xc, 1, 1, 0, 1), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.lt.andcm", A2, OpX2TbTaC (0xc, 1, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.ge.and", A2, OpX2TbTaC (0xc, 1, 1, 1, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.le.and", A2, OpX2TbTaC (0xc, 1, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.lt.andcm", A2, OpX2TbTaC (0xc, 1, 1, 1, 0), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.gt.andcm", A2, OpX2TbTaC (0xc, 1, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.lt.and", A2, OpX2TbTaC (0xc, 1, 1, 1, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.gt.and", A2, OpX2TbTaC (0xc, 1, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.ge.andcm", A2, OpX2TbTaC (0xc, 1, 1, 1, 1), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.le.andcm", A2, OpX2TbTaC (0xc, 1, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.lt", A2, OpX2TaC (0xc, 2, 0, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.le", A2, OpX2TaC (0xc, 2, 0, 0), {P1, P2, IMM8M1, R3}, EMPTY}, - {"cmp.gt", A2, OpX2TaC (0xc, 2, 0, 0), {P2, P1, IMM8M1, R3}, EMPTY}, - {"cmp.ge", A2, OpX2TaC (0xc, 2, 0, 0), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp.lt.unc", A2, OpX2TaC (0xc, 2, 0, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.le.unc", A2, OpX2TaC (0xc, 2, 0, 1), {P1, P2, IMM8M1, R3}, EMPTY}, - {"cmp.gt.unc", A2, OpX2TaC (0xc, 2, 0, 1), {P2, P1, IMM8M1, R3}, EMPTY}, - {"cmp.ge.unc", A2, OpX2TaC (0xc, 2, 0, 1), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp.eq.and", A2, OpX2TaC (0xc, 2, 1, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.ne.andcm", A2, OpX2TaC (0xc, 2, 1, 0), {P1, P2, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp.ne.and", A2, OpX2TaC (0xc, 2, 1, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.eq.andcm", A2, OpX2TaC (0xc, 2, 1, 1), {P1, P2, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp4.lt", A2, OpX2TaC (0xc, 3, 0, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.le", A2, OpX2TaC (0xc, 3, 0, 0), {P1, P2, IMM8M1, R3}, EMPTY}, - {"cmp4.gt", A2, OpX2TaC (0xc, 3, 0, 0), {P2, P1, IMM8M1, R3}, EMPTY}, - {"cmp4.ge", A2, OpX2TaC (0xc, 3, 0, 0), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp4.lt.unc", A2, OpX2TaC (0xc, 3, 0, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.le.unc", A2, OpX2TaC (0xc, 3, 0, 1), {P1, P2, IMM8M1, R3}, EMPTY}, - {"cmp4.gt.unc", A2, OpX2TaC (0xc, 3, 0, 1), {P2, P1, IMM8M1, R3}, EMPTY}, - {"cmp4.ge.unc", A2, OpX2TaC (0xc, 3, 0, 1), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp4.eq.and", A2, OpX2TaC (0xc, 3, 1, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.ne.andcm", A2, OpX2TaC (0xc, 3, 1, 0), {P1, P2, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp4.ne.and", A2, OpX2TaC (0xc, 3, 1, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.eq.andcm", A2, OpX2TaC (0xc, 3, 1, 1), {P1, P2, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp.ltu", A2, OpX2TbTaC (0xd, 0, 0, 0, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp.leu", A2, OpX2TbTaC (0xd, 0, 0, 0, 0), {P2, P1, R3, R2}, EMPTY}, - {"cmp.gtu", A2, OpX2TbTaC (0xd, 0, 0, 0, 0), {P1, P2, R3, R2}, EMPTY}, - {"cmp.geu", A2, OpX2TbTaC (0xd, 0, 0, 0, 0), {P2, P1, R2, R3}, EMPTY}, - {"cmp.ltu.unc", A2, OpX2TbTaC (0xd, 0, 0, 0, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp.leu.unc", A2, OpX2TbTaC (0xd, 0, 0, 0, 1), {P2, P1, R3, R2}, EMPTY}, - {"cmp.gtu.unc", A2, OpX2TbTaC (0xd, 0, 0, 0, 1), {P1, P2, R3, R2}, EMPTY}, - {"cmp.geu.unc", A2, OpX2TbTaC (0xd, 0, 0, 0, 1), {P2, P1, R2, R3}, EMPTY}, - {"cmp.eq.or", A2, OpX2TbTaC (0xd, 0, 0, 1, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp.ne.orcm", A2, OpX2TbTaC (0xd, 0, 0, 1, 0), {P1, P2, R2, R3}, PSEUDO, 0, NULL}, - {"cmp.ne.or", A2, OpX2TbTaC (0xd, 0, 0, 1, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp.eq.orcm", A2, OpX2TbTaC (0xd, 0, 0, 1, 1), {P1, P2, R2, R3}, PSEUDO, 0, NULL}, - {"cmp4.ltu", A2, OpX2TbTaC (0xd, 1, 0, 0, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.leu", A2, OpX2TbTaC (0xd, 1, 0, 0, 0), {P2, P1, R3, R2}, EMPTY}, - {"cmp4.gtu", A2, OpX2TbTaC (0xd, 1, 0, 0, 0), {P1, P2, R3, R2}, EMPTY}, - {"cmp4.geu", A2, OpX2TbTaC (0xd, 1, 0, 0, 0), {P2, P1, R2, R3}, EMPTY}, - {"cmp4.ltu.unc", A2, OpX2TbTaC (0xd, 1, 0, 0, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.leu.unc", A2, OpX2TbTaC (0xd, 1, 0, 0, 1), {P2, P1, R3, R2}, EMPTY}, - {"cmp4.gtu.unc", A2, OpX2TbTaC (0xd, 1, 0, 0, 1), {P1, P2, R3, R2}, EMPTY}, - {"cmp4.geu.unc", A2, OpX2TbTaC (0xd, 1, 0, 0, 1), {P2, P1, R2, R3}, EMPTY}, - {"cmp4.eq.or", A2, OpX2TbTaC (0xd, 1, 0, 1, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.ne.orcm", A2, OpX2TbTaC (0xd, 1, 0, 1, 0), {P1, P2, R2, R3}, PSEUDO, 0, NULL}, - {"cmp4.ne.or", A2, OpX2TbTaC (0xd, 1, 0, 1, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.eq.orcm", A2, OpX2TbTaC (0xd, 1, 0, 1, 1), {P1, P2, R2, R3}, PSEUDO, 0, NULL}, - {"cmp.gt.or", A2, OpX2TbTaC (0xd, 0, 1, 0, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.lt.or", A2, OpX2TbTaC (0xd, 0, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.le.orcm", A2, OpX2TbTaC (0xd, 0, 1, 0, 0), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.ge.orcm", A2, OpX2TbTaC (0xd, 0, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.le.or", A2, OpX2TbTaC (0xd, 0, 1, 0, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.ge.or", A2, OpX2TbTaC (0xd, 0, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.gt.orcm", A2, OpX2TbTaC (0xd, 0, 1, 0, 1), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.lt.orcm", A2, OpX2TbTaC (0xd, 0, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.ge.or", A2, OpX2TbTaC (0xd, 0, 1, 1, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.le.or", A2, OpX2TbTaC (0xd, 0, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.lt.orcm", A2, OpX2TbTaC (0xd, 0, 1, 1, 0), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.gt.orcm", A2, OpX2TbTaC (0xd, 0, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.lt.or", A2, OpX2TbTaC (0xd, 0, 1, 1, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.gt.or", A2, OpX2TbTaC (0xd, 0, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.ge.orcm", A2, OpX2TbTaC (0xd, 0, 1, 1, 1), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.le.orcm", A2, OpX2TbTaC (0xd, 0, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.gt.or", A2, OpX2TbTaC (0xd, 1, 1, 0, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.lt.or", A2, OpX2TbTaC (0xd, 1, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.le.orcm", A2, OpX2TbTaC (0xd, 1, 1, 0, 0), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.ge.orcm", A2, OpX2TbTaC (0xd, 1, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.le.or", A2, OpX2TbTaC (0xd, 1, 1, 0, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.ge.or", A2, OpX2TbTaC (0xd, 1, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.gt.orcm", A2, OpX2TbTaC (0xd, 1, 1, 0, 1), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.lt.orcm", A2, OpX2TbTaC (0xd, 1, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.ge.or", A2, OpX2TbTaC (0xd, 1, 1, 1, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.le.or", A2, OpX2TbTaC (0xd, 1, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.lt.orcm", A2, OpX2TbTaC (0xd, 1, 1, 1, 0), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.gt.orcm", A2, OpX2TbTaC (0xd, 1, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.lt.or", A2, OpX2TbTaC (0xd, 1, 1, 1, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.gt.or", A2, OpX2TbTaC (0xd, 1, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.ge.orcm", A2, OpX2TbTaC (0xd, 1, 1, 1, 1), {P1, P2, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.le.orcm", A2, OpX2TbTaC (0xd, 1, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.ltu", A2, OpX2TaC (0xd, 2, 0, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.leu", A2, OpX2TaC (0xd, 2, 0, 0), {P1, P2, IMM8M1U8, R3}, EMPTY}, - {"cmp.gtu", A2, OpX2TaC (0xd, 2, 0, 0), {P2, P1, IMM8M1U8, R3}, EMPTY}, - {"cmp.geu", A2, OpX2TaC (0xd, 2, 0, 0), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp.ltu.unc", A2, OpX2TaC (0xd, 2, 0, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.leu.unc", A2, OpX2TaC (0xd, 2, 0, 1), {P1, P2, IMM8M1U8, R3}, EMPTY}, - {"cmp.gtu.unc", A2, OpX2TaC (0xd, 2, 0, 1), {P2, P1, IMM8M1U8, R3}, EMPTY}, - {"cmp.geu.unc", A2, OpX2TaC (0xd, 2, 0, 1), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp.eq.or", A2, OpX2TaC (0xd, 2, 1, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.ne.orcm", A2, OpX2TaC (0xd, 2, 1, 0), {P1, P2, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp.ne.or", A2, OpX2TaC (0xd, 2, 1, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.eq.orcm", A2, OpX2TaC (0xd, 2, 1, 1), {P1, P2, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp4.ltu", A2, OpX2TaC (0xd, 3, 0, 0), {P1, P2, IMM8U4, R3}, EMPTY}, - {"cmp4.leu", A2, OpX2TaC (0xd, 3, 0, 0), {P1, P2, IMM8M1U4, R3}, EMPTY}, - {"cmp4.gtu", A2, OpX2TaC (0xd, 3, 0, 0), {P2, P1, IMM8M1U4, R3}, EMPTY}, - {"cmp4.geu", A2, OpX2TaC (0xd, 3, 0, 0), {P2, P1, IMM8U4, R3}, EMPTY}, - {"cmp4.ltu.unc", A2, OpX2TaC (0xd, 3, 0, 1), {P1, P2, IMM8U4, R3}, EMPTY}, - {"cmp4.leu.unc", A2, OpX2TaC (0xd, 3, 0, 1), {P1, P2, IMM8M1U4, R3}, EMPTY}, - {"cmp4.gtu.unc", A2, OpX2TaC (0xd, 3, 0, 1), {P2, P1, IMM8M1U4, R3}, EMPTY}, - {"cmp4.geu.unc", A2, OpX2TaC (0xd, 3, 0, 1), {P2, P1, IMM8U4, R3}, EMPTY}, - {"cmp4.eq.or", A2, OpX2TaC (0xd, 3, 1, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.ne.orcm", A2, OpX2TaC (0xd, 3, 1, 0), {P1, P2, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp4.ne.or", A2, OpX2TaC (0xd, 3, 1, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.eq.orcm", A2, OpX2TaC (0xd, 3, 1, 1), {P1, P2, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp.eq", A2, OpX2TbTaC (0xe, 0, 0, 0, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp.ne", A2, OpX2TbTaC (0xe, 0, 0, 0, 0), {P2, P1, R2, R3}, EMPTY}, - {"cmp.eq.unc", A2, OpX2TbTaC (0xe, 0, 0, 0, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp.ne.unc", A2, OpX2TbTaC (0xe, 0, 0, 0, 1), {P2, P1, R2, R3}, EMPTY}, - {"cmp.eq.or.andcm", A2, OpX2TbTaC (0xe, 0, 0, 1, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp.ne.and.orcm", A2, OpX2TbTaC (0xe, 0, 0, 1, 0), {P2, P1, R2, R3}, PSEUDO, 0, NULL}, - {"cmp.ne.or.andcm", A2, OpX2TbTaC (0xe, 0, 0, 1, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp.eq.and.orcm", A2, OpX2TbTaC (0xe, 0, 0, 1, 1), {P2, P1, R2, R3}, PSEUDO, 0, NULL}, - {"cmp4.eq", A2, OpX2TbTaC (0xe, 1, 0, 0, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.ne", A2, OpX2TbTaC (0xe, 1, 0, 0, 0), {P2, P1, R2, R3}, EMPTY}, - {"cmp4.eq.unc", A2, OpX2TbTaC (0xe, 1, 0, 0, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.ne.unc", A2, OpX2TbTaC (0xe, 1, 0, 0, 1), {P2, P1, R2, R3}, EMPTY}, - {"cmp4.eq.or.andcm", A2, OpX2TbTaC (0xe, 1, 0, 1, 0), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.ne.and.orcm", A2, OpX2TbTaC (0xe, 1, 0, 1, 0), {P2, P1, R2, R3}, PSEUDO, 0, NULL}, - {"cmp4.ne.or.andcm", A2, OpX2TbTaC (0xe, 1, 0, 1, 1), {P1, P2, R2, R3}, EMPTY}, - {"cmp4.eq.and.orcm", A2, OpX2TbTaC (0xe, 1, 0, 1, 1), {P2, P1, R2, R3}, PSEUDO, 0, NULL}, - {"cmp.gt.or.andcm", A2, OpX2TbTaC (0xe, 0, 1, 0, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.lt.or.andcm", A2, OpX2TbTaC (0xe, 0, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.le.and.orcm", A2, OpX2TbTaC (0xe, 0, 1, 0, 0), {P2, P1, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.ge.and.orcm", A2, OpX2TbTaC (0xe, 0, 1, 0, 0), {P2, P1, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.le.or.andcm", A2, OpX2TbTaC (0xe, 0, 1, 0, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.ge.or.andcm", A2, OpX2TbTaC (0xe, 0, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.gt.and.orcm", A2, OpX2TbTaC (0xe, 0, 1, 0, 1), {P2, P1, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.lt.and.orcm", A2, OpX2TbTaC (0xe, 0, 1, 0, 1), {P2, P1, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.ge.or.andcm", A2, OpX2TbTaC (0xe, 0, 1, 1, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.le.or.andcm", A2, OpX2TbTaC (0xe, 0, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.lt.and.orcm", A2, OpX2TbTaC (0xe, 0, 1, 1, 0), {P2, P1, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.gt.and.orcm", A2, OpX2TbTaC (0xe, 0, 1, 1, 0), {P2, P1, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.lt.or.andcm", A2, OpX2TbTaC (0xe, 0, 1, 1, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp.gt.or.andcm", A2, OpX2TbTaC (0xe, 0, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.ge.and.orcm", A2, OpX2TbTaC (0xe, 0, 1, 1, 1), {P2, P1, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp.le.and.orcm", A2, OpX2TbTaC (0xe, 0, 1, 1, 1), {P2, P1, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.gt.or.andcm", A2, OpX2TbTaC (0xe, 1, 1, 0, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.lt.or.andcm", A2, OpX2TbTaC (0xe, 1, 1, 0, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.le.and.orcm", A2, OpX2TbTaC (0xe, 1, 1, 0, 0), {P2, P1, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.ge.and.orcm", A2, OpX2TbTaC (0xe, 1, 1, 0, 0), {P2, P1, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.le.or.andcm", A2, OpX2TbTaC (0xe, 1, 1, 0, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.ge.or.andcm", A2, OpX2TbTaC (0xe, 1, 1, 0, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.gt.and.orcm", A2, OpX2TbTaC (0xe, 1, 1, 0, 1), {P2, P1, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.lt.and.orcm", A2, OpX2TbTaC (0xe, 1, 1, 0, 1), {P2, P1, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.ge.or.andcm", A2, OpX2TbTaC (0xe, 1, 1, 1, 0), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.le.or.andcm", A2, OpX2TbTaC (0xe, 1, 1, 1, 0), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.lt.and.orcm", A2, OpX2TbTaC (0xe, 1, 1, 1, 0), {P2, P1, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.gt.and.orcm", A2, OpX2TbTaC (0xe, 1, 1, 1, 0), {P2, P1, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.lt.or.andcm", A2, OpX2TbTaC (0xe, 1, 1, 1, 1), {P1, P2, GR0, R3}, EMPTY}, - {"cmp4.gt.or.andcm", A2, OpX2TbTaC (0xe, 1, 1, 1, 1), {P1, P2, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp4.ge.and.orcm", A2, OpX2TbTaC (0xe, 1, 1, 1, 1), {P2, P1, GR0, R3}, PSEUDO, 0, NULL}, - {"cmp4.le.and.orcm", A2, OpX2TbTaC (0xe, 1, 1, 1, 1), {P2, P1, R3, GR0}, PSEUDO, 0, NULL}, - {"cmp.eq", A2, OpX2TaC (0xe, 2, 0, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.ne", A2, OpX2TaC (0xe, 2, 0, 0), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp.eq.unc", A2, OpX2TaC (0xe, 2, 0, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.ne.unc", A2, OpX2TaC (0xe, 2, 0, 1), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp.eq.or.andcm", A2, OpX2TaC (0xe, 2, 1, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.ne.and.orcm", A2, OpX2TaC (0xe, 2, 1, 0), {P2, P1, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp.ne.or.andcm", A2, OpX2TaC (0xe, 2, 1, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp.eq.and.orcm", A2, OpX2TaC (0xe, 2, 1, 1), {P2, P1, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp4.eq", A2, OpX2TaC (0xe, 3, 0, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.ne", A2, OpX2TaC (0xe, 3, 0, 0), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp4.eq.unc", A2, OpX2TaC (0xe, 3, 0, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.ne.unc", A2, OpX2TaC (0xe, 3, 0, 1), {P2, P1, IMM8, R3}, EMPTY}, - {"cmp4.eq.or.andcm", A2, OpX2TaC (0xe, 3, 1, 0), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.ne.and.orcm", A2, OpX2TaC (0xe, 3, 1, 0), {P2, P1, IMM8, R3}, PSEUDO, 0, NULL}, - {"cmp4.ne.or.andcm", A2, OpX2TaC (0xe, 3, 1, 1), {P1, P2, IMM8, R3}, EMPTY}, - {"cmp4.eq.and.orcm", A2, OpX2TaC (0xe, 3, 1, 1), {P2, P1, IMM8, R3}, PSEUDO, 0, NULL}, - - {NULL, 0, 0, 0, 0, {0}, 0, 0, NULL} - }; - -#undef A -#undef A2 -#undef bC -#undef bImm14 -#undef bR3a -#undef bR3b -#undef bTa -#undef bTb -#undef bVe -#undef bX -#undef bX2 -#undef bX2a -#undef bX2b -#undef bX4 -#undef bZa -#undef bZb -#undef mC -#undef mImm14 -#undef mR3a -#undef mR3b -#undef mTa -#undef mTb -#undef mVe -#undef mX -#undef mX2 -#undef mX2a -#undef mX2b -#undef mX4 -#undef mZa -#undef mZb -#undef OpR3a -#undef OpR3b -#undef OpX2aVe -#undef OpX2aVeImm14 -#undef OpX2aVeX4 -#undef OpX2aVeX4X2b -#undef OpX2TbTaC -#undef OpX2TaC -#undef OpX2aZaZbX4 -#undef OpX2aZaZbX4X2b -#undef EMPTY diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-opc-b.c xen-4.3.0/tools/debugger/xenitp/ia64-opc-b.c --- xen-4.2.2/tools/debugger/xenitp/ia64-opc-b.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-opc-b.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,512 +0,0 @@ -/* ia64-opc-b.c -- IA-64 `B' opcode table. - Copyright 1998, 1999, 2000, 2002, 2005, 2006 - Free Software Foundation, Inc. - Contributed by David Mosberger-Tang - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#include "ia64-opc.h" - -#define B0 IA64_TYPE_B, 0 -#define B IA64_TYPE_B, 1 - -/* instruction bit fields: */ -#define bBtype(x) (((ia64_insn) ((x) & 0x7)) << 6) -#define bD(x) (((ia64_insn) ((x) & 0x1)) << 35) -#define bIh(x) (((ia64_insn) ((x) & 0x1)) << 35) -#define bPa(x) (((ia64_insn) ((x) & 0x1)) << 12) -#define bPr(x) (((ia64_insn) ((x) & 0x3f)) << 0) -#define bWha(x) (((ia64_insn) ((x) & 0x3)) << 33) -#define bWhb(x) (((ia64_insn) ((x) & 0x3)) << 3) -#define bWhc(x) (((ia64_insn) ((x) & 0x7)) << 32) -#define bX6(x) (((ia64_insn) ((x) & 0x3f)) << 27) - -#define mBtype bBtype (-1) -#define mD bD (-1) -#define mIh bIh (-1) -#define mPa bPa (-1) -#define mPr bPr (-1) -#define mWha bWha (-1) -#define mWhb bWhb (-1) -#define mWhc bWhc (-1) -#define mX6 bX6 (-1) - -#define OpX6(a,b) (bOp (a) | bX6 (b)), (mOp | mX6) -#define OpPaWhaD(a,b,c,d) \ - (bOp (a) | bPa (b) | bWha (c) | bD (d)), (mOp | mPa | mWha | mD) -#define OpPaWhcD(a,b,c,d) \ - (bOp (a) | bPa (b) | bWhc (c) | bD (d)), (mOp | mPa | mWhc | mD) -#define OpBtypePaWhaD(a,b,c,d,e) \ - (bOp (a) | bBtype (b) | bPa (c) | bWha (d) | bD (e)), \ - (mOp | mBtype | mPa | mWha | mD) -#define OpBtypePaWhaDPr(a,b,c,d,e,f) \ - (bOp (a) | bBtype (b) | bPa (c) | bWha (d) | bD (e) | bPr (f)), \ - (mOp | mBtype | mPa | mWha | mD | mPr) -#define OpX6BtypePaWhaD(a,b,c,d,e,f) \ - (bOp (a) | bX6 (b) | bBtype (c) | bPa (d) | bWha (e) | bD (f)), \ - (mOp | mX6 | mBtype | mPa | mWha | mD) -#define OpX6BtypePaWhaDPr(a,b,c,d,e,f,g) \ - (bOp (a) | bX6 (b) | bBtype (c) | bPa (d) | bWha (e) | bD (f) | bPr (g)), \ - (mOp | mX6 | mBtype | mPa | mWha | mD | mPr) -#define OpIhWhb(a,b,c) \ - (bOp (a) | bIh (b) | bWhb (c)), \ - (mOp | mIh | mWhb) -#define OpX6IhWhb(a,b,c,d) \ - (bOp (a) | bX6 (b) | bIh (c) | bWhb (d)), \ - (mOp | mX6 | mIh | mWhb) - -/* Used to initialise unused fields in ia64_opcode struct, - in order to stop gcc from complaining. */ -#define EMPTY 0,0,NULL - -struct ia64_opcode ia64_opcodes_b[] = - { - /* B-type instruction encodings (sorted according to major opcode) */ - -#define BR(a,b) \ - B0, OpX6BtypePaWhaDPr (0, 0x20, 0, a, 0, b, 0), {B2}, PSEUDO, 0, NULL - {"br.few", BR (0, 0)}, - {"br", BR (0, 0)}, - {"br.few.clr", BR (0, 1)}, - {"br.clr", BR (0, 1)}, - {"br.many", BR (1, 0)}, - {"br.many.clr", BR (1, 1)}, -#undef BR - -#define BR(a,b,c,d,e) B0, OpX6BtypePaWhaD (0, a, b, c, d, e), {B2}, EMPTY -#define BRP(a,b,c,d,e) B0, OpX6BtypePaWhaD (0, a, b, c, d, e), {B2}, PSEUDO, 0, NULL -#define BRT(a,b,c,d,e,f) B0, OpX6BtypePaWhaD (0, a, b, c, d, e), {B2}, f, 0, NULL - {"br.cond.sptk.few", BR (0x20, 0, 0, 0, 0)}, - {"br.cond.sptk", BRP (0x20, 0, 0, 0, 0)}, - {"br.cond.sptk.few.clr", BR (0x20, 0, 0, 0, 1)}, - {"br.cond.sptk.clr", BRP (0x20, 0, 0, 0, 1)}, - {"br.cond.spnt.few", BR (0x20, 0, 0, 1, 0)}, - {"br.cond.spnt", BRP (0x20, 0, 0, 1, 0)}, - {"br.cond.spnt.few.clr", BR (0x20, 0, 0, 1, 1)}, - {"br.cond.spnt.clr", BRP (0x20, 0, 0, 1, 1)}, - {"br.cond.dptk.few", BR (0x20, 0, 0, 2, 0)}, - {"br.cond.dptk", BRP (0x20, 0, 0, 2, 0)}, - {"br.cond.dptk.few.clr", BR (0x20, 0, 0, 2, 1)}, - {"br.cond.dptk.clr", BRP (0x20, 0, 0, 2, 1)}, - {"br.cond.dpnt.few", BR (0x20, 0, 0, 3, 0)}, - {"br.cond.dpnt", BRP (0x20, 0, 0, 3, 0)}, - {"br.cond.dpnt.few.clr", BR (0x20, 0, 0, 3, 1)}, - {"br.cond.dpnt.clr", BRP (0x20, 0, 0, 3, 1)}, - {"br.cond.sptk.many", BR (0x20, 0, 1, 0, 0)}, - {"br.cond.sptk.many.clr", BR (0x20, 0, 1, 0, 1)}, - {"br.cond.spnt.many", BR (0x20, 0, 1, 1, 0)}, - {"br.cond.spnt.many.clr", BR (0x20, 0, 1, 1, 1)}, - {"br.cond.dptk.many", BR (0x20, 0, 1, 2, 0)}, - {"br.cond.dptk.many.clr", BR (0x20, 0, 1, 2, 1)}, - {"br.cond.dpnt.many", BR (0x20, 0, 1, 3, 0)}, - {"br.cond.dpnt.many.clr", BR (0x20, 0, 1, 3, 1)}, - {"br.sptk.few", BR (0x20, 0, 0, 0, 0)}, - {"br.sptk", BRP (0x20, 0, 0, 0, 0)}, - {"br.sptk.few.clr", BR (0x20, 0, 0, 0, 1)}, - {"br.sptk.clr", BRP (0x20, 0, 0, 0, 1)}, - {"br.spnt.few", BR (0x20, 0, 0, 1, 0)}, - {"br.spnt", BRP (0x20, 0, 0, 1, 0)}, - {"br.spnt.few.clr", BR (0x20, 0, 0, 1, 1)}, - {"br.spnt.clr", BRP (0x20, 0, 0, 1, 1)}, - {"br.dptk.few", BR (0x20, 0, 0, 2, 0)}, - {"br.dptk", BRP (0x20, 0, 0, 2, 0)}, - {"br.dptk.few.clr", BR (0x20, 0, 0, 2, 1)}, - {"br.dptk.clr", BRP (0x20, 0, 0, 2, 1)}, - {"br.dpnt.few", BR (0x20, 0, 0, 3, 0)}, - {"br.dpnt", BRP (0x20, 0, 0, 3, 0)}, - {"br.dpnt.few.clr", BR (0x20, 0, 0, 3, 1)}, - {"br.dpnt.clr", BRP (0x20, 0, 0, 3, 1)}, - {"br.sptk.many", BR (0x20, 0, 1, 0, 0)}, - {"br.sptk.many.clr", BR (0x20, 0, 1, 0, 1)}, - {"br.spnt.many", BR (0x20, 0, 1, 1, 0)}, - {"br.spnt.many.clr", BR (0x20, 0, 1, 1, 1)}, - {"br.dptk.many", BR (0x20, 0, 1, 2, 0)}, - {"br.dptk.many.clr", BR (0x20, 0, 1, 2, 1)}, - {"br.dpnt.many", BR (0x20, 0, 1, 3, 0)}, - {"br.dpnt.many.clr", BR (0x20, 0, 1, 3, 1)}, - {"br.ia.sptk.few", BR (0x20, 1, 0, 0, 0)}, - {"br.ia.sptk", BRP (0x20, 1, 0, 0, 0)}, - {"br.ia.sptk.few.clr", BR (0x20, 1, 0, 0, 1)}, - {"br.ia.sptk.clr", BRP (0x20, 1, 0, 0, 1)}, - {"br.ia.spnt.few", BR (0x20, 1, 0, 1, 0)}, - {"br.ia.spnt", BRP (0x20, 1, 0, 1, 0)}, - {"br.ia.spnt.few.clr", BR (0x20, 1, 0, 1, 1)}, - {"br.ia.spnt.clr", BRP (0x20, 1, 0, 1, 1)}, - {"br.ia.dptk.few", BR (0x20, 1, 0, 2, 0)}, - {"br.ia.dptk", BRP (0x20, 1, 0, 2, 0)}, - {"br.ia.dptk.few.clr", BR (0x20, 1, 0, 2, 1)}, - {"br.ia.dptk.clr", BRP (0x20, 1, 0, 2, 1)}, - {"br.ia.dpnt.few", BR (0x20, 1, 0, 3, 0)}, - {"br.ia.dpnt", BRP (0x20, 1, 0, 3, 0)}, - {"br.ia.dpnt.few.clr", BR (0x20, 1, 0, 3, 1)}, - {"br.ia.dpnt.clr", BRP (0x20, 1, 0, 3, 1)}, - {"br.ia.sptk.many", BR (0x20, 1, 1, 0, 0)}, - {"br.ia.sptk.many.clr", BR (0x20, 1, 1, 0, 1)}, - {"br.ia.spnt.many", BR (0x20, 1, 1, 1, 0)}, - {"br.ia.spnt.many.clr", BR (0x20, 1, 1, 1, 1)}, - {"br.ia.dptk.many", BR (0x20, 1, 1, 2, 0)}, - {"br.ia.dptk.many.clr", BR (0x20, 1, 1, 2, 1)}, - {"br.ia.dpnt.many", BR (0x20, 1, 1, 3, 0)}, - {"br.ia.dpnt.many.clr", BR (0x20, 1, 1, 3, 1)}, - {"br.ret.sptk.few", BRT (0x21, 4, 0, 0, 0, MOD_RRBS)}, - {"br.ret.sptk", BRT (0x21, 4, 0, 0, 0, PSEUDO | MOD_RRBS)}, - {"br.ret.sptk.few.clr", BRT (0x21, 4, 0, 0, 1, MOD_RRBS)}, - {"br.ret.sptk.clr", BRT (0x21, 4, 0, 0, 1, PSEUDO | MOD_RRBS)}, - {"br.ret.spnt.few", BRT (0x21, 4, 0, 1, 0, MOD_RRBS)}, - {"br.ret.spnt", BRT (0x21, 4, 0, 1, 0, PSEUDO | MOD_RRBS)}, - {"br.ret.spnt.few.clr", BRT (0x21, 4, 0, 1, 1, MOD_RRBS)}, - {"br.ret.spnt.clr", BRT (0x21, 4, 0, 1, 1, PSEUDO | MOD_RRBS)}, - {"br.ret.dptk.few", BRT (0x21, 4, 0, 2, 0, MOD_RRBS)}, - {"br.ret.dptk", BRT (0x21, 4, 0, 2, 0, PSEUDO | MOD_RRBS)}, - {"br.ret.dptk.few.clr", BRT (0x21, 4, 0, 2, 1, MOD_RRBS)}, - {"br.ret.dptk.clr", BRT (0x21, 4, 0, 2, 1, PSEUDO | MOD_RRBS)}, - {"br.ret.dpnt.few", BRT (0x21, 4, 0, 3, 0, MOD_RRBS)}, - {"br.ret.dpnt", BRT (0x21, 4, 0, 3, 0, PSEUDO | MOD_RRBS)}, - {"br.ret.dpnt.few.clr", BRT (0x21, 4, 0, 3, 1, MOD_RRBS)}, - {"br.ret.dpnt.clr", BRT (0x21, 4, 0, 3, 1, PSEUDO | MOD_RRBS)}, - {"br.ret.sptk.many", BRT (0x21, 4, 1, 0, 0, MOD_RRBS)}, - {"br.ret.sptk.many.clr", BRT (0x21, 4, 1, 0, 1, MOD_RRBS)}, - {"br.ret.spnt.many", BRT (0x21, 4, 1, 1, 0, MOD_RRBS)}, - {"br.ret.spnt.many.clr", BRT (0x21, 4, 1, 1, 1, MOD_RRBS)}, - {"br.ret.dptk.many", BRT (0x21, 4, 1, 2, 0, MOD_RRBS)}, - {"br.ret.dptk.many.clr", BRT (0x21, 4, 1, 2, 1, MOD_RRBS)}, - {"br.ret.dpnt.many", BRT (0x21, 4, 1, 3, 0, MOD_RRBS)}, - {"br.ret.dpnt.many.clr", BRT (0x21, 4, 1, 3, 1, MOD_RRBS)}, -#undef BR -#undef BRP -#undef BRT - - {"cover", B0, OpX6 (0, 0x02), {0, }, NO_PRED | LAST | MOD_RRBS, 0, NULL}, - {"clrrrb", B0, OpX6 (0, 0x04), {0, }, NO_PRED | LAST | MOD_RRBS, 0, NULL}, - {"clrrrb.pr", B0, OpX6 (0, 0x05), {0, }, NO_PRED | LAST | MOD_RRBS, 0, NULL}, - {"rfi", B0, OpX6 (0, 0x08), {0, }, NO_PRED | LAST | PRIV | MOD_RRBS, 0, NULL}, - {"bsw.0", B0, OpX6 (0, 0x0c), {0, }, NO_PRED | LAST | PRIV, 0, NULL}, - {"bsw.1", B0, OpX6 (0, 0x0d), {0, }, NO_PRED | LAST | PRIV, 0, NULL}, - {"epc", B0, OpX6 (0, 0x10), {0, }, NO_PRED, 0, NULL}, - {"vmsw.0", B0, OpX6 (0, 0x18), {0, }, NO_PRED | PRIV, 0, NULL}, - {"vmsw.1", B0, OpX6 (0, 0x19), {0, }, NO_PRED | PRIV, 0, NULL}, - - {"break.b", B0, OpX6 (0, 0x00), {IMMU21}, EMPTY}, - - {"br.call.sptk.few", B, OpPaWhcD (1, 0, 1, 0), {B1, B2}, EMPTY}, - {"br.call.sptk", B, OpPaWhcD (1, 0, 1, 0), {B1, B2}, PSEUDO, 0, NULL}, - {"br.call.sptk.few.clr", B, OpPaWhcD (1, 0, 1, 1), {B1, B2}, EMPTY}, - {"br.call.sptk.clr", B, OpPaWhcD (1, 0, 1, 1), {B1, B2}, PSEUDO, 0, NULL}, - {"br.call.spnt.few", B, OpPaWhcD (1, 0, 3, 0), {B1, B2}, EMPTY}, - {"br.call.spnt", B, OpPaWhcD (1, 0, 3, 0), {B1, B2}, PSEUDO, 0, NULL}, - {"br.call.spnt.few.clr", B, OpPaWhcD (1, 0, 3, 1), {B1, B2}, EMPTY}, - {"br.call.spnt.clr", B, OpPaWhcD (1, 0, 3, 1), {B1, B2}, PSEUDO, 0, NULL}, - {"br.call.dptk.few", B, OpPaWhcD (1, 0, 5, 0), {B1, B2}, EMPTY}, - {"br.call.dptk", B, OpPaWhcD (1, 0, 5, 0), {B1, B2}, PSEUDO, 0, NULL}, - {"br.call.dptk.few.clr", B, OpPaWhcD (1, 0, 5, 1), {B1, B2}, EMPTY}, - {"br.call.dptk.clr", B, OpPaWhcD (1, 0, 5, 1), {B1, B2}, PSEUDO, 0, NULL}, - {"br.call.dpnt.few", B, OpPaWhcD (1, 0, 7, 0), {B1, B2}, EMPTY}, - {"br.call.dpnt", B, OpPaWhcD (1, 0, 7, 0), {B1, B2}, PSEUDO, 0, NULL}, - {"br.call.dpnt.few.clr", B, OpPaWhcD (1, 0, 7, 1), {B1, B2}, EMPTY}, - {"br.call.dpnt.clr", B, OpPaWhcD (1, 0, 7, 1), {B1, B2}, PSEUDO, 0, NULL}, - {"br.call.sptk.many", B, OpPaWhcD (1, 1, 1, 0), {B1, B2}, EMPTY}, - {"br.call.sptk.many.clr", B, OpPaWhcD (1, 1, 1, 1), {B1, B2}, EMPTY}, - {"br.call.spnt.many", B, OpPaWhcD (1, 1, 3, 0), {B1, B2}, EMPTY}, - {"br.call.spnt.many.clr", B, OpPaWhcD (1, 1, 3, 1), {B1, B2}, EMPTY}, - {"br.call.dptk.many", B, OpPaWhcD (1, 1, 5, 0), {B1, B2}, EMPTY}, - {"br.call.dptk.many.clr", B, OpPaWhcD (1, 1, 5, 1), {B1, B2}, EMPTY}, - {"br.call.dpnt.many", B, OpPaWhcD (1, 1, 7, 0), {B1, B2}, EMPTY}, - {"br.call.dpnt.many.clr", B, OpPaWhcD (1, 1, 7, 1), {B1, B2}, EMPTY}, - -#define BRP(a,b,c) \ - B0, OpX6IhWhb (2, a, b, c), {B2, TAG13}, NO_PRED, 0, NULL - {"brp.sptk", BRP (0x10, 0, 0)}, - {"brp.dptk", BRP (0x10, 0, 2)}, - {"brp.sptk.imp", BRP (0x10, 1, 0)}, - {"brp.dptk.imp", BRP (0x10, 1, 2)}, - {"brp.ret.sptk", BRP (0x11, 0, 0)}, - {"brp.ret.dptk", BRP (0x11, 0, 2)}, - {"brp.ret.sptk.imp", BRP (0x11, 1, 0)}, - {"brp.ret.dptk.imp", BRP (0x11, 1, 2)}, -#undef BRP - - {"nop.b", B0, OpX6 (2, 0x00), {IMMU21}, EMPTY}, - {"hint.b", B0, OpX6 (2, 0x01), {IMMU21}, EMPTY}, - -#define BR(a,b) \ - B0, OpBtypePaWhaDPr (4, 0, a, 0, b, 0), {TGT25c}, PSEUDO, 0, NULL - {"br.few", BR (0, 0)}, - {"br", BR (0, 0)}, - {"br.few.clr", BR (0, 1)}, - {"br.clr", BR (0, 1)}, - {"br.many", BR (1, 0)}, - {"br.many.clr", BR (1, 1)}, -#undef BR - -#define BR(a,b,c) \ - B0, OpBtypePaWhaD (4, 0, a, b, c), {TGT25c}, EMPTY -#define BRP(a,b,c) \ - B0, OpBtypePaWhaD (4, 0, a, b, c), {TGT25c}, PSEUDO, 0, NULL - {"br.cond.sptk.few", BR (0, 0, 0)}, - {"br.cond.sptk", BRP (0, 0, 0)}, - {"br.cond.sptk.few.clr", BR (0, 0, 1)}, - {"br.cond.sptk.clr", BRP (0, 0, 1)}, - {"br.cond.spnt.few", BR (0, 1, 0)}, - {"br.cond.spnt", BRP (0, 1, 0)}, - {"br.cond.spnt.few.clr", BR (0, 1, 1)}, - {"br.cond.spnt.clr", BRP (0, 1, 1)}, - {"br.cond.dptk.few", BR (0, 2, 0)}, - {"br.cond.dptk", BRP (0, 2, 0)}, - {"br.cond.dptk.few.clr", BR (0, 2, 1)}, - {"br.cond.dptk.clr", BRP (0, 2, 1)}, - {"br.cond.dpnt.few", BR (0, 3, 0)}, - {"br.cond.dpnt", BRP (0, 3, 0)}, - {"br.cond.dpnt.few.clr", BR (0, 3, 1)}, - {"br.cond.dpnt.clr", BRP (0, 3, 1)}, - {"br.cond.sptk.many", BR (1, 0, 0)}, - {"br.cond.sptk.many.clr", BR (1, 0, 1)}, - {"br.cond.spnt.many", BR (1, 1, 0)}, - {"br.cond.spnt.many.clr", BR (1, 1, 1)}, - {"br.cond.dptk.many", BR (1, 2, 0)}, - {"br.cond.dptk.many.clr", BR (1, 2, 1)}, - {"br.cond.dpnt.many", BR (1, 3, 0)}, - {"br.cond.dpnt.many.clr", BR (1, 3, 1)}, - {"br.sptk.few", BR (0, 0, 0)}, - {"br.sptk", BRP (0, 0, 0)}, - {"br.sptk.few.clr", BR (0, 0, 1)}, - {"br.sptk.clr", BRP (0, 0, 1)}, - {"br.spnt.few", BR (0, 1, 0)}, - {"br.spnt", BRP (0, 1, 0)}, - {"br.spnt.few.clr", BR (0, 1, 1)}, - {"br.spnt.clr", BRP (0, 1, 1)}, - {"br.dptk.few", BR (0, 2, 0)}, - {"br.dptk", BRP (0, 2, 0)}, - {"br.dptk.few.clr", BR (0, 2, 1)}, - {"br.dptk.clr", BRP (0, 2, 1)}, - {"br.dpnt.few", BR (0, 3, 0)}, - {"br.dpnt", BRP (0, 3, 0)}, - {"br.dpnt.few.clr", BR (0, 3, 1)}, - {"br.dpnt.clr", BRP (0, 3, 1)}, - {"br.sptk.many", BR (1, 0, 0)}, - {"br.sptk.many.clr", BR (1, 0, 1)}, - {"br.spnt.many", BR (1, 1, 0)}, - {"br.spnt.many.clr", BR (1, 1, 1)}, - {"br.dptk.many", BR (1, 2, 0)}, - {"br.dptk.many.clr", BR (1, 2, 1)}, - {"br.dpnt.many", BR (1, 3, 0)}, - {"br.dpnt.many.clr", BR (1, 3, 1)}, -#undef BR -#undef BRP - -#define BR(a,b,c,d, e) \ - B0, OpBtypePaWhaD (4, a, b, c, d), {TGT25c}, SLOT2 | e, 0, NULL - {"br.wexit.sptk.few", BR (2, 0, 0, 0, MOD_RRBS)}, - {"br.wexit.sptk", BR (2, 0, 0, 0, PSEUDO | MOD_RRBS)}, - {"br.wexit.sptk.few.clr", BR (2, 0, 0, 1, MOD_RRBS)}, - {"br.wexit.sptk.clr", BR (2, 0, 0, 1, PSEUDO | MOD_RRBS)}, - {"br.wexit.spnt.few", BR (2, 0, 1, 0, MOD_RRBS)}, - {"br.wexit.spnt", BR (2, 0, 1, 0, PSEUDO | MOD_RRBS)}, - {"br.wexit.spnt.few.clr", BR (2, 0, 1, 1, MOD_RRBS)}, - {"br.wexit.spnt.clr", BR (2, 0, 1, 1, PSEUDO | MOD_RRBS)}, - {"br.wexit.dptk.few", BR (2, 0, 2, 0, MOD_RRBS)}, - {"br.wexit.dptk", BR (2, 0, 2, 0, PSEUDO | MOD_RRBS)}, - {"br.wexit.dptk.few.clr", BR (2, 0, 2, 1, MOD_RRBS)}, - {"br.wexit.dptk.clr", BR (2, 0, 2, 1, PSEUDO | MOD_RRBS)}, - {"br.wexit.dpnt.few", BR (2, 0, 3, 0, MOD_RRBS)}, - {"br.wexit.dpnt", BR (2, 0, 3, 0, PSEUDO | MOD_RRBS)}, - {"br.wexit.dpnt.few.clr", BR (2, 0, 3, 1, MOD_RRBS)}, - {"br.wexit.dpnt.clr", BR (2, 0, 3, 1, PSEUDO | MOD_RRBS)}, - {"br.wexit.sptk.many", BR (2, 1, 0, 0, MOD_RRBS)}, - {"br.wexit.sptk.many.clr", BR (2, 1, 0, 1, MOD_RRBS)}, - {"br.wexit.spnt.many", BR (2, 1, 1, 0, MOD_RRBS)}, - {"br.wexit.spnt.many.clr", BR (2, 1, 1, 1, MOD_RRBS)}, - {"br.wexit.dptk.many", BR (2, 1, 2, 0, MOD_RRBS)}, - {"br.wexit.dptk.many.clr", BR (2, 1, 2, 1, MOD_RRBS)}, - {"br.wexit.dpnt.many", BR (2, 1, 3, 0, MOD_RRBS)}, - {"br.wexit.dpnt.many.clr", BR (2, 1, 3, 1, MOD_RRBS)}, - {"br.wtop.sptk.few", BR (3, 0, 0, 0, MOD_RRBS)}, - {"br.wtop.sptk", BR (3, 0, 0, 0, PSEUDO | MOD_RRBS)}, - {"br.wtop.sptk.few.clr", BR (3, 0, 0, 1, MOD_RRBS)}, - {"br.wtop.sptk.clr", BR (3, 0, 0, 1, PSEUDO | MOD_RRBS)}, - {"br.wtop.spnt.few", BR (3, 0, 1, 0, MOD_RRBS)}, - {"br.wtop.spnt", BR (3, 0, 1, 0, PSEUDO | MOD_RRBS)}, - {"br.wtop.spnt.few.clr", BR (3, 0, 1, 1, MOD_RRBS)}, - {"br.wtop.spnt.clr", BR (3, 0, 1, 1, PSEUDO | MOD_RRBS)}, - {"br.wtop.dptk.few", BR (3, 0, 2, 0, MOD_RRBS)}, - {"br.wtop.dptk", BR (3, 0, 2, 0, PSEUDO | MOD_RRBS)}, - {"br.wtop.dptk.few.clr", BR (3, 0, 2, 1, MOD_RRBS)}, - {"br.wtop.dptk.clr", BR (3, 0, 2, 1, PSEUDO | MOD_RRBS)}, - {"br.wtop.dpnt.few", BR (3, 0, 3, 0, MOD_RRBS)}, - {"br.wtop.dpnt", BR (3, 0, 3, 0, PSEUDO | MOD_RRBS)}, - {"br.wtop.dpnt.few.clr", BR (3, 0, 3, 1, MOD_RRBS)}, - {"br.wtop.dpnt.clr", BR (3, 0, 3, 1, PSEUDO | MOD_RRBS)}, - {"br.wtop.sptk.many", BR (3, 1, 0, 0, MOD_RRBS)}, - {"br.wtop.sptk.many.clr", BR (3, 1, 0, 1, MOD_RRBS)}, - {"br.wtop.spnt.many", BR (3, 1, 1, 0, MOD_RRBS)}, - {"br.wtop.spnt.many.clr", BR (3, 1, 1, 1, MOD_RRBS)}, - {"br.wtop.dptk.many", BR (3, 1, 2, 0, MOD_RRBS)}, - {"br.wtop.dptk.many.clr", BR (3, 1, 2, 1, MOD_RRBS)}, - {"br.wtop.dpnt.many", BR (3, 1, 3, 0, MOD_RRBS)}, - {"br.wtop.dpnt.many.clr", BR (3, 1, 3, 1, MOD_RRBS)}, - -#undef BR -#define BR(a,b,c,d) \ - B0, OpBtypePaWhaD (4, a, b, c, d), {TGT25c}, SLOT2 | NO_PRED, 0, NULL -#define BRT(a,b,c,d,e) \ - B0, OpBtypePaWhaD (4, a, b, c, d), {TGT25c}, SLOT2 | NO_PRED | e, 0, NULL - {"br.cloop.sptk.few", BR (5, 0, 0, 0)}, - {"br.cloop.sptk", BRT (5, 0, 0, 0, PSEUDO)}, - {"br.cloop.sptk.few.clr", BR (5, 0, 0, 1)}, - {"br.cloop.sptk.clr", BRT (5, 0, 0, 1, PSEUDO)}, - {"br.cloop.spnt.few", BR (5, 0, 1, 0)}, - {"br.cloop.spnt", BRT (5, 0, 1, 0, PSEUDO)}, - {"br.cloop.spnt.few.clr", BR (5, 0, 1, 1)}, - {"br.cloop.spnt.clr", BRT (5, 0, 1, 1, PSEUDO)}, - {"br.cloop.dptk.few", BR (5, 0, 2, 0)}, - {"br.cloop.dptk", BRT (5, 0, 2, 0, PSEUDO)}, - {"br.cloop.dptk.few.clr", BR (5, 0, 2, 1)}, - {"br.cloop.dptk.clr", BRT (5, 0, 2, 1, PSEUDO)}, - {"br.cloop.dpnt.few", BR (5, 0, 3, 0)}, - {"br.cloop.dpnt", BRT (5, 0, 3, 0, PSEUDO)}, - {"br.cloop.dpnt.few.clr", BR (5, 0, 3, 1)}, - {"br.cloop.dpnt.clr", BRT (5, 0, 3, 1, PSEUDO)}, - {"br.cloop.sptk.many", BR (5, 1, 0, 0)}, - {"br.cloop.sptk.many.clr", BR (5, 1, 0, 1)}, - {"br.cloop.spnt.many", BR (5, 1, 1, 0)}, - {"br.cloop.spnt.many.clr", BR (5, 1, 1, 1)}, - {"br.cloop.dptk.many", BR (5, 1, 2, 0)}, - {"br.cloop.dptk.many.clr", BR (5, 1, 2, 1)}, - {"br.cloop.dpnt.many", BR (5, 1, 3, 0)}, - {"br.cloop.dpnt.many.clr", BR (5, 1, 3, 1)}, - {"br.cexit.sptk.few", BRT (6, 0, 0, 0, MOD_RRBS)}, - {"br.cexit.sptk", BRT (6, 0, 0, 0, PSEUDO | MOD_RRBS)}, - {"br.cexit.sptk.few.clr", BRT (6, 0, 0, 1, MOD_RRBS)}, - {"br.cexit.sptk.clr", BRT (6, 0, 0, 1, PSEUDO | MOD_RRBS)}, - {"br.cexit.spnt.few", BRT (6, 0, 1, 0, MOD_RRBS)}, - {"br.cexit.spnt", BRT (6, 0, 1, 0, PSEUDO | MOD_RRBS)}, - {"br.cexit.spnt.few.clr", BRT (6, 0, 1, 1, MOD_RRBS)}, - {"br.cexit.spnt.clr", BRT (6, 0, 1, 1, PSEUDO | MOD_RRBS)}, - {"br.cexit.dptk.few", BRT (6, 0, 2, 0, MOD_RRBS)}, - {"br.cexit.dptk", BRT (6, 0, 2, 0, PSEUDO | MOD_RRBS)}, - {"br.cexit.dptk.few.clr", BRT (6, 0, 2, 1, MOD_RRBS)}, - {"br.cexit.dptk.clr", BRT (6, 0, 2, 1, PSEUDO | MOD_RRBS)}, - {"br.cexit.dpnt.few", BRT (6, 0, 3, 0, MOD_RRBS)}, - {"br.cexit.dpnt", BRT (6, 0, 3, 0, PSEUDO | MOD_RRBS)}, - {"br.cexit.dpnt.few.clr", BRT (6, 0, 3, 1, MOD_RRBS)}, - {"br.cexit.dpnt.clr", BRT (6, 0, 3, 1, PSEUDO | MOD_RRBS)}, - {"br.cexit.sptk.many", BRT (6, 1, 0, 0, MOD_RRBS)}, - {"br.cexit.sptk.many.clr", BRT (6, 1, 0, 1, MOD_RRBS)}, - {"br.cexit.spnt.many", BRT (6, 1, 1, 0, MOD_RRBS)}, - {"br.cexit.spnt.many.clr", BRT (6, 1, 1, 1, MOD_RRBS)}, - {"br.cexit.dptk.many", BRT (6, 1, 2, 0, MOD_RRBS)}, - {"br.cexit.dptk.many.clr", BRT (6, 1, 2, 1, MOD_RRBS)}, - {"br.cexit.dpnt.many", BRT (6, 1, 3, 0, MOD_RRBS)}, - {"br.cexit.dpnt.many.clr", BRT (6, 1, 3, 1, MOD_RRBS)}, - {"br.ctop.sptk.few", BRT (7, 0, 0, 0, MOD_RRBS)}, - {"br.ctop.sptk", BRT (7, 0, 0, 0, PSEUDO | MOD_RRBS)}, - {"br.ctop.sptk.few.clr", BRT (7, 0, 0, 1, MOD_RRBS)}, - {"br.ctop.sptk.clr", BRT (7, 0, 0, 1, PSEUDO | MOD_RRBS)}, - {"br.ctop.spnt.few", BRT (7, 0, 1, 0, MOD_RRBS)}, - {"br.ctop.spnt", BRT (7, 0, 1, 0, PSEUDO | MOD_RRBS)}, - {"br.ctop.spnt.few.clr", BRT (7, 0, 1, 1, MOD_RRBS)}, - {"br.ctop.spnt.clr", BRT (7, 0, 1, 1, PSEUDO | MOD_RRBS)}, - {"br.ctop.dptk.few", BRT (7, 0, 2, 0, MOD_RRBS)}, - {"br.ctop.dptk", BRT (7, 0, 2, 0, PSEUDO | MOD_RRBS)}, - {"br.ctop.dptk.few.clr", BRT (7, 0, 2, 1, MOD_RRBS)}, - {"br.ctop.dptk.clr", BRT (7, 0, 2, 1, PSEUDO | MOD_RRBS)}, - {"br.ctop.dpnt.few", BRT (7, 0, 3, 0, MOD_RRBS)}, - {"br.ctop.dpnt", BRT (7, 0, 3, 0, PSEUDO | MOD_RRBS)}, - {"br.ctop.dpnt.few.clr", BRT (7, 0, 3, 1, MOD_RRBS)}, - {"br.ctop.dpnt.clr", BRT (7, 0, 3, 1, PSEUDO | MOD_RRBS)}, - {"br.ctop.sptk.many", BRT (7, 1, 0, 0, MOD_RRBS)}, - {"br.ctop.sptk.many.clr", BRT (7, 1, 0, 1, MOD_RRBS)}, - {"br.ctop.spnt.many", BRT (7, 1, 1, 0, MOD_RRBS)}, - {"br.ctop.spnt.many.clr", BRT (7, 1, 1, 1, MOD_RRBS)}, - {"br.ctop.dptk.many", BRT (7, 1, 2, 0, MOD_RRBS)}, - {"br.ctop.dptk.many.clr", BRT (7, 1, 2, 1, MOD_RRBS)}, - {"br.ctop.dpnt.many", BRT (7, 1, 3, 0, MOD_RRBS)}, - {"br.ctop.dpnt.many.clr", BRT (7, 1, 3, 1, MOD_RRBS)}, -#undef BR -#undef BRT - - {"br.call.sptk.few", B, OpPaWhaD (5, 0, 0, 0), {B1, TGT25c}, EMPTY}, - {"br.call.sptk", B, OpPaWhaD (5, 0, 0, 0), {B1, TGT25c}, PSEUDO, 0, NULL}, - {"br.call.sptk.few.clr", B, OpPaWhaD (5, 0, 0, 1), {B1, TGT25c}, EMPTY}, - {"br.call.sptk.clr", B, OpPaWhaD (5, 0, 0, 1), {B1, TGT25c}, PSEUDO, 0, NULL}, - {"br.call.spnt.few", B, OpPaWhaD (5, 0, 1, 0), {B1, TGT25c}, EMPTY}, - {"br.call.spnt", B, OpPaWhaD (5, 0, 1, 0), {B1, TGT25c}, PSEUDO, 0, NULL}, - {"br.call.spnt.few.clr", B, OpPaWhaD (5, 0, 1, 1), {B1, TGT25c}, EMPTY}, - {"br.call.spnt.clr", B, OpPaWhaD (5, 0, 1, 1), {B1, TGT25c}, PSEUDO, 0, NULL}, - {"br.call.dptk.few", B, OpPaWhaD (5, 0, 2, 0), {B1, TGT25c}, EMPTY}, - {"br.call.dptk", B, OpPaWhaD (5, 0, 2, 0), {B1, TGT25c}, PSEUDO, 0, NULL}, - {"br.call.dptk.few.clr", B, OpPaWhaD (5, 0, 2, 1), {B1, TGT25c}, EMPTY}, - {"br.call.dptk.clr", B, OpPaWhaD (5, 0, 2, 1), {B1, TGT25c}, PSEUDO, 0, NULL}, - {"br.call.dpnt.few", B, OpPaWhaD (5, 0, 3, 0), {B1, TGT25c}, EMPTY}, - {"br.call.dpnt", B, OpPaWhaD (5, 0, 3, 0), {B1, TGT25c}, PSEUDO, 0, NULL}, - {"br.call.dpnt.few.clr", B, OpPaWhaD (5, 0, 3, 1), {B1, TGT25c}, EMPTY}, - {"br.call.dpnt.clr", B, OpPaWhaD (5, 0, 3, 1), {B1, TGT25c}, PSEUDO, 0, NULL}, - {"br.call.sptk.many", B, OpPaWhaD (5, 1, 0, 0), {B1, TGT25c}, EMPTY}, - {"br.call.sptk.many.clr", B, OpPaWhaD (5, 1, 0, 1), {B1, TGT25c}, EMPTY}, - {"br.call.spnt.many", B, OpPaWhaD (5, 1, 1, 0), {B1, TGT25c}, EMPTY}, - {"br.call.spnt.many.clr", B, OpPaWhaD (5, 1, 1, 1), {B1, TGT25c}, EMPTY}, - {"br.call.dptk.many", B, OpPaWhaD (5, 1, 2, 0), {B1, TGT25c}, EMPTY}, - {"br.call.dptk.many.clr", B, OpPaWhaD (5, 1, 2, 1), {B1, TGT25c}, EMPTY}, - {"br.call.dpnt.many", B, OpPaWhaD (5, 1, 3, 0), {B1, TGT25c}, EMPTY}, - {"br.call.dpnt.many.clr", B, OpPaWhaD (5, 1, 3, 1), {B1, TGT25c}, EMPTY}, - - /* Branch predict. */ -#define BRP(a,b) \ - B0, OpIhWhb (7, a, b), {TGT25c, TAG13}, NO_PRED, 0, NULL - {"brp.sptk", BRP (0, 0)}, - {"brp.loop", BRP (0, 1)}, - {"brp.dptk", BRP (0, 2)}, - {"brp.exit", BRP (0, 3)}, - {"brp.sptk.imp", BRP (1, 0)}, - {"brp.loop.imp", BRP (1, 1)}, - {"brp.dptk.imp", BRP (1, 2)}, - {"brp.exit.imp", BRP (1, 3)}, -#undef BRP - - {NULL, 0, 0, 0, 0, {0}, 0, 0, NULL} - }; - -#undef B0 -#undef B -#undef bBtype -#undef bD -#undef bIh -#undef bPa -#undef bPr -#undef bWha -#undef bWhb -#undef bWhc -#undef bX6 -#undef mBtype -#undef mD -#undef mIh -#undef mPa -#undef mPr -#undef mWha -#undef mWhb -#undef mWhc -#undef mX6 -#undef OpX6 -#undef OpPaWhaD -#undef OpPaWhcD -#undef OpBtypePaWhaD -#undef OpBtypePaWhaDPr -#undef OpX6BtypePaWhaD -#undef OpX6BtypePaWhaDPr -#undef OpIhWhb -#undef OpX6IhWhb -#undef EMPTY diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-opc-d.c xen-4.3.0/tools/debugger/xenitp/ia64-opc-d.c --- xen-4.2.2/tools/debugger/xenitp/ia64-opc-d.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-opc-d.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -/* ia64-opc-d.c -- IA-64 `D' opcode table. - Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. - Contributed by David Mosberger-Tang - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -struct ia64_opcode ia64_opcodes_d[] = - { - {"add", IA64_TYPE_DYN, 1, 0, 0, {IA64_OPND_R1, IA64_OPND_IMM22, IA64_OPND_R3_2}, 0, 0, NULL}, - {"add", IA64_TYPE_DYN, 1, 0, 0, {IA64_OPND_R1, IA64_OPND_IMM14, IA64_OPND_R3}, 0, 0, NULL}, - {"break", IA64_TYPE_DYN, 0, 0, 0, {IA64_OPND_IMMU21}, 0, 0, NULL}, - {"chk.s", IA64_TYPE_DYN, 0, 0, 0, {IA64_OPND_R2, IA64_OPND_TGT25b}, 0, 0, NULL}, - {"hint", IA64_TYPE_DYN, 0, 0, 0, {IA64_OPND_IMMU21}, 0, 0, NULL}, - {"mov", IA64_TYPE_DYN, 1, 0, 0, {IA64_OPND_R1, IA64_OPND_AR3}, 0, 0, NULL}, - {"mov", IA64_TYPE_DYN, 1, 0, 0, {IA64_OPND_AR3, IA64_OPND_IMM8}, 0, 0, NULL}, - {"mov", IA64_TYPE_DYN, 1, 0, 0, {IA64_OPND_AR3, IA64_OPND_R2}, 0, 0, NULL}, - {"nop", IA64_TYPE_DYN, 0, 0, 0, {IA64_OPND_IMMU21}, 0, 0, NULL}, - {NULL, 0, 0, 0, 0, {0}, 0, 0, NULL} - }; diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-opc-f.c xen-4.3.0/tools/debugger/xenitp/ia64-opc-f.c --- xen-4.2.2/tools/debugger/xenitp/ia64-opc-f.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-opc-f.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,656 +0,0 @@ -/* ia64-opc-f.c -- IA-64 `F' opcode table. - Copyright 1998, 1999, 2000, 2002 Free Software Foundation, Inc. - Contributed by David Mosberger-Tang - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#include "ia64-opc.h" - -#define f0 IA64_TYPE_F, 0 -#define f IA64_TYPE_F, 1 -#define f2 IA64_TYPE_F, 2 - -#define bF2(x) (((ia64_insn) ((x) & 0x7f)) << 13) -#define bF4(x) (((ia64_insn) ((x) & 0x7f)) << 27) -#define bQ(x) (((ia64_insn) ((x) & 0x1)) << 36) -#define bRa(x) (((ia64_insn) ((x) & 0x1)) << 33) -#define bRb(x) (((ia64_insn) ((x) & 0x1)) << 36) -#define bSf(x) (((ia64_insn) ((x) & 0x3)) << 34) -#define bTa(x) (((ia64_insn) ((x) & 0x1)) << 12) -#define bXa(x) (((ia64_insn) ((x) & 0x1)) << 36) -#define bXb(x) (((ia64_insn) ((x) & 0x1)) << 33) -#define bX2(x) (((ia64_insn) ((x) & 0x3)) << 34) -#define bX6(x) (((ia64_insn) ((x) & 0x3f)) << 27) -#define bY(x) (((ia64_insn) ((x) & 0x1)) << 26) - -#define mF2 bF2 (-1) -#define mF4 bF4 (-1) -#define mQ bQ (-1) -#define mRa bRa (-1) -#define mRb bRb (-1) -#define mSf bSf (-1) -#define mTa bTa (-1) -#define mXa bXa (-1) -#define mXb bXb (-1) -#define mX2 bX2 (-1) -#define mX6 bX6 (-1) -#define mY bY (-1) - -#define OpXa(a,b) (bOp (a) | bXa (b)), (mOp | mXa) -#define OpXaSf(a,b,c) (bOp (a) | bXa (b) | bSf (c)), (mOp | mXa | mSf) -#define OpXaSfF2(a,b,c,d) \ - (bOp (a) | bXa (b) | bSf (c) | bF2 (d)), (mOp | mXa | mSf | mF2) -#define OpXaSfF4(a,b,c,d) \ - (bOp (a) | bXa (b) | bSf (c) | bF4 (d)), (mOp | mXa | mSf | mF4) -#define OpXaSfF2F4(a,b,c,d,e) \ - (bOp (a) | bXa (b) | bSf (c) | bF2 (d) | bF4 (e)), \ - (mOp | mXa | mSf | mF2 | mF4) -#define OpXaX2(a,b,c) (bOp (a) | bXa (b) | bX2 (c)), (mOp | mXa | mX2) -#define OpXaX2F2(a,b,c,d) \ - (bOp (a) | bXa (b) | bX2 (c) | bF2 (d)), (mOp | mXa | mX2 | mF2) -#define OpRaRbTaSf(a,b,c,d,e) \ - (bOp (a) | bRa (b) | bRb (c) | bTa (d) | bSf (e)), \ - (mOp | mRa | mRb | mTa | mSf) -#define OpTa(a,b) (bOp (a) | bTa (b)), (mOp | mTa) -#define OpXbQSf(a,b,c,d) \ - (bOp (a) | bXb (b) | bQ (c) | bSf (d)), (mOp | mXb | mQ | mSf) -#define OpXbX6(a,b,c) \ - (bOp (a) | bXb (b) | bX6 (c)), (mOp | mXb | mX6) -#define OpXbX6Y(a,b,c,d) \ - (bOp (a) | bXb (b) | bX6 (c) | bY (d)), (mOp | mXb | mX6 | mY) -#define OpXbX6F2(a,b,c,d) \ - (bOp (a) | bXb (b) | bX6 (c) | bF2 (d)), (mOp | mXb | mX6 | mF2) -#define OpXbX6Sf(a,b,c,d) \ - (bOp (a) | bXb (b) | bX6 (c) | bSf (d)), (mOp | mXb | mX6 | mSf) - -/* Used to initialise unused fields in ia64_opcode struct, - in order to stop gcc from complaining. */ -#define EMPTY 0,0,NULL - -struct ia64_opcode ia64_opcodes_f[] = - { - /* F-type instruction encodings (sorted according to major opcode). */ - - {"frcpa.s0", f2, OpXbQSf (0, 1, 0, 0), {F1, P2, F2, F3}, EMPTY}, - {"frcpa", f2, OpXbQSf (0, 1, 0, 0), {F1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"frcpa.s1", f2, OpXbQSf (0, 1, 0, 1), {F1, P2, F2, F3}, EMPTY}, - {"frcpa.s2", f2, OpXbQSf (0, 1, 0, 2), {F1, P2, F2, F3}, EMPTY}, - {"frcpa.s3", f2, OpXbQSf (0, 1, 0, 3), {F1, P2, F2, F3}, EMPTY}, - - {"frsqrta.s0", f2, OpXbQSf (0, 1, 1, 0), {F1, P2, F3}, EMPTY}, - {"frsqrta", f2, OpXbQSf (0, 1, 1, 0), {F1, P2, F3}, PSEUDO, 0, NULL}, - {"frsqrta.s1", f2, OpXbQSf (0, 1, 1, 1), {F1, P2, F3}, EMPTY}, - {"frsqrta.s2", f2, OpXbQSf (0, 1, 1, 2), {F1, P2, F3}, EMPTY}, - {"frsqrta.s3", f2, OpXbQSf (0, 1, 1, 3), {F1, P2, F3}, EMPTY}, - - {"fmin.s0", f, OpXbX6Sf (0, 0, 0x14, 0), {F1, F2, F3}, EMPTY}, - {"fmin", f, OpXbX6Sf (0, 0, 0x14, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fmin.s1", f, OpXbX6Sf (0, 0, 0x14, 1), {F1, F2, F3}, EMPTY}, - {"fmin.s2", f, OpXbX6Sf (0, 0, 0x14, 2), {F1, F2, F3}, EMPTY}, - {"fmin.s3", f, OpXbX6Sf (0, 0, 0x14, 3), {F1, F2, F3}, EMPTY}, - {"fmax.s0", f, OpXbX6Sf (0, 0, 0x15, 0), {F1, F2, F3}, EMPTY}, - {"fmax", f, OpXbX6Sf (0, 0, 0x15, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fmax.s1", f, OpXbX6Sf (0, 0, 0x15, 1), {F1, F2, F3}, EMPTY}, - {"fmax.s2", f, OpXbX6Sf (0, 0, 0x15, 2), {F1, F2, F3}, EMPTY}, - {"fmax.s3", f, OpXbX6Sf (0, 0, 0x15, 3), {F1, F2, F3}, EMPTY}, - {"famin.s0", f, OpXbX6Sf (0, 0, 0x16, 0), {F1, F2, F3}, EMPTY}, - {"famin", f, OpXbX6Sf (0, 0, 0x16, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"famin.s1", f, OpXbX6Sf (0, 0, 0x16, 1), {F1, F2, F3}, EMPTY}, - {"famin.s2", f, OpXbX6Sf (0, 0, 0x16, 2), {F1, F2, F3}, EMPTY}, - {"famin.s3", f, OpXbX6Sf (0, 0, 0x16, 3), {F1, F2, F3}, EMPTY}, - {"famax.s0", f, OpXbX6Sf (0, 0, 0x17, 0), {F1, F2, F3}, EMPTY}, - {"famax", f, OpXbX6Sf (0, 0, 0x17, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"famax.s1", f, OpXbX6Sf (0, 0, 0x17, 1), {F1, F2, F3}, EMPTY}, - {"famax.s2", f, OpXbX6Sf (0, 0, 0x17, 2), {F1, F2, F3}, EMPTY}, - {"famax.s3", f, OpXbX6Sf (0, 0, 0x17, 3), {F1, F2, F3}, EMPTY}, - - {"mov", f, OpXbX6 (0, 0, 0x10), {F1, F3}, PSEUDO | F2_EQ_F3, 0, NULL}, - {"fabs", f, OpXbX6F2 (0, 0, 0x10, 0), {F1, F3}, PSEUDO, 0, NULL}, - {"fneg", f, OpXbX6 (0, 0, 0x11), {F1, F3}, PSEUDO | F2_EQ_F3, 0, NULL}, - {"fnegabs", f, OpXbX6F2 (0, 0, 0x11, 0), {F1, F3}, PSEUDO, 0, NULL}, - {"fmerge.s", f, OpXbX6 (0, 0, 0x10), {F1, F2, F3}, EMPTY}, - {"fmerge.ns", f, OpXbX6 (0, 0, 0x11), {F1, F2, F3}, EMPTY}, - - {"fmerge.se", f, OpXbX6 (0, 0, 0x12), {F1, F2, F3}, EMPTY}, - {"fmix.lr", f, OpXbX6 (0, 0, 0x39), {F1, F2, F3}, EMPTY}, - {"fmix.r", f, OpXbX6 (0, 0, 0x3a), {F1, F2, F3}, EMPTY}, - {"fmix.l", f, OpXbX6 (0, 0, 0x3b), {F1, F2, F3}, EMPTY}, - {"fsxt.r", f, OpXbX6 (0, 0, 0x3c), {F1, F2, F3}, EMPTY}, - {"fsxt.l", f, OpXbX6 (0, 0, 0x3d), {F1, F2, F3}, EMPTY}, - {"fpack", f, OpXbX6 (0, 0, 0x28), {F1, F2, F3}, EMPTY}, - {"fswap", f, OpXbX6 (0, 0, 0x34), {F1, F2, F3}, EMPTY}, - {"fswap.nl", f, OpXbX6 (0, 0, 0x35), {F1, F2, F3}, EMPTY}, - {"fswap.nr", f, OpXbX6 (0, 0, 0x36), {F1, F2, F3}, EMPTY}, - {"fand", f, OpXbX6 (0, 0, 0x2c), {F1, F2, F3}, EMPTY}, - {"fandcm", f, OpXbX6 (0, 0, 0x2d), {F1, F2, F3}, EMPTY}, - {"for", f, OpXbX6 (0, 0, 0x2e), {F1, F2, F3}, EMPTY}, - {"fxor", f, OpXbX6 (0, 0, 0x2f), {F1, F2, F3}, EMPTY}, - - {"fcvt.fx.s0", f, OpXbX6Sf (0, 0, 0x18, 0), {F1, F2}, EMPTY}, - {"fcvt.fx", f, OpXbX6Sf (0, 0, 0x18, 0), {F1, F2}, PSEUDO, 0, NULL}, - {"fcvt.fx.s1", f, OpXbX6Sf (0, 0, 0x18, 1), {F1, F2}, EMPTY}, - {"fcvt.fx.s2", f, OpXbX6Sf (0, 0, 0x18, 2), {F1, F2}, EMPTY}, - {"fcvt.fx.s3", f, OpXbX6Sf (0, 0, 0x18, 3), {F1, F2}, EMPTY}, - {"fcvt.fxu.s0", f, OpXbX6Sf (0, 0, 0x19, 0), {F1, F2}, EMPTY}, - {"fcvt.fxu", f, OpXbX6Sf (0, 0, 0x19, 0), {F1, F2}, PSEUDO, 0, NULL}, - {"fcvt.fxu.s1", f, OpXbX6Sf (0, 0, 0x19, 1), {F1, F2}, EMPTY}, - {"fcvt.fxu.s2", f, OpXbX6Sf (0, 0, 0x19, 2), {F1, F2}, EMPTY}, - {"fcvt.fxu.s3", f, OpXbX6Sf (0, 0, 0x19, 3), {F1, F2}, EMPTY}, - {"fcvt.fx.trunc.s0", f, OpXbX6Sf (0, 0, 0x1a, 0), {F1, F2}, EMPTY}, - {"fcvt.fx.trunc", f, OpXbX6Sf (0, 0, 0x1a, 0), {F1, F2}, PSEUDO, 0, NULL}, - {"fcvt.fx.trunc.s1", f, OpXbX6Sf (0, 0, 0x1a, 1), {F1, F2}, EMPTY}, - {"fcvt.fx.trunc.s2", f, OpXbX6Sf (0, 0, 0x1a, 2), {F1, F2}, EMPTY}, - {"fcvt.fx.trunc.s3", f, OpXbX6Sf (0, 0, 0x1a, 3), {F1, F2}, EMPTY}, - {"fcvt.fxu.trunc.s0", f, OpXbX6Sf (0, 0, 0x1b, 0), {F1, F2}, EMPTY}, - {"fcvt.fxu.trunc", f, OpXbX6Sf (0, 0, 0x1b, 0), {F1, F2}, PSEUDO, 0, NULL}, - {"fcvt.fxu.trunc.s1", f, OpXbX6Sf (0, 0, 0x1b, 1), {F1, F2}, EMPTY}, - {"fcvt.fxu.trunc.s2", f, OpXbX6Sf (0, 0, 0x1b, 2), {F1, F2}, EMPTY}, - {"fcvt.fxu.trunc.s3", f, OpXbX6Sf (0, 0, 0x1b, 3), {F1, F2}, EMPTY}, - - {"fcvt.xf", f, OpXbX6 (0, 0, 0x1c), {F1, F2}, EMPTY}, - - {"fsetc.s0", f0, OpXbX6Sf (0, 0, 0x04, 0), {IMMU7a, IMMU7b}, EMPTY}, - {"fsetc", f0, OpXbX6Sf (0, 0, 0x04, 0), {IMMU7a, IMMU7b}, PSEUDO, 0, NULL}, - {"fsetc.s1", f0, OpXbX6Sf (0, 0, 0x04, 1), {IMMU7a, IMMU7b}, EMPTY}, - {"fsetc.s2", f0, OpXbX6Sf (0, 0, 0x04, 2), {IMMU7a, IMMU7b}, EMPTY}, - {"fsetc.s3", f0, OpXbX6Sf (0, 0, 0x04, 3), {IMMU7a, IMMU7b}, EMPTY}, - {"fclrf.s0", f0, OpXbX6Sf (0, 0, 0x05, 0), {}, EMPTY}, - {"fclrf", f0, OpXbX6Sf (0, 0, 0x05, 0), {0}, PSEUDO, 0, NULL}, - {"fclrf.s1", f0, OpXbX6Sf (0, 0, 0x05, 1), {}, EMPTY}, - {"fclrf.s2", f0, OpXbX6Sf (0, 0, 0x05, 2), {}, EMPTY}, - {"fclrf.s3", f0, OpXbX6Sf (0, 0, 0x05, 3), {}, EMPTY}, - {"fchkf.s0", f0, OpXbX6Sf (0, 0, 0x08, 0), {TGT25}, EMPTY}, - {"fchkf", f0, OpXbX6Sf (0, 0, 0x08, 0), {TGT25}, PSEUDO, 0, NULL}, - {"fchkf.s1", f0, OpXbX6Sf (0, 0, 0x08, 1), {TGT25}, EMPTY}, - {"fchkf.s2", f0, OpXbX6Sf (0, 0, 0x08, 2), {TGT25}, EMPTY}, - {"fchkf.s3", f0, OpXbX6Sf (0, 0, 0x08, 3), {TGT25}, EMPTY}, - - {"break.f", f0, OpXbX6 (0, 0, 0x00), {IMMU21}, EMPTY}, - {"nop.f", f0, OpXbX6Y (0, 0, 0x01, 0), {IMMU21}, EMPTY}, - {"hint.f", f0, OpXbX6Y (0, 0, 0x01, 1), {IMMU21}, EMPTY}, - - {"fprcpa.s0", f2, OpXbQSf (1, 1, 0, 0), {F1, P2, F2, F3}, EMPTY}, - {"fprcpa", f2, OpXbQSf (1, 1, 0, 0), {F1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"fprcpa.s1", f2, OpXbQSf (1, 1, 0, 1), {F1, P2, F2, F3}, EMPTY}, - {"fprcpa.s2", f2, OpXbQSf (1, 1, 0, 2), {F1, P2, F2, F3}, EMPTY}, - {"fprcpa.s3", f2, OpXbQSf (1, 1, 0, 3), {F1, P2, F2, F3}, EMPTY}, - - {"fprsqrta.s0", f2, OpXbQSf (1, 1, 1, 0), {F1, P2, F3}, EMPTY}, - {"fprsqrta", f2, OpXbQSf (1, 1, 1, 0), {F1, P2, F3}, PSEUDO, 0, NULL}, - {"fprsqrta.s1", f2, OpXbQSf (1, 1, 1, 1), {F1, P2, F3}, EMPTY}, - {"fprsqrta.s2", f2, OpXbQSf (1, 1, 1, 2), {F1, P2, F3}, EMPTY}, - {"fprsqrta.s3", f2, OpXbQSf (1, 1, 1, 3), {F1, P2, F3}, EMPTY}, - - {"fpmin.s0", f, OpXbX6Sf (1, 0, 0x14, 0), {F1, F2, F3}, EMPTY}, - {"fpmin", f, OpXbX6Sf (1, 0, 0x14, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpmin.s1", f, OpXbX6Sf (1, 0, 0x14, 1), {F1, F2, F3}, EMPTY}, - {"fpmin.s2", f, OpXbX6Sf (1, 0, 0x14, 2), {F1, F2, F3}, EMPTY}, - {"fpmin.s3", f, OpXbX6Sf (1, 0, 0x14, 3), {F1, F2, F3}, EMPTY}, - {"fpmax.s0", f, OpXbX6Sf (1, 0, 0x15, 0), {F1, F2, F3}, EMPTY}, - {"fpmax", f, OpXbX6Sf (1, 0, 0x15, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpmax.s1", f, OpXbX6Sf (1, 0, 0x15, 1), {F1, F2, F3}, EMPTY}, - {"fpmax.s2", f, OpXbX6Sf (1, 0, 0x15, 2), {F1, F2, F3}, EMPTY}, - {"fpmax.s3", f, OpXbX6Sf (1, 0, 0x15, 3), {F1, F2, F3}, EMPTY}, - {"fpamin.s0", f, OpXbX6Sf (1, 0, 0x16, 0), {F1, F2, F3}, EMPTY}, - {"fpamin", f, OpXbX6Sf (1, 0, 0x16, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpamin.s1", f, OpXbX6Sf (1, 0, 0x16, 1), {F1, F2, F3}, EMPTY}, - {"fpamin.s2", f, OpXbX6Sf (1, 0, 0x16, 2), {F1, F2, F3}, EMPTY}, - {"fpamin.s3", f, OpXbX6Sf (1, 0, 0x16, 3), {F1, F2, F3}, EMPTY}, - {"fpamax.s0", f, OpXbX6Sf (1, 0, 0x17, 0), {F1, F2, F3}, EMPTY}, - {"fpamax", f, OpXbX6Sf (1, 0, 0x17, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpamax.s1", f, OpXbX6Sf (1, 0, 0x17, 1), {F1, F2, F3}, EMPTY}, - {"fpamax.s2", f, OpXbX6Sf (1, 0, 0x17, 2), {F1, F2, F3}, EMPTY}, - {"fpamax.s3", f, OpXbX6Sf (1, 0, 0x17, 3), {F1, F2, F3}, EMPTY}, - - {"fpcmp.eq.s0", f, OpXbX6Sf (1, 0, 0x30, 0), {F1, F2, F3}, EMPTY}, - {"fpcmp.eq", f, OpXbX6Sf (1, 0, 0x30, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpcmp.eq.s1", f, OpXbX6Sf (1, 0, 0x30, 1), {F1, F2, F3}, EMPTY}, - {"fpcmp.eq.s2", f, OpXbX6Sf (1, 0, 0x30, 2), {F1, F2, F3}, EMPTY}, - {"fpcmp.eq.s3", f, OpXbX6Sf (1, 0, 0x30, 3), {F1, F2, F3}, EMPTY}, - {"fpcmp.lt.s0", f, OpXbX6Sf (1, 0, 0x31, 0), {F1, F2, F3}, EMPTY}, - {"fpcmp.lt", f, OpXbX6Sf (1, 0, 0x31, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpcmp.lt.s1", f, OpXbX6Sf (1, 0, 0x31, 1), {F1, F2, F3}, EMPTY}, - {"fpcmp.lt.s2", f, OpXbX6Sf (1, 0, 0x31, 2), {F1, F2, F3}, EMPTY}, - {"fpcmp.lt.s3", f, OpXbX6Sf (1, 0, 0x31, 3), {F1, F2, F3}, EMPTY}, - {"fpcmp.le.s0", f, OpXbX6Sf (1, 0, 0x32, 0), {F1, F2, F3}, EMPTY}, - {"fpcmp.le", f, OpXbX6Sf (1, 0, 0x32, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpcmp.le.s1", f, OpXbX6Sf (1, 0, 0x32, 1), {F1, F2, F3}, EMPTY}, - {"fpcmp.le.s2", f, OpXbX6Sf (1, 0, 0x32, 2), {F1, F2, F3}, EMPTY}, - {"fpcmp.le.s3", f, OpXbX6Sf (1, 0, 0x32, 3), {F1, F2, F3}, EMPTY}, - {"fpcmp.gt.s0", f, OpXbX6Sf (1, 0, 0x31, 0), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.gt", f, OpXbX6Sf (1, 0, 0x31, 0), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.gt.s1", f, OpXbX6Sf (1, 0, 0x31, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.gt.s2", f, OpXbX6Sf (1, 0, 0x31, 2), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.gt.s3", f, OpXbX6Sf (1, 0, 0x31, 3), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ge.s0", f, OpXbX6Sf (1, 0, 0x32, 0), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ge", f, OpXbX6Sf (1, 0, 0x32, 0), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ge.s1", f, OpXbX6Sf (1, 0, 0x32, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ge.s2", f, OpXbX6Sf (1, 0, 0x32, 2), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ge.s3", f, OpXbX6Sf (1, 0, 0x32, 3), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.unord.s0", f, OpXbX6Sf (1, 0, 0x33, 0), {F1, F2, F3}, EMPTY}, - {"fpcmp.unord", f, OpXbX6Sf (1, 0, 0x33, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpcmp.unord.s1", f, OpXbX6Sf (1, 0, 0x33, 1), {F1, F2, F3}, EMPTY}, - {"fpcmp.unord.s2", f, OpXbX6Sf (1, 0, 0x33, 2), {F1, F2, F3}, EMPTY}, - {"fpcmp.unord.s3", f, OpXbX6Sf (1, 0, 0x33, 3), {F1, F2, F3}, EMPTY}, - {"fpcmp.neq.s0", f, OpXbX6Sf (1, 0, 0x34, 0), {F1, F2, F3}, EMPTY}, - {"fpcmp.neq", f, OpXbX6Sf (1, 0, 0x34, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpcmp.neq.s1", f, OpXbX6Sf (1, 0, 0x34, 1), {F1, F2, F3}, EMPTY}, - {"fpcmp.neq.s2", f, OpXbX6Sf (1, 0, 0x34, 2), {F1, F2, F3}, EMPTY}, - {"fpcmp.neq.s3", f, OpXbX6Sf (1, 0, 0x34, 3), {F1, F2, F3}, EMPTY}, - {"fpcmp.nlt.s0", f, OpXbX6Sf (1, 0, 0x35, 0), {F1, F2, F3}, EMPTY}, - {"fpcmp.nlt", f, OpXbX6Sf (1, 0, 0x35, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpcmp.nlt.s1", f, OpXbX6Sf (1, 0, 0x35, 1), {F1, F2, F3}, EMPTY}, - {"fpcmp.nlt.s2", f, OpXbX6Sf (1, 0, 0x35, 2), {F1, F2, F3}, EMPTY}, - {"fpcmp.nlt.s3", f, OpXbX6Sf (1, 0, 0x35, 3), {F1, F2, F3}, EMPTY}, - {"fpcmp.nle.s0", f, OpXbX6Sf (1, 0, 0x36, 0), {F1, F2, F3}, EMPTY}, - {"fpcmp.nle", f, OpXbX6Sf (1, 0, 0x36, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpcmp.nle.s1", f, OpXbX6Sf (1, 0, 0x36, 1), {F1, F2, F3}, EMPTY}, - {"fpcmp.nle.s2", f, OpXbX6Sf (1, 0, 0x36, 2), {F1, F2, F3}, EMPTY}, - {"fpcmp.nle.s3", f, OpXbX6Sf (1, 0, 0x36, 3), {F1, F2, F3}, EMPTY}, - {"fpcmp.ngt.s0", f, OpXbX6Sf (1, 0, 0x35, 0), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ngt", f, OpXbX6Sf (1, 0, 0x35, 0), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ngt.s1", f, OpXbX6Sf (1, 0, 0x35, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ngt.s2", f, OpXbX6Sf (1, 0, 0x35, 2), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ngt.s3", f, OpXbX6Sf (1, 0, 0x35, 3), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.nge.s0", f, OpXbX6Sf (1, 0, 0x36, 0), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.nge", f, OpXbX6Sf (1, 0, 0x36, 0), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.nge.s1", f, OpXbX6Sf (1, 0, 0x36, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.nge.s2", f, OpXbX6Sf (1, 0, 0x36, 2), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.nge.s3", f, OpXbX6Sf (1, 0, 0x36, 3), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fpcmp.ord.s0", f, OpXbX6Sf (1, 0, 0x37, 0), {F1, F2, F3}, EMPTY}, - {"fpcmp.ord", f, OpXbX6Sf (1, 0, 0x37, 0), {F1, F2, F3}, PSEUDO, 0, NULL}, - {"fpcmp.ord.s1", f, OpXbX6Sf (1, 0, 0x37, 1), {F1, F2, F3}, EMPTY}, - {"fpcmp.ord.s2", f, OpXbX6Sf (1, 0, 0x37, 2), {F1, F2, F3}, EMPTY}, - {"fpcmp.ord.s3", f, OpXbX6Sf (1, 0, 0x37, 3), {F1, F2, F3}, EMPTY}, - - {"fpabs", f, OpXbX6F2 (1, 0, 0x10, 0), {F1, F3}, PSEUDO, 0, NULL}, - {"fpneg", f, OpXbX6 (1, 0, 0x11), {F1, F3}, PSEUDO | F2_EQ_F3, 0, NULL}, - {"fpnegabs", f, OpXbX6F2 (1, 0, 0x11, 0), {F1, F3}, PSEUDO, 0, NULL}, - {"fpmerge.s", f, OpXbX6 (1, 0, 0x10), {F1, F2, F3}, EMPTY}, - {"fpmerge.ns", f, OpXbX6 (1, 0, 0x11), {F1, F2, F3}, EMPTY}, - {"fpmerge.se", f, OpXbX6 (1, 0, 0x12), {F1, F2, F3}, EMPTY}, - - {"fpcvt.fx.s0", f, OpXbX6Sf (1, 0, 0x18, 0), {F1, F2}, EMPTY}, - {"fpcvt.fx", f, OpXbX6Sf (1, 0, 0x18, 0), {F1, F2}, PSEUDO, 0, NULL}, - {"fpcvt.fx.s1", f, OpXbX6Sf (1, 0, 0x18, 1), {F1, F2}, EMPTY}, - {"fpcvt.fx.s2", f, OpXbX6Sf (1, 0, 0x18, 2), {F1, F2}, EMPTY}, - {"fpcvt.fx.s3", f, OpXbX6Sf (1, 0, 0x18, 3), {F1, F2}, EMPTY}, - {"fpcvt.fxu.s0", f, OpXbX6Sf (1, 0, 0x19, 0), {F1, F2}, EMPTY}, - {"fpcvt.fxu", f, OpXbX6Sf (1, 0, 0x19, 0), {F1, F2}, PSEUDO, 0, NULL}, - {"fpcvt.fxu.s1", f, OpXbX6Sf (1, 0, 0x19, 1), {F1, F2}, EMPTY}, - {"fpcvt.fxu.s2", f, OpXbX6Sf (1, 0, 0x19, 2), {F1, F2}, EMPTY}, - {"fpcvt.fxu.s3", f, OpXbX6Sf (1, 0, 0x19, 3), {F1, F2}, EMPTY}, - {"fpcvt.fx.trunc.s0", f, OpXbX6Sf (1, 0, 0x1a, 0), {F1, F2}, EMPTY}, - {"fpcvt.fx.trunc", f, OpXbX6Sf (1, 0, 0x1a, 0), {F1, F2}, PSEUDO, 0, NULL}, - {"fpcvt.fx.trunc.s1", f, OpXbX6Sf (1, 0, 0x1a, 1), {F1, F2}, EMPTY}, - {"fpcvt.fx.trunc.s2", f, OpXbX6Sf (1, 0, 0x1a, 2), {F1, F2}, EMPTY}, - {"fpcvt.fx.trunc.s3", f, OpXbX6Sf (1, 0, 0x1a, 3), {F1, F2}, EMPTY}, - {"fpcvt.fxu.trunc.s0", f, OpXbX6Sf (1, 0, 0x1b, 0), {F1, F2}, EMPTY}, - {"fpcvt.fxu.trunc", f, OpXbX6Sf (1, 0, 0x1b, 0), {F1, F2}, PSEUDO, 0, NULL}, - {"fpcvt.fxu.trunc.s1", f, OpXbX6Sf (1, 0, 0x1b, 1), {F1, F2}, EMPTY}, - {"fpcvt.fxu.trunc.s2", f, OpXbX6Sf (1, 0, 0x1b, 2), {F1, F2}, EMPTY}, - {"fpcvt.fxu.trunc.s3", f, OpXbX6Sf (1, 0, 0x1b, 3), {F1, F2}, EMPTY}, - - {"fcmp.eq.s0", f2, OpRaRbTaSf (4, 0, 0, 0, 0), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.eq", f2, OpRaRbTaSf (4, 0, 0, 0, 0), {P1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.eq.s1", f2, OpRaRbTaSf (4, 0, 0, 0, 1), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.eq.s2", f2, OpRaRbTaSf (4, 0, 0, 0, 2), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.eq.s3", f2, OpRaRbTaSf (4, 0, 0, 0, 3), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.lt.s0", f2, OpRaRbTaSf (4, 0, 1, 0, 0), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.lt", f2, OpRaRbTaSf (4, 0, 1, 0, 0), {P1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.lt.s1", f2, OpRaRbTaSf (4, 0, 1, 0, 1), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.lt.s2", f2, OpRaRbTaSf (4, 0, 1, 0, 2), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.lt.s3", f2, OpRaRbTaSf (4, 0, 1, 0, 3), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.le.s0", f2, OpRaRbTaSf (4, 1, 0, 0, 0), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.le", f2, OpRaRbTaSf (4, 1, 0, 0, 0), {P1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.le.s1", f2, OpRaRbTaSf (4, 1, 0, 0, 1), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.le.s2", f2, OpRaRbTaSf (4, 1, 0, 0, 2), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.le.s3", f2, OpRaRbTaSf (4, 1, 0, 0, 3), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.unord.s0", f2, OpRaRbTaSf (4, 1, 1, 0, 0), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.unord", f2, OpRaRbTaSf (4, 1, 1, 0, 0), {P1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.unord.s1", f2, OpRaRbTaSf (4, 1, 1, 0, 1), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.unord.s2", f2, OpRaRbTaSf (4, 1, 1, 0, 2), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.unord.s3", f2, OpRaRbTaSf (4, 1, 1, 0, 3), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.eq.unc.s0", f2, OpRaRbTaSf (4, 0, 0, 1, 0), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.eq.unc", f2, OpRaRbTaSf (4, 0, 0, 1, 0), {P1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.eq.unc.s1", f2, OpRaRbTaSf (4, 0, 0, 1, 1), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.eq.unc.s2", f2, OpRaRbTaSf (4, 0, 0, 1, 2), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.eq.unc.s3", f2, OpRaRbTaSf (4, 0, 0, 1, 3), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.lt.unc.s0", f2, OpRaRbTaSf (4, 0, 1, 1, 0), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.lt.unc", f2, OpRaRbTaSf (4, 0, 1, 1, 0), {P1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.lt.unc.s1", f2, OpRaRbTaSf (4, 0, 1, 1, 1), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.lt.unc.s2", f2, OpRaRbTaSf (4, 0, 1, 1, 2), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.lt.unc.s3", f2, OpRaRbTaSf (4, 0, 1, 1, 3), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.le.unc.s0", f2, OpRaRbTaSf (4, 1, 0, 1, 0), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.le.unc", f2, OpRaRbTaSf (4, 1, 0, 1, 0), {P1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.le.unc.s1", f2, OpRaRbTaSf (4, 1, 0, 1, 1), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.le.unc.s2", f2, OpRaRbTaSf (4, 1, 0, 1, 2), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.le.unc.s3", f2, OpRaRbTaSf (4, 1, 0, 1, 3), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.unord.unc.s0", f2, OpRaRbTaSf (4, 1, 1, 1, 0), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.unord.unc", f2, OpRaRbTaSf (4, 1, 1, 1, 0), {P1, P2, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.unord.unc.s1", f2, OpRaRbTaSf (4, 1, 1, 1, 1), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.unord.unc.s2", f2, OpRaRbTaSf (4, 1, 1, 1, 2), {P1, P2, F2, F3}, EMPTY}, - {"fcmp.unord.unc.s3", f2, OpRaRbTaSf (4, 1, 1, 1, 3), {P1, P2, F2, F3}, EMPTY}, - - /* pseudo-ops of the above */ - {"fcmp.gt.s0", f2, OpRaRbTaSf (4, 0, 1, 0, 0), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.gt", f2, OpRaRbTaSf (4, 0, 1, 0, 0), {P1, P2, F3, F2}, PSEUDO, 0, NULL}, - {"fcmp.gt.s1", f2, OpRaRbTaSf (4, 0, 1, 0, 1), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.gt.s2", f2, OpRaRbTaSf (4, 0, 1, 0, 2), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.gt.s3", f2, OpRaRbTaSf (4, 0, 1, 0, 3), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.ge.s0", f2, OpRaRbTaSf (4, 1, 0, 0, 0), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.ge", f2, OpRaRbTaSf (4, 1, 0, 0, 0), {P1, P2, F3, F2}, PSEUDO, 0, NULL}, - {"fcmp.ge.s1", f2, OpRaRbTaSf (4, 1, 0, 0, 1), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.ge.s2", f2, OpRaRbTaSf (4, 1, 0, 0, 2), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.ge.s3", f2, OpRaRbTaSf (4, 1, 0, 0, 3), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.neq.s0", f2, OpRaRbTaSf (4, 0, 0, 0, 0), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.neq", f2, OpRaRbTaSf (4, 0, 0, 0, 0), {P2, P1, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.neq.s1", f2, OpRaRbTaSf (4, 0, 0, 0, 1), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.neq.s2", f2, OpRaRbTaSf (4, 0, 0, 0, 2), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.neq.s3", f2, OpRaRbTaSf (4, 0, 0, 0, 3), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nlt.s0", f2, OpRaRbTaSf (4, 0, 1, 0, 0), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nlt", f2, OpRaRbTaSf (4, 0, 1, 0, 0), {P2, P1, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.nlt.s1", f2, OpRaRbTaSf (4, 0, 1, 0, 1), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nlt.s2", f2, OpRaRbTaSf (4, 0, 1, 0, 2), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nlt.s3", f2, OpRaRbTaSf (4, 0, 1, 0, 3), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nle.s0", f2, OpRaRbTaSf (4, 1, 0, 0, 0), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nle", f2, OpRaRbTaSf (4, 1, 0, 0, 0), {P2, P1, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.nle.s1", f2, OpRaRbTaSf (4, 1, 0, 0, 1), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nle.s2", f2, OpRaRbTaSf (4, 1, 0, 0, 2), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nle.s3", f2, OpRaRbTaSf (4, 1, 0, 0, 3), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.ngt.s0", f2, OpRaRbTaSf (4, 0, 1, 0, 0), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.ngt", f2, OpRaRbTaSf (4, 0, 1, 0, 0), {P2, P1, F3, F2}, PSEUDO, 0, NULL}, - {"fcmp.ngt.s1", f2, OpRaRbTaSf (4, 0, 1, 0, 1), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.ngt.s2", f2, OpRaRbTaSf (4, 0, 1, 0, 2), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.ngt.s3", f2, OpRaRbTaSf (4, 0, 1, 0, 3), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.nge.s0", f2, OpRaRbTaSf (4, 1, 0, 0, 0), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.nge", f2, OpRaRbTaSf (4, 1, 0, 0, 0), {P2, P1, F3, F2}, PSEUDO, 0, NULL}, - {"fcmp.nge.s1", f2, OpRaRbTaSf (4, 1, 0, 0, 1), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.nge.s2", f2, OpRaRbTaSf (4, 1, 0, 0, 2), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.nge.s3", f2, OpRaRbTaSf (4, 1, 0, 0, 3), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.ord.s0", f2, OpRaRbTaSf (4, 1, 1, 0, 0), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.ord", f2, OpRaRbTaSf (4, 1, 1, 0, 0), {P2, P1, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.ord.s1", f2, OpRaRbTaSf (4, 1, 1, 0, 1), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.ord.s2", f2, OpRaRbTaSf (4, 1, 1, 0, 2), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.ord.s3", f2, OpRaRbTaSf (4, 1, 1, 0, 3), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.gt.unc.s0", f2, OpRaRbTaSf (4, 0, 1, 1, 0), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.gt.unc", f2, OpRaRbTaSf (4, 0, 1, 1, 0), {P1, P2, F3, F2}, PSEUDO, 0, NULL}, - {"fcmp.gt.unc.s1", f2, OpRaRbTaSf (4, 0, 1, 1, 1), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.gt.unc.s2", f2, OpRaRbTaSf (4, 0, 1, 1, 2), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.gt.unc.s3", f2, OpRaRbTaSf (4, 0, 1, 1, 3), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.ge.unc.s0", f2, OpRaRbTaSf (4, 1, 0, 1, 0), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.ge.unc", f2, OpRaRbTaSf (4, 1, 0, 1, 0), {P1, P2, F3, F2}, PSEUDO, 0, NULL}, - {"fcmp.ge.unc.s1", f2, OpRaRbTaSf (4, 1, 0, 1, 1), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.ge.unc.s2", f2, OpRaRbTaSf (4, 1, 0, 1, 2), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.ge.unc.s3", f2, OpRaRbTaSf (4, 1, 0, 1, 3), {P1, P2, F3, F2}, EMPTY}, - {"fcmp.neq.unc.s0", f2, OpRaRbTaSf (4, 0, 0, 1, 0), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.neq.unc", f2, OpRaRbTaSf (4, 0, 0, 1, 0), {P2, P1, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.neq.unc.s1", f2, OpRaRbTaSf (4, 0, 0, 1, 1), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.neq.unc.s2", f2, OpRaRbTaSf (4, 0, 0, 1, 2), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.neq.unc.s3", f2, OpRaRbTaSf (4, 0, 0, 1, 3), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nlt.unc.s0", f2, OpRaRbTaSf (4, 0, 1, 1, 0), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nlt.unc", f2, OpRaRbTaSf (4, 0, 1, 1, 0), {P2, P1, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.nlt.unc.s1", f2, OpRaRbTaSf (4, 0, 1, 1, 1), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nlt.unc.s2", f2, OpRaRbTaSf (4, 0, 1, 1, 2), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nlt.unc.s3", f2, OpRaRbTaSf (4, 0, 1, 1, 3), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nle.unc.s0", f2, OpRaRbTaSf (4, 1, 0, 1, 0), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nle.unc", f2, OpRaRbTaSf (4, 1, 0, 1, 0), {P2, P1, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.nle.unc.s1", f2, OpRaRbTaSf (4, 1, 0, 1, 1), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nle.unc.s2", f2, OpRaRbTaSf (4, 1, 0, 1, 2), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.nle.unc.s3", f2, OpRaRbTaSf (4, 1, 0, 1, 3), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.ngt.unc.s0", f2, OpRaRbTaSf (4, 0, 1, 1, 0), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.ngt.unc", f2, OpRaRbTaSf (4, 0, 1, 1, 0), {P2, P1, F3, F2}, PSEUDO, 0, NULL}, - {"fcmp.ngt.unc.s1", f2, OpRaRbTaSf (4, 0, 1, 1, 1), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.ngt.unc.s2", f2, OpRaRbTaSf (4, 0, 1, 1, 2), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.ngt.unc.s3", f2, OpRaRbTaSf (4, 0, 1, 1, 3), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.nge.unc.s0", f2, OpRaRbTaSf (4, 1, 0, 1, 0), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.nge.unc", f2, OpRaRbTaSf (4, 1, 0, 1, 0), {P2, P1, F3, F2}, PSEUDO, 0, NULL}, - {"fcmp.nge.unc.s1", f2, OpRaRbTaSf (4, 1, 0, 1, 1), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.nge.unc.s2", f2, OpRaRbTaSf (4, 1, 0, 1, 2), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.nge.unc.s3", f2, OpRaRbTaSf (4, 1, 0, 1, 3), {P2, P1, F3, F2}, EMPTY}, - {"fcmp.ord.unc.s0", f2, OpRaRbTaSf (4, 1, 1, 1, 0), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.ord.unc", f2, OpRaRbTaSf (4, 1, 1, 1, 0), {P2, P1, F2, F3}, PSEUDO, 0, NULL}, - {"fcmp.ord.unc.s1", f2, OpRaRbTaSf (4, 1, 1, 1, 1), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.ord.unc.s2", f2, OpRaRbTaSf (4, 1, 1, 1, 2), {P2, P1, F2, F3}, EMPTY}, - {"fcmp.ord.unc.s3", f2, OpRaRbTaSf (4, 1, 1, 1, 3), {P2, P1, F2, F3}, EMPTY}, - - {"fclass.m", f2, OpTa (5, 0), {P1, P2, F2, IMMU9}, EMPTY}, - {"fclass.nm", f2, OpTa (5, 0), {P2, P1, F2, IMMU9}, PSEUDO, 0, NULL}, - {"fclass.m.unc", f2, OpTa (5, 1), {P1, P2, F2, IMMU9}, EMPTY}, - {"fclass.nm.unc", f2, OpTa (5, 1), {P2, P1, F2, IMMU9}, PSEUDO, 0, NULL}, - - /* note: fnorm and fcvt.xuf have identical encodings! */ - {"fnorm.s0", f, OpXaSfF2F4 (0x8, 0, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm", f, OpXaSfF2F4 (0x8, 0, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.s1", f, OpXaSfF2F4 (0x8, 0, 1, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.s2", f, OpXaSfF2F4 (0x8, 0, 2, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.s3", f, OpXaSfF2F4 (0x8, 0, 3, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.s.s0", f, OpXaSfF2F4 (0x8, 1, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.s", f, OpXaSfF2F4 (0x8, 1, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.s.s1", f, OpXaSfF2F4 (0x8, 1, 1, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.s.s2", f, OpXaSfF2F4 (0x8, 1, 2, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.s.s3", f, OpXaSfF2F4 (0x8, 1, 3, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.s0", f, OpXaSfF2F4 (0x8, 0, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf", f, OpXaSfF2F4 (0x8, 0, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.s1", f, OpXaSfF2F4 (0x8, 0, 1, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.s2", f, OpXaSfF2F4 (0x8, 0, 2, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.s3", f, OpXaSfF2F4 (0x8, 0, 3, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.s.s0", f, OpXaSfF2F4 (0x8, 1, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.s", f, OpXaSfF2F4 (0x8, 1, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.s.s1", f, OpXaSfF2F4 (0x8, 1, 1, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.s.s2", f, OpXaSfF2F4 (0x8, 1, 2, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.s.s3", f, OpXaSfF2F4 (0x8, 1, 3, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fadd.s0", f, OpXaSfF4 (0x8, 0, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd", f, OpXaSfF4 (0x8, 0, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.s1", f, OpXaSfF4 (0x8, 0, 1, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.s2", f, OpXaSfF4 (0x8, 0, 2, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.s3", f, OpXaSfF4 (0x8, 0, 3, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.s.s0", f, OpXaSfF4 (0x8, 1, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.s", f, OpXaSfF4 (0x8, 1, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.s.s1", f, OpXaSfF4 (0x8, 1, 1, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.s.s2", f, OpXaSfF4 (0x8, 1, 2, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.s.s3", f, OpXaSfF4 (0x8, 1, 3, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fmpy.s0", f, OpXaSfF2 (0x8, 0, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy", f, OpXaSfF2 (0x8, 0, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.s1", f, OpXaSfF2 (0x8, 0, 1, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.s2", f, OpXaSfF2 (0x8, 0, 2, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.s3", f, OpXaSfF2 (0x8, 0, 3, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.s.s0", f, OpXaSfF2 (0x8, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.s", f, OpXaSfF2 (0x8, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.s.s1", f, OpXaSfF2 (0x8, 1, 1, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.s.s2", f, OpXaSfF2 (0x8, 1, 2, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.s.s3", f, OpXaSfF2 (0x8, 1, 3, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fma.s0", f, OpXaSf (0x8, 0, 0), {F1, F3, F4, F2}, EMPTY}, - {"fma", f, OpXaSf (0x8, 0, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fma.s1", f, OpXaSf (0x8, 0, 1), {F1, F3, F4, F2}, EMPTY}, - {"fma.s2", f, OpXaSf (0x8, 0, 2), {F1, F3, F4, F2}, EMPTY}, - {"fma.s3", f, OpXaSf (0x8, 0, 3), {F1, F3, F4, F2}, EMPTY}, - {"fma.s.s0", f, OpXaSf (0x8, 1, 0), {F1, F3, F4, F2}, EMPTY}, - {"fma.s", f, OpXaSf (0x8, 1, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fma.s.s1", f, OpXaSf (0x8, 1, 1), {F1, F3, F4, F2}, EMPTY}, - {"fma.s.s2", f, OpXaSf (0x8, 1, 2), {F1, F3, F4, F2}, EMPTY}, - {"fma.s.s3", f, OpXaSf (0x8, 1, 3), {F1, F3, F4, F2}, EMPTY}, - - {"fnorm.d.s0", f, OpXaSfF2F4 (0x9, 0, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.d", f, OpXaSfF2F4 (0x9, 0, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.d.s1", f, OpXaSfF2F4 (0x9, 0, 1, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.d.s2", f, OpXaSfF2F4 (0x9, 0, 2, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fnorm.d.s3", f, OpXaSfF2F4 (0x9, 0, 3, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.d.s0", f, OpXaSfF2F4 (0x9, 0, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.d", f, OpXaSfF2F4 (0x9, 0, 0, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.d.s1", f, OpXaSfF2F4 (0x9, 0, 1, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.d.s2", f, OpXaSfF2F4 (0x9, 0, 2, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fcvt.xuf.d.s3", f, OpXaSfF2F4 (0x9, 0, 3, 0, 1), {F1, F3}, PSEUDO, 0, NULL}, - {"fadd.d.s0", f, OpXaSfF4 (0x9, 0, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.d", f, OpXaSfF4 (0x9, 0, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.d.s1", f, OpXaSfF4 (0x9, 0, 1, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.d.s2", f, OpXaSfF4 (0x9, 0, 2, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fadd.d.s3", f, OpXaSfF4 (0x9, 0, 3, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fmpy.d.s0", f, OpXaSfF2 (0x9, 0, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.d", f, OpXaSfF2 (0x9, 0, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.d.s1", f, OpXaSfF2 (0x9, 0, 1, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.d.s2", f, OpXaSfF2 (0x9, 0, 2, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fmpy.d.s3", f, OpXaSfF2 (0x9, 0, 3, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fma.d.s0", f, OpXaSf (0x9, 0, 0), {F1, F3, F4, F2}, EMPTY}, - {"fma.d", f, OpXaSf (0x9, 0, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fma.d.s1", f, OpXaSf (0x9, 0, 1), {F1, F3, F4, F2}, EMPTY}, - {"fma.d.s2", f, OpXaSf (0x9, 0, 2), {F1, F3, F4, F2}, EMPTY}, - {"fma.d.s3", f, OpXaSf (0x9, 0, 3), {F1, F3, F4, F2}, EMPTY}, - - {"fpmpy.s0", f, OpXaSfF2 (0x9, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpmpy", f, OpXaSfF2 (0x9, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpmpy.s1", f, OpXaSfF2 (0x9, 1, 1, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpmpy.s2", f, OpXaSfF2 (0x9, 1, 2, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpmpy.s3", f, OpXaSfF2 (0x9, 1, 3, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpma.s0", f, OpXaSf (0x9, 1, 0), {F1, F3, F4, F2}, EMPTY}, - {"fpma", f, OpXaSf (0x9, 1, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fpma.s1", f, OpXaSf (0x9, 1, 1), {F1, F3, F4, F2}, EMPTY}, - {"fpma.s2", f, OpXaSf (0x9, 1, 2), {F1, F3, F4, F2}, EMPTY}, - {"fpma.s3", f, OpXaSf (0x9, 1, 3), {F1, F3, F4, F2}, EMPTY}, - - {"fsub.s0", f, OpXaSfF4 (0xa, 0, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub", f, OpXaSfF4 (0xa, 0, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.s1", f, OpXaSfF4 (0xa, 0, 1, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.s2", f, OpXaSfF4 (0xa, 0, 2, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.s3", f, OpXaSfF4 (0xa, 0, 3, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.s.s0", f, OpXaSfF4 (0xa, 1, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.s", f, OpXaSfF4 (0xa, 1, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.s.s1", f, OpXaSfF4 (0xa, 1, 1, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.s.s2", f, OpXaSfF4 (0xa, 1, 2, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.s.s3", f, OpXaSfF4 (0xa, 1, 3, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fms.s0", f, OpXaSf (0xa, 0, 0), {F1, F3, F4, F2}, EMPTY}, - {"fms", f, OpXaSf (0xa, 0, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fms.s1", f, OpXaSf (0xa, 0, 1), {F1, F3, F4, F2}, EMPTY}, - {"fms.s2", f, OpXaSf (0xa, 0, 2), {F1, F3, F4, F2}, EMPTY}, - {"fms.s3", f, OpXaSf (0xa, 0, 3), {F1, F3, F4, F2}, EMPTY}, - {"fms.s.s0", f, OpXaSf (0xa, 1, 0), {F1, F3, F4, F2}, EMPTY}, - {"fms.s", f, OpXaSf (0xa, 1, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fms.s.s1", f, OpXaSf (0xa, 1, 1), {F1, F3, F4, F2}, EMPTY}, - {"fms.s.s2", f, OpXaSf (0xa, 1, 2), {F1, F3, F4, F2}, EMPTY}, - {"fms.s.s3", f, OpXaSf (0xa, 1, 3), {F1, F3, F4, F2}, EMPTY}, - {"fsub.d.s0", f, OpXaSfF4 (0xb, 0, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.d", f, OpXaSfF4 (0xb, 0, 0, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.d.s1", f, OpXaSfF4 (0xb, 0, 1, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.d.s2", f, OpXaSfF4 (0xb, 0, 2, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fsub.d.s3", f, OpXaSfF4 (0xb, 0, 3, 1), {F1, F3, F2}, PSEUDO, 0, NULL}, - {"fms.d.s0", f, OpXaSf (0xb, 0, 0), {F1, F3, F4, F2}, EMPTY}, - {"fms.d", f, OpXaSf (0xb, 0, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fms.d.s1", f, OpXaSf (0xb, 0, 1), {F1, F3, F4, F2}, EMPTY}, - {"fms.d.s2", f, OpXaSf (0xb, 0, 2), {F1, F3, F4, F2}, EMPTY}, - {"fms.d.s3", f, OpXaSf (0xb, 0, 3), {F1, F3, F4, F2}, EMPTY}, - - {"fpms.s0", f, OpXaSf (0xb, 1, 0), {F1, F3, F4, F2}, EMPTY}, - {"fpms", f, OpXaSf (0xb, 1, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fpms.s1", f, OpXaSf (0xb, 1, 1), {F1, F3, F4, F2}, EMPTY}, - {"fpms.s2", f, OpXaSf (0xb, 1, 2), {F1, F3, F4, F2}, EMPTY}, - {"fpms.s3", f, OpXaSf (0xb, 1, 3), {F1, F3, F4, F2}, EMPTY}, - - {"fnmpy.s0", f, OpXaSfF2 (0xc, 0, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy", f, OpXaSfF2 (0xc, 0, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.s1", f, OpXaSfF2 (0xc, 0, 1, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.s2", f, OpXaSfF2 (0xc, 0, 2, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.s3", f, OpXaSfF2 (0xc, 0, 3, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.s.s0", f, OpXaSfF2 (0xc, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.s", f, OpXaSfF2 (0xc, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.s.s1", f, OpXaSfF2 (0xc, 1, 1, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.s.s2", f, OpXaSfF2 (0xc, 1, 2, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.s.s3", f, OpXaSfF2 (0xc, 1, 3, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnma.s0", f, OpXaSf (0xc, 0, 0), {F1, F3, F4, F2}, EMPTY}, - {"fnma", f, OpXaSf (0xc, 0, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fnma.s1", f, OpXaSf (0xc, 0, 1), {F1, F3, F4, F2}, EMPTY}, - {"fnma.s2", f, OpXaSf (0xc, 0, 2), {F1, F3, F4, F2}, EMPTY}, - {"fnma.s3", f, OpXaSf (0xc, 0, 3), {F1, F3, F4, F2}, EMPTY}, - {"fnma.s.s0", f, OpXaSf (0xc, 1, 0), {F1, F3, F4, F2}, EMPTY}, - {"fnma.s", f, OpXaSf (0xc, 1, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fnma.s.s1", f, OpXaSf (0xc, 1, 1), {F1, F3, F4, F2}, EMPTY}, - {"fnma.s.s2", f, OpXaSf (0xc, 1, 2), {F1, F3, F4, F2}, EMPTY}, - {"fnma.s.s3", f, OpXaSf (0xc, 1, 3), {F1, F3, F4, F2}, EMPTY}, - {"fnmpy.d.s0", f, OpXaSfF2 (0xd, 0, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.d", f, OpXaSfF2 (0xd, 0, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.d.s1", f, OpXaSfF2 (0xd, 0, 1, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.d.s2", f, OpXaSfF2 (0xd, 0, 2, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnmpy.d.s3", f, OpXaSfF2 (0xd, 0, 3, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fnma.d.s0", f, OpXaSf (0xd, 0, 0), {F1, F3, F4, F2}, EMPTY}, - {"fnma.d", f, OpXaSf (0xd, 0, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fnma.d.s1", f, OpXaSf (0xd, 0, 1), {F1, F3, F4, F2}, EMPTY}, - {"fnma.d.s2", f, OpXaSf (0xd, 0, 2), {F1, F3, F4, F2}, EMPTY}, - {"fnma.d.s3", f, OpXaSf (0xd, 0, 3), {F1, F3, F4, F2}, EMPTY}, - - {"fpnmpy.s0", f, OpXaSfF2 (0xd, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpnmpy", f, OpXaSfF2 (0xd, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpnmpy.s1", f, OpXaSfF2 (0xd, 1, 1, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpnmpy.s2", f, OpXaSfF2 (0xd, 1, 2, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpnmpy.s3", f, OpXaSfF2 (0xd, 1, 3, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"fpnma.s0", f, OpXaSf (0xd, 1, 0), {F1, F3, F4, F2}, EMPTY}, - {"fpnma", f, OpXaSf (0xd, 1, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"fpnma.s1", f, OpXaSf (0xd, 1, 1), {F1, F3, F4, F2}, EMPTY}, - {"fpnma.s2", f, OpXaSf (0xd, 1, 2), {F1, F3, F4, F2}, EMPTY}, - {"fpnma.s3", f, OpXaSf (0xd, 1, 3), {F1, F3, F4, F2}, EMPTY}, - - {"xmpy.l", f, OpXaX2F2 (0xe, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"xmpy.lu", f, OpXaX2F2 (0xe, 1, 0, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"xmpy.h", f, OpXaX2F2 (0xe, 1, 3, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"xmpy.hu", f, OpXaX2F2 (0xe, 1, 2, 0), {F1, F3, F4}, PSEUDO, 0, NULL}, - {"xma.l", f, OpXaX2 (0xe, 1, 0), {F1, F3, F4, F2}, EMPTY}, - {"xma.lu", f, OpXaX2 (0xe, 1, 0), {F1, F3, F4, F2}, PSEUDO, 0, NULL}, - {"xma.h", f, OpXaX2 (0xe, 1, 3), {F1, F3, F4, F2}, EMPTY}, - {"xma.hu", f, OpXaX2 (0xe, 1, 2), {F1, F3, F4, F2}, EMPTY}, - - {"fselect", f, OpXa (0xe, 0), {F1, F3, F4, F2}, EMPTY}, - - {NULL, 0, 0, 0, 0, {0}, 0, 0, NULL} - }; - -#undef f0 -#undef f -#undef f2 -#undef bF2 -#undef bF4 -#undef bQ -#undef bRa -#undef bRb -#undef bSf -#undef bTa -#undef bXa -#undef bXb -#undef bX2 -#undef bX6 -#undef mF2 -#undef mF4 -#undef mQ -#undef mRa -#undef mRb -#undef mSf -#undef mTa -#undef mXa -#undef mXb -#undef mX2 -#undef mX6 -#undef OpXa -#undef OpXaSf -#undef OpXaSfF2 -#undef OpXaSfF4 -#undef OpXaSfF2F4 -#undef OpXaX2 -#undef OpRaRbTaSf -#undef OpTa -#undef OpXbQSf -#undef OpXbX6 -#undef OpXbX6F2 -#undef OpXbX6Sf -#undef EMPTY diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-opc-i.c xen-4.3.0/tools/debugger/xenitp/ia64-opc-i.c --- xen-4.2.2/tools/debugger/xenitp/ia64-opc-i.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-opc-i.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,338 +0,0 @@ -/* ia64-opc-i.c -- IA-64 `I' opcode table. - Copyright 1998, 1999, 2000, 2002, 2005, 2006 - Free Software Foundation, Inc. - Contributed by David Mosberger-Tang - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#include "ia64-opc.h" - -#define I0 IA64_TYPE_I, 0 -#define I IA64_TYPE_I, 1 -#define I2 IA64_TYPE_I, 2 - -/* instruction bit fields: */ -#define bC(x) (((ia64_insn) ((x) & 0x1)) << 12) -#define bIh(x) (((ia64_insn) ((x) & 0x1)) << 23) -#define bTa(x) (((ia64_insn) ((x) & 0x1)) << 33) -#define bTag13(x) (((ia64_insn) ((x) & 0x1)) << 33) -#define bTb(x) (((ia64_insn) ((x) & 0x1)) << 36) -#define bVc(x) (((ia64_insn) ((x) & 0x1)) << 20) -#define bVe(x) (((ia64_insn) ((x) & 0x1)) << 32) -#define bWh(x) (((ia64_insn) ((x) & 0x3)) << 20) -#define bX(x) (((ia64_insn) ((x) & 0x1)) << 33) -#define bXb(x) (((ia64_insn) ((x) & 0x1)) << 22) -#define bXc(x) (((ia64_insn) ((x) & 0x1)) << 19) -#define bX2(x) (((ia64_insn) ((x) & 0x3)) << 34) -#define bX2a(x) (((ia64_insn) ((x) & 0x3)) << 34) -#define bX2b(x) (((ia64_insn) ((x) & 0x3)) << 28) -#define bX2c(x) (((ia64_insn) ((x) & 0x3)) << 30) -#define bX3(x) (((ia64_insn) ((x) & 0x7)) << 33) -#define bX6(x) (((ia64_insn) ((x) & 0x3f)) << 27) -#define bYa(x) (((ia64_insn) ((x) & 0x1)) << 13) -#define bYb(x) (((ia64_insn) ((x) & 0x1)) << 26) -#define bZa(x) (((ia64_insn) ((x) & 0x1)) << 36) -#define bZb(x) (((ia64_insn) ((x) & 0x1)) << 33) - -/* instruction bit masks: */ -#define mC bC (-1) -#define mIh bIh (-1) -#define mTa bTa (-1) -#define mTag13 bTag13 (-1) -#define mTb bTb (-1) -#define mVc bVc (-1) -#define mVe bVe (-1) -#define mWh bWh (-1) -#define mX bX (-1) -#define mXb bXb (-1) -#define mXc bXc (-1) -#define mX2 bX2 (-1) -#define mX2a bX2a (-1) -#define mX2b bX2b (-1) -#define mX2c bX2c (-1) -#define mX3 bX3 (-1) -#define mX6 bX6 (-1) -#define mYa bYa (-1) -#define mYb bYb (-1) -#define mZa bZa (-1) -#define mZb bZb (-1) - -#define OpZaZbVeX2aX2b(a,b,c,d,e,f) \ - (bOp (a) | bZa (b) | bZb (c) | bVe (d) | bX2a (e) | bX2b (f)), \ - (mOp | mZa | mZb | mVe | mX2a | mX2b) -#define OpZaZbVeX2aX2bX2c(a,b,c,d,e,f,g) \ - (bOp (a) | bZa (b) | bZb (c) | bVe (d) | bX2a (e) | bX2b (f) | bX2c (g)), \ - (mOp | mZa | mZb | mVe | mX2a | mX2b | mX2c) -#define OpX2X(a,b,c) (bOp (a) | bX2 (b) | bX (c)), (mOp | mX2 | mX) -#define OpX2XYa(a,b,c,d) (bOp (a) | bX2 (b) | bX (c) | bYa (d)), \ - (mOp | mX2 | mX | mYa) -#define OpX2XYb(a,b,c,d) (bOp (a) | bX2 (b) | bX (c) | bYb (d)), \ - (mOp | mX2 | mX | mYb) -#define OpX2TaTbYaC(a,b,c,d,e,f) \ - (bOp (a) | bX2 (b) | bTa (c) | bTb (d) | bYa (e) | bC (f)), \ - (mOp | mX2 | mTa | mTb | mYa | mC) -#define OpX2TaTbYaXcC(a,b,c,d,e,f,g) \ - (bOp (a) | bX2 (b) | bTa (c) | bTb (d) | bYa (e) | bXc (f) | bC (g)), \ - (mOp | mX2 | mTa | mTb | mYa | mXc | mC) -#define OpX3(a,b) (bOp (a) | bX3 (b)), (mOp | mX3) -#define OpX3X6(a,b,c) (bOp (a) | bX3 (b) | bX6(c)), \ - (mOp | mX3 | mX6) -#define OpX3X6Yb(a,b,c,d) (bOp (a) | bX3 (b) | bX6(c) | bYb(d)), \ - (mOp | mX3 | mX6 | mYb) -#define OpX3XbIhWh(a,b,c,d,e) \ - (bOp (a) | bX3 (b) | bXb (c) | bIh (d) | bWh (e)), \ - (mOp | mX3 | mXb | mIh | mWh) -#define OpX3XbIhWhTag13(a,b,c,d,e,f) \ - (bOp (a) | bX3 (b) | bXb (c) | bIh (d) | bWh (e) | bTag13 (f)), \ - (mOp | mX3 | mXb | mIh | mWh | mTag13) - -#define FULL17 ((ia64_insn)0x10ff001fc0LL) - -/* Used to initialise unused fields in ia64_opcode struct, - in order to stop gcc from complaining. */ -#define EMPTY 0,0,NULL - -struct ia64_opcode ia64_opcodes_i[] = - { - /* I-type instruction encodings (sorted according to major opcode). */ - - {"break.i", I0, OpX3X6 (0, 0, 0x00), {IMMU21}, X_IN_MLX, 0, NULL}, - {"nop.i", I0, OpX3X6Yb (0, 0, 0x01, 0), {IMMU21}, X_IN_MLX, 0, NULL}, - {"hint.i", I0, OpX3X6Yb (0, 0, 0x01, 1), {IMMU21}, X_IN_MLX, 0, NULL}, - {"chk.s.i", I0, OpX3 (0, 1), {R2, TGT25b}, EMPTY}, - - {"mov", I, OpX3XbIhWhTag13 (0, 7, 0, 0, 1, 0), {B1, R2}, PSEUDO, 0, NULL}, -#define MOV(a,b,c,d) \ - I, OpX3XbIhWh (0, a, b, c, d), {B1, R2, TAG13b}, EMPTY - {"mov.sptk", MOV (7, 0, 0, 0)}, - {"mov.sptk.imp", MOV (7, 0, 1, 0)}, - {"mov", MOV (7, 0, 0, 1)}, - {"mov.imp", MOV (7, 0, 1, 1)}, - {"mov.dptk", MOV (7, 0, 0, 2)}, - {"mov.dptk.imp", MOV (7, 0, 1, 2)}, - {"mov.ret.sptk", MOV (7, 1, 0, 0)}, - {"mov.ret.sptk.imp", MOV (7, 1, 1, 0)}, - {"mov.ret", MOV (7, 1, 0, 1)}, - {"mov.ret.imp", MOV (7, 1, 1, 1)}, - {"mov.ret.dptk", MOV (7, 1, 0, 2)}, - {"mov.ret.dptk.imp", MOV (7, 1, 1, 2)}, -#undef MOV - {"mov", I, OpX3X6 (0, 0, 0x31), {R1, B2}, EMPTY}, - {"mov", I, OpX3 (0, 3), {PR, R2, IMM17}, EMPTY}, - /* Don't remove one of the seemingly redundant FULL17-s. */ - {"mov", I, FULL17 | OpX3 (0, 3) | FULL17, {PR, R2}, PSEUDO, 0, NULL}, - {"mov", I, OpX3 (0, 2), {PR_ROT, IMM44}, EMPTY}, - {"mov", I, OpX3X6 (0, 0, 0x30), {R1, IP}, EMPTY}, - {"mov", I, OpX3X6 (0, 0, 0x33), {R1, PR}, EMPTY}, - {"mov.i", I, OpX3X6 (0, 0, 0x2a), {AR3, R2}, EMPTY}, - {"mov.i", I, OpX3X6 (0, 0, 0x0a), {AR3, IMM8}, EMPTY}, - {"mov.i", I, OpX3X6 (0, 0, 0x32), {R1, AR3}, EMPTY}, - {"zxt1", I, OpX3X6 (0, 0, 0x10), {R1, R3}, EMPTY}, - {"zxt2", I, OpX3X6 (0, 0, 0x11), {R1, R3}, EMPTY}, - {"zxt4", I, OpX3X6 (0, 0, 0x12), {R1, R3}, EMPTY}, - {"sxt1", I, OpX3X6 (0, 0, 0x14), {R1, R3}, EMPTY}, - {"sxt2", I, OpX3X6 (0, 0, 0x15), {R1, R3}, EMPTY}, - {"sxt4", I, OpX3X6 (0, 0, 0x16), {R1, R3}, EMPTY}, - {"czx1.l", I, OpX3X6 (0, 0, 0x18), {R1, R3}, EMPTY}, - {"czx2.l", I, OpX3X6 (0, 0, 0x19), {R1, R3}, EMPTY}, - {"czx1.r", I, OpX3X6 (0, 0, 0x1c), {R1, R3}, EMPTY}, - {"czx2.r", I, OpX3X6 (0, 0, 0x1d), {R1, R3}, EMPTY}, - - {"dep", I, Op (4), {R1, R2, R3, CPOS6c, LEN4}, EMPTY}, - - {"shrp", I, OpX2X (5, 3, 0), {R1, R2, R3, CNT6}, EMPTY}, - - {"shr.u", I, OpX2XYa (5, 1, 0, 0), {R1, R3, POS6}, - PSEUDO | LEN_EQ_64MCNT, 0, NULL}, - {"extr.u", I, OpX2XYa (5, 1, 0, 0), {R1, R3, POS6, LEN6}, EMPTY}, - - {"shr", I, OpX2XYa (5, 1, 0, 1), {R1, R3, POS6}, - PSEUDO | LEN_EQ_64MCNT, 0, NULL}, - {"extr", I, OpX2XYa (5, 1, 0, 1), {R1, R3, POS6, LEN6}, EMPTY}, - - {"shl", I, OpX2XYb (5, 1, 1, 0), {R1, R2, CPOS6a}, - PSEUDO | LEN_EQ_64MCNT, 0, NULL}, - {"dep.z", I, OpX2XYb (5, 1, 1, 0), {R1, R2, CPOS6a, LEN6}, EMPTY}, - {"dep.z", I, OpX2XYb (5, 1, 1, 1), {R1, IMM8, CPOS6a, LEN6}, EMPTY}, - {"dep", I, OpX2X (5, 3, 1), {R1, IMM1, R3, CPOS6b, LEN6}, EMPTY}, -#define TF(a,b,c) \ - I2, OpX2TaTbYaXcC (5, 0, a, b, 1, 1, c), {P1, P2, IMMU5b}, EMPTY -#define TFCM(a,b,c) \ - I2, OpX2TaTbYaXcC (5, 0, a, b, 1, 1, c), {P2, P1, IMMU5b}, PSEUDO, 0, NULL - {"tf.z", TF (0, 0, 0)}, - {"tf.nz", TFCM (0, 0, 0)}, - {"tf.z.unc", TF (0, 0, 1)}, - {"tf.nz.unc", TFCM (0, 0, 1)}, - {"tf.z.and", TF (0, 1, 0)}, - {"tf.nz.andcm", TFCM (0, 1, 0)}, - {"tf.nz.and", TF (0, 1, 1)}, - {"tf.z.andcm", TFCM (0, 1, 1)}, - {"tf.z.or", TF (1, 0, 0)}, - {"tf.nz.orcm", TFCM (1, 0, 0)}, - {"tf.nz.or", TF (1, 0, 1)}, - {"tf.z.orcm", TFCM (1, 0, 1)}, - {"tf.z.or.andcm", TF (1, 1, 0)}, - {"tf.nz.and.orcm", TFCM (1, 1, 0)}, - {"tf.nz.or.andcm", TF (1, 1, 1)}, - {"tf.z.and.orcm", TFCM (1, 1, 1)}, -#undef TF -#undef TFCM -#define TBIT(a,b,c,d) \ - I2, OpX2TaTbYaC (5, 0, a, b, c, d), {P1, P2, R3, POS6}, EMPTY -#define TBITCM(a,b,c,d) \ - I2, OpX2TaTbYaC (5, 0, a, b, c, d), {P2, P1, R3, POS6}, PSEUDO, 0, NULL - {"tbit.z", TBIT (0, 0, 0, 0)}, - {"tbit.nz", TBITCM (0, 0, 0, 0)}, - {"tbit.z.unc", TBIT (0, 0, 0, 1)}, - {"tbit.nz.unc", TBITCM (0, 0, 0, 1)}, - {"tbit.z.and", TBIT (0, 1, 0, 0)}, - {"tbit.nz.andcm", TBITCM (0, 1, 0, 0)}, - {"tbit.nz.and", TBIT (0, 1, 0, 1)}, - {"tbit.z.andcm", TBITCM (0, 1, 0, 1)}, - {"tbit.z.or", TBIT (1, 0, 0, 0)}, - {"tbit.nz.orcm", TBITCM (1, 0, 0, 0)}, - {"tbit.nz.or", TBIT (1, 0, 0, 1)}, - {"tbit.z.orcm", TBITCM (1, 0, 0, 1)}, - {"tbit.z.or.andcm", TBIT (1, 1, 0, 0)}, - {"tbit.nz.and.orcm", TBITCM (1, 1, 0, 0)}, - {"tbit.nz.or.andcm", TBIT (1, 1, 0, 1)}, - {"tbit.z.and.orcm", TBITCM (1, 1, 0, 1)}, -#undef TBIT -#undef TBITCM -#define TNAT(a,b,c,d) \ - I2, OpX2TaTbYaC (5, 0, a, b, c, d), {P1, P2, R3}, EMPTY -#define TNATCM(a,b,c,d) \ - I2, OpX2TaTbYaC (5, 0, a, b, c, d), {P2, P1, R3}, PSEUDO, 0, NULL - {"tnat.z", TNAT (0, 0, 1, 0)}, - {"tnat.nz", TNATCM (0, 0, 1, 0)}, - {"tnat.z.unc", TNAT (0, 0, 1, 1)}, - {"tnat.nz.unc", TNATCM (0, 0, 1, 1)}, - {"tnat.z.and", TNAT (0, 1, 1, 0)}, - {"tnat.nz.andcm", TNATCM (0, 1, 1, 0)}, - {"tnat.nz.and", TNAT (0, 1, 1, 1)}, - {"tnat.z.andcm", TNATCM (0, 1, 1, 1)}, - {"tnat.z.or", TNAT (1, 0, 1, 0)}, - {"tnat.nz.orcm", TNATCM (1, 0, 1, 0)}, - {"tnat.nz.or", TNAT (1, 0, 1, 1)}, - {"tnat.z.orcm", TNATCM (1, 0, 1, 1)}, - {"tnat.z.or.andcm", TNAT (1, 1, 1, 0)}, - {"tnat.nz.and.orcm", TNATCM (1, 1, 1, 0)}, - {"tnat.nz.or.andcm", TNAT (1, 1, 1, 1)}, - {"tnat.z.and.orcm", TNATCM (1, 1, 1, 1)}, -#undef TNAT -#undef TNATCM - - {"pmpyshr2", I, OpZaZbVeX2aX2b (7, 0, 1, 0, 0, 3), {R1, R2, R3, CNT2c}, EMPTY}, - {"pmpyshr2.u", I, OpZaZbVeX2aX2b (7, 0, 1, 0, 0, 1), {R1, R2, R3, CNT2c}, EMPTY}, - {"pmpy2.r", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 1, 3), {R1, R2, R3}, EMPTY}, - {"pmpy2.l", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 3, 3), {R1, R2, R3}, EMPTY}, - {"mix1.r", I, OpZaZbVeX2aX2bX2c (7, 0, 0, 0, 2, 0, 2), {R1, R2, R3}, EMPTY}, - {"mix2.r", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 0, 2), {R1, R2, R3}, EMPTY}, - {"mix4.r", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 2, 0, 2), {R1, R2, R3}, EMPTY}, - {"mix1.l", I, OpZaZbVeX2aX2bX2c (7, 0, 0, 0, 2, 2, 2), {R1, R2, R3}, EMPTY}, - {"mix2.l", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 2, 2), {R1, R2, R3}, EMPTY}, - {"mix4.l", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 2, 2, 2), {R1, R2, R3}, EMPTY}, - {"pack2.uss", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 0, 0), {R1, R2, R3}, EMPTY}, - {"pack2.sss", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 2, 0), {R1, R2, R3}, EMPTY}, - {"pack4.sss", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 2, 2, 0), {R1, R2, R3}, EMPTY}, - {"unpack1.h", I, OpZaZbVeX2aX2bX2c (7, 0, 0, 0, 2, 0, 1), {R1, R2, R3}, EMPTY}, - {"unpack2.h", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 0, 1), {R1, R2, R3}, EMPTY}, - {"unpack4.h", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 2, 0, 1), {R1, R2, R3}, EMPTY}, - {"unpack1.l", I, OpZaZbVeX2aX2bX2c (7, 0, 0, 0, 2, 2, 1), {R1, R2, R3}, EMPTY}, - {"unpack2.l", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 2, 1), {R1, R2, R3}, EMPTY}, - {"unpack4.l", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 2, 2, 1), {R1, R2, R3}, EMPTY}, - {"pmin1.u", I, OpZaZbVeX2aX2bX2c (7, 0, 0, 0, 2, 1, 0), {R1, R2, R3}, EMPTY}, - {"pmax1.u", I, OpZaZbVeX2aX2bX2c (7, 0, 0, 0, 2, 1, 1), {R1, R2, R3}, EMPTY}, - {"pmin2", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 3, 0), {R1, R2, R3}, EMPTY}, - {"pmax2", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 2, 3, 1), {R1, R2, R3}, EMPTY}, - {"psad1", I, OpZaZbVeX2aX2bX2c (7, 0, 0, 0, 2, 3, 2), {R1, R2, R3}, EMPTY}, - {"mux1", I, OpZaZbVeX2aX2bX2c (7, 0, 0, 0, 3, 2, 2), {R1, R2, MBTYPE4}, EMPTY}, - {"mux2", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 3, 2, 2), {R1, R2, MHTYPE8}, EMPTY}, - {"pshr2", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 0, 2, 0), {R1, R3, R2}, EMPTY}, - {"pshr4", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 0, 2, 0), {R1, R3, R2}, EMPTY}, - {"shr", I, OpZaZbVeX2aX2bX2c (7, 1, 1, 0, 0, 2, 0), {R1, R3, R2}, EMPTY}, - {"pshr2.u", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 0, 0, 0), {R1, R3, R2}, EMPTY}, - {"pshr4.u", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 0, 0, 0), {R1, R3, R2}, EMPTY}, - {"shr.u", I, OpZaZbVeX2aX2bX2c (7, 1, 1, 0, 0, 0, 0), {R1, R3, R2}, EMPTY}, - {"pshr2", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 1, 3, 0), {R1, R3, CNT5}, EMPTY}, - {"pshr4", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 1, 3, 0), {R1, R3, CNT5}, EMPTY}, - {"pshr2.u", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 1, 1, 0), {R1, R3, CNT5}, EMPTY}, - {"pshr4.u", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 1, 1, 0), {R1, R3, CNT5}, EMPTY}, - {"pshl2", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 0, 0, 1), {R1, R2, R3}, EMPTY}, - {"pshl4", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 0, 0, 1), {R1, R2, R3}, EMPTY}, - {"shl", I, OpZaZbVeX2aX2bX2c (7, 1, 1, 0, 0, 0, 1), {R1, R2, R3}, EMPTY}, - {"pshl2", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 3, 1, 1), {R1, R2, CCNT5}, EMPTY}, - {"pshl4", I, OpZaZbVeX2aX2bX2c (7, 1, 0, 0, 3, 1, 1), {R1, R2, CCNT5}, EMPTY}, - {"popcnt", I, OpZaZbVeX2aX2bX2c (7, 0, 1, 0, 1, 1, 2), {R1, R3}, EMPTY}, - - {NULL, 0, 0, 0, 0, {0}, 0, 0, NULL} - }; - -#undef I0 -#undef I -#undef I2 -#undef L -#undef bC -#undef bIh -#undef bTa -#undef bTag13 -#undef bTb -#undef bVc -#undef bVe -#undef bWh -#undef bX -#undef bXb -#undef bX2 -#undef bX2a -#undef bX2b -#undef bX2c -#undef bX3 -#undef bX6 -#undef bY -#undef bZa -#undef bZb -#undef mC -#undef mIh -#undef mTa -#undef mTag13 -#undef mTb -#undef mVc -#undef mVe -#undef mWh -#undef mX -#undef mXb -#undef mX2 -#undef mX2a -#undef mX2b -#undef mX2c -#undef mX3 -#undef mX6 -#undef mY -#undef mZa -#undef mZb -#undef OpZaZbVeX2aX2b -#undef OpZaZbVeX2aX2bX2c -#undef OpX2X -#undef OpX2XYa -#undef OpX2XYb -#undef OpX2TaTbYaC -#undef OpX3 -#undef OpX3X6 -#undef OpX3XbIhWh -#undef OpX3XbIhWhTag13 -#undef EMPTY diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-opc-m.c xen-4.3.0/tools/debugger/xenitp/ia64-opc-m.c --- xen-4.2.2/tools/debugger/xenitp/ia64-opc-m.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-opc-m.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1118 +0,0 @@ -/* ia64-opc-m.c -- IA-64 `M' opcode table. - Copyright 1998, 1999, 2000, 2002, 2005 Free Software Foundation, Inc. - Contributed by David Mosberger-Tang - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#include "ia64-opc.h" - -#define M0 IA64_TYPE_M, 0 -#define M IA64_TYPE_M, 1 -#define M2 IA64_TYPE_M, 2 - -/* instruction bit fields: */ -#define bM(x) (((ia64_insn) ((x) & 0x1)) << 36) -#define bX(x) (((ia64_insn) ((x) & 0x1)) << 27) -#define bX2(x) (((ia64_insn) ((x) & 0x3)) << 31) -#define bX3(x) (((ia64_insn) ((x) & 0x7)) << 33) -#define bX4(x) (((ia64_insn) ((x) & 0xf)) << 27) -#define bX6a(x) (((ia64_insn) ((x) & 0x3f)) << 30) -#define bX6b(x) (((ia64_insn) ((x) & 0x3f)) << 27) -#define bX7(x) (((ia64_insn) ((x) & 0x1)) << 36) /* note: alias for bM() */ -#define bY(x) (((ia64_insn) ((x) & 0x1)) << 26) -#define bHint(x) (((ia64_insn) ((x) & 0x3)) << 28) - -#define mM bM (-1) -#define mX bX (-1) -#define mX2 bX2 (-1) -#define mX3 bX3 (-1) -#define mX4 bX4 (-1) -#define mX6a bX6a (-1) -#define mX6b bX6b (-1) -#define mX7 bX7 (-1) -#define mY bY (-1) -#define mHint bHint (-1) - -#define OpX3(a,b) (bOp (a) | bX3 (b)), (mOp | mX3) -#define OpX3X6b(a,b,c) (bOp (a) | bX3 (b) | bX6b (c)), \ - (mOp | mX3 | mX6b) -#define OpX3X6bX7(a,b,c,d) (bOp (a) | bX3 (b) | bX6b (c) | bX7 (d)), \ - (mOp | mX3 | mX6b | mX7) -#define OpX3X4(a,b,c) (bOp (a) | bX3 (b) | bX4 (c)), \ - (mOp | mX3 | mX4) -#define OpX3X4X2(a,b,c,d) (bOp (a) | bX3 (b) | bX4 (c) | bX2 (d)), \ - (mOp | mX3 | mX4 | mX2) -#define OpX3X4X2Y(a,b,c,d,e) (bOp (a) | bX3 (b) | bX4 (c) | bX2 (d) | bY (e)), \ - (mOp | mX3 | mX4 | mX2 | mY) -#define OpX6aHint(a,b,c) (bOp (a) | bX6a (b) | bHint (c)), \ - (mOp | mX6a | mHint) -#define OpXX6aHint(a,b,c,d) (bOp (a) | bX (b) | bX6a (c) | bHint (d)), \ - (mOp | mX | mX6a | mHint) -#define OpMXX6a(a,b,c,d) \ - (bOp (a) | bM (b) | bX (c) | bX6a (d)), (mOp | mM | mX | mX6a) -#define OpMXX6aHint(a,b,c,d,e) \ - (bOp (a) | bM (b) | bX (c) | bX6a (d) | bHint (e)), \ - (mOp | mM | mX | mX6a | mHint) - -/* Used to initialise unused fields in ia64_opcode struct, - in order to stop gcc from complaining. */ -#define EMPTY 0,0,NULL - -struct ia64_opcode ia64_opcodes_m[] = - { - /* M-type instruction encodings (sorted according to major opcode). */ - - {"chk.a.nc", M0, OpX3 (0, 4), {R1, TGT25c}, EMPTY}, - {"chk.a.clr", M0, OpX3 (0, 5), {R1, TGT25c}, EMPTY}, - {"chk.a.nc", M0, OpX3 (0, 6), {F1, TGT25c}, EMPTY}, - {"chk.a.clr", M0, OpX3 (0, 7), {F1, TGT25c}, EMPTY}, - - {"invala", M0, OpX3X4X2 (0, 0, 0, 1), {}, EMPTY}, - {"fwb", M0, OpX3X4X2 (0, 0, 0, 2), {}, EMPTY}, - {"mf", M0, OpX3X4X2 (0, 0, 2, 2), {}, EMPTY}, - {"mf.a", M0, OpX3X4X2 (0, 0, 3, 2), {}, EMPTY}, - {"srlz.d", M0, OpX3X4X2 (0, 0, 0, 3), {}, EMPTY}, - {"srlz.i", M0, OpX3X4X2 (0, 0, 1, 3), {}, EMPTY}, - {"sync.i", M0, OpX3X4X2 (0, 0, 3, 3), {}, EMPTY}, - {"flushrs", M0, OpX3X4X2 (0, 0, 0xc, 0), {}, FIRST | NO_PRED, 0, NULL}, - {"loadrs", M0, OpX3X4X2 (0, 0, 0xa, 0), {}, FIRST | NO_PRED, 0, NULL}, - {"invala.e", M0, OpX3X4X2 (0, 0, 2, 1), {R1}, EMPTY}, - {"invala.e", M0, OpX3X4X2 (0, 0, 3, 1), {F1}, EMPTY}, - {"mov.m", M, OpX3X4X2 (0, 0, 8, 2), {AR3, IMM8}, EMPTY}, - - {"break.m", M0, OpX3X4X2 (0, 0, 0, 0), {IMMU21}, EMPTY}, - {"nop.m", M0, OpX3X4X2Y (0, 0, 1, 0, 0), {IMMU21}, EMPTY}, - {"hint.m", M0, OpX3X4X2Y (0, 0, 1, 0, 1), {IMMU21}, EMPTY}, - - {"sum", M0, OpX3X4 (0, 0, 4), {IMMU24}, EMPTY}, - {"rum", M0, OpX3X4 (0, 0, 5), {IMMU24}, EMPTY}, - {"ssm", M0, OpX3X4 (0, 0, 6), {IMMU24}, PRIV, 0, NULL}, - {"rsm", M0, OpX3X4 (0, 0, 7), {IMMU24}, PRIV, 0, NULL}, - - {"mov.m", M, OpX3X6b (1, 0, 0x2a), {AR3, R2}, EMPTY}, - {"mov.m", M, OpX3X6b (1, 0, 0x22), {R1, AR3}, EMPTY}, - {"mov", M, OpX3X6b (1, 0, 0x2c), {CR3, R2}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x24), {R1, CR3}, PRIV, 0, NULL}, - - {"alloc", M, OpX3 (1, 6), {R1, AR_PFS, SOF, SOL, SOR}, FIRST|NO_PRED|MOD_RRBS, 0, NULL}, - {"alloc", M, OpX3 (1, 6), {R1, SOF, SOL, SOR}, PSEUDO|FIRST|NO_PRED|MOD_RRBS, 0, NULL}, - - {"mov", M, OpX3X6b (1, 0, 0x2d), {PSR_L, R2}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x29), {PSR_UM, R2}, EMPTY}, - {"mov", M, OpX3X6b (1, 0, 0x25), {R1, PSR}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x21), {R1, PSR_UM}, EMPTY}, - {"probe.r", M, OpX3X6b (1, 0, 0x38), {R1, R3, R2}, EMPTY}, - {"probe.w", M, OpX3X6b (1, 0, 0x39), {R1, R3, R2}, EMPTY}, - {"probe.r", M, OpX3X6b (1, 0, 0x18), {R1, R3, IMMU2}, EMPTY}, - {"probe.w", M, OpX3X6b (1, 0, 0x19), {R1, R3, IMMU2}, EMPTY}, - {"probe.rw.fault", M0, OpX3X6b (1, 0, 0x31), {R3, IMMU2}, EMPTY}, - {"probe.r.fault", M0, OpX3X6b (1, 0, 0x32), {R3, IMMU2}, EMPTY}, - {"probe.w.fault", M0, OpX3X6b (1, 0, 0x33), {R3, IMMU2}, EMPTY}, - {"itc.d", M0, OpX3X6b (1, 0, 0x2e), {R2}, LAST | PRIV, 0, NULL}, - {"itc.i", M0, OpX3X6b (1, 0, 0x2f), {R2}, LAST | PRIV, 0, NULL}, - - {"mov", M, OpX3X6b (1, 0, 0x00), {RR_R3, R2}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x01), {DBR_R3, R2}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x02), {IBR_R3, R2}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x03), {PKR_R3, R2}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x04), {PMC_R3, R2}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x05), {PMD_R3, R2}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x06), {MSR_R3, R2}, PRIV, 0, NULL}, - {"itr.d", M, OpX3X6b (1, 0, 0x0e), {DTR_R3, R2}, PRIV, 0, NULL}, - {"itr.i", M, OpX3X6b (1, 0, 0x0f), {ITR_R3, R2}, PRIV, 0, NULL}, - - {"mov", M, OpX3X6b (1, 0, 0x10), {R1, RR_R3}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x11), {R1, DBR_R3}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x12), {R1, IBR_R3}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x13), {R1, PKR_R3}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x14), {R1, PMC_R3}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x15), {R1, PMD_R3}, EMPTY}, - {"mov", M, OpX3X6b (1, 0, 0x16), {R1, MSR_R3}, PRIV, 0, NULL}, - {"mov", M, OpX3X6b (1, 0, 0x17), {R1, CPUID_R3}, EMPTY}, - - {"ptc.l", M0, OpX3X6b (1, 0, 0x09), {R3, R2}, PRIV, 0, NULL}, - {"ptc.g", M0, OpX3X6b (1, 0, 0x0a), {R3, R2}, LAST | PRIV, 0, NULL}, - {"ptc.ga", M0, OpX3X6b (1, 0, 0x0b), {R3, R2}, LAST | PRIV, 0, NULL}, - {"ptr.d", M0, OpX3X6b (1, 0, 0x0c), {R3, R2}, PRIV, 0, NULL}, - {"ptr.i", M0, OpX3X6b (1, 0, 0x0d), {R3, R2}, PRIV, 0, NULL}, - - {"thash", M, OpX3X6b (1, 0, 0x1a), {R1, R3}, EMPTY}, - {"ttag", M, OpX3X6b (1, 0, 0x1b), {R1, R3}, EMPTY}, - {"tpa", M, OpX3X6b (1, 0, 0x1e), {R1, R3}, PRIV, 0, NULL}, - {"tak", M, OpX3X6b (1, 0, 0x1f), {R1, R3}, PRIV, 0, NULL}, - - {"chk.s.m", M0, OpX3 (1, 1), {R2, TGT25b}, EMPTY}, - {"chk.s", M0, OpX3 (1, 3), {F2, TGT25b}, EMPTY}, - - {"fc", M0, OpX3X6bX7 (1, 0, 0x30, 0), {R3}, EMPTY}, - {"fc.i", M0, OpX3X6bX7 (1, 0, 0x30, 1), {R3}, EMPTY}, - {"ptc.e", M0, OpX3X6b (1, 0, 0x34), {R3}, PRIV, 0, NULL}, - - /* integer load */ - {"ld1", M, OpMXX6aHint (4, 0, 0, 0x00, 0), {R1, MR3}, EMPTY}, - {"ld1.nt1", M, OpMXX6aHint (4, 0, 0, 0x00, 1), {R1, MR3}, EMPTY}, - {"ld1.nta", M, OpMXX6aHint (4, 0, 0, 0x00, 3), {R1, MR3}, EMPTY}, - {"ld2", M, OpMXX6aHint (4, 0, 0, 0x01, 0), {R1, MR3}, EMPTY}, - {"ld2.nt1", M, OpMXX6aHint (4, 0, 0, 0x01, 1), {R1, MR3}, EMPTY}, - {"ld2.nta", M, OpMXX6aHint (4, 0, 0, 0x01, 3), {R1, MR3}, EMPTY}, - {"ld4", M, OpMXX6aHint (4, 0, 0, 0x02, 0), {R1, MR3}, EMPTY}, - {"ld4.nt1", M, OpMXX6aHint (4, 0, 0, 0x02, 1), {R1, MR3}, EMPTY}, - {"ld4.nta", M, OpMXX6aHint (4, 0, 0, 0x02, 3), {R1, MR3}, EMPTY}, - {"ld8", M, OpMXX6aHint (4, 0, 0, 0x03, 0), {R1, MR3}, EMPTY}, - {"ld8.nt1", M, OpMXX6aHint (4, 0, 0, 0x03, 1), {R1, MR3}, EMPTY}, - {"ld8.nta", M, OpMXX6aHint (4, 0, 0, 0x03, 3), {R1, MR3}, EMPTY}, - {"ld16", M2, OpMXX6aHint (4, 0, 1, 0x28, 0), {R1, AR_CSD, MR3}, EMPTY}, - {"ld16", M, OpMXX6aHint (4, 0, 1, 0x28, 0), {R1, MR3}, PSEUDO, 0, NULL}, - {"ld16.nt1", M2, OpMXX6aHint (4, 0, 1, 0x28, 1), {R1, AR_CSD, MR3}, EMPTY}, - {"ld16.nt1", M, OpMXX6aHint (4, 0, 1, 0x28, 1), {R1, MR3}, PSEUDO, 0, NULL}, - {"ld16.nta", M2, OpMXX6aHint (4, 0, 1, 0x28, 3), {R1, AR_CSD, MR3}, EMPTY}, - {"ld16.nta", M, OpMXX6aHint (4, 0, 1, 0x28, 3), {R1, MR3}, PSEUDO, 0, NULL}, - {"ld1.s", M, OpMXX6aHint (4, 0, 0, 0x04, 0), {R1, MR3}, EMPTY}, - {"ld1.s.nt1", M, OpMXX6aHint (4, 0, 0, 0x04, 1), {R1, MR3}, EMPTY}, - {"ld1.s.nta", M, OpMXX6aHint (4, 0, 0, 0x04, 3), {R1, MR3}, EMPTY}, - {"ld2.s", M, OpMXX6aHint (4, 0, 0, 0x05, 0), {R1, MR3}, EMPTY}, - {"ld2.s.nt1", M, OpMXX6aHint (4, 0, 0, 0x05, 1), {R1, MR3}, EMPTY}, - {"ld2.s.nta", M, OpMXX6aHint (4, 0, 0, 0x05, 3), {R1, MR3}, EMPTY}, - {"ld4.s", M, OpMXX6aHint (4, 0, 0, 0x06, 0), {R1, MR3}, EMPTY}, - {"ld4.s.nt1", M, OpMXX6aHint (4, 0, 0, 0x06, 1), {R1, MR3}, EMPTY}, - {"ld4.s.nta", M, OpMXX6aHint (4, 0, 0, 0x06, 3), {R1, MR3}, EMPTY}, - {"ld8.s", M, OpMXX6aHint (4, 0, 0, 0x07, 0), {R1, MR3}, EMPTY}, - {"ld8.s.nt1", M, OpMXX6aHint (4, 0, 0, 0x07, 1), {R1, MR3}, EMPTY}, - {"ld8.s.nta", M, OpMXX6aHint (4, 0, 0, 0x07, 3), {R1, MR3}, EMPTY}, - {"ld1.a", M, OpMXX6aHint (4, 0, 0, 0x08, 0), {R1, MR3}, EMPTY}, - {"ld1.a.nt1", M, OpMXX6aHint (4, 0, 0, 0x08, 1), {R1, MR3}, EMPTY}, - {"ld1.a.nta", M, OpMXX6aHint (4, 0, 0, 0x08, 3), {R1, MR3}, EMPTY}, - {"ld2.a", M, OpMXX6aHint (4, 0, 0, 0x09, 0), {R1, MR3}, EMPTY}, - {"ld2.a.nt1", M, OpMXX6aHint (4, 0, 0, 0x09, 1), {R1, MR3}, EMPTY}, - {"ld2.a.nta", M, OpMXX6aHint (4, 0, 0, 0x09, 3), {R1, MR3}, EMPTY}, - {"ld4.a", M, OpMXX6aHint (4, 0, 0, 0x0a, 0), {R1, MR3}, EMPTY}, - {"ld4.a.nt1", M, OpMXX6aHint (4, 0, 0, 0x0a, 1), {R1, MR3}, EMPTY}, - {"ld4.a.nta", M, OpMXX6aHint (4, 0, 0, 0x0a, 3), {R1, MR3}, EMPTY}, - {"ld8.a", M, OpMXX6aHint (4, 0, 0, 0x0b, 0), {R1, MR3}, EMPTY}, - {"ld8.a.nt1", M, OpMXX6aHint (4, 0, 0, 0x0b, 1), {R1, MR3}, EMPTY}, - {"ld8.a.nta", M, OpMXX6aHint (4, 0, 0, 0x0b, 3), {R1, MR3}, EMPTY}, - {"ld1.sa", M, OpMXX6aHint (4, 0, 0, 0x0c, 0), {R1, MR3}, EMPTY}, - {"ld1.sa.nt1", M, OpMXX6aHint (4, 0, 0, 0x0c, 1), {R1, MR3}, EMPTY}, - {"ld1.sa.nta", M, OpMXX6aHint (4, 0, 0, 0x0c, 3), {R1, MR3}, EMPTY}, - {"ld2.sa", M, OpMXX6aHint (4, 0, 0, 0x0d, 0), {R1, MR3}, EMPTY}, - {"ld2.sa.nt1", M, OpMXX6aHint (4, 0, 0, 0x0d, 1), {R1, MR3}, EMPTY}, - {"ld2.sa.nta", M, OpMXX6aHint (4, 0, 0, 0x0d, 3), {R1, MR3}, EMPTY}, - {"ld4.sa", M, OpMXX6aHint (4, 0, 0, 0x0e, 0), {R1, MR3}, EMPTY}, - {"ld4.sa.nt1", M, OpMXX6aHint (4, 0, 0, 0x0e, 1), {R1, MR3}, EMPTY}, - {"ld4.sa.nta", M, OpMXX6aHint (4, 0, 0, 0x0e, 3), {R1, MR3}, EMPTY}, - {"ld8.sa", M, OpMXX6aHint (4, 0, 0, 0x0f, 0), {R1, MR3}, EMPTY}, - {"ld8.sa.nt1", M, OpMXX6aHint (4, 0, 0, 0x0f, 1), {R1, MR3}, EMPTY}, - {"ld8.sa.nta", M, OpMXX6aHint (4, 0, 0, 0x0f, 3), {R1, MR3}, EMPTY}, - {"ld1.bias", M, OpMXX6aHint (4, 0, 0, 0x10, 0), {R1, MR3}, EMPTY}, - {"ld1.bias.nt1", M, OpMXX6aHint (4, 0, 0, 0x10, 1), {R1, MR3}, EMPTY}, - {"ld1.bias.nta", M, OpMXX6aHint (4, 0, 0, 0x10, 3), {R1, MR3}, EMPTY}, - {"ld2.bias", M, OpMXX6aHint (4, 0, 0, 0x11, 0), {R1, MR3}, EMPTY}, - {"ld2.bias.nt1", M, OpMXX6aHint (4, 0, 0, 0x11, 1), {R1, MR3}, EMPTY}, - {"ld2.bias.nta", M, OpMXX6aHint (4, 0, 0, 0x11, 3), {R1, MR3}, EMPTY}, - {"ld4.bias", M, OpMXX6aHint (4, 0, 0, 0x12, 0), {R1, MR3}, EMPTY}, - {"ld4.bias.nt1", M, OpMXX6aHint (4, 0, 0, 0x12, 1), {R1, MR3}, EMPTY}, - {"ld4.bias.nta", M, OpMXX6aHint (4, 0, 0, 0x12, 3), {R1, MR3}, EMPTY}, - {"ld8.bias", M, OpMXX6aHint (4, 0, 0, 0x13, 0), {R1, MR3}, EMPTY}, - {"ld8.bias.nt1", M, OpMXX6aHint (4, 0, 0, 0x13, 1), {R1, MR3}, EMPTY}, - {"ld8.bias.nta", M, OpMXX6aHint (4, 0, 0, 0x13, 3), {R1, MR3}, EMPTY}, - {"ld1.acq", M, OpMXX6aHint (4, 0, 0, 0x14, 0), {R1, MR3}, EMPTY}, - {"ld1.acq.nt1", M, OpMXX6aHint (4, 0, 0, 0x14, 1), {R1, MR3}, EMPTY}, - {"ld1.acq.nta", M, OpMXX6aHint (4, 0, 0, 0x14, 3), {R1, MR3}, EMPTY}, - {"ld2.acq", M, OpMXX6aHint (4, 0, 0, 0x15, 0), {R1, MR3}, EMPTY}, - {"ld2.acq.nt1", M, OpMXX6aHint (4, 0, 0, 0x15, 1), {R1, MR3}, EMPTY}, - {"ld2.acq.nta", M, OpMXX6aHint (4, 0, 0, 0x15, 3), {R1, MR3}, EMPTY}, - {"ld4.acq", M, OpMXX6aHint (4, 0, 0, 0x16, 0), {R1, MR3}, EMPTY}, - {"ld4.acq.nt1", M, OpMXX6aHint (4, 0, 0, 0x16, 1), {R1, MR3}, EMPTY}, - {"ld4.acq.nta", M, OpMXX6aHint (4, 0, 0, 0x16, 3), {R1, MR3}, EMPTY}, - {"ld8.acq", M, OpMXX6aHint (4, 0, 0, 0x17, 0), {R1, MR3}, EMPTY}, - {"ld8.acq.nt1", M, OpMXX6aHint (4, 0, 0, 0x17, 1), {R1, MR3}, EMPTY}, - {"ld8.acq.nta", M, OpMXX6aHint (4, 0, 0, 0x17, 3), {R1, MR3}, EMPTY}, - {"ld16.acq", M2, OpMXX6aHint (4, 0, 1, 0x2c, 0), {R1, AR_CSD, MR3}, EMPTY}, - {"ld16.acq", M, OpMXX6aHint (4, 0, 1, 0x2c, 0), {R1, MR3}, PSEUDO, 0, NULL}, - {"ld16.acq.nt1", M2, OpMXX6aHint (4, 0, 1, 0x2c, 1), {R1, AR_CSD, MR3}, EMPTY}, - {"ld16.acq.nt1", M, OpMXX6aHint (4, 0, 1, 0x2c, 1), {R1, MR3}, PSEUDO, 0, NULL}, - {"ld16.acq.nta", M2, OpMXX6aHint (4, 0, 1, 0x2c, 3), {R1, AR_CSD, MR3}, EMPTY}, - {"ld16.acq.nta", M, OpMXX6aHint (4, 0, 1, 0x2c, 3), {R1, MR3}, PSEUDO, 0, NULL}, - {"ld8.fill", M, OpMXX6aHint (4, 0, 0, 0x1b, 0), {R1, MR3}, EMPTY}, - {"ld8.fill.nt1", M, OpMXX6aHint (4, 0, 0, 0x1b, 1), {R1, MR3}, EMPTY}, - {"ld8.fill.nta", M, OpMXX6aHint (4, 0, 0, 0x1b, 3), {R1, MR3}, EMPTY}, - {"ld1.c.clr", M, OpMXX6aHint (4, 0, 0, 0x20, 0), {R1, MR3}, EMPTY}, - {"ld1.c.clr.nt1", M, OpMXX6aHint (4, 0, 0, 0x20, 1), {R1, MR3}, EMPTY}, - {"ld1.c.clr.nta", M, OpMXX6aHint (4, 0, 0, 0x20, 3), {R1, MR3}, EMPTY}, - {"ld2.c.clr", M, OpMXX6aHint (4, 0, 0, 0x21, 0), {R1, MR3}, EMPTY}, - {"ld2.c.clr.nt1", M, OpMXX6aHint (4, 0, 0, 0x21, 1), {R1, MR3}, EMPTY}, - {"ld2.c.clr.nta", M, OpMXX6aHint (4, 0, 0, 0x21, 3), {R1, MR3}, EMPTY}, - {"ld4.c.clr", M, OpMXX6aHint (4, 0, 0, 0x22, 0), {R1, MR3}, EMPTY}, - {"ld4.c.clr.nt1", M, OpMXX6aHint (4, 0, 0, 0x22, 1), {R1, MR3}, EMPTY}, - {"ld4.c.clr.nta", M, OpMXX6aHint (4, 0, 0, 0x22, 3), {R1, MR3}, EMPTY}, - {"ld8.c.clr", M, OpMXX6aHint (4, 0, 0, 0x23, 0), {R1, MR3}, EMPTY}, - {"ld8.c.clr.nt1", M, OpMXX6aHint (4, 0, 0, 0x23, 1), {R1, MR3}, EMPTY}, - {"ld8.c.clr.nta", M, OpMXX6aHint (4, 0, 0, 0x23, 3), {R1, MR3}, EMPTY}, - {"ld1.c.nc", M, OpMXX6aHint (4, 0, 0, 0x24, 0), {R1, MR3}, EMPTY}, - {"ld1.c.nc.nt1", M, OpMXX6aHint (4, 0, 0, 0x24, 1), {R1, MR3}, EMPTY}, - {"ld1.c.nc.nta", M, OpMXX6aHint (4, 0, 0, 0x24, 3), {R1, MR3}, EMPTY}, - {"ld2.c.nc", M, OpMXX6aHint (4, 0, 0, 0x25, 0), {R1, MR3}, EMPTY}, - {"ld2.c.nc.nt1", M, OpMXX6aHint (4, 0, 0, 0x25, 1), {R1, MR3}, EMPTY}, - {"ld2.c.nc.nta", M, OpMXX6aHint (4, 0, 0, 0x25, 3), {R1, MR3}, EMPTY}, - {"ld4.c.nc", M, OpMXX6aHint (4, 0, 0, 0x26, 0), {R1, MR3}, EMPTY}, - {"ld4.c.nc.nt1", M, OpMXX6aHint (4, 0, 0, 0x26, 1), {R1, MR3}, EMPTY}, - {"ld4.c.nc.nta", M, OpMXX6aHint (4, 0, 0, 0x26, 3), {R1, MR3}, EMPTY}, - {"ld8.c.nc", M, OpMXX6aHint (4, 0, 0, 0x27, 0), {R1, MR3}, EMPTY}, - {"ld8.c.nc.nt1", M, OpMXX6aHint (4, 0, 0, 0x27, 1), {R1, MR3}, EMPTY}, - {"ld8.c.nc.nta", M, OpMXX6aHint (4, 0, 0, 0x27, 3), {R1, MR3}, EMPTY}, - {"ld1.c.clr.acq", M, OpMXX6aHint (4, 0, 0, 0x28, 0), {R1, MR3}, EMPTY}, - {"ld1.c.clr.acq.nt1", M, OpMXX6aHint (4, 0, 0, 0x28, 1), {R1, MR3}, EMPTY}, - {"ld1.c.clr.acq.nta", M, OpMXX6aHint (4, 0, 0, 0x28, 3), {R1, MR3}, EMPTY}, - {"ld2.c.clr.acq", M, OpMXX6aHint (4, 0, 0, 0x29, 0), {R1, MR3}, EMPTY}, - {"ld2.c.clr.acq.nt1", M, OpMXX6aHint (4, 0, 0, 0x29, 1), {R1, MR3}, EMPTY}, - {"ld2.c.clr.acq.nta", M, OpMXX6aHint (4, 0, 0, 0x29, 3), {R1, MR3}, EMPTY}, - {"ld4.c.clr.acq", M, OpMXX6aHint (4, 0, 0, 0x2a, 0), {R1, MR3}, EMPTY}, - {"ld4.c.clr.acq.nt1", M, OpMXX6aHint (4, 0, 0, 0x2a, 1), {R1, MR3}, EMPTY}, - {"ld4.c.clr.acq.nta", M, OpMXX6aHint (4, 0, 0, 0x2a, 3), {R1, MR3}, EMPTY}, - {"ld8.c.clr.acq", M, OpMXX6aHint (4, 0, 0, 0x2b, 0), {R1, MR3}, EMPTY}, - {"ld8.c.clr.acq.nt1", M, OpMXX6aHint (4, 0, 0, 0x2b, 1), {R1, MR3}, EMPTY}, - {"ld8.c.clr.acq.nta", M, OpMXX6aHint (4, 0, 0, 0x2b, 3), {R1, MR3}, EMPTY}, - - /* Pseudo-op that generates ldxmov relocation. */ - {"ld8.mov", M, OpMXX6aHint (4, 0, 0, 0x03, 0), - {R1, MR3, IA64_OPND_LDXMOV}, EMPTY}, - - /* Integer load w/increment by register. */ -#define LDINCREG(c,h) M, OpMXX6aHint (4, 1, 0, c, h), {R1, MR3, R2}, POSTINC, 0, NULL - {"ld1", LDINCREG (0x00, 0)}, - {"ld1.nt1", LDINCREG (0x00, 1)}, - {"ld1.nta", LDINCREG (0x00, 3)}, - {"ld2", LDINCREG (0x01, 0)}, - {"ld2.nt1", LDINCREG (0x01, 1)}, - {"ld2.nta", LDINCREG (0x01, 3)}, - {"ld4", LDINCREG (0x02, 0)}, - {"ld4.nt1", LDINCREG (0x02, 1)}, - {"ld4.nta", LDINCREG (0x02, 3)}, - {"ld8", LDINCREG (0x03, 0)}, - {"ld8.nt1", LDINCREG (0x03, 1)}, - {"ld8.nta", LDINCREG (0x03, 3)}, - {"ld1.s", LDINCREG (0x04, 0)}, - {"ld1.s.nt1", LDINCREG (0x04, 1)}, - {"ld1.s.nta", LDINCREG (0x04, 3)}, - {"ld2.s", LDINCREG (0x05, 0)}, - {"ld2.s.nt1", LDINCREG (0x05, 1)}, - {"ld2.s.nta", LDINCREG (0x05, 3)}, - {"ld4.s", LDINCREG (0x06, 0)}, - {"ld4.s.nt1", LDINCREG (0x06, 1)}, - {"ld4.s.nta", LDINCREG (0x06, 3)}, - {"ld8.s", LDINCREG (0x07, 0)}, - {"ld8.s.nt1", LDINCREG (0x07, 1)}, - {"ld8.s.nta", LDINCREG (0x07, 3)}, - {"ld1.a", LDINCREG (0x08, 0)}, - {"ld1.a.nt1", LDINCREG (0x08, 1)}, - {"ld1.a.nta", LDINCREG (0x08, 3)}, - {"ld2.a", LDINCREG (0x09, 0)}, - {"ld2.a.nt1", LDINCREG (0x09, 1)}, - {"ld2.a.nta", LDINCREG (0x09, 3)}, - {"ld4.a", LDINCREG (0x0a, 0)}, - {"ld4.a.nt1", LDINCREG (0x0a, 1)}, - {"ld4.a.nta", LDINCREG (0x0a, 3)}, - {"ld8.a", LDINCREG (0x0b, 0)}, - {"ld8.a.nt1", LDINCREG (0x0b, 1)}, - {"ld8.a.nta", LDINCREG (0x0b, 3)}, - {"ld1.sa", LDINCREG (0x0c, 0)}, - {"ld1.sa.nt1", LDINCREG (0x0c, 1)}, - {"ld1.sa.nta", LDINCREG (0x0c, 3)}, - {"ld2.sa", LDINCREG (0x0d, 0)}, - {"ld2.sa.nt1", LDINCREG (0x0d, 1)}, - {"ld2.sa.nta", LDINCREG (0x0d, 3)}, - {"ld4.sa", LDINCREG (0x0e, 0)}, - {"ld4.sa.nt1", LDINCREG (0x0e, 1)}, - {"ld4.sa.nta", LDINCREG (0x0e, 3)}, - {"ld8.sa", LDINCREG (0x0f, 0)}, - {"ld8.sa.nt1", LDINCREG (0x0f, 1)}, - {"ld8.sa.nta", LDINCREG (0x0f, 3)}, - {"ld1.bias", LDINCREG (0x10, 0)}, - {"ld1.bias.nt1", LDINCREG (0x10, 1)}, - {"ld1.bias.nta", LDINCREG (0x10, 3)}, - {"ld2.bias", LDINCREG (0x11, 0)}, - {"ld2.bias.nt1", LDINCREG (0x11, 1)}, - {"ld2.bias.nta", LDINCREG (0x11, 3)}, - {"ld4.bias", LDINCREG (0x12, 0)}, - {"ld4.bias.nt1", LDINCREG (0x12, 1)}, - {"ld4.bias.nta", LDINCREG (0x12, 3)}, - {"ld8.bias", LDINCREG (0x13, 0)}, - {"ld8.bias.nt1", LDINCREG (0x13, 1)}, - {"ld8.bias.nta", LDINCREG (0x13, 3)}, - {"ld1.acq", LDINCREG (0x14, 0)}, - {"ld1.acq.nt1", LDINCREG (0x14, 1)}, - {"ld1.acq.nta", LDINCREG (0x14, 3)}, - {"ld2.acq", LDINCREG (0x15, 0)}, - {"ld2.acq.nt1", LDINCREG (0x15, 1)}, - {"ld2.acq.nta", LDINCREG (0x15, 3)}, - {"ld4.acq", LDINCREG (0x16, 0)}, - {"ld4.acq.nt1", LDINCREG (0x16, 1)}, - {"ld4.acq.nta", LDINCREG (0x16, 3)}, - {"ld8.acq", LDINCREG (0x17, 0)}, - {"ld8.acq.nt1", LDINCREG (0x17, 1)}, - {"ld8.acq.nta", LDINCREG (0x17, 3)}, - {"ld8.fill", LDINCREG (0x1b, 0)}, - {"ld8.fill.nt1", LDINCREG (0x1b, 1)}, - {"ld8.fill.nta", LDINCREG (0x1b, 3)}, - {"ld1.c.clr", LDINCREG (0x20, 0)}, - {"ld1.c.clr.nt1", LDINCREG (0x20, 1)}, - {"ld1.c.clr.nta", LDINCREG (0x20, 3)}, - {"ld2.c.clr", LDINCREG (0x21, 0)}, - {"ld2.c.clr.nt1", LDINCREG (0x21, 1)}, - {"ld2.c.clr.nta", LDINCREG (0x21, 3)}, - {"ld4.c.clr", LDINCREG (0x22, 0)}, - {"ld4.c.clr.nt1", LDINCREG (0x22, 1)}, - {"ld4.c.clr.nta", LDINCREG (0x22, 3)}, - {"ld8.c.clr", LDINCREG (0x23, 0)}, - {"ld8.c.clr.nt1", LDINCREG (0x23, 1)}, - {"ld8.c.clr.nta", LDINCREG (0x23, 3)}, - {"ld1.c.nc", LDINCREG (0x24, 0)}, - {"ld1.c.nc.nt1", LDINCREG (0x24, 1)}, - {"ld1.c.nc.nta", LDINCREG (0x24, 3)}, - {"ld2.c.nc", LDINCREG (0x25, 0)}, - {"ld2.c.nc.nt1", LDINCREG (0x25, 1)}, - {"ld2.c.nc.nta", LDINCREG (0x25, 3)}, - {"ld4.c.nc", LDINCREG (0x26, 0)}, - {"ld4.c.nc.nt1", LDINCREG (0x26, 1)}, - {"ld4.c.nc.nta", LDINCREG (0x26, 3)}, - {"ld8.c.nc", LDINCREG (0x27, 0)}, - {"ld8.c.nc.nt1", LDINCREG (0x27, 1)}, - {"ld8.c.nc.nta", LDINCREG (0x27, 3)}, - {"ld1.c.clr.acq", LDINCREG (0x28, 0)}, - {"ld1.c.clr.acq.nt1", LDINCREG (0x28, 1)}, - {"ld1.c.clr.acq.nta", LDINCREG (0x28, 3)}, - {"ld2.c.clr.acq", LDINCREG (0x29, 0)}, - {"ld2.c.clr.acq.nt1", LDINCREG (0x29, 1)}, - {"ld2.c.clr.acq.nta", LDINCREG (0x29, 3)}, - {"ld4.c.clr.acq", LDINCREG (0x2a, 0)}, - {"ld4.c.clr.acq.nt1", LDINCREG (0x2a, 1)}, - {"ld4.c.clr.acq.nta", LDINCREG (0x2a, 3)}, - {"ld8.c.clr.acq", LDINCREG (0x2b, 0)}, - {"ld8.c.clr.acq.nt1", LDINCREG (0x2b, 1)}, - {"ld8.c.clr.acq.nta", LDINCREG (0x2b, 3)}, -#undef LDINCREG - - {"st1", M, OpMXX6aHint (4, 0, 0, 0x30, 0), {MR3, R2}, EMPTY}, - {"st1.nta", M, OpMXX6aHint (4, 0, 0, 0x30, 3), {MR3, R2}, EMPTY}, - {"st2", M, OpMXX6aHint (4, 0, 0, 0x31, 0), {MR3, R2}, EMPTY}, - {"st2.nta", M, OpMXX6aHint (4, 0, 0, 0x31, 3), {MR3, R2}, EMPTY}, - {"st4", M, OpMXX6aHint (4, 0, 0, 0x32, 0), {MR3, R2}, EMPTY}, - {"st4.nta", M, OpMXX6aHint (4, 0, 0, 0x32, 3), {MR3, R2}, EMPTY}, - {"st8", M, OpMXX6aHint (4, 0, 0, 0x33, 0), {MR3, R2}, EMPTY}, - {"st8.nta", M, OpMXX6aHint (4, 0, 0, 0x33, 3), {MR3, R2}, EMPTY}, - {"st16", M, OpMXX6aHint (4, 0, 1, 0x30, 0), {MR3, R2, AR_CSD}, EMPTY}, - {"st16", M, OpMXX6aHint (4, 0, 1, 0x30, 0), {MR3, R2}, PSEUDO, 0, NULL}, - {"st16.nta", M, OpMXX6aHint (4, 0, 1, 0x30, 3), {MR3, R2, AR_CSD}, EMPTY}, - {"st16.nta", M, OpMXX6aHint (4, 0, 1, 0x30, 3), {MR3, R2}, PSEUDO, 0, NULL}, - {"st1.rel", M, OpMXX6aHint (4, 0, 0, 0x34, 0), {MR3, R2}, EMPTY}, - {"st1.rel.nta", M, OpMXX6aHint (4, 0, 0, 0x34, 3), {MR3, R2}, EMPTY}, - {"st2.rel", M, OpMXX6aHint (4, 0, 0, 0x35, 0), {MR3, R2}, EMPTY}, - {"st2.rel.nta", M, OpMXX6aHint (4, 0, 0, 0x35, 3), {MR3, R2}, EMPTY}, - {"st4.rel", M, OpMXX6aHint (4, 0, 0, 0x36, 0), {MR3, R2}, EMPTY}, - {"st4.rel.nta", M, OpMXX6aHint (4, 0, 0, 0x36, 3), {MR3, R2}, EMPTY}, - {"st8.rel", M, OpMXX6aHint (4, 0, 0, 0x37, 0), {MR3, R2}, EMPTY}, - {"st8.rel.nta", M, OpMXX6aHint (4, 0, 0, 0x37, 3), {MR3, R2}, EMPTY}, - {"st16.rel", M, OpMXX6aHint (4, 0, 1, 0x34, 0), {MR3, R2, AR_CSD}, EMPTY}, - {"st16.rel", M, OpMXX6aHint (4, 0, 1, 0x34, 0), {MR3, R2}, PSEUDO, 0, NULL}, - {"st16.rel.nta", M, OpMXX6aHint (4, 0, 1, 0x34, 3), {MR3, R2, AR_CSD}, EMPTY}, - {"st16.rel.nta", M, OpMXX6aHint (4, 0, 1, 0x34, 3), {MR3, R2}, PSEUDO, 0, NULL}, - {"st8.spill", M, OpMXX6aHint (4, 0, 0, 0x3b, 0), {MR3, R2}, EMPTY}, - {"st8.spill.nta", M, OpMXX6aHint (4, 0, 0, 0x3b, 3), {MR3, R2}, EMPTY}, - -#define CMPXCHG(c,h) M, OpMXX6aHint (4, 0, 1, c, h), {R1, MR3, R2, AR_CCV}, EMPTY -#define CMPXCHG_P(c,h) M, OpMXX6aHint (4, 0, 1, c, h), {R1, MR3, R2}, PSEUDO, 0, NULL -#define CMPXCHG16(c,h) M, OpMXX6aHint (4, 0, 1, c, h), {R1, MR3, R2, AR_CSD, AR_CCV}, EMPTY -#define CMPXCHG16_P(c,h) M, OpMXX6aHint (4, 0, 1, c, h), {R1, MR3, R2}, PSEUDO, 0, NULL -#define CMPXCHG_acq 0 -#define CMPXCHG_rel 4 -#define CMPXCHG_1 0 -#define CMPXCHG_2 1 -#define CMPXCHG_4 2 -#define CMPXCHG_8 3 -#define CMPXCHGn(n, s) \ - {"cmpxchg"#n"."#s, CMPXCHG (CMPXCHG_##n|CMPXCHG_##s, 0)}, \ - {"cmpxchg"#n"."#s, CMPXCHG_P (CMPXCHG_##n|CMPXCHG_##s, 0)}, \ - {"cmpxchg"#n"."#s".nt1", CMPXCHG (CMPXCHG_##n|CMPXCHG_##s, 1)}, \ - {"cmpxchg"#n"."#s".nt1", CMPXCHG_P (CMPXCHG_##n|CMPXCHG_##s, 1)}, \ - {"cmpxchg"#n"."#s".nta", CMPXCHG (CMPXCHG_##n|CMPXCHG_##s, 3)}, \ - {"cmpxchg"#n"."#s".nta", CMPXCHG_P (CMPXCHG_##n|CMPXCHG_##s, 3)} -#define CMP8XCHG16(s) \ - {"cmp8xchg16."#s, CMPXCHG16 (0x20|CMPXCHG_##s, 0)}, \ - {"cmp8xchg16."#s, CMPXCHG16_P (0x20|CMPXCHG_##s, 0)}, \ - {"cmp8xchg16."#s".nt1", CMPXCHG16 (0x20|CMPXCHG_##s, 1)}, \ - {"cmp8xchg16."#s".nt1", CMPXCHG16_P (0x20|CMPXCHG_##s, 1)}, \ - {"cmp8xchg16."#s".nta", CMPXCHG16 (0x20|CMPXCHG_##s, 3)}, \ - {"cmp8xchg16."#s".nta", CMPXCHG16_P (0x20|CMPXCHG_##s, 3)} -#define CMPXCHG_ALL(s) CMPXCHGn(1, s), \ - CMPXCHGn(2, s), \ - CMPXCHGn(4, s), \ - CMPXCHGn(8, s), \ - CMP8XCHG16(s) - CMPXCHG_ALL(acq), - CMPXCHG_ALL(rel), -#undef CMPXCHG -#undef CMPXCHG_P -#undef CMPXCHG16 -#undef CMPXCHG16_P -#undef CMPXCHG_acq -#undef CMPXCHG_rel -#undef CMPXCHG_1 -#undef CMPXCHG_2 -#undef CMPXCHG_4 -#undef CMPXCHG_8 -#undef CMPXCHGn -#undef CMPXCHG16 -#undef CMPXCHG_ALL - {"xchg1", M, OpMXX6aHint (4, 0, 1, 0x08, 0), {R1, MR3, R2}, EMPTY}, - {"xchg1.nt1", M, OpMXX6aHint (4, 0, 1, 0x08, 1), {R1, MR3, R2}, EMPTY}, - {"xchg1.nta", M, OpMXX6aHint (4, 0, 1, 0x08, 3), {R1, MR3, R2}, EMPTY}, - {"xchg2", M, OpMXX6aHint (4, 0, 1, 0x09, 0), {R1, MR3, R2}, EMPTY}, - {"xchg2.nt1", M, OpMXX6aHint (4, 0, 1, 0x09, 1), {R1, MR3, R2}, EMPTY}, - {"xchg2.nta", M, OpMXX6aHint (4, 0, 1, 0x09, 3), {R1, MR3, R2}, EMPTY}, - {"xchg4", M, OpMXX6aHint (4, 0, 1, 0x0a, 0), {R1, MR3, R2}, EMPTY}, - {"xchg4.nt1", M, OpMXX6aHint (4, 0, 1, 0x0a, 1), {R1, MR3, R2}, EMPTY}, - {"xchg4.nta", M, OpMXX6aHint (4, 0, 1, 0x0a, 3), {R1, MR3, R2}, EMPTY}, - {"xchg8", M, OpMXX6aHint (4, 0, 1, 0x0b, 0), {R1, MR3, R2}, EMPTY}, - {"xchg8.nt1", M, OpMXX6aHint (4, 0, 1, 0x0b, 1), {R1, MR3, R2}, EMPTY}, - {"xchg8.nta", M, OpMXX6aHint (4, 0, 1, 0x0b, 3), {R1, MR3, R2}, EMPTY}, - - {"fetchadd4.acq", M, OpMXX6aHint (4, 0, 1, 0x12, 0), {R1, MR3, INC3}, EMPTY}, - {"fetchadd4.acq.nt1", M, OpMXX6aHint (4, 0, 1, 0x12, 1), {R1, MR3, INC3}, EMPTY}, - {"fetchadd4.acq.nta", M, OpMXX6aHint (4, 0, 1, 0x12, 3), {R1, MR3, INC3}, EMPTY}, - {"fetchadd8.acq", M, OpMXX6aHint (4, 0, 1, 0x13, 0), {R1, MR3, INC3}, EMPTY}, - {"fetchadd8.acq.nt1", M, OpMXX6aHint (4, 0, 1, 0x13, 1), {R1, MR3, INC3}, EMPTY}, - {"fetchadd8.acq.nta", M, OpMXX6aHint (4, 0, 1, 0x13, 3), {R1, MR3, INC3}, EMPTY}, - {"fetchadd4.rel", M, OpMXX6aHint (4, 0, 1, 0x16, 0), {R1, MR3, INC3}, EMPTY}, - {"fetchadd4.rel.nt1", M, OpMXX6aHint (4, 0, 1, 0x16, 1), {R1, MR3, INC3}, EMPTY}, - {"fetchadd4.rel.nta", M, OpMXX6aHint (4, 0, 1, 0x16, 3), {R1, MR3, INC3}, EMPTY}, - {"fetchadd8.rel", M, OpMXX6aHint (4, 0, 1, 0x17, 0), {R1, MR3, INC3}, EMPTY}, - {"fetchadd8.rel.nt1", M, OpMXX6aHint (4, 0, 1, 0x17, 1), {R1, MR3, INC3}, EMPTY}, - {"fetchadd8.rel.nta", M, OpMXX6aHint (4, 0, 1, 0x17, 3), {R1, MR3, INC3}, EMPTY}, - - {"getf.sig", M, OpMXX6a (4, 0, 1, 0x1c), {R1, F2}, EMPTY}, - {"getf.exp", M, OpMXX6a (4, 0, 1, 0x1d), {R1, F2}, EMPTY}, - {"getf.s", M, OpMXX6a (4, 0, 1, 0x1e), {R1, F2}, EMPTY}, - {"getf.d", M, OpMXX6a (4, 0, 1, 0x1f), {R1, F2}, EMPTY}, - - /* Integer load w/increment by immediate. */ -#define LDINCIMMED(c,h) M, OpX6aHint (5, c, h), {R1, MR3, IMM9b}, POSTINC, 0, NULL - {"ld1", LDINCIMMED (0x00, 0)}, - {"ld1.nt1", LDINCIMMED (0x00, 1)}, - {"ld1.nta", LDINCIMMED (0x00, 3)}, - {"ld2", LDINCIMMED (0x01, 0)}, - {"ld2.nt1", LDINCIMMED (0x01, 1)}, - {"ld2.nta", LDINCIMMED (0x01, 3)}, - {"ld4", LDINCIMMED (0x02, 0)}, - {"ld4.nt1", LDINCIMMED (0x02, 1)}, - {"ld4.nta", LDINCIMMED (0x02, 3)}, - {"ld8", LDINCIMMED (0x03, 0)}, - {"ld8.nt1", LDINCIMMED (0x03, 1)}, - {"ld8.nta", LDINCIMMED (0x03, 3)}, - {"ld1.s", LDINCIMMED (0x04, 0)}, - {"ld1.s.nt1", LDINCIMMED (0x04, 1)}, - {"ld1.s.nta", LDINCIMMED (0x04, 3)}, - {"ld2.s", LDINCIMMED (0x05, 0)}, - {"ld2.s.nt1", LDINCIMMED (0x05, 1)}, - {"ld2.s.nta", LDINCIMMED (0x05, 3)}, - {"ld4.s", LDINCIMMED (0x06, 0)}, - {"ld4.s.nt1", LDINCIMMED (0x06, 1)}, - {"ld4.s.nta", LDINCIMMED (0x06, 3)}, - {"ld8.s", LDINCIMMED (0x07, 0)}, - {"ld8.s.nt1", LDINCIMMED (0x07, 1)}, - {"ld8.s.nta", LDINCIMMED (0x07, 3)}, - {"ld1.a", LDINCIMMED (0x08, 0)}, - {"ld1.a.nt1", LDINCIMMED (0x08, 1)}, - {"ld1.a.nta", LDINCIMMED (0x08, 3)}, - {"ld2.a", LDINCIMMED (0x09, 0)}, - {"ld2.a.nt1", LDINCIMMED (0x09, 1)}, - {"ld2.a.nta", LDINCIMMED (0x09, 3)}, - {"ld4.a", LDINCIMMED (0x0a, 0)}, - {"ld4.a.nt1", LDINCIMMED (0x0a, 1)}, - {"ld4.a.nta", LDINCIMMED (0x0a, 3)}, - {"ld8.a", LDINCIMMED (0x0b, 0)}, - {"ld8.a.nt1", LDINCIMMED (0x0b, 1)}, - {"ld8.a.nta", LDINCIMMED (0x0b, 3)}, - {"ld1.sa", LDINCIMMED (0x0c, 0)}, - {"ld1.sa.nt1", LDINCIMMED (0x0c, 1)}, - {"ld1.sa.nta", LDINCIMMED (0x0c, 3)}, - {"ld2.sa", LDINCIMMED (0x0d, 0)}, - {"ld2.sa.nt1", LDINCIMMED (0x0d, 1)}, - {"ld2.sa.nta", LDINCIMMED (0x0d, 3)}, - {"ld4.sa", LDINCIMMED (0x0e, 0)}, - {"ld4.sa.nt1", LDINCIMMED (0x0e, 1)}, - {"ld4.sa.nta", LDINCIMMED (0x0e, 3)}, - {"ld8.sa", LDINCIMMED (0x0f, 0)}, - {"ld8.sa.nt1", LDINCIMMED (0x0f, 1)}, - {"ld8.sa.nta", LDINCIMMED (0x0f, 3)}, - {"ld1.bias", LDINCIMMED (0x10, 0)}, - {"ld1.bias.nt1", LDINCIMMED (0x10, 1)}, - {"ld1.bias.nta", LDINCIMMED (0x10, 3)}, - {"ld2.bias", LDINCIMMED (0x11, 0)}, - {"ld2.bias.nt1", LDINCIMMED (0x11, 1)}, - {"ld2.bias.nta", LDINCIMMED (0x11, 3)}, - {"ld4.bias", LDINCIMMED (0x12, 0)}, - {"ld4.bias.nt1", LDINCIMMED (0x12, 1)}, - {"ld4.bias.nta", LDINCIMMED (0x12, 3)}, - {"ld8.bias", LDINCIMMED (0x13, 0)}, - {"ld8.bias.nt1", LDINCIMMED (0x13, 1)}, - {"ld8.bias.nta", LDINCIMMED (0x13, 3)}, - {"ld1.acq", LDINCIMMED (0x14, 0)}, - {"ld1.acq.nt1", LDINCIMMED (0x14, 1)}, - {"ld1.acq.nta", LDINCIMMED (0x14, 3)}, - {"ld2.acq", LDINCIMMED (0x15, 0)}, - {"ld2.acq.nt1", LDINCIMMED (0x15, 1)}, - {"ld2.acq.nta", LDINCIMMED (0x15, 3)}, - {"ld4.acq", LDINCIMMED (0x16, 0)}, - {"ld4.acq.nt1", LDINCIMMED (0x16, 1)}, - {"ld4.acq.nta", LDINCIMMED (0x16, 3)}, - {"ld8.acq", LDINCIMMED (0x17, 0)}, - {"ld8.acq.nt1", LDINCIMMED (0x17, 1)}, - {"ld8.acq.nta", LDINCIMMED (0x17, 3)}, - {"ld8.fill", LDINCIMMED (0x1b, 0)}, - {"ld8.fill.nt1", LDINCIMMED (0x1b, 1)}, - {"ld8.fill.nta", LDINCIMMED (0x1b, 3)}, - {"ld1.c.clr", LDINCIMMED (0x20, 0)}, - {"ld1.c.clr.nt1", LDINCIMMED (0x20, 1)}, - {"ld1.c.clr.nta", LDINCIMMED (0x20, 3)}, - {"ld2.c.clr", LDINCIMMED (0x21, 0)}, - {"ld2.c.clr.nt1", LDINCIMMED (0x21, 1)}, - {"ld2.c.clr.nta", LDINCIMMED (0x21, 3)}, - {"ld4.c.clr", LDINCIMMED (0x22, 0)}, - {"ld4.c.clr.nt1", LDINCIMMED (0x22, 1)}, - {"ld4.c.clr.nta", LDINCIMMED (0x22, 3)}, - {"ld8.c.clr", LDINCIMMED (0x23, 0)}, - {"ld8.c.clr.nt1", LDINCIMMED (0x23, 1)}, - {"ld8.c.clr.nta", LDINCIMMED (0x23, 3)}, - {"ld1.c.nc", LDINCIMMED (0x24, 0)}, - {"ld1.c.nc.nt1", LDINCIMMED (0x24, 1)}, - {"ld1.c.nc.nta", LDINCIMMED (0x24, 3)}, - {"ld2.c.nc", LDINCIMMED (0x25, 0)}, - {"ld2.c.nc.nt1", LDINCIMMED (0x25, 1)}, - {"ld2.c.nc.nta", LDINCIMMED (0x25, 3)}, - {"ld4.c.nc", LDINCIMMED (0x26, 0)}, - {"ld4.c.nc.nt1", LDINCIMMED (0x26, 1)}, - {"ld4.c.nc.nta", LDINCIMMED (0x26, 3)}, - {"ld8.c.nc", LDINCIMMED (0x27, 0)}, - {"ld8.c.nc.nt1", LDINCIMMED (0x27, 1)}, - {"ld8.c.nc.nta", LDINCIMMED (0x27, 3)}, - {"ld1.c.clr.acq", LDINCIMMED (0x28, 0)}, - {"ld1.c.clr.acq.nt1", LDINCIMMED (0x28, 1)}, - {"ld1.c.clr.acq.nta", LDINCIMMED (0x28, 3)}, - {"ld2.c.clr.acq", LDINCIMMED (0x29, 0)}, - {"ld2.c.clr.acq.nt1", LDINCIMMED (0x29, 1)}, - {"ld2.c.clr.acq.nta", LDINCIMMED (0x29, 3)}, - {"ld4.c.clr.acq", LDINCIMMED (0x2a, 0)}, - {"ld4.c.clr.acq.nt1", LDINCIMMED (0x2a, 1)}, - {"ld4.c.clr.acq.nta", LDINCIMMED (0x2a, 3)}, - {"ld8.c.clr.acq", LDINCIMMED (0x2b, 0)}, - {"ld8.c.clr.acq.nt1", LDINCIMMED (0x2b, 1)}, - {"ld8.c.clr.acq.nta", LDINCIMMED (0x2b, 3)}, -#undef LDINCIMMED - - /* Store w/increment by immediate. */ -#define STINCIMMED(c,h) M, OpX6aHint (5, c, h), {MR3, R2, IMM9a}, POSTINC, 0, NULL - {"st1", STINCIMMED (0x30, 0)}, - {"st1.nta", STINCIMMED (0x30, 3)}, - {"st2", STINCIMMED (0x31, 0)}, - {"st2.nta", STINCIMMED (0x31, 3)}, - {"st4", STINCIMMED (0x32, 0)}, - {"st4.nta", STINCIMMED (0x32, 3)}, - {"st8", STINCIMMED (0x33, 0)}, - {"st8.nta", STINCIMMED (0x33, 3)}, - {"st1.rel", STINCIMMED (0x34, 0)}, - {"st1.rel.nta", STINCIMMED (0x34, 3)}, - {"st2.rel", STINCIMMED (0x35, 0)}, - {"st2.rel.nta", STINCIMMED (0x35, 3)}, - {"st4.rel", STINCIMMED (0x36, 0)}, - {"st4.rel.nta", STINCIMMED (0x36, 3)}, - {"st8.rel", STINCIMMED (0x37, 0)}, - {"st8.rel.nta", STINCIMMED (0x37, 3)}, - {"st8.spill", STINCIMMED (0x3b, 0)}, - {"st8.spill.nta", STINCIMMED (0x3b, 3)}, -#undef STINCIMMED - - /* Floating-point load. */ - {"ldfs", M, OpMXX6aHint (6, 0, 0, 0x02, 0), {F1, MR3}, EMPTY}, - {"ldfs.nt1", M, OpMXX6aHint (6, 0, 0, 0x02, 1), {F1, MR3}, EMPTY}, - {"ldfs.nta", M, OpMXX6aHint (6, 0, 0, 0x02, 3), {F1, MR3}, EMPTY}, - {"ldfd", M, OpMXX6aHint (6, 0, 0, 0x03, 0), {F1, MR3}, EMPTY}, - {"ldfd.nt1", M, OpMXX6aHint (6, 0, 0, 0x03, 1), {F1, MR3}, EMPTY}, - {"ldfd.nta", M, OpMXX6aHint (6, 0, 0, 0x03, 3), {F1, MR3}, EMPTY}, - {"ldf8", M, OpMXX6aHint (6, 0, 0, 0x01, 0), {F1, MR3}, EMPTY}, - {"ldf8.nt1", M, OpMXX6aHint (6, 0, 0, 0x01, 1), {F1, MR3}, EMPTY}, - {"ldf8.nta", M, OpMXX6aHint (6, 0, 0, 0x01, 3), {F1, MR3}, EMPTY}, - {"ldfe", M, OpMXX6aHint (6, 0, 0, 0x00, 0), {F1, MR3}, EMPTY}, - {"ldfe.nt1", M, OpMXX6aHint (6, 0, 0, 0x00, 1), {F1, MR3}, EMPTY}, - {"ldfe.nta", M, OpMXX6aHint (6, 0, 0, 0x00, 3), {F1, MR3}, EMPTY}, - {"ldfs.s", M, OpMXX6aHint (6, 0, 0, 0x06, 0), {F1, MR3}, EMPTY}, - {"ldfs.s.nt1", M, OpMXX6aHint (6, 0, 0, 0x06, 1), {F1, MR3}, EMPTY}, - {"ldfs.s.nta", M, OpMXX6aHint (6, 0, 0, 0x06, 3), {F1, MR3}, EMPTY}, - {"ldfd.s", M, OpMXX6aHint (6, 0, 0, 0x07, 0), {F1, MR3}, EMPTY}, - {"ldfd.s.nt1", M, OpMXX6aHint (6, 0, 0, 0x07, 1), {F1, MR3}, EMPTY}, - {"ldfd.s.nta", M, OpMXX6aHint (6, 0, 0, 0x07, 3), {F1, MR3}, EMPTY}, - {"ldf8.s", M, OpMXX6aHint (6, 0, 0, 0x05, 0), {F1, MR3}, EMPTY}, - {"ldf8.s.nt1", M, OpMXX6aHint (6, 0, 0, 0x05, 1), {F1, MR3}, EMPTY}, - {"ldf8.s.nta", M, OpMXX6aHint (6, 0, 0, 0x05, 3), {F1, MR3}, EMPTY}, - {"ldfe.s", M, OpMXX6aHint (6, 0, 0, 0x04, 0), {F1, MR3}, EMPTY}, - {"ldfe.s.nt1", M, OpMXX6aHint (6, 0, 0, 0x04, 1), {F1, MR3}, EMPTY}, - {"ldfe.s.nta", M, OpMXX6aHint (6, 0, 0, 0x04, 3), {F1, MR3}, EMPTY}, - {"ldfs.a", M, OpMXX6aHint (6, 0, 0, 0x0a, 0), {F1, MR3}, EMPTY}, - {"ldfs.a.nt1", M, OpMXX6aHint (6, 0, 0, 0x0a, 1), {F1, MR3}, EMPTY}, - {"ldfs.a.nta", M, OpMXX6aHint (6, 0, 0, 0x0a, 3), {F1, MR3}, EMPTY}, - {"ldfd.a", M, OpMXX6aHint (6, 0, 0, 0x0b, 0), {F1, MR3}, EMPTY}, - {"ldfd.a.nt1", M, OpMXX6aHint (6, 0, 0, 0x0b, 1), {F1, MR3}, EMPTY}, - {"ldfd.a.nta", M, OpMXX6aHint (6, 0, 0, 0x0b, 3), {F1, MR3}, EMPTY}, - {"ldf8.a", M, OpMXX6aHint (6, 0, 0, 0x09, 0), {F1, MR3}, EMPTY}, - {"ldf8.a.nt1", M, OpMXX6aHint (6, 0, 0, 0x09, 1), {F1, MR3}, EMPTY}, - {"ldf8.a.nta", M, OpMXX6aHint (6, 0, 0, 0x09, 3), {F1, MR3}, EMPTY}, - {"ldfe.a", M, OpMXX6aHint (6, 0, 0, 0x08, 0), {F1, MR3}, EMPTY}, - {"ldfe.a.nt1", M, OpMXX6aHint (6, 0, 0, 0x08, 1), {F1, MR3}, EMPTY}, - {"ldfe.a.nta", M, OpMXX6aHint (6, 0, 0, 0x08, 3), {F1, MR3}, EMPTY}, - {"ldfs.sa", M, OpMXX6aHint (6, 0, 0, 0x0e, 0), {F1, MR3}, EMPTY}, - {"ldfs.sa.nt1", M, OpMXX6aHint (6, 0, 0, 0x0e, 1), {F1, MR3}, EMPTY}, - {"ldfs.sa.nta", M, OpMXX6aHint (6, 0, 0, 0x0e, 3), {F1, MR3}, EMPTY}, - {"ldfd.sa", M, OpMXX6aHint (6, 0, 0, 0x0f, 0), {F1, MR3}, EMPTY}, - {"ldfd.sa.nt1", M, OpMXX6aHint (6, 0, 0, 0x0f, 1), {F1, MR3}, EMPTY}, - {"ldfd.sa.nta", M, OpMXX6aHint (6, 0, 0, 0x0f, 3), {F1, MR3}, EMPTY}, - {"ldf8.sa", M, OpMXX6aHint (6, 0, 0, 0x0d, 0), {F1, MR3}, EMPTY}, - {"ldf8.sa.nt1", M, OpMXX6aHint (6, 0, 0, 0x0d, 1), {F1, MR3}, EMPTY}, - {"ldf8.sa.nta", M, OpMXX6aHint (6, 0, 0, 0x0d, 3), {F1, MR3}, EMPTY}, - {"ldfe.sa", M, OpMXX6aHint (6, 0, 0, 0x0c, 0), {F1, MR3}, EMPTY}, - {"ldfe.sa.nt1", M, OpMXX6aHint (6, 0, 0, 0x0c, 1), {F1, MR3}, EMPTY}, - {"ldfe.sa.nta", M, OpMXX6aHint (6, 0, 0, 0x0c, 3), {F1, MR3}, EMPTY}, - {"ldf.fill", M, OpMXX6aHint (6, 0, 0, 0x1b, 0), {F1, MR3}, EMPTY}, - {"ldf.fill.nt1", M, OpMXX6aHint (6, 0, 0, 0x1b, 1), {F1, MR3}, EMPTY}, - {"ldf.fill.nta", M, OpMXX6aHint (6, 0, 0, 0x1b, 3), {F1, MR3}, EMPTY}, - {"ldfs.c.clr", M, OpMXX6aHint (6, 0, 0, 0x22, 0), {F1, MR3}, EMPTY}, - {"ldfs.c.clr.nt1", M, OpMXX6aHint (6, 0, 0, 0x22, 1), {F1, MR3}, EMPTY}, - {"ldfs.c.clr.nta", M, OpMXX6aHint (6, 0, 0, 0x22, 3), {F1, MR3}, EMPTY}, - {"ldfd.c.clr", M, OpMXX6aHint (6, 0, 0, 0x23, 0), {F1, MR3}, EMPTY}, - {"ldfd.c.clr.nt1", M, OpMXX6aHint (6, 0, 0, 0x23, 1), {F1, MR3}, EMPTY}, - {"ldfd.c.clr.nta", M, OpMXX6aHint (6, 0, 0, 0x23, 3), {F1, MR3}, EMPTY}, - {"ldf8.c.clr", M, OpMXX6aHint (6, 0, 0, 0x21, 0), {F1, MR3}, EMPTY}, - {"ldf8.c.clr.nt1", M, OpMXX6aHint (6, 0, 0, 0x21, 1), {F1, MR3}, EMPTY}, - {"ldf8.c.clr.nta", M, OpMXX6aHint (6, 0, 0, 0x21, 3), {F1, MR3}, EMPTY}, - {"ldfe.c.clr", M, OpMXX6aHint (6, 0, 0, 0x20, 0), {F1, MR3}, EMPTY}, - {"ldfe.c.clr.nt1", M, OpMXX6aHint (6, 0, 0, 0x20, 1), {F1, MR3}, EMPTY}, - {"ldfe.c.clr.nta", M, OpMXX6aHint (6, 0, 0, 0x20, 3), {F1, MR3}, EMPTY}, - {"ldfs.c.nc", M, OpMXX6aHint (6, 0, 0, 0x26, 0), {F1, MR3}, EMPTY}, - {"ldfs.c.nc.nt1", M, OpMXX6aHint (6, 0, 0, 0x26, 1), {F1, MR3}, EMPTY}, - {"ldfs.c.nc.nta", M, OpMXX6aHint (6, 0, 0, 0x26, 3), {F1, MR3}, EMPTY}, - {"ldfd.c.nc", M, OpMXX6aHint (6, 0, 0, 0x27, 0), {F1, MR3}, EMPTY}, - {"ldfd.c.nc.nt1", M, OpMXX6aHint (6, 0, 0, 0x27, 1), {F1, MR3}, EMPTY}, - {"ldfd.c.nc.nta", M, OpMXX6aHint (6, 0, 0, 0x27, 3), {F1, MR3}, EMPTY}, - {"ldf8.c.nc", M, OpMXX6aHint (6, 0, 0, 0x25, 0), {F1, MR3}, EMPTY}, - {"ldf8.c.nc.nt1", M, OpMXX6aHint (6, 0, 0, 0x25, 1), {F1, MR3}, EMPTY}, - {"ldf8.c.nc.nta", M, OpMXX6aHint (6, 0, 0, 0x25, 3), {F1, MR3}, EMPTY}, - {"ldfe.c.nc", M, OpMXX6aHint (6, 0, 0, 0x24, 0), {F1, MR3}, EMPTY}, - {"ldfe.c.nc.nt1", M, OpMXX6aHint (6, 0, 0, 0x24, 1), {F1, MR3}, EMPTY}, - {"ldfe.c.nc.nta", M, OpMXX6aHint (6, 0, 0, 0x24, 3), {F1, MR3}, EMPTY}, - - /* Floating-point load w/increment by register. */ -#define FLDINCREG(c,h) M, OpMXX6aHint (6, 1, 0, c, h), {F1, MR3, R2}, POSTINC, 0, NULL - {"ldfs", FLDINCREG (0x02, 0)}, - {"ldfs.nt1", FLDINCREG (0x02, 1)}, - {"ldfs.nta", FLDINCREG (0x02, 3)}, - {"ldfd", FLDINCREG (0x03, 0)}, - {"ldfd.nt1", FLDINCREG (0x03, 1)}, - {"ldfd.nta", FLDINCREG (0x03, 3)}, - {"ldf8", FLDINCREG (0x01, 0)}, - {"ldf8.nt1", FLDINCREG (0x01, 1)}, - {"ldf8.nta", FLDINCREG (0x01, 3)}, - {"ldfe", FLDINCREG (0x00, 0)}, - {"ldfe.nt1", FLDINCREG (0x00, 1)}, - {"ldfe.nta", FLDINCREG (0x00, 3)}, - {"ldfs.s", FLDINCREG (0x06, 0)}, - {"ldfs.s.nt1", FLDINCREG (0x06, 1)}, - {"ldfs.s.nta", FLDINCREG (0x06, 3)}, - {"ldfd.s", FLDINCREG (0x07, 0)}, - {"ldfd.s.nt1", FLDINCREG (0x07, 1)}, - {"ldfd.s.nta", FLDINCREG (0x07, 3)}, - {"ldf8.s", FLDINCREG (0x05, 0)}, - {"ldf8.s.nt1", FLDINCREG (0x05, 1)}, - {"ldf8.s.nta", FLDINCREG (0x05, 3)}, - {"ldfe.s", FLDINCREG (0x04, 0)}, - {"ldfe.s.nt1", FLDINCREG (0x04, 1)}, - {"ldfe.s.nta", FLDINCREG (0x04, 3)}, - {"ldfs.a", FLDINCREG (0x0a, 0)}, - {"ldfs.a.nt1", FLDINCREG (0x0a, 1)}, - {"ldfs.a.nta", FLDINCREG (0x0a, 3)}, - {"ldfd.a", FLDINCREG (0x0b, 0)}, - {"ldfd.a.nt1", FLDINCREG (0x0b, 1)}, - {"ldfd.a.nta", FLDINCREG (0x0b, 3)}, - {"ldf8.a", FLDINCREG (0x09, 0)}, - {"ldf8.a.nt1", FLDINCREG (0x09, 1)}, - {"ldf8.a.nta", FLDINCREG (0x09, 3)}, - {"ldfe.a", FLDINCREG (0x08, 0)}, - {"ldfe.a.nt1", FLDINCREG (0x08, 1)}, - {"ldfe.a.nta", FLDINCREG (0x08, 3)}, - {"ldfs.sa", FLDINCREG (0x0e, 0)}, - {"ldfs.sa.nt1", FLDINCREG (0x0e, 1)}, - {"ldfs.sa.nta", FLDINCREG (0x0e, 3)}, - {"ldfd.sa", FLDINCREG (0x0f, 0)}, - {"ldfd.sa.nt1", FLDINCREG (0x0f, 1)}, - {"ldfd.sa.nta", FLDINCREG (0x0f, 3)}, - {"ldf8.sa", FLDINCREG (0x0d, 0)}, - {"ldf8.sa.nt1", FLDINCREG (0x0d, 1)}, - {"ldf8.sa.nta", FLDINCREG (0x0d, 3)}, - {"ldfe.sa", FLDINCREG (0x0c, 0)}, - {"ldfe.sa.nt1", FLDINCREG (0x0c, 1)}, - {"ldfe.sa.nta", FLDINCREG (0x0c, 3)}, - {"ldf.fill", FLDINCREG (0x1b, 0)}, - {"ldf.fill.nt1", FLDINCREG (0x1b, 1)}, - {"ldf.fill.nta", FLDINCREG (0x1b, 3)}, - {"ldfs.c.clr", FLDINCREG (0x22, 0)}, - {"ldfs.c.clr.nt1", FLDINCREG (0x22, 1)}, - {"ldfs.c.clr.nta", FLDINCREG (0x22, 3)}, - {"ldfd.c.clr", FLDINCREG (0x23, 0)}, - {"ldfd.c.clr.nt1", FLDINCREG (0x23, 1)}, - {"ldfd.c.clr.nta", FLDINCREG (0x23, 3)}, - {"ldf8.c.clr", FLDINCREG (0x21, 0)}, - {"ldf8.c.clr.nt1", FLDINCREG (0x21, 1)}, - {"ldf8.c.clr.nta", FLDINCREG (0x21, 3)}, - {"ldfe.c.clr", FLDINCREG (0x20, 0)}, - {"ldfe.c.clr.nt1", FLDINCREG (0x20, 1)}, - {"ldfe.c.clr.nta", FLDINCREG (0x20, 3)}, - {"ldfs.c.nc", FLDINCREG (0x26, 0)}, - {"ldfs.c.nc.nt1", FLDINCREG (0x26, 1)}, - {"ldfs.c.nc.nta", FLDINCREG (0x26, 3)}, - {"ldfd.c.nc", FLDINCREG (0x27, 0)}, - {"ldfd.c.nc.nt1", FLDINCREG (0x27, 1)}, - {"ldfd.c.nc.nta", FLDINCREG (0x27, 3)}, - {"ldf8.c.nc", FLDINCREG (0x25, 0)}, - {"ldf8.c.nc.nt1", FLDINCREG (0x25, 1)}, - {"ldf8.c.nc.nta", FLDINCREG (0x25, 3)}, - {"ldfe.c.nc", FLDINCREG (0x24, 0)}, - {"ldfe.c.nc.nt1", FLDINCREG (0x24, 1)}, - {"ldfe.c.nc.nta", FLDINCREG (0x24, 3)}, -#undef FLDINCREG - - /* Floating-point store. */ - {"stfs", M, OpMXX6aHint (6, 0, 0, 0x32, 0), {MR3, F2}, EMPTY}, - {"stfs.nta", M, OpMXX6aHint (6, 0, 0, 0x32, 3), {MR3, F2}, EMPTY}, - {"stfd", M, OpMXX6aHint (6, 0, 0, 0x33, 0), {MR3, F2}, EMPTY}, - {"stfd.nta", M, OpMXX6aHint (6, 0, 0, 0x33, 3), {MR3, F2}, EMPTY}, - {"stf8", M, OpMXX6aHint (6, 0, 0, 0x31, 0), {MR3, F2}, EMPTY}, - {"stf8.nta", M, OpMXX6aHint (6, 0, 0, 0x31, 3), {MR3, F2}, EMPTY}, - {"stfe", M, OpMXX6aHint (6, 0, 0, 0x30, 0), {MR3, F2}, EMPTY}, - {"stfe.nta", M, OpMXX6aHint (6, 0, 0, 0x30, 3), {MR3, F2}, EMPTY}, - {"stf.spill", M, OpMXX6aHint (6, 0, 0, 0x3b, 0), {MR3, F2}, EMPTY}, - {"stf.spill.nta", M, OpMXX6aHint (6, 0, 0, 0x3b, 3), {MR3, F2}, EMPTY}, - - /* Floating-point load pair. */ - {"ldfps", M2, OpMXX6aHint (6, 0, 1, 0x02, 0), {F1, F2, MR3}, EMPTY}, - {"ldfps.nt1", M2, OpMXX6aHint (6, 0, 1, 0x02, 1), {F1, F2, MR3}, EMPTY}, - {"ldfps.nta", M2, OpMXX6aHint (6, 0, 1, 0x02, 3), {F1, F2, MR3}, EMPTY}, - {"ldfpd", M2, OpMXX6aHint (6, 0, 1, 0x03, 0), {F1, F2, MR3}, EMPTY}, - {"ldfpd.nt1", M2, OpMXX6aHint (6, 0, 1, 0x03, 1), {F1, F2, MR3}, EMPTY}, - {"ldfpd.nta", M2, OpMXX6aHint (6, 0, 1, 0x03, 3), {F1, F2, MR3}, EMPTY}, - {"ldfp8", M2, OpMXX6aHint (6, 0, 1, 0x01, 0), {F1, F2, MR3}, EMPTY}, - {"ldfp8.nt1", M2, OpMXX6aHint (6, 0, 1, 0x01, 1), {F1, F2, MR3}, EMPTY}, - {"ldfp8.nta", M2, OpMXX6aHint (6, 0, 1, 0x01, 3), {F1, F2, MR3}, EMPTY}, - {"ldfps.s", M2, OpMXX6aHint (6, 0, 1, 0x06, 0), {F1, F2, MR3}, EMPTY}, - {"ldfps.s.nt1", M2, OpMXX6aHint (6, 0, 1, 0x06, 1), {F1, F2, MR3}, EMPTY}, - {"ldfps.s.nta", M2, OpMXX6aHint (6, 0, 1, 0x06, 3), {F1, F2, MR3}, EMPTY}, - {"ldfpd.s", M2, OpMXX6aHint (6, 0, 1, 0x07, 0), {F1, F2, MR3}, EMPTY}, - {"ldfpd.s.nt1", M2, OpMXX6aHint (6, 0, 1, 0x07, 1), {F1, F2, MR3}, EMPTY}, - {"ldfpd.s.nta", M2, OpMXX6aHint (6, 0, 1, 0x07, 3), {F1, F2, MR3}, EMPTY}, - {"ldfp8.s", M2, OpMXX6aHint (6, 0, 1, 0x05, 0), {F1, F2, MR3}, EMPTY}, - {"ldfp8.s.nt1", M2, OpMXX6aHint (6, 0, 1, 0x05, 1), {F1, F2, MR3}, EMPTY}, - {"ldfp8.s.nta", M2, OpMXX6aHint (6, 0, 1, 0x05, 3), {F1, F2, MR3}, EMPTY}, - {"ldfps.a", M2, OpMXX6aHint (6, 0, 1, 0x0a, 0), {F1, F2, MR3}, EMPTY}, - {"ldfps.a.nt1", M2, OpMXX6aHint (6, 0, 1, 0x0a, 1), {F1, F2, MR3}, EMPTY}, - {"ldfps.a.nta", M2, OpMXX6aHint (6, 0, 1, 0x0a, 3), {F1, F2, MR3}, EMPTY}, - {"ldfpd.a", M2, OpMXX6aHint (6, 0, 1, 0x0b, 0), {F1, F2, MR3}, EMPTY}, - {"ldfpd.a.nt1", M2, OpMXX6aHint (6, 0, 1, 0x0b, 1), {F1, F2, MR3}, EMPTY}, - {"ldfpd.a.nta", M2, OpMXX6aHint (6, 0, 1, 0x0b, 3), {F1, F2, MR3}, EMPTY}, - {"ldfp8.a", M2, OpMXX6aHint (6, 0, 1, 0x09, 0), {F1, F2, MR3}, EMPTY}, - {"ldfp8.a.nt1", M2, OpMXX6aHint (6, 0, 1, 0x09, 1), {F1, F2, MR3}, EMPTY}, - {"ldfp8.a.nta", M2, OpMXX6aHint (6, 0, 1, 0x09, 3), {F1, F2, MR3}, EMPTY}, - {"ldfps.sa", M2, OpMXX6aHint (6, 0, 1, 0x0e, 0), {F1, F2, MR3}, EMPTY}, - {"ldfps.sa.nt1", M2, OpMXX6aHint (6, 0, 1, 0x0e, 1), {F1, F2, MR3}, EMPTY}, - {"ldfps.sa.nta", M2, OpMXX6aHint (6, 0, 1, 0x0e, 3), {F1, F2, MR3}, EMPTY}, - {"ldfpd.sa", M2, OpMXX6aHint (6, 0, 1, 0x0f, 0), {F1, F2, MR3}, EMPTY}, - {"ldfpd.sa.nt1", M2, OpMXX6aHint (6, 0, 1, 0x0f, 1), {F1, F2, MR3}, EMPTY}, - {"ldfpd.sa.nta", M2, OpMXX6aHint (6, 0, 1, 0x0f, 3), {F1, F2, MR3}, EMPTY}, - {"ldfp8.sa", M2, OpMXX6aHint (6, 0, 1, 0x0d, 0), {F1, F2, MR3}, EMPTY}, - {"ldfp8.sa.nt1", M2, OpMXX6aHint (6, 0, 1, 0x0d, 1), {F1, F2, MR3}, EMPTY}, - {"ldfp8.sa.nta", M2, OpMXX6aHint (6, 0, 1, 0x0d, 3), {F1, F2, MR3}, EMPTY}, - {"ldfps.c.clr", M2, OpMXX6aHint (6, 0, 1, 0x22, 0), {F1, F2, MR3}, EMPTY}, - {"ldfps.c.clr.nt1", M2, OpMXX6aHint (6, 0, 1, 0x22, 1), {F1, F2, MR3}, EMPTY}, - {"ldfps.c.clr.nta", M2, OpMXX6aHint (6, 0, 1, 0x22, 3), {F1, F2, MR3}, EMPTY}, - {"ldfpd.c.clr", M2, OpMXX6aHint (6, 0, 1, 0x23, 0), {F1, F2, MR3}, EMPTY}, - {"ldfpd.c.clr.nt1", M2, OpMXX6aHint (6, 0, 1, 0x23, 1), {F1, F2, MR3}, EMPTY}, - {"ldfpd.c.clr.nta", M2, OpMXX6aHint (6, 0, 1, 0x23, 3), {F1, F2, MR3}, EMPTY}, - {"ldfp8.c.clr", M2, OpMXX6aHint (6, 0, 1, 0x21, 0), {F1, F2, MR3}, EMPTY}, - {"ldfp8.c.clr.nt1", M2, OpMXX6aHint (6, 0, 1, 0x21, 1), {F1, F2, MR3}, EMPTY}, - {"ldfp8.c.clr.nta", M2, OpMXX6aHint (6, 0, 1, 0x21, 3), {F1, F2, MR3}, EMPTY}, - {"ldfps.c.nc", M2, OpMXX6aHint (6, 0, 1, 0x26, 0), {F1, F2, MR3}, EMPTY}, - {"ldfps.c.nc.nt1", M2, OpMXX6aHint (6, 0, 1, 0x26, 1), {F1, F2, MR3}, EMPTY}, - {"ldfps.c.nc.nta", M2, OpMXX6aHint (6, 0, 1, 0x26, 3), {F1, F2, MR3}, EMPTY}, - {"ldfpd.c.nc", M2, OpMXX6aHint (6, 0, 1, 0x27, 0), {F1, F2, MR3}, EMPTY}, - {"ldfpd.c.nc.nt1", M2, OpMXX6aHint (6, 0, 1, 0x27, 1), {F1, F2, MR3}, EMPTY}, - {"ldfpd.c.nc.nta", M2, OpMXX6aHint (6, 0, 1, 0x27, 3), {F1, F2, MR3}, EMPTY}, - {"ldfp8.c.nc", M2, OpMXX6aHint (6, 0, 1, 0x25, 0), {F1, F2, MR3}, EMPTY}, - {"ldfp8.c.nc.nt1", M2, OpMXX6aHint (6, 0, 1, 0x25, 1), {F1, F2, MR3}, EMPTY}, - {"ldfp8.c.nc.nta", M2, OpMXX6aHint (6, 0, 1, 0x25, 3), {F1, F2, MR3}, EMPTY}, - - /* Floating-point load pair w/increment by immediate. */ -#define LD(a,b,c) M2, OpMXX6aHint (6, 1, 1, a, b), {F1, F2, MR3, c}, POSTINC, 0, NULL - {"ldfps", LD (0x02, 0, C8)}, - {"ldfps.nt1", LD (0x02, 1, C8)}, - {"ldfps.nta", LD (0x02, 3, C8)}, - {"ldfpd", LD (0x03, 0, C16)}, - {"ldfpd.nt1", LD (0x03, 1, C16)}, - {"ldfpd.nta", LD (0x03, 3, C16)}, - {"ldfp8", LD (0x01, 0, C16)}, - {"ldfp8.nt1", LD (0x01, 1, C16)}, - {"ldfp8.nta", LD (0x01, 3, C16)}, - {"ldfps.s", LD (0x06, 0, C8)}, - {"ldfps.s.nt1", LD (0x06, 1, C8)}, - {"ldfps.s.nta", LD (0x06, 3, C8)}, - {"ldfpd.s", LD (0x07, 0, C16)}, - {"ldfpd.s.nt1", LD (0x07, 1, C16)}, - {"ldfpd.s.nta", LD (0x07, 3, C16)}, - {"ldfp8.s", LD (0x05, 0, C16)}, - {"ldfp8.s.nt1", LD (0x05, 1, C16)}, - {"ldfp8.s.nta", LD (0x05, 3, C16)}, - {"ldfps.a", LD (0x0a, 0, C8)}, - {"ldfps.a.nt1", LD (0x0a, 1, C8)}, - {"ldfps.a.nta", LD (0x0a, 3, C8)}, - {"ldfpd.a", LD (0x0b, 0, C16)}, - {"ldfpd.a.nt1", LD (0x0b, 1, C16)}, - {"ldfpd.a.nta", LD (0x0b, 3, C16)}, - {"ldfp8.a", LD (0x09, 0, C16)}, - {"ldfp8.a.nt1", LD (0x09, 1, C16)}, - {"ldfp8.a.nta", LD (0x09, 3, C16)}, - {"ldfps.sa", LD (0x0e, 0, C8)}, - {"ldfps.sa.nt1", LD (0x0e, 1, C8)}, - {"ldfps.sa.nta", LD (0x0e, 3, C8)}, - {"ldfpd.sa", LD (0x0f, 0, C16)}, - {"ldfpd.sa.nt1", LD (0x0f, 1, C16)}, - {"ldfpd.sa.nta", LD (0x0f, 3, C16)}, - {"ldfp8.sa", LD (0x0d, 0, C16)}, - {"ldfp8.sa.nt1", LD (0x0d, 1, C16)}, - {"ldfp8.sa.nta", LD (0x0d, 3, C16)}, - {"ldfps.c.clr", LD (0x22, 0, C8)}, - {"ldfps.c.clr.nt1", LD (0x22, 1, C8)}, - {"ldfps.c.clr.nta", LD (0x22, 3, C8)}, - {"ldfpd.c.clr", LD (0x23, 0, C16)}, - {"ldfpd.c.clr.nt1", LD (0x23, 1, C16)}, - {"ldfpd.c.clr.nta", LD (0x23, 3, C16)}, - {"ldfp8.c.clr", LD (0x21, 0, C16)}, - {"ldfp8.c.clr.nt1", LD (0x21, 1, C16)}, - {"ldfp8.c.clr.nta", LD (0x21, 3, C16)}, - {"ldfps.c.nc", LD (0x26, 0, C8)}, - {"ldfps.c.nc.nt1", LD (0x26, 1, C8)}, - {"ldfps.c.nc.nta", LD (0x26, 3, C8)}, - {"ldfpd.c.nc", LD (0x27, 0, C16)}, - {"ldfpd.c.nc.nt1", LD (0x27, 1, C16)}, - {"ldfpd.c.nc.nta", LD (0x27, 3, C16)}, - {"ldfp8.c.nc", LD (0x25, 0, C16)}, - {"ldfp8.c.nc.nt1", LD (0x25, 1, C16)}, - {"ldfp8.c.nc.nta", LD (0x25, 3, C16)}, -#undef LD - - /* Line prefetch. */ - {"lfetch", M0, OpMXX6aHint (6, 0, 0, 0x2c, 0), {MR3}, EMPTY}, - {"lfetch.nt1", M0, OpMXX6aHint (6, 0, 0, 0x2c, 1), {MR3}, EMPTY}, - {"lfetch.nt2", M0, OpMXX6aHint (6, 0, 0, 0x2c, 2), {MR3}, EMPTY}, - {"lfetch.nta", M0, OpMXX6aHint (6, 0, 0, 0x2c, 3), {MR3}, EMPTY}, - {"lfetch.excl", M0, OpMXX6aHint (6, 0, 0, 0x2d, 0), {MR3}, EMPTY}, - {"lfetch.excl.nt1", M0, OpMXX6aHint (6, 0, 0, 0x2d, 1), {MR3}, EMPTY}, - {"lfetch.excl.nt2", M0, OpMXX6aHint (6, 0, 0, 0x2d, 2), {MR3}, EMPTY}, - {"lfetch.excl.nta", M0, OpMXX6aHint (6, 0, 0, 0x2d, 3), {MR3}, EMPTY}, - {"lfetch.fault", M0, OpMXX6aHint (6, 0, 0, 0x2e, 0), {MR3}, EMPTY}, - {"lfetch.fault.nt1", M0, OpMXX6aHint (6, 0, 0, 0x2e, 1), {MR3}, EMPTY}, - {"lfetch.fault.nt2", M0, OpMXX6aHint (6, 0, 0, 0x2e, 2), {MR3}, EMPTY}, - {"lfetch.fault.nta", M0, OpMXX6aHint (6, 0, 0, 0x2e, 3), {MR3}, EMPTY}, - {"lfetch.fault.excl", M0, OpMXX6aHint (6, 0, 0, 0x2f, 0), {MR3}, EMPTY}, - {"lfetch.fault.excl.nt1", M0, OpMXX6aHint (6, 0, 0, 0x2f, 1), {MR3}, EMPTY}, - {"lfetch.fault.excl.nt2", M0, OpMXX6aHint (6, 0, 0, 0x2f, 2), {MR3}, EMPTY}, - {"lfetch.fault.excl.nta", M0, OpMXX6aHint (6, 0, 0, 0x2f, 3), {MR3}, EMPTY}, - - /* Line prefetch w/increment by register. */ -#define LFETCHINCREG(c,h) M0, OpMXX6aHint (6, 1, 0, c, h), {MR3, R2}, POSTINC, 0, NULL - {"lfetch", LFETCHINCREG (0x2c, 0)}, - {"lfetch.nt1", LFETCHINCREG (0x2c, 1)}, - {"lfetch.nt2", LFETCHINCREG (0x2c, 2)}, - {"lfetch.nta", LFETCHINCREG (0x2c, 3)}, - {"lfetch.excl", LFETCHINCREG (0x2d, 0)}, - {"lfetch.excl.nt1", LFETCHINCREG (0x2d, 1)}, - {"lfetch.excl.nt2", LFETCHINCREG (0x2d, 2)}, - {"lfetch.excl.nta", LFETCHINCREG (0x2d, 3)}, - {"lfetch.fault", LFETCHINCREG (0x2e, 0)}, - {"lfetch.fault.nt1", LFETCHINCREG (0x2e, 1)}, - {"lfetch.fault.nt2", LFETCHINCREG (0x2e, 2)}, - {"lfetch.fault.nta", LFETCHINCREG (0x2e, 3)}, - {"lfetch.fault.excl", LFETCHINCREG (0x2f, 0)}, - {"lfetch.fault.excl.nt1", LFETCHINCREG (0x2f, 1)}, - {"lfetch.fault.excl.nt2", LFETCHINCREG (0x2f, 2)}, - {"lfetch.fault.excl.nta", LFETCHINCREG (0x2f, 3)}, -#undef LFETCHINCREG - - /* Semaphore operations. */ - {"setf.sig", M, OpMXX6a (6, 0, 1, 0x1c), {F1, R2}, EMPTY}, - {"setf.exp", M, OpMXX6a (6, 0, 1, 0x1d), {F1, R2}, EMPTY}, - {"setf.s", M, OpMXX6a (6, 0, 1, 0x1e), {F1, R2}, EMPTY}, - {"setf.d", M, OpMXX6a (6, 0, 1, 0x1f), {F1, R2}, EMPTY}, - - /* Floating-point load w/increment by immediate. */ -#define FLDINCIMMED(c,h) M, OpX6aHint (7, c, h), {F1, MR3, IMM9b}, POSTINC, 0, NULL - {"ldfs", FLDINCIMMED (0x02, 0)}, - {"ldfs.nt1", FLDINCIMMED (0x02, 1)}, - {"ldfs.nta", FLDINCIMMED (0x02, 3)}, - {"ldfd", FLDINCIMMED (0x03, 0)}, - {"ldfd.nt1", FLDINCIMMED (0x03, 1)}, - {"ldfd.nta", FLDINCIMMED (0x03, 3)}, - {"ldf8", FLDINCIMMED (0x01, 0)}, - {"ldf8.nt1", FLDINCIMMED (0x01, 1)}, - {"ldf8.nta", FLDINCIMMED (0x01, 3)}, - {"ldfe", FLDINCIMMED (0x00, 0)}, - {"ldfe.nt1", FLDINCIMMED (0x00, 1)}, - {"ldfe.nta", FLDINCIMMED (0x00, 3)}, - {"ldfs.s", FLDINCIMMED (0x06, 0)}, - {"ldfs.s.nt1", FLDINCIMMED (0x06, 1)}, - {"ldfs.s.nta", FLDINCIMMED (0x06, 3)}, - {"ldfd.s", FLDINCIMMED (0x07, 0)}, - {"ldfd.s.nt1", FLDINCIMMED (0x07, 1)}, - {"ldfd.s.nta", FLDINCIMMED (0x07, 3)}, - {"ldf8.s", FLDINCIMMED (0x05, 0)}, - {"ldf8.s.nt1", FLDINCIMMED (0x05, 1)}, - {"ldf8.s.nta", FLDINCIMMED (0x05, 3)}, - {"ldfe.s", FLDINCIMMED (0x04, 0)}, - {"ldfe.s.nt1", FLDINCIMMED (0x04, 1)}, - {"ldfe.s.nta", FLDINCIMMED (0x04, 3)}, - {"ldfs.a", FLDINCIMMED (0x0a, 0)}, - {"ldfs.a.nt1", FLDINCIMMED (0x0a, 1)}, - {"ldfs.a.nta", FLDINCIMMED (0x0a, 3)}, - {"ldfd.a", FLDINCIMMED (0x0b, 0)}, - {"ldfd.a.nt1", FLDINCIMMED (0x0b, 1)}, - {"ldfd.a.nta", FLDINCIMMED (0x0b, 3)}, - {"ldf8.a", FLDINCIMMED (0x09, 0)}, - {"ldf8.a.nt1", FLDINCIMMED (0x09, 1)}, - {"ldf8.a.nta", FLDINCIMMED (0x09, 3)}, - {"ldfe.a", FLDINCIMMED (0x08, 0)}, - {"ldfe.a.nt1", FLDINCIMMED (0x08, 1)}, - {"ldfe.a.nta", FLDINCIMMED (0x08, 3)}, - {"ldfs.sa", FLDINCIMMED (0x0e, 0)}, - {"ldfs.sa.nt1", FLDINCIMMED (0x0e, 1)}, - {"ldfs.sa.nta", FLDINCIMMED (0x0e, 3)}, - {"ldfd.sa", FLDINCIMMED (0x0f, 0)}, - {"ldfd.sa.nt1", FLDINCIMMED (0x0f, 1)}, - {"ldfd.sa.nta", FLDINCIMMED (0x0f, 3)}, - {"ldf8.sa", FLDINCIMMED (0x0d, 0)}, - {"ldf8.sa.nt1", FLDINCIMMED (0x0d, 1)}, - {"ldf8.sa.nta", FLDINCIMMED (0x0d, 3)}, - {"ldfe.sa", FLDINCIMMED (0x0c, 0)}, - {"ldfe.sa.nt1", FLDINCIMMED (0x0c, 1)}, - {"ldfe.sa.nta", FLDINCIMMED (0x0c, 3)}, - {"ldf.fill", FLDINCIMMED (0x1b, 0)}, - {"ldf.fill.nt1", FLDINCIMMED (0x1b, 1)}, - {"ldf.fill.nta", FLDINCIMMED (0x1b, 3)}, - {"ldfs.c.clr", FLDINCIMMED (0x22, 0)}, - {"ldfs.c.clr.nt1", FLDINCIMMED (0x22, 1)}, - {"ldfs.c.clr.nta", FLDINCIMMED (0x22, 3)}, - {"ldfd.c.clr", FLDINCIMMED (0x23, 0)}, - {"ldfd.c.clr.nt1", FLDINCIMMED (0x23, 1)}, - {"ldfd.c.clr.nta", FLDINCIMMED (0x23, 3)}, - {"ldf8.c.clr", FLDINCIMMED (0x21, 0)}, - {"ldf8.c.clr.nt1", FLDINCIMMED (0x21, 1)}, - {"ldf8.c.clr.nta", FLDINCIMMED (0x21, 3)}, - {"ldfe.c.clr", FLDINCIMMED (0x20, 0)}, - {"ldfe.c.clr.nt1", FLDINCIMMED (0x20, 1)}, - {"ldfe.c.clr.nta", FLDINCIMMED (0x20, 3)}, - {"ldfs.c.nc", FLDINCIMMED (0x26, 0)}, - {"ldfs.c.nc.nt1", FLDINCIMMED (0x26, 1)}, - {"ldfs.c.nc.nta", FLDINCIMMED (0x26, 3)}, - {"ldfd.c.nc", FLDINCIMMED (0x27, 0)}, - {"ldfd.c.nc.nt1", FLDINCIMMED (0x27, 1)}, - {"ldfd.c.nc.nta", FLDINCIMMED (0x27, 3)}, - {"ldf8.c.nc", FLDINCIMMED (0x25, 0)}, - {"ldf8.c.nc.nt1", FLDINCIMMED (0x25, 1)}, - {"ldf8.c.nc.nta", FLDINCIMMED (0x25, 3)}, - {"ldfe.c.nc", FLDINCIMMED (0x24, 0)}, - {"ldfe.c.nc.nt1", FLDINCIMMED (0x24, 1)}, - {"ldfe.c.nc.nta", FLDINCIMMED (0x24, 3)}, -#undef FLDINCIMMED - - /* Floating-point store w/increment by immediate. */ -#define FSTINCIMMED(c,h) M, OpX6aHint (7, c, h), {MR3, F2, IMM9a}, POSTINC, 0, NULL - {"stfs", FSTINCIMMED (0x32, 0)}, - {"stfs.nta", FSTINCIMMED (0x32, 3)}, - {"stfd", FSTINCIMMED (0x33, 0)}, - {"stfd.nta", FSTINCIMMED (0x33, 3)}, - {"stf8", FSTINCIMMED (0x31, 0)}, - {"stf8.nta", FSTINCIMMED (0x31, 3)}, - {"stfe", FSTINCIMMED (0x30, 0)}, - {"stfe.nta", FSTINCIMMED (0x30, 3)}, - {"stf.spill", FSTINCIMMED (0x3b, 0)}, - {"stf.spill.nta", FSTINCIMMED (0x3b, 3)}, -#undef FSTINCIMMED - - /* Line prefetch w/increment by immediate. */ -#define LFETCHINCIMMED(c,h) M0, OpX6aHint (7, c, h), {MR3, IMM9b}, POSTINC, 0, NULL - {"lfetch", LFETCHINCIMMED (0x2c, 0)}, - {"lfetch.nt1", LFETCHINCIMMED (0x2c, 1)}, - {"lfetch.nt2", LFETCHINCIMMED (0x2c, 2)}, - {"lfetch.nta", LFETCHINCIMMED (0x2c, 3)}, - {"lfetch.excl", LFETCHINCIMMED (0x2d, 0)}, - {"lfetch.excl.nt1", LFETCHINCIMMED (0x2d, 1)}, - {"lfetch.excl.nt2", LFETCHINCIMMED (0x2d, 2)}, - {"lfetch.excl.nta", LFETCHINCIMMED (0x2d, 3)}, - {"lfetch.fault", LFETCHINCIMMED (0x2e, 0)}, - {"lfetch.fault.nt1", LFETCHINCIMMED (0x2e, 1)}, - {"lfetch.fault.nt2", LFETCHINCIMMED (0x2e, 2)}, - {"lfetch.fault.nta", LFETCHINCIMMED (0x2e, 3)}, - {"lfetch.fault.excl", LFETCHINCIMMED (0x2f, 0)}, - {"lfetch.fault.excl.nt1", LFETCHINCIMMED (0x2f, 1)}, - {"lfetch.fault.excl.nt2", LFETCHINCIMMED (0x2f, 2)}, - {"lfetch.fault.excl.nta", LFETCHINCIMMED (0x2f, 3)}, -#undef LFETCHINCIMMED - - {NULL, 0, 0, 0, 0, {0}, 0, 0, NULL} - }; - -#undef M0 -#undef M -#undef M2 -#undef bM -#undef bX -#undef bX2 -#undef bX3 -#undef bX4 -#undef bX6a -#undef bX6b -#undef bHint -#undef mM -#undef mX -#undef mX2 -#undef mX3 -#undef mX4 -#undef mX6a -#undef mX6b -#undef mHint -#undef OpX3 -#undef OpX3X6b -#undef OpX3X4 -#undef OpX3X4X2 -#undef OpX6aHint -#undef OpXX6aHint -#undef OpMXX6a -#undef OpMXX6aHint -#undef EMPTY diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-opc-x.c xen-4.3.0/tools/debugger/xenitp/ia64-opc-x.c --- xen-4.2.2/tools/debugger/xenitp/ia64-opc-x.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-opc-x.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,188 +0,0 @@ -/* ia64-opc-x.c -- IA-64 `X' opcode table. - Copyright 1998, 1999, 2000, 2002 Free Software Foundation, Inc. - Contributed by Timothy Wall - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#include "ia64-opc.h" - -/* Identify the specific X-unit type. */ -#define X0 IA64_TYPE_X, 0 -#define X IA64_TYPE_X, 1 - -/* Instruction bit fields: */ -#define bBtype(x) (((ia64_insn) ((x) & 0x7)) << 6) -#define bD(x) (((ia64_insn) ((x) & 0x1)) << 35) -#define bPa(x) (((ia64_insn) ((x) & 0x1)) << 12) -#define bPr(x) (((ia64_insn) ((x) & 0x3f)) << 0) -#define bVc(x) (((ia64_insn) ((x) & 0x1)) << 20) -#define bWha(x) (((ia64_insn) ((x) & 0x3)) << 33) -#define bX3(x) (((ia64_insn) ((x) & 0x7)) << 33) -#define bX6(x) (((ia64_insn) ((x) & 0x3f)) << 27) -#define bY(x) (((ia64_insn) ((x) & 0x1)) << 26) - -#define mBtype bBtype (-1) -#define mD bD (-1) -#define mPa bPa (-1) -#define mPr bPr (-1) -#define mVc bVc (-1) -#define mWha bWha (-1) -#define mX3 bX3 (-1) -#define mX6 bX6 (-1) -#define mY bY (-1) - -#define OpX3X6(a,b,c) (bOp (a) | bX3 (b) | bX6(c)), \ - (mOp | mX3 | mX6) -#define OpX3X6Y(a,b,c,d) (bOp (a) | bX3 (b) | bX6(c) | bY(d)), \ - (mOp | mX3 | mX6 | mY) -#define OpVc(a,b) (bOp (a) | bVc (b)), (mOp | mVc) -#define OpPaWhaD(a,b,c,d) \ - (bOp (a) | bPa (b) | bWha (c) | bD (d)), (mOp | mPa | mWha | mD) -#define OpBtypePaWhaD(a,b,c,d,e) \ - (bOp (a) | bBtype (b) | bPa (c) | bWha (d) | bD (e)), \ - (mOp | mBtype | mPa | mWha | mD) -#define OpBtypePaWhaDPr(a,b,c,d,e,f) \ - (bOp (a) | bBtype (b) | bPa (c) | bWha (d) | bD (e) | bPr (f)), \ - (mOp | mBtype | mPa | mWha | mD | mPr) - -struct ia64_opcode ia64_opcodes_x[] = - { - {"break.x", X0, OpX3X6 (0, 0, 0x00), {IMMU62}, 0, 0, NULL}, - {"nop.x", X0, OpX3X6Y (0, 0, 0x01, 0), {IMMU62}, 0, 0, NULL}, - {"hint.x", X0, OpX3X6Y (0, 0, 0x01, 1), {IMMU62}, 0, 0, NULL}, - {"movl", X, OpVc (6, 0), {R1, IMMU64}, 0, 0, NULL}, -#define BRL(a,b) \ - X0, OpBtypePaWhaDPr (0xC, 0, a, 0, b, 0), {TGT64}, PSEUDO, 0, NULL - {"brl.few", BRL (0, 0)}, - {"brl", BRL (0, 0)}, - {"brl.few.clr", BRL (0, 1)}, - {"brl.clr", BRL (0, 1)}, - {"brl.many", BRL (1, 0)}, - {"brl.many.clr", BRL (1, 1)}, -#undef BRL -#define BRL(a,b,c) \ - X0, OpBtypePaWhaD (0xC, 0, a, b, c), {TGT64}, 0, 0, NULL -#define BRLP(a,b,c) \ - X0, OpBtypePaWhaD (0xC, 0, a, b, c), {TGT64}, PSEUDO, 0, NULL - {"brl.cond.sptk.few", BRL (0, 0, 0)}, - {"brl.cond.sptk", BRLP (0, 0, 0)}, - {"brl.cond.sptk.few.clr", BRL (0, 0, 1)}, - {"brl.cond.sptk.clr", BRLP (0, 0, 1)}, - {"brl.cond.spnt.few", BRL (0, 1, 0)}, - {"brl.cond.spnt", BRLP (0, 1, 0)}, - {"brl.cond.spnt.few.clr", BRL (0, 1, 1)}, - {"brl.cond.spnt.clr", BRLP (0, 1, 1)}, - {"brl.cond.dptk.few", BRL (0, 2, 0)}, - {"brl.cond.dptk", BRLP (0, 2, 0)}, - {"brl.cond.dptk.few.clr", BRL (0, 2, 1)}, - {"brl.cond.dptk.clr", BRLP (0, 2, 1)}, - {"brl.cond.dpnt.few", BRL (0, 3, 0)}, - {"brl.cond.dpnt", BRLP (0, 3, 0)}, - {"brl.cond.dpnt.few.clr", BRL (0, 3, 1)}, - {"brl.cond.dpnt.clr", BRLP (0, 3, 1)}, - {"brl.cond.sptk.many", BRL (1, 0, 0)}, - {"brl.cond.sptk.many.clr", BRL (1, 0, 1)}, - {"brl.cond.spnt.many", BRL (1, 1, 0)}, - {"brl.cond.spnt.many.clr", BRL (1, 1, 1)}, - {"brl.cond.dptk.many", BRL (1, 2, 0)}, - {"brl.cond.dptk.many.clr", BRL (1, 2, 1)}, - {"brl.cond.dpnt.many", BRL (1, 3, 0)}, - {"brl.cond.dpnt.many.clr", BRL (1, 3, 1)}, - {"brl.sptk.few", BRL (0, 0, 0)}, - {"brl.sptk", BRLP (0, 0, 0)}, - {"brl.sptk.few.clr", BRL (0, 0, 1)}, - {"brl.sptk.clr", BRLP (0, 0, 1)}, - {"brl.spnt.few", BRL (0, 1, 0)}, - {"brl.spnt", BRLP (0, 1, 0)}, - {"brl.spnt.few.clr", BRL (0, 1, 1)}, - {"brl.spnt.clr", BRLP (0, 1, 1)}, - {"brl.dptk.few", BRL (0, 2, 0)}, - {"brl.dptk", BRLP (0, 2, 0)}, - {"brl.dptk.few.clr", BRL (0, 2, 1)}, - {"brl.dptk.clr", BRLP (0, 2, 1)}, - {"brl.dpnt.few", BRL (0, 3, 0)}, - {"brl.dpnt", BRLP (0, 3, 0)}, - {"brl.dpnt.few.clr", BRL (0, 3, 1)}, - {"brl.dpnt.clr", BRLP (0, 3, 1)}, - {"brl.sptk.many", BRL (1, 0, 0)}, - {"brl.sptk.many.clr", BRL (1, 0, 1)}, - {"brl.spnt.many", BRL (1, 1, 0)}, - {"brl.spnt.many.clr", BRL (1, 1, 1)}, - {"brl.dptk.many", BRL (1, 2, 0)}, - {"brl.dptk.many.clr", BRL (1, 2, 1)}, - {"brl.dpnt.many", BRL (1, 3, 0)}, - {"brl.dpnt.many.clr", BRL (1, 3, 1)}, -#undef BRL -#undef BRLP -#define BRL(a,b,c) X, OpPaWhaD (0xD, a, b, c), {B1, TGT64}, 0, 0, NULL -#define BRLP(a,b,c) X, OpPaWhaD (0xD, a, b, c), {B1, TGT64}, PSEUDO, 0, NULL - {"brl.call.sptk.few", BRL (0, 0, 0)}, - {"brl.call.sptk", BRLP (0, 0, 0)}, - {"brl.call.sptk.few.clr", BRL (0, 0, 1)}, - {"brl.call.sptk.clr", BRLP (0, 0, 1)}, - {"brl.call.spnt.few", BRL (0, 1, 0)}, - {"brl.call.spnt", BRLP (0, 1, 0)}, - {"brl.call.spnt.few.clr", BRL (0, 1, 1)}, - {"brl.call.spnt.clr", BRLP (0, 1, 1)}, - {"brl.call.dptk.few", BRL (0, 2, 0)}, - {"brl.call.dptk", BRLP (0, 2, 0)}, - {"brl.call.dptk.few.clr", BRL (0, 2, 1)}, - {"brl.call.dptk.clr", BRLP (0, 2, 1)}, - {"brl.call.dpnt.few", BRL (0, 3, 0)}, - {"brl.call.dpnt", BRLP (0, 3, 0)}, - {"brl.call.dpnt.few.clr", BRL (0, 3, 1)}, - {"brl.call.dpnt.clr", BRLP (0, 3, 1)}, - {"brl.call.sptk.many", BRL (1, 0, 0)}, - {"brl.call.sptk.many.clr", BRL (1, 0, 1)}, - {"brl.call.spnt.many", BRL (1, 1, 0)}, - {"brl.call.spnt.many.clr", BRL (1, 1, 1)}, - {"brl.call.dptk.many", BRL (1, 2, 0)}, - {"brl.call.dptk.many.clr", BRL (1, 2, 1)}, - {"brl.call.dpnt.many", BRL (1, 3, 0)}, - {"brl.call.dpnt.many.clr", BRL (1, 3, 1)}, -#undef BRL -#undef BRLP - {NULL, 0, 0, 0, 0, {0}, 0, 0, NULL} - }; - -#undef X0 -#undef X - -#undef bBtype -#undef bD -#undef bPa -#undef bPr -#undef bVc -#undef bWha -#undef bX3 -#undef bX6 - -#undef mBtype -#undef mD -#undef mPa -#undef mPr -#undef mVc -#undef mWha -#undef mX3 -#undef mX6 - -#undef OpX3X6 -#undef OpVc -#undef OpPaWhaD -#undef OpBtypePaWhaD -#undef OpBtypePaWhaDPr diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-opc.c xen-4.3.0/tools/debugger/xenitp/ia64-opc.c --- xen-4.2.2/tools/debugger/xenitp/ia64-opc.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-opc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,727 +0,0 @@ -/* ia64-opc.c -- Functions to access the compacted opcode table - Copyright 1999, 2000, 2001, 2003, 2005 Free Software Foundation, Inc. - Written by Bob Manson of Cygnus Solutions, - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#include "ia64-asmtab.h" -#include "ia64-asmtab.c" - -static void get_opc_prefix (const char **, char *); -static short int find_string_ent (const char *); -static short int find_main_ent (short int); -static short int find_completer (short int, short int, const char *); -static ia64_insn apply_completer (ia64_insn, int); -static int extract_op_bits (int, int, int); -static int extract_op (int, int *, unsigned int *); -static int opcode_verify (ia64_insn, int, enum ia64_insn_type); -static int locate_opcode_ent (ia64_insn, enum ia64_insn_type); -static struct ia64_opcode *make_ia64_opcode - (ia64_insn, const char *, int, int); -static struct ia64_opcode *ia64_find_matching_opcode - (const char *, short int); - -const struct ia64_templ_desc ia64_templ_desc[16] = - { - { 0, { IA64_UNIT_M, IA64_UNIT_I, IA64_UNIT_I }, "MII" }, /* 0 */ - { 2, { IA64_UNIT_M, IA64_UNIT_I, IA64_UNIT_I }, "MII" }, - { 0, { IA64_UNIT_M, IA64_UNIT_L, IA64_UNIT_X }, "MLX" }, - { 0, { 0, }, "-3-" }, - { 0, { IA64_UNIT_M, IA64_UNIT_M, IA64_UNIT_I }, "MMI" }, /* 4 */ - { 1, { IA64_UNIT_M, IA64_UNIT_M, IA64_UNIT_I }, "MMI" }, - { 0, { IA64_UNIT_M, IA64_UNIT_F, IA64_UNIT_I }, "MFI" }, - { 0, { IA64_UNIT_M, IA64_UNIT_M, IA64_UNIT_F }, "MMF" }, - { 0, { IA64_UNIT_M, IA64_UNIT_I, IA64_UNIT_B }, "MIB" }, /* 8 */ - { 0, { IA64_UNIT_M, IA64_UNIT_B, IA64_UNIT_B }, "MBB" }, - { 0, { 0, }, "-a-" }, - { 0, { IA64_UNIT_B, IA64_UNIT_B, IA64_UNIT_B }, "BBB" }, - { 0, { IA64_UNIT_M, IA64_UNIT_M, IA64_UNIT_B }, "MMB" }, /* c */ - { 0, { 0, }, "-d-" }, - { 0, { IA64_UNIT_M, IA64_UNIT_F, IA64_UNIT_B }, "MFB" }, - { 0, { 0, }, "-f-" }, - }; - - -/* Copy the prefix contained in *PTR (up to a '.' or a NUL) to DEST. - PTR will be adjusted to point to the start of the next portion - of the opcode, or at the NUL character. */ - -static void -get_opc_prefix (const char **ptr, char *dest) -{ - char *c = strchr (*ptr, '.'); - if (c != NULL) - { - memcpy (dest, *ptr, c - *ptr); - dest[c - *ptr] = '\0'; - *ptr = c + 1; - } - else - { - int l = strlen (*ptr); - memcpy (dest, *ptr, l); - dest[l] = '\0'; - *ptr += l; - } -} - -/* Find the index of the entry in the string table corresponding to - STR; return -1 if one does not exist. */ - -static short -find_string_ent (const char *str) -{ - short start = 0; - short end = sizeof (ia64_strings) / sizeof (const char *); - short i = (start + end) / 2; - - if (strcmp (str, ia64_strings[end - 1]) > 0) - { - return -1; - } - while (start <= end) - { - int c = strcmp (str, ia64_strings[i]); - if (c < 0) - { - end = i - 1; - } - else if (c == 0) - { - return i; - } - else - { - start = i + 1; - } - i = (start + end) / 2; - } - return -1; -} - -/* Find the opcode in the main opcode table whose name is STRINGINDEX, or - return -1 if one does not exist. */ - -static short -find_main_ent (short nameindex) -{ - short start = 0; - short end = sizeof (main_table) / sizeof (struct ia64_main_table); - short i = (start + end) / 2; - - if (nameindex < main_table[0].name_index - || nameindex > main_table[end - 1].name_index) - { - return -1; - } - while (start <= end) - { - if (nameindex < main_table[i].name_index) - { - end = i - 1; - } - else if (nameindex == main_table[i].name_index) - { - while (i > 0 && main_table[i - 1].name_index == nameindex) - { - i--; - } - return i; - } - else - { - start = i + 1; - } - i = (start + end) / 2; - } - return -1; -} - -/* Find the index of the entry in the completer table that is part of - MAIN_ENT (starting from PREV_COMPLETER) that matches NAME, or - return -1 if one does not exist. */ - -static short -find_completer (short main_ent, short prev_completer, const char *name) -{ - short name_index = find_string_ent (name); - - if (name_index < 0) - { - return -1; - } - - if (prev_completer == -1) - { - prev_completer = main_table[main_ent].completers; - } - else - { - prev_completer = completer_table[prev_completer].subentries; - } - - while (prev_completer != -1) - { - if (completer_table[prev_completer].name_index == name_index) - { - return prev_completer; - } - prev_completer = completer_table[prev_completer].alternative; - } - return -1; -} - -/* Apply the completer referred to by COMPLETER_INDEX to OPCODE, and - return the result. */ - -static ia64_insn -apply_completer (ia64_insn opcode, int completer_index) -{ - ia64_insn mask = completer_table[completer_index].mask; - ia64_insn bits = completer_table[completer_index].bits; - int shiftamt = (completer_table[completer_index].offset & 63); - - mask = mask << shiftamt; - bits = bits << shiftamt; - opcode = (opcode & ~mask) | bits; - return opcode; -} - -/* Extract BITS number of bits starting from OP_POINTER + BITOFFSET in - the dis_table array, and return its value. (BITOFFSET is numbered - starting from MSB to LSB, so a BITOFFSET of 0 indicates the MSB of the - first byte in OP_POINTER.) */ - -static int -extract_op_bits (int op_pointer, int bitoffset, int bits) -{ - int res = 0; - - op_pointer += (bitoffset / 8); - - if (bitoffset % 8) - { - unsigned int op = dis_table[op_pointer++]; - int numb = 8 - (bitoffset % 8); - int mask = (1 << numb) - 1; - int bata = (bits < numb) ? bits : numb; - int delta = numb - bata; - - res = (res << bata) | ((op & mask) >> delta); - bitoffset += bata; - bits -= bata; - } - while (bits >= 8) - { - res = (res << 8) | (dis_table[op_pointer++] & 255); - bits -= 8; - } - if (bits > 0) - { - unsigned int op = (dis_table[op_pointer++] & 255); - res = (res << bits) | (op >> (8 - bits)); - } - return res; -} - -/* Examine the state machine entry at OP_POINTER in the dis_table - array, and extract its values into OPVAL and OP. The length of the - state entry in bits is returned. */ - -static int -extract_op (int op_pointer, int *opval, unsigned int *op) -{ - int oplen = 5; - - *op = dis_table[op_pointer]; - - if ((*op) & 0x40) - { - opval[0] = extract_op_bits (op_pointer, oplen, 5); - oplen += 5; - } - switch ((*op) & 0x30) - { - case 0x10: - { - opval[1] = extract_op_bits (op_pointer, oplen, 8); - oplen += 8; - opval[1] += op_pointer; - break; - } - case 0x20: - { - opval[1] = extract_op_bits (op_pointer, oplen, 16); - if (! (opval[1] & 32768)) - { - opval[1] += op_pointer; - } - oplen += 16; - break; - } - case 0x30: - { - oplen--; - opval[2] = extract_op_bits (op_pointer, oplen, 12); - oplen += 12; - opval[2] |= 32768; - break; - } - } - if (((*op) & 0x08) && (((*op) & 0x30) != 0x30)) - { - opval[2] = extract_op_bits (op_pointer, oplen, 16); - oplen += 16; - if (! (opval[2] & 32768)) - { - opval[2] += op_pointer; - } - } - return oplen; -} - -/* Returns a non-zero value if the opcode in the main_table list at - PLACE matches OPCODE and is of type TYPE. */ - -static int -opcode_verify (ia64_insn opcode, int place, enum ia64_insn_type type) -{ - if (main_table[place].opcode_type != type) - { - return 0; - } - if (main_table[place].flags - & (IA64_OPCODE_F2_EQ_F3 | IA64_OPCODE_LEN_EQ_64MCNT)) - { - const struct ia64_operand *o1, *o2; - ia64_insn f2, f3; - - if (main_table[place].flags & IA64_OPCODE_F2_EQ_F3) - { - o1 = elf64_ia64_operands + IA64_OPND_F2; - o2 = elf64_ia64_operands + IA64_OPND_F3; - (*o1->extract) (o1, opcode, &f2); - (*o2->extract) (o2, opcode, &f3); - if (f2 != f3) - return 0; - } - else - { - ia64_insn len, count; - - /* length must equal 64-count: */ - o1 = elf64_ia64_operands + IA64_OPND_LEN6; - o2 = elf64_ia64_operands + main_table[place].operands[2]; - (*o1->extract) (o1, opcode, &len); - (*o2->extract) (o2, opcode, &count); - if (len != 64 - count) - return 0; - } - } - return 1; -} - -/* Find an instruction entry in the ia64_dis_names array that matches - opcode OPCODE and is of type TYPE. Returns either a positive index - into the array, or a negative value if an entry for OPCODE could - not be found. Checks all matches and returns the one with the highest - priority. */ - -static int -locate_opcode_ent (ia64_insn opcode, enum ia64_insn_type type) -{ - int currtest[41]; - int bitpos[41]; - int op_ptr[41]; - int currstatenum = 0; - short found_disent = -1; - short found_priority = -1; - - currtest[currstatenum] = 0; - op_ptr[currstatenum] = 0; - bitpos[currstatenum] = 40; - - while (1) - { - int op_pointer = op_ptr[currstatenum]; - unsigned int op; - int currbitnum = bitpos[currstatenum]; - int oplen; - int opval[3] = {0}; - int next_op; - int currbit; - - oplen = extract_op (op_pointer, opval, &op); - - bitpos[currstatenum] = currbitnum; - - /* Skip opval[0] bits in the instruction. */ - if (op & 0x40) - { - currbitnum -= opval[0]; - } - - /* The value of the current bit being tested. */ - currbit = opcode & (((ia64_insn) 1) << currbitnum) ? 1 : 0; - next_op = -1; - - /* We always perform the tests specified in the current state in - a particular order, falling through to the next test if the - previous one failed. */ - switch (currtest[currstatenum]) - { - case 0: - currtest[currstatenum]++; - if (currbit == 0 && (op & 0x80)) - { - /* Check for a zero bit. If this test solely checks for - a zero bit, we can check for up to 8 consecutive zero - bits (the number to check is specified by the lower 3 - bits in the state code.) - - If the state instruction matches, we go to the very - next state instruction; otherwise, try the next test. */ - - if ((op & 0xf8) == 0x80) - { - int count = op & 0x7; - int x; - - for (x = 0; x <= count; x++) - { - int i = - opcode & (((ia64_insn) 1) << (currbitnum - x)) ? 1 : 0; - if (i) - { - break; - } - } - if (x > count) - { - next_op = op_pointer + ((oplen + 7) / 8); - currbitnum -= count; - break; - } - } - else if (! currbit) - { - next_op = op_pointer + ((oplen + 7) / 8); - break; - } - } - /* FALLTHROUGH */ - case 1: - /* If the bit in the instruction is one, go to the state - instruction specified by opval[1]. */ - currtest[currstatenum]++; - if (currbit && (op & 0x30) != 0 && ((op & 0x30) != 0x30)) - { - next_op = opval[1]; - break; - } - /* FALLTHROUGH */ - case 2: - /* Don't care. Skip the current bit and go to the state - instruction specified by opval[2]. - - An encoding of 0x30 is special; this means that a 12-bit - offset into the ia64_dis_names[] array is specified. */ - currtest[currstatenum]++; - if ((op & 0x08) || ((op & 0x30) == 0x30)) - { - next_op = opval[2]; - break; - } - } - - /* If bit 15 is set in the address of the next state, an offset - in the ia64_dis_names array was specified instead. We then - check to see if an entry in the list of opcodes matches the - opcode we were given; if so, we have succeeded. */ - - if ((next_op >= 0) && (next_op & 32768)) - { - short disent = next_op & 32767; - short priority = -1; - - if (next_op > 65535) - { - abort (); - } - - /* Run through the list of opcodes to check, trying to find - one that matches. */ - while (disent >= 0) - { - int place = ia64_dis_names[disent].insn_index; - - priority = ia64_dis_names[disent].priority; - - if (opcode_verify (opcode, place, type) - && priority > found_priority) - { - break; - } - if (ia64_dis_names[disent].next_flag) - { - disent++; - } - else - { - disent = -1; - } - } - - if (disent >= 0) - { - found_disent = disent; - found_priority = priority; - } - /* Try the next test in this state, regardless of whether a match - was found. */ - next_op = -2; - } - - /* next_op == -1 is "back up to the previous state". - next_op == -2 is "stay in this state and try the next test". - Otherwise, transition to the state indicated by next_op. */ - - if (next_op == -1) - { - currstatenum--; - if (currstatenum < 0) - { - return found_disent; - } - } - else if (next_op >= 0) - { - currstatenum++; - bitpos[currstatenum] = currbitnum - 1; - op_ptr[currstatenum] = next_op; - currtest[currstatenum] = 0; - } - } -} - -/* Construct an ia64_opcode entry based on OPCODE, NAME and PLACE. */ - -static struct ia64_opcode * -make_ia64_opcode (ia64_insn opcode, const char *name, int place, int depind) -{ - struct ia64_opcode *res = - (struct ia64_opcode *) malloc (sizeof (struct ia64_opcode)); - res->name = strdup (name); - res->type = main_table[place].opcode_type; - res->num_outputs = main_table[place].num_outputs; - res->opcode = opcode; - res->mask = main_table[place].mask; - res->operands[0] = main_table[place].operands[0]; - res->operands[1] = main_table[place].operands[1]; - res->operands[2] = main_table[place].operands[2]; - res->operands[3] = main_table[place].operands[3]; - res->operands[4] = main_table[place].operands[4]; - res->flags = main_table[place].flags; - res->ent_index = place; - res->dependencies = &op_dependencies[depind]; - return res; -} - -/* Determine the ia64_opcode entry for the opcode specified by INSN - and TYPE. If a valid entry is not found, return NULL. */ -struct ia64_opcode * -ia64_dis_opcode (ia64_insn insn, enum ia64_insn_type type) -{ - int disent = locate_opcode_ent (insn, type); - - if (disent < 0) - { - return NULL; - } - else - { - unsigned int cb = ia64_dis_names[disent].completer_index; - static char name[128]; - int place = ia64_dis_names[disent].insn_index; - int ci = main_table[place].completers; - ia64_insn tinsn = main_table[place].opcode; - - strcpy (name, ia64_strings [main_table[place].name_index]); - - while (cb) - { - if (cb & 1) - { - int cname = completer_table[ci].name_index; - - tinsn = apply_completer (tinsn, ci); - - if (ia64_strings[cname][0] != '\0') - { - strcat (name, "."); - strcat (name, ia64_strings[cname]); - } - if (cb != 1) - { - ci = completer_table[ci].subentries; - } - } - else - { - ci = completer_table[ci].alternative; - } - if (ci < 0) - { - abort (); - } - cb = cb >> 1; - } - if (tinsn != (insn & main_table[place].mask)) - { - abort (); - } - return make_ia64_opcode (insn, name, place, - completer_table[ci].dependencies); - } -} - -/* Search the main_opcode table starting from PLACE for an opcode that - matches NAME. Return NULL if one is not found. */ - -static struct ia64_opcode * -ia64_find_matching_opcode (const char *name, short place) -{ - char op[129]; - const char *suffix; - short name_index; - - if (strlen (name) > 128) - { - return NULL; - } - suffix = name; - get_opc_prefix (&suffix, op); - name_index = find_string_ent (op); - if (name_index < 0) - { - return NULL; - } - - while (main_table[place].name_index == name_index) - { - const char *curr_suffix = suffix; - ia64_insn curr_insn = main_table[place].opcode; - short completer = -1; - - do { - if (suffix[0] == '\0') - { - completer = find_completer (place, completer, suffix); - } - else - { - get_opc_prefix (&curr_suffix, op); - completer = find_completer (place, completer, op); - } - if (completer != -1) - { - curr_insn = apply_completer (curr_insn, completer); - } - } while (completer != -1 && curr_suffix[0] != '\0'); - - if (completer != -1 && curr_suffix[0] == '\0' - && completer_table[completer].terminal_completer) - { - int depind = completer_table[completer].dependencies; - return make_ia64_opcode (curr_insn, name, place, depind); - } - else - { - place++; - } - } - return NULL; -} - -/* Find the next opcode after PREV_ENT that matches PREV_ENT, or return NULL - if one does not exist. - - It is the caller's responsibility to invoke ia64_free_opcode () to - release any resources used by the returned entry. */ - -struct ia64_opcode * -ia64_find_next_opcode (struct ia64_opcode *prev_ent) -{ - return ia64_find_matching_opcode (prev_ent->name, - prev_ent->ent_index + 1); -} - -/* Find the first opcode that matches NAME, or return NULL if it does - not exist. - - It is the caller's responsibility to invoke ia64_free_opcode () to - release any resources used by the returned entry. */ - -struct ia64_opcode * -ia64_find_opcode (const char *name) -{ - char op[129]; - const char *suffix; - short place; - short name_index; - - if (strlen (name) > 128) - { - return NULL; - } - suffix = name; - get_opc_prefix (&suffix, op); - name_index = find_string_ent (op); - if (name_index < 0) - { - return NULL; - } - - place = find_main_ent (name_index); - - if (place < 0) - { - return NULL; - } - return ia64_find_matching_opcode (name, place); -} - -/* Free any resources used by ENT. */ -void -ia64_free_opcode (struct ia64_opcode *ent) -{ - free ((void *)ent->name); - free (ent); -} - -const struct ia64_dependency * -ia64_find_dependency (int index) -{ - index = DEP(index); - - if (index < 0 - || index >= (int)(sizeof(dependencies) / sizeof(dependencies[0]))) - return NULL; - - return &dependencies[index]; -} diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64-opc.h xen-4.3.0/tools/debugger/xenitp/ia64-opc.h --- xen-4.2.2/tools/debugger/xenitp/ia64-opc.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64-opc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,133 +0,0 @@ -/* ia64-opc.h -- IA-64 opcode table. - Copyright 1998, 1999, 2000, 2002, 2005, 2006 - Free Software Foundation, Inc. - Contributed by David Mosberger-Tang - - This file is part of GDB, GAS, and the GNU binutils. - - GDB, GAS, and the GNU binutils are free software; you can redistribute - them and/or modify them under the terms of the GNU General Public - License as published by the Free Software Foundation; either version - 2, or (at your option) any later version. - - GDB, GAS, and the GNU binutils are distributed in the hope that they - 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 file; see the file COPYING. If not, write to the - Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#ifndef IA64_OPC_H -#define IA64_OPC_H - -#include "ia64.h" - -/* define a couple of abbreviations: */ - -#define bOp(x) (((ia64_insn) ((x) & 0xf)) << 37) -#define mOp bOp (-1) -#define Op(x) bOp (x), mOp - -#define FIRST IA64_OPCODE_FIRST -#define X_IN_MLX IA64_OPCODE_X_IN_MLX -#define LAST IA64_OPCODE_LAST -#define PRIV IA64_OPCODE_PRIV -#define NO_PRED IA64_OPCODE_NO_PRED -#define SLOT2 IA64_OPCODE_SLOT2 -#define PSEUDO IA64_OPCODE_PSEUDO -#define F2_EQ_F3 IA64_OPCODE_F2_EQ_F3 -#define LEN_EQ_64MCNT IA64_OPCODE_LEN_EQ_64MCNT -#define MOD_RRBS IA64_OPCODE_MOD_RRBS -#define POSTINC IA64_OPCODE_POSTINC - -#define AR_CCV IA64_OPND_AR_CCV -#define AR_PFS IA64_OPND_AR_PFS -#define AR_CSD IA64_OPND_AR_CSD -#define C1 IA64_OPND_C1 -#define C8 IA64_OPND_C8 -#define C16 IA64_OPND_C16 -#define GR0 IA64_OPND_GR0 -#define IP IA64_OPND_IP -#define PR IA64_OPND_PR -#define PR_ROT IA64_OPND_PR_ROT -#define PSR IA64_OPND_PSR -#define PSR_L IA64_OPND_PSR_L -#define PSR_UM IA64_OPND_PSR_UM - -#define AR3 IA64_OPND_AR3 -#define B1 IA64_OPND_B1 -#define B2 IA64_OPND_B2 -#define CR3 IA64_OPND_CR3 -#define F1 IA64_OPND_F1 -#define F2 IA64_OPND_F2 -#define F3 IA64_OPND_F3 -#define F4 IA64_OPND_F4 -#define P1 IA64_OPND_P1 -#define P2 IA64_OPND_P2 -#define R1 IA64_OPND_R1 -#define R2 IA64_OPND_R2 -#define R3 IA64_OPND_R3 -#define R3_2 IA64_OPND_R3_2 - -#define CPUID_R3 IA64_OPND_CPUID_R3 -#define DBR_R3 IA64_OPND_DBR_R3 -#define DTR_R3 IA64_OPND_DTR_R3 -#define ITR_R3 IA64_OPND_ITR_R3 -#define IBR_R3 IA64_OPND_IBR_R3 -#define MR3 IA64_OPND_MR3 -#define MSR_R3 IA64_OPND_MSR_R3 -#define PKR_R3 IA64_OPND_PKR_R3 -#define PMC_R3 IA64_OPND_PMC_R3 -#define PMD_R3 IA64_OPND_PMD_R3 -#define RR_R3 IA64_OPND_RR_R3 - -#define CCNT5 IA64_OPND_CCNT5 -#define CNT2a IA64_OPND_CNT2a -#define CNT2b IA64_OPND_CNT2b -#define CNT2c IA64_OPND_CNT2c -#define CNT5 IA64_OPND_CNT5 -#define CNT6 IA64_OPND_CNT6 -#define CPOS6a IA64_OPND_CPOS6a -#define CPOS6b IA64_OPND_CPOS6b -#define CPOS6c IA64_OPND_CPOS6c -#define IMM1 IA64_OPND_IMM1 -#define IMM14 IA64_OPND_IMM14 -#define IMM17 IA64_OPND_IMM17 -#define IMM22 IA64_OPND_IMM22 -#define IMM44 IA64_OPND_IMM44 -#define SOF IA64_OPND_SOF -#define SOL IA64_OPND_SOL -#define SOR IA64_OPND_SOR -#define IMM8 IA64_OPND_IMM8 -#define IMM8U4 IA64_OPND_IMM8U4 -#define IMM8M1 IA64_OPND_IMM8M1 -#define IMM8M1U4 IA64_OPND_IMM8M1U4 -#define IMM8M1U8 IA64_OPND_IMM8M1U8 -#define IMM9a IA64_OPND_IMM9a -#define IMM9b IA64_OPND_IMM9b -#define IMMU2 IA64_OPND_IMMU2 -#define IMMU21 IA64_OPND_IMMU21 -#define IMMU24 IA64_OPND_IMMU24 -#define IMMU62 IA64_OPND_IMMU62 -#define IMMU64 IA64_OPND_IMMU64 -#define IMMU5b IA64_OPND_IMMU5b -#define IMMU7a IA64_OPND_IMMU7a -#define IMMU7b IA64_OPND_IMMU7b -#define IMMU9 IA64_OPND_IMMU9 -#define INC3 IA64_OPND_INC3 -#define LEN4 IA64_OPND_LEN4 -#define LEN6 IA64_OPND_LEN6 -#define MBTYPE4 IA64_OPND_MBTYPE4 -#define MHTYPE8 IA64_OPND_MHTYPE8 -#define POS6 IA64_OPND_POS6 -#define TAG13 IA64_OPND_TAG13 -#define TAG13b IA64_OPND_TAG13b -#define TGT25 IA64_OPND_TGT25 -#define TGT25b IA64_OPND_TGT25b -#define TGT25c IA64_OPND_TGT25c -#define TGT64 IA64_OPND_TGT64 - -#endif diff -Nru xen-4.2.2/tools/debugger/xenitp/ia64.h xen-4.3.0/tools/debugger/xenitp/ia64.h --- xen-4.2.2/tools/debugger/xenitp/ia64.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/ia64.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,396 +0,0 @@ -/* ia64.h -- Header file for ia64 opcode table - Copyright (C) 1998, 1999, 2000, 2002, 2005, 2006 - Free Software Foundation, Inc. - Contributed by David Mosberger-Tang */ - -#ifndef opcode_ia64_h -#define opcode_ia64_h - -#include - -#include "dis-asm.h" - - -typedef BFD_HOST_U_64_BIT ia64_insn; - -enum ia64_insn_type - { - IA64_TYPE_NIL = 0, /* illegal type */ - IA64_TYPE_A, /* integer alu (I- or M-unit) */ - IA64_TYPE_I, /* non-alu integer (I-unit) */ - IA64_TYPE_M, /* memory (M-unit) */ - IA64_TYPE_B, /* branch (B-unit) */ - IA64_TYPE_F, /* floating-point (F-unit) */ - IA64_TYPE_X, /* long encoding (X-unit) */ - IA64_TYPE_DYN, /* Dynamic opcode */ - IA64_NUM_TYPES - }; - -enum ia64_unit - { - IA64_UNIT_NIL = 0, /* illegal unit */ - IA64_UNIT_I, /* integer unit */ - IA64_UNIT_M, /* memory unit */ - IA64_UNIT_B, /* branching unit */ - IA64_UNIT_F, /* floating-point unit */ - IA64_UNIT_L, /* long "unit" */ - IA64_UNIT_X, /* may be integer or branch unit */ - IA64_NUM_UNITS - }; - -/* Changes to this enumeration must be propagated to the operand table in - bfd/cpu-ia64-opc.c - */ -enum ia64_opnd - { - IA64_OPND_NIL, /* no operand---MUST BE FIRST!*/ - - /* constants */ - IA64_OPND_AR_CSD, /* application register csd (ar.csd) */ - IA64_OPND_AR_CCV, /* application register ccv (ar.ccv) */ - IA64_OPND_AR_PFS, /* application register pfs (ar.pfs) */ - IA64_OPND_C1, /* the constant 1 */ - IA64_OPND_C8, /* the constant 8 */ - IA64_OPND_C16, /* the constant 16 */ - IA64_OPND_GR0, /* gr0 */ - IA64_OPND_IP, /* instruction pointer (ip) */ - IA64_OPND_PR, /* predicate register (pr) */ - IA64_OPND_PR_ROT, /* rotating predicate register (pr.rot) */ - IA64_OPND_PSR, /* processor status register (psr) */ - IA64_OPND_PSR_L, /* processor status register L (psr.l) */ - IA64_OPND_PSR_UM, /* processor status register UM (psr.um) */ - - /* register operands: */ - IA64_OPND_AR3, /* third application register # (bits 20-26) */ - IA64_OPND_B1, /* branch register # (bits 6-8) */ - IA64_OPND_B2, /* branch register # (bits 13-15) */ - IA64_OPND_CR3, /* third control register # (bits 20-26) */ - IA64_OPND_F1, /* first floating-point register # */ - IA64_OPND_F2, /* second floating-point register # */ - IA64_OPND_F3, /* third floating-point register # */ - IA64_OPND_F4, /* fourth floating-point register # */ - IA64_OPND_P1, /* first predicate # */ - IA64_OPND_P2, /* second predicate # */ - IA64_OPND_R1, /* first register # */ - IA64_OPND_R2, /* second register # */ - IA64_OPND_R3, /* third register # */ - IA64_OPND_R3_2, /* third register # (limited to gr0-gr3) */ - - /* memory operands: */ - IA64_OPND_MR3, /* memory at addr of third register # */ - - /* indirect operands: */ - IA64_OPND_CPUID_R3, /* cpuid[reg] */ - IA64_OPND_DBR_R3, /* dbr[reg] */ - IA64_OPND_DTR_R3, /* dtr[reg] */ - IA64_OPND_ITR_R3, /* itr[reg] */ - IA64_OPND_IBR_R3, /* ibr[reg] */ - IA64_OPND_MSR_R3, /* msr[reg] */ - IA64_OPND_PKR_R3, /* pkr[reg] */ - IA64_OPND_PMC_R3, /* pmc[reg] */ - IA64_OPND_PMD_R3, /* pmd[reg] */ - IA64_OPND_RR_R3, /* rr[reg] */ - - /* immediate operands: */ - IA64_OPND_CCNT5, /* 5-bit count (31 - bits 20-24) */ - IA64_OPND_CNT2a, /* 2-bit count (1 + bits 27-28) */ - IA64_OPND_CNT2b, /* 2-bit count (bits 27-28): 1, 2, 3 */ - IA64_OPND_CNT2c, /* 2-bit count (bits 30-31): 0, 7, 15, or 16 */ - IA64_OPND_CNT5, /* 5-bit count (bits 14-18) */ - IA64_OPND_CNT6, /* 6-bit count (bits 27-32) */ - IA64_OPND_CPOS6a, /* 6-bit count (63 - bits 20-25) */ - IA64_OPND_CPOS6b, /* 6-bit count (63 - bits 14-19) */ - IA64_OPND_CPOS6c, /* 6-bit count (63 - bits 31-36) */ - IA64_OPND_IMM1, /* signed 1-bit immediate (bit 36) */ - IA64_OPND_IMMU2, /* unsigned 2-bit immediate (bits 13-14) */ - IA64_OPND_IMMU5b, /* unsigned 5-bit immediate (32 + bits 14-18) */ - IA64_OPND_IMMU7a, /* unsigned 7-bit immediate (bits 13-19) */ - IA64_OPND_IMMU7b, /* unsigned 7-bit immediate (bits 20-26) */ - IA64_OPND_SOF, /* 8-bit stack frame size */ - IA64_OPND_SOL, /* 8-bit size of locals */ - IA64_OPND_SOR, /* 6-bit number of rotating registers (scaled by 8) */ - IA64_OPND_IMM8, /* signed 8-bit immediate (bits 13-19 & 36) */ - IA64_OPND_IMM8U4, /* cmp4*u signed 8-bit immediate (bits 13-19 & 36) */ - IA64_OPND_IMM8M1, /* signed 8-bit immediate -1 (bits 13-19 & 36) */ - IA64_OPND_IMM8M1U4, /* cmp4*u signed 8-bit immediate -1 (bits 13-19 & 36)*/ - IA64_OPND_IMM8M1U8, /* cmp*u signed 8-bit immediate -1 (bits 13-19 & 36) */ - IA64_OPND_IMMU9, /* unsigned 9-bit immediate (bits 33-34, 20-26) */ - IA64_OPND_IMM9a, /* signed 9-bit immediate (bits 6-12, 27, 36) */ - IA64_OPND_IMM9b, /* signed 9-bit immediate (bits 13-19, 27, 36) */ - IA64_OPND_IMM14, /* signed 14-bit immediate (bits 13-19, 27-32, 36) */ - IA64_OPND_IMM17, /* signed 17-bit immediate (2*bits 6-12, 24-31, 36) */ - IA64_OPND_IMMU21, /* unsigned 21-bit immediate (bits 6-25, 36) */ - IA64_OPND_IMM22, /* signed 22-bit immediate (bits 13-19, 22-36) */ - IA64_OPND_IMMU24, /* unsigned 24-bit immediate (bits 6-26, 31-32, 36) */ - IA64_OPND_IMM44, /* signed 44-bit immediate (2^16*bits 6-32, 36) */ - IA64_OPND_IMMU62, /* unsigned 62-bit immediate */ - IA64_OPND_IMMU64, /* unsigned 64-bit immediate (lotsa bits...) */ - IA64_OPND_INC3, /* signed 3-bit (bits 13-15): +/-1, 4, 8, 16 */ - IA64_OPND_LEN4, /* 4-bit count (bits 27-30 + 1) */ - IA64_OPND_LEN6, /* 6-bit count (bits 27-32 + 1) */ - IA64_OPND_MBTYPE4, /* 4-bit mux type (bits 20-23) */ - IA64_OPND_MHTYPE8, /* 8-bit mux type (bits 20-27) */ - IA64_OPND_POS6, /* 6-bit count (bits 14-19) */ - IA64_OPND_TAG13, /* signed 13-bit tag (ip + 16*bits 6-12, 33-34) */ - IA64_OPND_TAG13b, /* signed 13-bit tag (ip + 16*bits 24-32) */ - IA64_OPND_TGT25, /* signed 25-bit (ip + 16*bits 6-25, 36) */ - IA64_OPND_TGT25b, /* signed 25-bit (ip + 16*bits 6-12, 20-32, 36) */ - IA64_OPND_TGT25c, /* signed 25-bit (ip + 16*bits 13-32, 36) */ - IA64_OPND_TGT64, /* 64-bit (ip + 16*bits 13-32, 36, 2-40(L)) */ - IA64_OPND_LDXMOV, /* any symbol, generates R_IA64_LDXMOV. */ - - IA64_OPND_COUNT /* # of operand types (MUST BE LAST!) */ - }; - -enum ia64_dependency_mode -{ - IA64_DV_RAW, - IA64_DV_WAW, - IA64_DV_WAR, -}; - -enum ia64_dependency_semantics -{ - IA64_DVS_NONE, - IA64_DVS_IMPLIED, - IA64_DVS_IMPLIEDF, - IA64_DVS_DATA, - IA64_DVS_INSTR, - IA64_DVS_SPECIFIC, - IA64_DVS_STOP, - IA64_DVS_OTHER, -}; - -enum ia64_resource_specifier -{ - IA64_RS_ANY, - IA64_RS_AR_K, - IA64_RS_AR_UNAT, - IA64_RS_AR, /* 8-15, 20, 22-23, 31, 33-35, 37-39, 41-43, 45-47, 67-111 */ - IA64_RS_ARb, /* 48-63, 112-127 */ - IA64_RS_BR, - IA64_RS_CFM, - IA64_RS_CPUID, - IA64_RS_CR_IRR, - IA64_RS_CR_LRR, - IA64_RS_CR, /* 3-7,10-15,18,26-63,75-79,82-127 */ - IA64_RS_DBR, - IA64_RS_FR, - IA64_RS_FRb, - IA64_RS_GR0, - IA64_RS_GR, - IA64_RS_IBR, - IA64_RS_INSERVICE, /* CR[EOI] or CR[IVR] */ - IA64_RS_MSR, - IA64_RS_PKR, - IA64_RS_PMC, - IA64_RS_PMD, - IA64_RS_PR, /* non-rotating, 1-15 */ - IA64_RS_PRr, /* rotating, 16-62 */ - IA64_RS_PR63, - IA64_RS_RR, - - IA64_RS_ARX, /* ARs not in RS_AR or RS_ARb */ - IA64_RS_CRX, /* CRs not in RS_CR */ - IA64_RS_PSR, /* PSR bits */ - IA64_RS_RSE, /* implementation-specific RSE resources */ - IA64_RS_AR_FPSR, -}; - -enum ia64_rse_resource -{ - IA64_RSE_N_STACKED_PHYS, - IA64_RSE_BOF, - IA64_RSE_STORE_REG, - IA64_RSE_LOAD_REG, - IA64_RSE_BSPLOAD, - IA64_RSE_RNATBITINDEX, - IA64_RSE_CFLE, - IA64_RSE_NDIRTY, -}; - -/* Information about a given resource dependency */ -struct ia64_dependency -{ - /* Name of the resource */ - const char *name; - /* Does this dependency need further specification? */ - enum ia64_resource_specifier specifier; - /* Mode of dependency */ - enum ia64_dependency_mode mode; - /* Dependency semantics */ - enum ia64_dependency_semantics semantics; - /* Register index, if applicable (distinguishes AR, CR, and PSR deps) */ -#define REG_NONE (-1) - int regindex; - /* Special info on semantics */ - const char *info; -}; - -/* Two arrays of indexes into the ia64_dependency table. - chks are dependencies to check for conflicts when an opcode is - encountered; regs are dependencies to register (mark as used) when an - opcode is used. chks correspond to readers (RAW) or writers (WAW or - WAR) of a resource, while regs correspond to writers (RAW or WAW) and - readers (WAR) of a resource. */ -struct ia64_opcode_dependency -{ - int nchks; - const unsigned short *chks; - int nregs; - const unsigned short *regs; -}; - -/* encode/extract the note/index for a dependency */ -#define RDEP(N,X) (((N)<<11)|(X)) -#define NOTE(X) (((X)>>11)&0x1F) -#define DEP(X) ((X)&0x7FF) - -/* A template descriptor describes the execution units that are active - for each of the three slots. It also specifies the location of - instruction group boundaries that may be present between two slots. */ -struct ia64_templ_desc - { - int group_boundary; /* 0=no boundary, 1=between slot 0 & 1, etc. */ - enum ia64_unit exec_unit[3]; - const char *name; - }; - -/* The opcode table is an array of struct ia64_opcode. */ - -struct ia64_opcode - { - /* The opcode name. */ - const char *name; - - /* The type of the instruction: */ - enum ia64_insn_type type; - - /* Number of output operands: */ - int num_outputs; - - /* The opcode itself. Those bits which will be filled in with - operands are zeroes. */ - ia64_insn opcode; - - /* The opcode mask. This is used by the disassembler. This is a - mask containing ones indicating those bits which must match the - opcode field, and zeroes indicating those bits which need not - match (and are presumably filled in by operands). */ - ia64_insn mask; - - /* An array of operand codes. Each code is an index into the - operand table. They appear in the order which the operands must - appear in assembly code, and are terminated by a zero. */ - enum ia64_opnd operands[5]; - - /* One bit flags for the opcode. These are primarily used to - indicate specific processors and environments support the - instructions. The defined values are listed below. */ - unsigned int flags; - - /* Used by ia64_find_next_opcode (). */ - short ent_index; - - /* Opcode dependencies. */ - const struct ia64_opcode_dependency *dependencies; - }; - -/* Values defined for the flags field of a struct ia64_opcode. */ - -#define IA64_OPCODE_FIRST (1<<0) /* must be first in an insn group */ -#define IA64_OPCODE_X_IN_MLX (1<<1) /* insn is allowed in X slot of MLX */ -#define IA64_OPCODE_LAST (1<<2) /* must be last in an insn group */ -#define IA64_OPCODE_PRIV (1<<3) /* privileged instruct */ -#define IA64_OPCODE_SLOT2 (1<<4) /* insn allowed in slot 2 only */ -#define IA64_OPCODE_NO_PRED (1<<5) /* insn cannot be predicated */ -#define IA64_OPCODE_PSEUDO (1<<6) /* insn is a pseudo-op */ -#define IA64_OPCODE_F2_EQ_F3 (1<<7) /* constraint: F2 == F3 */ -#define IA64_OPCODE_LEN_EQ_64MCNT (1<<8) /* constraint: LEN == 64-CNT */ -#define IA64_OPCODE_MOD_RRBS (1<<9) /* modifies all rrbs in CFM */ -#define IA64_OPCODE_POSTINC (1<<10) /* postincrement MR3 operand */ - -/* A macro to extract the major opcode from an instruction. */ -#define IA64_OP(i) (((i) >> 37) & 0xf) - -enum ia64_operand_class - { - IA64_OPND_CLASS_CST, /* constant */ - IA64_OPND_CLASS_REG, /* register */ - IA64_OPND_CLASS_IND, /* indirect register */ - IA64_OPND_CLASS_ABS, /* absolute value */ - IA64_OPND_CLASS_REL, /* IP-relative value */ - }; - -/* The operands table is an array of struct ia64_operand. */ - -struct ia64_operand -{ - enum ia64_operand_class class; - - /* Set VALUE as the operand bits for the operand of type SELF in the - instruction pointed to by CODE. If an error occurs, *CODE is not - modified and the returned string describes the cause of the - error. If no error occurs, NULL is returned. */ - const char *(*insert) (const struct ia64_operand *self, ia64_insn value, - ia64_insn *code); - - /* Extract the operand bits for an operand of type SELF from - instruction CODE store them in *VALUE. If an error occurs, the - cause of the error is described by the string returned. If no - error occurs, NULL is returned. */ - const char *(*extract) (const struct ia64_operand *self, ia64_insn code, - ia64_insn *value); - - /* A string whose meaning depends on the operand class. */ - - const char *str; - - struct bit_field - { - /* The number of bits in the operand. */ - int bits; - - /* How far the operand is left shifted in the instruction. */ - int shift; - } - field[4]; /* no operand has more than this many bit-fields */ - - unsigned int flags; - - const char *desc; /* brief description */ -}; - -/* Values defined for the flags field of a struct ia64_operand. */ - -/* Disassemble as signed decimal (instead of hex): */ -#define IA64_OPND_FLAG_DECIMAL_SIGNED (1<<0) -/* Disassemble as unsigned decimal (instead of hex): */ -#define IA64_OPND_FLAG_DECIMAL_UNSIGNED (1<<1) - -extern const struct ia64_templ_desc ia64_templ_desc[16]; - -/* The tables are sorted by major opcode number and are otherwise in - the order in which the disassembler should consider instructions. */ -extern struct ia64_opcode ia64_opcodes_a[]; -extern struct ia64_opcode ia64_opcodes_i[]; -extern struct ia64_opcode ia64_opcodes_m[]; -extern struct ia64_opcode ia64_opcodes_b[]; -extern struct ia64_opcode ia64_opcodes_f[]; -extern struct ia64_opcode ia64_opcodes_d[]; - - -extern struct ia64_opcode *ia64_find_opcode (const char *name); -extern struct ia64_opcode *ia64_find_next_opcode (struct ia64_opcode *ent); - -extern struct ia64_opcode *ia64_dis_opcode (ia64_insn insn, - enum ia64_insn_type type); - -extern void ia64_free_opcode (struct ia64_opcode *ent); -extern const struct ia64_dependency *ia64_find_dependency (int index); - -/* To avoid circular library dependencies, this array is implemented - in bfd/cpu-ia64-opc.c: */ -extern const struct ia64_operand elf64_ia64_operands[IA64_OPND_COUNT]; - -#endif /* opcode_ia64_h */ diff -Nru xen-4.2.2/tools/debugger/xenitp/xenitp.c xen-4.3.0/tools/debugger/xenitp/xenitp.c --- xen-4.2.2/tools/debugger/xenitp/xenitp.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/debugger/xenitp/xenitp.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1732 +0,0 @@ -/* tools/debugger/xenitp.c - A low-level debugger. - - Based on xenctxt.c, but heavily modified. - Copyright 2007 Tristan Gingold - - Xenitp is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - Xenitp is distributed in the hope that 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, see . -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "xenctrl.h" -#include -#include "dis-asm.h" - -#ifdef __HYPERVISOR_ia64_debug_op -#define HAVE_DEBUG_OP -#include -#endif - -static xc_interface *xc_handle = 0; -static int domid = 0; -static vcpu_guest_context_t *cur_ctx; -static int cur_vcpu; - -#define PSR_BN (1UL << 44) -#define PSR_SS (1UL << 40) -#define PSR_DB (1UL << 24) -#define PSR_TB (1UL << 26) -#define PSR_DD (1UL << 39) -#define PSR_ID (1UL << 37) -#define PSR_IT (1UL << 36) -#define PSR_DT (1UL << 17) -#define PSR_RI_SHIFT 41 -#define CFM_SOF_MASK 0x3f - -int virt_to_phys (int is_inst, unsigned long vaddr, unsigned long *paddr); - -/* wrapper for vcpu_gest_context_any_t */ -static int xc_ia64_vcpu_getcontext(xc_interface *xc_handle, - uint32_t domid, - uint32_t vcpu, - vcpu_guest_context_t *ctxt) -{ - return xc_vcpu_getcontext(xc_handle, domid, vcpu, - (vcpu_guest_context_any_t *)ctxt); -} - -static inline unsigned int ctx_slot (vcpu_guest_context_t *ctx) -{ - return (ctx->regs.psr >> PSR_RI_SHIFT) & 3; -} - -unsigned char * -target_map_memory (unsigned long paddr) -{ - static unsigned long cur_page = (unsigned long)-1; - static unsigned char *cur_map = NULL; - - if ((paddr >> XC_PAGE_SHIFT) != cur_page) { - if (cur_map) { - munmap (cur_map, XC_PAGE_SIZE); - cur_map = NULL; - } - cur_page = paddr >> XC_PAGE_SHIFT; - cur_map = xc_map_foreign_range (xc_handle, domid, XC_PAGE_SIZE, - PROT_READ, cur_page); - if (cur_map == NULL) { - perror ("cannot map page"); - cur_page = -1; - return NULL; - } - } - return cur_map + (paddr & (XC_PAGE_SIZE - 1)); -} - -/* Get LENGTH bytes from info's buffer, at target address memaddr. - Transfer them to myaddr. */ -int -target_read_memory (bfd_vma memaddr, bfd_byte *myaddr, - unsigned int length, struct disassemble_info *info) -{ - int i; - unsigned long paddr; - - if (cur_ctx->regs.psr & PSR_IT) { - if (virt_to_phys (1, memaddr, &paddr) != 0) - return EIO; - } - else { - /* Clear UC. */ - paddr = memaddr & ~(1UL << 63); - } - - for (i = 0; i < length; i++) { - unsigned char *p = target_map_memory (paddr + i); - - if (p == NULL) - return EIO; - myaddr[i] = *p; - } - return 0; -} - -/* Print an error message. We can assume that this is in response to - an error return from buffer_read_memory. */ -void -perror_memory (int status, bfd_vma memaddr, struct disassemble_info *info) -{ - if (status != EIO) - /* Can't happen. */ - (*info->fprintf_func) (info->stream, "Unknown error %d\n", status); - else - /* Actually, address between memaddr and memaddr + len was - out of bounds. */ - (*info->fprintf_func) (info->stream, - "Address 0x%" PRIx64 " is out of bounds.\n", - memaddr); -} - -/* This could be in a separate file, to save miniscule amounts of space - in statically linked executables. */ - -/* Just print the address is hex. This is included for completeness even - though both GDB and objdump provide their own (to print symbolic - addresses). */ - -void -generic_print_address (bfd_vma addr, struct disassemble_info *info) -{ - (*info->fprintf_func) (info->stream, "0x%" PRIx64, addr); -} - -/* Just return the given address. */ - -int -generic_symbol_at_address (bfd_vma addr, struct disassemble_info * info) -{ - return 1; -} - -bfd_boolean -generic_symbol_is_valid (asymbol * sym ATTRIBUTE_UNUSED, - struct disassemble_info *info ATTRIBUTE_UNUSED) -{ - return 1; -} - -bfd_vma bfd_getl32 (const bfd_byte *addr) -{ - unsigned long v; - - v = (unsigned long) addr[0]; - v |= (unsigned long) addr[1] << 8; - v |= (unsigned long) addr[2] << 16; - v |= (unsigned long) addr[3] << 24; - - return (bfd_vma) v; -} - -bfd_vma bfd_getl64 (const bfd_byte *addr) -{ - unsigned long v; - - v = (unsigned long) addr[0]; - v |= (unsigned long) addr[1] << 8; - v |= (unsigned long) addr[2] << 16; - v |= (unsigned long) addr[3] << 24; - v |= (unsigned long) addr[4] << 32; - v |= (unsigned long) addr[5] << 40; - v |= (unsigned long) addr[6] << 48; - v |= (unsigned long) addr[7] << 56; - - return (bfd_vma) v; -} - -bfd_vma bfd_getb32 (const bfd_byte *addr) -{ - unsigned long v; - - v = (unsigned long) addr[0] << 24; - v |= (unsigned long) addr[1] << 16; - v |= (unsigned long) addr[2] << 8; - v |= (unsigned long) addr[3]; - - return (bfd_vma) v; -} - -bfd_vma bfd_getl16 (const bfd_byte *addr) -{ - unsigned long v; - - v = (unsigned long) addr[0]; - v |= (unsigned long) addr[1] << 8; - - return (bfd_vma) v; -} - -bfd_vma bfd_getb16 (const bfd_byte *addr) -{ - unsigned long v; - - v = (unsigned long) addr[0] << 24; - v |= (unsigned long) addr[1] << 16; - - return (bfd_vma) v; -} - -void -init_disassemble_info (struct disassemble_info *info, void *stream, - fprintf_ftype fprintf_func) -{ - memset (info, 0, sizeof (*info)); - - info->flavour = bfd_target_unknown_flavour; - info->arch = bfd_arch_unknown; - info->endian = BFD_ENDIAN_UNKNOWN; - info->octets_per_byte = 1; - info->fprintf_func = fprintf_func; - info->stream = stream; - info->read_memory_func = target_read_memory; - info->memory_error_func = perror_memory; - info->print_address_func = generic_print_address; - info->symbol_at_address_func = generic_symbol_at_address; - info->symbol_is_valid = generic_symbol_is_valid; - info->display_endian = BFD_ENDIAN_UNKNOWN; -} - - -void target_disas (FILE *out, unsigned long code, unsigned long size) -{ - unsigned long pc; - int count; - struct disassemble_info disasm_info; - - INIT_DISASSEMBLE_INFO(disasm_info, out, fprintf); - - disasm_info.read_memory_func = target_read_memory; -#if 0 - disasm_info.buffer = NULL; - disasm_info.buffer_vma = (unsigned long)code; - disasm_info.buffer_length = size; -#endif - - disasm_info.endian = BFD_ENDIAN_LITTLE; - disasm_info.mach = 0; //bfd_mach_ia64; - - for (pc = code; pc < code + size; pc += count) { - int slot = (pc & 0x0f) / 6; - fprintf (out, "0x%016lx+%d:%c ", pc & ~0x0fUL, slot, - ((pc & ~0x0fUL) == cur_ctx->regs.ip - && slot == ctx_slot (cur_ctx)) ? '*' : ' '); - - count = print_insn_ia64 (pc, &disasm_info); - -#if 0 - { - int i; - uint8_t b; - - fprintf (out, " {"); - for (i = 0; i < count; i++) { - target_read_memory (pc + i, &b, 1, &disasm_info); - fprintf (out, " %02x", b); - } - fprintf (out, " }"); - } -#endif - fprintf (out, "\n"); - if (count < 0) - break; - } -} - - -#define PTE_ED_SHIFT 52 -#define PTE_ED_MASK 1 -#define PTE_PPN_SHIFT 12 -#define PTE_PPN_MASK 0x3fffffffff -#define PTE_AR_SHIFT 9 -#define PTE_AR_MASK 7 -#define PTE_PL_SHIFT 7 -#define PTE_PL_MASK 3 -#define PTE_D_SHIFT 6 -#define PTE_D_MASK 1 -#define PTE_A_SHIFT 5 -#define PTE_A_MASK 1 -#define PTE_MA_SHIFT 2 -#define PTE_MA_MASK 7 -#define PTE_P_SHIFT 0 -#define PTE_P_MASK 1 -#define ITIR_KEY_SHIFT 8 -#define ITIR_KEY_MASK 0xffffff -#define ITIR_PS_SHIFT 2 -#define ITIR_PS_MASK 0x3f -#define ITIR_PS_MIN 12 -#define ITIR_PS_MAX 28 -#define RR_RID_SHIFT 8 -#define RR_RID_MASK 0xffffff -#define RR_PS_SHIFT 2 -#define RR_PS_MASK 0x3f -#define RR_VE_MASK 1 - -static const char *get_ps (int ps_val) -{ - static const char ps[][5] = {" 4K", " 8K", " 16K", " ", - " 64K", " ", "256K", " ", - " 1M", " ", " 4M", " ", - " 16M", " ", " 64M", " ", - "256M"}; - return ((ps_val >= ITIR_PS_MIN && ps_val <= ITIR_PS_MAX) ? - ps[ps_val - ITIR_PS_MIN] : " "); - -} - -static void print_a_tr (int i, const struct ia64_tr_entry *tr) -{ - int ps_val, ma_val; - unsigned long pa; - - static const char ma[][4] = {"WB ", " ", " ", " ", - "UC ", "UCE", "WC ", "Nat"}; - - ps_val = tr->itir >> ITIR_PS_SHIFT & ITIR_PS_MASK; - ma_val = tr->pte >> PTE_MA_SHIFT & PTE_MA_MASK; - pa = (tr->pte >> PTE_PPN_SHIFT & PTE_PPN_MASK) << PTE_PPN_SHIFT; - pa = (pa >> ps_val) << ps_val; - printf (" [%2d] %ld %06lx %016lx %013lx %02d %s %ld %ld %ld %ld " - "%ld %d %s %06lx\n", i, - tr->pte >> PTE_P_SHIFT & PTE_P_MASK, - tr->rid >> RR_RID_SHIFT & RR_RID_MASK, - tr->vadr, pa, ps_val, get_ps (ps_val), - tr->pte >> PTE_ED_SHIFT & PTE_ED_MASK, - tr->pte >> PTE_PL_SHIFT & PTE_PL_MASK, - tr->pte >> PTE_AR_SHIFT & PTE_AR_MASK, - tr->pte >> PTE_A_SHIFT & PTE_A_MASK, - tr->pte >> PTE_D_SHIFT & PTE_D_MASK, - ma_val, ma[ma_val], - tr->itir >> ITIR_KEY_SHIFT & ITIR_KEY_MASK); -} - -void print_ctx (vcpu_guest_context_t *ctx) -{ - struct vcpu_guest_context_regs *regs = &ctx->regs; - int i; - unsigned int rbs_size, cfm_sof; - - rbs_size = (regs->ar.bsp - regs->ar.bspstore) / 8; - cfm_sof = (regs->cfm & CFM_SOF_MASK); - printf ("bspstore: %016lx bsp: %016lx rbs_size=%d, sof=%d\n", - regs->ar.bspstore, regs->ar.bsp, rbs_size, cfm_sof); - - for (i = 0; i < cfm_sof; i++) { - int off = cfm_sof - i; - unsigned int rbs_off = - (((62 - ((rbs_size + regs->rbs_voff) % 64) + off)) / 63) + off; - if (rbs_off > rbs_size) - break; - printf (" r%02d: %016lx%s", 32 + i, - regs->rbs[rbs_size - rbs_off], - (i % 3) != 2 ? " " : "\n"); - } - if ((i % 3) != 0) - printf ("\n"); - - printf ("\n"); - printf (" r1: %016lx ", regs->r[1]); - printf (" r2: %016lx ", regs->r[2]); - printf (" r3: %016lx\n", regs->r[3]); - printf (" r4: %016lx ", regs->r[4]); - printf (" r5: %016lx ", regs->r[5]); - printf (" r6: %016lx\n", regs->r[6]); - printf (" r7: %016lx ", regs->r[7]); - printf (" r8: %016lx ", regs->r[8]); - printf (" r9: %016lx\n", regs->r[9]); - printf (" r10: %016lx ", regs->r[10]); - printf (" r11: %016lx ", regs->r[11]); - printf (" sp: %016lx\n", regs->r[12]); - printf (" tp: %016lx ", regs->r[13]); - printf (" r14: %016lx ", regs->r[14]); - printf (" r15: %016lx\n", regs->r[15]); - printf (" r16: %016lx ", regs->r[16]); - printf (" r17: %016lx ", regs->r[17]); - printf (" r18: %016lx\n", regs->r[18]); - printf (" r19: %016lx ", regs->r[19]); - printf (" r20: %016lx ", regs->r[20]); - printf (" r21: %016lx\n", regs->r[21]); - printf (" r22: %016lx ", regs->r[22]); - printf (" r23: %016lx ", regs->r[23]); - printf (" r24: %016lx\n", regs->r[24]); - printf (" r25: %016lx ", regs->r[25]); - printf (" r26: %016lx ", regs->r[26]); - printf (" r27: %016lx\n", regs->r[27]); - printf (" r28: %016lx ", regs->r[28]); - printf (" r29: %016lx ", regs->r[29]); - printf (" r30: %016lx\n", regs->r[30]); - printf (" r31: %016lx ", regs->r[31]); - printf (" "); - printf (" b0: %016lx\n", regs->b[0]); - - printf ("\n"); - printf (" psr: %016lx ", regs->psr); - printf (" cfm: %016lx ", regs->cfm); - printf (" pr: %016lx\n", regs->pr); - - printf ("\n"); - printf (" ip: %016lx+%d", regs->ip, (int)(regs->psr >> PSR_RI_SHIFT) & 3); - printf ("\n"); - target_disas (stdout, regs->ip, 16); -} - -void print_br (vcpu_guest_context_t *ctx) -{ - struct vcpu_guest_context_regs *regs = &ctx->regs; - - printf (" b0: %016lx ", regs->b[0]); - printf (" b1: %016lx ", regs->b[1]); - printf (" b2: %016lx\n", regs->b[2]); - printf (" b3: %016lx ", regs->b[3]); - printf (" b4: %016lx ", regs->b[4]); - printf (" b5: %016lx\n", regs->b[5]); - printf (" b6: %016lx ", regs->b[6]); - printf (" b7: %016lx\n", regs->b[7]); -} - -void print_regs (vcpu_guest_context_t *ctx) -{ - struct vcpu_guest_context_regs *regs = &ctx->regs; - - printf (" r1: %016lx ", regs->r[1]); - printf (" r2: %016lx ", regs->r[2]); - printf (" r3: %016lx\n", regs->r[3]); - printf (" r4: %016lx ", regs->r[4]); - printf (" r5: %016lx ", regs->r[5]); - printf (" r6: %016lx\n", regs->r[6]); - printf (" r7: %016lx ", regs->r[7]); - printf (" r8: %016lx ", regs->r[8]); - printf (" r9: %016lx\n", regs->r[9]); - printf (" r10: %016lx ", regs->r[10]); - printf (" r11: %016lx ", regs->r[11]); - printf (" sp: %016lx\n", regs->r[12]); - printf (" tp: %016lx ", regs->r[13]); - printf (" r14: %016lx ", regs->r[14]); - printf (" r15: %016lx\n", regs->r[15]); - - printf (" Bank %d (current) Bank %d\n", - (regs->psr & PSR_BN) ? 1 : 0, (regs->psr & PSR_BN) ? 0 : 1); - printf ("16:%016lx ", regs->r[16]); - printf ("17:%016lx ", regs->r[17]); - printf ("16:%016lx ", regs->bank[0]); - printf ("17:%016lx\n", regs->bank[1]); - printf ("18:%016lx ", regs->r[18]); - printf ("19:%016lx ", regs->r[19]); - printf ("18:%016lx ", regs->bank[2]); - printf ("19:%016lx\n", regs->bank[3]); - printf ("20:%016lx ", regs->r[20]); - printf ("21:%016lx ", regs->r[21]); - printf ("20:%016lx ", regs->bank[4]); - printf ("21:%016lx\n", regs->bank[5]); - printf ("22:%016lx ", regs->r[22]); - printf ("23:%016lx ", regs->r[23]); - printf ("22:%016lx ", regs->bank[6]); - printf ("23:%016lx\n", regs->bank[7]); - printf ("24:%016lx ", regs->r[24]); - printf ("25:%016lx ", regs->r[25]); - printf ("24:%016lx ", regs->bank[8]); - printf ("25:%016lx\n", regs->bank[9]); - printf ("26:%016lx ", regs->r[26]); - printf ("27:%016lx ", regs->r[27]); - printf ("26:%016lx ", regs->bank[10]); - printf ("27:%016lx\n", regs->bank[11]); - printf ("28:%016lx ", regs->r[28]); - printf ("29:%016lx ", regs->r[29]); - printf ("28:%016lx ", regs->bank[12]); - printf ("29:%016lx\n", regs->bank[13]); - printf ("30:%016lx ", regs->r[30]); - printf ("31:%016lx ", regs->r[31]); - printf ("30:%016lx ", regs->bank[14]); - printf ("31:%016lx\n", regs->bank[15]); - printf ("\n"); -} - -void print_cr (vcpu_guest_context_t *ctx) -{ - struct vcpu_guest_context_regs *regs = &ctx->regs; - - printf (" dcr: %016lx ", regs->cr.dcr); - printf (" itm: %016lx ", regs->cr.itm); - printf (" iva: %016lx\n", regs->cr.iva); - printf (" pta: %016lx ", regs->cr.pta); - printf (" ipsr: %016lx ", regs->cr.ipsr); - printf (" isr: %016lx\n", regs->cr.isr); - printf (" iip: %016lx ", regs->cr.iip); - printf (" ifa: %016lx ", regs->cr.ifa); - printf (" itir: %016lx\n", regs->cr.itir); - printf (" iipa: %016lx ", regs->cr.iipa); - printf (" ifs: %016lx ", regs->cr.ifs); - printf (" iim: %016lx\n", regs->cr.iim); - printf (" iha: %016lx ", regs->cr.iha); - printf (" lid: %016lx ", regs->cr.lid); - printf (" ivr: %016lx\n", regs->cr.ivr); - printf (" tpr: %016lx ", regs->cr.tpr); - printf (" eoi: %016lx ", regs->cr.eoi); - printf (" irr0: %016lx\n", regs->cr.irr[0]); - printf (" irr1: %016lx ", regs->cr.irr[1]); - printf (" irr2: %016lx ", regs->cr.irr[2]); - printf (" irr3: %016lx\n", regs->cr.irr[3]); - printf (" itv: %016lx ", regs->cr.itv); - printf (" pmv: %016lx ", regs->cr.pmv); - printf (" cmcv: %016lx\n", regs->cr.cmcv); - printf (" lrr0: %016lx ", regs->cr.lrr0); - printf (" lrr1: %016lx ", regs->cr.lrr1); - printf (" ev_cb:%016lx\n", ctx->event_callback_ip); -} - -void print_ar (vcpu_guest_context_t *ctx) -{ - struct vcpu_guest_context_regs *regs = &ctx->regs; - - printf (" kr0: %016lx ", regs->ar.kr[0]); - printf (" kr1: %016lx ", regs->ar.kr[1]); - printf (" kr2: %016lx\n", regs->ar.kr[2]); - printf (" kr3: %016lx ", regs->ar.kr[3]); - printf (" kr4: %016lx ", regs->ar.kr[4]); - printf (" kr5: %016lx\n", regs->ar.kr[5]); - printf (" kr6: %016lx ", regs->ar.kr[6]); - printf (" kr7: %016lx ", regs->ar.kr[7]); - printf (" rsc: %016lx\n", regs->ar.rsc); - printf (" bsp: %016lx ", regs->ar.bsp); - printf (" bsps: %016lx ", regs->ar.bspstore); - printf (" rnat: %016lx\n", regs->ar.rnat); - printf (" csd: %016lx ", regs->ar.csd); - printf (" ccv: %016lx ", regs->ar.ccv); - printf (" unat: %016lx\n", regs->ar.unat); - printf (" fpsr: %016lx ", regs->ar.fpsr); - printf (" itc: %016lx\n", regs->ar.itc); - printf (" pfs: %016lx ", regs->ar.pfs); - printf (" lc: %016lx ", regs->ar.lc); - printf (" ec: %016lx\n", regs->ar.ec); -} - -void print_a_rr (int num, unsigned long rr) -{ - int ps_val = (rr >> RR_PS_SHIFT) & RR_PS_MASK; - - printf (" [%d] %06lx %02x %s %ld\n", - num, (rr >> RR_RID_SHIFT) & RR_RID_MASK, - ps_val, get_ps (ps_val), rr & RR_VE_MASK); -} - -void print_rr (vcpu_guest_context_t *ctx) -{ - struct vcpu_guest_context_regs *regs = &ctx->regs; - int i; - - printf (" rr: rid ps ve\n"); - for (i = 0; i < 8; i++) - print_a_rr (i, regs->rr[i]); -} - -void print_db (vcpu_guest_context_t *ctx) -{ - struct vcpu_guest_context_regs *regs = &ctx->regs; - int i; - - for (i = 0; i < 7; i += 2) - printf (" ibr[%d]: %016lx ibr[%d]: %016lx\n", - i, regs->ibr[i], i + 1, regs->ibr[i + 1]); - printf ("\n"); - for (i = 0; i < 7; i += 2) - printf (" dbr[%d]: %016lx dbr[%d]: %016lx\n", - i, regs->dbr[i], i + 1, regs->dbr[i + 1]); -} - -struct bit_descr { - const char *name; - unsigned char sz; -}; - -const struct bit_descr psr_bits[] = - { - {"", 1 }, {"be", 1 }, {"up", 1 }, {"ac", 1 }, - {"mfl", 1 }, {"mfh", 1 }, {"", 7 }, - {"ic", 1 }, {"i", 1 }, {"pk", 1 }, - {"", 1 }, {"dt", 1 }, {"dfl", 1 }, {"dfh", 1 }, - {"sp", 1 }, {"pp", 1 }, {"di", 1 }, {"si", 1 }, - {"db", 1 }, {"lp", 1 }, {"tb", 1 }, {"rt", 1 }, - {"", 4 }, - {"cpl", 2 }, {"is", 1 }, {"mc", 1 }, - {"it", 1 }, {"id", 1 }, {"da", 1 }, {"dd", 1 }, - {"ss", 1 }, {"ri", 2 }, {"ed", 1 }, - {"bn", 1 }, {"ia", 1 }, {"vm", 1 }, - {NULL, 0 } - }; - -void print_bits (const struct bit_descr *desc, unsigned long val) -{ - const struct bit_descr *d; - unsigned int off; - - /* Reverse order. */ - for (d = desc, off = 0; d->name; d++) - off += d->sz; - - d--; - - while (1) { - off -= d->sz; - if (*d->name) { - if (d->sz != 1 || ((val >> off) & 1)) - printf (" %s", d->name); - if (d->sz != 1) - printf ("=%lx", (val >> off) & ((1 << d->sz) - 1)); - } - if (d == desc) - break; - d--; - } -} - -void print_tr (vcpu_guest_context_t *ctx) -{ - struct vcpu_tr_regs *tr = &ctx->regs.tr; - int i; - - printf ("\n itr: P rid va pa ps ed pl " - "ar a d ma key\n"); - - for (i = 0; i < sizeof (tr->itrs) / sizeof (tr->itrs[0]); i++) - print_a_tr (i, &tr->itrs[i]); - - printf ("\n dtr: P rid va pa ps ed pl " - "ar a d ma key\n"); - - for (i = 0; i < sizeof (tr->dtrs) / sizeof (tr->dtrs[0]); i++) - print_a_tr (i, &tr->dtrs[i]); -} - -int lock_pages (void *addr, size_t len); -void unlock_pages (void *addr, size_t len); -int do_xen_hypercall (xc_interface *xc_handle, privcmd_hypercall_t *hypercall); - -#ifdef HAVE_DEBUG_OP -static int do_ia64_debug_op (xc_interface *xc_handle, - unsigned long cmd, unsigned long domain, - xen_ia64_debug_op_t *op) -{ - int ret = -1; - privcmd_hypercall_t hypercall; - - hypercall.op = __HYPERVISOR_ia64_debug_op; - hypercall.arg[0] = cmd; - hypercall.arg[1] = domain; - hypercall.arg[2] = (unsigned long)op; - - if (lock_pages (op, sizeof (*op)) != 0) { - perror ("Could not lock memory for Xen hypercall"); - goto out1; - } - - ret = do_xen_hypercall (xc_handle, &hypercall); - if (ret < 0) { - if (errno == EACCES) - fprintf (stderr,"domctl operation failed -- need to " - "rebuild the user-space tool set?\n"); - } - - unlock_pages (op, sizeof (*op)); - -out1: - return ret; -} -#endif - -static volatile int ctrl_c_hit; - -void ctrl_c_handler (int sig) -{ - ctrl_c_hit = 1; -} - -int wait_domain (int vcpu, vcpu_guest_context_t *ctx) -{ - struct timespec ts; - xc_dominfo_t dominfo; - int ret; - int cnt = 0; - - ts.tv_sec = 0; - ts.tv_nsec = 10*1000*1000; - - ret = xc_domain_unpause (xc_handle, domid); - if (ret < 0) - perror ("xc_domain_unpause"); - - ctrl_c_hit = 0; - - while (1) { - ret = xc_domain_getinfo (xc_handle, domid, 1, &dominfo); - if (ret < 0) - perror ("xc_domain_getinfo"); - - if (dominfo.paused) - break; - - if (ctrl_c_hit) { - fflush (stdout); - /* Force pause. */ - ret = xc_domain_pause (xc_handle, domid); - if (ret < 0) - perror ("xc_domain_pause"); - - break; - } - - printf ("%c\b", "/-\\|"[(cnt++) % 4]); - fflush (stdout); - nanosleep (&ts, NULL); - } - return xc_ia64_vcpu_getcontext (xc_handle, domid, vcpu, ctx); -} - -int virt_to_phys (int is_inst, unsigned long vaddr, unsigned long *paddr) -{ - struct vcpu_tr_regs *trs = &cur_ctx->regs.tr; - struct ia64_tr_entry *tr; - int i; - int num; - - /* Search in tr. */ - if (is_inst) { - tr = trs->itrs; - num = sizeof (trs->itrs) / sizeof (trs->itrs[0]); - } - else { - tr = trs->dtrs; - num = sizeof (trs->dtrs) / sizeof (trs->dtrs[0]); - } - for (i = 0; i < num; i++, tr++) { - int ps_val = (tr->itir >> ITIR_PS_SHIFT) & ITIR_PS_MASK; - unsigned long ps_mask = (-1L) << ps_val; - - if ((tr->vadr & ps_mask) == (vaddr & ps_mask)) { - *paddr = ((tr->pte & (PTE_PPN_MASK << PTE_PPN_SHIFT)) & ps_mask) | - (vaddr & ~ps_mask); - return 0; - } - } - return -1; -} - -unsigned long * -get_reg_addr (const char *name) -{ - if (strcmp (name, "ip") == 0) - return &cur_ctx->regs.ip; - else if (strcmp (name, "psr") == 0) - return &cur_ctx->regs.psr; - else if (strcmp (name, "iip") == 0) - return &cur_ctx->regs.cr.iip; - else if (strcmp (name, "b0") == 0) - return &cur_ctx->regs.b[0]; - else - return 0; -} - -enum prio_expr {EXPR_BASE, EXPR_SUM, EXPR_LOGIC, EXPR_PROD}; - -int parse_expr (char **buf, unsigned long *res, enum prio_expr prio); - -int next_char (char **buf) -{ - char *b; - - b = *buf; - while (isspace ((unsigned char)*b)) - b++; - *buf = b; - return *b; -} - -int parse_unary (char **buf, unsigned long *res) -{ - char c; - - c = next_char (buf); - switch (c) { - case '0' ... '9': - { - char *e; - *res = strtoul (*buf, &e, 0); - if (e == *buf) { - printf ("bad literal\n"); - return -1; - } - *buf = e; - } - break; - case '+': - (*buf)++; - return parse_unary (buf, res); - case '$': - { - char *b; - char *e; - char c; - unsigned long *reg; - int len; - - b = *buf; - e = b + 1; - - while ((*e >= 'a' && *e <= 'z') || - (*e >= 'A' && *e <= 'Z') || - (*e >= '0' && *e <= '9') || - (*e == '_' || *e == '.')) - e++; - - if (b == e) { - printf ("identifier missing after '$'\n"); - return -1; - } - - b++; - len = e - b; - - c = b[len]; - b[len] = 0; - reg = get_reg_addr (b); - b[len] = c; - - if (reg != NULL) - *res = *reg; - else if (strncmp (b, "d2p", len) == 0 || - strncmp (b, "i2p", len) == 0) { - unsigned long vaddr; - - *buf = e; - if (parse_unary (buf, &vaddr) != 0) - return -1; - if (virt_to_phys (*b == 'i', vaddr, res) != 0) { - printf ("cannot find vaddr %016lx in tr\n", vaddr); - return -1; - } - return 0; - } - else { - printf ("unknown symbol\n"); - return -1; - } - *buf = e; - } - break; - case '(': - (*buf)++; - if (parse_expr (buf, res, EXPR_BASE) != 0) - return -1; - - if (next_char (buf) != ')') { - printf ("missing ')'\n"); - return -1; - } - else - (*buf)++; - break; - default: - printf ("unknown operand '%c' in expression\n", c); - return -1; - } - - return 0; -} - -int parse_expr (char **buf, unsigned long *res, enum prio_expr prio) -{ - unsigned long val = 0; - unsigned long val1; - char c; - - if (parse_unary (buf, &val) != 0) - return -1; - - while (1) { - c = next_char (buf); - switch (c) { - case '+': - case '-': - if (prio > EXPR_SUM) - return 0; - (*buf)++; - if (parse_expr (buf, &val1, EXPR_SUM) < 0) - return -1; - if (c == '+') - val += val1; - else - val -= val1; - break; - case '*': - if (prio > EXPR_PROD) - return 0; - - (*buf)++; - if (parse_expr (buf, &val1, EXPR_SUM) < 0) - return -1; - - val *= val1; - break; - default: - *res = val; - return 0; - } - } -} - -char *parse_arg (char **buf) -{ - char *res; - char *b = *buf; - - /* Eat leading spaces. */ - while (isspace ((unsigned char)*b)) - b++; - - res = b; - while (*b && !isspace ((unsigned char)*b)) - b++; - - /* Set the NUL terminator. */ - if (*b) - *b++ = 0; - - *buf = b; - return res; -} - -vcpu_guest_context_any_t *vcpu_ctx_any; - -int vcpu_setcontext (int vcpu) -{ - int ret; - - ret = xc_vcpu_setcontext (xc_handle, domid, vcpu, &vcpu_ctx_any[vcpu]); - if (ret < 0) - perror ("xc_vcpu_setcontext"); - - return ret; -} - -enum cmd_status { CMD_ERROR, CMD_OK, CMD_REPEAT, CMD_QUIT }; - -struct command_desc -{ - const char *name; - const char *help; - enum cmd_status (*cmd)(char *line); -}; - -static enum cmd_status -cmd_registers (char *line) -{ - print_ctx (cur_ctx); - return CMD_OK; -} - -static enum cmd_status -cmd_sstep (char *line) -{ - /* Set psr.dd and psr.id to skip over current breakpoint. */ - cur_ctx->regs.psr |= PSR_SS | PSR_DD | PSR_ID; - cur_ctx->regs.psr &= ~PSR_TB; - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - - if (wait_domain (cur_vcpu, cur_ctx) < 0) { - perror ("wait_domain"); - return CMD_ERROR; - } - - print_ctx (cur_ctx); - - return CMD_REPEAT; -} - -static enum cmd_status -cmd_go (char *line) -{ - unsigned long n = 1; - - if (*line != 0) { - if (parse_expr (&line, &n, 0) < 0) - return CMD_ERROR; - } - while (n > 0) { - /* Set psr.dd and psr.id to skip over current breakpoint. */ - if ((cur_ctx->regs.psr & (PSR_SS | PSR_TB | PSR_DB)) != 0) { - cur_ctx->regs.psr &= ~(PSR_SS | PSR_TB); - cur_ctx->regs.psr |= PSR_DD | PSR_ID; - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - } - - if (wait_domain (cur_vcpu, cur_ctx) < 0) { - perror ("wait_domain"); - return CMD_ERROR; - } - print_ctx (cur_ctx); - n--; - } - - return CMD_REPEAT; -} - -static enum cmd_status -cmd_cb (char *line) -{ - if ((cur_ctx->regs.psr & (PSR_SS | PSR_TB)) != PSR_TB) { - cur_ctx->regs.psr &= ~PSR_SS; - cur_ctx->regs.psr |= PSR_TB; - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - } - - if (wait_domain (cur_vcpu, cur_ctx) < 0) { - perror ("wait_domain"); - return CMD_ERROR; - } - - print_ctx (cur_ctx); - - return CMD_REPEAT; -} - -static int quit_paused; - -static enum cmd_status -cmd_quit (char *line) -{ - if (!strcmp (line, "paused")) - quit_paused = 1; - return CMD_QUIT; -} - -static enum cmd_status -cmd_echo (char *line) -{ - printf ("%s", line); - return CMD_OK; -} - -static enum cmd_status -cmd_disassemble (char *args) -{ - static unsigned long addr; - unsigned long end_addr = addr + 16; - - if (*args != 0) { - if (parse_expr (&args, &addr, 0) < 0) - return CMD_ERROR; - if (*args != 0) { - if (parse_expr (&args, &end_addr, 0) < 0) - return CMD_ERROR; - } - else - end_addr = addr + 16; - } - target_disas (stdout, addr, end_addr - addr); - addr = end_addr; - return CMD_REPEAT; -} - -static enum cmd_status -cmd_dump (char *args) -{ - static unsigned long addr; - unsigned long end_addr = addr + 256; - unsigned long p; - - if (*args != 0) { - if (parse_expr (&args, &addr, 0) < 0) - return CMD_ERROR; - if (*args != 0) { - if (parse_expr (&args, &end_addr, 0) < 0) - return CMD_ERROR; - } - else - end_addr = addr + 256; - } - for (p = addr; p < end_addr; p += 16) { - int i; - printf ("%016lx:", p); - for (i = 0; i < 16; i++) { - unsigned char *m = target_map_memory (p + i); - printf ("%c%02x", i == 8 ? '-' : ' ', *m); - } - printf ("\n"); - } - addr = end_addr; - return CMD_REPEAT; -} - -static enum cmd_status -cmd_break (char *args) -{ - unsigned long addr; - int i; - - for (i = 0; i < 4; i++) - if (cur_ctx->regs.ibr[2 * i] == 0 && cur_ctx->regs.ibr[2 * i + 1] == 0) - break; - - if (i == 4) { - printf ("no availabe break points\n"); - return CMD_ERROR; - } - - if (parse_expr (&args, &addr, 0) < 0) - return CMD_ERROR; - - cur_ctx->regs.ibr[2 * i] = addr; - cur_ctx->regs.ibr[2 * i + 1] = 0x87fffffffffffff0UL; - cur_ctx->regs.psr |= PSR_DB; - - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - else - return CMD_OK; -} - -static enum cmd_status -cmd_watch (char *args) -{ - unsigned long addr; - unsigned long mask; - int i; - - for (i = 0; i < 4; i++) - if (cur_ctx->regs.dbr[2 * i] == 0 && cur_ctx->regs.dbr[2 * i + 1] == 0) - break; - - if (i == 4) { - printf ("no availabe watch points\n"); - return CMD_ERROR; - } - - if (parse_expr (&args, &addr, 0) < 0) - return CMD_ERROR; - - if (*args == 0) - mask = 3; - else if (parse_expr (&args, &mask, 0) < 0) - return CMD_ERROR; - - cur_ctx->regs.dbr[2 * i] = addr; - cur_ctx->regs.dbr[2 * i + 1] = ~((1UL << mask) - 1) | (0xc7UL << 56); - cur_ctx->regs.psr |= PSR_DB; - - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - else { - printf ("Watchpoint %d set\n", i); - return CMD_OK; - } -} - -static enum cmd_status -cmd_delete (char *args) -{ - unsigned long num; - - if (parse_expr (&args, &num, 0) < 0) - return CMD_ERROR; - - if (num < 4) { - cur_ctx->regs.ibr[2 * num] = 0; - cur_ctx->regs.ibr[2 * num + 1] = 0; - } - else if (num < 8) { - num -= 4; - cur_ctx->regs.dbr[2 * num] = 0; - cur_ctx->regs.dbr[2 * num + 1] = 0; - } - else { - printf ("breakpoint out of range\n"); - return CMD_ERROR; - } - - cur_ctx->regs.psr |= PSR_DB; - - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - else - return CMD_OK; -} - -static enum cmd_status -cmd_disable (char *args) -{ - unsigned long num; - - if (parse_expr (&args, &num, 0) < 0) - return CMD_ERROR; - - if (num >= 4) { - printf ("breakpoint out of range\n"); - return CMD_ERROR; - } - - cur_ctx->regs.ibr[2 * num + 1] &= ~(1UL << 63); - - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - else - return CMD_OK; -} - -static enum cmd_status -cmd_enable (char *args) -{ - unsigned long num; - - if (parse_expr (&args, &num, 0) < 0) - return CMD_ERROR; - - if (num >= 4) { - printf ("breakpoint out of range\n"); - return CMD_ERROR; - } - - cur_ctx->regs.ibr[2 * num + 1] |= 1UL << 63; - - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - else - return CMD_OK; -} - -static enum cmd_status -cmd_print (char *args) -{ - unsigned long addr; - - if (parse_expr (&args, &addr, 0) < 0) - return CMD_ERROR; - - printf ("res: 0x%016lx = %ld\n", addr, addr); - - return CMD_OK; -} - -struct bit_xlat { - unsigned int bit; - const char *name; -}; - -static const struct bit_xlat debug_flags[] = { - { XEN_IA64_DEBUG_ON_KERN_SSTEP, "sstep" }, - { XEN_IA64_DEBUG_ON_KERN_DEBUG, "debug" }, - { XEN_IA64_DEBUG_ON_KERN_TBRANCH, "tbranch" }, - { XEN_IA64_DEBUG_ON_EXTINT, "extint" }, - { XEN_IA64_DEBUG_ON_EXCEPT, "except" }, - { XEN_IA64_DEBUG_ON_EVENT, "event" }, - { XEN_IA64_DEBUG_ON_PRIVOP, "privop" }, - { XEN_IA64_DEBUG_ON_PAL, "pal" }, - { XEN_IA64_DEBUG_ON_SAL, "sal" }, - { XEN_IA64_DEBUG_ON_EFI, "efi" }, - { XEN_IA64_DEBUG_ON_RFI, "rfi" }, - { XEN_IA64_DEBUG_ON_MMU, "mmu" }, - { XEN_IA64_DEBUG_ON_BAD_MPA, "mpa" }, - { XEN_IA64_DEBUG_FORCE_SS, "ss" }, - { XEN_IA64_DEBUG_FORCE_DB, "db" }, - { XEN_IA64_DEBUG_ON_TR, "tr" }, - { XEN_IA64_DEBUG_ON_TC, "tc" }, -#if 0 - { XEN_IA64_DEBUG_ON_KEYS, "keys" }, - { XEN_IA64_DEBUG_ON_MOV_TO_CR, "mov_to_cr" }, - { XEN_IA64_DEBUG_ON_VHPT, "vhpt" }, - { XEN_IA64_DEBUG_ON_IOSAPIC, "iosapic" }, -#endif - { 0, NULL } -}; - -static enum cmd_status -cmd_disp (char *arg) -{ - if (strcmp (arg, "br") == 0) - print_br (cur_ctx); - else if (strcmp (arg, "regs") == 0) - print_regs (cur_ctx); - else if (strcmp (arg, "cr") == 0) - print_cr (cur_ctx); - else if (strcmp (arg, "ar") == 0) - print_ar (cur_ctx); - else if (strcmp (arg, "tr") == 0) - print_tr (cur_ctx); - else if (strcmp (arg, "rr") == 0) - print_rr (cur_ctx); - else if (strcmp (arg, "db") == 0) - print_db (cur_ctx); - else if (strcmp (arg, "psr") == 0) { - printf ("psr:"); - print_bits (psr_bits, cur_ctx->regs.psr); - printf ("\n"); - } - else if (strcmp (arg, "ipsr") == 0) { - printf ("ipsr:"); - print_bits (psr_bits, cur_ctx->regs.cr.ipsr); - printf ("\n"); - } - else if (strcmp (arg, "break") == 0) { - int i; - - for (i = 0; i < 4; i++) - if (cur_ctx->regs.ibr[2 * i + 1]) - printf ("%d: 0x%016lx %s\n", i, cur_ctx->regs.ibr[2 * i], - (cur_ctx->regs.ibr[2 * i + 1] & (1UL << 63)) ? - "enabled" : "disabled"); - for (i = 0; i < 4; i++) - if (cur_ctx->regs.dbr[2 * i + 1]) - printf ("%d: 0x%016lx %s\n", i, cur_ctx->regs.dbr[2 * i], - (cur_ctx->regs.dbr[2 * i + 1] & (1UL << 63)) ? - "enabled" : "disabled"); - } - else if (strcmp (arg, "domain") == 0) { - xc_dominfo_t dominfo; -#ifdef HAVE_DEBUG_OP - xen_ia64_debug_op_t debug_op; - int i; -#endif - if (xc_domain_getinfo (xc_handle, domid, 1, &dominfo) < 0) { - perror ("xc_domain_getinfo"); - return 0; - } - - printf ("id=%d nr_pages=%lu shared_info_frame=%lu max_mem=%luKB\n", - dominfo.domid, dominfo.nr_pages, dominfo.shared_info_frame, - dominfo.max_memkb); - printf (" nr_online_vcpu=%u max_vcpu_id=%u\n", - dominfo.nr_online_vcpus, dominfo.max_vcpu_id); - printf (" status:"); - if (dominfo.dying) - printf (" dying"); - if (dominfo.crashed) - printf (" crashed"); - if (dominfo.shutdown) - printf (" shutdown(%u)", dominfo.shutdown_reason); - if (dominfo.paused) - printf (" paused"); - if (dominfo.blocked) - printf (" blocked"); - if (dominfo.running) - printf (" running"); - if (dominfo.hvm) - printf (" hvm"); - if (dominfo.debugged) - printf (" debug"); - printf ("\n"); - -#ifdef HAVE_DEBUG_OP - if (do_ia64_debug_op (xc_handle, XEN_IA64_DEBUG_OP_GET_FLAGS, - domid, &debug_op) < 0) { - perror ("xc_domain_getinfo"); - return 0; - } - printf ("debug flags: %08lx: ", debug_op.flags); - for (i = 0; debug_flags[i].name; i++) - if (debug_flags[i].bit & debug_op.flags) - printf (" %s", debug_flags[i].name); - printf ("\n"); -#endif - } - else if (*arg == 0) - printf ("choose among br, regs, cr, ar, tr, rr, db\n"); - else { - printf ("cannot disp '%s'\n", arg); - return CMD_ERROR; - } - return CMD_OK; -} - -static enum cmd_status -cmd_bev (char *arg) -{ - xen_ia64_debug_op_t debug_op; - int i; - - if (do_ia64_debug_op (xc_handle, XEN_IA64_DEBUG_OP_GET_FLAGS, - domid, &debug_op) < 0) { - perror ("get debug flags"); - return CMD_ERROR; - } - if (arg == NULL || arg[0] == 0) { - printf ("debug flags: %08lx:\n", debug_op.flags); - for (i = 0; debug_flags[i].name; i++) - printf (" %c%s\n", - (debug_flags[i].bit & debug_op.flags) ? '+' : '-', - debug_flags[i].name); - return CMD_OK; - } - else { - char *p = strtok ((char *)arg, " "); - - while (p != NULL) { - unsigned int flag = 0; - - for (i = 0; debug_flags[i].name; i++) - if (strcmp (p, debug_flags[i].name) == 0 - || ((p[0] == '-' || p[0] == '+') - && strcmp (p + 1, debug_flags[i].name) == 0)) { - flag = debug_flags[i].bit; - break; - } - if (flag == 0) { - printf ("unknown event %s\n", p); - return CMD_ERROR; - } - if (p[0] == '-') - debug_op.flags &= ~flag; - else - debug_op.flags |= flag; - - p = strtok (NULL, " "); - } - if (do_ia64_debug_op (xc_handle, XEN_IA64_DEBUG_OP_SET_FLAGS, - domid, &debug_op) < 0) { - perror ("set debug flags"); - return CMD_ERROR; - } - /* Disabling force_SS and force_DB requires setting psr. */ - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - else - return CMD_OK; - } -} - -static enum cmd_status -cmd_set (char *line) -{ - char *reg; - unsigned long *addr; - unsigned long val; - - reg = parse_arg (&line); - - addr = get_reg_addr (reg); - if (addr == NULL) { - printf ("unknown register %s\n", reg); - return CMD_ERROR; - } - - if (parse_expr (&line, &val, 0) < 0) - return CMD_ERROR; - - *addr = val; - - if (vcpu_setcontext (cur_vcpu) < 0) - return CMD_ERROR; - else - return CMD_OK; -} - -const struct command_desc commands[]; - -static enum cmd_status -cmd_help (char *line) -{ - int i; - - for (i = 0; commands[i].name; i++) - printf ("%s -- %s\n", commands[i].name, commands[i].help); - - return CMD_OK; -} - -const struct command_desc commands[] = { - { "registers", "display current registers", cmd_registers }, - { "sstep", "single step", cmd_sstep }, - { "go", "resume execution", cmd_go }, - { "quit", "quit debugger", cmd_quit }, - { "echo", "display parameters", cmd_echo }, - { "disassemble", "disassemble memory", cmd_disassemble }, - { "dump", "dump memory", cmd_dump }, - { "break", "set a break point", cmd_break }, - { "watch", "set a watch point", cmd_watch }, - { "cb", "resume until branch", cmd_cb }, - { "delete", "delete a break point", cmd_delete }, - { "disable", "disable a break point", cmd_disable }, - { "enable", "enable a break point", cmd_enable }, - { "print", "print an expression", cmd_print }, - { "disp", "disp br/regs/cr/ar/tr/rr/db/psr/break/domain", cmd_disp}, - { "bev", "break on event", cmd_bev}, - { "set", "set reg val", cmd_set}, - { "help", "disp help", cmd_help }, - { NULL, NULL, NULL } -}; - - -enum cmd_status do_command (int vcpu, char *line) -{ - char *cmd; - char *args; - int i; - const struct command_desc *desc; - static const struct command_desc *last_desc; - enum cmd_status status; - int flag_ambiguous; - - cur_vcpu = vcpu; - cur_ctx = &vcpu_ctx_any[vcpu].c; - - /* Handle repeat last-command. */ - if (*line == 0) { - if (last_desc != NULL) - return (*last_desc->cmd)(""); - else - return CMD_OK; - } - last_desc = NULL; - - cmd = parse_arg (&line); - args = line; - - desc = NULL; - flag_ambiguous = 0; - - for (i = 0; commands[i].name; i++) { - const char *n = commands[i].name; - char *c = cmd; - - while (*n == *c && *n) - n++, c++; - - if (*c == 0) { - /* Match. */ - if (desc != NULL) { - if (!flag_ambiguous) - printf ("ambiguous command: %s", desc->name); - printf (", %s", commands[i].name); - flag_ambiguous = 1; - } - else - desc = &commands[i]; - } - } - - if (flag_ambiguous) { - printf ("\n"); - return CMD_ERROR; - } - else if (!desc) { - printf ("command not found, try help\n"); - return CMD_ERROR; - } - - status = (*desc->cmd)(args); - if (status == CMD_REPEAT) - last_desc = desc; - return status; -} - -void xenitp (int vcpu) -{ - int ret; - struct sigaction sa; - xc_dominfo_t dominfo; - - xc_handle = xc_interface_open (); /* for accessing control interface */ - - ret = xc_domain_getinfo (xc_handle, domid, 1, &dominfo); - if (ret < 0) { - perror ("xc_domain_getinfo"); - exit (-1); - } - - vcpu_ctx_any = calloc (sizeof(vcpu_ctx_any), dominfo.max_vcpu_id + 1); - if (!vcpu_ctx_any) { - perror ("vcpu context array alloc"); - exit (-1); - } - cur_ctx = &vcpu_ctx_any[vcpu].c; - - if (xc_domain_setdebugging (xc_handle, domid, 1) != 0) - perror ("setdebugging"); - - ret = xc_domain_pause (xc_handle, domid); - if (ret < 0) { - perror ("xc_domain_pause"); - exit (-1); - } - - ret = xc_ia64_vcpu_getcontext (xc_handle, domid, vcpu, cur_ctx); - if (ret < 0) { - perror ("xc_ia64_vcpu_getcontext"); - exit (-1); - } - - print_ctx (cur_ctx); - - /* Catch ctrl-c. */ - sa.sa_handler = &ctrl_c_handler; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - if (sigaction (SIGINT, &sa, NULL) != 0) - perror ("sigaction"); - - while (1) { - char buf[128]; - int len; - - printf ("XenITP> "); - fflush (stdout); - - if (fgets (buf, sizeof (buf), stdin) == NULL) - break; - - len = strlen ((char *)buf); - if (len >= 1 && buf[len - 1] == '\n') - buf[len - 1] = 0; - - ret = do_command (vcpu, buf); - if (ret == CMD_QUIT) - break; - } - - /* Clear debug bits. */ - if ((cur_ctx->regs.psr & (PSR_SS | PSR_TB | PSR_DB)) != 0) { - cur_ctx->regs.psr &= ~(PSR_SS | PSR_TB | PSR_DB); - cur_ctx->regs.psr |= PSR_DD | PSR_ID; - vcpu_setcontext (cur_vcpu); - } - - /* Disable debugging. */ - if (xc_domain_setdebugging (xc_handle, domid, 0) != 0) - perror ("setdebugging"); - - if (!quit_paused) { - ret = xc_domain_unpause (xc_handle, domid); - if (ret < 0) { - perror ("xc_domain_unpause"); - exit (-1); - } - } - - ret = xc_interface_close (xc_handle); - if (ret < 0) { - perror ("xc_interface_close"); - exit (-1); - } -} - -static void usage (void) -{ - printf ("usage:\n"); - printf (" xenitp [VCPU]\n"); - -} - -int main (int argc, char **argv) -{ - int ch; - static const char *sopts = "h" - ; - static const struct option lopts[] = { - {"help", 0, NULL, 'h'}, - {0, 0, 0, 0} - }; - int vcpu = 0; - - while ((ch = getopt_long (argc, argv, sopts, lopts, NULL)) != -1) { - switch (ch) { - case 'h': - usage (); - exit (-1); - case '?': - fprintf (stderr, "%s --help for more options\n", argv[0]); - exit (-1); - } - } - - argv += optind; - argc -= optind; - - if (argc < 1 || argc > 2) { - usage (); - exit (-1); - } - - domid = atoi (argv[0]); - if (domid == 0) { - fprintf (stderr, "cannot trace dom0\n"); - exit (-1); - } - - if (argc == 2) - vcpu = atoi (argv[1]); - - xenitp (vcpu); - - return 0; -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/examples/README xen-4.3.0/tools/examples/README --- xen-4.2.2/tools/examples/README 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/examples/README 2013-07-09 10:46:56.000000000 +0000 @@ -25,13 +25,7 @@ vif-common.sh - sourced by vif-bridge vif-nat - xen virtual network start/stop script in NAT mode vif-route - xen virtual network start/stop script in routed mode -vtpm - called by xen-backend.agent to bind/unbind vTPM devices -vtpm-common.sh - common code for vTPM handling -vtpm-delete - remove an entry from the vTPM table given the - domain's name -vtpm-hotplug-common.sh - sourced by vtpm -vtpm-migration.sh - sourced by external-device-migrate -xen-backend.agent - calls block, vif-*, vtpm scripts to add, remove, hotplug +xen-backend.agent - calls block, vif-* scripts to add, remove, hotplug devices xen-backend.rules - hotplug script rules xend-config.sxp - default xend configuration file diff -Nru xen-4.2.2/tools/examples/xl.conf xen-4.3.0/tools/examples/xl.conf --- xen-4.2.2/tools/examples/xl.conf 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/examples/xl.conf 2013-07-09 10:46:56.000000000 +0000 @@ -1,15 +1,13 @@ ## Global XL config file ## -# automatically balloon down dom0 when xen doesn't have enough free -# memory to create a domain -#autoballoon=1 +# Control whether dom0 is ballooned down when xen doesn't have enough +# free memory to create a domain. "auto" means only balloon if dom0 +# starts with all the host's memory. +#autoballoon="auto" # full path of the lockfile used by xl during domain creation #lockfile="/var/lock/xl" -# default vif script -#vifscript="vif-bridge" - # default output format used by "xl list -l" #output_format="json" @@ -20,3 +18,18 @@ # if disabled the old behaviour will be used, and hotplug scripts will be # launched by udev. #run_hotplug_scripts=1 + +# default gateway device to use with vif-route hotplug script +#vif.default.gatewaydev="eth0" + +# default vif script to use if none is specified in the guest config +#vif.default.script="vif-bridge" + +# default bridge device to use with vif-bridge hotplug scripts +#vif.default.bridge="xenbr0" + +# Reserve a claim of memory when launching a guest. This guarantees immediate +# feedback whether the guest can be launched due to memory exhaustion +# (which can take a long time to find out if launching huge guests). +# see xl.conf(5) for details. +#claim_mode=0 diff -Nru xen-4.2.2/tools/examples/xmexample.pv-grub xen-4.3.0/tools/examples/xmexample.pv-grub --- xen-4.2.2/tools/examples/xmexample.pv-grub 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/examples/xmexample.pv-grub 2013-07-09 10:46:56.000000000 +0000 @@ -105,20 +105,6 @@ # configured in xend-config.sxp. #---------------------------------------------------------------------------- -# Define to which TPM instance the user domain should communicate. -# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM' -# where INSTANCE indicates the instance number of the TPM the VM -# should be talking to and DOM provides the domain where the backend -# is located. -# Note that no two virtual machines should try to connect to the same -# TPM instance. The handling of all TPM instances does require -# some management effort in so far that VM configration files (and thus -# a VM) should be associated with a TPM instance throughout the lifetime -# of the VM / VM configuration file. The instance number must be -# greater or equal to 1. -#vtpm = [ 'instance=1,backend=0' ] - -#---------------------------------------------------------------------------- # Configure the behaviour when a domain exits. There are three 'reasons' # for a domain to stop: poweroff, reboot, and crash. For each of these you # may specify: diff -Nru xen-4.2.2/tools/examples/xmexample1 xen-4.3.0/tools/examples/xmexample1 --- xen-4.2.2/tools/examples/xmexample1 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/examples/xmexample1 2013-07-09 10:46:56.000000000 +0000 @@ -101,20 +101,6 @@ # configured in xend-config.sxp. #---------------------------------------------------------------------------- -# Define to which TPM instance the user domain should communicate. -# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM' -# where INSTANCE indicates the instance number of the TPM the VM -# should be talking to and DOM provides the domain where the backend -# is located. -# Note that no two virtual machines should try to connect to the same -# TPM instance. The handling of all TPM instances does require -# some management effort in so far that VM configration files (and thus -# a VM) should be associated with a TPM instance throughout the lifetime -# of the VM / VM configuration file. The instance number must be -# greater or equal to 1. -#vtpm = [ 'instance=1,backend=0' ] - -#---------------------------------------------------------------------------- # Set the kernel command line for the new domain. # You only need to define the IP parameters and hostname if the domain's # IP config doesn't, e.g. in ifcfg-eth0 or via DHCP. diff -Nru xen-4.2.2/tools/examples/xmexample2 xen-4.3.0/tools/examples/xmexample2 --- xen-4.2.2/tools/examples/xmexample2 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/examples/xmexample2 2013-07-09 10:46:56.000000000 +0000 @@ -137,20 +137,6 @@ # configured in xend-config.sxp. #---------------------------------------------------------------------------- -# Define to which TPM instance the user domain should communicate. -# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM' -# where INSTANCE indicates the instance number of the TPM the VM -# should be talking to and DOM provides the domain where the backend -# is located. -# Note that no two virtual machines should try to connect to the same -# TPM instance. The handling of all TPM instances does require -# some management effort in so far that VM configration files (and thus -# a VM) should be associated with a TPM instance throughout the lifetime -# of the VM / VM configuration file. The instance number must be -# greater or equal to 1. -#vtpm = ['instance=%d,backend=0' % (vmid) ] - -#---------------------------------------------------------------------------- # Set the kernel command line for the new domain. # You only need to define the IP parameters and hostname if the domain's # IP config doesn't, e.g. in ifcfg-eth0 or via DHCP. diff -Nru xen-4.2.2/tools/examples/xmexample3 xen-4.3.0/tools/examples/xmexample3 --- xen-4.2.2/tools/examples/xmexample3 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/examples/xmexample3 2013-07-09 10:46:56.000000000 +0000 @@ -122,20 +122,6 @@ # configured in xend-config.sxp. #---------------------------------------------------------------------------- -# Define to which TPM instance the user domain should communicate. -# The vtpm entry is of the form 'instance=INSTANCE,backend=DOM' -# where INSTANCE indicates the instance number of the TPM the VM -# should be talking to and DOM provides the domain where the backend -# is located. -# Note that no two virtual machines should try to connect to the same -# TPM instance. The handling of all TPM instances does require -# some management effort in so far that VM configration files (and thus -# a VM) should be associated with a TPM instance throughout the lifetime -# of the VM / VM configuration file. The instance number must be -# greater or equal to 1. -#vtpm = ['instance=%d,backend=0' % (vmid) ] - -#---------------------------------------------------------------------------- # Set the kernel command line for the new domain. # You only need to define the IP parameters and hostname if the domain's # IP config doesn't, e.g. in ifcfg-eth0 or via DHCP. diff -Nru xen-4.2.2/tools/firmware/etherboot/Makefile xen-4.3.0/tools/firmware/etherboot/Makefile --- xen-4.2.2/tools/firmware/etherboot/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/etherboot/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -28,7 +28,7 @@ $(MAKE) -C $D/src bin/$(*F).rom $T: - if ! wget -O _$T $(IPXE_TARBALL_URL); then \ + if ! $(FETCHER) _$T $(IPXE_TARBALL_URL); then \ $(GIT) clone $(IPXE_GIT_URL) $D.git; \ (cd $D.git && $(GIT) archive --format=tar --prefix=$D/ \ $(IPXE_GIT_TAG) | gzip >../_$T); \ diff -Nru xen-4.2.2/tools/firmware/hvmloader/32bitbios_support.c xen-4.3.0/tools/firmware/hvmloader/32bitbios_support.c --- xen-4.2.2/tools/firmware/hvmloader/32bitbios_support.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/32bitbios_support.c 2013-07-09 10:46:56.000000000 +0000 @@ -152,7 +152,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/acpi/acpi2_0.h xen-4.3.0/tools/firmware/hvmloader/acpi/acpi2_0.h --- xen-4.2.2/tools/firmware/hvmloader/acpi/acpi2_0.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/acpi/acpi2_0.h 2013-07-09 10:46:56.000000000 +0000 @@ -405,7 +405,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/acpi/build.c xen-4.3.0/tools/firmware/hvmloader/acpi/build.c --- xen-4.2.2/tools/firmware/hvmloader/acpi/build.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/acpi/build.c 2013-07-09 10:46:56.000000000 +0000 @@ -23,6 +23,9 @@ #include "ssdt_pm.h" #include "../config.h" #include "../util.h" +#include + +#define ACPI_MAX_SECONDARY_TABLES 16 #define align16(sz) (((sz) + 15) & ~15) #define fixed_strcpy(d, s) strncpy((d), (s), sizeof(d)) @@ -198,6 +201,52 @@ return waet; } +static int construct_passthrough_tables(unsigned long *table_ptrs, + int nr_tables) +{ + const char *s; + uint8_t *acpi_pt_addr; + uint32_t acpi_pt_length; + struct acpi_header *header; + int nr_added; + int nr_max = (ACPI_MAX_SECONDARY_TABLES - nr_tables - 1); + uint32_t total = 0; + uint8_t *buffer; + + s = xenstore_read(HVM_XS_ACPI_PT_ADDRESS, NULL); + if ( s == NULL ) + return 0; + + acpi_pt_addr = (uint8_t*)(uint32_t)strtoll(s, NULL, 0); + if ( acpi_pt_addr == NULL ) + return 0; + + s = xenstore_read(HVM_XS_ACPI_PT_LENGTH, NULL); + if ( s == NULL ) + return 0; + + acpi_pt_length = (uint32_t)strtoll(s, NULL, 0); + + for ( nr_added = 0; nr_added < nr_max; nr_added++ ) + { + if ( (acpi_pt_length - total) < sizeof(struct acpi_header) ) + break; + + header = (struct acpi_header*)acpi_pt_addr; + + buffer = mem_alloc(header->length, 16); + if ( buffer == NULL ) + break; + memcpy(buffer, header, header->length); + + table_ptrs[nr_tables++] = (unsigned long)buffer; + total += header->length; + acpi_pt_addr += header->length; + } + + return nr_added; +} + static int construct_secondary_tables(unsigned long *table_ptrs, struct acpi_info *info) { @@ -293,28 +342,52 @@ } } + /* Load any additional tables passed through. */ + nr_tables += construct_passthrough_tables(table_ptrs, nr_tables); + table_ptrs[nr_tables] = 0; return nr_tables; } -unsigned long new_vm_gid(void) +/** + * Allocate and initialize Windows Generation ID + * If value is not present in the XenStore or if all zeroes + * the device will be not active + * + * Return 0 if memory failure, != 0 if success + */ +static int new_vm_gid(struct acpi_info *acpi_info) { - uint64_t gid; - unsigned char *buf; - char addr[11]; - - buf = mem_alloc(8, 8); - if (!buf) return 0; + uint64_t vm_gid[2], *buf; + char addr[12]; + const char * s; + char *end; + + acpi_info->vm_gid_addr = 0; + + /* read ID and check for 0 */ + s = xenstore_read("platform/generation-id", "0:0"); + vm_gid[0] = strtoll(s, &end, 0); + vm_gid[1] = 0; + if ( end && end[0] == ':' ) + vm_gid[1] = strtoll(end+1, NULL, 0); + if ( !vm_gid[0] && !vm_gid[1] ) + return 1; + + /* copy to allocate BIOS memory */ + buf = (uint64_t *) mem_alloc(sizeof(vm_gid), 8); + if ( !buf ) + return 0; + memcpy(buf, vm_gid, sizeof(vm_gid)); + /* set into ACPI table and XenStore the address */ + acpi_info->vm_gid_addr = virt_to_phys(buf); if ( snprintf(addr, sizeof(addr), "0x%lx", virt_to_phys(buf)) >= sizeof(addr) ) return 0; xenstore_write("hvmloader/generation-id-address", addr); - gid = strtoll(xenstore_read("platform/generation-id", "0"), NULL, 0); - *(uint64_t *)buf = gid; - - return virt_to_phys(buf); + return 1; } void acpi_build_tables(struct acpi_config *config, unsigned int physical) @@ -327,9 +400,8 @@ struct acpi_10_fadt *fadt_10; struct acpi_20_facs *facs; unsigned char *dsdt; - unsigned long secondary_tables[16]; + unsigned long secondary_tables[ACPI_MAX_SECONDARY_TABLES]; int nr_secondaries, i; - unsigned long vm_gid_addr; /* Allocate and initialise the acpi info area. */ mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1); @@ -442,8 +514,8 @@ offsetof(struct acpi_20_rsdp, extended_checksum), sizeof(struct acpi_20_rsdp)); - vm_gid_addr = new_vm_gid(); - if (!vm_gid_addr) goto oom; + if ( !new_vm_gid(acpi_info) ) + goto oom; acpi_info->com1_present = uart_exists(0x3f8); acpi_info->com2_present = uart_exists(0x2f8); @@ -451,7 +523,6 @@ acpi_info->hpet_present = hpet_exists(ACPI_HPET_ADDRESS); acpi_info->pci_min = pci_mem_start; acpi_info->pci_len = pci_mem_end - pci_mem_start; - acpi_info->vm_gid_addr = vm_gid_addr; return; @@ -463,7 +534,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/acpi/dsdt.asl xen-4.3.0/tools/firmware/hvmloader/acpi/dsdt.asl --- xen-4.2.2/tools/firmware/hvmloader/acpi/dsdt.asl 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/acpi/dsdt.asl 2013-07-09 10:46:56.000000000 +0000 @@ -397,6 +397,31 @@ IRQNoFlags () {7} }) } + + Device(VGID) { + Name(_HID, EisaId ("XEN0000")) + Name(_UID, 0x00) + Name(_CID, "VM_Gen_Counter") + Name(_DDN, "VM_Gen_Counter") + Method(_STA, 0, NotSerialized) + { + If(LEqual(\_SB.VGIA, 0x00000000)) { + Return(0x00) + } Else { + Return(0x0F) + } + } + Name(PKG, Package () + { + 0x00000000, + 0x00000000 + }) + Method(ADDR, 0, NotSerialized) + { + Store(\_SB.VGIA, Index(PKG, 0)) + Return(PKG) + } + } } } } diff -Nru xen-4.2.2/tools/firmware/hvmloader/acpi/mk_dsdt.c xen-4.3.0/tools/firmware/hvmloader/acpi/mk_dsdt.c --- xen-4.2.2/tools/firmware/hvmloader/acpi/mk_dsdt.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/acpi/mk_dsdt.c 2013-07-09 10:46:56.000000000 +0000 @@ -453,7 +453,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/acpi/static_tables.c xen-4.3.0/tools/firmware/hvmloader/acpi/static_tables.c --- xen-4.2.2/tools/firmware/hvmloader/acpi/static_tables.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/acpi/static_tables.c 2013-07-09 10:46:56.000000000 +0000 @@ -136,11 +136,15 @@ .length = sizeof(struct acpi_20_rsdp) }; -#define ACPI_WAET_RTC_GOOD 0x00000001 -#define ACPI_WAET_PM_TIMER_GOOD 0x00000002 +#define ACPI_WAET_RTC_NO_ACK (1<<0) /* RTC requires no int acknowledge */ +#define ACPI_WAET_TIMER_ONE_READ (1<<1) /* PM timer requires only one read */ -#define ACPI_WAET_FLAGS (ACPI_WAET_RTC_GOOD | \ - ACPI_WAET_PM_TIMER_GOOD) +/* + * The state of the RTC flag getting passed to the guest must be in + * sync with the mode selection in the hypervisor RTC emulation code. + */ +#define ACPI_WAET_FLAGS (ACPI_WAET_RTC_NO_ACK | \ + ACPI_WAET_TIMER_ONE_READ) struct acpi_20_waet Waet = { .header = { @@ -159,7 +163,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/apic_regs.h xen-4.3.0/tools/firmware/hvmloader/apic_regs.h --- xen-4.2.2/tools/firmware/hvmloader/apic_regs.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/apic_regs.h 2013-07-09 10:46:56.000000000 +0000 @@ -110,7 +110,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/cacheattr.c xen-4.3.0/tools/firmware/hvmloader/cacheattr.c --- xen-4.2.2/tools/firmware/hvmloader/cacheattr.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/cacheattr.c 2013-07-09 10:46:56.000000000 +0000 @@ -40,24 +40,33 @@ #define MSR_PAT 0x0277 #define MSR_MTRRdefType 0x02ff +unsigned int cpu_phys_addr(void) +{ + uint32_t eax, ebx, ecx, edx; + unsigned int phys_bits = 36; + /* Find the physical address size for this CPU. */ + cpuid(0x80000000, &eax, &ebx, &ecx, &edx); + if ( eax >= 0x80000008 ) + { + cpuid(0x80000008, &eax, &ebx, &ecx, &edx); + phys_bits = (uint8_t)eax; + } + + return phys_bits; +} + void cacheattr_init(void) { uint32_t eax, ebx, ecx, edx; uint64_t mtrr_cap, mtrr_def, content, addr_mask; - unsigned int i, nr_var_ranges, phys_bits = 36; + unsigned int i, nr_var_ranges, phys_bits; /* Does the CPU support architectural MTRRs? */ cpuid(0x00000001, &eax, &ebx, &ecx, &edx); if ( !(edx & (1u << 12)) ) return; - /* Find the physical address size for this CPU. */ - cpuid(0x80000000, &eax, &ebx, &ecx, &edx); - if ( eax >= 0x80000008 ) - { - cpuid(0x80000008, &eax, &ebx, &ecx, &edx); - phys_bits = (uint8_t)eax; - } + phys_bits = cpu_phys_addr(); printf("%u-bit phys ... ", phys_bits); @@ -115,7 +124,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/config-seabios.h xen-4.3.0/tools/firmware/hvmloader/config-seabios.h --- xen-4.2.2/tools/firmware/hvmloader/config-seabios.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/config-seabios.h 2013-07-09 10:46:56.000000000 +0000 @@ -10,7 +10,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/config.h xen-4.3.0/tools/firmware/hvmloader/config.h --- xen-4.2.2/tools/firmware/hvmloader/config.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/config.h 2013-07-09 10:46:56.000000000 +0000 @@ -5,7 +5,9 @@ enum virtual_vga { VGA_none, VGA_std, VGA_cirrus, VGA_pt }; extern enum virtual_vga virtual_vga; + extern unsigned long igd_opregion_pgbase; +#define IGD_OPREGION_PAGES 3 struct bios_config { const char *name; @@ -53,6 +55,7 @@ /* MMIO hole: Hardcoded defaults, which can be dynamically expanded. */ #define PCI_MEM_START 0xf0000000 #define PCI_MEM_END 0xfc000000 + extern unsigned long pci_mem_start, pci_mem_end; @@ -65,7 +68,17 @@ #define RESERVED_MEMBASE 0xFC000000 /* NB. ACPI_INFO_PHYSICAL_ADDRESS *MUST* match definition in acpi/dsdt.asl! */ #define ACPI_INFO_PHYSICAL_ADDRESS 0xFC000000 -#define RESERVED_MEMORY_DYNAMIC 0xFC001000 +#define RESERVED_MEMORY_DYNAMIC_START 0xFC001000 +#define RESERVED_MEMORY_DYNAMIC_END 0xFE000000 +/* + * GUEST_RESERVED: Physical address space reserved for guest use. + * This is not dynamically advertised to guests, so this range must *never* + * be used for any purpose by us, in future. It must always be marked as + * reserved in the memory map (e.g., E820_RESERVED) so that mechanisms such + * as PCI BAR remapping do not allocate from this region. + */ +#define GUEST_RESERVED_START 0xFE700000 +#define GUEST_RESERVED_END 0xFE800000 extern unsigned long scratch_start; @@ -74,7 +87,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/e820.c xen-4.3.0/tools/firmware/hvmloader/e820.c --- xen-4.2.2/tools/firmware/hvmloader/e820.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/e820.c 2013-07-09 10:46:56.000000000 +0000 @@ -142,11 +142,11 @@ nr++; e820[nr].addr = igd_opregion_base; - e820[nr].size = 2 * PAGE_SIZE; + e820[nr].size = IGD_OPREGION_PAGES * PAGE_SIZE; e820[nr].type = E820_NVS; nr++; - e820[nr].addr = igd_opregion_base + 2 * PAGE_SIZE; + e820[nr].addr = igd_opregion_base + IGD_OPREGION_PAGES * PAGE_SIZE; e820[nr].size = (uint32_t)-e820[nr].addr; e820[nr].type = E820_RESERVED; nr++; @@ -175,7 +175,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/e820.h xen-4.3.0/tools/firmware/hvmloader/e820.h --- xen-4.2.2/tools/firmware/hvmloader/e820.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/e820.h 2013-07-09 10:46:56.000000000 +0000 @@ -20,7 +20,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/hvmloader.c xen-4.3.0/tools/firmware/hvmloader/hvmloader.c --- xen-4.2.2/tools/firmware/hvmloader/hvmloader.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/hvmloader.c 2013-07-09 10:46:56.000000000 +0000 @@ -354,7 +354,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/hypercall.h xen-4.3.0/tools/firmware/hvmloader/hypercall.h --- xen-4.2.2/tools/firmware/hvmloader/hypercall.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/hypercall.h 2013-07-09 10:46:56.000000000 +0000 @@ -184,7 +184,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/mp_tables.c xen-4.3.0/tools/firmware/hvmloader/mp_tables.c --- xen-4.2.2/tools/firmware/hvmloader/mp_tables.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/mp_tables.c 2013-07-09 10:46:56.000000000 +0000 @@ -341,7 +341,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/option_rom.h xen-4.3.0/tools/firmware/hvmloader/option_rom.h --- xen-4.2.2/tools/firmware/hvmloader/option_rom.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/option_rom.h 2013-07-09 10:46:56.000000000 +0000 @@ -59,7 +59,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/ovmf.c xen-4.3.0/tools/firmware/hvmloader/ovmf.c --- xen-4.2.2/tools/firmware/hvmloader/ovmf.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/ovmf.c 2013-07-09 10:46:56.000000000 +0000 @@ -118,7 +118,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/pci.c xen-4.3.0/tools/firmware/hvmloader/pci.c --- xen-4.2.2/tools/firmware/hvmloader/pci.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/pci.c 2013-07-09 10:46:56.000000000 +0000 @@ -27,6 +27,8 @@ #include #include +#include +#include unsigned long pci_mem_start = PCI_MEM_START; unsigned long pci_mem_end = PCI_MEM_END; @@ -36,22 +38,53 @@ void pci_setup(void) { - uint32_t base, devfn, bar_reg, bar_data, bar_sz, cmd, mmio_total = 0; + uint8_t is_64bar, using_64bar, bar64_relocate = 0; + uint32_t devfn, bar_reg, cmd, bar_data, bar_data_upper; + uint64_t base, bar_sz, bar_sz_upper, mmio_total = 0; uint32_t vga_devfn = 256; uint16_t class, vendor_id, device_id; unsigned int bar, pin, link, isa_irq; /* Resources assignable to PCI devices via BARs. */ struct resource { - uint32_t base, max; - } *resource, mem_resource, io_resource; + uint64_t base, max; + } *resource, mem_resource, high_mem_resource, io_resource; /* Create a list of device BARs in descending order of size. */ struct bars { - uint32_t devfn, bar_reg, bar_sz; + uint32_t is_64bar; + uint32_t devfn; + uint32_t bar_reg; + uint64_t bar_sz; } *bars = (struct bars *)scratch_start; unsigned int i, nr_bars = 0; + const char *s; + /* + * Do we allow hvmloader to relocate guest memory in order to + * increase the size of the lowmem MMIO hole? Defaulting to 1 + * here will mean that non-libxl toolstacks (including xend and + * home-grown ones) means that those using qemu-xen will still + * experience the memory relocation bug described below; but it + * also means that those using qemu-traditional will *not* + * experience any change; and it also means that there is a + * work-around for those using qemu-xen, namely switching to + * qemu-traditional. + * + * If we defaulted to 0, and failing to resize the hole caused any + * problems with qemu-traditional, then there is no work-around. + * + * Since xend can only use qemu-traditional, I think this is the + * option that will have the least impact. + */ + bool allow_memory_relocate = 1; + + s = xenstore_read(HVM_XS_ALLOW_MEMORY_RELOCATE, NULL); + if ( s ) + allow_memory_relocate = strtoll(s, NULL, 0); + printf("Relocating guest memory for lowmem MMIO space %s\n", + allow_memory_relocate?"enabled":"disabled"); + /* Program PCI-ISA bridge with appropriate link routes. */ isa_irq = 0; for ( link = 0; link < 4; link++ ) @@ -98,7 +131,7 @@ virtual_vga = VGA_pt; if ( vendor_id == 0x8086 ) { - igd_opregion_pgbase = mem_hole_alloc(2); + igd_opregion_pgbase = mem_hole_alloc(IGD_OPREGION_PAGES); /* * Write the the OpRegion offset to give the opregion * address to the device model. The device model will trap @@ -133,22 +166,34 @@ /* Map the I/O memory and port resources. */ for ( bar = 0; bar < 7; bar++ ) { + bar_sz_upper = 0; bar_reg = PCI_BASE_ADDRESS_0 + 4*bar; if ( bar == 6 ) bar_reg = PCI_ROM_ADDRESS; bar_data = pci_readl(devfn, bar_reg); + is_64bar = !!((bar_data & (PCI_BASE_ADDRESS_SPACE | + PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == + (PCI_BASE_ADDRESS_SPACE_MEMORY | + PCI_BASE_ADDRESS_MEM_TYPE_64)); pci_writel(devfn, bar_reg, ~0); bar_sz = pci_readl(devfn, bar_reg); pci_writel(devfn, bar_reg, bar_data); - if ( bar_sz == 0 ) - continue; bar_sz &= (((bar_data & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY) ? PCI_BASE_ADDRESS_MEM_MASK : (PCI_BASE_ADDRESS_IO_MASK & 0xffff)); + if (is_64bar) { + bar_data_upper = pci_readl(devfn, bar_reg + 4); + pci_writel(devfn, bar_reg + 4, ~0); + bar_sz_upper = pci_readl(devfn, bar_reg + 4); + pci_writel(devfn, bar_reg + 4, bar_data_upper); + bar_sz = (bar_sz_upper << 32) | bar_sz; + } bar_sz &= ~(bar_sz - 1); + if ( bar_sz == 0 ) + continue; for ( i = 0; i < nr_bars; i++ ) if ( bars[i].bar_sz < bar_sz ) @@ -157,6 +202,7 @@ if ( i != nr_bars ) memmove(&bars[i+1], &bars[i], (nr_bars-i) * sizeof(*bars)); + bars[i].is_64bar = is_64bar; bars[i].devfn = devfn; bars[i].bar_reg = bar_reg; bars[i].bar_sz = bar_sz; @@ -167,11 +213,8 @@ nr_bars++; - /* Skip the upper-half of the address for a 64-bit BAR. */ - if ( (bar_data & (PCI_BASE_ADDRESS_SPACE | - PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == - (PCI_BASE_ADDRESS_SPACE_MEMORY | - PCI_BASE_ADDRESS_MEM_TYPE_64) ) + /*The upper half is already calculated, skip it! */ + if (is_64bar) bar++; } @@ -193,10 +236,34 @@ pci_writew(devfn, PCI_COMMAND, cmd); } - while ( (mmio_total > (pci_mem_end - pci_mem_start)) && - ((pci_mem_start << 1) != 0) ) + /* + * At the moment qemu-xen can't deal with relocated memory regions. + * It's too close to the release to make a proper fix; for now, + * only allow the MMIO hole to grow large enough to move guest memory + * if we're running qemu-traditional. Items that don't fit will be + * relocated into the 64-bit address space. + * + * This loop now does the following: + * - If allow_memory_relocate, increase the MMIO hole until it's + * big enough, or until it's 2GiB + * - If !allow_memory_relocate, increase the MMIO hole until it's + * big enough, or until it's 2GiB, or until it overlaps guest + * memory + */ + while ( (mmio_total > (pci_mem_end - pci_mem_start)) + && ((pci_mem_start << 1) != 0) + && (allow_memory_relocate + || (((pci_mem_start << 1) >> PAGE_SHIFT) + >= hvm_info->low_mem_pgend)) ) pci_mem_start <<= 1; + if ( mmio_total > (pci_mem_end - pci_mem_start) ) + { + printf("Low MMIO hole not large enough for all devices," + " relocating some BARs to 64-bit\n"); + bar64_relocate = 1; + } + /* Relocate RAM that overlaps PCI space (in 64k-page chunks). */ while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend ) { @@ -208,6 +275,11 @@ if ( hvm_info->high_mem_pgend == 0 ) hvm_info->high_mem_pgend = 1ull << (32 - PAGE_SHIFT); hvm_info->low_mem_pgend -= nr_pages; + printf("Relocating 0x%x pages from "PRIllx" to "PRIllx\ + " for lowmem MMIO hole\n", + nr_pages, + PRIllx_arg(((uint64_t)hvm_info->low_mem_pgend)<high_mem_pgend)<low_mem_pgend; @@ -218,6 +290,19 @@ hvm_info->high_mem_pgend += nr_pages; } + high_mem_resource.base = ((uint64_t)hvm_info->high_mem_pgend) << PAGE_SHIFT; + if ( high_mem_resource.base < 1ull << 32 ) + { + if ( hvm_info->high_mem_pgend != 0 ) + printf("WARNING: hvm_info->high_mem_pgend %x" + " does not point into high memory!", + hvm_info->high_mem_pgend); + high_mem_resource.base = 1ull << 32; + } + printf("%sRAM in high memory; setting high_mem resource base to "PRIllx"\n", + hvm_info->high_mem_pgend?"":"No ", + PRIllx_arg(high_mem_resource.base)); + high_mem_resource.max = 1ull << cpu_phys_addr(); mem_resource.base = pci_mem_start; mem_resource.max = pci_mem_end; io_resource.base = 0xc000; @@ -230,13 +315,47 @@ bar_reg = bars[i].bar_reg; bar_sz = bars[i].bar_sz; + /* + * Relocate to high memory if the total amount of MMIO needed + * is more than the low MMIO available. Because devices are + * processed in order of bar_sz, this will preferentially + * relocate larger devices to high memory first. + * + * NB: The code here is rather fragile, as the check here to see + * whether bar_sz will fit in the low MMIO region doesn't match the + * real check made below, which involves aligning the base offset of the + * bar with the size of the bar itself. As it happens, this will always + * be satisfied because: + * - The first one will succeed because the MMIO hole can only start at + * 0x{f,e,c,8}00000000. If it fits, it will be aligned properly. + * - All subsequent ones will be aligned because the list is ordered + * large to small, and bar_sz is always a power of 2. (At least + * the code here assumes it to be.) + * Should either of those two conditions change, this code will break. + */ + using_64bar = bars[i].is_64bar && bar64_relocate + && (mmio_total > (mem_resource.max - mem_resource.base)); bar_data = pci_readl(devfn, bar_reg); if ( (bar_data & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_MEMORY ) { - resource = &mem_resource; - bar_data &= ~PCI_BASE_ADDRESS_MEM_MASK; + /* Mapping high memory if PCI device is 64 bits bar */ + if ( using_64bar ) { + if ( high_mem_resource.base & (bar_sz - 1) ) + high_mem_resource.base = high_mem_resource.base - + (high_mem_resource.base & (bar_sz - 1)) + bar_sz; + else + high_mem_resource.base = high_mem_resource.base - + (high_mem_resource.base & (bar_sz - 1)); + resource = &high_mem_resource; + bar_data &= ~PCI_BASE_ADDRESS_MEM_MASK; + } + else { + resource = &mem_resource; + bar_data &= ~PCI_BASE_ADDRESS_MEM_MASK; + } + mmio_total -= bar_sz; } else { @@ -244,22 +363,29 @@ bar_data &= ~PCI_BASE_ADDRESS_IO_MASK; } - base = (resource->base + bar_sz - 1) & ~(bar_sz - 1); - bar_data |= base; + base = (resource->base + bar_sz - 1) & ~(uint64_t)(bar_sz - 1); + bar_data |= (uint32_t)base; + bar_data_upper = (uint32_t)(base >> 32); base += bar_sz; if ( (base < resource->base) || (base > resource->max) ) { - printf("pci dev %02x:%x bar %02x size %08x: no space for " - "resource!\n", devfn>>3, devfn&7, bar_reg, bar_sz); + printf("pci dev %02x:%x bar %02x size "PRIllx": no space for " + "resource!\n", devfn>>3, devfn&7, bar_reg, + PRIllx_arg(bar_sz)); continue; } resource->base = base; pci_writel(devfn, bar_reg, bar_data); - printf("pci dev %02x:%x bar %02x size %08x: %08x\n", - devfn>>3, devfn&7, bar_reg, bar_sz, bar_data); + if (using_64bar) + pci_writel(devfn, bar_reg + 4, bar_data_upper); + printf("pci dev %02x:%x bar %02x size "PRIllx": %x%08x\n", + devfn>>3, devfn&7, bar_reg, + PRIllx_arg(bar_sz), + bar_data_upper, bar_data); + /* Now enable the memory or I/O mapping. */ cmd = pci_readw(devfn, PCI_COMMAND); @@ -288,7 +414,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/pci_regs.h xen-4.3.0/tools/firmware/hvmloader/pci_regs.h --- xen-4.2.2/tools/firmware/hvmloader/pci_regs.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/pci_regs.h 2013-07-09 10:46:56.000000000 +0000 @@ -112,7 +112,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/pir.c xen-4.3.0/tools/firmware/hvmloader/pir.c --- xen-4.2.2/tools/firmware/hvmloader/pir.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/pir.c 2013-07-09 10:46:56.000000000 +0000 @@ -68,7 +68,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/pir_types.h xen-4.3.0/tools/firmware/hvmloader/pir_types.h --- xen-4.2.2/tools/firmware/hvmloader/pir_types.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/pir_types.h 2013-07-09 10:46:56.000000000 +0000 @@ -63,7 +63,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/rombios.c xen-4.3.0/tools/firmware/hvmloader/rombios.c --- xen-4.2.2/tools/firmware/hvmloader/rombios.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/rombios.c 2013-07-09 10:46:56.000000000 +0000 @@ -234,7 +234,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/seabios.c xen-4.3.0/tools/firmware/hvmloader/seabios.c --- xen-4.2.2/tools/firmware/hvmloader/seabios.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/seabios.c 2013-07-09 10:46:56.000000000 +0000 @@ -161,7 +161,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/smbios.c xen-4.3.0/tools/firmware/hvmloader/smbios.c --- xen-4.2.2/tools/firmware/hvmloader/smbios.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/smbios.c 2013-07-09 10:46:56.000000000 +0000 @@ -26,16 +26,38 @@ #include "smbios_types.h" #include "util.h" #include "hypercall.h" +#include +/* SBMIOS handle base values */ +#define SMBIOS_HANDLE_TYPE0 0x0000 +#define SMBIOS_HANDLE_TYPE1 0x0100 +#define SMBIOS_HANDLE_TYPE2 0x0200 +#define SMBIOS_HANDLE_TYPE3 0x0300 +#define SMBIOS_HANDLE_TYPE4 0x0400 +#define SMBIOS_HANDLE_TYPE11 0x0B00 +#define SMBIOS_HANDLE_TYPE16 0x1000 +#define SMBIOS_HANDLE_TYPE17 0x1100 +#define SMBIOS_HANDLE_TYPE19 0x1300 +#define SMBIOS_HANDLE_TYPE20 0x1400 +#define SMBIOS_HANDLE_TYPE22 0x1600 +#define SMBIOS_HANDLE_TYPE32 0x2000 +#define SMBIOS_HANDLE_TYPE39 0x2700 +#define SMBIOS_HANDLE_TYPE127 0x7f00 + +static void +smbios_pt_init(void); +static void* +get_smbios_pt_struct(uint8_t type, uint32_t *length_out); +static void +get_cpu_manufacturer(char *buf, int len); static int write_smbios_tables(void *ep, void *start, uint32_t vcpus, uint64_t memsize, uint8_t uuid[16], char *xen_version, uint32_t xen_major_version, uint32_t xen_minor_version, unsigned *nr_structs, unsigned *max_struct_size); - -static void -get_cpu_manufacturer(char *buf, int len); +static uint64_t +get_memsize(void); static void smbios_entry_point_init(void *start, uint16_t max_structure_size, @@ -49,6 +71,8 @@ smbios_type_1_init(void *start, const char *xen_version, uint8_t uuid[16]); static void * +smbios_type_2_init(void *start); +static void * smbios_type_3_init(void *start); static void * smbios_type_4_init(void *start, unsigned int cpu_number, @@ -64,10 +88,73 @@ static void * smbios_type_20_init(void *start, uint32_t memory_size_mb, int instance); static void * +smbios_type_22_init(void *start); +static void * smbios_type_32_init(void *start); static void * +smbios_type_39_init(void *start); +static void * +smbios_type_vendor_oem_init(void *start); +static void * smbios_type_127_init(void *start); +static uint32_t *smbios_pt_addr = NULL; +static uint32_t smbios_pt_length = 0; + +static void +smbios_pt_init(void) +{ + const char *s; + + s = xenstore_read(HVM_XS_SMBIOS_PT_ADDRESS, NULL); + if ( s == NULL ) + goto reset; + + smbios_pt_addr = (uint32_t*)(uint32_t)strtoll(s, NULL, 0); + if ( smbios_pt_addr == NULL ) + goto reset; + + s = xenstore_read(HVM_XS_SMBIOS_PT_LENGTH, NULL); + if ( s == NULL ) + goto reset; + + smbios_pt_length = (uint32_t)strtoll(s, NULL, 0); + if ( smbios_pt_length == 0 ) + goto reset; + + return; + +reset: + smbios_pt_addr = NULL; + smbios_pt_length = 0; +} + +static void* +get_smbios_pt_struct(uint8_t type, uint32_t *length_out) +{ + uint32_t *sep = smbios_pt_addr; + uint32_t total = 0; + uint8_t *ptr; + + if ( sep == NULL ) + return NULL; + + while ( total < smbios_pt_length ) + { + ptr = (uint8_t*)(sep + 1); + if ( ptr[0] == type ) + { + *length_out = *sep; + return ptr; + } + + total += (*sep + sizeof(uint32_t)); + sep = (uint32_t*)(ptr + *sep); + } + + return NULL; +} + static void get_cpu_manufacturer(char *buf, int len) { @@ -97,6 +184,8 @@ char cpu_manufacturer[15]; int i, nr_mem_devs; + smbios_pt_init(); + get_cpu_manufacturer(cpu_manufacturer, 15); p = (char *)start; @@ -112,6 +201,7 @@ do_struct(smbios_type_0_init(p, xen_version, xen_major_version, xen_minor_version)); do_struct(smbios_type_1_init(p, xen_version, uuid)); + do_struct(smbios_type_2_init(p)); do_struct(smbios_type_3_init(p)); for ( cpu_num = 1; cpu_num <= vcpus; cpu_num++ ) do_struct(smbios_type_4_init(p, cpu_num, cpu_manufacturer)); @@ -130,7 +220,10 @@ do_struct(smbios_type_20_init(p, dev_memsize, i)); } + do_struct(smbios_type_22_init(p)); do_struct(smbios_type_32_init(p)); + do_struct(smbios_type_39_init(p)); + do_struct(smbios_type_vendor_oem_init(p)); do_struct(smbios_type_127_init(p)); #undef do_struct @@ -289,12 +382,22 @@ struct smbios_type_0 *p = (struct smbios_type_0 *)start; static const char *smbios_release_date = __SMBIOS_DATE__; const char *s; + void *pts; + uint32_t length; + + pts = get_smbios_pt_struct(0, &length); + if ( (pts != NULL)&&(length > 0) ) + { + memcpy(start, pts, length); + p->header.handle = SMBIOS_HANDLE_TYPE0; + return (start + length); + } memset(p, 0, sizeof(*p)); p->header.type = 0; p->header.length = sizeof(struct smbios_type_0); - p->header.handle = 0; + p->header.handle = SMBIOS_HANDLE_TYPE0; p->vendor_str = 1; p->version_str = 2; @@ -315,11 +418,11 @@ p->embedded_controller_minor = 0xff; start += sizeof(struct smbios_type_0); - s = xenstore_read("bios-strings/bios-vendor", "Xen"); + s = xenstore_read(HVM_XS_BIOS_VENDOR, "Xen"); strcpy((char *)start, s); start += strlen(s) + 1; - s = xenstore_read("bios-strings/bios-version", xen_version); + s = xenstore_read(HVM_XS_BIOS_VERSION, xen_version); strcpy((char *)start, s); start += strlen(s) + 1; @@ -338,12 +441,22 @@ char uuid_str[37]; struct smbios_type_1 *p = (struct smbios_type_1 *)start; const char *s; + void *pts; + uint32_t length; + + pts = get_smbios_pt_struct(1, &length); + if ( (pts != NULL)&&(length > 0) ) + { + memcpy(start, pts, length); + p->header.handle = SMBIOS_HANDLE_TYPE1; + return (start + length); + } memset(p, 0, sizeof(*p)); p->header.type = 1; p->header.length = sizeof(struct smbios_type_1); - p->header.handle = 0x100; + p->header.handle = SMBIOS_HANDLE_TYPE1; p->manufacturer_str = 1; p->product_name_str = 2; @@ -358,20 +471,20 @@ start += sizeof(struct smbios_type_1); - s = xenstore_read("bios-strings/system-manufacturer", "Xen"); + s = xenstore_read(HVM_XS_SYSTEM_MANUFACTURER, "Xen"); strcpy((char *)start, s); start += strlen(s) + 1; - s = xenstore_read("bios-strings/system-product-name", "HVM domU"); + s = xenstore_read(HVM_XS_SYSTEM_PRODUCT_NAME, "HVM domU"); strcpy((char *)start, s); start += strlen(s) + 1; - s = xenstore_read("bios-strings/system-version", xen_version); + s = xenstore_read(HVM_XS_SYSTEM_VERSION, xen_version); strcpy((char *)start, s); start += strlen(s) + 1; uuid_to_string(uuid_str, uuid); - s = xenstore_read("bios-strings/system-serial-number", uuid_str); + s = xenstore_read(HVM_XS_SYSTEM_SERIAL_NUMBER, uuid_str); strcpy((char *)start, s); start += strlen(s) + 1; @@ -380,17 +493,58 @@ return start+1; } +/* Type 2 -- System Board */ +static void * +smbios_type_2_init(void *start) +{ + struct smbios_type_2 *p = (struct smbios_type_2 *)start; + uint8_t *ptr; + void *pts; + uint32_t length; + + pts = get_smbios_pt_struct(2, &length); + if ( (pts != NULL)&&(length > 0) ) + { + memcpy(start, pts, length); + p->header.handle = SMBIOS_HANDLE_TYPE2; + + /* Set current chassis handle if present */ + if ( p->header.length > 13 ) + { + ptr = ((uint8_t*)start) + 11; + if ( *((uint16_t*)ptr) != 0 ) + *((uint16_t*)ptr) = SMBIOS_HANDLE_TYPE3; + } + + return (start + length); + } + + /* Only present when passed in */ + return start; +} + /* Type 3 -- System Enclosure */ static void * smbios_type_3_init(void *start) { struct smbios_type_3 *p = (struct smbios_type_3 *)start; + const char *s; + void *pts; + uint32_t length; + + pts = get_smbios_pt_struct(3, &length); + if ( (pts != NULL)&&(length > 0) ) + { + memcpy(start, pts, length); + p->header.handle = SMBIOS_HANDLE_TYPE3; + return (start + length); + } memset(p, 0, sizeof(*p)); p->header.type = 3; p->header.length = sizeof(struct smbios_type_3); - p->header.handle = 0x300; + p->header.handle = SMBIOS_HANDLE_TYPE3; p->manufacturer_str = 1; p->type = 0x01; /* other */ @@ -404,8 +558,19 @@ start += sizeof(struct smbios_type_3); - strcpy((char *)start, "Xen"); - start += strlen("Xen") + 1; + s = xenstore_read(HVM_XS_ENCLOSURE_MANUFACTURER, "Xen"); + strcpy((char *)start, s); + start += strlen(s) + 1; + + /* No internal defaults for this if the value is not set */ + s = xenstore_read(HVM_XS_ENCLOSURE_SERIAL_NUMBER, NULL); + if ( (s != NULL)&&(*s != '\0') ) + { + strcpy((char *)start, s); + start += strlen(s) + 1; + p->serial_number_str = 2; + } + *((uint8_t *)start) = 0; return start+1; } @@ -423,7 +588,7 @@ p->header.type = 4; p->header.length = sizeof(struct smbios_type_4); - p->header.handle = 0x400 + cpu_number; + p->header.handle = SMBIOS_HANDLE_TYPE4 + cpu_number; p->socket_designation_str = 1; p->processor_type = 0x03; /* CPU */ @@ -465,13 +630,23 @@ smbios_type_11_init(void *start) { struct smbios_type_11 *p = (struct smbios_type_11 *)start; - char path[20] = "bios-strings/oem-XX"; + char path[20]; const char *s; int i; + void *pts; + uint32_t length; + + pts = get_smbios_pt_struct(11, &length); + if ( (pts != NULL)&&(length > 0) ) + { + memcpy(start, pts, length); + p->header.handle = SMBIOS_HANDLE_TYPE11; + return (start + length); + } p->header.type = 11; p->header.length = sizeof(struct smbios_type_11); - p->header.handle = 0xB00; + p->header.handle = SMBIOS_HANDLE_TYPE11; p->count = 0; @@ -480,8 +655,7 @@ /* Pull out as many oem-* strings we find in xenstore */ for ( i = 1; i < 100; i++ ) { - path[(sizeof path) - 3] = '0' + ((i < 10) ? i : i / 10); - path[(sizeof path) - 2] = (i < 10) ? '\0' : '0' + (i % 10); + snprintf(path, sizeof(path), HVM_XS_OEM_STRINGS, i); if ( ((s = xenstore_read(path, NULL)) == NULL) || (*s == '\0') ) break; strcpy((char *)start, s); @@ -510,7 +684,7 @@ memset(p, 0, sizeof(*p)); p->header.type = 16; - p->header.handle = 0x1000; + p->header.handle = SMBIOS_HANDLE_TYPE16; p->header.length = sizeof(struct smbios_type_16); p->location = 0x01; /* other */ @@ -536,7 +710,7 @@ p->header.type = 17; p->header.length = sizeof(struct smbios_type_17); - p->header.handle = 0x1100 + instance; + p->header.handle = SMBIOS_HANDLE_TYPE17 + instance; p->physical_memory_array_handle = 0x1000; p->total_width = 64; @@ -571,7 +745,7 @@ p->header.type = 19; p->header.length = sizeof(struct smbios_type_19); - p->header.handle = 0x1300 + instance; + p->header.handle = SMBIOS_HANDLE_TYPE19 + instance; p->starting_address = instance << 24; p->ending_address = p->starting_address + (memory_size_mb << 10) - 1; @@ -593,7 +767,7 @@ p->header.type = 20; p->header.length = sizeof(struct smbios_type_20); - p->header.handle = 0x1400 + instance; + p->header.handle = SMBIOS_HANDLE_TYPE20 + instance; p->starting_address = instance << 24; p->ending_address = p->starting_address + (memory_size_mb << 10) - 1; @@ -609,6 +783,71 @@ return start+2; } +/* Type 22 -- Portable Battery */ +static void * +smbios_type_22_init(void *start) +{ + struct smbios_type_22 *p = (struct smbios_type_22 *)start; + static const char *smbios_release_date = __SMBIOS_DATE__; + const char *s; + void *pts; + uint32_t length; + + pts = get_smbios_pt_struct(22, &length); + if ( (pts != NULL)&&(length > 0) ) + { + memcpy(start, pts, length); + p->header.handle = SMBIOS_HANDLE_TYPE22; + return (start + length); + } + + s = xenstore_read(HVM_XS_SMBIOS_DEFAULT_BATTERY, "0"); + if ( strncmp(s, "1", 1) != 0 ) + return start; + + memset(p, 0, sizeof(*p)); + + p->header.type = 22; + p->header.length = sizeof(struct smbios_type_22); + p->header.handle = SMBIOS_HANDLE_TYPE22; + + p->location_str = 1; + p->manufacturer_str = 2; + p->manufacturer_date_str = 3; + p->serial_number_str = 0; + p->device_name_str = 4; + p->device_chemistry = 0x2; /* unknown */ + p->device_capacity = 0; /* unknown */ + p->device_voltage = 0; /* unknown */ + p->sbds_version_number = 0; + p->max_error = 0xff; /* unknown */ + p->sbds_serial_number = 0; + p->sbds_manufacturer_date = 0; + p->sbds_device_chemistry = 0; + p->design_capacity_multiplier = 0; + p->oem_specific = 0; + + start += sizeof(struct smbios_type_22); + + strcpy((char *)start, "Primary"); + start += strlen("Primary") + 1; + + s = xenstore_read(HVM_XS_BATTERY_MANUFACTURER, "Xen"); + strcpy((char *)start, s); + start += strlen(s) + 1; + + strcpy((char *)start, smbios_release_date); + start += strlen(smbios_release_date) + 1; + + s = xenstore_read(HVM_XS_BATTERY_DEVICE_NAME, "XEN-VBAT"); + strcpy((char *)start, s); + start += strlen(s) + 1; + + *((uint8_t *)start) = 0; + + return start+1; +} + /* Type 32 -- System Boot Information */ static void * smbios_type_32_init(void *start) @@ -619,7 +858,7 @@ p->header.type = 32; p->header.length = sizeof(struct smbios_type_32); - p->header.handle = 0x2000; + p->header.handle = SMBIOS_HANDLE_TYPE32; memset(p->reserved, 0, 6); p->boot_status = 0; /* no errors detected */ @@ -628,6 +867,58 @@ return start+2; } +/* Type 39 -- Power Supply */ +static void * +smbios_type_39_init(void *start) +{ + struct smbios_type_39 *p = (struct smbios_type_39 *)start; + void *pts; + uint32_t length; + + pts = get_smbios_pt_struct(39, &length); + if ( (pts != NULL)&&(length > 0) ) + { + memcpy(start, pts, length); + p->header.handle = SMBIOS_HANDLE_TYPE39; + return (start + length); + } + + /* Only present when passed in */ + return start; +} + +static void * +smbios_type_vendor_oem_init(void *start) +{ + uint32_t *sep = smbios_pt_addr; + uint32_t total = 0; + uint8_t *ptr; + + if ( sep == NULL ) + return start; + + while ( total < smbios_pt_length ) + { + ptr = (uint8_t*)(sep + 1); + if ( ptr[0] >= 128 ) + { + /* Vendor/OEM table, copy it in. Note the handle values cannot + * be changed since it is unknown what is in each of these tables + * but they could contain handle references to other tables. This + * means a slight risk of collision with the tables above but that + * would have to be dealt with on a case by case basis. + */ + memcpy(start, ptr, *sep); + start += *sep; + } + + total += (*sep + sizeof(uint32_t)); + sep = (uint32_t*)(ptr + *sep); + } + + return start; +} + /* Type 127 -- End of Table */ static void * smbios_type_127_init(void *start) @@ -638,7 +929,7 @@ p->header.type = 127; p->header.length = sizeof(struct smbios_type_127); - p->header.handle = 0x7f00; + p->header.handle = SMBIOS_HANDLE_TYPE127; start += sizeof(struct smbios_type_127); *((uint16_t *)start) = 0; @@ -648,7 +939,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/smbios_types.h xen-4.3.0/tools/firmware/hvmloader/smbios_types.h --- xen-4.2.2/tools/firmware/hvmloader/smbios_types.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/smbios_types.h 2013-07-09 10:46:56.000000000 +0000 @@ -84,6 +84,15 @@ uint8_t family_str; } __attribute__ ((packed)); +/* SMBIOS type 2 - Base Board Information */ +struct smbios_type_2 { + struct smbios_structure_header header; + uint8_t manufacturer_str; + uint8_t product_name_str; + uint8_t version_str; + uint8_t serial_number_str; +} __attribute__ ((packed)); + /* SMBIOS type 3 - System Enclosure */ struct smbios_type_3 { struct smbios_structure_header header; @@ -173,6 +182,26 @@ uint8_t interleaved_data_depth; } __attribute__ ((packed)); +/* SMBIOS type 22 - Portable battery */ +struct smbios_type_22 { + struct smbios_structure_header header; + uint8_t location_str; + uint8_t manufacturer_str; + uint8_t manufacturer_date_str; + uint8_t serial_number_str; + uint8_t device_name_str; + uint8_t device_chemistry; + uint16_t device_capacity; + uint16_t device_voltage; + uint8_t sbds_version_number; + uint8_t max_error; + uint16_t sbds_serial_number; + uint16_t sbds_manufacturer_date; + uint8_t sbds_device_chemistry; + uint8_t design_capacity_multiplier; + uint32_t oem_specific; +} __attribute__ ((packed)); + /* SMBIOS type 32 - System Boot Information */ struct smbios_type_32 { struct smbios_structure_header header; @@ -180,6 +209,24 @@ uint8_t boot_status; } __attribute__ ((packed)); +/* SMBIOS type 39 - Power Supply */ +struct smbios_type_39 { + struct smbios_structure_header header; + uint8_t power_unit_group; + uint8_t location_str; + uint8_t device_name_str; + uint8_t manufacturer_str; + uint8_t serial_number_str; + uint8_t asset_tag_number_str; + uint8_t model_part_number_str; + uint8_t revision_level_str; + uint16_t max_capacity; + uint16_t characteristics; + uint16_t input_voltage_probe_handle; + uint16_t cooling_device_handle; + uint16_t input_current_probe_handle; +} __attribute__ ((packed)); + /* SMBIOS type 127 -- End-of-table */ struct smbios_type_127 { struct smbios_structure_header header; @@ -190,7 +237,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/smp.c xen-4.3.0/tools/firmware/hvmloader/smp.c --- xen-4.2.2/tools/firmware/hvmloader/smp.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/smp.c 2013-07-09 10:46:56.000000000 +0000 @@ -134,7 +134,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/tests.c xen-4.3.0/tools/firmware/hvmloader/tests.c --- xen-4.2.2/tools/firmware/hvmloader/tests.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/tests.c 2013-07-09 10:46:56.000000000 +0000 @@ -246,7 +246,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/util.c xen-4.3.0/tools/firmware/hvmloader/util.c --- xen-4.2.2/tools/firmware/hvmloader/util.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/util.c 2013-07-09 10:46:56.000000000 +0000 @@ -315,23 +315,15 @@ : "0" (idx) ); } +static const char hex_digits[] = "0123456789abcdef"; + /* Write a two-character hex representation of 'byte' to digits[]. Pre-condition: sizeof(digits) >= 2 */ void byte_to_hex(char *digits, uint8_t byte) { - uint8_t nybbel = byte >> 4; - - if ( nybbel > 9 ) - digits[0] = 'a' + nybbel-10; - else - digits[0] = '0' + nybbel; - - nybbel = byte & 0x0f; - if ( nybbel > 9 ) - digits[1] = 'a' + nybbel-10; - else - digits[1] = '0' + nybbel; + digits[0] = hex_digits[byte >> 4]; + digits[1] = hex_digits[byte & 0x0f]; } /* Convert an array of 16 unsigned bytes to a DCE/OSF formatted UUID @@ -416,13 +408,14 @@ } } -static uint32_t reserve = RESERVED_MEMORY_DYNAMIC - 1; +static uint32_t alloc_up = RESERVED_MEMORY_DYNAMIC_START - 1; +static uint32_t alloc_down = RESERVED_MEMORY_DYNAMIC_END; xen_pfn_t mem_hole_alloc(uint32_t nr_mfns) { - hvm_info->reserved_mem_pgstart -= nr_mfns; - BUG_ON(hvm_info->reserved_mem_pgstart <= (reserve >> PAGE_SHIFT)); - return hvm_info->reserved_mem_pgstart; + alloc_down -= nr_mfns << PAGE_SHIFT; + BUG_ON(alloc_up >= alloc_down); + return alloc_down >> PAGE_SHIFT; } void *mem_alloc(uint32_t size, uint32_t align) @@ -433,18 +426,18 @@ if ( align < 16 ) align = 16; - s = (reserve + align) & ~(align - 1); + s = (alloc_up + align) & ~(align - 1); e = s + size - 1; - BUG_ON((e < s) || (e >> PAGE_SHIFT) >= hvm_info->reserved_mem_pgstart); + BUG_ON((e < s) || (e >= alloc_down)); - while ( (reserve >> PAGE_SHIFT) != (e >> PAGE_SHIFT) ) + while ( (alloc_up >> PAGE_SHIFT) != (e >> PAGE_SHIFT) ) { - reserve += PAGE_SIZE; - mem_hole_populate_ram(reserve >> PAGE_SHIFT, 1); + alloc_up += PAGE_SIZE; + mem_hole_populate_ram(alloc_up >> PAGE_SHIFT, 1); } - reserve = e; + alloc_up = e; return (void *)(unsigned long)s; } @@ -517,13 +510,13 @@ } } -static char *printnum(char *p, unsigned long num, int base) +static char *printnum(char *p, unsigned long num, unsigned base) { unsigned long n; if ( (n = num/base) > 0 ) p = printnum(p, n, base); - *p++ = "0123456789abcdef"[(int)(num % base)]; + *p++ = hex_digits[num % base]; *p = '\0'; return p; } @@ -838,7 +831,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/util.h xen-4.3.0/tools/firmware/hvmloader/util.h --- xen-4.2.2/tools/firmware/hvmloader/util.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/util.h 2013-07-09 10:46:56.000000000 +0000 @@ -168,6 +168,8 @@ void uuid_to_string(char *dest, uint8_t *uuid); /* Debug output */ +#define PRIllx "%x%08x" +#define PRIllx_arg(ll) (uint32_t)((ll)>>32), (uint32_t)(ll) int printf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); int vprintf(const char *fmt, va_list ap); @@ -215,6 +217,7 @@ uint32_t rombios_highbios_setup(void); /* Miscellaneous. */ +unsigned int cpu_phys_addr(void); void cacheattr_init(void); unsigned long create_mp_tables(void *table); void hvm_write_smbios_tables( @@ -242,7 +245,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/hvmloader/xenbus.c xen-4.3.0/tools/firmware/hvmloader/xenbus.c --- xen-4.2.2/tools/firmware/hvmloader/xenbus.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/hvmloader/xenbus.c 2013-07-09 10:46:56.000000000 +0000 @@ -270,7 +270,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/firmware/ovmf-makefile xen-4.3.0/tools/firmware/ovmf-makefile --- xen-4.2.2/tools/firmware/ovmf-makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/ovmf-makefile 2013-07-09 10:46:56.000000000 +0000 @@ -10,7 +10,7 @@ .PHONY: ovmf.bin ovmf.bin: OvmfPkg/build.sh -a X64 - cp Build/OvmfX64/DEBUG_GCC44/FV/OVMF.fd ovmf.bin + cp Build/OvmfX64/DEBUG_GCC*/FV/OVMF.fd ovmf.bin .PHONY: clean clean: diff -Nru xen-4.2.2/tools/firmware/seabios-config xen-4.3.0/tools/firmware/seabios-config --- xen-4.2.2/tools/firmware/seabios-config 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/firmware/seabios-config 2013-07-09 10:46:56.000000000 +0000 @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # SeaBIOS Configuration -# Wed Sep 7 13:03:21 2011 +# Thu Jan 3 17:25:45 2013 # # @@ -24,6 +24,9 @@ CONFIG_ATA_PIO32=y CONFIG_AHCI=y CONFIG_VIRTIO_BLK=y +CONFIG_VIRTIO_SCSI=y +CONFIG_ESP_SCSI=y +CONFIG_LSI_SCSI=y CONFIG_FLOPPY=y CONFIG_PS2PORT=y CONFIG_USB=y @@ -31,12 +34,13 @@ CONFIG_USB_OHCI=y CONFIG_USB_EHCI=y CONFIG_USB_MSC=y +CONFIG_USB_UAS=y CONFIG_USB_HUB=y CONFIG_USB_KEYBOARD=y CONFIG_USB_MOUSE=y CONFIG_SERIAL=y CONFIG_LPT=y -# CONFIG_USE_SMM is not set +CONFIG_USE_SMM=y CONFIG_MTRR_INIT=y # @@ -56,6 +60,7 @@ CONFIG_KBD_CALL_INT15_4F=y CONFIG_MOUSE=y CONFIG_S3_RESUME=y +CONFIG_VGAHOOKS=y # CONFIG_DISABLE_A20 is not set # @@ -67,7 +72,19 @@ CONFIG_ACPI=y # +# VGA ROM +# +CONFIG_NO_VGABIOS=y +# CONFIG_VGA_STANDARD_VGA is not set +# CONFIG_VGA_CIRRUS is not set +# CONFIG_VGA_BOCHS is not set +# CONFIG_VGA_GEODEGX2 is not set +# CONFIG_VGA_GEODELX is not set +# CONFIG_BUILD_VGABIOS is not set + +# # Debugging # CONFIG_DEBUG_LEVEL=1 # CONFIG_DEBUG_SERIAL is not set +CONFIG_DEBUG_IO=y diff -Nru xen-4.2.2/tools/flask/Makefile xen-4.3.0/tools/flask/Makefile --- xen-4.2.2/tools/flask/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -1,8 +1,8 @@ XEN_ROOT = $(CURDIR)/../.. include $(XEN_ROOT)/tools/Rules.mk -SUBDIRS := -SUBDIRS += utils +SUBDIRS-y := utils +SUBDIRS-$(FLASK_POLICY) += policy .PHONY: all clean install all clean install: %: subdirs-% diff -Nru xen-4.2.2/tools/flask/policy/Makefile xen-4.3.0/tools/flask/policy/Makefile --- xen-4.2.2/tools/flask/policy/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -1,117 +1,86 @@ -# -# Makefile for the security policy. -# -# Targets: -# -# install - compile and install the policy configuration. -# load - compile, install, and load the policy configuration. -# reload - compile, install, and load/reload the policy configuration. -# policy - compile the policy configuration locally for testing/development. -# -# The default target is 'policy'. -# +XEN_ROOT=$(CURDIR)/../../.. +include $(XEN_ROOT)/tools/Rules.mk ######################################## # # Configurable portions of the Makefile # +######################################## -# Policy version -# By default, checkpolicy will create the highest -# version policy it supports. Setting this will -# override the version. -OUTPUT_POLICY = 24 - -# Policy Type -# xen -# xen-mls -TYPE = xen - -# Policy Name -# If set, this will be used as the policy -# name. Otherwise xenpolicy will be -# used for the name. -# NAME = xenpolicy - -# Number of MLS Sensitivities -# The sensitivities will be s0 to s(MLS_SENS-1). -# Dominance will be in increasing numerical order -# with s0 being lowest. -# MLS_SENS = 16 +CONFIG_MLS ?= n -# Number of MLS Categories +# Number of available MLS sensitivities and categories. +# The sensitivities will be s0 to s(MLS_SENS-1). Dominance will be in +# increasing numerical order with s0 being lowest. +MLS_SENS ?= 16 # The categories will be c0 to c(MLS_CATS-1). -# MLS_CATS = 256 +MLS_CATS ?= 256 -# Uncomment this to disable command echoing -# QUIET:=@ +# executable paths +CHECKPOLICY ?= checkpolicy +M4 ?= m4 ######################################## # -# NO OPTIONS BELOW HERE +# End of configuration options # +######################################## -# executable paths -PREFIX := /usr -BINDIR := $(PREFIX)/bin -SBINDIR := $(PREFIX)/sbin -CHECKPOLICY := $(BINDIR)/checkpolicy -LOADPOLICY := $(SBINDIR)/flask-loadpolicy +# Policy version +# By default, checkpolicy creates the highest version policy it supports. Force +# the use of version 24 which is the highest that Xen supports, and the first to +# include the Xen policy type (needed for static device policy). +OUTPUT_POLICY = 24 + +POLICY_FILENAME = xenpolicy.$(OUTPUT_POLICY) +POLICY_LOADPATH = $(DESTDIR)/boot # policy source layout POLDIR := policy MODDIR := $(POLDIR)/modules -FLASKDIR := $(POLDIR)/flask + +# Classes and access vectors defined in the hypervisor. Changes to these require +# a recompile of both the hypervisor and security policy. +FLASKDIR := ../../../xen/xsm/flask/policy SECCLASS := $(FLASKDIR)/security_classes -ISIDS := $(FLASKDIR)/initial_sids +ISID_DECLS := $(FLASKDIR)/initial_sids AVS := $(FLASKDIR)/access_vectors +# Additional classes and access vectors defined by local policy +SECCLASS += $(POLDIR)/security_classes +AVS += $(POLDIR)/access_vectors + +# Other policy components +M4SUPPORT := $(wildcard $(POLDIR)/support/*.spt) +MLSSUPPORT := $(POLDIR)/mls +USERS := $(POLDIR)/users +CONSTRAINTS := $(POLDIR)/constraints +ISID_DEFS := $(POLDIR)/initial_sids + # config file paths GLOBALTUN := $(POLDIR)/global_tunables -GLOBALBOOL := $(POLDIR)/global_booleans MOD_CONF := $(POLDIR)/modules.conf -TUNABLES := $(POLDIR)/tunables.conf -BOOLEANS := $(POLDIR)/booleans.conf -# install paths - -DESTDIR = /boot -INSTALLDIR = $(DESTDIR) -LOADPATH = $(INSTALLDIR)/$(POLVER) - -# default MLS sensitivity and category settings. -MLS_SENS ?= 16 -MLS_CATS ?= 256 +# checkpolicy can use the #line directives provided by -s for error reporting: +M4PARAM := -D self_contained_policy -s +CHECKPOLICY_PARAM := -t Xen -c $(OUTPUT_POLICY) # enable MLS if requested. -ifneq ($(findstring -mls,$(TYPE)),) +ifneq ($(CONFIG_MLS),n) M4PARAM += -D enable_mls - CHECKPOLICY += -M -endif - -ifeq ($(NAME),) - NAME := xenpolicy -endif - -PV := $(shell $(CHECKPOLICY) -V |cut -f 1 -d ' ') - -ifneq ($(OUTPUT_POLICY),) - CHECKPOLICY += -c $(OUTPUT_POLICY) - POLVER = $(NAME).$(OUTPUT_POLICY) -else - POLVER +=$(NAME).$(PV) + CHECKPOLICY_PARAM += -M endif # Always define these because they are referenced even in non-MLS policy M4PARAM += -D mls_num_sens=$(MLS_SENS) -D mls_num_cats=$(MLS_CATS) -M4SUPPORT = $(wildcard $(POLDIR)/support/*.spt) +# Find modules ALL_LAYERS := $(filter-out $(MODDIR)/CVS,$(shell find $(wildcard $(MODDIR)/*) -maxdepth 0 -type d)) # sort here since it removes duplicates, which can happen # when a generated file is already generated -DETECTED_MODS := $(sort $(foreach dir,$(ALL_LAYERS),$(wildcard $(dir)/*.te))) +DETECTED_MODS := $(sort $(foreach dir,$(ALL_LAYERS),$(wildcard $(dir)/*.te))) # modules.conf setting for policy configuration MODENABLED := on @@ -122,81 +91,27 @@ ALL_MODULES := $(filter $(ENABLED_MODS),$(DETECTED_MODS)) ALL_INTERFACES := $(ALL_MODULES:.te=.if) -ALL_TE_FILES := $(ALL_MODULES) -PRE_TE_FILES := $(SECCLASS) $(ISIDS) $(AVS) $(M4SUPPORT) $(POLDIR)/mls -POST_TE_FILES := $(POLDIR)/users $(POLDIR)/constraints $(POLDIR)/initial_sids +# The order of these files is important +POLICY_SECTIONS := $(SECCLASS) $(ISID_DECLS) $(AVS) +POLICY_SECTIONS += $(M4SUPPORT) $(MLSSUPPORT) +POLICY_SECTIONS += $(ALL_INTERFACES) +POLICY_SECTIONS += $(GLOBALTUN) +POLICY_SECTIONS += $(ALL_MODULES) +POLICY_SECTIONS += $(USERS) $(CONSTRAINTS) $(ISID_DEFS) -POLICY_SECTIONS := $(PRE_TE_FILES) $(ALL_INTERFACES) $(GLOBALBOOL) $(GLOBALTUN) $(ALL_TE_FILES) $(POST_TE_FILES) +all: $(POLICY_FILENAME) -######################################## -# -# default action: build policy locally -# -default: policy - -policy: $(POLVER) - -install: $(LOADPATH) - -load: .load_stamp - -######################################## -# -# Build a binary policy locally -# -$(POLVER): policy.conf - @echo "Compiling $(NAME) $(POLVER)" - $(QUIET) $(CHECKPOLICY) $^ -o $@ -# Uncomment line below to enable policies for devices -# $(QUIET) $(CHECKPOLICY) -t Xen $^ -o $@ - -######################################## -# -# Install a binary policy -# -$(LOADPATH): policy.conf - @echo "Compiling and installing $(NAME) $(LOADPATH)" - $(QUIET) $(CHECKPOLICY) $^ -o $@ -# Uncomment line below to enable policies for devices -# $(QUIET) $(CHECKPOLICY) -t Xen $^ -o $@ +install: $(POLICY_FILENAME) + $(INSTALL_DATA) $^ $(POLICY_LOADPATH) -######################################## -# -# Load the binary policy -# -.load_stamp: reload -reload: $(LOADPATH) - @echo "Loading $(NAME) $(LOADPATH)" - $(QUIET) $(LOADPOLICY) $(LOADPATH) - @touch .load_stamp +$(POLICY_FILENAME): policy.conf + $(CHECKPOLICY) $(CHECKPOLICY_PARAM) $^ -o $@ -######################################## -# -# Construct a monolithic policy.conf -# policy.conf: $(POLICY_SECTIONS) - @echo "Creating $(NAME) policy.conf" -# checkpolicy can use the #line directives provided by -s for error reporting: - $(QUIET) m4 -D self_contained_policy $(M4PARAM) -s $^ > $@ + $(M4) $(M4PARAM) $^ > $@ -######################################## -# -# Remove the dontaudit rules from the policy.conf -# -enableaudit: policy.conf - @test -d tmp || mkdir -p tmp - @echo "Removing dontaudit rules from policy.conf" - $(QUIET) grep -v dontaudit policy.conf > tmp/policy.audit - $(QUIET) mv tmp/policy.audit policy.conf - -######################################## -# -# Clean the built policies. -# clean: - rm -fR tmp - rm -f policy.conf - rm -f $(POLVER) + $(RM) tmp policy.conf $(POLICY_FILENAME) -.PHONY: default policy install load reload enableaudit clean +.PHONY: all install clean diff -Nru xen-4.2.2/tools/flask/policy/policy/access_vectors xen-4.3.0/tools/flask/policy/policy/access_vectors --- xen-4.2.2/tools/flask/policy/policy/access_vectors 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/access_vectors 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,24 @@ +# Locally defined access vectors +# +# Define access vectors for the security classes defined in security_classes +# + +# Note: this is an example; the xenstore daemon provided with Xen does +# not yet include XSM support, and the exact permissions may be defined +# differently if such support is added. +class xenstore { + # read from keys owned by the target domain (if permissions allow) + read + # write to keys owned by the target domain (if permissions allow) + write + # change permissions of a key owned by the target domain + chmod + # change the owner of a key which was owned by the target domain + chown_from + # change the owner of a key to the target domain + chown_to + # access a key owned by the target domain without permission + override + # introduce a domain + introduce +} diff -Nru xen-4.2.2/tools/flask/policy/policy/flask/Makefile xen-4.3.0/tools/flask/policy/policy/flask/Makefile --- xen-4.2.2/tools/flask/policy/policy/flask/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/flask/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -# flask needs to know where to export the libselinux headers. -LIBSEL ?= ../../libselinux - -# flask needs to know where to export the kernel headers. -LINUXDIR ?= ../../../linux-2.6 - -AWK = awk - -CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ - else if [ -x /bin/bash ]; then echo /bin/bash; \ - else echo sh; fi ; fi) - -FLASK_H_DEPEND = security_classes initial_sids -AV_H_DEPEND = access_vectors - -FLASK_H_FILES = class_to_string.h flask.h initial_sid_to_string.h -AV_H_FILES = av_inherit.h common_perm_to_string.h av_perm_to_string.h av_permissions.h -ALL_H_FILES = $(FLASK_H_FILES) $(AV_H_FILES) - -all: $(ALL_H_FILES) - -$(FLASK_H_FILES): $(FLASK_H_DEPEND) - $(CONFIG_SHELL) mkflask.sh $(AWK) $(FLASK_H_DEPEND) - -$(AV_H_FILES): $(AV_H_DEPEND) - $(CONFIG_SHELL) mkaccess_vector.sh $(AWK) $(AV_H_DEPEND) - -tolib: all - install -m 644 flask.h av_permissions.h $(LIBSEL)/include/selinux - install -m 644 class_to_string.h av_inherit.h common_perm_to_string.h av_perm_to_string.h $(LIBSEL)/src - -tokern: all - install -m 644 $(ALL_H_FILES) $(LINUXDIR)/security/selinux/include - -install: all - -relabel: - -clean: - rm -f $(FLASK_H_FILES) - rm -f $(AV_H_FILES) diff -Nru xen-4.2.2/tools/flask/policy/policy/flask/access_vectors xen-4.3.0/tools/flask/policy/policy/flask/access_vectors --- xen-4.2.2/tools/flask/policy/policy/flask/access_vectors 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/flask/access_vectors 1970-01-01 00:00:00.000000000 +0000 @@ -1,186 +0,0 @@ -# -# Define common prefixes for access vectors -# -# common common_name { permission_name ... } - -# -# Define a common prefix for file access vectors. -# - - -# -# Define the access vectors. -# -# class class_name [ inherits common_name ] { permission_name ... } - - -# -# Define the access vector interpretation for file-related objects. -# - -class xen -{ - scheduler - settime - tbufcontrol - readconsole - clearconsole - perfcontrol - mtrr_add - mtrr_del - mtrr_read - microcode - physinfo - quirk - writeconsole - readapic - writeapic - privprofile - nonprivprofile - kexec - firmware - sleep - frequency - getidle - debug - getcpuinfo - heap - pm_op - mca_op - lockprof - cpupool_op - sched_op -} - -class domain -{ - setvcpucontext - pause - unpause - resume - create - transition - max_vcpus - destroy - setvcpuaffinity - getvcpuaffinity - scheduler - getdomaininfo - getvcpuinfo - getvcpucontext - setdomainmaxmem - setdomainhandle - setdebugging - hypercall - settime - set_target - shutdown - setaddrsize - getaddrsize - trigger - getextvcpucontext - setextvcpucontext - getvcpuextstate - setvcpuextstate - getpodtarget - setpodtarget - set_misc_info - set_virq_handler -} - -class hvm -{ - sethvmc - gethvmc - setparam - getparam - pcilevel - irqlevel - pciroute - bind_irq - cacheattr - trackdirtyvram - hvmctl - mem_event - mem_sharing -} - -class event -{ - bind - send - status - notify - create - reset -} - -class grant -{ - map_read - map_write - unmap - transfer - setup - copy - query -} - -class mmu -{ - map_read - map_write - pageinfo - pagelist - adjust - stat - translategp - updatemp - physmap - pinpage - mfnlist - memorymap - remote_remap -} - -class shadow -{ - disable - enable - logdirty -} - -class resource -{ - add - remove - use - add_irq - remove_irq - add_ioport - remove_ioport - add_iomem - remove_iomem - stat_device - add_device - remove_device - plug - unplug - setup -} - -class security -{ - compute_av - compute_create - compute_member - check_context - load_policy - compute_relabel - compute_user - setenforce - setbool - setsecparam - add_ocontext - del_ocontext -} diff -Nru xen-4.2.2/tools/flask/policy/policy/flask/initial_sids xen-4.3.0/tools/flask/policy/policy/flask/initial_sids --- xen-4.2.2/tools/flask/policy/policy/flask/initial_sids 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/flask/initial_sids 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -# FLASK - -# -# Define initial security identifiers -# -sid xen -sid dom0 -sid domio -sid domxen -sid unlabeled -sid security -sid ioport -sid iomem -sid irq -sid device -# FLASK diff -Nru xen-4.2.2/tools/flask/policy/policy/flask/mkaccess_vector.sh xen-4.3.0/tools/flask/policy/policy/flask/mkaccess_vector.sh --- xen-4.2.2/tools/flask/policy/policy/flask/mkaccess_vector.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/flask/mkaccess_vector.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,227 +0,0 @@ -#!/bin/sh - -# - -# FLASK - -set -e - -awk=$1 -shift - -# output files -av_permissions="av_permissions.h" -av_inherit="av_inherit.h" -common_perm_to_string="common_perm_to_string.h" -av_perm_to_string="av_perm_to_string.h" - -cat $* | $awk " -BEGIN { - outfile = \"$av_permissions\" - inheritfile = \"$av_inherit\" - cpermfile = \"$common_perm_to_string\" - avpermfile = \"$av_perm_to_string\" - "' - nextstate = "COMMON_OR_AV"; - printf("/* This file is automatically generated. Do not edit. */\n") > outfile; - printf("/* This file is automatically generated. Do not edit. */\n") > inheritfile; - printf("/* This file is automatically generated. Do not edit. */\n") > cpermfile; - printf("/* This file is automatically generated. Do not edit. */\n") > avpermfile; -; - } -/^[ \t]*#/ { - next; - } -$1 == "common" { - if (nextstate != "COMMON_OR_AV") - { - printf("Parse error: Unexpected COMMON definition on line %d\n", NR); - next; - } - - if ($2 in common_defined) - { - printf("Duplicate COMMON definition for %s on line %d.\n", $2, NR); - next; - } - common_defined[$2] = 1; - - tclass = $2; - common_name = $2; - permission = 1; - - printf("TB_(common_%s_perm_to_string)\n", $2) > cpermfile; - - nextstate = "COMMON-OPENBRACKET"; - next; - } -$1 == "class" { - if (nextstate != "COMMON_OR_AV" && - nextstate != "CLASS_OR_CLASS-OPENBRACKET") - { - printf("Parse error: Unexpected class definition on line %d\n", NR); - next; - } - - tclass = $2; - - if (tclass in av_defined) - { - printf("Duplicate access vector definition for %s on line %d\n", tclass, NR); - next; - } - av_defined[tclass] = 1; - - inherits = ""; - permission = 1; - - nextstate = "INHERITS_OR_CLASS-OPENBRACKET"; - next; - } -$1 == "inherits" { - if (nextstate != "INHERITS_OR_CLASS-OPENBRACKET") - { - printf("Parse error: Unexpected INHERITS definition on line %d\n", NR); - next; - } - - if (!($2 in common_defined)) - { - printf("COMMON %s is not defined (line %d).\n", $2, NR); - next; - } - - inherits = $2; - permission = common_base[$2]; - - for (combined in common_perms) - { - split(combined,separate, SUBSEP); - if (separate[1] == inherits) - { - inherited_perms[common_perms[combined]] = separate[2]; - } - } - - j = 1; - for (i in inherited_perms) { - ind[j] = i + 0; - j++; - } - n = asort(ind); - for (i = 1; i <= n; i++) { - perm = inherited_perms[ind[i]]; - printf("#define %s__%s", toupper(tclass), toupper(perm)) > outfile; - spaces = 40 - (length(perm) + length(tclass)); - if (spaces < 1) - spaces = 1; - for (j = 0; j < spaces; j++) - printf(" ") > outfile; - printf("0x%08xUL\n", ind[i]) > outfile; - } - printf("\n") > outfile; - for (i in ind) delete ind[i]; - for (i in inherited_perms) delete inherited_perms[i]; - - printf(" S_(SECCLASS_%s, %s, 0x%08xUL)\n", toupper(tclass), inherits, permission) > inheritfile; - - nextstate = "CLASS_OR_CLASS-OPENBRACKET"; - next; - } -$1 == "{" { - if (nextstate != "INHERITS_OR_CLASS-OPENBRACKET" && - nextstate != "CLASS_OR_CLASS-OPENBRACKET" && - nextstate != "COMMON-OPENBRACKET") - { - printf("Parse error: Unexpected { on line %d\n", NR); - next; - } - - if (nextstate == "INHERITS_OR_CLASS-OPENBRACKET") - nextstate = "CLASS-CLOSEBRACKET"; - - if (nextstate == "CLASS_OR_CLASS-OPENBRACKET") - nextstate = "CLASS-CLOSEBRACKET"; - - if (nextstate == "COMMON-OPENBRACKET") - nextstate = "COMMON-CLOSEBRACKET"; - } -/[a-z][a-z_]*/ { - if (nextstate != "COMMON-CLOSEBRACKET" && - nextstate != "CLASS-CLOSEBRACKET") - { - printf("Parse error: Unexpected symbol %s on line %d\n", $1, NR); - next; - } - - if (nextstate == "COMMON-CLOSEBRACKET") - { - if ((common_name,$1) in common_perms) - { - printf("Duplicate permission %s for common %s on line %d.\n", $1, common_name, NR); - next; - } - - common_perms[common_name,$1] = permission; - - printf("#define COMMON_%s__%s", toupper(common_name), toupper($1)) > outfile; - - printf(" S_(\"%s\")\n", $1) > cpermfile; - } - else - { - if ((tclass,$1) in av_perms) - { - printf("Duplicate permission %s for %s on line %d.\n", $1, tclass, NR); - next; - } - - av_perms[tclass,$1] = permission; - - if (inherits != "") - { - if ((inherits,$1) in common_perms) - { - printf("Permission %s in %s on line %d conflicts with common permission.\n", $1, tclass, inherits, NR); - next; - } - } - - printf("#define %s__%s", toupper(tclass), toupper($1)) > outfile; - - printf(" S_(SECCLASS_%s, %s__%s, \"%s\")\n", toupper(tclass), toupper(tclass), toupper($1), $1) > avpermfile; - } - - spaces = 40 - (length($1) + length(tclass)); - if (spaces < 1) - spaces = 1; - - for (i = 0; i < spaces; i++) - printf(" ") > outfile; - printf("0x%08xUL\n", permission) > outfile; - permission = permission * 2; - } -$1 == "}" { - if (nextstate != "CLASS-CLOSEBRACKET" && - nextstate != "COMMON-CLOSEBRACKET") - { - printf("Parse error: Unexpected } on line %d\n", NR); - next; - } - - if (nextstate == "COMMON-CLOSEBRACKET") - { - common_base[common_name] = permission; - printf("TE_(common_%s_perm_to_string)\n\n", common_name) > cpermfile; - } - - printf("\n") > outfile; - - nextstate = "COMMON_OR_AV"; - } -END { - if (nextstate != "COMMON_OR_AV" && nextstate != "CLASS_OR_CLASS-OPENBRACKET") - printf("Parse error: Unexpected end of file\n"); - - }' - -# FLASK diff -Nru xen-4.2.2/tools/flask/policy/policy/flask/mkflask.sh xen-4.3.0/tools/flask/policy/policy/flask/mkflask.sh --- xen-4.2.2/tools/flask/policy/policy/flask/mkflask.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/flask/mkflask.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,95 +0,0 @@ -#!/bin/sh - -# - -# FLASK - -set -e - -awk=$1 -shift 1 - -# output file -output_file="flask.h" -debug_file="class_to_string.h" -debug_file2="initial_sid_to_string.h" - -cat $* | $awk " -BEGIN { - outfile = \"$output_file\" - debugfile = \"$debug_file\" - debugfile2 = \"$debug_file2\" - "' - nextstate = "CLASS"; - - printf("/* This file is automatically generated. Do not edit. */\n") > outfile; - - printf("#ifndef _SELINUX_FLASK_H_\n") > outfile; - printf("#define _SELINUX_FLASK_H_\n") > outfile; - printf("\n/*\n * Security object class definitions\n */\n") > outfile; - printf("/* This file is automatically generated. Do not edit. */\n") > debugfile; - printf("/*\n * Security object class definitions\n */\n") > debugfile; - printf(" S_(\"null\")\n") > debugfile; - printf("/* This file is automatically generated. Do not edit. */\n") > debugfile2; - printf("static char *initial_sid_to_string[] =\n{\n") > debugfile2; - printf(" \"null\",\n") > debugfile2; - } -/^[ \t]*#/ { - next; - } -$1 == "class" { - if (nextstate != "CLASS") - { - printf("Parse error: Unexpected class definition on line %d\n", NR); - next; - } - - if ($2 in class_found) - { - printf("Duplicate class definition for %s on line %d.\n", $2, NR); - next; - } - class_found[$2] = 1; - - class_value++; - - printf("#define SECCLASS_%s", toupper($2)) > outfile; - for (i = 0; i < 40 - length($2); i++) - printf(" ") > outfile; - printf("%d\n", class_value) > outfile; - - printf(" S_(\"%s\")\n", $2) > debugfile; - } -$1 == "sid" { - if (nextstate == "CLASS") - { - nextstate = "SID"; - printf("\n/*\n * Security identifier indices for initial entities\n */\n") > outfile; - } - - if ($2 in sid_found) - { - printf("Duplicate SID definition for %s on line %d.\n", $2, NR); - next; - } - sid_found[$2] = 1; - sid_value++; - - printf("#define SECINITSID_%s", toupper($2)) > outfile; - for (i = 0; i < 37 - length($2); i++) - printf(" ") > outfile; - printf("%d\n", sid_value) > outfile; - printf(" \"%s\",\n", $2) > debugfile2; - } -END { - if (nextstate != "SID") - printf("Parse error: Unexpected end of file\n"); - - printf("\n#define SECINITSID_NUM") > outfile; - for (i = 0; i < 34; i++) - printf(" ") > outfile; - printf("%d\n", sid_value) > outfile; - printf("\n#endif\n") > outfile; - printf("};\n\n") > debugfile2; - }' - -# FLASK diff -Nru xen-4.2.2/tools/flask/policy/policy/flask/security_classes xen-4.3.0/tools/flask/policy/policy/flask/security_classes --- xen-4.2.2/tools/flask/policy/policy/flask/security_classes 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/flask/security_classes 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -# FLASK - -# -# Define the security object classes -# - -# Classes marked as userspace are classes -# for userspace object managers - -class xen -class domain -class hvm -class mmu -class resource -class shadow -class event -class grant -class security - -# FLASK diff -Nru xen-4.2.2/tools/flask/policy/policy/global_booleans xen-4.3.0/tools/flask/policy/policy/global_booleans --- xen-4.2.2/tools/flask/policy/policy/global_booleans 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/global_booleans 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -# -# This file is for the declaration of global booleans. -# To change the default value at build time, the booleans.conf -# file should be used. -# diff -Nru xen-4.2.2/tools/flask/policy/policy/global_tunables xen-4.3.0/tools/flask/policy/policy/global_tunables --- xen-4.2.2/tools/flask/policy/policy/global_tunables 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/global_tunables 2013-07-09 10:46:56.000000000 +0000 @@ -1,6 +1,5 @@ # -# This file is for the declaration of global tunables. -# To change the default value at build time, the booleans.conf -# file should be used. +# This file is for the declaration of global policy tunables, booleans, +# and other components not defined within a specific policy module. # diff -Nru xen-4.2.2/tools/flask/policy/policy/initial_sids xen-4.3.0/tools/flask/policy/policy/initial_sids --- xen-4.2.2/tools/flask/policy/policy/initial_sids 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/initial_sids 2013-07-09 10:46:56.000000000 +0000 @@ -1,4 +1,6 @@ -# Labels for initial SIDs +# Labels for initial SIDs. These initial SIDs are used by the hypervisor for +# objects created before the policy is loaded or for objects that do not have a +# label defined in some other manner. sid xen gen_context(system_u:system_r:xen_t,s0) sid dom0 gen_context(system_u:system_r:dom0_t,s0) diff -Nru xen-4.2.2/tools/flask/policy/policy/mls xen-4.3.0/tools/flask/policy/policy/mls --- xen-4.2.2/tools/flask/policy/policy/mls 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/mls 2013-07-09 10:46:56.000000000 +0000 @@ -70,11 +70,11 @@ (( h1 dom h2 ) and (( l1 eq l2 ) or (t1 == mls_priv))); # all the domain "read" ops -mlsconstrain domain { getvcpuaffinity getdomaininfo getvcpuinfo getvcpucontext getaddrsize getextvcpucontext } +mlsconstrain domain { getaffinity getdomaininfo getvcpuinfo getvcpucontext getaddrsize getextvcpucontext } ((l1 dom l2) or (t1 == mls_priv)); # all the domain "write" ops -mlsconstrain domain { setvcpucontext pause unpause resume create max_vcpus destroy setvcpuaffinity scheduler setdomainmaxmem setdomainhandle setdebugging hypercall settime set_target shutdown setaddrsize trigger setextvcpucontext } +mlsconstrain domain { setvcpucontext pause unpause resume create max_vcpus destroy setaffinity scheduler setdomainmaxmem setdomainhandle setdebugging hypercall settime set_target shutdown setaddrsize trigger setextvcpucontext } ((l1 eq l2) or (t1 == mls_priv)); # This is incomplete - similar constraints must be written for all classes diff -Nru xen-4.2.2/tools/flask/policy/policy/modules/xen/xen.if xen-4.3.0/tools/flask/policy/policy/modules/xen/xen.if --- xen-4.2.2/tools/flask/policy/policy/modules/xen/xen.if 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/modules/xen/xen.if 2013-07-09 10:46:56.000000000 +0000 @@ -5,36 +5,92 @@ # Domain creation and setup # ################################################################################ +define(`declare_domain_common', ` + allow $1 $2:grant { query setup }; + allow $1 $2:mmu { adjust physmap map_read map_write stat pinpage updatemp mmuext_op }; + allow $1 $2:hvm { getparam setparam }; +') + # declare_domain(type, attrs...) -# Declare a type as a domain type, and allow basic domain setup +# Declare a domain type, along with associated _self and _channel types +# Allow the domain to perform basic operations on itself define(`declare_domain', ` type $1, domain_type`'ifelse(`$#', `1', `', `,shift($@)'); - allow $1 $1:grant { query setup }; - allow $1 $1:mmu { adjust physmap map_read map_write stat pinpage }; - allow $1 $1:hvm { getparam setparam }; + type $1_self, domain_type, domain_self_type; + type_transition $1 $1:domain $1_self; + type $1_channel, event_type; + type_transition $1 domain_type:event $1_channel; + declare_domain_common($1, $1_self) ') -# create_domain(priv, target) -# Allow a domain to be created -define(`create_domain', ` +# declare_singleton_domain(type, attrs...) +# Declare a domain type and associated _channel types. +# Note: Because the domain can perform basic operations on itself and any +# other domain of the same type, this constructor should be used for types +# containing at most one domain. This is not enforced by policy. +define(`declare_singleton_domain', ` + type $1, domain_type`'ifelse(`$#', `1', `', `,shift($@)'); + define(`$1_self', `$1') + type $1_channel, event_type; + type_transition $1 domain_type:event $1_channel; + declare_domain_common($1, $1) +') + +# declare_build_label(type) +# Declare a paired _building type for the given domain type +define(`declare_build_label', ` + type $1_building, domain_type; + type_transition $1_building domain_type:event $1_channel; + allow $1_building $1 : domain transition; +') + +define(`create_domain_common', ` allow $1 $2:domain { create max_vcpus setdomainmaxmem setaddrsize - getdomaininfo hypercall setvcpucontext scheduler - unpause getvcpuinfo getvcpuextstate getaddrsize - getvcpuaffinity }; + getdomaininfo hypercall setvcpucontext setextvcpucontext + getscheduler getvcpuinfo getvcpuextstate getaddrsize + getaffinity setaffinity }; + allow $1 $2:domain2 { set_cpuid settsc setscheduler setclaim }; allow $1 $2:security check_context; allow $1 $2:shadow enable; - allow $1 $2:mmu {map_read map_write adjust memorymap physmap pinpage}; + allow $1 $2:mmu { map_read map_write adjust memorymap physmap pinpage mmuext_op }; allow $1 $2:grant setup; - allow $1 $2:hvm { cacheattr getparam hvmctl irqlevel pciroute setparam pcilevel trackdirtyvram }; - allow $1 $2_$1_channel:event create; + allow $1 $2:hvm { cacheattr getparam hvmctl irqlevel pciroute sethvmc + setparam pcilevel trackdirtyvram nested }; +') + +# create_domain(priv, target) +# Allow a domain to be created directly +define(`create_domain', ` + create_domain_common($1, $2) + allow $1 $2_channel:event create; +') + +# create_domain_build_label(priv, target) +# Allow a domain to be created via its domain build label +define(`create_domain_build_label', ` + create_domain_common($1, $2_building) + allow $1 $2_channel:event create; + allow $1 $2_building:domain2 relabelfrom; + allow $1 $2:domain2 relabelto; + allow $2_building $2:domain transition; ') # manage_domain(priv, target) # Allow managing a running domain define(`manage_domain', ` - allow $1 $2:domain { getdomaininfo getvcpuinfo getvcpuaffinity + allow $1 $2:domain { getdomaininfo getvcpuinfo getaffinity getaddrsize pause unpause trigger shutdown destroy - setvcpuaffinity setdomainmaxmem }; + setaffinity setdomainmaxmem getscheduler }; +') + +# migrate_domain_out(priv, target) +# Allow creation of a snapshot or migration image from a domain +# (inbound migration is the same as domain creation) +define(`migrate_domain_out', ` + allow $1 $2:hvm { gethvmc getparam irqlevel }; + allow $1 $2:mmu { stat pageinfo map_read }; + allow $1 $2:domain { getaddrsize getvcpucontext getextvcpucontext getvcpuextstate pause destroy }; + allow $1 $2:domain2 gettsc; ') ################################################################################ @@ -47,8 +103,6 @@ # This allows an event channel to be created from domains with labels # to and will label it define(`create_channel', ` - type $3, event_type; - type_transition $1 $2:event $3; allow $1 $3:event { create send status }; allow $3 $2:event { bind }; ') @@ -56,8 +110,8 @@ # domain_event_comms(dom1, dom2) # Allow two domain types to communicate using event channels define(`domain_event_comms', ` - create_channel($1, $2, $1_$2_channel) - create_channel($2, $1, $2_$1_channel) + create_channel($1, $2, $1_channel) + create_channel($2, $1, $2_channel) ') # domain_comms(dom1, dom2) @@ -69,20 +123,36 @@ ') # domain_self_comms(domain) -# Allow a domain types to communicate with others of its type using grants -# and event channels (this includes event channels to DOMID_SELF) +# Allow a non-singleton domain type to communicate with itself using grants +# and event channels define(`domain_self_comms', ` - create_channel($1, $1, $1_self_channel) - allow $1 $1:grant { map_read map_write copy unmap }; + create_channel($1, $1_self, $1_channel) + allow $1 $1_self:grant { map_read map_write copy unmap }; ') # device_model(dm_dom, hvm_dom) # Define how a device model domain interacts with its target define(`device_model', ` - domain_comms($1, $2) - allow $1 $2:domain { set_target shutdown }; - allow $1 $2:mmu { map_read map_write adjust physmap }; - allow $1 $2:hvm { getparam setparam trackdirtyvram hvmctl irqlevel pciroute }; + type $2_target, domain_type, domain_target_type; + type_transition $2 $1:domain $2_target; + allow $1 $2:domain set_target; + + type_transition $2_target domain_type:event $2_channel; + create_channel($1, $2_target, $1_channel) + create_channel($2, $1, $2_channel) + allow $1 $2_channel:event create; + + allow $1 $2_target:domain shutdown; + allow $1 $2_target:mmu { map_read map_write adjust physmap target_hack }; + allow $1 $2_target:hvm { getparam setparam trackdirtyvram hvmctl irqlevel pciroute cacheattr send_irq }; +') + +# make_device_model(priv, dm_dom, hvm_dom) +# Allow creation of a device model and HVM domain pair +define(`make_device_model', ` + device_model($2, $3) + allow $1 $2:domain2 make_priv_for; + allow $1 $3:domain2 set_as_target; ') ################################################################################ # @@ -93,8 +163,9 @@ # use_device(domain, device) # Allow a device to be used by a domain define(`use_device', ` + allow $1 $1_self:mmu exchange; allow $1 $2:resource use; - allow $1 $2:mmu { map_read map_write }; + allow $1 domio_t:mmu { map_read map_write }; ') # admin_device(domain, device) diff -Nru xen-4.2.2/tools/flask/policy/policy/modules/xen/xen.te xen-4.3.0/tools/flask/policy/policy/modules/xen/xen.te --- xen-4.2.2/tools/flask/policy/policy/modules/xen/xen.te 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/modules/xen/xen.te 2013-07-09 10:46:56.000000000 +0000 @@ -8,6 +8,8 @@ ################################################################################ attribute xen_type; attribute domain_type; +attribute domain_self_type; +attribute domain_target_type; attribute resource_type; attribute event_type; attribute mls_priv; @@ -25,12 +27,12 @@ type xen_t, xen_type, mls_priv; # Domain 0 -declare_domain(dom0_t, mls_priv); +declare_singleton_domain(dom0_t, mls_priv); -# Untracked I/O memory (pseudo-domain) +# I/O memory (DOMID_IO pseudo-domain) type domio_t, xen_type; -# Xen heap (pseudo-domain) +# Xen heap (DOMID_XEN pseudo-domain) type domxen_t, xen_type; # Unlabeled objects @@ -49,31 +51,67 @@ ################################################################################ # -# Rules required to boot the hypervisor and dom0 +# Allow dom0 access to all sysctls, devices, and the security server. +# +# While this could be written more briefly using wildcards, the permissions are +# listed out to make removing specific permissions simpler. # ################################################################################ -allow xen_t dom0_t:domain { create }; +allow dom0_t xen_t:xen { + settime tbufcontrol readconsole clearconsole perfcontrol mtrr_add + mtrr_del mtrr_read microcode physinfo quirk writeconsole readapic + writeapic privprofile nonprivprofile kexec firmware sleep frequency + getidle debug getcpuinfo heap pm_op mca_op lockprof cpupool_op tmem_op + tmem_control getscheduler setscheduler +}; +allow dom0_t xen_t:mmu memorymap; + +# Allow dom0 to use these domctls on itself. For domctls acting on other +# domains, see the definitions of create_domain and manage_domain. +allow dom0_t dom0_t:domain { + setvcpucontext max_vcpus setaffinity getaffinity getscheduler + getdomaininfo getvcpuinfo getvcpucontext setdomainmaxmem setdomainhandle + setdebugging hypercall settime setaddrsize getaddrsize trigger + getextvcpucontext setextvcpucontext getvcpuextstate setvcpuextstate + getpodtarget setpodtarget set_misc_info set_virq_handler +}; +allow dom0_t dom0_t:domain2 { + set_cpuid gettsc settsc setscheduler +}; +allow dom0_t dom0_t:resource { add remove }; -allow dom0_t xen_t:xen { kexec readapic writeapic mtrr_read mtrr_add mtrr_del - scheduler physinfo heap quirk readconsole writeconsole settime getcpuinfo - microcode cpupool_op sched_op pm_op }; -allow dom0_t xen_t:mmu { memorymap }; -allow dom0_t security_t:security { check_context compute_av compute_create - compute_member load_policy compute_relabel compute_user setenforce - setbool setsecparam add_ocontext del_ocontext }; +# These permissions allow using the FLASK security server to compute access +# checks locally, which could be used by a domain or service (such as xenstore) +# that does not have its own security server to make access decisions based on +# Xen's security policy. +allow dom0_t security_t:security { + compute_av compute_create compute_member compute_relabel compute_user +}; + +# Allow string/SID conversions (for "xl list -Z" and similar) +allow dom0_t security_t:security check_context; + +# Allow flask-label-pci to add and change labels +allow dom0_t security_t:security { add_ocontext del_ocontext }; -allow dom0_t dom0_t:domain { getdomaininfo getvcpuinfo getvcpuaffinity }; -allow dom0_t dom0_t:resource { add remove }; +# Allow performance parameters of the security server to be tweaked +allow dom0_t security_t:security setsecparam; + +# Allow changing the security policy +allow dom0_t security_t:security { load_policy setenforce setbool }; + +# Audit policy change events even when they are allowed +auditallow dom0_t security_t:security { load_policy setenforce setbool }; admin_device(dom0_t, device_t) admin_device(dom0_t, irq_t) admin_device(dom0_t, ioport_t) admin_device(dom0_t, iomem_t) -allow dom0_t domio_t:mmu { map_read map_write }; -domain_self_comms(dom0_t) +domain_comms(dom0_t, dom0_t) -auditallow dom0_t security_t:security { load_policy setenforce setbool }; +# Allow all domains to use (unprivileged parts of) the tmem hypercall +allow domain_type xen_t:xen tmem_op; ############################################################################### # @@ -86,12 +124,16 @@ create_domain(dom0_t, domU_t) manage_domain(dom0_t, domU_t) domain_comms(dom0_t, domU_t) +domain_comms(domU_t, domU_t) +domain_self_comms(domU_t) declare_domain(isolated_domU_t) create_domain(dom0_t, isolated_domU_t) manage_domain(dom0_t, isolated_domU_t) domain_comms(dom0_t, isolated_domU_t) +domain_self_comms(isolated_domU_t) +# Declare a boolean that denies creation of prot_domU_t domains gen_bool(prot_doms_locked, false) declare_domain(prot_domU_t) if (!prot_doms_locked) { @@ -99,6 +141,8 @@ } domain_comms(dom0_t, prot_domU_t) domain_comms(domU_t, prot_domU_t) +domain_comms(prot_domU_t, prot_domU_t) +domain_self_comms(prot_domU_t) # domHVM_t is meant to be paired with a qemu-dm stub domain of type dm_dom_t declare_domain(domHVM_t) @@ -111,7 +155,16 @@ create_domain(dom0_t, dm_dom_t) manage_domain(dom0_t, dm_dom_t) domain_comms(dom0_t, dm_dom_t) -device_model(dm_dom_t, domHVM_t) +make_device_model(dom0_t, dm_dom_t, domHVM_t) + +# nomigrate_t must be built via the nomigrate_t_building label; once built, +# dom0 cannot read its memory. +declare_domain(nomigrate_t) +declare_build_label(nomigrate_t) +create_domain_build_label(dom0_t, nomigrate_t) +manage_domain(dom0_t, nomigrate_t) +domain_comms(dom0_t, nomigrate_t) +domain_self_comms(nomigrate_t) ############################################################################### # @@ -171,7 +224,7 @@ ################################################################################ # Domains must be declared using domain_type -neverallow * ~domain_type:domain create; +neverallow * ~domain_type:domain { create transition }; # Resources must be declared using resource_type neverallow * ~resource_type:resource use; diff -Nru xen-4.2.2/tools/flask/policy/policy/security_classes xen-4.3.0/tools/flask/policy/policy/security_classes --- xen-4.2.2/tools/flask/policy/policy/security_classes 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/flask/policy/policy/security_classes 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,8 @@ +# Locally defined security classes +# +# These classes are not used by the hypervisor, but may be used by domains or +# daemons that need to make access control decisions using the hypervisor's +# security policy. +# +# Access vectors for these classes must be defined in the access_vectors file. +class xenstore diff -Nru xen-4.2.2/tools/hotplug/Linux/Makefile xen-4.3.0/tools/hotplug/Linux/Makefile --- xen-4.2.2/tools/hotplug/Linux/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -13,46 +13,23 @@ XEN_SCRIPTS = network-bridge vif-bridge XEN_SCRIPTS += network-route vif-route XEN_SCRIPTS += network-nat vif-nat +XEN_SCRIPTS += vif-openvswitch XEN_SCRIPTS += vif2 XEN_SCRIPTS += vif-setup XEN_SCRIPTS += block XEN_SCRIPTS += block-enbd block-nbd XEN_SCRIPTS += blktap -XEN_SCRIPTS += vtpm vtpm-delete XEN_SCRIPTS += xen-hotplug-cleanup XEN_SCRIPTS += external-device-migrate XEN_SCRIPTS += vscsi +XEN_SCRIPTS += block-iscsi XEN_SCRIPT_DATA = xen-script-common.sh locking.sh logging.sh XEN_SCRIPT_DATA += xen-hotplug-common.sh xen-network-common.sh vif-common.sh -XEN_SCRIPT_DATA += block-common.sh vtpm-common.sh vtpm-hotplug-common.sh -XEN_SCRIPT_DATA += vtpm-migration.sh vtpm-impl - -XEN_HOTPLUG_DIR = $(CONFIG_DIR)/hotplug -XEN_HOTPLUG_SCRIPTS = xen-backend.agent - -UDEVVER = 0 -ifeq ($(shell [ -x /sbin/udevadm ] && echo 1),1) -UDEVVER = $(shell /sbin/udevadm info -V | sed -e 's/^[^0-9]* \([0-9]\{1,\}\)[^0-9]\{0,\}/\1/' ) -endif -ifeq ($(shell [ -x /usr/bin/udevinfo ] && echo 1),1) -UDEVVER = $(shell /usr/bin/udevinfo -V | sed -e 's/^[^0-9]* \([0-9]\{1,\}\)[^0-9]\{0,\}/\1/' ) -endif +XEN_SCRIPT_DATA += block-common.sh UDEV_RULES_DIR = $(CONFIG_DIR)/udev UDEV_RULES = xen-backend.rules xend.rules -DI = $(if $(DISTDIR),$(shell readlink -f $(DISTDIR)),) -DE = $(if $(DESTDIR),$(shell readlink -f $(DESTDIR)),) -ifeq ($(findstring $(DI),$(DE)),$(DI)) -HOTPLUGS=install-hotplug install-udev -else -ifeq ($(shell [ $(UDEVVER) -ge 059 ] && echo 1),1) -HOTPLUGS=install-udev -else -HOTPLUGS=install-hotplug -endif -endif - .PHONY: all all: @@ -60,7 +37,7 @@ build: .PHONY: install -install: all install-initd install-scripts $(HOTPLUGS) +install: all install-initd install-scripts install-udev # See docs/misc/distro_mapping.txt for INITD_DIR location .PHONY: install-initd @@ -69,9 +46,9 @@ [ -d $(DESTDIR)$(SYSCONFIG_DIR) ] || $(INSTALL_DIR) $(DESTDIR)$(SYSCONFIG_DIR) $(INSTALL_PROG) $(XEND_INITD) $(DESTDIR)$(INITD_DIR) $(INSTALL_PROG) $(XENDOMAINS_INITD) $(DESTDIR)$(INITD_DIR) - $(INSTALL_PROG) $(XENDOMAINS_SYSCONFIG) $(DESTDIR)$(SYSCONFIG_DIR)/xendomains + $(INSTALL_DATA) $(XENDOMAINS_SYSCONFIG) $(DESTDIR)$(SYSCONFIG_DIR)/xendomains $(INSTALL_PROG) $(XENCOMMONS_INITD) $(DESTDIR)$(INITD_DIR) - $(INSTALL_PROG) $(XENCOMMONS_SYSCONFIG) $(DESTDIR)$(SYSCONFIG_DIR)/xencommons + $(INSTALL_DATA) $(XENCOMMONS_SYSCONFIG) $(DESTDIR)$(SYSCONFIG_DIR)/xencommons $(INSTALL_PROG) init.d/xen-watchdog $(DESTDIR)$(INITD_DIR) .PHONY: install-scripts @@ -87,15 +64,6 @@ $(INSTALL_DATA) $$i $(DESTDIR)$(XEN_SCRIPT_DIR); \ done -.PHONY: install-hotplug -install-hotplug: - [ -d $(DESTDIR)$(XEN_HOTPLUG_DIR) ] || \ - $(INSTALL_DIR) $(DESTDIR)$(XEN_HOTPLUG_DIR) - set -e; for i in $(XEN_HOTPLUG_SCRIPTS); \ - do \ - $(INSTALL_PROG) $$i $(DESTDIR)$(XEN_HOTPLUG_DIR); \ - done - .PHONY: install-udev install-udev: [ -d $(DESTDIR)$(UDEV_RULES_DIR) ] || \ diff -Nru xen-4.2.2/tools/hotplug/Linux/block-iscsi xen-4.3.0/tools/hotplug/Linux/block-iscsi --- xen-4.2.2/tools/hotplug/Linux/block-iscsi 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/block-iscsi 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,154 @@ +#!/bin/bash -e +# +# Open-iSCSI Xen block device hotplug script +# +# Author Roger Pau Monné +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation; version 2.1 only. with the special +# exception on linking described in file LICENSE. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# Usage: +# +# Target should be specified using the following syntax: +# +# script=block-iscsi,vdev=xvda,target=iqn=,portal= +# +# Portal address must be in IP format. +# + +dir=$(dirname "$0") +. "$dir/block-common.sh" + +remove_label() +{ + echo $1 | sed "s/^\("$2"\)//" +} + +check_tools() +{ + if ! command -v iscsiadm > /dev/null 2>&1; then + fatal "Unable to find iscsiadm tool" + fi + if [ "$multipath" = "y" ] && ! command -v multipath > /dev/null 2>&1; then + fatal "Unable to find multipath" + fi +} + +# Sets the following global variables based on the params field passed in as +# a parameter: iqn, portal, auth_method, user, multipath, password +parse_target() +{ + # set multipath default value + multipath="n" + for param in $(echo "$1" | tr "," "\n") + do + case $param in + iqn=*) + iqn=$(remove_label $param "iqn=") + ;; + portal=*) + portal=$(remove_label $param "portal=") + ;; + multipath=*) + multipath=$(remove_label $param "multipath=") + ;; + esac + done + if [ -z "$iqn" ] || [ -z "$portal" ]; then + fatal "iqn= and portal= are required parameters" + fi + if [ "$multipath" != "y" ] && [ "$multipath" != "n" ]; then + fatal "multipath valid values are y and n, $multipath not a valid value" + fi +} + +# Sets $dev to point to the device associated with the value in iqn +find_device() +{ + count=0 + while [ ! -e /dev/disk/by-path/*"$iqn"-lun-0 ]; do + sleep 0.1 + count=`expr $count + 1` + if [ count = 100 ]; then + # 10s timeout while waiting for iSCSI disk to settle + fatal "timeout waiting for iSCSI disk to settle" + fi + done + sddev=$(readlink -f /dev/disk/by-path/*"$iqn"-lun-0 || true) + if [ ! -b "$sddev" ]; then + fatal "Unable to find attached device path" + fi + if [ "$multipath" = "y" ]; then + mdev=$(multipath -ll "$sddev" | head -1 | awk '{ print $1}') + if [ ! -b /dev/mapper/"$mdev" ]; then + fatal "Unable to find attached device multipath" + fi + dev="/dev/mapper/$mdev" + else + dev="$sddev" + fi +} + +# Attaches the target $iqn in $portal and sets $dev to point to the +# multipath device +attach() +{ + do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --login > /dev/null + find_device +} + +# Discovers targets in $portal and checks that $iqn is one of those targets +# Also sets the auth parameters to attach the device +prepare() +{ + # Check if target is already opened + iscsiadm -m session 2>&1 | grep -q "$iqn" && fatal "Device already opened" + # Discover portal targets + iscsiadm -m discovery -t st -p $portal 2>&1 | grep -q "$iqn" || \ + fatal "No matching target iqn found" +} + +# Attaches the device and writes xenstore backend entries to connect +# the device +add() +{ + attach + write_dev $dev +} + +# Disconnects the device +remove() +{ + find_device + do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --logout > /dev/null +} + +command=$1 +target=$(xenstore-read $XENBUS_PATH/params || true) +if [ -z "$target" ]; then + fatal "No information about the target" +fi + +parse_target "$target" + +check_tools || exit 1 + +case $command in +add) + prepare + add + ;; +remove) + remove + ;; +*) + exit 1 + ;; +esac diff -Nru xen-4.2.2/tools/hotplug/Linux/init.d/sysconfig.xendomains xen-4.3.0/tools/hotplug/Linux/init.d/sysconfig.xendomains --- xen-4.2.2/tools/hotplug/Linux/init.d/sysconfig.xendomains 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/init.d/sysconfig.xendomains 2013-07-09 10:46:56.000000000 +0000 @@ -1,4 +1,4 @@ -## Path: System/xen +## Path: System/Virtualization ## Description: xen domain start/stop on boot ## Type: string ## Default: @@ -56,29 +56,29 @@ XENDOMAINS_SAVE=/var/lib/xen/save ## Type: string -## Default: "--halt --wait" +## Default: "--wait" # # If neither MIGRATE nor SAVE were enabled or if they failed, you can # try to shut down a domain by sending it a shutdown request. To do this, -# set this to "--halt --wait". Omit the "--wait" flag to avoid waiting +# set this to "--wait". Omit the "--wait" flag to avoid waiting # for the domain to be really down. Leave empty to skip domain shutdown. # -XENDOMAINS_SHUTDOWN="--halt --wait" +XENDOMAINS_SHUTDOWN="--wait" ## Type: string -## Default: "--all --halt --wait" +## Default: "--all --wait" # # After we have gone over all virtual machines (resp. all automatically # started ones, see XENDOMAINS_AUTO_ONLY below) in a loop and sent SysRq, # migrated, saved and/or shutdown according to the settings above, we # might want to shutdown the virtual machines that are still running # for some reason or another. To do this, set this variable to -# "--all --halt --wait", it will be passed to xm shutdown. +# "--all --wait", it will be passed to xm shutdown. # Leave it empty not to do anything special here. # (Note: This will hit all virtual machines, even if XENDOMAINS_AUTO_ONLY # is set.) # -XENDOMAINS_SHUTDOWN_ALL="--all --halt --wait" +XENDOMAINS_SHUTDOWN_ALL="--all --wait" ## Type: boolean ## Default: true diff -Nru xen-4.2.2/tools/hotplug/Linux/init.d/xen-watchdog xen-4.3.0/tools/hotplug/Linux/init.d/xen-watchdog --- xen-4.2.2/tools/hotplug/Linux/init.d/xen-watchdog 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/init.d/xen-watchdog 2013-07-09 10:46:56.000000000 +0000 @@ -17,7 +17,9 @@ ### END INIT INFO # -DAEMON=/usr/sbin/xenwatchdogd +. /etc/xen/scripts/hotplugpath.sh + +DAEMON=${SBINDIR}/xenwatchdogd base=$(basename $DAEMON) # Source function library. diff -Nru xen-4.2.2/tools/hotplug/Linux/init.d/xencommons xen-4.3.0/tools/hotplug/Linux/init.d/xencommons --- xen-4.2.2/tools/hotplug/Linux/init.d/xencommons 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/init.d/xencommons 2013-07-09 10:46:56.000000000 +0000 @@ -18,6 +18,8 @@ # Description: Starts and stops the daemons neeeded for xl/xend ### END INIT INFO +. /etc/xen/scripts/hotplugpath.sh + if [ -d /etc/sysconfig ]; then xencommons_config=/etc/sysconfig else @@ -27,6 +29,7 @@ test -f $xencommons_config/xencommons && . $xencommons_config/xencommons XENCONSOLED_PIDFILE=/var/run/xenconsoled.pid +QEMU_PIDFILE=/var/run/qemu-dom0.pid shopt -s extglob # not running in Xen dom0 or domU @@ -71,7 +74,7 @@ modprobe blktap2 2>/dev/null || modprobe blktap 2>/dev/null mkdir -p /var/run/xen - if ! `xenstore-read -s / >/dev/null 2>&1` + if ! `${BINDIR}/xenstore-read -s / >/dev/null 2>&1` then test -z "$XENSTORED_ROOTDIR" && XENSTORED_ROOTDIR="/var/lib/xenstored" rm -f "$XENSTORED_ROOTDIR"/tdb* &>/dev/null @@ -80,19 +83,19 @@ if [ -n "$XENSTORED" ] ; then echo -n Starting $XENSTORED... $XENSTORED --pid-file /var/run/xenstored.pid $XENSTORED_ARGS - elif [ -x /usr/sbin/oxenstored ] ; then + elif [ -x ${SBINDIR}/oxenstored ] ; then echo -n Starting oxenstored... - /usr/sbin/oxenstored --pid-file /var/run/xenstored.pid $XENSTORED_ARGS - elif [ -x /usr/sbin/xenstored ] ; then + ${SBINDIR}/oxenstored --pid-file /var/run/xenstored.pid $XENSTORED_ARGS + elif [ -x ${SBINDIR}/xenstored ] ; then echo -n Starting C xenstored... - /usr/sbin/xenstored --pid-file /var/run/xenstored.pid $XENSTORED_ARGS + ${SBINDIR}/xenstored --pid-file /var/run/xenstored.pid $XENSTORED_ARGS else echo "No xenstored found" exit 1 fi # Wait for xenstored to actually come up, timing out after 30 seconds - while [ $time -lt $timeout ] && ! `xenstore-read -s / >/dev/null 2>&1` ; do + while [ $time -lt $timeout ] && ! `${BINDIR}/xenstore-read -s / >/dev/null 2>&1` ; do echo -n . time=$(($time+1)) sleep 1 @@ -106,17 +109,17 @@ fi echo Setting domain 0 name... - xenstore-write "/local/domain/0/name" "Domain-0" + ${BINDIR}/xenstore-write "/local/domain/0/name" "Domain-0" fi echo Starting xenconsoled... test -z "$XENCONSOLED_TRACE" || XENCONSOLED_ARGS=" --log=$XENCONSOLED_TRACE" - xenconsoled --pid-file=$XENCONSOLED_PIDFILE $XENCONSOLED_ARGS - test -z "$XENBACKENDD_DEBUG" || XENBACKENDD_ARGS="-d" - test "`uname`" != "NetBSD" || xenbackendd $XENBACKENDD_ARGS + ${SBINDIR}/xenconsoled --pid-file=$XENCONSOLED_PIDFILE $XENCONSOLED_ARGS echo Starting QEMU as disk backend for dom0 - test -z "$QEMU_XEN" && QEMU_XEN=/usr/lib/xen/bin/qemu-system-i386 - $QEMU_XEN -xen-domid 0 -xen-attach -name dom0 -nographic -M xenpv -daemonize -monitor /dev/null + test -z "$QEMU_XEN" && QEMU_XEN="${LIBEXEC}/qemu-system-i386" + $QEMU_XEN -xen-domid 0 -xen-attach -name dom0 -nographic -M xenpv -daemonize \ + -monitor /dev/null -serial /dev/null -parallel /dev/null \ + -pidfile $QEMU_PIDFILE } do_stop () { echo Stopping xenconsoled @@ -126,6 +129,13 @@ rm -f $XENCONSOLED_PIDFILE fi + echo Stopping QEMU + if read 2>/dev/null <$QEMU_PIDFILE pid; then + kill $pid + while kill -9 $pid >/dev/null 2>&1; do sleep 0.1; done + rm -f $QEMU_PIDFILE + fi + echo WARNING: Not stopping xenstored, as it cannot be restarted. } @@ -134,7 +144,7 @@ do_start ;; status) - xenstore-read -s / + ${BINDIR}/xenstore-read -s / ;; stop) do_stop diff -Nru xen-4.2.2/tools/hotplug/Linux/init.d/xend xen-4.3.0/tools/hotplug/Linux/init.d/xend --- xen-4.2.2/tools/hotplug/Linux/init.d/xend 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/init.d/xend 2013-07-09 10:46:56.000000000 +0000 @@ -18,6 +18,8 @@ # Description: Starts and stops the Xen control daemon. ### END INIT INFO +. /etc/xen/scripts/hotplugpath.sh + shopt -s extglob # Wait for Xend to be up @@ -25,12 +27,12 @@ { i=1 rets=10 - xend status + ${SBINDIR}/xend status while [ $? -ne 0 -a $i -lt $rets ]; do sleep 1 echo -n . i=$(($i + 1)) - xend status + ${SBINDIR}/xend status done } @@ -48,21 +50,21 @@ else touch /var/lock/xend fi - xend start + ${SBINDIR}/xend start await_daemons_up ;; stop) - xend stop + ${SBINDIR}/xend stop rm -f /var/lock/subsys/xend /var/lock/xend ;; status) - xend status + ${SBINDIR}/xend status ;; reload) - xend reload + ${SBINDIR}/xend reload ;; restart|force-reload) - xend restart + ${SBINDIR}/xend restart await_daemons_up ;; *) diff -Nru xen-4.2.2/tools/hotplug/Linux/init.d/xendomains xen-4.3.0/tools/hotplug/Linux/init.d/xendomains --- xen-4.2.2/tools/hotplug/Linux/init.d/xendomains 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/init.d/xendomains 2013-07-09 10:46:56.000000000 +0000 @@ -27,11 +27,15 @@ # boots / shuts down. ### END INIT INFO -CMD=xm +. /etc/xen/scripts/hotplugpath.sh + +CMD=${SBINDIR}/xm +HEADCOMP="LinuxGuestRecord" $CMD list &> /dev/null if test $? -ne 0 then - CMD=xl + CMD=${SBINDIR}/xl + HEADCOMP="Xen saved domain" fi $CMD list &> /dev/null @@ -202,7 +206,7 @@ done } -LIST_GREP='((domain\|(domid\|(name\|^{$\|"name":\|"domid":' +LIST_GREP='(domain\|(domid\|(name\|^ {$\|"name":\|"domid":' parseln() { if [[ "$1" =~ '(domain' ]] || [[ "$1" = "{" ]]; then @@ -233,7 +237,7 @@ RC=0 ;; esac - done < <($CMD list -l | grep $LIST_GREP) + done < <($CMD list -l | grep "$LIST_GREP") return $RC } @@ -255,7 +259,7 @@ for dom in $XENDOMAINS_SAVE/*; do if [ -f $dom ] ; then HEADER=`head -c 16 $dom | head -n 1 2> /dev/null` - if [ $HEADER = "LinuxGuestRecord" ]; then + if [ "$HEADER" = "$HEADCOMP" ]; then echo -n " ${dom##*/}" XMR=`$CMD restore $dom 2>&1 1>/dev/null` #$CMD restore $dom @@ -315,7 +319,7 @@ if test "$state" != "-b---d" -a "$state" != "-----d"; then return 1; fi - done < <($CMD list -l | grep $LIST_GREP) + done < <($CMD list -l | grep "$LIST_GREP") return 0 } @@ -434,7 +438,7 @@ fi fi if test -n "$XENDOMAINS_SHUTDOWN"; then - # XENDOMAINS_SHUTDOWN should be "--halt --wait" + # XENDOMAINS_SHUTDOWN should be "--wait" echo -n "(shut)" watchdog_xencmd shutdown & WDOG_PID=$! @@ -446,14 +450,14 @@ fi kill $WDOG_PID >/dev/null 2>&1 fi - done < <($CMD list -l | grep $LIST_GREP) + done < <($CMD list -l | grep "$LIST_GREP") # NB. this shuts down ALL Xen domains (politely), not just the ones in # AUTODIR/* # This is because it's easier to do ;-) but arguably if this script is run # on system shutdown then it's also the right thing to do. if ! all_zombies && test -n "$XENDOMAINS_SHUTDOWN_ALL"; then - # XENDOMAINS_SHUTDOWN_ALL should be "--all --halt --wait" + # XENDOMAINS_SHUTDOWN_ALL should be "--all --wait" echo -n " SHUTDOWN_ALL " watchdog_xencmd shutdown 1 false & WDOG_PID=$! @@ -483,7 +487,7 @@ return 0 ;; esac - done < <($CMD list -l | grep $LIST_GREP) + done < <($CMD list -l | grep "$LIST_GREP") return 1 } diff -Nru xen-4.2.2/tools/hotplug/Linux/locking.sh xen-4.3.0/tools/hotplug/Linux/locking.sh --- xen-4.2.2/tools/hotplug/Linux/locking.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/locking.sh 2013-07-09 10:46:56.000000000 +0000 @@ -44,7 +44,7 @@ # See below for a correctness proof. local rightfile while true; do - eval "exec $_lockfd>>$_lockfile" + eval "exec $_lockfd<>$_lockfile" flock -x $_lockfd || return $? # We can't just stat /dev/stdin or /proc/self/fd/$_lockfd or # use bash's test -ef because those all go through what is @@ -59,6 +59,9 @@ print "y\n" if $fd_inum eq $file_inum; ' "$_lockfile" ) if [ x$rightfile = xy ]; then break; fi + # Some versions of bash appear to be buggy if the same + # $_lockfile is opened repeatedly. Close the current fd here. + eval "exec $_lockfd<&-" done } diff -Nru xen-4.2.2/tools/hotplug/Linux/vif-openvswitch xen-4.3.0/tools/hotplug/Linux/vif-openvswitch --- xen-4.2.2/tools/hotplug/Linux/vif-openvswitch 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/vif-openvswitch 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,113 @@ +#!/bin/bash +#============================================================================ +# ${XEN_SCRIPT_DIR}/vif-openvswitch +# +# Script for configuring a vif in openvswitch mode. +# The hotplugging system will call this script if it is specified either in +# the device configuration given to Xend, or the default Xend configuration +# in ${XEN_CONFIG_DIR}/xend-config.sxp. If the script is specified in +# neither of those places, then this script is the default. +# +# Usage: +# vif-openvswitch (add|remove|online|offline) +# +# Environment vars: +# vif vif interface name (required). +# XENBUS_PATH path to this device's details in the XenStore (required). +# +# Read from the store: +# bridge openvswitch to add the vif to (required). +# ip list of IP networks for the vif, space-separated (optional). +# +# up: +# Enslaves the vif interface to the bridge and adds iptables rules +# for its ip addresses (if any). +# +# down: +# Removes the vif interface from the bridge and removes the iptables +# rules for its ip addresses (if any). +#============================================================================ + +dir=$(dirname "$0") +. "$dir/vif-common.sh" + +check_tools() +{ + if ! command -v ovs-vsctl > /dev/null 2>&1; then + fatal "Unable to find ovs-vsctl tool" + fi + if ! command -v ip > /dev/null 2>&1; then + fatal "Unable to find ip tool" + fi +} +openvswitch_external_id() { + local dev=$1 + local key=$2 + local value=$3 + + echo "-- set interface $dev external-ids:\"$key\"=\"$value\"" +} + +openvswitch_external_id_all() { + local dev=$1 + local frontend_id=$(xenstore_read "$XENBUS_PATH/frontend-id") + local vm_path=$(xenstore_read "/local/domain/${frontend_id}/vm") + local name=$(xenstore_read "${vm_path}/name") + openvswitch_external_id $dev "xen-vm-name" "$name" + local uuid=$(xenstore_read "${vm_path}/uuid") + openvswitch_external_id $dev "xen-vm-uuid" "$uuid" + local mac=$(xenstore_read "$XENBUS_PATH/mac") + openvswitch_external_id $dev "attached-mac" "$mac" +} + +add_to_openvswitch () { + local dev=$1 + local bridge="$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")" + local tag trunk + + if [[ $bridge =~ ^([^.:]+)(\.([[:digit:]]+))?(:([[:digit:]]+(:[[:digit:]]+)*))?$ ]]; then + bridge="${BASH_REMATCH[1]}" + tag="${BASH_REMATCH[3]}" + trunk="${BASH_REMATCH[5]//:/,}" + else + fatal "No valid bridge was specified" + fi + + if [ $trunk ]; then + local trunk_arg="trunk=$trunk" + fi + + if [ $tag ]; then + local tag_arg="tag=$tag" + fi + + local vif_details="$(openvswitch_external_id_all $dev)" + + do_or_die ovs-vsctl --timeout=30 \ + -- --if-exists del-port $dev \ + -- add-port "$bridge" $dev $tag_arg $trunk_arg $vif_details + do_or_die ip link set $dev up +} + +case "$command" in + add|online) + check_tools + setup_virtual_bridge_port $dev + add_to_openvswitch $dev + ;; + + remove|offline) + do_without_error ovs-vsctl --timeout=30 \ + -- --if-exists del-port $dev + do_without_error ip link set $dev down + ;; +esac + +if [ "$type_if" = vif ]; then + handle_iptable +fi + +log debug "Successful vif-openvswitch $command for $dev." +if [ "$type_if" = vif -a "$command" = "online" ]; then + success +fi diff -Nru xen-4.2.2/tools/hotplug/Linux/vtpm xen-4.3.0/tools/hotplug/Linux/vtpm --- xen-4.2.2/tools/hotplug/Linux/vtpm 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/vtpm 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -#!/bin/bash - -dir=$(dirname "$0") -. "$dir/vtpm-hotplug-common.sh" - -vtpm_fatal_error=0 - -case "$command" in - add) - vtpm_create_instance - ;; - remove) - vtpm_remove_instance - ;; -esac - -if [ $vtpm_fatal_error -eq 0 ]; then - log debug "Successful vTPM operation '$command'." - success -else - fatal "Error while executing vTPM operation '$command'." -fi diff -Nru xen-4.2.2/tools/hotplug/Linux/vtpm-common.sh xen-4.3.0/tools/hotplug/Linux/vtpm-common.sh --- xen-4.2.2/tools/hotplug/Linux/vtpm-common.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/vtpm-common.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,448 +0,0 @@ -# -# Copyright (c) 2005 IBM Corporation -# Copyright (c) 2005 XenSource Ltd. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General Public -# License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -dir=$(dirname "$0") -. "$dir/logging.sh" -. "$dir/locking.sh" - -VTPMDB="/var/vtpm/vtpm.db" - -#In the vtpm-impl file some commands should be defined: -# vtpm_create, vtpm_setup, vtpm_start, etc. (see below) -if [ -r "$dir/vtpm-impl.alt" ]; then - . "$dir/vtpm-impl.alt" -elif [ -r "$dir/vtpm-impl" ]; then - . "$dir/vtpm-impl" -else - function vtpm_create () { - true - } - function vtpm_setup() { - true - } - function vtpm_start() { - true - } - function vtpm_suspend() { - true - } - function vtpm_resume() { - true - } - function vtpm_delete() { - true - } - function vtpm_migrate() { - echo "Error: vTPM migration accross machines not implemented." - } - function vtpm_migrate_local() { - echo "Error: local vTPM migration not supported" - } - function vtpm_migrate_recover() { - true - } -fi - - -#Find the instance number for the vtpm given the name of the domain -# Parameters -# - vmname : the name of the vm -# Return value -# Returns '0' if instance number could not be found, otherwise -# it returns the instance number in the variable 'instance' -function vtpmdb_find_instance () { - local vmname ret instance - vmname=$1 - ret=0 - - instance=$(cat $VTPMDB | \ - awk -vvmname=$vmname \ - '{ \ - if ( 1 != index($1,"#")) { \ - if ( $1 == vmname ) { \ - print $2; \ - exit; \ - } \ - } \ - }') - if [ "$instance" != "" ]; then - ret=$instance - fi - echo "$ret" -} - - -# Check whether a particular instance number is still available -# returns "0" if it is not available, "1" otherwise. -function vtpmdb_is_free_instancenum () { - local instance instances avail i - instance=$1 - avail=1 - #Allowed instance number range: 1-255 - if [ $instance -eq 0 -o $instance -gt 255 ]; then - avail=0 - else - instances=$(cat $VTPMDB | \ - awk \ - '{ \ - if (1 != index($1,"#")) { \ - printf("%s ",$2); \ - } \ - }') - for i in $instances; do - if [ $i -eq $instance ]; then - avail=0 - break - fi - done - fi - echo "$avail" -} - - -# Get an available instance number given the database -# Returns an unused instance number -function vtpmdb_get_free_instancenum () { - local ctr instances don found - instances=$(cat $VTPMDB | \ - awk \ - '{ \ - if (1 != index($1,"#")) { \ - printf("%s ",$2); \ - } \ - }') - ctr=1 - don=0 - while [ $don -eq 0 ]; do - found=0 - for i in $instances; do - if [ $i -eq $ctr ]; then - found=1; - break; - fi - done - - if [ $found -eq 0 ]; then - don=1 - break - fi - let ctr=ctr+1 - done - echo "$ctr" -} - - -# Add a domain name and instance number to the DB file -function vtpmdb_add_instance () { - local res vmname inst - vmname=$1 - inst=$2 - - if [ ! -f $VTPMDB ]; then - echo "#Database for VM to vTPM association" > $VTPMDB - echo "#1st column: domain name" >> $VTPMDB - echo "#2nd column: TPM instance number" >> $VTPMDB - fi - res=$(vtpmdb_validate_entry $vmname $inst) - if [ $res -eq 0 ]; then - echo "$vmname $inst" >> $VTPMDB - fi -} - - -#Validate whether an entry is the same as passed to this -#function -function vtpmdb_validate_entry () { - local res rc vmname inst - rc=0 - vmname=$1 - inst=$2 - - res=$(cat $VTPMDB | \ - awk -vvmname=$vmname \ - -vinst=$inst \ - '{ \ - if ( 1 == index($1,"#")) {\ - } else \ - if ( $1 == vmname && \ - $2 == inst) { \ - printf("1"); \ - exit; \ - } else \ - if ( $1 == vmname || \ - $2 == inst) { \ - printf("2"); \ - exit; \ - } \ - }') - - if [ "$res" == "1" ]; then - rc=1 - elif [ "$res" == "2" ]; then - rc=2 - fi - echo "$rc" -} - - -#Remove an entry from the vTPM database given its domain name -#and instance number -function vtpmdb_remove_entry () { - local vmname instance VTPMDB_TMP - vmname=$1 - instance=$2 - VTPMDB_TMP="$VTPMDB".tmp - - $(cat $VTPMDB | \ - awk -vvmname=$vmname \ - '{ \ - if ( $1 != vmname ) { \ - print $0; \ - } \ - '} > $VTPMDB_TMP) - if [ -e $VTPMDB_TMP ]; then - mv -f $VTPMDB_TMP $VTPMDB - vtpm_delete $instance - else - log err "Error creating temporary file '$VTPMDB_TMP'." - fi -} - - -# Find the reason for the creation of this device: -# Returns 'resume' or 'create' -function vtpm_get_create_reason () { - local resume - resume=$(xenstore_read $XENBUS_PATH/resume) - if [ "$resume" == "True" ]; then - echo "resume" - else - echo "create" - fi -} - - -#Create a vTPM instance -# If no entry in the TPM database is found, the instance is -# created and an entry added to the database. -function vtpm_create_instance () { - local res instance domname reason uuid - uuid=$(xenstore_read "$XENBUS_PATH"/uuid) - reason=$(vtpm_get_create_reason) - - claim_lock vtpmdb - - instance="0" - - if [ "$uuid" != "" ]; then - instance=$(vtpmdb_find_instance $uuid) - fi - if [ "$instance" == "0" ]; then - domname=$(xenstore_read "$XENBUS_PATH"/domain) - instance=$(vtpmdb_find_instance $domname) - fi - - if [ "$instance" == "0" -a "$reason" != "create" ]; then - release_lock vtpmdb - return - fi - - if [ "$instance" == "0" ]; then - #Try to give the preferred instance to the domain - instance=$(xenstore_read "$XENBUS_PATH"/pref_instance) - if [ "$instance" != "" ]; then - res=$(vtpmdb_is_free_instancenum $instance) - if [ $res -eq 0 ]; then - instance=$(vtpmdb_get_free_instancenum) - fi - else - instance=$(vtpmdb_get_free_instancenum) - fi - - vtpm_create $instance - - if [ $vtpm_fatal_error -eq 0 ]; then - if [ "$uuid" != "" ]; then - vtpmdb_add_instance $uuid $instance - else - vtpmdb_add_instance $domname $instance - fi - fi - else - if [ "$reason" == "resume" ]; then - vtpm_resume $instance - else - vtpm_start $instance - fi - fi - - release_lock vtpmdb - - xenstore_write $XENBUS_PATH/instance $instance -} - - -#Remove an instance when a VM is terminating or suspending. -#Since it is assumed that the VM will appear again, the -#entry is kept in the VTPMDB file. -function vtpm_remove_instance () { - local instance reason domname uuid - #Stop script execution quietly if path does not exist (anymore) - xenstore-exists "$XENBUS_PATH"/domain - uuid=$(xenstore_read "$XENBUS_PATH"/uuid) - - claim_lock vtpmdb - - instance="0" - - if [ "$uuid" != "" ]; then - instance=$(vtpmdb_find_instance $uuid) - fi - - if [ "$instance" == "0" ]; then - domname=$(xenstore_read "$XENBUS_PATH"/domain) - instance=$(vtpmdb_find_instance $domname) - fi - - if [ "$instance" != "0" ]; then - vtpm_suspend $instance - fi - - release_lock vtpmdb -} - - -#Remove an entry in the VTPMDB file given the domain's name -#1st parameter: The name of the domain -function vtpm_delete_instance () { - local instance - - claim_lock vtpmdb - - instance=$(vtpmdb_find_instance $1) - if [ "$instance" != "0" ]; then - vtpmdb_remove_entry $1 $instance - fi - - release_lock vtpmdb -} - -# Determine whether the given address is local to this machine -# Return values: -# "-1" : the given machine name is invalid -# "0" : this is not an address of this machine -# "1" : this is an address local to this machine -function vtpm_isLocalAddress() { - local addr res - addr=$(ping $1 -c 1 | \ - awk '{ print substr($3,2,length($3)-2); exit }') - if [ "$addr" == "" ]; then - echo "-1" - return - fi - res=$(ifconfig | grep "inet addr" | \ - awk -vaddr=$addr \ - '{ \ - if ( addr == substr($2, 6)) {\ - print "1"; \ - } \ - }' \ - ) - if [ "$res" == "" ]; then - echo "0" - return - fi - echo "1" -} - -# Perform a migration step. This function differentiates between migration -# to the local host or to a remote machine. -# Parameters: -# 1st: destination host to migrate to -# 2nd: name of the domain to migrate -# 3rd: the migration step to perform -function vtpm_migration_step() { - local res=$(vtpm_isLocalAddress $1) - if [ "$res" == "0" ]; then - vtpm_migrate $1 $2 $3 - else - vtpm_migrate_local - fi -} - -# Recover from migration due to an error. This function differentiates -# between migration to the local host or to a remote machine. -# Parameters: -# 1st: destination host the migration was going to -# 2nd: name of the domain that was to be migrated -# 3rd: the last successful migration step that was done -function vtpm_recover() { - local res - res=$(vtpm_isLocalAddress $1) - if [ "$res" == "0" ]; then - vtpm_migrate_recover $1 $2 $3 - fi -} - - -#Determine the domain id given a domain's name. -#1st parameter: name of the domain -#return value: domain id or -1 if domain id could not be determined -function vtpm_domid_from_name () { - local id name ids - ids=$(xenstore-list /local/domain) - for id in $ids; do - name=$(xenstore-read /local/domain/$id/name) - if [ "$name" == "$1" ]; then - echo "$id" - return - fi - done - echo "-1" -} - -#Determine the virtual TPM's instance number using the domain ID. -#1st parm: domain ID -function vtpm_uuid_by_domid() { - echo $(xenstore-read /local/domain/0/backend/vtpm/$1/0/uuid) -} - - -# Determine the vTPM's UUID by the name of the VM -function vtpm_uuid_from_vmname() { - local domid=$(vtpm_domid_from_name $1) - if [ "$domid" != "-1" ]; then - echo $(vtpm_uuid_by_domid $domid) - return - fi - echo "" -} - -#Add a virtual TPM instance number and its associated domain name -#to the VTPMDB file and activate usage of this virtual TPM instance -#by writing the instance number into the xenstore -#1st parm: name of virtual machine -#2nd parm: instance of associated virtual TPM -function vtpm_add_and_activate() { - local domid=$(vtpm_domid_from_name $1) - local vtpm_uuid=$(vtpm_uuid_from_vmname $1) - if [ "$vtpm_uuid" != "" -a "$domid" != "-1" ]; then - vtpmdb_add_instance $vtpm_uuid $2 - xenstore-write backend/vtpm/$domid/0/instance $2 - fi -} diff -Nru xen-4.2.2/tools/hotplug/Linux/vtpm-delete xen-4.3.0/tools/hotplug/Linux/vtpm-delete --- xen-4.2.2/tools/hotplug/Linux/vtpm-delete 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/vtpm-delete 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -#!/bin/bash - -# This scripts must be called the following way: -# vtpm-delete -# or -# vtpm-delete --vmname - -dir=$(dirname "$0") -. "$dir/vtpm-common.sh" - -if [ "$1" == "--vmname" ]; then - vtpm_uuid=$(vtpm_uuid_from_vmname $2) - if [ "$vtpm_uuid" != "" ];then - vtpm_delete_instance $vtpm_uuid - fi -else - vtpm_delete_instance $1 -fi diff -Nru xen-4.2.2/tools/hotplug/Linux/vtpm-hotplug-common.sh xen-4.3.0/tools/hotplug/Linux/vtpm-hotplug-common.sh --- xen-4.2.2/tools/hotplug/Linux/vtpm-hotplug-common.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/vtpm-hotplug-common.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -# -# Copyright (c) 2005 IBM Corporation -# Copyright (c) 2005 XenSource Ltd. -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General Public -# License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -dir=$(dirname "$0") -. "$dir/xen-hotplug-common.sh" - -findCommand "$@" -if [ "$command" != "online" ] && - [ "$command" != "offline" ] && - [ "$command" != "add" ] && - [ "$command" != "remove" ] -then - log err "Invalid command: $command" - exit 1 -fi - - -XENBUS_PATH="${XENBUS_PATH:?}" - -. "$dir/vtpm-common.sh" diff -Nru xen-4.2.2/tools/hotplug/Linux/vtpm-impl xen-4.3.0/tools/hotplug/Linux/vtpm-impl --- xen-4.2.2/tools/hotplug/Linux/vtpm-impl 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/vtpm-impl 1970-01-01 00:00:00.000000000 +0000 @@ -1,208 +0,0 @@ -#!/bin/bash -# =================================================================== -# -# Copyright (c) 2005, Intel Corp. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. -# * Neither the name of Intel Corporation nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. -# =================================================================== - -# | SRC | TAG | CMD SIZE | ORD |mtype|strt -TPM_CMD_OPEN=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x01 -TPM_CMD_RESM=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x11\\x01\\x00\\x00\\x01\\x01\\x02 -TPM_CMD_CLOS=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x02 -TPM_CMD_DELE=\\x00\\x00\\x00\\x00\\x01\\xc1\\x00\\x00\\x00\\x0e\\x01\\x00\\x00\\x03 - -TPM_TYPE_PVM=\\x01 -TPM_TYPE_HVM=\\x02 - -TPM_SUCCESS=00000000 - -TX_VTPM_MANAGER=/var/vtpm/fifos/from_console.fifo -RX_VTPM_MANAGER=/var/vtpm/fifos/to_console.fifo - -VTPM_MIG=/usr/bin/vtpm_migrator - -# -------------------- Helpers for binary streams ----------- - -function str_to_hex32() { - printf "%0.8x" $1 -} - -function hex32_to_bin() { - local inst=$(str_to_hex32 $1); - - local n1=`echo $inst | sed 's/\(..\)....../\\\\x\1/'` - local n2=`echo $inst | sed 's/..\(..\)..../\\\\x\1/'` - local n3=`echo $inst | sed 's/....\(..\)../\\\\x\1/'` - local n4=`echo $inst | sed 's/......\(..\)/\\\\x\1/'` - - echo "$n1$n2$n3$n4" -} - -function vtpm_manager_cmd() { - local cmd=$1; - local inst=$2; - local inst_bin=$(hex32_to_bin $inst); - - claim_lock vtpm_mgr - - #send cmd to vtpm_manager - printf "$cmd$inst_bin" > $TX_VTPM_MANAGER - - #recv response - set +e - local resp_hex=`dd skip=10 bs=1 count=4 if=$RX_VTPM_MANAGER 2> /dev/null | xxd -ps` - set -e - - release_lock vtpm_mgr - - #return whether the command was successful - if [ $resp_hex -ne $TPM_SUCCESS ]; then - vtpm_fatal_error=1 - false - else - true - fi -} - -# Helper to get vm type to pass to vtpm_manager open/resume -function vtpm_get_type() { - local inst=$(xenstore_read $XENBUS_PATH/frontend-id) - local vm=$(xenstore_read /local/domain/$inst/vm) - if [ "$vm" != "" ]; then - local ostype=$(xenstore-read $vm/image/ostype) - if [ "$ostype" == "hvm" ]; then - echo $TPM_TYPE_HVM; - else - echo $TPM_TYPE_PVM; - fi - fi -} - -# ------------------ Command handlers ----------------- - -# Create new vtpm instance & set it up for use -function vtpm_create () { - # Creation is handled implicitly by the manager on first setup - # so just set it up for use - $(vtpm_start $1) -} - -# Setup vtpm instance for use. -function vtpm_start() { - local vmtype=$(vtpm_get_type); - $(vtpm_manager_cmd $TPM_CMD_OPEN$vmtype $1) -} - -function vtpm_resume() { - local vmtype=$(vtpm_get_type); - $(vtpm_manager_cmd $TPM_CMD_RESM$vmtype $1) -} - -# Reset the vtpm AKA clear PCRs -function vtpm_reset() { - #not used by current implemenation - true -} - -# Shutdown the vtpm while the vm is down -# This could be a suspend of shutdown -# we cannot distinquish, so save the state -# and decide on startup if we should keep is -function vtpm_suspend() { - $(vtpm_manager_cmd $TPM_CMD_CLOS $1) -} - - -function vtpm_delete() { - local inst=$1 - if $(vtpm_manager_cmd $TPM_CMD_DELE $inst); then - rm -f /var/vtpm/vtpm_dm_$1.data - true - else - vtpm_fatal_error=1 - false - fi -} - -# Perform a migration step. This function differentiates between migration -# to the local host or to a remote machine. -# Parameters: -# 1st: destination host to migrate to -# 2nd: name of the domain to migrate -# 3rd: the migration step to perform -function vtpm_migrate() { - local instance res - - instance=$(vtpmdb_find_instance $2) - if [ "$instance" == "" ]; then - log err "VTPM Migratoin failed. Unable to translation of domain name" - echo "Error: VTPM Migration failed while looking up instance number" - fi - - case "$3" in - 0) - #Incicate migration supported - echo "0" - ;; - - 1) - # Get Public Key from Destination - # Call vtpm_manager's migration part 1 - claim_lock vtpm_mgr - $VTPM_MIG $1 $2 $instance $3 - release_lock vtpm_mgr - ;; - - 2) - # Call manager's migration step 2 and send result to destination - # If successful remove from db - claim_lock vtpm_mgr - $VTPM_MIG $1 $2 $instance $3 - release_lock vtpm_mgr - ;; - - 3) - if `ps x | grep "$VTPM_MIG $1"`; then - log err "VTPM Migration failed to complete." - echo "Error: VTPM Migration failed to complete." - fi - ;; - esac - -} - - -function vtpm_migrate_recover() { - echo "Error: Recovery not supported yet" -} - -function vtpm_migrate_local() { - echo "Error: local vTPM migration not supported" -} diff -Nru xen-4.2.2/tools/hotplug/Linux/vtpm-migration.sh xen-4.3.0/tools/hotplug/Linux/vtpm-migration.sh --- xen-4.2.2/tools/hotplug/Linux/vtpm-migration.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/vtpm-migration.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -# -# Copyright (c) 2005 IBM Corporation -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of version 2.1 of the GNU Lesser General Public -# License as published by the Free Software Foundation. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -dir=$(dirname "$0") -. "$dir/vtpm-common.sh" diff -Nru xen-4.2.2/tools/hotplug/Linux/xen-backend.agent xen-4.3.0/tools/hotplug/Linux/xen-backend.agent --- xen-4.2.2/tools/hotplug/Linux/xen-backend.agent 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/xen-backend.agent 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -#! /bin/bash - -PATH=/etc/xen/scripts:$PATH - -. /etc/xen/scripts/locking.sh - -claim_lock xenbus_hotplug_global - -case "$XENBUS_TYPE" in - tap) - /etc/xen/scripts/blktap "$ACTION" - ;; - vbd) - /etc/xen/scripts/block "$ACTION" - ;; - vtpm) - /etc/xen/scripts/vtpm "$ACTION" - ;; - vif) - [ -n "$script" ] && $script "$ACTION" - ;; - vscsi) - /etc/xen/scripts/vscsi "$ACTION" - ;; -esac - -case "$ACTION" in - add) - ;; - remove) - /etc/xen/scripts/xen-hotplug-cleanup - ;; - online) - ;; - offline) - ;; -esac - -release_lock xenbus_hotplug_global diff -Nru xen-4.2.2/tools/hotplug/Linux/xen-backend.rules xen-4.3.0/tools/hotplug/Linux/xen-backend.rules --- xen-4.2.2/tools/hotplug/Linux/xen-backend.rules 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/xen-backend.rules 2013-07-09 10:46:56.000000000 +0000 @@ -1,6 +1,5 @@ SUBSYSTEM=="xen-backend", KERNEL=="tap*", ENV{UDEV_CALL}="1", RUN+="/etc/xen/scripts/blktap $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vbd*", ENV{UDEV_CALL}="1", RUN+="/etc/xen/scripts/block $env{ACTION}" -SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vif2-*", RUN+="/etc/xen/scripts/vif2 $env{ACTION}" SUBSYSTEM=="xen-backend", KERNEL=="vif-*", ENV{UDEV_CALL}="1", ACTION=="online", RUN+="/etc/xen/scripts/vif-setup online type_if=vif" SUBSYSTEM=="xen-backend", KERNEL=="vif-*", ENV{UDEV_CALL}="1", ACTION=="offline", RUN+="/etc/xen/scripts/vif-setup offline type_if=vif" diff -Nru xen-4.2.2/tools/hotplug/Linux/xen-hotplug-common.sh xen-4.3.0/tools/hotplug/Linux/xen-hotplug-common.sh --- xen-4.2.2/tools/hotplug/Linux/xen-hotplug-common.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/Linux/xen-hotplug-common.sh 2013-07-09 10:46:56.000000000 +0000 @@ -31,6 +31,7 @@ exec 2>>/var/log/xen/xen-hotplug.log export PATH="${BINDIR}:${SBINDIR}:${LIBEXEC}:${PRIVATE_BINDIR}:/sbin:/bin:/usr/bin:/usr/sbin:$PATH" +export LD_LIBRARY_PATH="${LIBDIR}${LD_LIBRARY_PATH+:}$LD_LIBRARY_PATH" export LANG="POSIX" unset $(set | grep ^LC_ | cut -d= -f1) diff -Nru xen-4.2.2/tools/hotplug/NetBSD/rc.d/xendomains xen-4.3.0/tools/hotplug/NetBSD/rc.d/xendomains --- xen-4.2.2/tools/hotplug/NetBSD/rc.d/xendomains 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/NetBSD/rc.d/xendomains 2013-07-09 10:46:56.000000000 +0000 @@ -94,7 +94,7 @@ # echo "Stopping xen domains." for domain in $(xendomains_list); do - ${ctl_command} shutdown --halt $domain + ${ctl_command} shutdown $domain done while [ $timeout -gt 0 ]; do livedomains=$(xendomains_list) diff -Nru xen-4.2.2/tools/hotplug/common/Makefile xen-4.3.0/tools/hotplug/common/Makefile --- xen-4.2.2/tools/hotplug/common/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/hotplug/common/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -6,8 +6,8 @@ # OS-independent hotplug scripts go in this directory # Xen scripts to go there. -XEN_SCRIPTS = $(HOTPLUGPATH) -XEN_SCRIPT_DATA = +XEN_SCRIPTS = +XEN_SCRIPT_DATA = $(HOTPLUGPATH) genpath-target = $(call buildmakevars2file,$(HOTPLUGPATH)) $(eval $(genpath-target)) diff -Nru xen-4.2.2/tools/include/Makefile xen-4.3.0/tools/include/Makefile --- xen-4.2.2/tools/include/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/include/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -13,7 +13,7 @@ mkdir -p xen/libelf ln -sf $(XEN_ROOT)/xen/include/public/COPYING xen ln -sf $(wildcard $(XEN_ROOT)/xen/include/public/*.h) xen - ln -sf $(addprefix $(XEN_ROOT)/xen/include/public/,arch-ia64 arch-x86 hvm io xsm) xen + ln -sf $(addprefix $(XEN_ROOT)/xen/include/public/,arch-x86 hvm io xsm) xen ln -sf ../xen-sys/$(XEN_OS) xen/sys ln -sf $(addprefix $(XEN_ROOT)/xen/include/xen/,libelf.h elfstructs.h) xen/libelf/ ln -s ../xen-foreign xen/foreign @@ -21,8 +21,6 @@ .PHONY: install install: all - $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xen/arch-ia64 - $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xen/arch-ia64/hvm $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xen/arch-x86 $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xen/arch-x86/hvm $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xen/foreign @@ -32,8 +30,6 @@ $(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)/xen/xsm $(INSTALL_DATA) xen/COPYING $(DESTDIR)$(INCLUDEDIR)/xen $(INSTALL_DATA) xen/*.h $(DESTDIR)$(INCLUDEDIR)/xen - $(INSTALL_DATA) xen/arch-ia64/*.h $(DESTDIR)$(INCLUDEDIR)/xen/arch-ia64 - $(INSTALL_DATA) xen/arch-ia64/hvm/*.h $(DESTDIR)$(INCLUDEDIR)/xen/arch-ia64/hvm $(INSTALL_DATA) xen/arch-x86/*.h $(DESTDIR)$(INCLUDEDIR)/xen/arch-x86 $(INSTALL_DATA) xen/arch-x86/hvm/*.h $(DESTDIR)$(INCLUDEDIR)/xen/arch-x86/hvm $(INSTALL_DATA) xen/foreign/*.h $(DESTDIR)$(INCLUDEDIR)/xen/foreign diff -Nru xen-4.2.2/tools/include/xen-foreign/Makefile xen-4.3.0/tools/include/xen-foreign/Makefile --- xen-4.2.2/tools/include/xen-foreign/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/include/xen-foreign/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -3,7 +3,7 @@ ROOT = $(XEN_ROOT)/xen/include/public -architectures := x86_32 x86_64 ia64 +architectures := arm32 arm64 x86_32 x86_64 headers := $(patsubst %, %.h, $(architectures)) .PHONY: all clean check-headers @@ -22,13 +22,16 @@ diff -u reference.size tmp.size rm tmp.size -x86_32.h: mkheader.py structs.py $(ROOT)/arch-x86/xen-x86_32.h $(ROOT)/arch-x86/xen.h $(ROOT)/xen.h +arm32.h: mkheader.py structs.py $(ROOT)/arch-arm.h $(PYTHON) $< $* $@ $(filter %.h,$^) -x86_64.h: mkheader.py structs.py $(ROOT)/arch-x86/xen-x86_64.h $(ROOT)/arch-x86/xen.h $(ROOT)/xen.h +arm64.h: mkheader.py structs.py $(ROOT)/arch-arm.h + $(PYTHON) $< $* $@ $(filter %.h,$^) + +x86_32.h: mkheader.py structs.py $(ROOT)/arch-x86/xen-x86_32.h $(ROOT)/arch-x86/xen.h $(ROOT)/xen.h $(PYTHON) $< $* $@ $(filter %.h,$^) -ia64.h: mkheader.py structs.py $(ROOT)/arch-ia64.h $(ROOT)/xen.h +x86_64.h: mkheader.py structs.py $(ROOT)/arch-x86/xen-x86_64.h $(ROOT)/arch-x86/xen.h $(ROOT)/xen.h $(PYTHON) $< $* $@ $(filter %.h,$^) checker.c: mkchecker.py structs.py diff -Nru xen-4.2.2/tools/include/xen-foreign/mkheader.py xen-4.3.0/tools/include/xen-foreign/mkheader.py --- xen-4.2.2/tools/include/xen-foreign/mkheader.py 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/include/xen-foreign/mkheader.py 2013-07-09 10:46:56.000000000 +0000 @@ -16,11 +16,55 @@ header = {}; footer = {}; +#arm +inttypes["arm32"] = { + "unsigned long" : "uint32_t", + "long" : "uint32_t", + "xen_pfn_t" : "__align8__ uint64_t", + "xen_ulong_t" : "__align8__ uint64_t", + "uint64_t" : "__align8__ uint64_t", +}; +header["arm32"] = """ +#define __arm___ARM32 1 +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) +# define __DECL_REG(n64, n32) union { uint64_t n64; uint32_t n32; } +# define __align8__ __attribute__((aligned (8))) +#else +# define __DECL_REG(n64, n32) uint64_t n64 +# define __align8__ FIXME +#endif +"""; +footer["arm32"] = """ +#undef __DECL_REG +""" + +inttypes["arm64"] = { + "unsigned long" : "__danger_unsigned_long_on_arm64", + "long" : "__danger_long_on_arm64", + "xen_pfn_t" : "__align8__ uint64_t", + "xen_ulong_t" : "__align8__ uint64_t", + "uint64_t" : "__align8__ uint64_t", +}; +header["arm64"] = """ +#define __aarch64___ARM64 1 +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) +# define __DECL_REG(n64, n32) union { uint64_t n64; uint32_t n32; } +# define __align8__ __attribute__((aligned (8))) +#else +# define __DECL_REG(n64, n32) uint64_t n64 +# define __align8__ FIXME +#endif +"""; +footer["arm64"] = """ +#undef __DECL_REG +""" + # x86_32 inttypes["x86_32"] = { "unsigned long" : "uint32_t", "long" : "uint32_t", "xen_pfn_t" : "uint32_t", + "xen_ulong_t" : "uint32_t", }; header["x86_32"] = """ #define __i386___X86_32 1 @@ -35,6 +79,7 @@ "unsigned long" : "__align8__ uint64_t", "long" : "__align8__ uint64_t", "xen_pfn_t" : "__align8__ uint64_t", + "xen_ulong_t" : "__align8__ uint64_t", }; header["x86_64"] = """ #if defined(__GNUC__) && !defined(__STRICT_ANSI__) @@ -46,20 +91,9 @@ #endif #define __x86_64___X86_64 1 """; - -# ia64 -inttypes["ia64"] = { - "unsigned long" : "__align8__ uint64_t", - "long" : "__align8__ uint64_t", - "xen_pfn_t" : "__align8__ uint64_t", - "long double" : "__align16__ ldouble_t", -}; -header["ia64"] = """ -#define __align8__ __attribute__((aligned (8))) -#define __align16__ __attribute__((aligned (16))) -typedef unsigned char ldouble_t[16]; -"""; - +footer["x86_64"] = """ +#undef __DECL_REG +""" ########################################################################### # main diff -Nru xen-4.2.2/tools/include/xen-foreign/reference.size xen-4.3.0/tools/include/xen-foreign/reference.size --- xen-4.2.2/tools/include/xen-foreign/reference.size 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/include/xen-foreign/reference.size 2013-07-09 10:46:56.000000000 +0000 @@ -1,18 +1,14 @@ -structs | x86_32 x86_64 ia64 +structs | arm32 arm64 x86_32 x86_64 -start_info | 1112 1168 1168 -trap_info | 8 16 - -pt_fpreg | - - 16 -cpu_user_regs | 68 200 - -xen_ia64_boot_param | - - 96 -ia64_tr_entry | - - 32 -vcpu_tr_regs | - - 768 -vcpu_guest_context_regs | - - 22176 -vcpu_guest_context | 2800 5168 22208 -arch_vcpu_info | 24 16 0 -vcpu_time_info | 32 32 32 -vcpu_info | 64 64 48 -arch_shared_info | 268 280 272 -shared_info | 2584 3368 4384 +start_info | - - 1112 1168 +trap_info | - - 8 16 +cpu_user_regs | - - 68 200 +vcpu_guest_core_regs | 304 304 - - +vcpu_guest_context | 336 336 2800 5168 +arch_vcpu_info | - - 24 16 +vcpu_time_info | - - 32 32 +vcpu_info | - - 64 64 +arch_shared_info | - - 268 280 +shared_info | - - 2584 3368 diff -Nru xen-4.2.2/tools/include/xen-foreign/structs.py xen-4.3.0/tools/include/xen-foreign/structs.py --- xen-4.2.2/tools/include/xen-foreign/structs.py 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/include/xen-foreign/structs.py 2013-07-09 10:46:56.000000000 +0000 @@ -5,12 +5,8 @@ structs = [ "start_info", "trap_info", - "pt_fpreg", "cpu_user_regs", - "xen_ia64_boot_param", - "ia64_tr_entry", - "vcpu_tr_regs", - "vcpu_guest_context_regs", + "vcpu_guest_core_regs", "vcpu_guest_context", "arch_vcpu_info", "vcpu_time_info", @@ -18,9 +14,15 @@ "arch_shared_info", "shared_info" ]; -defines = [ "__i386__", +defines = [ "__arm__", + "__aarch64__", + "__i386__", "__x86_64__", + # arm + # None + + # x86_{32,64} "FLAT_RING1_CS", "FLAT_RING1_DS", "FLAT_RING1_SS", @@ -48,9 +50,6 @@ "_VGCF_online", "VGCF_online", - # ia64 - "VGCF_EXTRA_REGS", - # all archs "xen_pfn_to_cr3", "xen_cr3_to_pfn", diff -Nru xen-4.2.2/tools/include/xen-sys/Linux/privcmd.h xen-4.3.0/tools/include/xen-sys/Linux/privcmd.h --- xen-4.2.2/tools/include/xen-sys/Linux/privcmd.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/include/xen-sys/Linux/privcmd.h 2013-07-09 10:46:56.000000000 +0000 @@ -64,6 +64,9 @@ xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */ } privcmd_mmapbatch_t; +#define PRIVCMD_MMAPBATCH_MFN_ERROR 0xf0000000U +#define PRIVCMD_MMAPBATCH_PAGED_ERROR 0x80000000U + typedef struct privcmd_mmapbatch_v2 { unsigned int num; /* number of pages to populate */ domid_t dom; /* target domain */ diff -Nru xen-4.2.2/tools/install.sh xen-4.3.0/tools/install.sh --- xen-4.2.2/tools/install.sh 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/install.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -../install.sh \ No newline at end of file diff -Nru xen-4.2.2/tools/libaio/src/syscall-ia64.h xen-4.3.0/tools/libaio/src/syscall-ia64.h --- xen-4.2.2/tools/libaio/src/syscall-ia64.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libaio/src/syscall-ia64.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -#define __NR_io_setup 1238 -#define __NR_io_destroy 1239 -#define __NR_io_getevents 1240 -#define __NR_io_submit 1241 -#define __NR_io_cancel 1242 - -#define __ia64_raw_syscall(fname, sname) \ - __asm__ (".text\n" \ - ".globl " SYMSTR(fname) "\n" \ - ".proc " SYMSTR(fname) "\n" \ - SYMSTR(fname) ":\n" \ - " mov r15=" SYMSTR( __NR_ ## sname ) "\n" \ - " break 0x100000\n" \ - " ;;\n" \ - " cmp.eq p6,p0=-1,r10\n" \ - " ;;\n" \ - " (p6) sub r8=0,r8\n" \ - " br.ret.sptk.few b0\n" \ - ".size " SYMSTR(fname) ", . - " SYMSTR(fname) "\n" \ - ".endp " SYMSTR(fname) "\n" \ - ); - -#define io_syscall0(type, name) \ - extern type name(void); \ - __ia64_raw_syscall(name); - -#define io_syscall1(type, fname, sname, type1, arg1) \ - extern type fname(type1 arg1); \ - __ia64_raw_syscall(fname, sname); - -#define io_syscall2(type, fname, sname, type1, arg1, type2, arg2) \ - extern type fname(type1 arg1, type2 arg2); \ - __ia64_raw_syscall(fname, sname); - -#define io_syscall3(type, fname, sname, type1, arg1, type2, arg2, type3, arg3) \ - extern type fname(type1 arg1, type2 arg2, type3 arg3); \ - __ia64_raw_syscall(fname, sname); - -#define io_syscall4(type, fname, sname, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \ - extern type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4); \ - __ia64_raw_syscall(fname, sname); - -#define io_syscall5(type, fname, sname, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5) \ - extern type fname(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5); \ - __ia64_raw_syscall(fname, sname); diff -Nru xen-4.2.2/tools/libfsimage/Rules.mk xen-4.3.0/tools/libfsimage/Rules.mk --- xen-4.2.2/tools/libfsimage/Rules.mk 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libfsimage/Rules.mk 2013-07-09 10:46:56.000000000 +0000 @@ -21,7 +21,7 @@ $(FSLIB): $(PIC_OBJS) $(CC) $(LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $^ -lfsimage $(FS_LIBDEPS) $(APPEND_LDFLAGS) -clean distclean: +clean distclean:: rm -f $(PIC_OBJS) $(FSLIB) $(DEPS) -include $(DEPS) diff -Nru xen-4.2.2/tools/libfsimage/common/Makefile xen-4.3.0/tools/libfsimage/common/Makefile --- xen-4.2.2/tools/libfsimage/common/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libfsimage/common/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -31,8 +31,8 @@ $(INSTALL_DATA) fsimage_plugin.h $(DESTDIR)$(INCLUDEDIR) $(INSTALL_DATA) fsimage_grub.h $(DESTDIR)$(INCLUDEDIR) -clean distclean: - rm -f $(PIC_OBJS) $(LIB) $(DEPS) +clean distclean:: + rm -f $(LIB) libfsimage.so: libfsimage.so.$(MAJOR) ln -sf $< $@ diff -Nru xen-4.2.2/tools/libxc/Makefile xen-4.3.0/tools/libxc/Makefile --- xen-4.2.2/tools/libxc/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -1,13 +1,12 @@ XEN_ROOT = $(CURDIR)/../.. include $(XEN_ROOT)/tools/Rules.mk -MAJOR = 4.2 +MAJOR = 4.3 MINOR = 0 CTRL_SRCS-y := CTRL_SRCS-y += xc_core.c CTRL_SRCS-$(CONFIG_X86) += xc_core_x86.c -CTRL_SRCS-$(CONFIG_IA64) += xc_core_ia64.c CTRL_SRCS-$(CONFIG_ARM) += xc_core_arm.c CTRL_SRCS-y += xc_cpupool.c CTRL_SRCS-y += xc_domain.c @@ -52,23 +51,36 @@ vpath %.c ../../xen/common/libelf CFLAGS += -I../../xen/common/libelf -GUEST_SRCS-y += libelf-tools.c libelf-loader.c -GUEST_SRCS-y += libelf-dominfo.c libelf-relocate.c +ELF_SRCS-y += libelf-tools.c libelf-loader.c +ELF_SRCS-y += libelf-dominfo.c + +GUEST_SRCS-y += $(ELF_SRCS-y) + +$(patsubst %.c,%.o,$(ELF_SRCS-y)): CFLAGS += -Wno-pointer-sign +$(patsubst %.c,%.opic,$(ELF_SRCS-y)): CFLAGS += -Wno-pointer-sign # new domain builder GUEST_SRCS-y += xc_dom_core.c xc_dom_boot.c GUEST_SRCS-y += xc_dom_elfloader.c GUEST_SRCS-$(CONFIG_X86) += xc_dom_bzimageloader.c +GUEST_SRCS-$(CONFIG_ARM) += xc_dom_armzimageloader.c GUEST_SRCS-y += xc_dom_binloader.c GUEST_SRCS-y += xc_dom_compat_linux.c GUEST_SRCS-$(CONFIG_X86) += xc_dom_x86.c GUEST_SRCS-$(CONFIG_X86) += xc_cpuid_x86.c GUEST_SRCS-$(CONFIG_X86) += xc_hvm_build_x86.c -GUEST_SRCS-$(CONFIG_IA64) += xc_dom_ia64.c GUEST_SRCS-$(CONFIG_ARM) += xc_dom_arm.c GUEST_SRCS-$(CONFIG_ARM) += xc_hvm_build_arm.c +ifeq ($(CONFIG_LIBXC_MINIOS),y) +GUEST_SRCS-y += xc_dom_decompress_unsafe.c +GUEST_SRCS-y += xc_dom_decompress_unsafe_bzip2.c +GUEST_SRCS-y += xc_dom_decompress_unsafe_lzma.c +GUEST_SRCS-y += xc_dom_decompress_unsafe_lzo1x.c +GUEST_SRCS-y += xc_dom_decompress_unsafe_xz.c +endif + OSDEP_SRCS-y += xenctrl_osdep_ENOSYS.c -include $(XEN_TARGET_ARCH)/Makefile diff -Nru xen-4.2.2/tools/libxc/ia64/Makefile xen-4.3.0/tools/libxc/ia64/Makefile --- xen-4.2.2/tools/libxc/ia64/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -ifneq ($(stubdom),y) -CTRL_SRCS-y += ia64/xc_ia64_stubs.c - -GUEST_SRCS-y += ia64/xc_ia64_hvm_build.c -GUEST_SRCS-y += ia64/xc_ia64_linux_save.c -GUEST_SRCS-y += ia64/xc_ia64_linux_restore.c - -GUEST_SRCS-y += ia64/xc_dom_ia64_util.c -GUEST_SRCS-y += ia64/dom_fw_acpi.c - -GUEST_SRCS-y += ia64/xc_ia64_dom_fwloader.c - -DOMFW_SRCS_BASE := dom_fw_common.c dom_fw_domu.c dom_fw_asm.S -endif -DOMFW_SRCS := $(addprefix ia64/, $(DOMFW_SRCS_BASE)) -$(DOMFW_SRCS): - ln -sf $(XEN_ROOT)/xen/arch/ia64/xen/$(@F) $@ - -GUEST_SRCS-y += $(patsubst %.S, %.c, $(DOMFW_SRCS)) - -CFLAGS += -Iia64 - -DOMFW_ASM_HDRS_BASE := bundle.h dom_fw.h dom_fw_common.h dom_fw_domu.h -DOMFW_ASM_HDRS := $(addprefix ia64/asm/, $(DOMFW_ASM_HDRS_BASE)) -$(DOMFW_ASM_HDRS): ia64/asm - ln -sf $(XEN_ROOT)/xen/include/asm-ia64/$(@F) $@ -build: $(DOMFW_ASM_HDR) - -.PHONY: mk-symlinks-acpi mk-symlinks-misc ia64-clean - -IA64_HDR_DIRS := ia64/asm ia64/xen ia64/acpi ia64/acpi/platform -$(IA64_HDR_DIRS): - mkdir -p $@ - -IA64_EMPTY_FILES := ia64/asm/acpi.h ia64/xen/list.h -$(IA64_EMPTY_FILES): $(IA64_HDR_DIRS) - echo "/* automatically created dummy empty header file. */" > $@ - -mk-symlinks-acpi: $(IA64_HDR_DIRS) $(IA64_EMPTY_FILES) $(DOMFW_ASM_HDRS) - ( cd ia64/acpi && ln -sf $(XEN_ROOT)/xen/include/acpi/*.h .) - ( cd ia64/acpi/platform && ln -sf $(XEN_ROOT)/xen/include/acpi/platform/*.h .) - ( cd ia64/xen && ln -sf $(XEN_ROOT)/xen/include/xen/acpi.h .) -mk-symlinks-misc: $(IA64_HDR_DIRS) - ( cd ia64/asm && ln -sf $(XEN_ROOT)/xen/include/asm-ia64/linux-xen/asm/kregs.h .) - ( cd ia64/asm && ln -sf $(XEN_ROOT)/xen/include/asm-ia64/linux/asm/fpswa.h .) -build: mk-symlinks-acpi mk-symlinks-misc - -clean: ia64-clean -ia64-clean: - rm -rf $(DOMFW_SRCS) $(DOMFW_ASM_HDRS) $(IA64_EMPTY_FILES) $(IA64_HDR_DIRS) diff -Nru xen-4.2.2/tools/libxc/ia64/ac_ia64_tools.h xen-4.3.0/tools/libxc/ia64/ac_ia64_tools.h --- xen-4.2.2/tools/libxc/ia64/ac_ia64_tools.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/ac_ia64_tools.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -/* - * ac_ia64_tools.h - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef AC_IA64_TOOLS_H -#define AC_IA64_TOOLS_H - -#define ACPI_MACHINE_WIDTH 64 -#define COMPILER_DEPENDENT_UINT64 unsigned long long -#define COMPILER_DEPENDENT_INT64 long long -typedef unsigned long long u64; -typedef long long s64; -typedef unsigned u32; -typedef int s32; -typedef unsigned char u8; -typedef unsigned short u16; -#define __iomem -#define asmlinkage -#define CONFIG_ACPI_BOOT - -#endif /* AC_IA64_TOOLS_H */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/ia64/dom_fw_acpi.c xen-4.3.0/tools/libxc/ia64/dom_fw_acpi.c --- xen-4.2.2/tools/libxc/ia64/dom_fw_acpi.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/dom_fw_acpi.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/******************************************************************************* - * - * FUNCTION: acpi_tb_checksum - * - * PARAMETERS: Buffer - Pointer to memory region to be checked - * Length - Length of this memory region - * - * RETURN: Checksum (u8) - * - * DESCRIPTION: Calculates circular checksum of memory region. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - ******************************************************************************/ - -/* stolen from xen/drivers/acpi/tables/tbutils.c */ - -#include -#include "xc_dom_ia64_util.h" -#include -#include - -u8 acpi_tb_checksum(u8 * buffer, acpi_native_uint length) -{ - u8 sum = 0; - u8 *end = buffer + length; - - while (buffer < end) { - sum = (u8) (sum + *(buffer++)); - } - - return sum; -} diff -Nru xen-4.2.2/tools/libxc/ia64/sal.h xen-4.3.0/tools/libxc/ia64/sal.h --- xen-4.2.2/tools/libxc/ia64/sal.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/sal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -/* - * definitions from - * xen/include/asm-ia64/linux/asm/sal.h - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef XC_IA64_SAL_H -#define XC_IA64_SAL_H - -/* - * The SAL system table is followed by a variable number of variable - * length descriptors. The structure of these descriptors follows - * below. - * The defininition follows SAL specs from July 2000 - */ -struct ia64_sal_systab { - uint8_t signature[4]; /* should be "SST_" */ - uint32_t size; /* size of this table in bytes */ - uint8_t sal_rev_minor; - uint8_t sal_rev_major; - uint16_t entry_count; /* # of entries in variable portion */ - uint8_t checksum; - uint8_t reserved1[7]; - uint8_t sal_a_rev_minor; - uint8_t sal_a_rev_major; - uint8_t sal_b_rev_minor; - uint8_t sal_b_rev_major; - /* oem_id & product_id: terminating NUL is missing if string is exactly 32 bytes long. */ - uint8_t oem_id[32]; - uint8_t product_id[32]; /* ASCII product id */ - uint8_t reserved2[8]; -}; - -enum sal_systab_entry_type { - SAL_DESC_ENTRY_POINT = 0, - SAL_DESC_MEMORY = 1, - SAL_DESC_PLATFORM_FEATURE = 2, - SAL_DESC_TR = 3, - SAL_DESC_PTC = 4, - SAL_DESC_AP_WAKEUP = 5 -}; - -typedef struct ia64_sal_desc_entry_point { - uint8_t type; - uint8_t reserved1[7]; - uint64_t pal_proc; - uint64_t sal_proc; - uint64_t gp; - uint8_t reserved2[16]; -}ia64_sal_desc_entry_point_t; - -#define IA64_SAL_AP_EXTERNAL_INT 0 - -typedef struct ia64_sal_desc_ap_wakeup { - uint8_t type; - uint8_t mechanism; /* 0 == external interrupt */ - uint8_t reserved1[6]; - uint64_t vector; /* interrupt vector in range 0x10-0xff */ -} ia64_sal_desc_ap_wakeup_t ; - -//XXX should move xen_sal_data to arch-ia64.h? -/* These are data in domain memory for SAL emulator. */ -struct xen_sal_data { - /* OS boot rendez vous. */ - unsigned long boot_rdv_ip; - unsigned long boot_rdv_r1; - - /* There are these for EFI_SET_VIRTUAL_ADDRESS_MAP emulation. */ - int efi_virt_mode; /* phys : 0 , virt : 1 */ -}; - -#endif /* XC_IA64_SAL_H */ diff -Nru xen-4.2.2/tools/libxc/ia64/xc_dom_ia64_util.c xen-4.3.0/tools/libxc/ia64/xc_dom_ia64_util.c --- xen-4.2.2/tools/libxc/ia64/xc_dom_ia64_util.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/xc_dom_ia64_util.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,196 +0,0 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Copyright (c) 2007 Isaku Yamahata - * VA Linux Systems Japan K.K. - * - */ - -#include -#include "xg_private.h" -#include "xc_dom.h" -#include "asm/dom_fw.h" -#include "asm/dom_fw_common.h" -#include "ia64/xc_dom_ia64_util.h" - -uint32_t -xen_ia64_version(struct xc_dom_image *dom) -{ - return xc_version(dom->xch, XENVER_version, NULL); -} - -int -xen_ia64_fpswa_revision(struct xc_dom_image *dom, unsigned int *revision) -{ - int ret; - DECLARE_HYPERCALL; - DECLARE_HYPERCALL_BOUNCE(revision, sizeof(*revision), XC_HYPERCALL_BUFFER_BOUNCE_BOTH); - - if (xc_hypercall_bounce_pre(dom->xch, revision) ) - { - PERROR("Could not lock memory for xen fpswa hypercall"); - return -1; - } - - hypercall.op = __HYPERVISOR_ia64_dom0vp_op; - hypercall.arg[0] = IA64_DOM0VP_fpswa_revision; - hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(revision); - - ret = do_xen_hypercall(dom->xch, &hypercall); - - xc_hypercall_bounce_post(dom->xch, revision); - - return ret; -} - -int xen_ia64_is_running_on_sim(struct xc_dom_image *dom) -{ - /* - * This is only used by dom_fw_init() as - * "!xen_ia64_is_dom0() || xen_ia64_is_running_on_sim()". - * So this doesn't affect the result. - */ - return 0; -} - -int -xen_ia64_is_dom0(struct xc_dom_image *unused) -{ - /* libxc is for non-dom0 domain builder */ - return 0; -} - -void* -xen_ia64_dom_fw_map(struct xc_dom_image *dom, unsigned long mpaddr) -{ - unsigned long page_size = XC_DOM_PAGE_SIZE(dom); - void* ret; - - ret = xc_map_foreign_range(dom->xch, dom->guest_domid, - page_size, PROT_READ | PROT_WRITE, - mpaddr / page_size); - if (ret != NULL) - ret = (void*)((unsigned long)ret | (mpaddr & (page_size - 1))); - - return ret; -} - -void -xen_ia64_dom_fw_unmap(struct xc_dom_image *dom, void *vaddr) -{ - unsigned long page_size = XC_DOM_PAGE_SIZE(dom); - munmap((void*)((unsigned long)vaddr & ~(page_size - 1)), page_size); -} - -int -xen_ia64_is_vcpu_allocated(struct xc_dom_image *dom, uint32_t vcpu) -{ - // return d->vcpu[vcpu] != NULL; - - int rc; - xc_vcpuinfo_t info; - xc_interface *xch = dom->xch; - - rc = xc_vcpu_getinfo(xch, dom->guest_domid, - vcpu, &info); - if (rc == 0) - return 1; - - if (errno != ESRCH) - PERROR("Could not get vcpu info"); - return 0; -} - -int -xen_ia64_dom_fw_setup(struct xc_dom_image *d, uint64_t brkimm, - unsigned long bp_mpa, unsigned long maxmem) -{ - int rc = 0; - void *imva_hypercall_base = NULL; - struct fw_tables *fw_tables = NULL; - struct fake_acpi_tables *imva = NULL; - struct xen_ia64_boot_param *bp = NULL; - - BUILD_BUG_ON(sizeof(struct fw_tables) > - (FW_TABLES_END_PADDR_MIN - FW_TABLES_BASE_PADDR)); - - /* Create page for hypercalls. */ - imva_hypercall_base = xen_ia64_dom_fw_map(d, FW_HYPERCALL_BASE_PADDR); - if (imva_hypercall_base == NULL) { - rc = -errno; - goto out; - } - - /* Create page for FW tables. */ - fw_tables = (struct fw_tables*)xen_ia64_dom_fw_map(d, FW_TABLES_BASE_PADDR); - if (fw_tables == NULL) { - rc = -errno; - goto out; - } - memset(fw_tables, 0, FW_TABLES_END_PADDR_MIN - FW_TABLES_BASE_PADDR); - BUILD_BUG_ON(FW_END_PADDR_MIN != FW_TABLES_END_PADDR_MIN); - fw_tables->fw_tables_size = FW_TABLES_END_PADDR_MIN - FW_TABLES_BASE_PADDR; - fw_tables->fw_end_paddr = FW_END_PADDR_MIN; - fw_tables->fw_tables_end_paddr = FW_TABLES_END_PADDR_MIN; - fw_tables->num_mds = 0; - - /* Create page for acpi tables. */ - imva = (struct fake_acpi_tables *) - xen_ia64_dom_fw_map(d, FW_ACPI_BASE_PADDR); - if (imva == NULL) { - rc = -errno; - goto out; - } - dom_fw_fake_acpi(d, imva); - - /* Create page for boot_param. */ - bp = xen_ia64_dom_fw_map(d, bp_mpa); - if (bp == NULL) { - rc = -errno; - goto out; - } - rc = dom_fw_init(d, brkimm, bp, fw_tables, - (unsigned long)imva_hypercall_base, maxmem); - BUG_ON(fw_tables->fw_tables_size < sizeof(*fw_tables) + - sizeof(fw_tables->efi_memmap[0]) * fw_tables->num_mds); - - /* clear domain builder internal use member */ - fw_tables->fw_tables_size = 0; - fw_tables->fw_end_paddr = 0; - fw_tables->fw_tables_end_paddr = 0; - fw_tables->num_mds = 0; - - out: - if (imva_hypercall_base != NULL) - xen_ia64_dom_fw_unmap(d, imva_hypercall_base); - if (fw_tables != NULL) - xen_ia64_dom_fw_unmap(d, fw_tables); - if (imva != NULL) - xen_ia64_dom_fw_unmap(d, imva); - if (bp != NULL) - xen_ia64_dom_fw_unmap(d, bp); - - return rc; -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/ia64/xc_dom_ia64_util.h xen-4.3.0/tools/libxc/ia64/xc_dom_ia64_util.h --- xen-4.2.2/tools/libxc/ia64/xc_dom_ia64_util.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/xc_dom_ia64_util.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef XC_IA64_DOM_IA64_UTIL_H -#define XC_IA64_DOM_IA64_UTIL_H - -struct xc_dom_image; -uint32_t xen_ia64_version(struct xc_dom_image *dom); -void* xen_ia64_dom_fw_map(struct xc_dom_image *dom, unsigned long mpaddr); -void xen_ia64_dom_fw_unmap(struct xc_dom_image *dom, void *addr); -int xen_ia64_fpswa_revision(struct xc_dom_image *dom, unsigned int *revision); -int xen_ia64_is_vcpu_allocated(struct xc_dom_image *dom, uint32_t vcpu); -int xen_ia64_is_running_on_sim(struct xc_dom_image *dom); -int xen_ia64_is_dom0(struct xc_dom_image *dom); - -int -xen_ia64_dom_fw_setup(struct xc_dom_image *d, uint64_t brkimm, - unsigned long bp_mpa, unsigned long maxmem); -#define efi_systable_init_dom0(tables) assert(0) -#define complete_dom0_memmap(d, tables) ({assert(0);0;}) - -/* Defined in xc_dom_ia64.c */ -extern int start_info_ia64(struct xc_dom_image *dom); -extern int shared_info_ia64(struct xc_dom_image *dom, void *ptr); - -#define FW_MEM_BASE 0xff000000UL -#define FW_MEM_SIZE 0x01000000UL - -#ifdef __XEN_TOOLS__ -/* Necessary for including the acpi header chain when not in kernel context */ -typedef struct { } spinlock_t; -#endif -#endif /* XC_IA64_DOM_IA64_UTIL_H */ diff -Nru xen-4.2.2/tools/libxc/ia64/xc_ia64.h xen-4.3.0/tools/libxc/ia64/xc_ia64.h --- xen-4.2.2/tools/libxc/ia64/xc_ia64.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/xc_ia64.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Copyright (c) 2007 Isaku Yamahata - * VA Linux Systems Japan K.K. - * - */ - -#ifndef _XC_IA64_H_ -#define _XC_IA64_H_ - -int xc_ia64_copy_memmap(xc_interface *xc_handle, uint32_t domid, - shared_info_t *live_shinfo, - xen_ia64_memmap_info_t **memmap_info_p, - unsigned long *memmap_info_num_pages_p); - -struct xen_ia64_p2m_table { - unsigned long size; - unsigned long *p2m; -}; - -void xc_ia64_p2m_init(struct xen_ia64_p2m_table *p2m_table); -int xc_ia64_p2m_map(struct xen_ia64_p2m_table *p2m_table, xc_interface *xc_handle, - uint32_t domid, struct xen_ia64_memmap_info *memmap_info, - unsigned long flag); -void xc_ia64_p2m_unmap(struct xen_ia64_p2m_table *p2m_table); -int xc_ia64_p2m_present(struct xen_ia64_p2m_table *p2m_table, - unsigned long gpfn); -int xc_ia64_p2m_allocated(struct xen_ia64_p2m_table *p2m_table, - unsigned long gpfn); - -unsigned long xc_ia64_p2m_mfn(struct xen_ia64_p2m_table *p2m_table, - unsigned long gpfn); - - -#endif /* _XC_IA64_H_ */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/ia64/xc_ia64_dom_fwloader.c xen-4.3.0/tools/libxc/ia64/xc_ia64_dom_fwloader.c --- xen-4.2.2/tools/libxc/ia64/xc_ia64_dom_fwloader.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/xc_ia64_dom_fwloader.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include - -#include -#include -#include - -#include "xg_private.h" -#include "xc_dom.h" - -#include "ia64/xc_dom_ia64_util.h" - -static const char fw_magic[16] = {'X', 'e', 'n', '-', - 'i', 'a', '6', '4', - '-', 'f', 'w', 0, - 0, 0, 0, 0}; -#define FW_LOAD 0xff800000UL -#define FW_SIZE (8 * 1024 * 1024) - -static int xc_dom_probe_fw_kernel(struct xc_dom_image *dom) -{ - if (dom->kernel_size != FW_SIZE) - return -EINVAL; - if (memcmp (dom->kernel_blob, fw_magic, sizeof (fw_magic))) - return -EINVAL; - return 0; -} - -static int xc_dom_parse_fw_kernel(struct xc_dom_image *dom) -{ - dom->kernel_seg.vstart = FW_LOAD; - dom->kernel_seg.vend = FW_LOAD + FW_SIZE; - dom->parms.virt_base = FW_MEM_BASE; - dom->parms.virt_entry = FW_LOAD + sizeof (fw_magic); - dom->ramdisk_blob = NULL; /* No ramdisk yet. */ - dom->guest_type = "hvm-3.0-ia64-sioemu"; - return 0; -} - -static int xc_dom_load_fw_kernel(struct xc_dom_image *dom) -{ - char *dest; - unsigned long i; - - dest = xc_dom_vaddr_to_ptr(dom, dom->kernel_seg.vstart); - memcpy(dest, dom->kernel_blob, FW_SIZE); - - /* Synchronize cache. */ - for (i = 0; i < FW_SIZE; i += 32) - asm volatile ("fc.i %0" :: "r"(dest + i) : "memory"); - - return 0; -} - -/* ------------------------------------------------------------------------ */ - -static int alloc_magic_pages(struct xc_dom_image *dom) -{ - /* allocate special pages */ - /* Note: do not use 0 for console or xenstore otherwise clear_page won't - clear the page. */ - dom->start_info_pfn = 0; - dom->console_pfn = 1; - dom->xenstore_pfn = 2; - return 0; -} - -extern unsigned long xc_ia64_fpsr_default(void); - -static int vcpu_ia64(struct xc_dom_image *dom, void *ptr) -{ - vcpu_guest_context_ia64_t *ctxt = ptr; - - DOMPRINTF_CALLED(dom->xch); - - /* clear everything */ - memset(ctxt, 0, sizeof(*ctxt)); - - ctxt->flags = 0; - ctxt->regs.ip = dom->parms.virt_entry; -#ifdef __ia64__ /* FIXME */ - ctxt->regs.ar.fpsr = xc_ia64_fpsr_default(); -#endif - ctxt->regs.cr.isr = 1UL << 63; - ctxt->regs.psr = IA64_PSR_AC | IA64_PSR_BN; - ctxt->regs.cr.dcr = 0; - ctxt->regs.cr.pta = 15 << 2; - - return 0; -} - -static struct xc_dom_arch xc_dom_arch_ia64_fw = { - .guest_type = "hvm-3.0-ia64-sioemu", - .native_protocol = XEN_IO_PROTO_ABI_IA64, - .page_shift = PAGE_SHIFT_IA64, - .alloc_magic_pages = alloc_magic_pages, - .start_info = start_info_ia64, - .shared_info = shared_info_ia64, - .vcpu = vcpu_ia64, -}; - -/* ------------------------------------------------------------------------ */ - -static struct xc_dom_loader fw_loader = { - .name = "xen-ia64-fw", - .probe = xc_dom_probe_fw_kernel, - .parser = xc_dom_parse_fw_kernel, - .loader = xc_dom_load_fw_kernel, -}; - -static void __init register_fwloader(void) -{ - xc_dom_register_arch_hooks(&xc_dom_arch_ia64_fw); - xc_dom_register_loader(&fw_loader); -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/ia64/xc_ia64_hvm_build.c xen-4.3.0/tools/libxc/ia64/xc_ia64_hvm_build.c --- xen-4.2.2/tools/libxc/ia64/xc_ia64_hvm_build.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/xc_ia64_hvm_build.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1215 +0,0 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include "xg_private.h" -#include "xenguest.h" -#include "xc_private.h" -#include "xc_elf.h" -#include "xc_efi.h" -#include -#include -#include -#include -#include "xen/arch-ia64.h" -#include -#include - -static int -xc_ia64_copy_to_domain_pages(xc_interface *xch, uint32_t domid, void* src_page, - unsigned long dst_pfn, int nr_pages) -{ - // N.B. gva should be page aligned - int i; - - for (i = 0; i < nr_pages; i++) { - if (xc_copy_to_domain_page(xch, domid, dst_pfn + i, - src_page + (i << PAGE_SHIFT))) - return -1; - } - - return 0; -} - -#define HOB_SIGNATURE 0x3436474953424f48 // "HOBSIG64" -#define GFW_HOB_START ((4UL<<30)-(14UL<<20)) // 4G - 14M -#define GFW_HOB_SIZE (1UL<<20) // 1M - -typedef struct { - unsigned long signature; - unsigned int type; - unsigned int length; -} HOB_GENERIC_HEADER; - -/* - * INFO HOB is the first data data in one HOB list - * it contains the control information of the HOB list - */ -typedef struct { - HOB_GENERIC_HEADER header; - unsigned long length; // current length of hob - unsigned long cur_pos; // current poisiton of hob - unsigned long buf_size; // size of hob buffer -} HOB_INFO; - -typedef struct{ - unsigned long start; - unsigned long size; -} hob_mem_t; - -typedef enum { - HOB_TYPE_INFO=0, - HOB_TYPE_TERMINAL, - HOB_TYPE_MEM, - HOB_TYPE_PAL_BUS_GET_FEATURES_DATA, - HOB_TYPE_PAL_CACHE_SUMMARY, - HOB_TYPE_PAL_MEM_ATTRIB, - HOB_TYPE_PAL_CACHE_INFO, - HOB_TYPE_PAL_CACHE_PROT_INFO, - HOB_TYPE_PAL_DEBUG_INFO, - HOB_TYPE_PAL_FIXED_ADDR, - HOB_TYPE_PAL_FREQ_BASE, - HOB_TYPE_PAL_FREQ_RATIOS, - HOB_TYPE_PAL_HALT_INFO, - HOB_TYPE_PAL_PERF_MON_INFO, - HOB_TYPE_PAL_PROC_GET_FEATURES, - HOB_TYPE_PAL_PTCE_INFO, - HOB_TYPE_PAL_REGISTER_INFO, - HOB_TYPE_PAL_RSE_INFO, - HOB_TYPE_PAL_TEST_INFO, - HOB_TYPE_PAL_VM_SUMMARY, - HOB_TYPE_PAL_VM_INFO, - HOB_TYPE_PAL_VM_PAGE_SIZE, - HOB_TYPE_NR_VCPU, - HOB_TYPE_NVRAM, - HOB_TYPE_MAX -} hob_type_t; - -static int hob_init(void *buffer ,unsigned long buf_size); -static int add_pal_hob(void* hob_buf); -static int add_mem_hob(void* hob_buf, unsigned long dom_mem_size); -static int add_vcpus_hob(void* hob_buf, unsigned long nr_vcpu); -static int add_nvram_hob(void* hob_buf, unsigned long nvram_addr); -static int build_hob(xc_interface *xch, - void* hob_buf, unsigned long hob_buf_size, - unsigned long dom_mem_size, unsigned long vcpus, - unsigned long nvram_addr); -static int load_hob(xc_interface *xch,uint32_t dom, void *hob_buf); - -static int -xc_ia64_build_hob(xc_interface *xch, uint32_t dom, - unsigned long memsize, unsigned long vcpus, - unsigned long nvram_addr) -{ - char *hob_buf; - - hob_buf = malloc(GFW_HOB_SIZE); - if (hob_buf == NULL) { - PERROR("Could not allocate hob"); - return -1; - } - - if (build_hob(xch, hob_buf, GFW_HOB_SIZE, memsize, vcpus, nvram_addr) < 0) { - free(hob_buf); - PERROR("Could not build hob"); - return -1; - } - - if (load_hob(xch, dom, hob_buf) < 0) { - free(hob_buf); - PERROR("Could not load hob"); - return -1; - } - free(hob_buf); - return 0; - -} - -static int -hob_init(void *buffer, unsigned long buf_size) -{ - HOB_INFO *phit; - HOB_GENERIC_HEADER *terminal; - - if (sizeof(HOB_INFO) + sizeof(HOB_GENERIC_HEADER) > buf_size) { - // buffer too small - return -1; - } - - phit = (HOB_INFO*)buffer; - phit->header.signature = HOB_SIGNATURE; - phit->header.type = HOB_TYPE_INFO; - phit->header.length = sizeof(HOB_INFO); - phit->length = sizeof(HOB_INFO) + sizeof(HOB_GENERIC_HEADER); - phit->cur_pos = 0; - phit->buf_size = buf_size; - - terminal = (HOB_GENERIC_HEADER*)(buffer + sizeof(HOB_INFO)); - terminal->signature = HOB_SIGNATURE; - terminal->type = HOB_TYPE_TERMINAL; - terminal->length = sizeof(HOB_GENERIC_HEADER); - - return 0; -} - -/* - * Add a new HOB to the HOB List. - * - * hob_start - start address of hob buffer - * type - type of the hob to be added - * data - data of the hob to be added - * data_size - size of the data - */ -static int -hob_add(void* hob_start, int type, void* data, int data_size) -{ - HOB_INFO *phit; - HOB_GENERIC_HEADER *newhob, *tail; - - phit = (HOB_INFO*)hob_start; - - if (phit->length + data_size > phit->buf_size) { - // no space for new hob - return -1; - } - - //append new HOB - newhob = (HOB_GENERIC_HEADER*)(hob_start + phit->length - - sizeof(HOB_GENERIC_HEADER)); - newhob->signature = HOB_SIGNATURE; - newhob->type = type; - newhob->length = data_size + sizeof(HOB_GENERIC_HEADER); - memcpy((void*)newhob + sizeof(HOB_GENERIC_HEADER), data, data_size); - - // append terminal HOB - tail = (HOB_GENERIC_HEADER*)(hob_start + phit->length + data_size); - tail->signature = HOB_SIGNATURE; - tail->type = HOB_TYPE_TERMINAL; - tail->length = sizeof(HOB_GENERIC_HEADER); - - // adjust HOB list length - phit->length += sizeof(HOB_GENERIC_HEADER) + data_size; - - return 0; -} - -static int -get_hob_size(xc_interface *xch, void* hob_buf) -{ - HOB_INFO *phit = (HOB_INFO*)hob_buf; - - if (phit->header.signature != HOB_SIGNATURE) { - PERROR("xc_get_hob_size:Incorrect signature"); - return -1; - } - return phit->length; -} - -static int -build_hob(xc_interface *xch, void* hob_buf, unsigned long hob_buf_size, - unsigned long dom_mem_size, unsigned long vcpus, - unsigned long nvram_addr) -{ - //Init HOB List - if (hob_init(hob_buf, hob_buf_size) < 0) { - PERROR("buffer too small"); - goto err_out; - } - - if (add_mem_hob(hob_buf,dom_mem_size) < 0) { - PERROR("Add memory hob failed, buffer too small"); - goto err_out; - } - - if (add_vcpus_hob(hob_buf, vcpus) < 0) { - PERROR("Add NR_VCPU hob failed, buffer too small"); - goto err_out; - } - - if (add_pal_hob( hob_buf ) < 0) { - PERROR("Add PAL hob failed, buffer too small"); - goto err_out; - } - - if (add_nvram_hob( hob_buf, nvram_addr ) < 0) { - PERROR("Add nvram hob failed, buffer too small"); - goto err_out; - } - - return 0; - -err_out: - return -1; -} - -static int -load_hob(xc_interface *xch, uint32_t dom, void *hob_buf) -{ - // hob_buf should be page aligned - int hob_size; - int nr_pages; - - hob_size = get_hob_size(xch, hob_buf); - if (hob_size < 0) { - PERROR("Invalid hob data"); - return -1; - } - - if (hob_size > GFW_HOB_SIZE) { - PERROR("No enough memory for hob data"); - return -1; - } - - nr_pages = (hob_size + PAGE_SIZE -1) >> PAGE_SHIFT; - - return xc_ia64_copy_to_domain_pages(xch, dom, hob_buf, - GFW_HOB_START >> PAGE_SHIFT, nr_pages); -} - -#define MIN(x, y) (((x) < (y)) ? (x) : (y)) -static int -add_mem_hob(void* hob_buf, unsigned long dom_mem_size) -{ - hob_mem_t memhob; - - // less than 3G accounting VGA RAM hole - memhob.start = 0; - if (dom_mem_size < VGA_IO_START) - memhob.size = dom_mem_size; - else - memhob.size = MIN(dom_mem_size + VGA_IO_SIZE, 0xC0000000); - - if (hob_add(hob_buf, HOB_TYPE_MEM, &memhob, sizeof(memhob)) < 0) - return -1; - - if (dom_mem_size > 0xC0000000) { - // 4G ~ 4G+remain - memhob.start = 0x100000000; //4G - memhob.size = dom_mem_size + VGA_IO_SIZE - 0xC0000000; - if (hob_add(hob_buf, HOB_TYPE_MEM, &memhob, sizeof(memhob)) < 0) - return -1; - } - return 0; -} - -static int -add_vcpus_hob(void* hob_buf, unsigned long vcpus) -{ - return hob_add(hob_buf, HOB_TYPE_NR_VCPU, &vcpus, sizeof(vcpus)); -} - -static int -add_nvram_hob(void *hob_buf, unsigned long nvram_addr) -{ - return hob_add(hob_buf, HOB_TYPE_NVRAM, &nvram_addr, sizeof(nvram_addr)); -} - -static const unsigned char config_pal_bus_get_features_data[24] = { - 0, 0, 0, 32, 0, 0, 240, 189, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_cache_summary[16] = { - 3, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_mem_attrib[8] = { - 241, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_cache_info[152] = { - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 4, 6, 7, 255, 1, 0, 1, 0, 64, 0, 0, 12, 12, - 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 7, 0, 1, - 0, 1, 0, 64, 0, 0, 12, 12, 49, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 7, 7, 255, 7, 0, 11, 0, 0, 16, 0, - 12, 17, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 7, - 7, 7, 5, 9, 11, 0, 0, 4, 0, 12, 15, 49, 0, 254, 255, - 255, 255, 255, 255, 255, 255, 2, 8, 7, 7, 7, 5, 9, - 11, 0, 0, 4, 0, 12, 15, 49, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3, 12, 7, 7, 7, 14, 1, 3, 0, 0, 192, 0, 12, 20, 49, 0 -}; - -static const unsigned char config_pal_cache_prot_info[200] = { - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 45, 0, 16, 8, 0, 76, 12, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 16, 4, 0, 76, 44, 68, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, - 0, 16, 8, 0, 81, 44, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, - 112, 12, 0, 79, 124, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 254, 255, 255, 255, 255, 255, 255, 255, - 32, 0, 112, 12, 0, 79, 124, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 160, - 12, 0, 84, 124, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const unsigned char config_pal_debug_info[16] = { - 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_fixed_addr[8] = { - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_freq_base[8] = { - 109, 219, 182, 13, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_freq_ratios[24] = { - 11, 1, 0, 0, 77, 7, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 4, - 0, 0, 0, 7, 0, 0, 0 -}; - -static const unsigned char config_pal_halt_info[64] = { - 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_perf_mon_info[136] = { - 12, 47, 18, 8, 0, 0, 0, 0, 241, 255, 0, 0, 255, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 241, 255, 0, 0, 223, 0, 255, 255, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_proc_get_features[104] = { - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 64, 6, 64, 49, 0, 0, 0, 0, 64, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - 231, 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, - 63, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_ptce_info[24] = { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_register_info[64] = { - 255, 0, 47, 127, 17, 17, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 255, 208, 128, 238, 238, 0, 0, 248, 255, 255, 255, 255, 255, 0, 0, 7, 3, - 251, 3, 0, 0, 0, 0, 255, 7, 3, 0, 0, 0, 0, 0, 248, 252, 4, - 252, 255, 255, 255, 255, 2, 248, 252, 255, 255, 255, 255, 255 -}; - -static const unsigned char config_pal_rse_info[16] = { - 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_test_info[48] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_vm_summary[16] = { - 101, 18, 15, 2, 7, 7, 4, 2, 59, 18, 0, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_vm_info[104] = { - 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 32, 32, 0, 0, 0, 0, 0, 0, 112, 85, 21, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 32, 32, 0, 0, 0, 0, 0, 0, 112, 85, - 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 128, 128, 0, - 4, 0, 0, 0, 0, 112, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 128, 128, 0, 4, 0, 0, 0, 0, 112, 85, 0, 0, 0, 0, 0 -}; - -static const unsigned char config_pal_vm_page_size[16] = { - 0, 112, 85, 21, 0, 0, 0, 0, 0, 112, 85, 21, 0, 0, 0, 0 -}; - -typedef struct{ - hob_type_t type; - void* data; - unsigned long size; -} hob_batch_t; - -static const hob_batch_t hob_batch[]={ - { HOB_TYPE_PAL_BUS_GET_FEATURES_DATA, - &config_pal_bus_get_features_data, - sizeof(config_pal_bus_get_features_data) - }, - { HOB_TYPE_PAL_CACHE_SUMMARY, - &config_pal_cache_summary, - sizeof(config_pal_cache_summary) - }, - { HOB_TYPE_PAL_MEM_ATTRIB, - &config_pal_mem_attrib, - sizeof(config_pal_mem_attrib) - }, - { HOB_TYPE_PAL_CACHE_INFO, - &config_pal_cache_info, - sizeof(config_pal_cache_info) - }, - { HOB_TYPE_PAL_CACHE_PROT_INFO, - &config_pal_cache_prot_info, - sizeof(config_pal_cache_prot_info) - }, - { HOB_TYPE_PAL_DEBUG_INFO, - &config_pal_debug_info, - sizeof(config_pal_debug_info) - }, - { HOB_TYPE_PAL_FIXED_ADDR, - &config_pal_fixed_addr, - sizeof(config_pal_fixed_addr) - }, - { HOB_TYPE_PAL_FREQ_BASE, - &config_pal_freq_base, - sizeof(config_pal_freq_base) - }, - { HOB_TYPE_PAL_FREQ_RATIOS, - &config_pal_freq_ratios, - sizeof(config_pal_freq_ratios) - }, - { HOB_TYPE_PAL_HALT_INFO, - &config_pal_halt_info, - sizeof(config_pal_halt_info) - }, - { HOB_TYPE_PAL_PERF_MON_INFO, - &config_pal_perf_mon_info, - sizeof(config_pal_perf_mon_info) - }, - { HOB_TYPE_PAL_PROC_GET_FEATURES, - &config_pal_proc_get_features, - sizeof(config_pal_proc_get_features) - }, - { HOB_TYPE_PAL_PTCE_INFO, - &config_pal_ptce_info, - sizeof(config_pal_ptce_info) - }, - { HOB_TYPE_PAL_REGISTER_INFO, - &config_pal_register_info, - sizeof(config_pal_register_info) - }, - { HOB_TYPE_PAL_RSE_INFO, - &config_pal_rse_info, - sizeof(config_pal_rse_info) - }, - { HOB_TYPE_PAL_TEST_INFO, - &config_pal_test_info, - sizeof(config_pal_test_info) - }, - { HOB_TYPE_PAL_VM_SUMMARY, - &config_pal_vm_summary, - sizeof(config_pal_vm_summary) - }, - { HOB_TYPE_PAL_VM_INFO, - &config_pal_vm_info, - sizeof(config_pal_vm_info) - }, - { HOB_TYPE_PAL_VM_PAGE_SIZE, - &config_pal_vm_page_size, - sizeof(config_pal_vm_page_size) - }, -}; - -static int -add_pal_hob(void* hob_buf) -{ - int i; - for (i = 0; i < sizeof(hob_batch)/sizeof(hob_batch_t); i++) { - if (hob_add(hob_buf, hob_batch[i].type, hob_batch[i].data, - hob_batch[i].size) < 0) - return -1; - } - return 0; -} - -// The most significant bit of nvram file descriptor: -// 1: valid; 0: invalid -#define VALIDATE_NVRAM_FD(x) ((1UL<<(sizeof(x)*8 - 1)) | x) -#define IS_VALID_NVRAM_FD(x) ((uint64_t)x >> (sizeof(x)*8 - 1)) -static uint64_t -nvram_init(xc_interface *xch, const char *nvram_path) -{ - uint64_t fd = 0; - fd = open(nvram_path, O_CREAT|O_RDWR, 0644); - - if ( fd < 0 ) - { - PERROR("Nvram open failed at %s. Guest will boot without" - " nvram support!\n", nvram_path); - return -1; - } - - return VALIDATE_NVRAM_FD(fd); -} - -static int -copy_from_nvram_to_GFW(xc_interface *xch, uint32_t dom, int nvram_fd) -{ - unsigned int nr_pages = NVRAM_SIZE >> PAGE_SHIFT; - struct stat file_stat; - char buf[NVRAM_SIZE] = {0}; - - if ( fstat(nvram_fd, &file_stat) < 0 ) - { - PERROR("Cannot get Nvram file info! Guest will boot without " - "nvram support!\n"); - return -1; - } - - if ( 0 == file_stat.st_size ) - { - DPRINTF("Nvram file create successful!\n"); - return 0; - } - - if ( read(nvram_fd, buf, NVRAM_SIZE) != NVRAM_SIZE ) - { - PERROR("Load nvram fail. guest will boot without" - " nvram support!\n"); - return -1; - } - - return xc_ia64_copy_to_domain_pages(xch, dom, buf, - NVRAM_START >> PAGE_SHIFT, nr_pages); -} - - -/* - *Check is the address where NVRAM data located valid - */ -static int is_valid_address(xc_interface *xch, void *addr) -{ - struct nvram_save_addr *p = (struct nvram_save_addr *)addr; - - if ( p->signature == NVRAM_VALID_SIG ) - return 1; - else { - PERROR("Invalid nvram signature. Nvram save failed!"); - return 0; - } -} - -/* - * GFW use 4k page. when doing foreign map, we should 16k align - * the address and map one more page to guarantee all 64k nvram data - * can be got. - */ -static int -copy_from_GFW_to_nvram(xc_interface *xch, uint32_t dom, int nvram_fd) -{ - xen_pfn_t *pfn_list = NULL; - char *tmp_ptr = NULL; - unsigned int nr_pages = 0; - uint64_t addr_from_GFW_4k_align = 0; - uint32_t offset = 0; - uint64_t nvram_base_addr = 0; - char buf[NVRAM_SIZE] = {0}; - int i; - - // map one more page - nr_pages = (NVRAM_SIZE + PAGE_SIZE) >> PAGE_SHIFT; - pfn_list = (xen_pfn_t *)malloc(sizeof(xen_pfn_t) * nr_pages); - if ( NULL == pfn_list ) - { - PERROR("Cannot allocate memory for nvram save!"); - close(nvram_fd); - return -1; - } - - /* - * GFW allocate memory dynamicly to save nvram data - * and save address of the dynamic memory at NVRAM_START. - * To save nvram data to file, we must get the dynamic - * memory address first. - */ - pfn_list[0] = NVRAM_START >> PAGE_SHIFT; - tmp_ptr = (char *)xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ | PROT_WRITE, pfn_list[0]); - - if ( NULL == tmp_ptr ) - { - PERROR("Cannot get nvram data from GFW!"); - free(pfn_list); - close(nvram_fd); - return -1; - } - - /* Check is NVRAM data vaild */ - if ( !is_valid_address(xch, tmp_ptr) ) - { - free(pfn_list); - munmap(tmp_ptr, PAGE_SIZE); - close(nvram_fd); - return -1; - } - - addr_from_GFW_4k_align = ((struct nvram_save_addr *)tmp_ptr)->addr; - munmap(tmp_ptr, PAGE_SIZE); - - // align address to 16k - offset = addr_from_GFW_4k_align % ( 16 * MEM_K ); - addr_from_GFW_4k_align = addr_from_GFW_4k_align - offset; - for ( i=0; i> PAGE_SHIFT) + i; - - tmp_ptr = (char *)xc_map_foreign_pages(xch, dom, - PROT_READ | PROT_WRITE, - pfn_list, nr_pages); - if ( NULL == tmp_ptr ) - { - PERROR("Cannot get nvram data from GFW!"); - free(pfn_list); - close(nvram_fd); - return -1; - } - - // calculate nvram data base addrees - nvram_base_addr = (uint64_t)(tmp_ptr + offset); - - memcpy(buf, (void *)nvram_base_addr, NVRAM_SIZE); - free(pfn_list); - munmap(tmp_ptr, NVRAM_SIZE + PAGE_SIZE); - - lseek(nvram_fd, 0, SEEK_SET); - if ( write(nvram_fd, buf, NVRAM_SIZE) != NVRAM_SIZE ) - { - PERROR("Save to nvram fail!"); - return -1; - } - - close(nvram_fd); - - DPRINTF("Nvram save successful!\n"); - - return 0; -} - -int xc_ia64_save_to_nvram(xc_interface *xch, uint32_t dom) -{ - xc_dominfo_t info; - uint64_t nvram_fd = 0; - - if ( xc_domain_getinfo(xch, dom, 1, &info) != 1 ) - { - PERROR("Could not get info for domain"); - return -1; - } - - if ( !info.hvm ) - return 0; - - xc_get_hvm_param(xch, dom, HVM_PARAM_NVRAM_FD, &nvram_fd); - - if ( !IS_VALID_NVRAM_FD(nvram_fd) ) - PERROR("Nvram not initialized. Nvram save failed!"); - else - copy_from_GFW_to_nvram(xch, dom, (int)nvram_fd); - - // although save to nvram maybe fail, we don't return any error number - // to Xend. This is quite logical because damage of NVRAM on native would - // not block OS's executive path. Return error number will cause an - // exception of Xend and block XenU when it destroy. - return 0; -} - -#define NVRAM_DIR "/var/lib/xen/nvram/" -#define NVRAM_FILE_PREFIX "nvram_" - -int xc_ia64_nvram_init(xc_interface *xch, char *dom_name, uint32_t dom) -{ - uint64_t nvram_fd; - char nvram_path[PATH_MAX] = NVRAM_DIR; - - if ( access(nvram_path, R_OK|W_OK|X_OK) == -1 ) { - if ( errno != ENOENT ) - { - PERROR("Error stat'ing NVRAM dir %s.", nvram_path); - return -1; - } - if ( mkdir(nvram_path, 0755) == -1 ) - { - PERROR("Unable to create NVRAM store directory %s.", nvram_path); - return -1; - } - } - - if ( access(nvram_path, R_OK|W_OK|X_OK) == -1 ) { - errno = EACCES; - PERROR("No RWX permission to NVRAM store directory %s.", nvram_path); - return -1; - } - - if ( strlen(nvram_path) + strlen(NVRAM_FILE_PREFIX) + - strlen(dom_name) + 1 > sizeof(nvram_path) ) - { - PERROR("Nvram file path is too long!"); - return -1; - } - strcat(nvram_path, NVRAM_FILE_PREFIX); - strcat(nvram_path, dom_name); - - nvram_fd = nvram_init(xch, nvram_path); - if ( nvram_fd == (uint64_t)(-1) ) - { - xc_set_hvm_param(xch, dom, HVM_PARAM_NVRAM_FD, 0); - return -1; - } - - xc_set_hvm_param(xch, dom, HVM_PARAM_NVRAM_FD, nvram_fd); - return 0; -} - -#define GFW_PAGES (GFW_SIZE >> PAGE_SHIFT) -#define VGA_START_PAGE (VGA_IO_START >> PAGE_SHIFT) -#define VGA_END_PAGE ((VGA_IO_START + VGA_IO_SIZE) >> PAGE_SHIFT) - -static void -xc_ia64_setup_md(efi_memory_desc_t *md, - unsigned long start, unsigned long end) -{ - md->type = EFI_CONVENTIONAL_MEMORY; - md->pad = 0; - md->phys_addr = start; - md->virt_addr = 0; - md->num_pages = (end - start) >> EFI_PAGE_SHIFT; - md->attribute = EFI_MEMORY_WB; -} - -static inline unsigned long -min(unsigned long lhs, unsigned long rhs) -{ - return (lhs < rhs)? lhs: rhs; -} - -static int -xc_ia64_setup_memmap_info(xc_interface *xch, uint32_t dom, - unsigned long dom_memsize, /* in bytes */ - unsigned long *pfns_special_pages, - unsigned long nr_special_pages, - unsigned long memmap_info_pfn, - unsigned long memmap_info_num_pages) -{ - xen_ia64_memmap_info_t* memmap_info; - efi_memory_desc_t *md; - uint64_t nr_mds; - - memmap_info = xc_map_foreign_range(xch, dom, - PAGE_SIZE * memmap_info_num_pages, - PROT_READ | PROT_WRITE, - memmap_info_pfn); - if (memmap_info == NULL) { - PERROR("Could not map memmmap_info page."); - return -1; - } - memset(memmap_info, 0, PAGE_SIZE * memmap_info_num_pages); - - /* - * [0, VGA_IO_START = 0xA0000) - * [VGA_IO_START + VGA_IO_SIZE = 0xC0000, MMIO_START = 3GB) - * [IO_PAGE_START (> 3GB), IO_PAGE_START + IO_PAGE_SIZE) - * [STORE_PAGE_START, STORE_PAGE_START + STORE_PAGE_SIZE) - * [BUFFER_IO_PAGE_START, BUFFER_IO_PAGE_START + BUFFER_IO_PAGE_SIZE) - * [BUFFER_PIO_PAGE_START, BUFFER_PIO_PAGE_START + BUFFER_PIO_PAGE_SIZE) - * [memmap_info_pfn << PAGE_SHIFT, - * (memmap_info_pfn << PAGE_SHIFT) + PAGE_SIZE) - * [GFW_START=4GB - GFW_SIZE, GFW_START + GFW_SIZE = 4GB) - * [4GB, ...) - */ - md = (efi_memory_desc_t*)&memmap_info->memdesc; - xc_ia64_setup_md(md, 0, min(VGA_IO_START, dom_memsize)); - md++; - - if (dom_memsize > VGA_IO_START) { - xc_ia64_setup_md(md, VGA_IO_START + VGA_IO_SIZE, - min(MMIO_START, dom_memsize + VGA_IO_SIZE)); - md++; - } - xc_ia64_setup_md(md, IO_PAGE_START, IO_PAGE_START + IO_PAGE_SIZE); - md++; - xc_ia64_setup_md(md, STORE_PAGE_START, STORE_PAGE_START + STORE_PAGE_SIZE); - md++; - xc_ia64_setup_md(md, BUFFER_IO_PAGE_START, - BUFFER_IO_PAGE_START + BUFFER_IO_PAGE_SIZE); - md++; - xc_ia64_setup_md(md, BUFFER_PIO_PAGE_START, - BUFFER_PIO_PAGE_START + BUFFER_PIO_PAGE_SIZE); - md++; - xc_ia64_setup_md(md, memmap_info_pfn << PAGE_SHIFT, - (memmap_info_pfn << PAGE_SHIFT) + - PAGE_SIZE * memmap_info_num_pages); - md++; - xc_ia64_setup_md(md, GFW_START, GFW_START + GFW_SIZE); - md++; - if (dom_memsize + VGA_IO_SIZE > MMIO_START) { - xc_ia64_setup_md(md, 4 * MEM_G, dom_memsize + VGA_IO_SIZE + (1 * MEM_G)); - md++; - } - nr_mds = md - (efi_memory_desc_t*)&memmap_info->memdesc; - - assert(nr_mds <= - (PAGE_SIZE * memmap_info_num_pages - - offsetof(typeof(*memmap_info), memdesc))/sizeof(*md)); - memmap_info->efi_memmap_size = nr_mds * sizeof(*md); - memmap_info->efi_memdesc_size = sizeof(*md); - memmap_info->efi_memdesc_version = EFI_MEMORY_DESCRIPTOR_VERSION; - - munmap(memmap_info, PAGE_SIZE * memmap_info_num_pages); - return 0; -} - -/* setup shared_info page */ -static int -xc_ia64_setup_shared_info(xc_interface *xch, uint32_t dom, - unsigned long shared_info_pfn, - unsigned long memmap_info_pfn, - unsigned long memmap_info_num_pages) -{ - shared_info_t *shared_info; - - shared_info = xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ | PROT_WRITE, - shared_info_pfn); - if (shared_info == NULL) { - PERROR("Could not map shared_info"); - return -1; - } - memset(shared_info, 0, sizeof(*shared_info)); - shared_info->arch.memmap_info_num_pages = memmap_info_num_pages; - shared_info->arch.memmap_info_pfn = memmap_info_pfn; - munmap(shared_info, PAGE_SIZE); - return 0; -} - -/* - * In this function, we will allocate memory and build P2M/M2P table for VTI - * guest. Frist, a pfn list will be initialized discontiguous, normal memory - * begins with 0, GFW memory and other five pages at their place defined in - * xen/include/public/arch-ia64.h xc_domain_populate_physmap_exact() called - * five times, to set parameter 'extent_order' to different value, this is - * convenient to allocate discontiguous memory with different size. - */ -static int -setup_guest(xc_interface *xch, uint32_t dom, unsigned long memsize, - char *image, unsigned long image_size) -{ - xen_pfn_t *pfn_list; - unsigned long dom_memsize = memsize; - unsigned long nr_pages = memsize >> PAGE_SHIFT; - unsigned long vcpus; - unsigned long nr_special_pages; - unsigned long memmap_info_pfn; - unsigned long memmap_info_num_pages; - unsigned long nvram_start = NVRAM_START, nvram_fd = 0; - int rc; - unsigned long i; - unsigned long pfn; - const struct hvm_special_page { - int param; - xen_pfn_t pfn; - } special_pages[] = { - // pfn-sorted array - { HVM_PARAM_IOREQ_PFN, IO_PAGE_START >> PAGE_SHIFT}, - { HVM_PARAM_STORE_PFN, STORE_PAGE_START >> PAGE_SHIFT}, - { HVM_PARAM_BUFIOREQ_PFN, BUFFER_IO_PAGE_START >> PAGE_SHIFT}, - { HVM_PARAM_BUFPIOREQ_PFN, BUFFER_PIO_PAGE_START >> PAGE_SHIFT}, - }; - DECLARE_DOMCTL; - - - if ((image_size > 12 * MEM_M) || (image_size & (PAGE_SIZE - 1))) { - PERROR("Guest firmware size is incorrect [%ld]?", image_size); - return -1; - } - - pfn_list = malloc(nr_pages * sizeof(xen_pfn_t)); - if (pfn_list == NULL) { - PERROR("Could not allocate memory."); - return -1; - } - - // - // Populate - // [0, VGA_IO_START) (VGA_IO_SIZE hole) - // [VGA_IO_START + VGA_IO_SIZE, MMIO_START) (1GB hole) - // [4GB, end) - // - i = 0; - for (pfn = 0; - pfn < MIN((dom_memsize >> PAGE_SHIFT), VGA_START_PAGE); - pfn++) - pfn_list[i++] = pfn; - for (pfn = VGA_END_PAGE; - pfn < (MIN(dom_memsize + VGA_IO_SIZE, MMIO_START) >> PAGE_SHIFT); - pfn++) - pfn_list[i++] = pfn; - for (pfn = ((4 * MEM_G) >> PAGE_SHIFT); - pfn < ((dom_memsize + VGA_IO_SIZE + 1 * MEM_G) >> PAGE_SHIFT); - pfn++) - pfn_list[i++] = pfn; - - rc = xc_domain_populate_physmap_exact(xch, dom, nr_pages, 0, 0, - &pfn_list[0]); - if (rc != 0) { - PERROR("Could not allocate normal memory for Vti guest."); - goto error_out; - } - - // We allocate additional pfn for GFW and other five pages, so - // the pfn_list is not contiguous. Due to this we must support - // old interface xc_ia64_get_pfn_list(). - for (i = 0; i < GFW_PAGES; i++) - pfn_list[i] = (GFW_START >> PAGE_SHIFT) + i; - - rc = xc_domain_populate_physmap_exact(xch, dom, GFW_PAGES, - 0, 0, &pfn_list[0]); - if (rc != 0) { - PERROR("Could not allocate GFW memory for Vti guest."); - goto error_out; - } - - for (i = 0; i < sizeof(special_pages) / sizeof(special_pages[0]); i++) - pfn_list[i] = special_pages[i].pfn; - - nr_special_pages = i; - memmap_info_pfn = pfn_list[nr_special_pages - 1] + 1; - memmap_info_num_pages = 1; - pfn_list[nr_special_pages] = memmap_info_pfn; - nr_special_pages++; - - rc = xc_domain_populate_physmap_exact(xch, dom, nr_special_pages, - 0, 0, &pfn_list[0]); - if (rc != 0) { - PERROR("Could not allocate IO page or store page or buffer io page."); - goto error_out; - } - - domctl.u.arch_setup.flags = 0; - domctl.u.arch_setup.bp = 0; - domctl.u.arch_setup.maxmem = GFW_START + GFW_SIZE; - if (dom_memsize + VGA_IO_SIZE > MMIO_START) - domctl.u.arch_setup.maxmem = dom_memsize + VGA_IO_SIZE + 1 * MEM_G; - domctl.cmd = XEN_DOMCTL_arch_setup; - domctl.domain = (domid_t)dom; - if (xc_domctl(xch, &domctl)) - goto error_out; - - // Load guest firmware - if (xc_ia64_copy_to_domain_pages(xch, dom, image, - (GFW_START + GFW_SIZE - image_size) >> PAGE_SHIFT, - image_size >> PAGE_SHIFT)) { - PERROR("Could not load guest firmware into domain"); - goto error_out; - } - - domctl.cmd = XEN_DOMCTL_getdomaininfo; - domctl.domain = (domid_t)dom; - if (xc_domctl(xch, &domctl) < 0) { - PERROR("Could not get info on domain"); - goto error_out; - } - - if (xc_ia64_setup_memmap_info(xch, dom, dom_memsize, - pfn_list, nr_special_pages, - memmap_info_pfn, memmap_info_num_pages)) { - PERROR("Could not build memmap info"); - goto error_out; - } - if (xc_ia64_setup_shared_info(xch, dom, - domctl.u.getdomaininfo.shared_info_frame, - memmap_info_pfn, memmap_info_num_pages)) { - PERROR("Could not setup shared_info"); - goto error_out; - } - - xc_get_hvm_param(xch, dom, HVM_PARAM_NVRAM_FD, &nvram_fd); - if ( !IS_VALID_NVRAM_FD(nvram_fd) ) - nvram_start = 0; - else if ( copy_from_nvram_to_GFW(xch, dom, (int)nvram_fd ) == -1 ) { - nvram_start = 0; - close(nvram_fd); - } - - vcpus = domctl.u.getdomaininfo.max_vcpu_id + 1; - - // Hand-off state passed to guest firmware - if (xc_ia64_build_hob(xch, dom, dom_memsize, vcpus, nvram_start) < 0) { - PERROR("Could not build hob"); - goto error_out; - } - - // zero clear all special pages - for (i = 0; i < sizeof(special_pages) / sizeof(special_pages[0]); i++) { - xc_set_hvm_param(xch, dom, - special_pages[i].param, special_pages[i].pfn); - if (xc_clear_domain_page(xch, dom, special_pages[i].pfn)) - goto error_out; - } - - free(pfn_list); - return 0; - -error_out: - return -1; -} - -int -xc_hvm_build(xc_interface *xch, uint32_t domid, const struct xc_hvm_build_args *args) -{ - vcpu_guest_context_any_t st_ctxt_any; - vcpu_guest_context_t *ctxt = &st_ctxt_any.c; - char *image = NULL; - unsigned long image_size; - - image = xc_read_image(xch, args->image_file_name, &image_size); - if (image == NULL) { - PERROR("Could not read guest firmware image %s", image_name); - goto error_out; - } - - image_size = (image_size + PAGE_SIZE - 1) & PAGE_MASK; - - if (setup_guest(xch, domid, (unsigned long)args->mem_size, image, - image_size) < 0) { - ERROR("Error constructing guest OS"); - goto error_out; - } - - free(image); - - memset(&st_ctxt_any, 0, sizeof(st_ctxt_any)); - ctxt->regs.ip = 0x80000000ffffffb0UL; - ctxt->regs.ar.fpsr = xc_ia64_fpsr_default(); - ctxt->regs.cr.itir = 14 << 2; - ctxt->regs.psr = IA64_PSR_AC | IA64_PSR_BN; - ctxt->regs.cr.dcr = 0; - ctxt->regs.cr.pta = 15 << 2; - return xc_vcpu_setcontext(xch, domid, 0, &st_ctxt_any); - -error_out: - free(image); - return -1; -} - -/* xc_hvm_build_target_mem: - * Create a domain for a pre-ballooned virtualized Linux, using - * files/filenames. If target < memsize, domain is created with - * memsize pages marked populate-on-demand, and with a PoD cache size - * of target. If target == memsize, pages are populated normally. - * - * XXX:PoD isn't supported yet so setting target does nothing. - */ -int xc_hvm_build_target_mem(xc_interface *xch, - uint32_t domid, - int memsize, - int target, - const char *image_name) -{ - struct xc_hvm_build_args args; - - args.mem_size = (uint64_t)memsize << 20; - args.mem_target = (uint64_t)target << 20; - args.image_file_name = image_name; - - return xc_hvm_build(xch, domid, &args); -} - -/* - * From asm/pgtable.h - */ -#define _PAGE_P_BIT 0 -#define _PAGE_A_BIT 5 -#define _PAGE_D_BIT 6 - -#define _PAGE_P (1 << _PAGE_P_BIT) /* page present bit */ -#define _PAGE_A (1 << _PAGE_A_BIT) /* page accessed bit */ -#define _PAGE_D (1 << _PAGE_D_BIT) /* page dirty bit */ - -#define _PAGE_MA_WB (0x0 << 2) /* write back memory attribute */ -#define _PAGE_MA_UC (0x4 << 2) /* uncacheable memory attribute */ -#define _PAGE_AR_RW (2 << 9) /* read & write */ - -int -xc_ia64_set_os_type(xc_interface *xch, char *guest_os_type, uint32_t dom) -{ - DECLARE_DOMCTL; - - domctl.cmd = XEN_DOMCTL_set_opt_feature; - domctl.domain = (domid_t)dom; - - if (!guest_os_type || !strlen(guest_os_type) || - !strcmp("default", guest_os_type)) { - - /* Nothing */ - return 0; - - } else if (!strcmp("windows", guest_os_type)) { - DPRINTF("Enabling Windows guest OS optimizations\n"); - - /* Windows identity maps regions 4 & 5 */ - domctl.u.set_opt_feature.optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG4; - domctl.u.set_opt_feature.optf.on = XEN_IA64_OPTF_ON; - domctl.u.set_opt_feature.optf.pgprot = (_PAGE_P | _PAGE_A | _PAGE_D | - _PAGE_MA_WB | _PAGE_AR_RW); - domctl.u.set_opt_feature.optf.key = 0; - if (xc_domctl(xch, &domctl)) - PERROR("Failed to set region 4 identity mapping for Windows " - "guest OS type.\n"); - - domctl.u.set_opt_feature.optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG5; - domctl.u.set_opt_feature.optf.on = XEN_IA64_OPTF_ON; - domctl.u.set_opt_feature.optf.pgprot = (_PAGE_P | _PAGE_A | _PAGE_D | - _PAGE_MA_UC | _PAGE_AR_RW); - domctl.u.set_opt_feature.optf.key = 0; - if (xc_domctl(xch, &domctl)) - PERROR("Failed to set region 5 identity mapping for Windows " - "guest OS type.\n"); - return 0; - - } else if (!strcmp("linux", guest_os_type)) { - DPRINTF("Enabling Linux guest OS optimizations\n"); - - /* Linux identity maps regions 7 */ - domctl.u.set_opt_feature.optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG7; - domctl.u.set_opt_feature.optf.on = XEN_IA64_OPTF_ON; - domctl.u.set_opt_feature.optf.pgprot = (_PAGE_P | _PAGE_A | _PAGE_D | - _PAGE_MA_WB | _PAGE_AR_RW); - domctl.u.set_opt_feature.optf.key = 0; - if (xc_domctl(xch, &domctl)) - PERROR("Failed to set region 7 identity mapping for Linux " - "guest OS type.\n"); - return 0; - } - - DPRINTF("Unknown guest_os_type (%s), using defaults\n", guest_os_type); - - return 0; -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/ia64/xc_ia64_linux_restore.c xen-4.3.0/tools/libxc/ia64/xc_ia64_linux_restore.c --- xen-4.2.2/tools/libxc/ia64/xc_ia64_linux_restore.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/xc_ia64_linux_restore.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,739 +0,0 @@ -/****************************************************************************** - * xc_ia64_linux_restore.c - * - * Restore the state of a Linux session. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Copyright (c) 2003, K A Fraser. - * Rewritten for ia64 by Tristan Gingold - * - * Copyright (c) 2007 Isaku Yamahata - * Use foreign p2m exposure. - * VTi domain support - */ - -#include -#include - -#include "xg_private.h" -#include "xc_ia64_save_restore.h" -#include "xc_ia64.h" -#include "xc_efi.h" -#include "xen/hvm/params.h" - -#define PFN_TO_KB(_pfn) ((_pfn) << (PAGE_SHIFT - 10)) - -/* number of pfns this guest has (i.e. number of entries in the P2M) */ -static unsigned long p2m_size; - -/* number of 'in use' pfns in the guest (i.e. #P2M entries with a valid mfn) */ -static unsigned long nr_pfns; - -static int -populate_page_if_necessary(xc_interface *xch, uint32_t dom, unsigned long gmfn, - struct xen_ia64_p2m_table *p2m_table) -{ - if (xc_ia64_p2m_present(p2m_table, gmfn)) - return 0; - - return xc_domain_populate_physmap_exact(xch, dom, 1, 0, 0, &gmfn); -} - -static int -read_page(xc_interface *xch, int io_fd, uint32_t dom, unsigned long pfn) -{ - void *mem; - - mem = xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, pfn); - if (mem == NULL) { - ERROR("cannot map page"); - return -1; - } - if (read_exact(io_fd, mem, PAGE_SIZE)) { - ERROR("Error when reading from state file (5)"); - munmap(mem, PAGE_SIZE); - return -1; - } - munmap(mem, PAGE_SIZE); - return 0; -} - -/* - * Get the list of PFNs that are not in the psuedo-phys map. - * Although we allocate pages on demand, balloon driver may - * decreased simaltenously. So we have to free the freed - * pages here. - */ -static int -xc_ia64_recv_unallocated_list(xc_interface *xch, int io_fd, uint32_t dom, - struct xen_ia64_p2m_table *p2m_table) -{ - int rc = -1; - unsigned int i; - unsigned int count; - unsigned long *pfntab = NULL; - unsigned int nr_frees; - - if (read_exact(io_fd, &count, sizeof(count))) { - ERROR("Error when reading pfn count"); - goto out; - } - - pfntab = malloc(sizeof(unsigned long) * count); - if (pfntab == NULL) { - ERROR("Out of memory"); - goto out; - } - - if (read_exact(io_fd, pfntab, sizeof(unsigned long)*count)) { - ERROR("Error when reading pfntab"); - goto out; - } - - nr_frees = 0; - for (i = 0; i < count; i++) { - if (xc_ia64_p2m_allocated(p2m_table, pfntab[i])) { - pfntab[nr_frees] = pfntab[i]; - nr_frees++; - } - } - if (nr_frees > 0) { - if (xc_domain_decrease_reservation_exact(xch, dom, nr_frees, - 0, pfntab) < 0) { - PERROR("Could not decrease reservation"); - goto out; - } else - DPRINTF("Decreased reservation by %d / %d pages\n", - nr_frees, count); - } - - rc = 0; - - out: - if (pfntab != NULL) - free(pfntab); - return rc; -} - -static int -xc_ia64_recv_vcpu_context(xc_interface *xch, int io_fd, uint32_t dom, - uint32_t vcpu, vcpu_guest_context_any_t *ctxt_any) -{ - vcpu_guest_context_t *ctxt = &ctxt_any->c; - if (read_exact(io_fd, ctxt, sizeof(*ctxt))) { - ERROR("Error when reading ctxt"); - return -1; - } - - fprintf(stderr, "ip=%016lx, b0=%016lx\n", ctxt->regs.ip, ctxt->regs.b[0]); - - /* Initialize and set registers. */ - ctxt->flags = VGCF_EXTRA_REGS | VGCF_SET_CR_IRR | VGCF_online | - VGCF_SET_AR_ITC; - if (xc_vcpu_setcontext(xch, dom, vcpu, ctxt_any) != 0) { - ERROR("Couldn't set vcpu context"); - return -1; - } - - /* Just a check. */ - ctxt->flags = 0; - if (xc_vcpu_getcontext(xch, dom, vcpu, ctxt_any)) { - ERROR("Could not get vcpu context"); - return -1; - } - - return 0; -} - -/* Read shared info. */ -static int -xc_ia64_recv_shared_info(xc_interface *xch, int io_fd, uint32_t dom, - unsigned long shared_info_frame, - unsigned long *start_info_pfn) -{ - unsigned int i; - - /* The new domain's shared-info frame. */ - shared_info_t *shared_info; - - /* Read shared info. */ - shared_info = xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, - shared_info_frame); - if (shared_info == NULL) { - ERROR("cannot map page"); - return -1; - } - - if (read_exact(io_fd, shared_info, PAGE_SIZE)) { - ERROR("Error when reading shared_info page"); - munmap(shared_info, PAGE_SIZE); - return -1; - } - - /* clear any pending events and the selector */ - memset(&(shared_info->evtchn_pending[0]), 0, - sizeof (shared_info->evtchn_pending)); - for (i = 0; i < XEN_LEGACY_MAX_VCPUS; i++) - shared_info->vcpu_info[i].evtchn_pending_sel = 0; - - if (start_info_pfn != NULL) - *start_info_pfn = shared_info->arch.start_info_pfn; - - munmap (shared_info, PAGE_SIZE); - - return 0; -} - -static int -xc_ia64_recv_vcpumap(xc_interface *xch, - const xc_dominfo_t *info, int io_fd, uint64_t **vcpumapp) -{ - uint64_t max_virt_cpus; - unsigned long vcpumap_size; - uint64_t *vcpumap = NULL; - - *vcpumapp = NULL; - - if (read_exact(io_fd, &max_virt_cpus, sizeof(max_virt_cpus))) { - ERROR("error reading max_virt_cpus"); - return -1; - } - if (max_virt_cpus < info->max_vcpu_id) { - ERROR("too large max_virt_cpus %i < %i\n", - max_virt_cpus, info->max_vcpu_id); - return -1; - } - vcpumap_size = bitmap_size(max_virt_cpus); - rc = bitmap_alloc(&vcpumap, max_virt_cpus); - if (rc < 0) { - ERROR("memory alloc for vcpumap"); - return rc; - } - if (read_exact(io_fd, vcpumap, vcpumap_size)) { - ERROR("read vcpumap"); - free(vcpumap); - return -1; - } - - *vcpumapp = vcpumap; - return 0; -} - -static int -xc_ia64_pv_recv_vcpu_context(xc_interface *xch, int io_fd, int32_t dom, - uint32_t vcpu) -{ - int rc = -1; - - /* A copy of the CPU context of the guest. */ - vcpu_guest_context_any_t ctxt_any; - vcpu_guest_context_t *ctxt = &ctxt_any.c; - - if (xc_ia64_recv_vcpu_context(xch, io_fd, dom, vcpu, &ctxt_any)) - goto out; - - /* Then get privreg page. */ - if (read_page(xch, io_fd, dom, ctxt->privregs_pfn) < 0) { - ERROR("Could not read vcpu privregs"); - goto out; - } - - rc = 0; - - out: - return rc; -} - -static int -xc_ia64_pv_recv_shared_info(xc_interface *xch, int io_fd, int32_t dom, - unsigned long shared_info_frame, - struct xen_ia64_p2m_table *p2m_table, - unsigned int store_evtchn, - unsigned long *store_mfn, - unsigned int console_evtchn, - unsigned long *console_mfn) -{ - unsigned long gmfn; - - /* A temporary mapping of the guest's start_info page. */ - start_info_t *start_info; - - /* Read shared info. */ - if (xc_ia64_recv_shared_info(xch, io_fd, dom, - shared_info_frame, &gmfn)) - return -1; - - /* Uncanonicalise the suspend-record frame number and poke resume rec. */ - if (populate_page_if_necessary(xch, dom, gmfn, p2m_table)) { - ERROR("cannot populate page 0x%lx", gmfn); - return -1; - } - start_info = xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ | PROT_WRITE, gmfn); - if (start_info == NULL) { - ERROR("cannot map start_info page"); - return -1; - } - start_info->nr_pages = p2m_size; - start_info->shared_info = shared_info_frame << PAGE_SHIFT; - start_info->flags = 0; - *store_mfn = start_info->store_mfn; - start_info->store_evtchn = store_evtchn; - *console_mfn = start_info->console.domU.mfn; - start_info->console.domU.evtchn = console_evtchn; - munmap(start_info, PAGE_SIZE); - - return 0; -} - -static int -xc_ia64_pv_recv_context_ver_one_or_two(xc_interface *xch, int io_fd, uint32_t dom, - unsigned long shared_info_frame, - struct xen_ia64_p2m_table *p2m_table, - unsigned int store_evtchn, - unsigned long *store_mfn, - unsigned int console_evtchn, - unsigned long *console_mfn) -{ - int rc; - - /* vcpu 0 context */ - rc = xc_ia64_pv_recv_vcpu_context(xch, io_fd, dom, 0); - if (rc) - return rc; - - - /* shared_info */ - rc = xc_ia64_pv_recv_shared_info(xch, io_fd, dom, shared_info_frame, - p2m_table, store_evtchn, store_mfn, - console_evtchn, console_mfn); - return rc; -} - -static int -xc_ia64_pv_recv_context_ver_three(xc_interface *xch, int io_fd, uint32_t dom, - unsigned long shared_info_frame, - struct xen_ia64_p2m_table *p2m_table, - unsigned int store_evtchn, - unsigned long *store_mfn, - unsigned int console_evtchn, - unsigned long *console_mfn) -{ - int rc = -1; - xc_dominfo_t info; - unsigned int i; - - /* vcpu map */ - uint64_t *vcpumap = NULL; - - if (xc_domain_getinfo(xch, dom, 1, &info) != 1) { - ERROR("Could not get domain info"); - return -1; - } - rc = xc_ia64_recv_vcpumap(xch, &info, io_fd, &vcpumap); - if (rc != 0) - goto out; - - /* vcpu context */ - for (i = 0; i <= info.max_vcpu_id; i++) { - if (!test_bit(i, vcpumap)) - continue; - - rc = xc_ia64_pv_recv_vcpu_context(xch, io_fd, dom, i); - if (rc != 0) - goto out; - } - - /* shared_info */ - rc = xc_ia64_pv_recv_shared_info(xch, io_fd, dom, shared_info_frame, - p2m_table, store_evtchn, store_mfn, - console_evtchn, console_mfn); - out: - if (vcpumap != NULL) - free(vcpumap); - return rc; -} - -static int -xc_ia64_pv_recv_context(unsigned long format_version, - xc_interface *xch, int io_fd, uint32_t dom, - unsigned long shared_info_frame, - struct xen_ia64_p2m_table *p2m_table, - unsigned int store_evtchn, - unsigned long *store_mfn, - unsigned int console_evtchn, - unsigned long *console_mfn) -{ - int rc; - switch (format_version) { - case XC_IA64_SR_FORMAT_VER_ONE: - case XC_IA64_SR_FORMAT_VER_TWO: - rc = xc_ia64_pv_recv_context_ver_one_or_two(xch, io_fd, dom, - shared_info_frame, - p2m_table, store_evtchn, - store_mfn, console_evtchn, - console_mfn); - break; - case XC_IA64_SR_FORMAT_VER_THREE: - rc = xc_ia64_pv_recv_context_ver_three(xch, io_fd, dom, - shared_info_frame, - p2m_table, store_evtchn, - store_mfn, console_evtchn, - console_mfn); - break; - default: - ERROR("Unsupported format version"); - rc = -1; - break; - } - return rc; -} - -static int -xc_ia64_hvm_recv_context(xc_interface *xch, int io_fd, uint32_t dom, - unsigned long shared_info_frame, - struct xen_ia64_p2m_table *p2m_table, - unsigned int store_evtchn, unsigned long *store_mfn, - unsigned int console_evtchn, - unsigned long *console_mfn) -{ - int rc = -1; - xc_dominfo_t info; - unsigned int i; - - /* cpumap */ - uint64_t *vcpumap = NULL; - - /* HVM: magic frames for ioreqs and xenstore comms */ - const int hvm_params[] = { - HVM_PARAM_STORE_PFN, - HVM_PARAM_IOREQ_PFN, - HVM_PARAM_BUFIOREQ_PFN, - HVM_PARAM_BUFPIOREQ_PFN, - }; - const int NR_PARAMS = sizeof(hvm_params) / sizeof(hvm_params[0]); - /* ioreq_pfn, bufioreq_pfn, store_pfn */ - uint64_t magic_pfns[NR_PARAMS]; - - /* HVM: a buffer for holding HVM contxt */ - uint64_t rec_size = 0; - uint8_t *hvm_buf = NULL; - - /* Read shared info. */ - if (xc_ia64_recv_shared_info(xch, io_fd, dom, shared_info_frame, - NULL)) - goto out; - - /* vcpu map */ - if (xc_domain_getinfo(xch, dom, 1, &info) != 1) { - ERROR("Could not get domain info"); - goto out; - } - if (xc_ia64_recv_vcpumap(xch, &info, io_fd, &vcpumap)) - goto out; - - /* vcpu context */ - for (i = 0; i <= info.max_vcpu_id; i++) { - /* A copy of the CPU context of the guest. */ - vcpu_guest_context_any_t ctxt_any; - - if (!test_bit(i, vcpumap)) - continue; - - if (xc_ia64_recv_vcpu_context(xch, io_fd, dom, i, &ctxt_any)) - goto out; - - /* system context of vcpu is recieved as hvm context. */ - } - - /* Set HVM-specific parameters */ - if (read_exact(io_fd, magic_pfns, sizeof(magic_pfns))) { - ERROR("error reading magic page addresses"); - goto out; - } - - /* These comms pages need to be zeroed at the start of day */ - for (i = 0; i < NR_PARAMS; i++) { - rc = xc_clear_domain_page(xch, dom, magic_pfns[i]); - if (rc != 0) { - ERROR("error zeroing magic pages: %i", rc); - goto out; - } - rc = xc_set_hvm_param(xch, dom, hvm_params[i], magic_pfns[i]); - if (rc != 0) { - ERROR("error setting HVM params: %i", rc); - goto out; - } - } - rc = xc_set_hvm_param(xch, dom, - HVM_PARAM_STORE_EVTCHN, store_evtchn); - if (rc != 0) { - ERROR("error setting HVM params: %i", rc); - goto out; - } - rc = -1; - *store_mfn = magic_pfns[0]; - - /* Read HVM context */ - if (read_exact(io_fd, &rec_size, sizeof(rec_size))) { - ERROR("error read hvm context size!\n"); - goto out; - } - - hvm_buf = malloc(rec_size); - if (hvm_buf == NULL) { - ERROR("memory alloc for hvm context buffer failed"); - errno = ENOMEM; - goto out; - } - - if (read_exact(io_fd, hvm_buf, rec_size)) { - ERROR("error loading the HVM context"); - goto out; - } - - rc = xc_domain_hvm_setcontext(xch, dom, hvm_buf, rec_size); - if (rc != 0) { - ERROR("error setting the HVM context"); - goto out; - } - - rc = 0; - -out: - if (vcpumap != NULL) - free(vcpumap); - if (hvm_buf != NULL) - free(hvm_buf); - return rc; -} - -/* - * hvm domain requires IO pages allocated when XEN_DOMCTL_arch_setup - */ -static int -xc_ia64_hvm_domain_setup(xc_interface *xch, uint32_t dom) -{ - int rc; - xen_pfn_t pfn_list[] = { - IO_PAGE_START >> PAGE_SHIFT, - BUFFER_IO_PAGE_START >> PAGE_SHIFT, - BUFFER_PIO_PAGE_START >> PAGE_SHIFT, - }; - unsigned long nr_pages = sizeof(pfn_list) / sizeof(pfn_list[0]); - - rc = xc_domain_populate_physmap_exact(xch, dom, nr_pages, - 0, 0, &pfn_list[0]); - if (rc != 0) - PERROR("Could not allocate IO page or buffer io page."); - return rc; -} - -int -xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom, - unsigned int store_evtchn, unsigned long *store_mfn, - unsigned int console_evtchn, unsigned long *console_mfn, - unsigned int hvm, unsigned int pae, int superpages, - int no_incr_generationid, - unsigned long *vm_generationid_addr) -{ - DECLARE_DOMCTL; - int rc = 1; - unsigned long ver; - - /* The new domain's shared-info frame number. */ - unsigned long shared_info_frame; - - struct xen_ia64_p2m_table p2m_table; - xc_ia64_p2m_init(&p2m_table); - - /* For info only */ - nr_pfns = 0; - - if ( read_exact(io_fd, &p2m_size, sizeof(unsigned long)) ) - { - ERROR("read: p2m_size"); - goto out; - } - DPRINTF("xc_linux_restore start: p2m_size = %lx\n", p2m_size); - - if (read_exact(io_fd, &ver, sizeof(unsigned long))) { - ERROR("Error when reading version"); - goto out; - } - if (ver != XC_IA64_SR_FORMAT_VER_ONE && - ver != XC_IA64_SR_FORMAT_VER_TWO && - ver != XC_IA64_SR_FORMAT_VER_THREE) { - ERROR("version of save doesn't match"); - goto out; - } - - if (read_exact(io_fd, &domctl.u.arch_setup, sizeof(domctl.u.arch_setup))) { - ERROR("read: domain setup"); - goto out; - } - - if (hvm && xc_ia64_hvm_domain_setup(xch, dom) != 0) - goto out; - - /* Build firmware (will be overwritten). */ - domctl.domain = (domid_t)dom; - domctl.u.arch_setup.flags &= ~XEN_DOMAINSETUP_query; - domctl.u.arch_setup.bp = 0; /* indicate domain restore */ - - domctl.cmd = XEN_DOMCTL_arch_setup; - if (xc_domctl(xch, &domctl)) - goto out; - - /* Get the domain's shared-info frame. */ - domctl.cmd = XEN_DOMCTL_getdomaininfo; - domctl.domain = (domid_t)dom; - if (xc_domctl(xch, &domctl) < 0) { - ERROR("Could not get information on new domain"); - goto out; - } - shared_info_frame = domctl.u.getdomaininfo.shared_info_frame; - - if (ver == XC_IA64_SR_FORMAT_VER_THREE || - ver == XC_IA64_SR_FORMAT_VER_TWO) { - unsigned int memmap_info_num_pages; - unsigned long memmap_size; - xen_ia64_memmap_info_t *memmap_info; - - if (read_exact(io_fd, &memmap_info_num_pages, - sizeof(memmap_info_num_pages))) { - ERROR("read: memmap_info_num_pages"); - goto out; - } - memmap_size = memmap_info_num_pages * PAGE_SIZE; - memmap_info = malloc(memmap_size); - if (memmap_info == NULL) { - ERROR("Could not allocate memory for memmap_info"); - goto out; - } - if (read_exact(io_fd, memmap_info, memmap_size)) { - ERROR("read: memmap_info"); - goto out; - } - if (xc_ia64_p2m_map(&p2m_table, xch, - dom, memmap_info, IA64_DOM0VP_EFP_ALLOC_PTE)) { - ERROR("p2m mapping"); - goto out; - } - free(memmap_info); - } else if (ver == XC_IA64_SR_FORMAT_VER_ONE) { - xen_ia64_memmap_info_t *memmap_info; - efi_memory_desc_t *memdesc; - uint64_t buffer[(sizeof(*memmap_info) + sizeof(*memdesc) + - sizeof(uint64_t) - 1) / sizeof(uint64_t)]; - - memset(buffer, 0, sizeof(buffer)); - memmap_info = (xen_ia64_memmap_info_t *)buffer; - memdesc = (efi_memory_desc_t*)&memmap_info->memdesc[0]; - memmap_info->efi_memmap_size = sizeof(*memdesc); - memmap_info->efi_memdesc_size = sizeof(*memdesc); - memmap_info->efi_memdesc_version = EFI_MEMORY_DESCRIPTOR_VERSION; - - memdesc->type = EFI_MEMORY_DESCRIPTOR_VERSION; - memdesc->phys_addr = 0; - memdesc->virt_addr = 0; - memdesc->num_pages = nr_pfns << (PAGE_SHIFT - EFI_PAGE_SHIFT); - memdesc->attribute = EFI_MEMORY_WB; - - if (xc_ia64_p2m_map(&p2m_table, xch, - dom, memmap_info, IA64_DOM0VP_EFP_ALLOC_PTE)) { - ERROR("p2m mapping"); - goto out; - } - } else { - ERROR("unknown version"); - goto out; - } - - DPRINTF("Reloading memory pages: 0%%\n"); - - while (1) { - unsigned long gmfn; - if (read_exact(io_fd, &gmfn, sizeof(unsigned long))) { - ERROR("Error when reading batch size"); - goto out; - } - if (gmfn == INVALID_MFN) - break; - - if (populate_page_if_necessary(xch, dom, gmfn, &p2m_table) < 0) { - ERROR("can not populate page 0x%lx", gmfn); - goto out; - } - if (read_page(xch, io_fd, dom, gmfn) < 0) - goto out; - } - - DPRINTF("Received all pages\n"); - - if (xc_ia64_recv_unallocated_list(xch, io_fd, dom, &p2m_table)) - goto out; - - if (!hvm) - rc = xc_ia64_pv_recv_context(ver, - xch, io_fd, dom, shared_info_frame, - &p2m_table, store_evtchn, store_mfn, - console_evtchn, console_mfn); - else - rc = xc_ia64_hvm_recv_context(xch, io_fd, dom, shared_info_frame, - &p2m_table, store_evtchn, store_mfn, - console_evtchn, console_mfn); - if (rc) - goto out; - - /* - * Safety checking of saved context: - * 1. user_regs is fine, as Xen checks that on context switch. - * 2. fpu_ctxt is fine, as it can't hurt Xen. - * 3. trap_ctxt needs the code selectors checked. - * 4. ldt base must be page-aligned, no more than 8192 ents, ... - * 5. gdt already done, and further checking is done by Xen. - * 6. check that kernel_ss is safe. - * 7. pt_base is already done. - * 8. debugregs are checked by Xen. - * 9. callback code selectors need checking. - */ - DPRINTF("Domain ready to be built.\n"); - - rc = 0; - - out: - xc_ia64_p2m_unmap(&p2m_table); - - if ((rc != 0) && (dom != 0)) - xc_domain_destroy(xch, dom); - - DPRINTF("Restore exit with rc=%d\n", rc); - - return rc; -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/ia64/xc_ia64_linux_save.c xen-4.3.0/tools/libxc/ia64/xc_ia64_linux_save.c --- xen-4.2.2/tools/libxc/ia64/xc_ia64_linux_save.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/xc_ia64_linux_save.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,801 +0,0 @@ -/****************************************************************************** - * xc_ia64_linux_save.c - * - * Save the state of a running Linux session. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Copyright (c) 2003, K A Fraser. - * Rewritten for ia64 by Tristan Gingold - * - * Copyright (c) 2007 Isaku Yamahata - * Use foreign p2m exposure. - * VTi domain support. - */ - -#include -#include -#include -#include -#include - -#include "xg_private.h" -#include "xc_bitops.h" -#include "xc_ia64.h" -#include "xc_ia64_save_restore.h" -#include "xc_efi.h" -#include "xen/hvm/params.h" - -/* -** Default values for important tuning parameters. Can override by passing -** non-zero replacement values to xc_linux_save(). -** -** XXX SMH: should consider if want to be able to override MAX_MBIT_RATE too. -** -*/ -#define DEF_MAX_ITERS (4 - 1) /* limit us to 4 times round loop */ -#define DEF_MAX_FACTOR 3 /* never send more than 3x nr_pfns */ - -/* -** During (live) save/migrate, we maintain a number of bitmaps to track -** which pages we have to send, and to skip. -*/ - -static int -suspend_and_state(int (*suspend)(void*), void* data, - xc_interface *xch, int io_fd, - int dom, xc_dominfo_t *info) -{ - if ( !(*suspend)(data) ) { - ERROR("Suspend request failed"); - return -1; - } - - if ( (xc_domain_getinfo(xch, dom, 1, info) != 1) || - !info->shutdown || (info->shutdown_reason != SHUTDOWN_suspend) ) { - ERROR("Could not get domain info"); - return -1; - } - - return 0; -} - -static inline int -md_is_not_ram(const efi_memory_desc_t *md) -{ - return ((md->type != EFI_CONVENTIONAL_MEMORY) || - (md->attribute != EFI_MEMORY_WB) || - (md->num_pages == 0)); -} - -/* - * Send through a list of all the PFNs that were not in map at the close. - * We send pages which was allocated. However balloon driver may - * decreased after sending page. So we have to check the freed - * page after pausing the domain. - */ -static int -xc_ia64_send_unallocated_list(xc_interface *xch, int io_fd, - struct xen_ia64_p2m_table *p2m_table, - xen_ia64_memmap_info_t *memmap_info, - void *memmap_desc_start, void *memmap_desc_end) -{ - void *p; - efi_memory_desc_t *md; - - unsigned long N; - unsigned long pfntab[1024]; - unsigned int j; - - j = 0; - for (p = memmap_desc_start; - p < memmap_desc_end; - p += memmap_info->efi_memdesc_size) { - md = p; - - if (md_is_not_ram(md)) - continue; - - for (N = md->phys_addr >> PAGE_SHIFT; - N < (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> - PAGE_SHIFT; - N++) { - if (!xc_ia64_p2m_allocated(p2m_table, N)) - j++; - } - } - if (write_exact(io_fd, &j, sizeof(unsigned int))) { - ERROR("Error when writing to state file (6a)"); - return -1; - } - - j = 0; - for (p = memmap_desc_start; - p < memmap_desc_end; - p += memmap_info->efi_memdesc_size) { - md = p; - - if (md_is_not_ram(md)) - continue; - - for (N = md->phys_addr >> PAGE_SHIFT; - N < (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> - PAGE_SHIFT; - N++) { - if (!xc_ia64_p2m_allocated(p2m_table, N)) - pfntab[j++] = N; - if (j == sizeof(pfntab)/sizeof(pfntab[0])) { - if (write_exact(io_fd, &pfntab, sizeof(pfntab[0]) * j)) { - ERROR("Error when writing to state file (6b)"); - return -1; - } - j = 0; - } - } - } - if (j > 0) { - if (write_exact(io_fd, &pfntab, sizeof(pfntab[0]) * j)) { - ERROR("Error when writing to state file (6c)"); - return -1; - } - } - - return 0; -} - -static int -xc_ia64_send_vcpu_context(xc_interface *xch, int io_fd, uint32_t dom, - uint32_t vcpu, vcpu_guest_context_any_t *ctxt_any) -{ - vcpu_guest_context_t *ctxt = &ctxt_any->c; - if (xc_vcpu_getcontext(xch, dom, vcpu, ctxt_any)) { - ERROR("Could not get vcpu context"); - return -1; - } - - if (write_exact(io_fd, ctxt, sizeof(*ctxt))) { - ERROR("Error when writing to state file (1)"); - return -1; - } - - fprintf(stderr, "ip=%016lx, b0=%016lx\n", ctxt->regs.ip, ctxt->regs.b[0]); - return 0; -} - -static int -xc_ia64_send_shared_info(xc_interface *xch, int io_fd, shared_info_t *live_shinfo) -{ - if (write_exact(io_fd, live_shinfo, PAGE_SIZE)) { - ERROR("Error when writing to state file (1)"); - return -1; - } - return 0; -} - -static int -xc_ia64_send_vcpumap(xc_interface *xch, int io_fd, uint32_t dom, - const xc_dominfo_t *info, uint64_t max_virt_cpus, - uint64_t **vcpumapp) -{ - int rc = -1; - unsigned int i; - unsigned long vcpumap_size; - uint64_t *vcpumap = NULL; - - vcpumap_size = bitmap_size(max_virt_cpus); - vcpumap = bitmap_alloc(max_virt_cpus); - if (!vcpumap) { - ERROR("memory alloc for vcpumap"); - goto out; - } - - for (i = 0; i <= info->max_vcpu_id; i++) { - xc_vcpuinfo_t vinfo; - if ((xc_vcpu_getinfo(xch, dom, i, &vinfo) == 0) && vinfo.online) - set_bit(i, vcpumap); - } - - if (write_exact(io_fd, &max_virt_cpus, sizeof(max_virt_cpus))) { - ERROR("write max_virt_cpus"); - goto out; - } - - if (write_exact(io_fd, vcpumap, vcpumap_size)) { - ERROR("write vcpumap"); - goto out; - } - - rc = 0; - - out: - if (rc != 0 && vcpumap != NULL) { - free(vcpumap); - vcpumap = NULL; - } - *vcpumapp = vcpumap; - return rc; -} - - -static int -xc_ia64_pv_send_context(xc_interface *xch, int io_fd, uint32_t dom, - const xc_dominfo_t *info, shared_info_t *live_shinfo) -{ - int rc = -1; - unsigned int i; - - /* vcpu map */ - uint64_t *vcpumap = NULL; - if (xc_ia64_send_vcpumap(xch, io_fd, dom, info, XEN_LEGACY_MAX_VCPUS, - &vcpumap)) - goto out; - - /* vcpu context */ - for (i = 0; i <= info->max_vcpu_id; i++) { - /* A copy of the CPU context of the guest. */ - vcpu_guest_context_any_t ctxt_any; - vcpu_guest_context_t *ctxt = &ctxt_any.c; - - char *mem; - - if (!test_bit(i, vcpumap)) - continue; - - if (xc_ia64_send_vcpu_context(xch, io_fd, dom, i, &ctxt_any)) - goto out; - - mem = xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, ctxt->privregs_pfn); - if (mem == NULL) { - ERROR("cannot map privreg page"); - goto out; - } - if (write_exact(io_fd, mem, PAGE_SIZE)) { - ERROR("Error when writing privreg to state file (5)"); - munmap(mem, PAGE_SIZE); - goto out; - } - munmap(mem, PAGE_SIZE); - } - - rc = xc_ia64_send_shared_info(xch, io_fd, live_shinfo); - - out: - if (vcpumap != NULL) - free(vcpumap); - return rc; -} - -static int -xc_ia64_hvm_send_context(xc_interface *xch, int io_fd, uint32_t dom, - const xc_dominfo_t *info, shared_info_t *live_shinfo) -{ - int rc = -1; - unsigned int i; - - /* vcpu map */ - uint64_t *vcpumap = NULL; - - /* HVM: magic frames for ioreqs and xenstore comms */ - const int hvm_params[] = { - HVM_PARAM_STORE_PFN, - HVM_PARAM_IOREQ_PFN, - HVM_PARAM_BUFIOREQ_PFN, - HVM_PARAM_BUFPIOREQ_PFN, - }; - const int NR_PARAMS = sizeof(hvm_params) / sizeof(hvm_params[0]); - /* ioreq_pfn, bufioreq_pfn, store_pfn */ - uint64_t magic_pfns[NR_PARAMS]; - - /* HVM: a buffer for holding HVM contxt */ - uint64_t rec_size; - uint64_t hvm_buf_size = 0; - uint8_t *hvm_buf = NULL; - - if (xc_ia64_send_shared_info(xch, io_fd, live_shinfo)) - return -1; - - /* vcpu map */ - if (xc_ia64_send_vcpumap(xch, io_fd, dom, info, XEN_LEGACY_MAX_VCPUS, - &vcpumap)) - goto out; - - /* vcpu context */ - for (i = 0; i <= info->max_vcpu_id; i++) { - /* A copy of the CPU context of the guest. */ - vcpu_guest_context_any_t ctxt_any; - - if (!test_bit(i, vcpumap)) - continue; - - if (xc_ia64_send_vcpu_context(xch, io_fd, dom, i, &ctxt_any)) - goto out; - - /* system context of vcpu is sent as hvm context. */ - } - - /* Save magic-page locations. */ - memset(magic_pfns, 0, sizeof(magic_pfns)); - for (i = 0; i < NR_PARAMS; i++) { - if (xc_get_hvm_param(xch, dom, hvm_params[i], &magic_pfns[i])) { - PERROR("Error when xc_get_hvm_param"); - goto out; - } - } - - if (write_exact(io_fd, magic_pfns, sizeof(magic_pfns))) { - ERROR("Error when writing to state file (7)"); - goto out; - } - - /* Need another buffer for HVM context */ - hvm_buf_size = xc_domain_hvm_getcontext(xch, dom, 0, 0); - if (hvm_buf_size == -1) { - ERROR("Couldn't get HVM context size from Xen"); - goto out; - } - - hvm_buf = malloc(hvm_buf_size); - if (!hvm_buf) { - ERROR("Couldn't allocate memory"); - goto out; - } - - /* Get HVM context from Xen and save it too */ - rec_size = xc_domain_hvm_getcontext(xch, dom, hvm_buf, hvm_buf_size); - if (rec_size == -1) { - ERROR("HVM:Could not get hvm buffer"); - goto out; - } - - if (write_exact(io_fd, &rec_size, sizeof(rec_size))) { - ERROR("error write hvm buffer size"); - goto out; - } - - if (write_exact(io_fd, hvm_buf, rec_size)) { - ERROR("write HVM info failed!\n"); - goto out; - } - - rc = 0; -out: - if (hvm_buf != NULL) - free(hvm_buf); - if (vcpumap != NULL) - free(vcpumap); - return rc; -} - -int -xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iters, - uint32_t max_factor, uint32_t flags, - struct save_callbacks* callbacks, int hvm, - unsigned long vm_generationid_addr) -{ - DECLARE_DOMCTL; - xc_dominfo_t info; - - int rc = 1; - - int debug = (flags & XCFLAGS_DEBUG); - int live = (flags & XCFLAGS_LIVE); - - /* The new domain's shared-info frame number. */ - unsigned long shared_info_frame; - - /* Live mapping of shared info structure */ - shared_info_t *live_shinfo = NULL; - - /* Iteration number. */ - int iter; - - /* Number of pages sent in the last iteration (live only). */ - unsigned int sent_last_iter; - - /* Number of pages sent (live only). */ - unsigned int total_sent = 0; - - /* total number of pages used by the current guest */ - unsigned long p2m_size; - - /* Size of the shadow bitmap (live only). */ - unsigned int bitmap_size = 0; - - /* True if last iteration. */ - int last_iter = 0; - - /* Bitmap of pages to be sent. */ - DECLARE_HYPERCALL_BUFFER(unsigned long, to_send); - /* Bitmap of pages not to be sent (because dirtied). */ - DECLARE_HYPERCALL_BUFFER(unsigned long, to_skip); - - char *mem; - - /* for foreign p2m exposure */ - unsigned long memmap_info_num_pages; - /* Unsigned int was used before. To keep file format compatibility. */ - unsigned int memmap_info_num_pages_to_send; - unsigned long memmap_size = 0; - xen_ia64_memmap_info_t *memmap_info = NULL; - void *memmap_desc_start; - void *memmap_desc_end; - void *p; - efi_memory_desc_t *md; - struct xen_ia64_p2m_table p2m_table; - - if ( hvm && !callbacks->switch_qemu_logdirty ) - { - ERROR("No switch_qemu_logdirty callback given."); - errno = EINVAL; - return 1; - } - - xc_ia64_p2m_init(&p2m_table); - - if (debug) - fprintf(stderr, "xc_linux_save (ia64): started dom=%d\n", dom); - - /* If no explicit control parameters given, use defaults */ - if (!max_iters) - max_iters = DEF_MAX_ITERS; - if (!max_factor) - max_factor = DEF_MAX_FACTOR; - - //initialize_mbit_rate(); - - if (xc_domain_getinfo(xch, dom, 1, &info) != 1) { - ERROR("Could not get domain info"); - return 1; - } - - shared_info_frame = info.shared_info_frame; - -#if 0 - /* cheesy sanity check */ - if ((info.max_memkb >> (PAGE_SHIFT - 10)) > max_mfn) { - ERROR("Invalid state record -- pfn count out of range: %lu", - (info.max_memkb >> (PAGE_SHIFT - 10))); - goto out; - } -#endif - - /* Map the shared info frame */ - live_shinfo = xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ, shared_info_frame); - if (!live_shinfo) { - ERROR("Couldn't map live_shinfo"); - goto out; - } - - p2m_size = xc_domain_maximum_gpfn(xch, dom) + 1; - - /* This is expected by xm restore. */ - if (write_exact(io_fd, &p2m_size, sizeof(unsigned long))) { - ERROR("write: p2m_size"); - goto out; - } - - /* xc_linux_restore starts to read here. */ - /* Write a version number. This can avoid searching for a stupid bug - if the format change. - The version is hard-coded, don't forget to change the restore code - too! */ - { - unsigned long version = XC_IA64_SR_FORMAT_VER_CURRENT; - - if (write_exact(io_fd, &version, sizeof(unsigned long))) { - ERROR("write: version"); - goto out; - } - } - - domctl.cmd = XEN_DOMCTL_arch_setup; - domctl.domain = (domid_t)dom; - domctl.u.arch_setup.flags = XEN_DOMAINSETUP_query; - if (xc_domctl(xch, &domctl) < 0) { - ERROR("Could not get domain setup"); - goto out; - } - if (write_exact(io_fd, &domctl.u.arch_setup, - sizeof(domctl.u.arch_setup))) { - ERROR("write: domain setup"); - goto out; - } - - /* Domain is still running at this point */ - if (live) { - - if (xc_shadow_control(xch, dom, - XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY, - NULL, 0, NULL, 0, NULL ) < 0) { - ERROR("Couldn't enable shadow mode"); - goto out; - } - - last_iter = 0; - - bitmap_size = ((p2m_size + BITS_PER_LONG-1) & ~(BITS_PER_LONG-1)) / 8; - to_send = xc_hypercall_buffer_alloc(xch, to_send, bitmap_size); - to_skip = xc_hypercall_buffer_alloc(xch, to_skip, bitmap_size); - - if (!to_send || !to_skip) { - ERROR("Couldn't allocate bitmap array"); - goto out; - } - - /* Initially all the pages must be sent. */ - memset(to_send, 0xff, bitmap_size); - - /* Enable qemu-dm logging dirty pages to xen */ - if (hvm && callbacks->switch_qemu_logdirty(dom, 1, callbacks->data)) { - ERROR("Unable to enable qemu log-dirty mode"); - goto out; - } - } else { - - /* This is a non-live suspend. Issue the call back to get the - domain suspended */ - - last_iter = 1; - - if (suspend_and_state(callbacks->suspend, callbacks->data, xch, - io_fd, dom, &info)) { - ERROR("Domain appears not to have suspended"); - goto out; - } - - } - - /* copy before use in case someone updating them */ - if (xc_ia64_copy_memmap(xch, info.domid, live_shinfo, - &memmap_info, &memmap_info_num_pages) != 0) { - PERROR("Could not copy memmap"); - goto out; - } - memmap_size = memmap_info_num_pages << PAGE_SHIFT; - - if (xc_ia64_p2m_map(&p2m_table, xch, dom, memmap_info, 0) < 0) { - PERROR("xc_ia64_p2m_map"); - goto out; - } - memmap_info_num_pages_to_send = memmap_info_num_pages; - if (write_exact(io_fd, &memmap_info_num_pages_to_send, - sizeof(memmap_info_num_pages_to_send))) { - PERROR("write: arch.memmap_info_num_pages"); - goto out; - } - if (write_exact(io_fd, memmap_info, memmap_size)) { - PERROR("write: memmap_info"); - goto out; - } - - sent_last_iter = p2m_size; - - copypages: - for (iter = 1; ; iter++) { - unsigned int sent_this_iter, skip_this_iter; - unsigned long N; - - sent_this_iter = 0; - skip_this_iter = 0; - - /* Dirtied pages won't be saved. - slightly wasteful to peek the whole array evey time, - but this is fast enough for the moment. */ - if (!last_iter) { - if (xc_shadow_control(xch, dom, - XEN_DOMCTL_SHADOW_OP_PEEK, - HYPERCALL_BUFFER(to_skip), p2m_size, - NULL, 0, NULL) != p2m_size) { - ERROR("Error peeking shadow bitmap"); - goto out; - } - } - - /* Start writing out the saved-domain record. */ - memmap_desc_start = &memmap_info->memdesc; - memmap_desc_end = memmap_desc_start + memmap_info->efi_memmap_size; - for (p = memmap_desc_start; - p < memmap_desc_end; - p += memmap_info->efi_memdesc_size) { - md = p; - if (md_is_not_ram(md)) - continue; - - for (N = md->phys_addr >> PAGE_SHIFT; - N < (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> - PAGE_SHIFT; - N++) { - - if (!xc_ia64_p2m_allocated(&p2m_table, N)) - continue; - - if (!last_iter) { - if (test_bit(N, to_skip) && test_bit(N, to_send)) - skip_this_iter++; - if (test_bit(N, to_skip) || !test_bit(N, to_send)) - continue; - } else if (live) { - if (!test_bit(N, to_send)) - continue; - } - - if (debug) - fprintf(stderr, "xc_linux_save: page %lx (%lu/%lu)\n", - xc_ia64_p2m_mfn(&p2m_table, N), - N, p2m_size); - - mem = xc_map_foreign_range(xch, dom, PAGE_SIZE, - PROT_READ|PROT_WRITE, N); - if (mem == NULL) { - /* The page may have move. - It will be remarked dirty. - FIXME: to be tracked. */ - fprintf(stderr, "cannot map mfn page %lx gpfn %lx: %s\n", - xc_ia64_p2m_mfn(&p2m_table, N), - N, xc_strerror(xch, errno)); - goto out; - } - - if (write_exact(io_fd, &N, sizeof(N))) { - ERROR("write: p2m_size"); - munmap(mem, PAGE_SIZE); - goto out; - } - - if (write(io_fd, mem, PAGE_SIZE) != PAGE_SIZE) { - ERROR("Error when writing to state file (5)"); - munmap(mem, PAGE_SIZE); - goto out; - } - munmap(mem, PAGE_SIZE); - sent_this_iter++; - total_sent++; - } - } - - if (last_iter) - break; - - DPRINTF(" %d: sent %d, skipped %d\n", - iter, sent_this_iter, skip_this_iter ); - - if (live) { - if ( /* ((sent_this_iter > sent_last_iter) && RATE_IS_MAX()) || */ - (iter >= max_iters) || (sent_this_iter+skip_this_iter < 50) || - (total_sent > p2m_size*max_factor)) { - DPRINTF("Start last iteration\n"); - last_iter = 1; - - if (suspend_and_state(callbacks->suspend, callbacks->data, - xch, io_fd, dom, &info)) { - ERROR("Domain appears not to have suspended"); - goto out; - } - } - - /* Pages to be sent are pages which were dirty. */ - if (xc_shadow_control(xch, dom, - XEN_DOMCTL_SHADOW_OP_CLEAN, - HYPERCALL_BUFFER(to_send), p2m_size, - NULL, 0, NULL ) != p2m_size) { - ERROR("Error flushing shadow PT"); - goto out; - } - - sent_last_iter = sent_this_iter; - - //print_stats(xch, dom, sent_this_iter, &stats, 1); - } - } - - fprintf(stderr, "All memory is saved\n"); - - /* terminate */ - { - unsigned long pfn = INVALID_MFN; - if (write_exact(io_fd, &pfn, sizeof(pfn))) { - ERROR("Error when writing to state file (6)"); - goto out; - } - } - - if (xc_ia64_send_unallocated_list(xch, io_fd, &p2m_table, - memmap_info, - memmap_desc_start, memmap_desc_end)) - goto out; - - if (!hvm) - rc = xc_ia64_pv_send_context(xch, io_fd, - dom, &info, live_shinfo); - else - rc = xc_ia64_hvm_send_context(xch, io_fd, - dom, &info, live_shinfo); - if (rc) - goto out; - - /* Success! */ - rc = 0; - - out: - if ( !rc && callbacks->postcopy ) - callbacks->postcopy(callbacks->data); - - /* Flush last write and discard cache for file. */ - discard_file_cache(xch, io_fd, 1 /* flush */); - - /* checkpoint_cb can spend arbitrarily long in between rounds */ - if (!rc && callbacks->checkpoint && - callbacks->checkpoint(callbacks->data) > 0) - { - /* reset stats timer */ - //print_stats(xch, dom, 0, &stats, 0); - - rc = 1; - /* last_iter = 1; */ - if ( suspend_and_state(callbacks->suspend, callbacks->data, xch, - io_fd, dom, &info) ) - { - ERROR("Domain appears not to have suspended"); - goto out; - } - DPRINTF("SUSPEND shinfo %08lx\n", info.shared_info_frame); - //print_stats(xch, dom, 0, &stats, 1); - - if ( xc_shadow_control(xch, dom, - XEN_DOMCTL_SHADOW_OP_CLEAN, HYPERCALL_BUFFER(to_send), - p2m_size, NULL, 0, NULL) != p2m_size ) - { - ERROR("Error flushing shadow PT"); - } - - goto copypages; - } - - if (live) { - if (xc_shadow_control(xch, dom, - XEN_DOMCTL_SHADOW_OP_OFF, - NULL, 0, NULL, 0, NULL ) < 0) { - DPRINTF("Warning - couldn't disable shadow mode"); - } - if ( hvm && - callbacks->switch_qemu_logdirty(dom, 0, callbacks->data) ) { - DPRINTF("Warning - couldn't disable qemu log-dirty mode"); - } - } - - xc_hypercall_buffer_free(xch, to_send); - xc_hypercall_buffer_free(xch, to_skip); - if (live_shinfo) - munmap(live_shinfo, PAGE_SIZE); - if (memmap_info) - free(memmap_info); - xc_ia64_p2m_unmap(&p2m_table); - - fprintf(stderr,"Save exit rc=%d\n",rc); - - return !!rc; -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/ia64/xc_ia64_save_restore.h xen-4.3.0/tools/libxc/ia64/xc_ia64_save_restore.h --- xen-4.2.2/tools/libxc/ia64/xc_ia64_save_restore.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/xc_ia64_save_restore.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -/****************************************************************************** - * xc_ia64_save_restore.h - * - * Copyright (c) 2006 Isaku Yamahata - * VA Linux Systems Japan K.K. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef XC_IA64_SAVE_RESTORE_H -#define XC_IA64_SR_H - - /* introduced changeset 10692:306d7857928c of xen-ia64-unstable.ht */ -#define XC_IA64_SR_FORMAT_VER_ONE 1UL - /* using foreign p2m exposure version */ -#define XC_IA64_SR_FORMAT_VER_TWO 2UL - /* only pv change: send vcpumap and all vcpu context */ -#define XC_IA64_SR_FORMAT_VER_THREE 3UL -#define XC_IA64_SR_FORMAT_VER_MAX 3UL - -#define XC_IA64_SR_FORMAT_VER_CURRENT XC_IA64_SR_FORMAT_VER_THREE - - -#endif /* XC_IA64_SAVE_RESTORE_H */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/ia64/xc_ia64_stubs.c xen-4.3.0/tools/libxc/ia64/xc_ia64_stubs.c --- xen-4.2.2/tools/libxc/ia64/xc_ia64_stubs.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/ia64/xc_ia64_stubs.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,282 +0,0 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "xg_private.h" -#include "xc_efi.h" -#include "xc_ia64.h" - -/* this is a very ugly way of getting FPSR_DEFAULT. struct ia64_fpreg is - * mysteriously declared in two places: /usr/include/asm/fpu.h and - * /usr/include/bits/sigcontext.h. The former also defines FPSR_DEFAULT, - * the latter doesn't but is included (indirectly) by xg_private.h */ -#define __ASSEMBLY__ -#include -#undef __IA64_UL -#define __IA64_UL(x) ((unsigned long)(x)) -#undef __ASSEMBLY__ - -unsigned long -xc_ia64_fpsr_default(void) -{ - return FPSR_DEFAULT; -} - - -/* It is possible to get memmap_info and memmap by - foreign domain page mapping. But it's racy. Use hypercall to avoid race. */ -static int -xc_ia64_get_memmap(xc_interface *xch, - uint32_t domid, char *buf, unsigned long bufsize) -{ - privcmd_hypercall_t hypercall; - DECLARE_HYPERCALL_BOUNCE(buf, bufsize, XC_HYPERCALL_BUFFER_BOUNCE_OUT); - int ret; - - if ( xc_hypercall_bounce_pre(xch, pfn_buf) ) - { - PERROR("xc_get_pfn_list: pfn_buf bounce failed"); - return -1; - } - - hypercall.op = __HYPERVISOR_ia64_dom0vp_op; - hypercall.arg[0] = IA64_DOM0VP_get_memmap; - hypercall.arg[1] = domid; - hypercall.arg[2] = HYPERCALL_BUFFER_AS_ARG(buf); - hypercall.arg[3] = bufsize; - hypercall.arg[4] = 0; - - ret = do_xen_hypercall(xch, &hypercall); - xc_hypercall_bounce_post(xc, buf); - return ret; -} - -int -xc_ia64_copy_memmap(xc_interface *xch, uint32_t domid, shared_info_t *live_shinfo, - xen_ia64_memmap_info_t **memmap_info_p, - unsigned long *memmap_info_num_pages_p) -{ - unsigned long gpfn_max_prev; - unsigned long gpfn_max_post; - - unsigned long num_pages; - unsigned long num_pages_post; - unsigned long memmap_size; - xen_ia64_memmap_info_t *memmap_info; - - int ret; - - gpfn_max_prev = xc_domain_maximum_gpfn(xch, domid); - if (gpfn_max_prev < 0) - return -1; - - again: - num_pages = live_shinfo->arch.memmap_info_num_pages; - if (num_pages == 0) { - ERROR("num_pages 0x%x", num_pages); - return -1; - } - - memmap_size = num_pages << PAGE_SHIFT; - memmap_info = malloc(memmap_size); - if (memmap_info == NULL) - return -1; - ret = xc_ia64_get_memmap(xch, - domid, (char*)memmap_info, memmap_size); - if (ret != 0) { - free(memmap_info); - return -1; - } - xen_rmb(); - num_pages_post = live_shinfo->arch.memmap_info_num_pages; - if (num_pages != num_pages_post) { - free(memmap_info); - num_pages = num_pages_post; - goto again; - } - - gpfn_max_post = xc_domain_maximum_gpfn(xch, domid); - if (gpfn_max_prev < 0) { - free(memmap_info); - return -1; - } - if (gpfn_max_post > gpfn_max_prev) { - free(memmap_info); - gpfn_max_prev = gpfn_max_post; - goto again; - } - - /* reject unknown memmap */ - if (memmap_info->efi_memdesc_size != sizeof(efi_memory_desc_t) || - (memmap_info->efi_memmap_size / memmap_info->efi_memdesc_size) == 0 || - memmap_info->efi_memmap_size > - (num_pages << PAGE_SHIFT) - sizeof(memmap_info) || - memmap_info->efi_memdesc_version != EFI_MEMORY_DESCRIPTOR_VERSION) { - PERROR("unknown memmap header. defaulting to compat mode."); - free(memmap_info); - return -1; - } - - *memmap_info_p = memmap_info; - if (memmap_info_num_pages_p != NULL) - *memmap_info_num_pages_p = num_pages; - - return 0; -} - -/* - * XXX from xen/include/asm-ia64/linux-xen/asm/pgtable.h - * Should PTRS_PER_PTE be exported by arch-ia64.h? - */ -#define PTRS_PER_PTE (1UL << (PAGE_SHIFT - 3)) - -static void* -xc_ia64_map_foreign_p2m(xc_interface *xch, uint32_t dom, - struct xen_ia64_memmap_info *memmap_info, - unsigned long flags, unsigned long *p2m_size_p) -{ - DECLARE_HYPERCALL_BOUNCE(memmap_info, sizeof(*memmap_info) + memmap_info->efi_memmap_size, XC_HYPERCALL_BOUNCE_BUFFER_IN); - unsigned long gpfn_max; - unsigned long p2m_size; - void *addr; - privcmd_hypercall_t hypercall; - int ret; - int saved_errno; - - gpfn_max = xc_domain_maximum_gpfn(xch, dom); - if (gpfn_max < 0) - return NULL; - p2m_size = - (((gpfn_max + 1) + PTRS_PER_PTE - 1) / PTRS_PER_PTE) << PAGE_SHIFT; - addr = mmap(NULL, p2m_size, PROT_READ, MAP_SHARED, xch->fd, 0); - if (addr == MAP_FAILED) - return NULL; - if (xc_hypercall_bounce_pre(xc, memmap_info)) { - saved_errno = errno; - munmap(addr, p2m_size); - errno = saved_errno; - return NULL; - } - - hypercall.op = __HYPERVISOR_ia64_dom0vp_op; - hypercall.arg[0] = IA64_DOM0VP_expose_foreign_p2m; - hypercall.arg[1] = (unsigned long)addr; - hypercall.arg[2] = dom; - hypercall.arg[3] = HYPERCALL_BUFFER_AS_ARG(memmap_info); - hypercall.arg[4] = flags; - - ret = do_xen_hypercall(xch, &hypercall); - saved_errno = errno; - xc_hypercall_bounce_post(xch, memmap_info); - if (ret < 0) { - munmap(addr, p2m_size); - errno = saved_errno; - return NULL; - } - - *p2m_size_p = p2m_size; - return addr; -} - -void -xc_ia64_p2m_init(struct xen_ia64_p2m_table *p2m_table) -{ - p2m_table->size = 0; - p2m_table->p2m = NULL; -} - -int -xc_ia64_p2m_map(struct xen_ia64_p2m_table *p2m_table, xc_interface *xch, - uint32_t domid, struct xen_ia64_memmap_info *memmap_info, - unsigned long flag) -{ - p2m_table->p2m = xc_ia64_map_foreign_p2m(xch, domid, memmap_info, - flag, &p2m_table->size); - if (p2m_table->p2m == NULL) { - PERROR("Could not map foreign p2m. falling back to old method"); - return -1; - } - return 0; -} - -void -xc_ia64_p2m_unmap(struct xen_ia64_p2m_table *p2m_table) -{ - if (p2m_table->p2m == NULL) - return; - munmap(p2m_table->p2m, p2m_table->size); - //p2m_table->p2m = NULL; - //p2m_table->size = 0; -} - -/* - * XXX from xen/include/asm-ia64/linux-xen/asm/pgtable.h - * Should those be exported by arch-ia64.h? - */ -#define _PAGE_P_BIT 0 -#define _PAGE_P (1UL << _PAGE_P_BIT) /* page present bit */ -#define _PAGE_PGC_ALLOCATED_BIT 59 /* _PGC_allocated */ -#define _PAGE_PGC_ALLOCATED (1UL << _PAGE_PGC_ALLOCATED_BIT) -#define _PAGE_IO_BIT 60 -#define _PAGE_IO (1UL << _PAGE_IO_BIT) - -#define IA64_MAX_PHYS_BITS 50 /* max. number of physical address bits (architected) */ -#define _PAGE_PPN_MASK (((1UL << IA64_MAX_PHYS_BITS) - 1) & ~0xfffUL) - -int -xc_ia64_p2m_present(struct xen_ia64_p2m_table *p2m_table, unsigned long gpfn) -{ - if (sizeof(p2m_table->p2m[0]) * gpfn < p2m_table->size) { - unsigned long pte = p2m_table->p2m[gpfn]; - return !!((pte & _PAGE_P) && !(pte & _PAGE_IO)); - } - return 0; -} - -int -xc_ia64_p2m_allocated(struct xen_ia64_p2m_table *p2m_table, unsigned long gpfn) -{ - if (sizeof(p2m_table->p2m[0]) * gpfn < p2m_table->size) { - unsigned long pte = p2m_table->p2m[gpfn]; - return !!((pte & _PAGE_P) && (pte & _PAGE_PGC_ALLOCATED) && - !(pte & _PAGE_IO)); - } - return 0; -} - -unsigned long -xc_ia64_p2m_mfn(struct xen_ia64_p2m_table *p2m_table, unsigned long gpfn) -{ - unsigned long pte; - - if (sizeof(p2m_table->p2m[0]) * gpfn >= p2m_table->size) - return INVALID_MFN; - pte = p2m_table->p2m[gpfn]; - if (pte & _PAGE_IO) - return INVALID_MFN; - if (!(pte & _PAGE_P)) - return INVALID_MFN; - return (pte & _PAGE_PPN_MASK) >> PAGE_SHIFT; -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/xc_compression.c xen-4.3.0/tools/libxc/xc_compression.c --- xen-4.2.2/tools/libxc/xc_compression.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_compression.c 2013-07-09 10:46:56.000000000 +0000 @@ -544,7 +544,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_core.c xen-4.3.0/tools/libxc/xc_core.c --- xen-4.2.2/tools/libxc/xc_core.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_core.c 2013-07-09 10:46:56.000000000 +0000 @@ -31,7 +31,6 @@ * | .shstrtab | * | .note.Xen | * | .xen_prstatus | - * | .xen_ia64_mmapped_regs if ia64 | * | .xen_shared_info if present | * | .xen_pages | * | .xen_p2m or .xen_pfn | @@ -48,9 +47,6 @@ * |.xen_prstatus | * | vcpu_guest_context_t[nr_vcpus] | * +--------------------------------------------------------+ - * |.xen_ia64_mmapped_regs if ia64 pv | - * | mmapped_regs_t[nr_vcpus] | - * +--------------------------------------------------------+ * |.xen_shared_info if possible | * +--------------------------------------------------------+ * |.xen_pages | @@ -994,7 +990,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_core.h xen-4.3.0/tools/libxc/xc_core.h --- xen-4.2.2/tools/libxc/xc_core.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_core.h 2013-07-09 10:46:56.000000000 +0000 @@ -33,8 +33,6 @@ #define XEN_DUMPCORE_SEC_PFN ".xen_pfn" #define XEN_DUMPCORE_SEC_PAGES ".xen_pages" -#define XEN_DUMPCORE_SEC_IA64_MAPPED_REGS ".xen_ia64_mapped_regs" - /* elf note name */ #define XEN_DUMPCORE_ELFNOTE_NAME "Xen" /* note numbers are defined in xen/elfnote.h */ @@ -153,9 +151,7 @@ #if defined (__i386__) || defined (__x86_64__) # include "xc_core_x86.h" -#elif defined (__ia64__) -# include "xc_core_ia64.h" -#elif defined (__arm__) +#elif defined (__arm__) || defined(__aarch64__) # include "xc_core_arm.h" #else # error "unsupported architecture" @@ -170,7 +166,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_core_arm.c xen-4.3.0/tools/libxc/xc_core_arm.c --- xen-4.2.2/tools/libxc/xc_core_arm.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_core_arm.c 2013-07-09 10:46:56.000000000 +0000 @@ -99,7 +99,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_core_arm.h xen-4.3.0/tools/libxc/xc_core_arm.h --- xen-4.2.2/tools/libxc/xc_core_arm.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_core_arm.h 2013-07-09 10:46:56.000000000 +0000 @@ -52,7 +52,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_core_ia64.c xen-4.3.0/tools/libxc/xc_core_ia64.c --- xen-4.2.2/tools/libxc/xc_core_ia64.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_core_ia64.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,380 +0,0 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Copyright (c) 2007 Isaku Yamahata - * VA Linux Systems Japan K.K. - * - */ - -#include "xg_private.h" -#include "xc_core.h" -#include "xc_efi.h" -#include "xc_dom.h" -#include - -int -xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt, - unsigned long pfn) -{ - if (arch_ctxt->p2m_table.p2m == NULL) - return 1; /* default to trying to map the page */ - - return xc_ia64_p2m_present(&arch_ctxt->p2m_table, pfn); -} - -static int -xc_memory_map_cmp(const void *lhs__, const void *rhs__) -{ - const struct xc_core_memory_map *lhs = - (const struct xc_core_memory_map *)lhs__; - const struct xc_core_memory_map *rhs = - (const struct xc_core_memory_map *)rhs__; - - if (lhs->addr < rhs->addr) - return -1; - if (lhs->addr > rhs->addr) - return 1; - - /* memory map overlap isn't allowed. complain */ -#ifdef DEBUG - fprintf(stderr, "duplicated addresses are detected " - "(0x%" PRIx64 ", 0x%" PRIx64 "), " - "(0x%" PRIx64 ", 0x%" PRIx64 ")\n", - lhs->addr, lhs->size, rhs->addr, rhs->size); -#endif - return 0; -} - -int -xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info) -{ - /* - * on ia64, both paravirtualize domain and hvm domain are - * auto_translated_physmap mode - */ - return 1; -} - -/* see setup_guest() @ xc_linux_build.c */ -static int -memory_map_get_old_domu(xc_interface *xch, xc_dominfo_t *info, - shared_info_any_t *live_shinfo, - xc_core_memory_map_t **mapp, unsigned int *nr_entries) -{ - xc_core_memory_map_t *map = NULL; - - map = malloc(sizeof(*map)); - if ( map == NULL ) - { - PERROR("Could not allocate memory"); - goto out; - } - - map->addr = 0; - map->size = info->max_memkb * 1024; - - *mapp = map; - *nr_entries = 1; - return 0; - -out: - if ( map != NULL ) - free(map); - return -1; -} - -/* see setup_guest() @ xc_ia64_hvm_build.c */ -static int -memory_map_get_old_hvm(xc_interface *xch, xc_dominfo_t *info, - shared_info_any_t *live_shinfo, - xc_core_memory_map_t **mapp, unsigned int *nr_entries) -{ - const xc_core_memory_map_t gfw_map[] = { - {IO_PAGE_START, IO_PAGE_SIZE}, - {STORE_PAGE_START, STORE_PAGE_SIZE}, - {BUFFER_IO_PAGE_START, BUFFER_IO_PAGE_SIZE}, - {BUFFER_PIO_PAGE_START, BUFFER_PIO_PAGE_SIZE}, - {GFW_START, GFW_SIZE}, - }; - const unsigned int nr_gfw_map = sizeof(gfw_map)/sizeof(gfw_map[0]); - xc_core_memory_map_t *map = NULL; - unsigned int i; - -#define VGA_IO_END (VGA_IO_START + VGA_IO_SIZE) - /* [0, VGA_IO_START) [VGA_IO_END, 3GB), [4GB, ...) + gfw_map */ - map = malloc((3 + nr_gfw_map) * sizeof(*map)); - if ( map == NULL ) - { - PERROR("Could not allocate memory"); - goto out; - } - - for ( i = 0; i < nr_gfw_map; i++ ) - map[i] = gfw_map[i]; - map[i].addr = 0; - map[i].size = info->max_memkb * 1024; - i++; - if ( map[i - 1].size < VGA_IO_END ) - { - map[i - 1].size = VGA_IO_START; - } - else - { - map[i].addr = VGA_IO_END; - map[i].size = map[i - 1].size - VGA_IO_END; - map[i - 1].size = VGA_IO_START; - i++; - if ( map[i - 1].addr + map[i - 1].size > MMIO_START ) - { - map[i].addr = MMIO_START + 1 * MEM_G; - map[i].size = map[i - 1].addr + map[i - 1].size - MMIO_START; - map[i - 1].size = MMIO_START - map[i - 1].addr; - i++; - } - } - *mapp = map; - *nr_entries = i; - qsort(map, *nr_entries, sizeof(map[0]), &xc_memory_map_cmp); - return 0; - -out: - if ( map != NULL ) - free(map); - return -1; -} - -static int -memory_map_get_old(xc_interface *xch, xc_dominfo_t *info, - shared_info_any_t *live_shinfo, - xc_core_memory_map_t **mapp, unsigned int *nr_entries) -{ - if ( info->hvm ) - return memory_map_get_old_hvm(xch, info, live_shinfo, - mapp, nr_entries); - if ( live_shinfo == NULL ) - return -1; - return memory_map_get_old_domu(xch, info, live_shinfo, - mapp, nr_entries); -} - -int -xc_core_arch_memory_map_get(xc_interface *xch, - struct xc_core_arch_context *arch_ctxt, - xc_dominfo_t *info, - shared_info_any_t *live_shinfo, - xc_core_memory_map_t **mapp, - unsigned int *nr_entries) -{ - int ret = -1; - - xen_ia64_memmap_info_t *memmap_info = NULL; - xc_core_memory_map_t *map; - char *start; - char *end; - char *p; - efi_memory_desc_t *md; - - if ( live_shinfo == NULL ) - { - ERROR("can't access shared info"); - goto old; - } - - /* copy before use in case someone updating them */ - if (xc_ia64_copy_memmap(xch, info->domid, &live_shinfo->s, - &memmap_info, NULL)) { - goto old; - } - - *nr_entries = memmap_info->efi_memmap_size / memmap_info->efi_memdesc_size; - map = malloc(*nr_entries * sizeof(*md)); - if ( map == NULL ) - { - PERROR("Could not allocate memory for memmap."); - free(memmap_info); - return -1; - } - *mapp = map; - - *nr_entries = 0; - start = (char*)&memmap_info->memdesc; - end = start + memmap_info->efi_memmap_size; - for ( p = start; p < end; p += memmap_info->efi_memdesc_size ) - { - md = (efi_memory_desc_t*)p; - if ( md->type != EFI_CONVENTIONAL_MEMORY || - md->attribute != EFI_MEMORY_WB || - md->num_pages == 0 ) - continue; - - map[*nr_entries].addr = md->phys_addr; - map[*nr_entries].size = md->num_pages << EFI_PAGE_SHIFT; - (*nr_entries)++; - } - ret = 0; - - xc_ia64_p2m_map(&arch_ctxt->p2m_table, xch, info->domid, - memmap_info, 0); - if ( memmap_info != NULL ) - free(memmap_info); - qsort(map, *nr_entries, sizeof(map[0]), &xc_memory_map_cmp); - return ret; - -old: - DPRINTF("Falling back old method.\n"); - return memory_map_get_old(xch, info, live_shinfo, mapp, nr_entries); -} - -int -xc_core_arch_map_p2m(xc_interface *xch, unsigned int guest_width, xc_dominfo_t *info, - shared_info_any_t *live_shinfo, xen_pfn_t **live_p2m, - unsigned long *pfnp) -{ - /* - * on ia64, both paravirtualize domain and hvm domain are - * auto_translated_physmap mode - */ - errno = ENOSYS; - return -1; -} - -void -xc_core_arch_context_init(struct xc_core_arch_context* arch_ctxt) -{ - arch_ctxt->mapped_regs_size = - (XMAPPEDREGS_SIZE < PAGE_SIZE) ? PAGE_SIZE: XMAPPEDREGS_SIZE; - arch_ctxt->nr_vcpus = 0; - arch_ctxt->mapped_regs = NULL; - - xc_ia64_p2m_init(&arch_ctxt->p2m_table); -} - -void -xc_core_arch_context_free(struct xc_core_arch_context* arch_ctxt) -{ - int i; - for ( i = 0; i < arch_ctxt->nr_vcpus; i++ ) - if ( arch_ctxt->mapped_regs[i] != NULL ) - munmap(arch_ctxt->mapped_regs[i], arch_ctxt->mapped_regs_size); - free(arch_ctxt->mapped_regs); - xc_ia64_p2m_unmap(&arch_ctxt->p2m_table); -} - -int -xc_core_arch_context_get(struct xc_core_arch_context* arch_ctxt, - vcpu_guest_context_any_t* ctxt_any, - xc_interface *xch, uint32_t domid) -{ - vcpu_guest_context_t *ctxt = &ctxt_any->c; - mapped_regs_t* mapped_regs; - - if ( ctxt->privregs_pfn == VGC_PRIVREGS_HVM ) - return 0; /* VTi domain case */ - - if ( ctxt->privregs_pfn == INVALID_P2M_ENTRY ) - { - PERROR("Could not get mmapped privregs gmfn"); - errno = ENOENT; - return -1; - } - if ( !(arch_ctxt->nr_vcpus & (arch_ctxt->nr_vcpus - 1)) ) { - unsigned int nr = arch_ctxt->nr_vcpus ? arch_ctxt->nr_vcpus << 1 : 1; - mapped_regs_t** new = realloc(arch_ctxt->mapped_regs, - nr * sizeof(*new)); - - if ( !new ) - { - PERROR("Could not alloc mapped regs pointer array"); - return -1; - } - memset(new + arch_ctxt->nr_vcpus, 0, - (nr - arch_ctxt->nr_vcpus) * sizeof(*new)); - arch_ctxt->mapped_regs = new; - } - - mapped_regs = xc_map_foreign_range(xch, domid, - arch_ctxt->mapped_regs_size, - PROT_READ, ctxt->privregs_pfn); - if ( mapped_regs == NULL ) - { - PERROR("Could not map mapped privregs"); - return -1; - } - arch_ctxt->mapped_regs[arch_ctxt->nr_vcpus] = mapped_regs; - arch_ctxt->nr_vcpus++; - return 0; -} - -int -xc_core_arch_context_get_shdr(xc_interface *xch, - struct xc_core_arch_context *arch_ctxt, - struct xc_core_section_headers *sheaders, - struct xc_core_strtab *strtab, - uint64_t *filesz, uint64_t offset) -{ - int sts = -1; - Elf64_Shdr *shdr; - - if ( arch_ctxt->nr_vcpus == 0 ) - { - /* VTi domain case */ - *filesz = 0; - return 0; - } - - /* mmapped priv regs */ - shdr = xc_core_shdr_get(xch, sheaders); - if ( shdr == NULL ) - { - PERROR("Could not get section header for .xen_ia64_mapped_regs"); - return sts; - } - *filesz = arch_ctxt->mapped_regs_size * arch_ctxt->nr_vcpus; - sts = xc_core_shdr_set(xch, shdr, strtab, - XEN_DUMPCORE_SEC_IA64_MAPPED_REGS, - SHT_PROGBITS, offset, *filesz, - __alignof__(*arch_ctxt->mapped_regs[0]), - arch_ctxt->mapped_regs_size); - return sts; -} - -int -xc_core_arch_context_dump(xc_interface *xch, - struct xc_core_arch_context* arch_ctxt, - void* args, dumpcore_rtn_t dump_rtn) -{ - int sts = 0; - int i; - - /* ia64 mapped_regs: .xen_ia64_mapped_regs */ - for ( i = 0; i < arch_ctxt->nr_vcpus; i++ ) - { - sts = dump_rtn(xch, args, (char*)arch_ctxt->mapped_regs[i], - arch_ctxt->mapped_regs_size); - if ( sts != 0 ) - break; - } - return sts; -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/xc_core_ia64.h xen-4.3.0/tools/libxc/xc_core_ia64.h --- xen-4.2.2/tools/libxc/xc_core_ia64.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_core_ia64.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -/* - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Copyright (c) 2007 Isaku Yamahata - * VA Linux Systems Japan K.K. - * - */ - -#ifndef XC_CORE_IA64_H -#define XC_CORE_IA64_H - -#include "ia64/xc_ia64.h" - -#define ELF_ARCH_DATA ELFDATA2LSB -#define ELF_ARCH_MACHINE EM_IA_64 - -struct xc_core_arch_context { - size_t mapped_regs_size; - int nr_vcpus; - mapped_regs_t** mapped_regs; - - struct xen_ia64_p2m_table p2m_table; -}; - -void -xc_core_arch_context_init(struct xc_core_arch_context* arch_ctxt); -void -xc_core_arch_context_free(struct xc_core_arch_context* arch_ctxt); -int -xc_core_arch_context_get(struct xc_core_arch_context* arch_ctxt, - vcpu_guest_context_any_t* ctxt, - xc_interface *xch, uint32_t domid); -int -xc_core_arch_context_get_shdr(xc_interface *xch, - struct xc_core_arch_context* arch_ctxt, - struct xc_core_section_headers *sheaders, - struct xc_core_strtab *strtab, - uint64_t *filesz, uint64_t offset); -int -xc_core_arch_context_dump(xc_interface *xch, - struct xc_core_arch_context* arch_ctxt, - void* args, dumpcore_rtn_t dump_rtn); - -int -xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt, - unsigned long pfn); - -#endif /* XC_CORE_IA64_H */ - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/xc_core_x86.c xen-4.3.0/tools/libxc/xc_core_x86.c --- xen-4.2.2/tools/libxc/xc_core_x86.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_core_x86.c 2013-07-09 10:46:56.000000000 +0000 @@ -214,7 +214,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_core_x86.h xen-4.3.0/tools/libxc/xc_core_x86.h --- xen-4.2.2/tools/libxc/xc_core_x86.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_core_x86.h 2013-07-09 10:46:56.000000000 +0000 @@ -53,7 +53,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_cpufeature.h xen-4.3.0/tools/libxc/xc_cpufeature.h --- xen-4.2.2/tools/libxc/xc_cpufeature.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_cpufeature.h 2013-07-09 10:46:56.000000000 +0000 @@ -128,6 +128,7 @@ /* Intel-defined CPU features, CPUID level 0x00000007:0 (ebx) */ #define X86_FEATURE_FSGSBASE 0 /* {RD,WR}{FS,GS}BASE instructions */ +#define X86_FEATURE_TSC_ADJUST 1 /* Tsc thread offset */ #define X86_FEATURE_BMI1 3 /* 1st group bit manipulation extensions */ #define X86_FEATURE_HLE 4 /* Hardware Lock Elision */ #define X86_FEATURE_AVX2 5 /* AVX2 instructions */ diff -Nru xen-4.2.2/tools/libxc/xc_cpuid_x86.c xen-4.3.0/tools/libxc/xc_cpuid_x86.c --- xen-4.2.2/tools/libxc/xc_cpuid_x86.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_cpuid_x86.c 2013-07-09 10:46:56.000000000 +0000 @@ -362,7 +362,8 @@ case 0x00000007: /* Intel-defined CPU features */ if ( input[1] == 0 ) { - regs[1] &= (bitmaskof(X86_FEATURE_BMI1) | + regs[1] &= (bitmaskof(X86_FEATURE_TSC_ADJUST) | + bitmaskof(X86_FEATURE_BMI1) | bitmaskof(X86_FEATURE_HLE) | bitmaskof(X86_FEATURE_AVX2) | bitmaskof(X86_FEATURE_SMEP) | @@ -589,6 +590,8 @@ static char *alloc_str(void) { char *s = malloc(33); + if ( s == NULL ) + return s; memset(s, 0, 33); return s; } @@ -600,6 +603,8 @@ for ( i = 0; i < 4; i++ ) { strs[i] = alloc_str(); + if ( strs[i] == NULL ) + continue; for ( j = 0; j < 32; j++ ) strs[i][j] = !!((regs[i] & (1U << (31 - j)))) ? '1' : '0'; } @@ -680,7 +685,7 @@ const char **config, char **config_transformed) { - int i, j; + int i, j, rc; unsigned int regs[4]; memset(config_transformed, 0, 4 * sizeof(*config_transformed)); @@ -692,6 +697,11 @@ if ( config[i] == NULL ) continue; config_transformed[i] = alloc_str(); + if ( config_transformed[i] == NULL ) + { + rc = -ENOMEM; + goto fail_rc; + } for ( j = 0; j < 32; j++ ) { unsigned char val = !!((regs[i] & (1U << (31 - j)))); @@ -708,12 +718,14 @@ return 0; fail: + rc = -EPERM; + fail_rc: for ( i = 0; i < 4; i++ ) { free(config_transformed[i]); config_transformed[i] = NULL; } - return -EPERM; + return rc; } /* @@ -758,6 +770,11 @@ } config_transformed[i] = alloc_str(); + if ( config_transformed[i] == NULL ) + { + rc = -ENOMEM; + goto fail; + } for ( j = 0; j < 32; j++ ) { diff -Nru xen-4.2.2/tools/libxc/xc_cpupool.c xen-4.3.0/tools/libxc/xc_cpupool.c --- xen-4.2.2/tools/libxc/xc_cpupool.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_cpupool.c 2013-07-09 10:46:56.000000000 +0000 @@ -90,7 +90,7 @@ sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_INFO; sysctl.u.cpupool_op.cpupool_id = poolid; set_xen_guest_handle(sysctl.u.cpupool_op.cpumap.bitmap, local); - sysctl.u.cpupool_op.cpumap.nr_cpus = local_size * 8; + sysctl.u.cpupool_op.cpumap.nr_bits = local_size * 8; err = do_sysctl_save(xch, &sysctl); @@ -184,7 +184,7 @@ sysctl.cmd = XEN_SYSCTL_cpupool_op; sysctl.u.cpupool_op.op = XEN_SYSCTL_CPUPOOL_OP_FREEINFO; set_xen_guest_handle(sysctl.u.cpupool_op.cpumap.bitmap, local); - sysctl.u.cpupool_op.cpumap.nr_cpus = mapsize * 8; + sysctl.u.cpupool_op.cpumap.nr_bits = mapsize * 8; err = do_sysctl_save(xch, &sysctl); diff -Nru xen-4.2.2/tools/libxc/xc_dom.h xen-4.3.0/tools/libxc/xc_dom.h --- xen-4.2.2/tools/libxc/xc_dom.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom.h 2013-07-09 10:46:56.000000000 +0000 @@ -92,10 +92,24 @@ /* other state info */ uint32_t f_active[XENFEAT_NR_SUBMAPS]; + /* + * p2m_host maps guest physical addresses an offset from + * rambase_pfn (see below) into gfns. + * + * For a pure PV guest this means that it maps GPFNs into MFNs for + * a hybrid guest this means that it maps GPFNs to GPFNS. + * + * Note that the input is offset by rambase. + */ xen_pfn_t *p2m_host; void *p2m_guest; - /* physical memory */ + /* physical memory + * + * A PV guest has a single contiguous block of physical RAM, + * consisting of total_pages starting at rambase_pfn. + */ + xen_pfn_t rambase_pfn; xen_pfn_t total_pages; struct xc_dom_phys *phys_pages; int realmodearea_log; @@ -121,6 +135,7 @@ domid_t guest_domid; int8_t vhpt_size_log2; /* for IA64 */ int8_t superpages; + int claim_enabled; /* 0 by default, 1 enables it */ int shadow_enabled; int xen_version; @@ -140,9 +155,10 @@ struct xc_dom_loader { char *name; - int (*probe) (struct xc_dom_image * dom); - int (*parser) (struct xc_dom_image * dom); - int (*loader) (struct xc_dom_image * dom); + /* Sadly the error returns from these functions are not consistent: */ + elf_negerrnoval (*probe) (struct xc_dom_image * dom); + elf_negerrnoval (*parser) (struct xc_dom_image * dom); + elf_errorstatus (*loader) (struct xc_dom_image * dom); struct xc_dom_loader *next; }; @@ -236,6 +252,7 @@ xen_pfn_t xenstore_gmfn, domid_t console_domid, domid_t xenstore_domid); +int xc_dom_feature_translated(struct xc_dom_image *dom); /* --- debugging bits ---------------------------------------------- */ @@ -275,39 +292,59 @@ void *xc_dom_pfn_to_ptr(struct xc_dom_image *dom, xen_pfn_t first, xen_pfn_t count); +void *xc_dom_pfn_to_ptr_retcount(struct xc_dom_image *dom, xen_pfn_t first, + xen_pfn_t count, xen_pfn_t *count_out); void xc_dom_unmap_one(struct xc_dom_image *dom, xen_pfn_t pfn); void xc_dom_unmap_all(struct xc_dom_image *dom); -static inline void *xc_dom_seg_to_ptr(struct xc_dom_image *dom, - struct xc_dom_seg *seg) +static inline void *xc_dom_seg_to_ptr_pages(struct xc_dom_image *dom, + struct xc_dom_seg *seg, + xen_pfn_t *pages_out) { xen_vaddr_t segsize = seg->vend - seg->vstart; unsigned int page_size = XC_DOM_PAGE_SIZE(dom); xen_pfn_t pages = (segsize + page_size - 1) / page_size; + void *retval; + + retval = xc_dom_pfn_to_ptr(dom, seg->pfn, pages); - return xc_dom_pfn_to_ptr(dom, seg->pfn, pages); + *pages_out = retval ? pages : 0; + return retval; +} + +static inline void *xc_dom_seg_to_ptr(struct xc_dom_image *dom, + struct xc_dom_seg *seg) +{ + xen_pfn_t dummy; + + return xc_dom_seg_to_ptr_pages(dom, seg, &dummy); } static inline void *xc_dom_vaddr_to_ptr(struct xc_dom_image *dom, - xen_vaddr_t vaddr) + xen_vaddr_t vaddr, + size_t *safe_region_out) { unsigned int page_size = XC_DOM_PAGE_SIZE(dom); xen_pfn_t page = (vaddr - dom->parms.virt_base) / page_size; unsigned int offset = (vaddr - dom->parms.virt_base) % page_size; - void *ptr = xc_dom_pfn_to_ptr(dom, page, 0); - return (ptr ? (ptr + offset) : NULL); -} + xen_pfn_t safe_region_count; + void *ptr; -static inline int xc_dom_feature_translated(struct xc_dom_image *dom) -{ - return elf_xen_feature_get(XENFEAT_auto_translated_physmap, dom->f_active); + *safe_region_out = 0; + ptr = xc_dom_pfn_to_ptr_retcount(dom, page, 0, &safe_region_count); + if ( ptr == NULL ) + return ptr; + *safe_region_out = (safe_region_count << XC_DOM_PAGE_SHIFT(dom)) - offset; + return ptr; } static inline xen_pfn_t xc_dom_p2m_host(struct xc_dom_image *dom, xen_pfn_t pfn) { if (dom->shadow_enabled) return pfn; - return dom->p2m_host[pfn]; + if (pfn < dom->rambase_pfn || pfn >= dom->rambase_pfn + dom->total_pages) + return INVALID_MFN; + return dom->p2m_host[pfn - dom->rambase_pfn]; } static inline xen_pfn_t xc_dom_p2m_guest(struct xc_dom_image *dom, @@ -315,7 +352,9 @@ { if (xc_dom_feature_translated(dom)) return pfn; - return dom->p2m_host[pfn]; + if (pfn < dom->rambase_pfn || pfn >= dom->rambase_pfn + dom->total_pages) + return INVALID_MFN; + return dom->p2m_host[pfn - dom->rambase_pfn]; } /* --- arch bits --------------------------------------------------- */ @@ -327,7 +366,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_dom_arm.c xen-4.3.0/tools/libxc/xc_dom_arm.c --- xen-4.2.2/tools/libxc/xc_dom_arm.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_arm.c 2013-07-09 10:46:56.000000000 +0000 @@ -18,14 +18,180 @@ * Copyright (c) 2011, Citrix Systems */ #include + #include +#include + #include "xg_private.h" #include "xc_dom.h" +#define NR_MAGIC_PAGES 2 +#define CONSOLE_PFN_OFFSET 0 +#define XENSTORE_PFN_OFFSET 1 + +/* get guest IO ABI protocol */ +const char *xc_domain_get_native_protocol(xc_interface *xch, + uint32_t domid) +{ + return XEN_IO_PROTO_ABI_ARM; +} + +/* ------------------------------------------------------------------------ */ +/* + * arm guests are hybrid and start off with paging disabled, therefore no + * pagetables and nothing to do here. + */ +static int count_pgtables_arm(struct xc_dom_image *dom) +{ + DOMPRINTF_CALLED(dom->xch); + return 0; +} + +static int setup_pgtables_arm(struct xc_dom_image *dom) +{ + DOMPRINTF_CALLED(dom->xch); + return 0; +} + +/* ------------------------------------------------------------------------ */ + +static int alloc_magic_pages(struct xc_dom_image *dom) +{ + int rc, i; + xen_pfn_t p2m[NR_MAGIC_PAGES]; + + DOMPRINTF_CALLED(dom->xch); + + for (i = 0; i < NR_MAGIC_PAGES; i++) + p2m[i] = dom->rambase_pfn + dom->total_pages + i; + + rc = xc_domain_populate_physmap_exact( + dom->xch, dom->guest_domid, NR_MAGIC_PAGES, + 0, 0, p2m); + if ( rc < 0 ) + return rc; + + dom->console_pfn = dom->rambase_pfn + dom->total_pages + CONSOLE_PFN_OFFSET; + dom->xenstore_pfn = dom->rambase_pfn + dom->total_pages + XENSTORE_PFN_OFFSET; + + xc_clear_domain_page(dom->xch, dom->guest_domid, dom->console_pfn); + xc_clear_domain_page(dom->xch, dom->guest_domid, dom->xenstore_pfn); + xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_PFN, + dom->console_pfn); + xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_STORE_PFN, + dom->xenstore_pfn); + /* allocated by toolstack */ + xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_CONSOLE_EVTCHN, + dom->console_evtchn); + xc_set_hvm_param(dom->xch, dom->guest_domid, HVM_PARAM_STORE_EVTCHN, + dom->xenstore_evtchn); + + return 0; +} + +/* ------------------------------------------------------------------------ */ + +static int start_info_arm(struct xc_dom_image *dom) +{ + DOMPRINTF_CALLED(dom->xch); + return 0; +} + +static int shared_info_arm(struct xc_dom_image *dom, void *ptr) +{ + DOMPRINTF_CALLED(dom->xch); + return 0; +} + +/* ------------------------------------------------------------------------ */ + +static int vcpu_arm(struct xc_dom_image *dom, void *ptr) +{ + vcpu_guest_context_t *ctxt = ptr; + + DOMPRINTF_CALLED(dom->xch); + + /* clear everything */ + memset(ctxt, 0, sizeof(*ctxt)); + + ctxt->user_regs.pc32 = dom->parms.virt_entry; + + /* Linux boot protocol. See linux.Documentation/arm/Booting. */ + ctxt->user_regs.r0_usr = 0; /* SBZ */ + /* Machine ID: We use DTB therefore no machine id */ + ctxt->user_regs.r1_usr = 0xffffffff; + /* ATAGS/DTB: We currently require that the guest kernel to be + * using CONFIG_ARM_APPENDED_DTB. Ensure that r2 does not look + * like a valid pointer to a set of ATAGS or a DTB. + */ + ctxt->user_regs.r2_usr = 0xffffffff; + + ctxt->sctlr = /* #define SCTLR_BASE */0x00c50078; + + ctxt->ttbr0 = 0; + ctxt->ttbr1 = 0; + ctxt->ttbcr = 0; /* Defined Reset Value */ + + ctxt->user_regs.cpsr = PSR_ABT_MASK|PSR_FIQ_MASK|PSR_IRQ_MASK|PSR_MODE_SVC; + + ctxt->flags = VGCF_online; + + DOMPRINTF("Initial state CPSR %#"PRIx32" PC %#"PRIx32, + ctxt->user_regs.cpsr, ctxt->user_regs.pc32); + + return 0; +} + +/* ------------------------------------------------------------------------ */ + +static struct xc_dom_arch xc_dom_32 = { + .guest_type = "xen-3.0-armv7l", + .native_protocol = XEN_IO_PROTO_ABI_ARM, + .page_shift = PAGE_SHIFT_ARM, + .sizeof_pfn = 8, + .alloc_magic_pages = alloc_magic_pages, + .count_pgtables = count_pgtables_arm, + .setup_pgtables = setup_pgtables_arm, + .start_info = start_info_arm, + .shared_info = shared_info_arm, + .vcpu = vcpu_arm, +}; + +static void __init register_arch_hooks(void) +{ + xc_dom_register_arch_hooks(&xc_dom_32); +} + int arch_setup_meminit(struct xc_dom_image *dom) { - errno = ENOSYS; - return -1; + int rc; + xen_pfn_t pfn, allocsz, i; + + dom->shadow_enabled = 1; + + dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom->total_pages); + if ( dom->p2m_host == NULL ) + return -EINVAL; + + /* setup initial p2m */ + for ( pfn = 0; pfn < dom->total_pages; pfn++ ) + dom->p2m_host[pfn] = pfn + dom->rambase_pfn; + + /* allocate guest memory */ + for ( i = rc = allocsz = 0; + (i < dom->total_pages) && !rc; + i += allocsz ) + { + allocsz = dom->total_pages - i; + if ( allocsz > 1024*1024 ) + allocsz = 1024*1024; + + rc = xc_domain_populate_physmap_exact( + dom->xch, dom->guest_domid, allocsz, + 0, 0, &dom->p2m_host[i]); + } + + return 0; } int arch_setup_bootearly(struct xc_dom_image *dom) @@ -36,13 +202,23 @@ int arch_setup_bootlate(struct xc_dom_image *dom) { - DOMPRINTF("%s: doing nothing", __FUNCTION__); + /* XXX + * map shared info + * map grant tables + * setup shared info + */ return 0; } + +int xc_dom_feature_translated(struct xc_dom_image *dom) +{ + return 1; +} + /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_dom_armzimageloader.c xen-4.3.0/tools/libxc/xc_dom_armzimageloader.c --- xen-4.2.2/tools/libxc/xc_dom_armzimageloader.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_armzimageloader.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,181 @@ +/* + * Xen domain builder -- ARM zImage bits + * + * Parse and load ARM zImage kernel images. + * + * Copyright (C) 2012, Citrix Systems. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include + +#include "xg_private.h" +#include "xc_dom.h" + +#include /* XXX ntohl is not the right function... */ + +/* + * Guest virtual RAM starts here. This must be consistent with the DTB + * appended to the guest kernel. + */ +#define GUEST_RAM_BASE 0x80000000 + +#define ZIMAGE_MAGIC_OFFSET 0x24 +#define ZIMAGE_START_OFFSET 0x28 +#define ZIMAGE_END_OFFSET 0x2c + +#define ZIMAGE_MAGIC 0x016f2818 + +struct minimal_dtb_header { + uint32_t magic; + uint32_t total_size; + /* There are other fields but we don't use them yet. */ +}; + +#define DTB_MAGIC 0xd00dfeed + +static int xc_dom_probe_zimage_kernel(struct xc_dom_image *dom) +{ + uint32_t *zimage; + uint32_t end; + + if ( dom->kernel_blob == NULL ) + { + xc_dom_panic(dom->xch, XC_INTERNAL_ERROR, + "%s: no kernel image loaded", __FUNCTION__); + return -EINVAL; + } + + if ( dom->kernel_size < 0x30 /*sizeof(struct setup_header)*/ ) + { + xc_dom_printf(dom->xch, "%s: kernel image too small", __FUNCTION__); + return -EINVAL; + } + + zimage = (uint32_t *)dom->kernel_blob; + if ( zimage[ZIMAGE_MAGIC_OFFSET/4] != ZIMAGE_MAGIC ) + { + xc_dom_printf(dom->xch, "%s: kernel is not a bzImage", __FUNCTION__); + return -EINVAL; + } + + end = zimage[ZIMAGE_END_OFFSET/4]; + + /* + * Check for an appended DTB. + */ + if ( end + sizeof(struct minimal_dtb_header) < dom->kernel_size ) { + struct minimal_dtb_header *dtb_hdr; + dtb_hdr = (struct minimal_dtb_header *)(dom->kernel_blob + end); + if (ntohl/*be32_to_cpu*/(dtb_hdr->magic) == DTB_MAGIC) { + xc_dom_printf(dom->xch, "%s: found an appended DTB", __FUNCTION__); + end += ntohl/*be32_to_cpu*/(dtb_hdr->total_size); + } + } + + dom->kernel_size = end; + + return 0; +} + +static int xc_dom_parse_zimage_kernel(struct xc_dom_image *dom) +{ + uint32_t *zimage; + uint32_t start, entry_addr; + uint64_t v_start, v_end; + uint64_t rambase = GUEST_RAM_BASE; + + DOMPRINTF_CALLED(dom->xch); + + zimage = (uint32_t *)dom->kernel_blob; + + dom->rambase_pfn = rambase >> XC_PAGE_SHIFT; + + /* Do not load kernel at the very first RAM address */ + v_start = rambase + 0x8000; + v_end = v_start + dom->kernel_size; + + start = zimage[ZIMAGE_START_OFFSET/4]; + + if (start == 0) + entry_addr = v_start; + else + entry_addr = start; + + /* find kernel segment */ + dom->kernel_seg.vstart = v_start; + dom->kernel_seg.vend = v_end; + + dom->parms.virt_entry = entry_addr; + dom->parms.virt_base = rambase; + + dom->guest_type = "xen-3.0-armv7l"; + DOMPRINTF("%s: %s: RAM starts at %"PRI_xen_pfn, + __FUNCTION__, dom->guest_type, dom->rambase_pfn); + DOMPRINTF("%s: %s: 0x%" PRIx64 " -> 0x%" PRIx64 "", + __FUNCTION__, dom->guest_type, + dom->kernel_seg.vstart, dom->kernel_seg.vend); + return 0; +} + +static int xc_dom_load_zimage_kernel(struct xc_dom_image *dom) +{ + void *dst; + + DOMPRINTF_CALLED(dom->xch); + + dst = xc_dom_seg_to_ptr(dom, &dom->kernel_seg); + if ( dst == NULL ) + { + DOMPRINTF("%s: xc_dom_seg_to_ptr(dom, &dom->kernel_seg) => NULL", + __func__); + return -1; + } + + DOMPRINTF("%s: kernel sed %#"PRIx64"-%#"PRIx64, + __func__, dom->kernel_seg.vstart, dom->kernel_seg.vend); + DOMPRINTF("%s: copy %zd bytes from blob %p to dst %p", + __func__, dom->kernel_size, dom->kernel_blob, dst); + + memcpy(dst, dom->kernel_blob, dom->kernel_size); + + return 0; +} + +static struct xc_dom_loader zimage_loader = { + .name = "Linux zImage (ARM)", + .probe = xc_dom_probe_zimage_kernel, + .parser = xc_dom_parse_zimage_kernel, + .loader = xc_dom_load_zimage_kernel, +}; + +static void __init register_loader(void) +{ + xc_dom_register_loader(&zimage_loader); +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff -Nru xen-4.2.2/tools/libxc/xc_dom_binloader.c xen-4.3.0/tools/libxc/xc_dom_binloader.c --- xen-4.2.2/tools/libxc/xc_dom_binloader.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_binloader.c 2013-07-09 10:46:56.000000000 +0000 @@ -123,10 +123,13 @@ uint32_t *probe_ptr; uint32_t *probe_end; + if ( dom->kernel_size < sizeof(*table) ) + return NULL; probe_ptr = dom->kernel_blob; - probe_end = dom->kernel_blob + dom->kernel_size - sizeof(*table); - if ( (void*)probe_end > (dom->kernel_blob + 8192) ) + if ( dom->kernel_size > (8192 + sizeof(*table)) ) probe_end = dom->kernel_blob + 8192; + else + probe_end = dom->kernel_blob + dom->kernel_size - sizeof(*table); for ( table = NULL; probe_ptr < probe_end; probe_ptr++ ) { @@ -249,6 +252,7 @@ char *image = dom->kernel_blob; char *dest; size_t image_size = dom->kernel_size; + size_t dest_size; uint32_t start_addr; uint32_t load_end_addr; uint32_t bss_end_addr; @@ -272,7 +276,29 @@ DOMPRINTF(" text_size: 0x%" PRIx32 "", text_size); DOMPRINTF(" bss_size: 0x%" PRIx32 "", bss_size); - dest = xc_dom_vaddr_to_ptr(dom, dom->kernel_seg.vstart); + dest = xc_dom_vaddr_to_ptr(dom, dom->kernel_seg.vstart, &dest_size); + if ( dest == NULL ) + { + DOMPRINTF("%s: xc_dom_vaddr_to_ptr(dom, dom->kernel_seg.vstart)" + " => NULL", __FUNCTION__); + return -EINVAL; + } + + if ( dest_size < text_size || + dest_size - text_size < bss_size ) + { + DOMPRINTF("%s: mapped region is too small for image", __FUNCTION__); + return -EINVAL; + } + + if ( image_size < skip || + image_size - skip < text_size ) + { + DOMPRINTF("%s: image is too small for declared text size", + __FUNCTION__); + return -EINVAL; + } + memcpy(dest, image + skip, text_size); memset(dest + text_size, 0, bss_size); @@ -296,7 +322,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_dom_boot.c xen-4.3.0/tools/libxc/xc_dom_boot.c --- xen-4.2.2/tools/libxc/xc_dom_boot.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_boot.c 2013-07-09 10:46:56.000000000 +0000 @@ -213,7 +213,7 @@ DOMPRINTF_CALLED(dom->xch); - /* misc ia64 stuff*/ + /* misc stuff*/ if ( (rc = arch_setup_bootearly(dom)) != 0 ) return rc; @@ -416,25 +416,22 @@ int xc_dom_gnttab_init(struct xc_dom_image *dom) { - xen_pfn_t console_gmfn; - xen_pfn_t xenstore_gmfn; - int autotranslated; - - autotranslated = xc_dom_feature_translated(dom); - console_gmfn = autotranslated ? - dom->console_pfn : xc_dom_p2m_host(dom, dom->console_pfn); - xenstore_gmfn = autotranslated ? - dom->xenstore_pfn : xc_dom_p2m_host(dom, dom->xenstore_pfn); - - return xc_dom_gnttab_seed(dom->xch, dom->guest_domid, - console_gmfn, xenstore_gmfn, - dom->console_domid, dom->xenstore_domid); + if ( xc_dom_feature_translated(dom) ) { + return xc_dom_gnttab_hvm_seed(dom->xch, dom->guest_domid, + dom->console_pfn, dom->xenstore_pfn, + dom->console_domid, dom->xenstore_domid); + } else { + return xc_dom_gnttab_seed(dom->xch, dom->guest_domid, + xc_dom_p2m_host(dom, dom->console_pfn), + xc_dom_p2m_host(dom, dom->xenstore_pfn), + dom->console_domid, dom->xenstore_domid); + } } /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_dom_bzimageloader.c xen-4.3.0/tools/libxc/xc_dom_bzimageloader.c --- xen-4.2.2/tools/libxc/xc_dom_bzimageloader.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_bzimageloader.c 2013-07-09 10:46:56.000000000 +0000 @@ -35,6 +35,8 @@ #include "xg_private.h" #include "xc_dom.h" +#ifndef __MINIOS__ + #if defined(HAVE_BZLIB) #include @@ -562,6 +564,15 @@ #endif +#else /* __MINIOS__ */ + +int xc_try_bzip2_decode(struct xc_dom_image *dom, void **blob, size_t *size); +int xc_try_lzma_decode(struct xc_dom_image *dom, void **blob, size_t *size); +int xc_try_lzo1x_decode(struct xc_dom_image *dom, void **blob, size_t *size); +int xc_try_xz_decode(struct xc_dom_image *dom, void **blob, size_t *size); + +#endif /* !__MINIOS__ */ + struct setup_header { uint8_t _pad0[0x1f1]; /* skip uninteresting stuff */ uint8_t setup_sects; @@ -757,7 +768,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_dom_compat_linux.c xen-4.3.0/tools/libxc/xc_dom_compat_linux.c --- xen-4.2.2/tools/libxc/xc_dom_compat_linux.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_compat_linux.c 2013-07-09 10:46:56.000000000 +0000 @@ -190,7 +190,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_dom_core.c xen-4.3.0/tools/libxc/xc_dom_core.c --- xen-4.2.2/tools/libxc/xc_dom_core.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_core.c 2013-07-09 10:46:56.000000000 +0000 @@ -120,9 +120,17 @@ { struct xc_dom_mem *block; + if ( size > SIZE_MAX - sizeof(*block) ) + { + DOMPRINTF("%s: unreasonable allocation size", __FUNCTION__); + return NULL; + } block = malloc(sizeof(*block) + size); if ( block == NULL ) + { + DOMPRINTF("%s: allocation failed", __FUNCTION__); return NULL; + } memset(block, 0, sizeof(*block) + size); block->next = dom->memblocks; dom->memblocks = block; @@ -138,7 +146,10 @@ block = malloc(sizeof(*block)); if ( block == NULL ) + { + DOMPRINTF("%s: allocation failed", __FUNCTION__); return NULL; + } memset(block, 0, sizeof(*block)); block->mmap_len = size; block->mmap_ptr = mmap(NULL, block->mmap_len, @@ -146,6 +157,7 @@ -1, 0); if ( block->mmap_ptr == MAP_FAILED ) { + DOMPRINTF("%s: mmap failed", __FUNCTION__); free(block); return NULL; } @@ -202,6 +214,7 @@ close(fd); if ( block != NULL ) free(block); + DOMPRINTF("%s: failed (on file `%s')", __FUNCTION__, filename); return NULL; } @@ -271,6 +284,11 @@ unsigned char *gzlen; size_t unziplen; + if ( ziplen < 6 ) + /* Too small. We need (i.e. the subsequent code relies on) + * 2 bytes for the magic number plus 4 bytes length. */ + return 0; + if ( strncmp(blob, "\037\213", 2) ) /* not gzipped */ return 0; @@ -351,16 +369,27 @@ void *xc_dom_pfn_to_ptr(struct xc_dom_image *dom, xen_pfn_t pfn, xen_pfn_t count) { + xen_pfn_t count_out_dummy; + return xc_dom_pfn_to_ptr_retcount(dom, pfn, count, &count_out_dummy); +} + +void *xc_dom_pfn_to_ptr_retcount(struct xc_dom_image *dom, xen_pfn_t pfn, + xen_pfn_t count, xen_pfn_t *count_out) +{ struct xc_dom_phys *phys; + xen_pfn_t offset; unsigned int page_shift = XC_DOM_PAGE_SHIFT(dom); char *mode = "unset"; - if ( pfn > dom->total_pages || /* multiple checks to avoid overflows */ + *count_out = 0; + + offset = pfn - dom->rambase_pfn; + if ( offset > dom->total_pages || /* multiple checks to avoid overflows */ count > dom->total_pages || - pfn > dom->total_pages - count ) + offset > dom->total_pages - count ) { - DOMPRINTF("%s: pfn out of range (0x%" PRIpfn " > 0x%" PRIpfn ")", - __FUNCTION__, pfn, dom->total_pages); + DOMPRINTF("%s: pfn %"PRI_xen_pfn" out of range (0x%" PRIpfn " > 0x%" PRIpfn ")", + __FUNCTION__, pfn, offset, dom->total_pages); return NULL; } @@ -384,6 +413,7 @@ phys->count); return NULL; } + *count_out = count; } else { @@ -391,6 +421,9 @@ just hand out a pointer to it */ if ( pfn < phys->first ) continue; + if ( pfn >= phys->first + phys->count ) + continue; + *count_out = phys->count - (pfn - phys->first); } return phys->ptr + ((pfn - phys->first) << page_shift); } @@ -455,6 +488,7 @@ { unsigned int page_size = XC_DOM_PAGE_SIZE(dom); xen_pfn_t pages = (size + page_size - 1) / page_size; + xen_pfn_t pfn; void *ptr; if ( start == 0 ) @@ -476,15 +510,17 @@ } seg->vstart = start; - seg->pfn = (seg->vstart - dom->parms.virt_base) / page_size; + pfn = (seg->vstart - dom->parms.virt_base) / page_size; + seg->pfn = pfn + dom->rambase_pfn; - if ( pages > dom->total_pages || /* double test avoids overflow probs */ - pages > dom->total_pages - seg->pfn) + if ( pages > dom->total_pages || /* multiple test avoids overflow probs */ + pfn > dom->total_pages || + pages > dom->total_pages - pfn) { xc_dom_panic(dom->xch, XC_OUT_OF_MEMORY, "%s: segment %s too large (0x%"PRIpfn" > " "0x%"PRIpfn" - 0x%"PRIpfn" pages)", - __FUNCTION__, name, pages, dom->total_pages, seg->pfn); + __FUNCTION__, name, pages, dom->total_pages, pfn); return -1; } @@ -855,6 +891,12 @@ ramdisklen) != 0 ) goto err; ramdiskmap = xc_dom_seg_to_ptr(dom, &dom->ramdisk_seg); + if ( ramdiskmap == NULL ) + { + DOMPRINTF("%s: xc_dom_seg_to_ptr(dom, &dom->ramdisk_seg) => NULL", + __FUNCTION__); + goto err; + } if ( unziplen ) { if ( xc_dom_do_gunzip(dom->xch, @@ -871,7 +913,8 @@ goto err; if ( dom->arch_hooks->count_pgtables ) { - dom->arch_hooks->count_pgtables(dom); + if ( dom->arch_hooks->count_pgtables(dom) != 0 ) + goto err; if ( (dom->pgtables > 0) && (xc_dom_alloc_segment(dom, &dom->pgtables_seg, "page tables", 0, dom->pgtables * page_size) != 0) ) @@ -892,7 +935,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe.c xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe.c --- xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,48 @@ +#include +#include +#include + +#include "xg_private.h" +#include "xc_dom_decompress_unsafe.h" + +static struct xc_dom_image *unsafe_dom; +static unsigned char *output_blob; +static unsigned int output_size; + +static void unsafe_error(const char *msg) +{ + xc_dom_panic(unsafe_dom->xch, XC_INVALID_KERNEL, "%s", msg); +} + +static int unsafe_flush(void *src, unsigned int size) +{ + void *n = realloc(output_blob, output_size + size); + if (!n) + return -1; + output_blob = n; + + memcpy(&output_blob[output_size], src, size); + output_size += size; + return size; +} + +int xc_dom_decompress_unsafe( + decompress_fn fn, struct xc_dom_image *dom, void **blob, size_t *size) +{ + int ret; + + unsafe_dom = dom; + output_blob = NULL; + output_size = 0; + + ret = fn(dom->kernel_blob, dom->kernel_size, NULL, unsafe_flush, NULL, NULL, unsafe_error); + + if (ret) + free(output_blob); + else { + *blob = output_blob; + *size = output_size; + } + + return ret; +} diff -Nru xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe.h xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe.h --- xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe.h 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe.h 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,20 @@ +#include "xc_dom.h" + +typedef int decompress_fn(unsigned char *inbuf, unsigned int len, + int (*fill)(void*, unsigned int), + int (*flush)(void*, unsigned int), + unsigned char *outbuf, unsigned int *posp, + void (*error)(const char *x)); + +int xc_dom_decompress_unsafe( + decompress_fn fn, struct xc_dom_image *dom, void **blob, size_t *size) + __attribute__((visibility("internal"))); + +int xc_try_bzip2_decode(struct xc_dom_image *dom, void **blob, size_t *size) + __attribute__((visibility("internal"))); +int xc_try_lzma_decode(struct xc_dom_image *dom, void **blob, size_t *size) + __attribute__((visibility("internal"))); +int xc_try_lzo1x_decode(struct xc_dom_image *dom, void **blob, size_t *size) + __attribute__((visibility("internal"))); +int xc_try_xz_decode(struct xc_dom_image *dom, void **blob, size_t *size) + __attribute__((visibility("internal"))); diff -Nru xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe_bzip2.c xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe_bzip2.c --- xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe_bzip2.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe_bzip2.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,14 @@ +#include +#include +#include + +#include "xg_private.h" +#include "xc_dom_decompress_unsafe.h" + +#include "../../xen/common/bunzip2.c" + +int xc_try_bzip2_decode( + struct xc_dom_image *dom, void **blob, size_t *size) +{ + return xc_dom_decompress_unsafe(bunzip2, dom, blob, size); +} diff -Nru xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe_lzma.c xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe_lzma.c --- xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe_lzma.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe_lzma.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,14 @@ +#include +#include +#include + +#include "xg_private.h" +#include "xc_dom_decompress_unsafe.h" + +#include "../../xen/common/unlzma.c" + +int xc_try_lzma_decode( + struct xc_dom_image *dom, void **blob, size_t *size) +{ + return xc_dom_decompress_unsafe(unlzma, dom, blob, size); +} diff -Nru xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe_lzo1x.c xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe_lzo1x.c --- xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe_lzo1x.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe_lzo1x.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include + +#include "xg_private.h" +#include "xc_dom_decompress_unsafe.h" + +typedef uint8_t u8; +typedef uint32_t u32; +typedef uint16_t u16; + +#define likely(a) a +#define noinline +#define unlikely(a) a + +static inline u16 be16_to_cpup(const u16 *p) +{ + u16 v = *p; +#if BYTE_ORDER == LITTLE_ENDIAN + return (((v & 0x00ffU) << 8) | + ((v & 0xff00U) >> 8)); +#else + return v; +#endif +} + +static inline u32 be32_to_cpup(const u32 *p) +{ + u32 v = *p; +#if BYTE_ORDER == LITTLE_ENDIAN + return (((v & 0x000000ffUL) << 24) | + ((v & 0x0000ff00UL) << 8) | + ((v & 0x00ff0000UL) >> 8) | + ((v & 0xff000000UL) >> 24)); +#else + return v; +#endif +} + +#include "../../xen/common/lzo.c" +#include "../../xen/common/unlzo.c" + +int xc_try_lzo1x_decode( + struct xc_dom_image *dom, void **blob, size_t *size) +{ + return xc_dom_decompress_unsafe(unlzo, dom, blob, size); +} diff -Nru xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe_xz.c xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe_xz.c --- xen-4.2.2/tools/libxc/xc_dom_decompress_unsafe_xz.c 1970-01-01 00:00:00.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_decompress_unsafe_xz.c 2013-07-09 10:46:56.000000000 +0000 @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include + +#include "xg_private.h" +#include "xc_dom_decompress_unsafe.h" + +// TODO +#define XZ_DEC_X86 + +typedef char bool_t; +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint32_t __le32; + +static inline u32 cpu_to_le32(const u32 v) +{ +#if BYTE_ORDER == BIG_ENDIAN + return (((v & 0x000000ffUL) << 24) | + ((v & 0x0000ff00UL) << 8) | + ((v & 0x00ff0000UL) >> 8) | + ((v & 0xff000000UL) >> 24)); +#else + return v; +#endif +} + +static inline u32 le32_to_cpup(const u32 *p) +{ + return cpu_to_le32(*p); +} + +#define min(x,y) ({ \ + const typeof(x) _x = (x); \ + const typeof(y) _y = (y); \ + (void) (&_x == &_y); \ + _x < _y ? _x : _y; }) + +#define min_t(type,x,y) \ + ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; }) +#define max_t(type,x,y) \ + ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; }) + +#define __force +#define always_inline + +#include "../../xen/common/unxz.c" + +int xc_try_xz_decode( + struct xc_dom_image *dom, void **blob, size_t *size) +{ + return xc_dom_decompress_unsafe(unxz, dom, blob, size); +} diff -Nru xen-4.2.2/tools/libxc/xc_dom_elfloader.c xen-4.3.0/tools/libxc/xc_dom_elfloader.c --- xen-4.2.2/tools/libxc/xc_dom_elfloader.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_elfloader.c 2013-07-09 10:46:56.000000000 +0000 @@ -28,13 +28,14 @@ #include "xg_private.h" #include "xc_dom.h" +#include "xc_bitops.h" #define XEN_VER "xen-3.0" /* ------------------------------------------------------------------------ */ static void log_callback(struct elf_binary *elf, void *caller_data, - int iserr, const char *fmt, va_list al) { + bool iserr, const char *fmt, va_list al) { xc_interface *xch = caller_data; xc_reportv(xch, @@ -46,7 +47,7 @@ void xc_elf_set_logfile(xc_interface *xch, struct elf_binary *elf, int verbose) { - elf_set_log(elf, log_callback, xch, verbose); + elf_set_log(elf, log_callback, xch, verbose /* convert to bool */); } /* ------------------------------------------------------------------------ */ @@ -74,8 +75,6 @@ } case EM_X86_64: return "xen-3.0-x86_64"; - case EM_IA_64: - return elf_msb(elf) ? "xen-3.0-ia64be" : "xen-3.0-ia64"; default: return "xen-3.0-unknown"; } @@ -84,7 +83,7 @@ /* ------------------------------------------------------------------------ */ /* parse elf binary */ -static int check_elf_kernel(struct xc_dom_image *dom, int verbose) +static elf_negerrnoval check_elf_kernel(struct xc_dom_image *dom, bool verbose) { if ( dom->kernel_blob == NULL ) { @@ -95,7 +94,7 @@ return -EINVAL; } - if ( !elf_is_elfbinary(dom->kernel_blob) ) + if ( !elf_is_elfbinary(dom->kernel_blob, dom->kernel_size) ) { if ( verbose ) xc_dom_panic(dom->xch, @@ -106,20 +105,21 @@ return 0; } -static int xc_dom_probe_elf_kernel(struct xc_dom_image *dom) +static elf_negerrnoval xc_dom_probe_elf_kernel(struct xc_dom_image *dom) { return check_elf_kernel(dom, 0); } -static int xc_dom_load_elf_symtab(struct xc_dom_image *dom, - struct elf_binary *elf, int load) +static elf_errorstatus xc_dom_load_elf_symtab(struct xc_dom_image *dom, + struct elf_binary *elf, bool load) { struct elf_binary syms; - const elf_shdr *shdr, *shdr2; + ELF_HANDLE_DECL(elf_shdr) shdr; ELF_HANDLE_DECL(elf_shdr) shdr2; xen_vaddr_t symtab, maxaddr; - char *hdr; + elf_ptrval hdr; size_t size; - int h, count, type, i, tables = 0; + unsigned h, count, type, i, tables = 0; + unsigned long *strtab_referenced = NULL; if ( elf_swap(elf) ) { @@ -130,31 +130,48 @@ if ( load ) { + char *hdr_ptr; + size_t allow_size; + if ( !dom->bsd_symtab_start ) return 0; size = dom->kernel_seg.vend - dom->bsd_symtab_start; - hdr = xc_dom_vaddr_to_ptr(dom, dom->bsd_symtab_start); - *(int *)hdr = size - sizeof(int); + hdr_ptr = xc_dom_vaddr_to_ptr(dom, dom->bsd_symtab_start, &allow_size); + if ( hdr_ptr == NULL ) + { + DOMPRINTF("%s/load: xc_dom_vaddr_to_ptr(dom,dom->bsd_symtab_start" + " => NULL", __FUNCTION__); + return -1; + } + elf->caller_xdest_base = hdr_ptr; + elf->caller_xdest_size = allow_size; + hdr = ELF_REALPTR2PTRVAL(hdr_ptr); + elf_store_val(elf, unsigned, hdr, size - sizeof(unsigned)); } else { - size = sizeof(int) + elf_size(elf, elf->ehdr) + + char *hdr_ptr; + + size = sizeof(unsigned) + elf_size(elf, elf->ehdr) + elf_shdr_count(elf) * elf_size(elf, shdr); - hdr = xc_dom_malloc(dom, size); - if ( hdr == NULL ) + hdr_ptr = xc_dom_malloc(dom, size); + if ( hdr_ptr == NULL ) return 0; - dom->bsd_symtab_start = elf_round_up(&syms, dom->kernel_seg.vend); + elf->caller_xdest_base = hdr_ptr; + elf->caller_xdest_size = size; + hdr = ELF_REALPTR2PTRVAL(hdr_ptr); + dom->bsd_symtab_start = elf_round_up(elf, dom->kernel_seg.vend); } - memcpy(hdr + sizeof(int), - elf->image, + elf_memcpy_safe(elf, hdr + sizeof(unsigned), + ELF_IMAGE_BASE(elf), elf_size(elf, elf->ehdr)); - memcpy(hdr + sizeof(int) + elf_size(elf, elf->ehdr), - elf->image + elf_uval(elf, elf->ehdr, e_shoff), + elf_memcpy_safe(elf, hdr + sizeof(unsigned) + elf_size(elf, elf->ehdr), + ELF_IMAGE_BASE(elf) + elf_uval(elf, elf->ehdr, e_shoff), elf_shdr_count(elf) * elf_size(elf, shdr)); if ( elf_64bit(elf) ) { - Elf64_Ehdr *ehdr = (Elf64_Ehdr *)(hdr + sizeof(int)); + Elf64_Ehdr *ehdr = (Elf64_Ehdr *)(hdr + sizeof(unsigned)); ehdr->e_phoff = 0; ehdr->e_phentsize = 0; ehdr->e_phnum = 0; @@ -163,19 +180,42 @@ } else { - Elf32_Ehdr *ehdr = (Elf32_Ehdr *)(hdr + sizeof(int)); + Elf32_Ehdr *ehdr = (Elf32_Ehdr *)(hdr + sizeof(unsigned)); ehdr->e_phoff = 0; ehdr->e_phentsize = 0; ehdr->e_phnum = 0; ehdr->e_shoff = elf_size(elf, elf->ehdr); ehdr->e_shstrndx = SHN_UNDEF; } - if ( elf_init(&syms, hdr + sizeof(int), size - sizeof(int)) ) + if ( elf->caller_xdest_size < sizeof(unsigned) ) + { + DOMPRINTF("%s/%s: header size %"PRIx64" too small", + __FUNCTION__, load ? "load" : "parse", + (uint64_t)elf->caller_xdest_size); + return -1; + } + if ( elf_init(&syms, elf->caller_xdest_base + sizeof(unsigned), + elf->caller_xdest_size - sizeof(unsigned)) ) return -1; + /* + * The caller_xdest_{base,size} and dest_{base,size} need to + * remain valid so long as each struct elf_image does. The + * principle we adopt is that these values are set when the + * memory is allocated or mapped, and cleared when (and if) + * they are unmapped. + * + * Mappings of the guest are normally undone by xc_dom_unmap_all + * (directly or via xc_dom_release). We do not explicitly clear + * these because in fact that happens only at the end of + * xc_dom_boot_image, at which time all of these ELF loading + * functions have returned. No relevant struct elf_binary* + * escapes this file. + */ + xc_elf_set_logfile(dom->xch, &syms, 1); - symtab = dom->bsd_symtab_start + sizeof(int); + symtab = dom->bsd_symtab_start + sizeof(unsigned); maxaddr = elf_round_up(&syms, symtab + elf_size(&syms, syms.ehdr) + elf_shdr_count(&syms) * elf_size(&syms, shdr)); @@ -186,27 +226,40 @@ symtab, maxaddr); count = elf_shdr_count(&syms); + /* elf_shdr_count guarantees that count is reasonable */ + + strtab_referenced = xc_dom_malloc(dom, bitmap_size(count)); + if ( strtab_referenced == NULL ) + return -1; + bitmap_clear(strtab_referenced, count); + /* Note the symtabs @h linked to by any strtab @i. */ + for ( i = 0; i < count; i++ ) + { + shdr2 = elf_shdr_by_index(&syms, i); + if ( elf_uval(&syms, shdr2, sh_type) == SHT_SYMTAB ) + { + h = elf_uval(&syms, shdr2, sh_link); + if (h < count) + set_bit(h, strtab_referenced); + } + } + for ( h = 0; h < count; h++ ) { shdr = elf_shdr_by_index(&syms, h); + if ( !elf_access_ok(elf, ELF_HANDLE_PTRVAL(shdr), 1) ) + /* input has an insane section header count field */ + break; type = elf_uval(&syms, shdr, sh_type); if ( type == SHT_STRTAB ) { - /* Look for a strtab @i linked to symtab @h. */ - for ( i = 0; i < count; i++ ) - { - shdr2 = elf_shdr_by_index(&syms, i); - if ( (elf_uval(&syms, shdr2, sh_type) == SHT_SYMTAB) && - (elf_uval(&syms, shdr2, sh_link) == h) ) - break; - } /* Skip symtab @h if we found no corresponding strtab @i. */ - if ( i == count ) + if ( !test_bit(h, strtab_referenced) ) { if ( elf_64bit(&syms) ) - *(Elf64_Off*)(&shdr->e64.sh_offset) = 0; + elf_store_field(elf, shdr, e64.sh_offset, 0); else - *(Elf32_Off*)(&shdr->e32.sh_offset) = 0; + elf_store_field(elf, shdr, e32.sh_offset, 0); continue; } } @@ -215,13 +268,13 @@ { /* Mangled to be based on ELF header location. */ if ( elf_64bit(&syms) ) - *(Elf64_Off*)(&shdr->e64.sh_offset) = maxaddr - symtab; + elf_store_field(elf, shdr, e64.sh_offset, maxaddr - symtab); else - *(Elf32_Off*)(&shdr->e32.sh_offset) = maxaddr - symtab; + elf_store_field(elf, shdr, e32.sh_offset, maxaddr - symtab); size = elf_uval(&syms, shdr, sh_size); maxaddr = elf_round_up(&syms, maxaddr + size); tables++; - DOMPRINTF("%s: h=%d %s, size=0x%zx, maxaddr=0x%" PRIx64 "", + DOMPRINTF("%s: h=%u %s, size=0x%zx, maxaddr=0x%" PRIx64 "", __FUNCTION__, h, type == SHT_SYMTAB ? "symtab" : "strtab", size, maxaddr); @@ -229,7 +282,7 @@ if ( load ) { shdr2 = elf_shdr_by_index(elf, h); - memcpy((void*)elf_section_start(&syms, shdr), + elf_memcpy_safe(elf, elf_section_start(&syms, shdr), elf_section_start(elf, shdr2), size); } @@ -237,11 +290,18 @@ /* Name is NULL. */ if ( elf_64bit(&syms) ) - *(Elf64_Word*)(&shdr->e64.sh_name) = 0; + elf_store_field(elf, shdr, e64.sh_name, 0); else - *(Elf32_Word*)(&shdr->e32.sh_name) = 0; + elf_store_field(elf, shdr, e32.sh_name, 0); } + if ( elf_check_broken(&syms) ) + DOMPRINTF("%s: symbols ELF broken: %s", __FUNCTION__, + elf_check_broken(&syms)); + if ( elf_check_broken(elf) ) + DOMPRINTF("%s: ELF broken: %s", __FUNCTION__, + elf_check_broken(elf)); + if ( tables == 0 ) { DOMPRINTF("%s: no symbol table present", __FUNCTION__); @@ -253,16 +313,22 @@ return 0; } -static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom) +static elf_errorstatus xc_dom_parse_elf_kernel(struct xc_dom_image *dom) + /* + * This function sometimes returns -1 for error and sometimes + * an errno value. ?!?! + */ { struct elf_binary *elf; - int rc; + elf_errorstatus rc; rc = check_elf_kernel(dom, 1); if ( rc != 0 ) return rc; elf = xc_dom_malloc(dom, sizeof(*elf)); + if ( elf == NULL ) + return -1; dom->private_loader = elf; rc = elf_init(elf, dom->kernel_blob, dom->kernel_size); xc_elf_set_logfile(dom->xch, elf, 1); @@ -274,23 +340,27 @@ } /* Find the section-header strings table. */ - if ( elf->sec_strtab == NULL ) + if ( ELF_PTRVAL_INVALID(elf->sec_strtab) ) { xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: ELF image" " has no shstrtab", __FUNCTION__); - return -EINVAL; + rc = -EINVAL; + goto out; } /* parse binary and get xen meta info */ elf_parse_binary(elf); if ( (rc = elf_xen_parse(elf, &dom->parms)) != 0 ) - return rc; + { + goto out; + } if ( elf_xen_feature_get(XENFEAT_dom0, dom->parms.f_required) ) { xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: Kernel does not" " support unprivileged (DomU) operation", __FUNCTION__); - return -EINVAL; + rc = -EINVAL; + goto out; } /* find kernel segment */ @@ -304,15 +374,30 @@ DOMPRINTF("%s: %s: 0x%" PRIx64 " -> 0x%" PRIx64 "", __FUNCTION__, dom->guest_type, dom->kernel_seg.vstart, dom->kernel_seg.vend); - return 0; + rc = 0; +out: + if ( elf_check_broken(elf) ) + DOMPRINTF("%s: ELF broken: %s", __FUNCTION__, + elf_check_broken(elf)); + + return rc; } -static int xc_dom_load_elf_kernel(struct xc_dom_image *dom) +static elf_errorstatus xc_dom_load_elf_kernel(struct xc_dom_image *dom) { struct elf_binary *elf = dom->private_loader; - int rc; + elf_errorstatus rc; + xen_pfn_t pages; + + elf->dest_base = xc_dom_seg_to_ptr_pages(dom, &dom->kernel_seg, &pages); + if ( elf->dest_base == NULL ) + { + DOMPRINTF("%s: xc_dom_vaddr_to_ptr(dom,dom->kernel_seg)" + " => NULL", __FUNCTION__); + return -1; + } + elf->dest_size = pages * XC_DOM_PAGE_SIZE(dom); - elf->dest = xc_dom_seg_to_ptr(dom, &dom->kernel_seg); rc = elf_load_binary(elf); if ( rc < 0 ) { @@ -341,7 +426,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_dom_ia64.c xen-4.3.0/tools/libxc/xc_dom_ia64.c --- xen-4.2.2/tools/libxc/xc_dom_ia64.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_ia64.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,334 +0,0 @@ -/* - * Xen domain builder -- ia64 bits. - * - * Most architecture-specific code for ia64 goes here. - * - fill architecture-specific structs. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * written 2006 by Gerd Hoffmann . - * - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "xg_private.h" -#include "xc_dom.h" -#include "xenctrl.h" - -#include -#include "ia64/xc_dom_ia64_util.h" - -/* ------------------------------------------------------------------------ */ - -static int alloc_magic_pages(struct xc_dom_image *dom) -{ - /* allocate special pages */ - dom->console_pfn = dom->total_pages -1; - dom->xenstore_pfn = dom->total_pages -2; - dom->start_info_pfn = dom->total_pages -3; - return 0; -} - -int start_info_ia64(struct xc_dom_image *dom) -{ - start_info_ia64_t *start_info = - xc_dom_pfn_to_ptr(dom, dom->start_info_pfn, 1); - struct xen_ia64_boot_param_ia64 *bp = - (struct xen_ia64_boot_param_ia64 *)(start_info + 1); - - DOMPRINTF_CALLED(dom->xch); - - memset(start_info, 0, sizeof(*start_info)); - sprintf(start_info->magic, dom->guest_type); - start_info->flags = dom->flags; - start_info->nr_pages = dom->total_pages; - start_info->store_mfn = dom->xenstore_pfn; - start_info->store_evtchn = dom->xenstore_evtchn; - start_info->console.domU.mfn = dom->console_pfn; - start_info->console.domU.evtchn = dom->console_evtchn; - - /* - * domain_start and domain_size are abused for arch_setup hypercall - * so that we need to clear them here. - */ - XEN_IA64_MEMMAP_INFO_NUM_PAGES(bp) = 0; - XEN_IA64_MEMMAP_INFO_PFN(bp) = 0; - - if ( dom->ramdisk_blob ) - { - start_info->mod_start = dom->ramdisk_seg.vstart; - start_info->mod_len = dom->ramdisk_seg.vend - dom->ramdisk_seg.vstart; - bp->initrd_start = start_info->mod_start; - bp->initrd_size = start_info->mod_len; - } - bp->command_line = (dom->start_info_pfn << PAGE_SHIFT_IA64) - + offsetof(start_info_t, cmd_line); - if ( dom->cmdline ) - { - strncpy((char *)start_info->cmd_line, dom->cmdline, MAX_GUEST_CMDLINE); - start_info->cmd_line[MAX_GUEST_CMDLINE - 1] = '\0'; - } - return 0; -} - -int shared_info_ia64(struct xc_dom_image *dom, void *ptr) -{ - shared_info_ia64_t *shared_info = ptr; - int i; - - DOMPRINTF_CALLED(dom->xch); - - memset(shared_info, 0, sizeof(*shared_info)); - for (i = 0; i < XEN_LEGACY_MAX_VCPUS; i++) - shared_info->vcpu_info[i].evtchn_upcall_mask = 1; - shared_info->arch.start_info_pfn = dom->start_info_pfn; - shared_info->arch.memmap_info_num_pages = 1; //XXX - shared_info->arch.memmap_info_pfn = dom->start_info_pfn - 1; - return 0; -} - -extern unsigned long xc_ia64_fpsr_default(void); - -static int vcpu_ia64(struct xc_dom_image *dom, void *ptr) -{ - vcpu_guest_context_ia64_t *ctxt = ptr; - - DOMPRINTF_CALLED(dom->xch); - - /* clear everything */ - memset(ctxt, 0, sizeof(*ctxt)); - - ctxt->flags = 0; - /* PSR is set according to SAL 3.2.4: AC, IC and BN are set. */ - ctxt->regs.psr = IA64_PSR_AC | IA64_PSR_IC | IA64_PSR_BN; - ctxt->regs.ip = dom->parms.virt_entry; - ctxt->regs.cfm = 1UL << 63; -#ifdef __ia64__ /* FIXME */ - ctxt->regs.ar.fpsr = xc_ia64_fpsr_default(); -#endif - ctxt->regs.r[28] = (dom->start_info_pfn << PAGE_SHIFT_IA64) - + sizeof(start_info_ia64_t); - return 0; -} - -/* ------------------------------------------------------------------------ */ - -static struct xc_dom_arch xc_dom_arch = { - .guest_type = "xen-3.0-ia64", - .native_protocol = XEN_IO_PROTO_ABI_IA64, - .page_shift = PAGE_SHIFT_IA64, - .alloc_magic_pages = alloc_magic_pages, - .start_info = start_info_ia64, - .shared_info = shared_info_ia64, - .vcpu = vcpu_ia64, -}; - -static struct xc_dom_arch xc_dom_arch_ia64be = { - .guest_type = "xen-3.0-ia64be", - .native_protocol = XEN_IO_PROTO_ABI_IA64, - .page_shift = PAGE_SHIFT_IA64, - .alloc_magic_pages = alloc_magic_pages, - .start_info = start_info_ia64, - .shared_info = shared_info_ia64, - .vcpu = vcpu_ia64, -}; - -static void __init register_arch_hooks(void) -{ - xc_dom_register_arch_hooks(&xc_dom_arch); - xc_dom_register_arch_hooks(&xc_dom_arch_ia64be); -} - -#include "xc_efi.h" - -int arch_setup_meminit(struct xc_dom_image *dom) -{ - xen_pfn_t pfn; - int rc; - unsigned long start; - unsigned long nbr; - - /* setup initial p2m */ - if (dom->guest_type && strcmp(dom->guest_type, - "hvm-3.0-ia64-sioemu") == 0) { - start = FW_MEM_BASE >> PAGE_SHIFT_IA64; - nbr = FW_MEM_SIZE >> PAGE_SHIFT_IA64; - } else { - start = 0; - nbr = dom->total_pages; - } - - /* setup initial p2m */ - dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * nbr); - for ( pfn = 0; pfn < nbr; pfn++ ) - dom->p2m_host[pfn] = start + pfn; - - /* allocate guest memory */ - rc = xc_domain_populate_physmap_exact(dom->xch, dom->guest_domid, - nbr, 0, 0, - dom->p2m_host); - return rc; -} - -static int ia64_setup_memmap(struct xc_dom_image *dom) -{ - unsigned int page_size = XC_DOM_PAGE_SIZE(dom); - unsigned long memmap_info_num_pages; - unsigned long memmap_info_pfn; - xen_ia64_memmap_info_t* memmap_info; - unsigned int num_mds; - efi_memory_desc_t *md; - - char* start_info; - struct xen_ia64_boot_param* bp; - - /* setup memmap page */ - memmap_info_num_pages = 1; - memmap_info_pfn = dom->start_info_pfn - 1; - DOMPRINTF("%s: memmap: mfn 0x%" PRIpfn " pages 0x%lx", - __FUNCTION__, memmap_info_pfn, memmap_info_num_pages); - memmap_info = xc_map_foreign_range(dom->xch, dom->guest_domid, - page_size * memmap_info_num_pages, - PROT_READ | PROT_WRITE, - memmap_info_pfn); - if (NULL == memmap_info) - return -1; - /* [0, total_pages) */ - memmap_info->efi_memdesc_size = sizeof(md[0]); - memmap_info->efi_memdesc_version = EFI_MEMORY_DESCRIPTOR_VERSION; - num_mds = 0; - md = (efi_memory_desc_t*)&memmap_info->memdesc; - md[num_mds].type = EFI_CONVENTIONAL_MEMORY; - md[num_mds].pad = 0; - md[num_mds].phys_addr = 0; - md[num_mds].virt_addr = 0; - md[num_mds].num_pages = dom->total_pages << (PAGE_SHIFT - EFI_PAGE_SHIFT); - md[num_mds].attribute = EFI_MEMORY_WB; - num_mds++; - memmap_info->efi_memmap_size = num_mds * sizeof(md[0]); - munmap(memmap_info, page_size * memmap_info_num_pages); - assert(num_mds <= - (page_size * memmap_info_num_pages - - offsetof(typeof(*memmap_info), memdesc))/sizeof(*md)); - - /* - * kludge: we need to pass memmap_info page's pfn and other magic pages - * somehow. - * we use xen_ia64_boot_param::efi_memmap::{efi_memmap, efi_memmap_size} - * for this purpose - */ - start_info = xc_map_foreign_range(dom->xch, dom->guest_domid, - page_size, - PROT_READ | PROT_WRITE, - dom->start_info_pfn); - if (NULL == start_info) - return -1; - bp = (struct xen_ia64_boot_param*)(start_info + sizeof(start_info_t)); - memset(bp, 0, sizeof(*bp)); - XEN_IA64_MEMMAP_INFO_NUM_PAGES(bp) = memmap_info_num_pages; - XEN_IA64_MEMMAP_INFO_PFN(bp) = memmap_info_pfn; - munmap(start_info, page_size); - return 0; -} - -int arch_setup_bootearly(struct xc_dom_image *dom) -{ - DECLARE_DOMCTL; - int rc; - - DOMPRINTF("%s: setup firmware for %s", __FUNCTION__, dom->guest_type); - - if (dom->guest_type && strcmp(dom->guest_type, - "hvm-3.0-ia64-sioemu") == 0) { - memset(&domctl, 0, sizeof(domctl)); - domctl.u.arch_setup.flags = XEN_DOMAINSETUP_sioemu_guest; - domctl.u.arch_setup.bp = 0; - domctl.u.arch_setup.maxmem = 0; - domctl.cmd = XEN_DOMCTL_arch_setup; - domctl.domain = dom->guest_domid; - rc = xc_domctl(dom->xch, &domctl); - DOMPRINTF("%s: hvm-3.0-ia64-sioemu: %d", __FUNCTION__, rc); - return rc; - } - - rc = ia64_setup_memmap(dom); - if (rc) - return rc; - - memset(&domctl, 0, sizeof(domctl)); - domctl.cmd = XEN_DOMCTL_arch_setup; - domctl.domain = dom->guest_domid; - domctl.u.arch_setup.flags = XEN_DOMAINSETUP_query; - rc = do_domctl(dom->xch, &domctl); - if (rc) - return rc; - rc = xen_ia64_dom_fw_setup(dom, domctl.u.arch_setup.hypercall_imm, - (dom->start_info_pfn << PAGE_SHIFT) + - sizeof(start_info_t), - dom->total_pages << PAGE_SHIFT); - if (rc) - return rc; - - memset(&domctl, 0, sizeof(domctl)); - domctl.cmd = XEN_DOMCTL_arch_setup; - domctl.domain = dom->guest_domid; - domctl.u.arch_setup.flags = 0; - - domctl.u.arch_setup.bp = (dom->start_info_pfn << PAGE_SHIFT) - + sizeof(start_info_t); - domctl.u.arch_setup.maxmem = dom->total_pages << PAGE_SHIFT; - domctl.u.arch_setup.vhpt_size_log2 = dom->vhpt_size_log2; - rc = do_domctl(dom->xch, &domctl); - return rc; -} - -int arch_setup_bootlate(struct xc_dom_image *dom) -{ - unsigned int page_size = XC_DOM_PAGE_SIZE(dom); - shared_info_t *shared_info; - - /* setup shared_info page */ - DOMPRINTF("%s: shared_info: mfn 0x%" PRIpfn "", - __FUNCTION__, dom->shared_info_mfn); - shared_info = xc_map_foreign_range(dom->xch, dom->guest_domid, - page_size, - PROT_READ | PROT_WRITE, - dom->shared_info_mfn); - if ( shared_info == NULL ) - return -1; - dom->arch_hooks->shared_info(dom, shared_info); - munmap(shared_info, page_size); - return 0; -} - -/* - * Local variables: - * mode: C - * c-set-style: "BSD" - * c-basic-offset: 4 - * tab-width: 4 - * indent-tabs-mode: nil - * End: - */ diff -Nru xen-4.2.2/tools/libxc/xc_dom_x86.c xen-4.3.0/tools/libxc/xc_dom_x86.c --- xen-4.2.2/tools/libxc/xc_dom_x86.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_dom_x86.c 2013-07-09 10:46:56.000000000 +0000 @@ -47,6 +47,40 @@ #define round_down(addr, mask) ((addr) & ~(mask)) #define round_up(addr, mask) ((addr) | (mask)) +/* get guest IO ABI protocol */ +const char *xc_domain_get_native_protocol(xc_interface *xch, + uint32_t domid) +{ + int ret; + uint32_t guest_width; + const char *protocol; + DECLARE_DOMCTL; + + memset(&domctl, 0, sizeof(domctl)); + domctl.domain = domid; + domctl.cmd = XEN_DOMCTL_get_address_size; + + ret = do_domctl(xch, &domctl); + + if ( ret ) + return NULL; + + guest_width = domctl.u.address_size.size; + + switch (guest_width) { + case 32: /* 32 bit guest */ + protocol = XEN_IO_PROTO_ABI_X86_32; + break; + case 64: /* 64 bit guest */ + protocol = XEN_IO_PROTO_ABI_X86_64; + break; + default: + protocol = NULL; + } + + return protocol; +} + static unsigned long nr_page_tables(struct xc_dom_image *dom, xen_vaddr_t start, xen_vaddr_t end, unsigned long bits) @@ -82,6 +116,7 @@ { int pages, extra_pages; xen_vaddr_t try_virt_end; + xen_pfn_t try_pfn_end; extra_pages = dom->alloc_bootstack ? 1 : 0; extra_pages += dom->extra_pages; @@ -91,6 +126,17 @@ { try_virt_end = round_up(dom->virt_alloc_end + pages * PAGE_SIZE_X86, bits_to_mask(22)); /* 4MB alignment */ + + try_pfn_end = (try_virt_end - dom->parms.virt_base) >> PAGE_SHIFT_X86; + + if ( try_pfn_end > dom->total_pages ) + { + xc_dom_panic(dom->xch, XC_OUT_OF_MEMORY, + "%s: not enough memory for initial mapping (%#"PRIpfn" > %#"PRIpfn")", + __FUNCTION__, try_pfn_end, dom->total_pages); + return -ENOMEM; + } + dom->pg_l4 = nr_page_tables(dom, dom->parms.virt_base, try_virt_end, l4_bits); dom->pg_l3 = @@ -121,11 +167,6 @@ #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER) #define L3_PROT (_PAGE_PRESENT) -static int count_pgtables_x86_32(struct xc_dom_image *dom) -{ - return count_pgtables(dom, 0, 0, 0, 32, L2_PAGETABLE_SHIFT_I386); -} - static int count_pgtables_x86_32_pae(struct xc_dom_image *dom) { return count_pgtables(dom, 1, 0, 32, @@ -134,43 +175,6 @@ #define pfn_to_paddr(pfn) ((xen_paddr_t)(pfn) << PAGE_SHIFT_X86) -static int setup_pgtables_x86_32(struct xc_dom_image *dom) -{ - xen_pfn_t l2pfn = dom->pgtables_seg.pfn; - xen_pfn_t l1pfn = dom->pgtables_seg.pfn + dom->pg_l2; - l2_pgentry_32_t *l2tab = xc_dom_pfn_to_ptr(dom, l2pfn, 1); - l1_pgentry_32_t *l1tab = NULL; - unsigned long l2off, l1off; - xen_vaddr_t addr; - xen_pfn_t pgpfn; - - for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end; - addr += PAGE_SIZE_X86 ) - { - if ( l1tab == NULL ) - { - /* get L1 tab, make L2 entry */ - l1tab = xc_dom_pfn_to_ptr(dom, l1pfn, 1); - l2off = l2_table_offset_i386(addr); - l2tab[l2off] = - pfn_to_paddr(xc_dom_p2m_guest(dom, l1pfn)) | L2_PROT; - l1pfn++; - } - - /* make L1 entry */ - l1off = l1_table_offset_i386(addr); - pgpfn = (addr - dom->parms.virt_base) >> PAGE_SHIFT_X86; - l1tab[l1off] = - pfn_to_paddr(xc_dom_p2m_guest(dom, pgpfn)) | L1_PROT; - if ( (addr >= dom->pgtables_seg.vstart) && - (addr < dom->pgtables_seg.vend) ) - l1tab[l1off] &= ~_PAGE_RW; /* page tables are r/o */ - if ( l1off == (L1_PAGETABLE_ENTRIES_I386 - 1) ) - l1tab = NULL; - } - return 0; -} - /* * Move the l3 page table page below 4G for guests which do not * support the extended-cr3 format. The l3 is currently empty so we @@ -219,6 +223,12 @@ goto out; l3tab = xc_dom_pfn_to_ptr(dom, l3pfn, 1); + if ( l3tab == NULL ) + { + DOMPRINTF("%s: xc_dom_pfn_to_ptr(dom, l3pfn, 1) => NULL", + __FUNCTION__); + return l3mfn; /* our one call site will call xc_dom_panic and fail */ + } memset(l3tab, 0, XC_DOM_PAGE_SIZE(dom)); DOMPRINTF("%s: successfully relocated L3 below 4G. " @@ -236,8 +246,8 @@ static int setup_pgtables_x86_32_pae(struct xc_dom_image *dom) { xen_pfn_t l3pfn = dom->pgtables_seg.pfn; - xen_pfn_t l2pfn = dom->pgtables_seg.pfn + dom->pg_l3; - xen_pfn_t l1pfn = dom->pgtables_seg.pfn + dom->pg_l3 + dom->pg_l2; + xen_pfn_t l2pfn = l3pfn + dom->pg_l3; + xen_pfn_t l1pfn = l2pfn + dom->pg_l2; l3_pgentry_64_t *l3tab; l2_pgentry_64_t *l2tab = NULL; l1_pgentry_64_t *l1tab = NULL; @@ -262,6 +272,8 @@ } l3tab = xc_dom_pfn_to_ptr(dom, l3pfn, 1); + if ( l3tab == NULL ) + goto pfn_error; for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end; addr += PAGE_SIZE_X86 ) @@ -270,6 +282,8 @@ { /* get L2 tab, make L3 entry */ l2tab = xc_dom_pfn_to_ptr(dom, l2pfn, 1); + if ( l2tab == NULL ) + goto pfn_error; l3off = l3_table_offset_pae(addr); l3tab[l3off] = pfn_to_paddr(xc_dom_p2m_guest(dom, l2pfn)) | L3_PROT; @@ -280,6 +294,8 @@ { /* get L1 tab, make L2 entry */ l1tab = xc_dom_pfn_to_ptr(dom, l1pfn, 1); + if ( l1tab == NULL ) + goto pfn_error; l2off = l2_table_offset_pae(addr); l2tab[l2off] = pfn_to_paddr(xc_dom_p2m_guest(dom, l1pfn)) | L2_PROT; @@ -306,6 +322,11 @@ l3tab[3] = pfn_to_paddr(xc_dom_p2m_guest(dom, l2pfn)) | L3_PROT; } return 0; + +pfn_error: + xc_dom_panic(dom->xch, XC_INTERNAL_ERROR, + "%s: xc_dom_pfn_to_ptr failed", __FUNCTION__); + return -EINVAL; } #undef L1_PROT @@ -332,10 +353,9 @@ static int setup_pgtables_x86_64(struct xc_dom_image *dom) { xen_pfn_t l4pfn = dom->pgtables_seg.pfn; - xen_pfn_t l3pfn = dom->pgtables_seg.pfn + dom->pg_l4; - xen_pfn_t l2pfn = dom->pgtables_seg.pfn + dom->pg_l4 + dom->pg_l3; - xen_pfn_t l1pfn = - dom->pgtables_seg.pfn + dom->pg_l4 + dom->pg_l3 + dom->pg_l2; + xen_pfn_t l3pfn = l4pfn + dom->pg_l4; + xen_pfn_t l2pfn = l3pfn + dom->pg_l3; + xen_pfn_t l1pfn = l2pfn + dom->pg_l2; l4_pgentry_64_t *l4tab = xc_dom_pfn_to_ptr(dom, l4pfn, 1); l3_pgentry_64_t *l3tab = NULL; l2_pgentry_64_t *l2tab = NULL; @@ -344,6 +364,9 @@ uint64_t addr; xen_pfn_t pgpfn; + if ( l4tab == NULL ) + goto pfn_error; + for ( addr = dom->parms.virt_base; addr < dom->virt_pgtab_end; addr += PAGE_SIZE_X86 ) { @@ -351,6 +374,8 @@ { /* get L3 tab, make L4 entry */ l3tab = xc_dom_pfn_to_ptr(dom, l3pfn, 1); + if ( l3tab == NULL ) + goto pfn_error; l4off = l4_table_offset_x86_64(addr); l4tab[l4off] = pfn_to_paddr(xc_dom_p2m_guest(dom, l3pfn)) | L4_PROT; @@ -361,6 +386,8 @@ { /* get L2 tab, make L3 entry */ l2tab = xc_dom_pfn_to_ptr(dom, l2pfn, 1); + if ( l2tab == NULL ) + goto pfn_error; l3off = l3_table_offset_x86_64(addr); l3tab[l3off] = pfn_to_paddr(xc_dom_p2m_guest(dom, l2pfn)) | L3_PROT; @@ -373,6 +400,8 @@ { /* get L1 tab, make L2 entry */ l1tab = xc_dom_pfn_to_ptr(dom, l1pfn, 1); + if ( l1tab == NULL ) + goto pfn_error; l2off = l2_table_offset_x86_64(addr); l2tab[l2off] = pfn_to_paddr(xc_dom_p2m_guest(dom, l1pfn)) | L2_PROT; @@ -393,6 +422,11 @@ l1tab = NULL; } return 0; + +pfn_error: + xc_dom_panic(dom->xch, XC_INTERNAL_ERROR, + "%s: xc_dom_pfn_to_ptr failed", __FUNCTION__); + return -EINVAL; } #undef L1_PROT @@ -410,6 +444,8 @@ if ( xc_dom_alloc_segment(dom, &dom->p2m_seg, "phys2mach", 0, p2m_size) ) return -1; dom->p2m_guest = xc_dom_seg_to_ptr(dom, &dom->p2m_seg); + if ( dom->p2m_guest == NULL ) + return -1; /* allocate special pages */ dom->start_info_pfn = xc_dom_alloc_page(dom, "start info"); @@ -434,6 +470,12 @@ DOMPRINTF_CALLED(dom->xch); + if ( start_info == NULL ) + { + DOMPRINTF("%s: xc_dom_pfn_to_ptr failed on start_info", __FUNCTION__); + return -1; /* our caller throws away our return value :-/ */ + } + memset(start_info, 0, sizeof(*start_info)); strncpy(start_info->magic, dom->guest_type, sizeof(start_info->magic)); start_info->magic[sizeof(start_info->magic) - 1] = '\0'; @@ -474,6 +516,12 @@ DOMPRINTF_CALLED(dom->xch); + if ( start_info == NULL ) + { + DOMPRINTF("%s: xc_dom_pfn_to_ptr failed on start_info", __FUNCTION__); + return -1; /* our caller throws away our return value :-/ */ + } + memset(start_info, 0, sizeof(*start_info)); strncpy(start_info->magic, dom->guest_type, sizeof(start_info->magic)); start_info->magic[sizeof(start_info->magic) - 1] = '\0'; @@ -608,18 +656,6 @@ /* ------------------------------------------------------------------------ */ -static struct xc_dom_arch xc_dom_32 = { - .guest_type = "xen-3.0-x86_32", - .native_protocol = XEN_IO_PROTO_ABI_X86_32, - .page_shift = PAGE_SHIFT_X86, - .sizeof_pfn = 4, - .alloc_magic_pages = alloc_magic_pages, - .count_pgtables = count_pgtables_x86_32, - .setup_pgtables = setup_pgtables_x86_32, - .start_info = start_info_x86_32, - .shared_info = shared_info_x86_32, - .vcpu = vcpu_x86_32, -}; static struct xc_dom_arch xc_dom_32_pae = { .guest_type = "xen-3.0-x86_32p", .native_protocol = XEN_IO_PROTO_ABI_X86_32, @@ -648,7 +684,6 @@ static void __init register_arch_hooks(void) { - xc_dom_register_arch_hooks(&xc_dom_32); xc_dom_register_arch_hooks(&xc_dom_32_pae); xc_dom_register_arch_hooks(&xc_dom_64); } @@ -725,6 +760,9 @@ } dom->p2m_host = xc_dom_malloc(dom, sizeof(xen_pfn_t) * dom->total_pages); + if ( dom->p2m_host == NULL ) + return -EINVAL; + if ( dom->superpages ) { int count = dom->total_pages >> SUPERPAGE_PFN_SHIFT; @@ -750,6 +788,13 @@ } else { + /* try to claim pages for early warning of insufficient memory avail */ + if ( dom->claim_enabled ) { + rc = xc_domain_claim_pages(dom->xch, dom->guest_domid, + dom->total_pages); + if ( rc ) + return rc; + } /* setup initial p2m */ for ( pfn = 0; pfn < dom->total_pages; pfn++ ) dom->p2m_host[pfn] = pfn; @@ -766,6 +811,11 @@ dom->xch, dom->guest_domid, allocsz, 0, 0, &dom->p2m_host[i]); } + + /* Ensure no unclaimed pages are left unused. + * OK to call if hadn't done the earlier claim call. */ + (void)xc_domain_claim_pages(dom->xch, dom->guest_domid, + 0 /* cancels the claim */); } return rc; @@ -866,10 +916,15 @@ return 0; } +int xc_dom_feature_translated(struct xc_dom_image *dom) +{ + return elf_xen_feature_get(XENFEAT_auto_translated_physmap, dom->f_active); +} + /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_domain.c xen-4.3.0/tools/libxc/xc_domain.c --- xen-4.2.2/tools/libxc/xc_domain.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_domain.c 2013-07-09 10:46:56.000000000 +0000 @@ -110,6 +110,83 @@ } +int xc_domain_node_setaffinity(xc_interface *xch, + uint32_t domid, + xc_nodemap_t nodemap) +{ + DECLARE_DOMCTL; + DECLARE_HYPERCALL_BUFFER(uint8_t, local); + int ret = -1; + int nodesize; + + nodesize = xc_get_nodemap_size(xch); + if (!nodesize) + { + PERROR("Could not get number of nodes"); + goto out; + } + + local = xc_hypercall_buffer_alloc(xch, local, nodesize); + if ( local == NULL ) + { + PERROR("Could not allocate memory for setnodeaffinity domctl hypercall"); + goto out; + } + + domctl.cmd = XEN_DOMCTL_setnodeaffinity; + domctl.domain = (domid_t)domid; + + memcpy(local, nodemap, nodesize); + set_xen_guest_handle(domctl.u.nodeaffinity.nodemap.bitmap, local); + domctl.u.nodeaffinity.nodemap.nr_bits = nodesize * 8; + + ret = do_domctl(xch, &domctl); + + xc_hypercall_buffer_free(xch, local); + + out: + return ret; +} + +int xc_domain_node_getaffinity(xc_interface *xch, + uint32_t domid, + xc_nodemap_t nodemap) +{ + DECLARE_DOMCTL; + DECLARE_HYPERCALL_BUFFER(uint8_t, local); + int ret = -1; + int nodesize; + + nodesize = xc_get_nodemap_size(xch); + if (!nodesize) + { + PERROR("Could not get number of nodes"); + goto out; + } + + local = xc_hypercall_buffer_alloc(xch, local, nodesize); + if ( local == NULL ) + { + PERROR("Could not allocate memory for getnodeaffinity domctl hypercall"); + goto out; + } + + domctl.cmd = XEN_DOMCTL_getnodeaffinity; + domctl.domain = (domid_t)domid; + + set_xen_guest_handle(domctl.u.nodeaffinity.nodemap.bitmap, local); + domctl.u.nodeaffinity.nodemap.nr_bits = nodesize * 8; + + ret = do_domctl(xch, &domctl); + + memcpy(nodemap, local, nodesize); + + xc_hypercall_buffer_free(xch, local); + + out: + return ret; +} + int xc_vcpu_setaffinity(xc_interface *xch, uint32_t domid, int vcpu, @@ -142,7 +219,7 @@ set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); - domctl.u.vcpuaffinity.cpumap.nr_cpus = cpusize * 8; + domctl.u.vcpuaffinity.cpumap.nr_bits = cpusize * 8; ret = do_domctl(xch, &domctl); @@ -182,7 +259,7 @@ domctl.u.vcpuaffinity.vcpu = vcpu; set_xen_guest_handle(domctl.u.vcpuaffinity.cpumap.bitmap, local); - domctl.u.vcpuaffinity.cpumap.nr_cpus = cpusize * 8; + domctl.u.vcpuaffinity.cpumap.nr_bits = cpusize * 8; ret = do_domctl(xch, &domctl); @@ -234,6 +311,7 @@ info->ssidref = domctl.u.getdomaininfo.ssidref; info->nr_pages = domctl.u.getdomaininfo.tot_pages; + info->nr_outstanding_pages = domctl.u.getdomaininfo.outstanding_pages; info->nr_shared_pages = domctl.u.getdomaininfo.shr_pages; info->nr_paged_pages = domctl.u.getdomaininfo.paged_pages; info->max_memkb = domctl.u.getdomaininfo.max_pages << (PAGE_SHIFT-10); @@ -283,6 +361,22 @@ return ret; } +/* set broken page p2m */ +int xc_set_broken_page_p2m(xc_interface *xch, + uint32_t domid, + unsigned long pfn) +{ + int ret; + DECLARE_DOMCTL; + + domctl.cmd = XEN_DOMCTL_set_broken_page_p2m; + domctl.domain = (domid_t)domid; + domctl.u.set_broken_page_p2m.pfn = pfn; + ret = do_domctl(xch, &domctl); + + return ret ? -1 : 0; +} + /* get info from hvm guest for save */ int xc_domain_hvm_getcontext(xc_interface *xch, uint32_t domid, @@ -759,6 +853,27 @@ return do_memory_op(xch, XENMEM_add_to_physmap, &xatp, sizeof(xatp)); } +int xc_domain_claim_pages(xc_interface *xch, + uint32_t domid, + unsigned long nr_pages) +{ + int err; + struct xen_memory_reservation reservation = { + .nr_extents = nr_pages, + .extent_order = 0, + .mem_flags = 0, /* no flags */ + .domid = domid + }; + + set_xen_guest_handle(reservation.extent_start, HYPERCALL_BUFFER_NULL); + + err = do_memory_op(xch, XENMEM_claim_pages, &reservation, sizeof(reservation)); + /* Ignore it if the hypervisor does not support the call. */ + if (err == -1 && errno == ENOSYS) + err = errno = 0; + return err; +} + int xc_domain_populate_physmap(xc_interface *xch, uint32_t domid, unsigned long nr_extents, @@ -1517,7 +1632,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_domain_restore.c xen-4.3.0/tools/libxc/xc_domain_restore.c --- xen-4.2.2/tools/libxc/xc_domain_restore.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_domain_restore.c 2013-07-09 10:46:56.000000000 +0000 @@ -23,6 +23,19 @@ * */ +/* + * The superpages flag in restore has two different meanings depending on + * the type of domain. + * + * For an HVM domain, the flag means to look for properly aligned contiguous + * pages and try to allocate a superpage to satisfy it. If that fails, + * fall back to small pages. + * + * For a PV domain, the flag means allocate all memory as superpages. If that + * fails, the restore fails. This behavior is required for PV guests who + * want to use superpages. + */ + #include #include @@ -41,6 +54,9 @@ xen_pfn_t *live_p2m; /* Live mapping of the table mapping each PFN to its current MFN. */ xen_pfn_t *p2m; /* A table mapping each PFN to its new MFN. */ xen_pfn_t *p2m_batch; /* A table of P2M mappings in the current region. */ + xen_pfn_t *p2m_saved_batch; /* Copy of p2m_batch array for pv superpage alloc */ + int superpages; /* Superpage allocation has been requested */ + int hvm; /* This is an hvm domain */ int completed; /* Set when a consistent image is available */ int last_checkpoint; /* Set when we should commit to the current checkpoint when it completes. */ int compressing; /* Set when sender signals that pages would be sent compressed (for Remus) */ @@ -49,11 +65,6 @@ #define HEARTBEAT_MS 1000 -#define SUPERPAGE_PFN_SHIFT 9 -#define SUPERPAGE_NR_PFNS (1UL << SUPERPAGE_PFN_SHIFT) - -#define SUPER_PAGE_START(pfn) (((pfn) & (SUPERPAGE_NR_PFNS-1)) == 0 ) - #ifndef __MINIOS__ static ssize_t rdexact(xc_interface *xch, struct restore_ctx *ctx, int fd, void* buf, size_t size) @@ -103,6 +114,49 @@ #else #define RDEXACT read_exact #endif + +#define SUPERPAGE_PFN_SHIFT 9 +#define SUPERPAGE_NR_PFNS (1UL << SUPERPAGE_PFN_SHIFT) +#define SUPERPAGE(_pfn) ((_pfn) & (~(SUPERPAGE_NR_PFNS-1))) +#define SUPER_PAGE_START(pfn) (((pfn) & (SUPERPAGE_NR_PFNS-1)) == 0 ) + +/* +** When we're restoring into a pv superpage-allocated guest, we take +** a copy of the p2m_batch array to preserve the pfn, then allocate the +** corresponding superpages. We then fill in the p2m array using the saved +** pfns. +*/ +static int alloc_superpage_mfns( + xc_interface *xch, uint32_t dom, struct restore_ctx *ctx, int nr_mfns) +{ + int i, j, max = 0; + unsigned long pfn, base_pfn, mfn; + + for (i = 0; i < nr_mfns; i++) + { + pfn = ctx->p2m_batch[i]; + base_pfn = SUPERPAGE(pfn); + if (ctx->p2m[base_pfn] != (INVALID_P2M_ENTRY-2)) + { + ctx->p2m_saved_batch[max] = base_pfn; + ctx->p2m_batch[max] = base_pfn; + max++; + ctx->p2m[base_pfn] = INVALID_P2M_ENTRY-2; + } + } + if (xc_domain_populate_physmap_exact(xch, dom, max, SUPERPAGE_PFN_SHIFT, + 0, ctx->p2m_batch) != 0) + return 1; + + for (i = 0; i < max; i++) + { + mfn = ctx->p2m_batch[i]; + pfn = ctx->p2m_saved_batch[i]; + for (j = 0; j < SUPERPAGE_NR_PFNS; j++) + ctx->p2m[pfn++] = mfn++; + } + return 0; +} /* ** In the state file (or during transfer), all page-table pages are ** converted into a 'canonical' form where references to actual mfns @@ -113,20 +167,17 @@ static int uncanonicalize_pagetable( xc_interface *xch, uint32_t dom, struct restore_ctx *ctx, void *page) { - int i, pte_last, nr_mfns = 0; + int i, rc, pte_last, nr_mfns = 0; unsigned long pfn; uint64_t pte; struct domain_info_context *dinfo = &ctx->dinfo; - pte_last = PAGE_SIZE / ((ctx->pt_levels == 2)? 4 : 8); + pte_last = PAGE_SIZE / 8; /* First pass: work out how many (if any) MFNs we need to alloc */ for ( i = 0; i < pte_last; i++ ) { - if ( ctx->pt_levels == 2 ) - pte = ((uint32_t *)page)[i]; - else - pte = ((uint64_t *)page)[i]; + pte = ((uint64_t *)page)[i]; /* XXX SMH: below needs fixing for PROT_NONE etc */ if ( !(pte & _PAGE_PRESENT) ) @@ -152,23 +203,27 @@ } /* Allocate the requisite number of mfns. */ - if ( nr_mfns && - (xc_domain_populate_physmap_exact(xch, dom, nr_mfns, 0, 0, - ctx->p2m_batch) != 0) ) - { - ERROR("Failed to allocate memory for batch.!\n"); - errno = ENOMEM; - return 0; + if (nr_mfns) + { + if (!ctx->hvm && ctx->superpages) + rc = alloc_superpage_mfns(xch, dom, ctx, nr_mfns); + else + rc = xc_domain_populate_physmap_exact(xch, dom, nr_mfns, 0, 0, + ctx->p2m_batch); + + if (rc) + { + ERROR("Failed to allocate memory for batch.!\n"); + errno = ENOMEM; + return 0; + } } /* Second pass: uncanonicalize each present PTE */ nr_mfns = 0; for ( i = 0; i < pte_last; i++ ) { - if ( ctx->pt_levels == 2 ) - pte = ((uint32_t *)page)[i]; - else - pte = ((uint64_t *)page)[i]; + pte = ((uint64_t *)page)[i]; /* XXX SMH: below needs fixing for PROT_NONE etc */ if ( !(pte & _PAGE_PRESENT) ) @@ -182,10 +237,7 @@ pte &= ~MADDR_MASK_X86; pte |= (uint64_t)ctx->p2m[pfn] << PAGE_SHIFT; - if ( ctx->pt_levels == 2 ) - ((uint32_t *)page)[i] = (uint32_t)pte; - else - ((uint64_t *)page)[i] = (uint64_t)pte; + ((uint64_t *)page)[i] = (uint64_t)pte; } return 1; @@ -243,8 +295,7 @@ if ( chunk_bytes == sizeof (ctxt.x32) ) { dinfo->guest_width = 4; - if ( ctx->pt_levels > 2 ) - ctx->pt_levels = 3; + ctx->pt_levels = 3; } else if ( chunk_bytes == sizeof (ctxt.x64) ) { @@ -962,9 +1013,15 @@ countpages = count; for (i = oldcount; i < buf->nr_pages; ++i) - if ((buf->pfn_types[i] & XEN_DOMCTL_PFINFO_LTAB_MASK) == XEN_DOMCTL_PFINFO_XTAB - ||(buf->pfn_types[i] & XEN_DOMCTL_PFINFO_LTAB_MASK) == XEN_DOMCTL_PFINFO_XALLOC) + { + unsigned long pagetype; + + pagetype = buf->pfn_types[i] & XEN_DOMCTL_PFINFO_LTAB_MASK; + if ( pagetype == XEN_DOMCTL_PFINFO_XTAB || + pagetype == XEN_DOMCTL_PFINFO_BROKEN || + pagetype == XEN_DOMCTL_PFINFO_XALLOC ) --countpages; + } if (!countpages) return count; @@ -1018,8 +1075,8 @@ static int apply_batch(xc_interface *xch, uint32_t dom, struct restore_ctx *ctx, xen_pfn_t* region_mfn, unsigned long* pfn_type, int pae_extended_cr3, - unsigned int hvm, struct xc_mmu* mmu, - pagebuf_t* pagebuf, int curbatch, int superpages) + struct xc_mmu* mmu, + pagebuf_t* pagebuf, int curbatch) { int i, j, curpage, nr_mfns; int k, scount; @@ -1061,7 +1118,7 @@ /* Is this the next expected continuation? */ if ( pfn == superpage_start + scount ) { - if ( !superpages ) + if ( !ctx->superpages ) { ERROR("Unexpexted codepath with no superpages"); return -1; @@ -1114,16 +1171,17 @@ } /* Are we ready to start a new superpage candidate? */ - if ( superpages && SUPER_PAGE_START(pfn) ) + if ( ctx->hvm && ctx->superpages && SUPER_PAGE_START(pfn) ) { superpage_start=pfn; scount++; - continue; } - - /* Add the current pfn to pfn_batch */ - ctx->p2m_batch[nr_mfns++] = pfn; - ctx->p2m[pfn]--; + else + { + /* Add the current pfn to pfn_batch */ + ctx->p2m_batch[nr_mfns++] = pfn; + ctx->p2m[pfn]--; + } } } @@ -1144,9 +1202,14 @@ { DPRINTF("Mapping order 0, %d; first pfn %lx\n", nr_mfns, ctx->p2m_batch[0]); - if(xc_domain_populate_physmap_exact(xch, dom, nr_mfns, 0, - 0, ctx->p2m_batch) != 0) - { + if (!ctx->hvm && ctx->superpages) + rc = alloc_superpage_mfns(xch, dom, ctx, nr_mfns); + else + rc = xc_domain_populate_physmap_exact(xch, dom, nr_mfns, 0, 0, + ctx->p2m_batch); + + if (rc) + { ERROR("Failed to allocate memory for batch.!\n"); errno = ENOMEM; return -1; @@ -1175,11 +1238,16 @@ || pagetype == XEN_DOMCTL_PFINFO_XALLOC ) region_mfn[i] = ~0UL; /* map will fail but we don't care */ else - region_mfn[i] = hvm ? pfn : ctx->p2m[pfn]; + region_mfn[i] = ctx->hvm ? pfn : ctx->p2m[pfn]; } /* Map relevant mfns */ pfn_err = calloc(j, sizeof(*pfn_err)); + if ( pfn_err == NULL ) + { + PERROR("allocation for pfn_err failed"); + return -1; + } region_base = xc_map_foreign_bulk( xch, dom, PROT_WRITE, region_mfn, pfn_err, j); @@ -1200,6 +1268,17 @@ /* a bogus/unmapped/allocate-only page: skip it */ continue; + if ( pagetype == XEN_DOMCTL_PFINFO_BROKEN ) + { + if ( xc_set_broken_page_p2m(xch, dom, pfn) ) + { + ERROR("Set p2m for broken page failed, " + "dom=%d, pfn=%lx\n", dom, pfn); + goto err_mapped; + } + continue; + } + if (pfn_err[i]) { ERROR("unexpected PFN mapping failure pfn %lx map_mfn %lx p2m_mfn %lx", @@ -1298,7 +1377,7 @@ } } - if ( !hvm && + if ( !ctx->hvm && xc_add_mmu_update(xch, mmu, (((unsigned long long)mfn) << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE, pfn) ) @@ -1382,6 +1461,8 @@ struct restore_ctx *ctx = &_ctx; struct domain_info_context *dinfo = &ctx->dinfo; + DPRINTF("%s: starting restore of new domid %u", __func__, dom); + pagebuf_init(&pagebuf); memset(&tailbuf, 0, sizeof(tailbuf)); tailbuf.ishvm = hvm; @@ -1389,6 +1470,9 @@ memset(ctx, 0, sizeof(*ctx)); + ctx->superpages = superpages; + ctx->hvm = hvm; + ctxt = xc_hypercall_buffer_alloc(xch, ctxt, sizeof(*ctxt)); if ( ctxt == NULL ) @@ -1408,7 +1492,7 @@ PERROR("read: p2m_size"); goto out; } - DPRINTF("xc_domain_restore start: p2m_size = %lx\n", dinfo->p2m_size); + DPRINTF("%s: p2m_size = %lx\n", __func__, dinfo->p2m_size); if ( !get_platform_info(xch, dom, &ctx->max_mfn, &ctx->hvirt_start, &ctx->pt_levels, &dinfo->guest_width) ) @@ -1421,7 +1505,7 @@ * assume the guest will be the same as we are. We'll fix that later * if we discover otherwise. */ dinfo->guest_width = sizeof(unsigned long); - ctx->pt_levels = (dinfo->guest_width == 8) ? 4 : (ctx->pt_levels == 2) ? 2 : 3; + ctx->pt_levels = (dinfo->guest_width == 8) ? 4 : 3; if ( !hvm ) { @@ -1452,6 +1536,17 @@ region_mfn = malloc(ROUNDUP(MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT)); ctx->p2m_batch = malloc(ROUNDUP(MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT)); + if (!ctx->hvm && ctx->superpages) + { + ctx->p2m_saved_batch = + malloc(ROUNDUP(MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT)); + if ( ctx->p2m_saved_batch == NULL ) + { + ERROR("saved batch memory alloc failed"); + errno = ENOMEM; + goto out; + } + } if ( (ctx->p2m == NULL) || (pfn_type == NULL) || (region_mfn == NULL) || (ctx->p2m_batch == NULL) ) @@ -1556,6 +1651,12 @@ mfn = ctx->p2m[pfn]; buf = xc_map_foreign_range(xch, dom, PAGE_SIZE, PROT_READ | PROT_WRITE, mfn); + if ( buf == NULL ) + { + ERROR("xc_map_foreign_range for generation id" + " buffer failed"); + goto out; + } generationid = *(unsigned long long *)(buf + offset); *(unsigned long long *)(buf + offset) = generationid + 1; @@ -1575,8 +1676,7 @@ int brc; brc = apply_batch(xch, dom, ctx, region_mfn, pfn_type, - pae_extended_cr3, hvm, mmu, &pagebuf, curbatch, - superpages); + pae_extended_cr3, mmu, &pagebuf, curbatch); if ( brc < 0 ) goto out; @@ -1713,6 +1813,11 @@ l3tab = (uint64_t *) xc_map_foreign_range(xch, dom, PAGE_SIZE, PROT_READ, ctx->p2m[i]); + if ( l3tab == NULL ) + { + PERROR("xc_map_foreign_range failed (for l3tab)"); + goto out; + } for ( j = 0; j < 4; j++ ) l3ptes[j] = l3tab[j]; @@ -1739,6 +1844,11 @@ l3tab = (uint64_t *) xc_map_foreign_range(xch, dom, PAGE_SIZE, PROT_READ | PROT_WRITE, ctx->p2m[i]); + if ( l3tab == NULL ) + { + PERROR("xc_map_foreign_range failed (for l3tab, 2nd)"); + goto out; + } for ( j = 0; j < 4; j++ ) l3tab[j] = l3ptes[j]; @@ -1895,8 +2005,14 @@ if ( i == 0 ) { /* - * Uncanonicalise the suspend-record frame number and poke - * resume record. + * Uncanonicalise the start info frame number and poke in + * updated values into the start info itself. + * + * The start info MFN is the 3rd argument to the + * HYPERVISOR_sched_op hypercall when op==SCHEDOP_shutdown + * and reason==SHUTDOWN_suspend, it is canonicalised in + * xc_domain_save and therefore the PFN is found in the + * edx register. */ pfn = GET_FIELD(ctxt, user_regs.edx); if ( (pfn >= dinfo->p2m_size) || @@ -1909,6 +2025,12 @@ SET_FIELD(ctxt, user_regs.edx, mfn); start_info = xc_map_foreign_range( xch, dom, PAGE_SIZE, PROT_READ | PROT_WRITE, mfn); + if ( start_info == NULL ) + { + PERROR("xc_map_foreign_range failed (for start_info)"); + goto out; + } + SET_FIELD(start_info, nr_pages, dinfo->p2m_size); SET_FIELD(start_info, shared_info, shared_info_frame<p2m); free(pfn_type); + free(region_mfn); + free(ctx->p2m_batch); + pagebuf_free(&pagebuf); tailbuf_free(&tailbuf); /* discard cache for save file */ @@ -2215,14 +2345,14 @@ fcntl(io_fd, F_SETFL, orig_io_fd_flags); - DPRINTF("Restore exit with rc=%d\n", rc); + DPRINTF("Restore exit of domid %u with rc=%d\n", dom, rc); return rc; } /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_domain_save.c xen-4.3.0/tools/libxc/xc_domain_save.c --- xen-4.2.2/tools/libxc/xc_domain_save.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_domain_save.c 2013-07-09 10:46:56.000000000 +0000 @@ -139,6 +139,13 @@ return 0; } +static int outbuf_free(struct outbuf *ob) +{ + free(ob->buf); + ob->buf = NULL; + return 0; +} + static inline int outbuf_write(xc_interface *xch, struct outbuf* ob, void* buf, size_t len) { @@ -423,10 +430,7 @@ ** reserved hypervisor mappings. This depends on the current ** page table type as well as the number of paging levels. */ - xen_start = xen_end = pte_last = PAGE_SIZE / ((ctx->pt_levels == 2) ? 4 : 8); - - if ( (ctx->pt_levels == 2) && (type == XEN_DOMCTL_PFINFO_L2TAB) ) - xen_start = (ctx->hvirt_start >> L2_PAGETABLE_SHIFT); + xen_start = xen_end = pte_last = PAGE_SIZE / 8; if ( (ctx->pt_levels == 3) && (type == XEN_DOMCTL_PFINFO_L3TAB) ) xen_start = L3_PAGETABLE_ENTRIES_PAE; @@ -474,10 +478,7 @@ { unsigned long pfn, mfn; - if ( ctx->pt_levels == 2 ) - pte = ((const uint32_t*)spage)[i]; - else - pte = ((const uint64_t*)spage)[i]; + pte = ((const uint64_t*)spage)[i]; if ( (i >= xen_start) && (i < xen_end) ) pte = 0; @@ -515,10 +516,7 @@ pte &= ~(_PAGE_USER|_PAGE_RW|_PAGE_ACCESSED); } - if ( ctx->pt_levels == 2 ) - ((uint32_t*)dpage)[i] = pte; - else - ((uint64_t*)dpage)[i] = pte; + ((uint64_t*)dpage)[i] = pte; } return race; @@ -897,6 +895,8 @@ int completed = 0; + DPRINTF("%s: starting save of domid %u", __func__, dom); + if ( hvm && !callbacks->switch_qemu_logdirty ) { ERROR("No switch_qemu_logdirty callback provided."); @@ -1277,6 +1277,13 @@ if ( !hvm ) gmfn = pfn_to_mfn(gmfn); + if ( pfn_type[j] == XEN_DOMCTL_PFINFO_BROKEN ) + { + pfn_type[j] |= pfn_batch[j]; + ++run; + continue; + } + if ( pfn_err[j] ) { if ( pfn_type[j] == XEN_DOMCTL_PFINFO_XTAB ) @@ -1371,8 +1378,12 @@ } } - /* skip pages that aren't present or are alloc-only */ + /* + * skip pages that aren't present, + * or are broken, or are alloc-only + */ if ( pagetype == XEN_DOMCTL_PFINFO_XTAB + || pagetype == XEN_DOMCTL_PFINFO_BROKEN || pagetype == XEN_DOMCTL_PFINFO_XALLOC ) continue; @@ -1868,7 +1879,14 @@ goto out; } - /* Canonicalise the suspend-record frame number. */ + /* + * Canonicalise the start info frame number. + * + * The start info MFN is the 3rd argument to the + * HYPERVISOR_sched_op hypercall when op==SCHEDOP_shutdown and + * reason==SHUTDOWN_suspend and is therefore found in the edx + * register. + */ mfn = GET_FIELD(&ctxt, user_regs.edx); if ( !MFN_IS_IN_PSEUDOPHYS_MAP(mfn) ) { @@ -2111,8 +2129,10 @@ free(pfn_batch); free(pfn_err); free(to_fix); + free(hvm_buf); + outbuf_free(&ob_pagebuf); - DPRINTF("Save exit rc=%d\n",rc); + DPRINTF("Save exit of domid %u with rc=%d\n", dom, rc); return !!rc; } @@ -2120,7 +2140,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_evtchn.c xen-4.3.0/tools/libxc/xc_evtchn.c --- xen-4.2.2/tools/libxc/xc_evtchn.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_evtchn.c 2013-07-09 10:46:56.000000000 +0000 @@ -126,7 +126,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_flask.c xen-4.3.0/tools/libxc/xc_flask.c --- xen-4.2.2/tools/libxc/xc_flask.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_flask.c 2013-07-09 10:46:56.000000000 +0000 @@ -422,10 +422,20 @@ return xc_flask_op(xch, &op); } +int xc_flask_relabel_domain(xc_interface *xch, int domid, uint32_t sid) +{ + DECLARE_FLASK_OP; + op.cmd = FLASK_RELABEL_DOMAIN; + op.u.relabel.domid = domid; + op.u.relabel.sid = sid; + + return xc_flask_op(xch, &op); +} + /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_foreign_memory.c xen-4.3.0/tools/libxc/xc_foreign_memory.c --- xen-4.2.2/tools/libxc/xc_foreign_memory.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_foreign_memory.c 2013-07-09 10:46:56.000000000 +0000 @@ -124,7 +124,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_gnttab.c xen-4.3.0/tools/libxc/xc_gnttab.c --- xen-4.2.2/tools/libxc/xc_gnttab.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_gnttab.c 2013-07-09 10:46:56.000000000 +0000 @@ -233,7 +233,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_hcall_buf.c xen-4.3.0/tools/libxc/xc_hcall_buf.c --- xen-4.2.2/tools/libxc/xc_hcall_buf.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_hcall_buf.c 2013-07-09 10:46:56.000000000 +0000 @@ -231,7 +231,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_hvm_build_arm.c xen-4.3.0/tools/libxc/xc_hvm_build_arm.c --- xen-4.2.2/tools/libxc/xc_hvm_build_arm.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_hvm_build_arm.c 2013-07-09 10:46:56.000000000 +0000 @@ -22,7 +22,7 @@ #include int xc_hvm_build(xc_interface *xch, uint32_t domid, - const struct xc_hvm_build_args *hvm_args) + struct xc_hvm_build_args *hvm_args) { errno = ENOSYS; return -1; @@ -41,7 +41,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_hvm_build_x86.c xen-4.3.0/tools/libxc/xc_hvm_build_x86.c --- xen-4.2.2/tools/libxc/xc_hvm_build_x86.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_hvm_build_x86.c 2013-07-09 10:46:56.000000000 +0000 @@ -49,6 +49,40 @@ #define NR_SPECIAL_PAGES 8 #define special_pfn(x) (0xff000u - NR_SPECIAL_PAGES + (x)) +static int modules_init(struct xc_hvm_build_args *args, + uint64_t vend, struct elf_binary *elf, + uint64_t *mstart_out, uint64_t *mend_out) +{ +#define MODULE_ALIGN 1UL << 7 +#define MB_ALIGN 1UL << 20 +#define MKALIGN(x, a) (((uint64_t)(x) + (a) - 1) & ~(uint64_t)((a) - 1)) + uint64_t total_len = 0, offset1 = 0; + + if ( (args->acpi_module.length == 0)&&(args->smbios_module.length == 0) ) + return 0; + + /* Find the total length for the firmware modules with a reasonable large + * alignment size to align each the modules. + */ + total_len = MKALIGN(args->acpi_module.length, MODULE_ALIGN); + offset1 = total_len; + total_len += MKALIGN(args->smbios_module.length, MODULE_ALIGN); + + /* Want to place the modules 1Mb+change behind the loader image. */ + *mstart_out = MKALIGN(elf->pend, MB_ALIGN) + (MB_ALIGN); + *mend_out = *mstart_out + total_len; + + if ( *mend_out > vend ) + return -1; + + if ( args->acpi_module.length != 0 ) + args->acpi_module.guest_addr_out = *mstart_out; + if ( args->smbios_module.length != 0 ) + args->smbios_module.guest_addr_out = *mstart_out + offset1; + + return 0; +} + static void build_hvm_info(void *hvm_info_page, uint64_t mem_size, uint64_t mmio_start, uint64_t mmio_size) { @@ -86,9 +120,8 @@ hvm_info->checksum = -sum; } -static int loadelfimage( - xc_interface *xch, - struct elf_binary *elf, uint32_t dom, unsigned long *parray) +static int loadelfimage(xc_interface *xch, struct elf_binary *elf, + uint32_t dom, unsigned long *parray) { privcmd_mmap_entry_t *entries = NULL; unsigned long pfn_start = elf->pstart >> PAGE_SHIFT; @@ -104,21 +137,23 @@ for ( i = 0; i < pages; i++ ) entries[i].mfn = parray[(elf->pstart >> PAGE_SHIFT) + i]; - elf->dest = xc_map_foreign_ranges( + elf->dest_base = xc_map_foreign_ranges( xch, dom, pages << PAGE_SHIFT, PROT_READ | PROT_WRITE, 1 << PAGE_SHIFT, entries, pages); - if ( elf->dest == NULL ) + if ( elf->dest_base == NULL ) goto err; + elf->dest_size = pages * PAGE_SIZE; - elf->dest += elf->pstart & (PAGE_SIZE - 1); + ELF_ADVANCE_DEST(elf, elf->pstart & (PAGE_SIZE - 1)); /* Load the initial elf image. */ rc = elf_load_binary(elf); if ( rc < 0 ) PERROR("Failed to load elf binary\n"); - munmap(elf->dest, pages << PAGE_SHIFT); - elf->dest = NULL; + munmap(elf->dest_base, pages << PAGE_SHIFT); + elf->dest_base = NULL; + elf->dest_size = 0; err: free(entries); @@ -126,6 +161,66 @@ return rc; } +static int loadmodules(xc_interface *xch, + struct xc_hvm_build_args *args, + uint64_t mstart, uint64_t mend, + uint32_t dom, unsigned long *parray) +{ + privcmd_mmap_entry_t *entries = NULL; + unsigned long pfn_start; + unsigned long pfn_end; + size_t pages; + uint32_t i; + uint8_t *dest; + int rc = -1; + + if ( (mstart == 0)||(mend == 0) ) + return 0; + + pfn_start = (unsigned long)(mstart >> PAGE_SHIFT); + pfn_end = (unsigned long)((mend + PAGE_SIZE - 1) >> PAGE_SHIFT); + pages = pfn_end - pfn_start; + + /* Map address space for module list. */ + entries = calloc(pages, sizeof(privcmd_mmap_entry_t)); + if ( entries == NULL ) + goto error_out; + + for ( i = 0; i < pages; i++ ) + entries[i].mfn = parray[(mstart >> PAGE_SHIFT) + i]; + + dest = xc_map_foreign_ranges( + xch, dom, pages << PAGE_SHIFT, PROT_READ | PROT_WRITE, 1 << PAGE_SHIFT, + entries, pages); + if ( dest == NULL ) + goto error_out; + + /* Zero the range so padding is clear between modules */ + memset(dest, 0, pages << PAGE_SHIFT); + + /* Load modules into range */ + if ( args->acpi_module.length != 0 ) + { + memcpy(dest, + args->acpi_module.data, + args->acpi_module.length); + } + if ( args->smbios_module.length != 0 ) + { + memcpy(dest + (args->smbios_module.guest_addr_out - mstart), + args->smbios_module.data, + args->smbios_module.length); + } + + munmap(dest, pages << PAGE_SHIFT); + rc = 0; + + error_out: + free(entries); + + return rc; +} + /* * Check whether there exists mmio hole in the specified memory range. * Returns 1 if exists, else returns 0. @@ -140,7 +235,7 @@ } static int setup_guest(xc_interface *xch, - uint32_t dom, const struct xc_hvm_build_args *args, + uint32_t dom, struct xc_hvm_build_args *args, char *image, unsigned long image_size) { xen_pfn_t *page_array = NULL; @@ -153,11 +248,13 @@ uint32_t *ident_pt; struct elf_binary elf; uint64_t v_start, v_end; + uint64_t m_start = 0, m_end = 0; int rc; xen_capabilities_info_t caps; unsigned long stat_normal_pages = 0, stat_2mb_pages = 0, stat_1gb_pages = 0; int pod_mode = 0; + int claim_enabled = args->claim_enabled; if ( nr_pages > target_pages ) pod_mode = XENMEMF_populate_on_demand; @@ -178,11 +275,19 @@ goto error_out; } + if ( modules_init(args, v_end, &elf, &m_start, &m_end) != 0 ) + { + ERROR("Insufficient space to load modules."); + goto error_out; + } + IPRINTF("VIRTUAL MEMORY ARRANGEMENT:\n" " Loader: %016"PRIx64"->%016"PRIx64"\n" + " Modules: %016"PRIx64"->%016"PRIx64"\n" " TOTAL: %016"PRIx64"->%016"PRIx64"\n" " ENTRY ADDRESS: %016"PRIx64"\n", elf.pstart, elf.pend, + m_start, m_end, v_start, v_end, elf_uval(&elf, elf.ehdr, e_entry)); @@ -227,6 +332,16 @@ xch, dom, 0xa0, 0, pod_mode, &page_array[0x00]); cur_pages = 0xc0; stat_normal_pages = 0xc0; + + /* try to claim pages for early warning of insufficient memory available */ + if ( claim_enabled ) { + rc = xc_domain_claim_pages(xch, dom, nr_pages - cur_pages); + if ( rc != 0 ) + { + PERROR("Could not allocate memory for HVM guest as we cannot claim memory!"); + goto error_out; + } + } while ( (rc == 0) && (nr_pages > cur_pages) ) { /* Clip count to maximum 1GB extent. */ @@ -337,6 +452,9 @@ if ( loadelfimage(xch, &elf, dom, page_array) != 0 ) goto error_out; + if ( loadmodules(xch, args, m_start, m_end, dom, page_array) != 0 ) + goto error_out; + if ( (hvm_info_page = xc_map_foreign_range( xch, dom, PAGE_SIZE, PROT_READ | PROT_WRITE, HVM_INFO_PFN)) == NULL ) @@ -401,19 +519,26 @@ munmap(page0, PAGE_SIZE); } - free(page_array); - return 0; - + rc = 0; + goto out; error_out: + rc = -1; + out: + if ( elf_check_broken(&elf) ) + ERROR("HVM ELF broken: %s", elf_check_broken(&elf)); + + /* ensure no unclaimed pages are left unused */ + xc_domain_claim_pages(xch, dom, 0 /* cancels the claim */); + free(page_array); - return -1; + return rc; } /* xc_hvm_build: * Create a domain for a virtualized Linux, using files/filenames. */ int xc_hvm_build(xc_interface *xch, uint32_t domid, - const struct xc_hvm_build_args *hvm_args) + struct xc_hvm_build_args *hvm_args) { struct xc_hvm_build_args args = *hvm_args; void *image; @@ -441,6 +566,15 @@ sts = setup_guest(xch, domid, &args, image, image_size); + if (!sts) + { + /* Return module load addresses to caller */ + hvm_args->acpi_module.guest_addr_out = + args.acpi_module.guest_addr_out; + hvm_args->smbios_module.guest_addr_out = + args.smbios_module.guest_addr_out; + } + free(image); return sts; @@ -461,6 +595,7 @@ { struct xc_hvm_build_args args = {}; + memset(&args, 0, sizeof(struct xc_hvm_build_args)); args.mem_size = (uint64_t)memsize << 20; args.mem_target = (uint64_t)target << 20; args.image_file_name = image_name; @@ -471,7 +606,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_linux.c xen-4.3.0/tools/libxc/xc_linux.c --- xen-4.2.2/tools/libxc/xc_linux.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_linux.c 2013-07-09 10:46:56.000000000 +0000 @@ -70,7 +70,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_linux_osdep.c xen-4.3.0/tools/libxc/xc_linux_osdep.c --- xen-4.2.2/tools/libxc/xc_linux_osdep.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_linux_osdep.c 2013-07-09 10:46:56.000000000 +0000 @@ -129,7 +129,7 @@ do { - *mfn ^= XEN_DOMCTL_PFINFO_PAGEDTAB; + *mfn ^= PRIVCMD_MMAPBATCH_PAGED_ERROR; usleep(100); rc = ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, &ioctlx); } @@ -166,8 +166,8 @@ for ( i = 0; i < num; i++ ) { - if ( (arr[i] & XEN_DOMCTL_PFINFO_LTAB_MASK) == - XEN_DOMCTL_PFINFO_PAGEDTAB ) + if ( (arr[i] & PRIVCMD_MMAPBATCH_MFN_ERROR) == + PRIVCMD_MMAPBATCH_PAGED_ERROR ) { unsigned long paged_addr = (unsigned long)addr + (i << XC_PAGE_SHIFT); rc = xc_map_foreign_batch_single(fd, dom, &arr[i], @@ -323,12 +323,12 @@ default: err[i] = -EINVAL; continue; - case XEN_DOMCTL_PFINFO_PAGEDTAB: + case PRIVCMD_MMAPBATCH_PAGED_ERROR: if ( rc != -ENOENT ) { err[i] = rc ?: -EINVAL; continue; - } + } rc = xc_map_foreign_batch_single(fd, dom, pfn + i, (unsigned long)addr + ((unsigned long)i<> XC_PAGE_SHIFT; arr = calloc(num, sizeof(xen_pfn_t)); + if ( arr == NULL ) + return NULL; for ( i = 0; i < num; i++ ) arr[i] = mfn + i; @@ -402,6 +404,8 @@ num_per_entry = chunksize >> XC_PAGE_SHIFT; num = num_per_entry * nentries; arr = calloc(num, sizeof(xen_pfn_t)); + if ( arr == NULL ) + return NULL; for ( i = 0; i < nentries; i++ ) for ( j = 0; j < num_per_entry; j++ ) @@ -865,7 +869,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_mem_access.c xen-4.3.0/tools/libxc/xc_mem_access.c --- xen-4.2.2/tools/libxc/xc_mem_access.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_mem_access.c 2013-07-09 10:46:56.000000000 +0000 @@ -58,7 +58,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * indent-tabs-mode: nil * End: diff -Nru xen-4.2.2/tools/libxc/xc_mem_paging.c xen-4.3.0/tools/libxc/xc_mem_paging.c --- xen-4.2.2/tools/libxc/xc_mem_paging.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_mem_paging.c 2013-07-09 10:46:56.000000000 +0000 @@ -103,7 +103,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * indent-tabs-mode: nil * End: diff -Nru xen-4.2.2/tools/libxc/xc_minios.c xen-4.3.0/tools/libxc/xc_minios.c --- xen-4.2.2/tools/libxc/xc_minios.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_minios.c 2013-07-09 10:46:56.000000000 +0000 @@ -109,14 +109,10 @@ const xen_pfn_t *arr, int *err, unsigned int num) { unsigned long pt_prot = 0; -#ifdef __ia64__ - /* TODO */ -#else if (prot & PROT_READ) pt_prot = L1_PROT_RO; if (prot & PROT_WRITE) pt_prot = L1_PROT; -#endif return map_frames_ex(arr, num, 1, 0, 1, dom, err, pt_prot); } @@ -129,14 +125,11 @@ int i; unsigned long addr; -#ifdef __ia64__ - /* TODO */ -#else if (prot & PROT_READ) pt_prot = L1_PROT_RO; if (prot & PROT_WRITE) pt_prot = L1_PROT; -#endif + addr = (unsigned long) map_frames_ex(arr, num, 1, 0, 1, dom, err, pt_prot); for (i = 0; i < num; i++) { if (err[i]) @@ -151,14 +144,12 @@ unsigned long mfn) { unsigned long pt_prot = 0; -#ifdef __ia64__ - /* TODO */ -#else + if (prot & PROT_READ) pt_prot = L1_PROT_RO; if (prot & PROT_WRITE) pt_prot = L1_PROT; -#endif + assert(!(size % getpagesize())); return map_frames_ex(&mfn, size / getpagesize(), 0, 1, 1, dom, NULL, pt_prot); } @@ -172,14 +163,11 @@ int i, j, n; unsigned long pt_prot = 0; void *ret; -#ifdef __ia64__ - /* TODO */ -#else + if (prot & PROT_READ) pt_prot = L1_PROT_RO; if (prot & PROT_WRITE) pt_prot = L1_PROT; -#endif mfns = malloc((size / XC_PAGE_SIZE) * sizeof(*mfns)); @@ -555,7 +543,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_misc.c xen-4.3.0/tools/libxc/xc_misc.c --- xen-4.2.2/tools/libxc/xc_misc.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_misc.c 2013-07-09 10:46:56.000000000 +0000 @@ -54,6 +54,11 @@ return (xc_get_max_cpus(xch) + 7) / 8; } +int xc_get_nodemap_size(xc_interface *xch) +{ + return (xc_get_max_nodes(xch) + 7) / 8; +} + xc_cpumap_t xc_cpumap_alloc(xc_interface *xch) { int sz; @@ -64,6 +69,16 @@ return calloc(1, sz); } +xc_nodemap_t xc_nodemap_alloc(xc_interface *xch) +{ + int sz; + + sz = xc_get_nodemap_size(xch); + if (sz == 0) + return NULL; + return calloc(1, sz); +} + int xc_readconsolering(xc_interface *xch, char *buffer, unsigned int *pnr_chars, @@ -653,7 +668,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_netbsd.c xen-4.3.0/tools/libxc/xc_netbsd.c --- xen-4.2.2/tools/libxc/xc_netbsd.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_netbsd.c 2013-07-09 10:46:56.000000000 +0000 @@ -412,7 +412,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_nomigrate.c xen-4.3.0/tools/libxc/xc_nomigrate.c --- xen-4.2.2/tools/libxc/xc_nomigrate.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_nomigrate.c 2013-07-09 10:46:56.000000000 +0000 @@ -46,7 +46,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_offline_page.c xen-4.3.0/tools/libxc/xc_offline_page.c --- xen-4.2.2/tools/libxc/xc_offline_page.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_offline_page.c 2013-07-09 10:46:56.000000000 +0000 @@ -714,6 +714,11 @@ new_p = xc_map_foreign_range(xch, domid, PAGE_SIZE, PROT_READ|PROT_WRITE, new_mfn); + if ( new_p == NULL ) + { + ERROR("failed to map new_p for copy, guest may be broken?"); + goto failed; + } memcpy(new_p, backup, PAGE_SIZE); munmap(new_p, PAGE_SIZE); mops.arg1.mfn = new_mfn; diff -Nru xen-4.2.2/tools/libxc/xc_pagetab.c xen-4.3.0/tools/libxc/xc_pagetab.c --- xen-4.2.2/tools/libxc/xc_pagetab.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_pagetab.c 2013-07-09 10:46:56.000000000 +0000 @@ -106,7 +106,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_physdev.c xen-4.3.0/tools/libxc/xc_physdev.c --- xen-4.2.2/tools/libxc/xc_physdev.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_physdev.c 2013-07-09 10:46:56.000000000 +0000 @@ -49,7 +49,7 @@ map.domid = domid; map.type = MAP_PIRQ_TYPE_GSI; map.index = index; - map.pirq = *pirq; + map.pirq = *pirq < 0 ? index : *pirq; rc = do_physdev_op(xch, PHYSDEVOP_map_pirq, &map, sizeof(map)); diff -Nru xen-4.2.2/tools/libxc/xc_private.c xen-4.3.0/tools/libxc/xc_private.c --- xen-4.2.2/tools/libxc/xc_private.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_private.c 2013-07-09 10:46:56.000000000 +0000 @@ -478,13 +478,13 @@ return err; } -struct xc_mmu *xc_alloc_mmu_updates(xc_interface *xch, domid_t dom) +struct xc_mmu *xc_alloc_mmu_updates(xc_interface *xch, unsigned int subject) { struct xc_mmu *mmu = malloc(sizeof(*mmu)); if ( mmu == NULL ) return mmu; mmu->idx = 0; - mmu->subject = dom; + mmu->subject = subject; return mmu; } @@ -771,6 +771,8 @@ errbuf = pthread_getspecific(errbuf_pkey); if (errbuf == NULL) { errbuf = malloc(XS_BUFSIZE); + if ( errbuf == NULL ) + return "(failed to allocate errbuf)"; pthread_setspecific(errbuf_pkey, errbuf); } @@ -886,7 +888,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_private.h xen-4.3.0/tools/libxc/xc_private.h --- xen-4.2.2/tools/libxc/xc_private.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_private.h 2013-07-09 10:46:56.000000000 +0000 @@ -308,10 +308,10 @@ struct xc_mmu { mmu_update_t updates[MAX_MMU_UPDATES]; int idx; - domid_t subject; + unsigned int subject; }; /* Structure returned by xc_alloc_mmu_updates must be free()'ed by caller. */ -struct xc_mmu *xc_alloc_mmu_updates(xc_interface *xch, domid_t dom); +struct xc_mmu *xc_alloc_mmu_updates(xc_interface *xch, unsigned int subject); int xc_add_mmu_update(xc_interface *xch, struct xc_mmu *mmu, unsigned long long ptr, unsigned long long val); int xc_flush_mmu_updates(xc_interface *xch, struct xc_mmu *mmu); diff -Nru xen-4.2.2/tools/libxc/xc_solaris.c xen-4.3.0/tools/libxc/xc_solaris.c --- xen-4.2.2/tools/libxc/xc_solaris.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_solaris.c 2013-07-09 10:46:56.000000000 +0000 @@ -341,7 +341,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xc_tbuf.c xen-4.3.0/tools/libxc/xc_tbuf.c --- xen-4.2.2/tools/libxc/xc_tbuf.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_tbuf.c 2013-07-09 10:46:56.000000000 +0000 @@ -134,7 +134,7 @@ bitmap_64_to_byte(bytemap, &mask64, sizeof (mask64) * 8); set_xen_guest_handle(sysctl.u.tbuf_op.cpu_mask.bitmap, bytemap); - sysctl.u.tbuf_op.cpu_mask.nr_cpus = sizeof(bytemap) * 8; + sysctl.u.tbuf_op.cpu_mask.nr_bits = sizeof(bytemap) * 8; ret = do_sysctl(xch, &sysctl); diff -Nru xen-4.2.2/tools/libxc/xc_tmem.c xen-4.3.0/tools/libxc/xc_tmem.c --- xen-4.2.2/tools/libxc/xc_tmem.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xc_tmem.c 2013-07-09 10:46:56.000000000 +0000 @@ -521,7 +521,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xenctrl.h xen-4.3.0/tools/libxc/xenctrl.h --- xen-4.2.2/tools/libxc/xenctrl.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xenctrl.h 2013-07-09 10:46:56.000000000 +0000 @@ -55,11 +55,7 @@ #include #endif -#ifdef __ia64__ -#define XC_PAGE_SHIFT 14 -#else #define XC_PAGE_SHIFT 12 -#endif #define XC_PAGE_SIZE (1UL << XC_PAGE_SHIFT) #define XC_PAGE_MASK (~(XC_PAGE_SIZE-1)) @@ -79,14 +75,14 @@ #define xen_mb() asm volatile ( "mfence" : : : "memory") #define xen_rmb() xen_barrier() #define xen_wmb() xen_barrier() -#elif defined(__ia64__) -#define xen_mb() asm volatile ("mf" ::: "memory") -#define xen_rmb() asm volatile ("mf" ::: "memory") -#define xen_wmb() asm volatile ("mf" ::: "memory") #elif defined(__arm__) #define xen_mb() asm volatile ("dmb" : : : "memory") #define xen_rmb() asm volatile ("dmb" : : : "memory") #define xen_wmb() asm volatile ("dmb" : : : "memory") +#elif defined(__aarch64__) +#define xen_mb() asm volatile ("dmb sy" : : : "memory") +#define xen_rmb() asm volatile ("dmb sy" : : : "memory") +#define xen_wmb() asm volatile ("dmb sy" : : : "memory") #else #error "Define barriers" #endif @@ -243,11 +239,13 @@ /* * Returns the hypercall_buffer associated with a variable. */ -#define HYPERCALL_BUFFER(_name) \ - ({ xc_hypercall_buffer_t _val1; \ - typeof(XC__HYPERCALL_BUFFER_NAME(_name)) *_val2 = &XC__HYPERCALL_BUFFER_NAME(_name); \ - (void)(&_val1 == _val2); \ - (_val2)->param_shadow ? (_val2)->param_shadow : (_val2); \ +#define HYPERCALL_BUFFER(_name) \ + ({ xc_hypercall_buffer_t _hcbuf_buf1; \ + typeof(XC__HYPERCALL_BUFFER_NAME(_name)) *_hcbuf_buf2 = \ + &XC__HYPERCALL_BUFFER_NAME(_name); \ + (void)(&_hcbuf_buf1 == _hcbuf_buf2); \ + (_hcbuf_buf2)->param_shadow ? \ + (_hcbuf_buf2)->param_shadow : (_hcbuf_buf2); \ }) #define HYPERCALL_BUFFER_INIT_NO_BOUNCE .dir = 0, .sz = 0, .ubuf = (void *)-1 @@ -281,11 +279,12 @@ * Get the hypercall buffer data pointer in a form suitable for use * directly as a hypercall argument. */ -#define HYPERCALL_BUFFER_AS_ARG(_name) \ - ({ xc_hypercall_buffer_t _val1; \ - typeof(XC__HYPERCALL_BUFFER_NAME(_name)) *_val2 = HYPERCALL_BUFFER(_name); \ - (void)(&_val1 == _val2); \ - (unsigned long)(_val2)->hbuf; \ +#define HYPERCALL_BUFFER_AS_ARG(_name) \ + ({ xc_hypercall_buffer_t _hcbuf_arg1; \ + typeof(XC__HYPERCALL_BUFFER_NAME(_name)) *_hcbuf_arg2 = \ + HYPERCALL_BUFFER(_name); \ + (void)(&_hcbuf_arg1 == _hcbuf_arg2); \ + (unsigned long)(_hcbuf_arg2)->hbuf; \ }) /* @@ -293,12 +292,13 @@ * data pointer has been correctly allocated. */ #undef set_xen_guest_handle -#define set_xen_guest_handle(_hnd, _val) \ - do { \ - xc_hypercall_buffer_t _val1; \ - typeof(XC__HYPERCALL_BUFFER_NAME(_val)) *_val2 = HYPERCALL_BUFFER(_val); \ - (void) (&_val1 == _val2); \ - set_xen_guest_handle_raw(_hnd, (_val2)->hbuf); \ +#define set_xen_guest_handle(_hnd, _val) \ + do { \ + xc_hypercall_buffer_t _hcbuf_hnd1; \ + typeof(XC__HYPERCALL_BUFFER_NAME(_val)) *_hcbuf_hnd2 = \ + HYPERCALL_BUFFER(_val); \ + (void) (&_hcbuf_hnd1 == _hcbuf_hnd2); \ + set_xen_guest_handle_raw(_hnd, (_hcbuf_hnd2)->hbuf); \ } while (0) /* Use with set_xen_guest_handle in place of NULL */ @@ -334,12 +334,20 @@ /* allocate a cpumap */ xc_cpumap_t xc_cpumap_alloc(xc_interface *xch); - /* +/* * NODEMAP handling */ +typedef uint8_t *xc_nodemap_t; + /* return maximum number of NUMA nodes the hypervisor supports */ int xc_get_max_nodes(xc_interface *xch); +/* return array size for nodemap */ +int xc_get_nodemap_size(xc_interface *xch); + +/* allocate a nodemap */ +xc_nodemap_t xc_nodemap_alloc(xc_interface *xch); + /* * DOMAIN DEBUGGING FUNCTIONS */ @@ -368,6 +376,7 @@ hvm:1, debugged:1; unsigned int shutdown_reason; /* only meaningful if shutdown==1 */ unsigned long nr_pages; /* current number, not maximum */ + unsigned long nr_outstanding_pages; unsigned long nr_shared_pages; unsigned long nr_paged_pages; unsigned long shared_info_frame; @@ -517,6 +526,32 @@ uint32_t id, uint32_t timeout); +/** + * This function explicitly sets the host NUMA nodes the domain will + * have affinity with. + * + * @parm xch a handle to an open hypervisor interface. + * @parm domid the domain id one wants to set the affinity of. + * @parm nodemap the map of the affine nodes. + * @return 0 on success, -1 on failure. + */ +int xc_domain_node_setaffinity(xc_interface *xch, + uint32_t domind, + xc_nodemap_t nodemap); + +/** + * This function retrieves the host NUMA nodes the domain has + * affinity with. + * + * @parm xch a handle to an open hypervisor interface. + * @parm domid the domain id one wants to get the node affinity of. + * @parm nodemap the map of the affine nodes. + * @return 0 on success, -1 on failure. + */ +int xc_domain_node_getaffinity(xc_interface *xch, + uint32_t domind, + xc_nodemap_t nodemap); + int xc_vcpu_setaffinity(xc_interface *xch, uint32_t domid, int vcpu, @@ -579,6 +614,17 @@ xc_domaininfo_t *info); /** + * This function set p2m for broken page + * &parm xch a handle to an open hypervisor interface + * @parm domid the domain id which broken page belong to + * @parm pfn the pfn number of the broken page + * @return 0 on success, -1 on failure + */ +int xc_set_broken_page_p2m(xc_interface *xch, + uint32_t domid, + unsigned long pfn); + +/** * This function returns information about the context of a hvm domain * @parm xch a handle to an open hypervisor interface * @parm domid the domain to get information from @@ -626,6 +672,16 @@ uint32_t size); /** + * This function will return guest IO ABI protocol + * + * @parm xch a handle to an open hypervisor interface + * @parm domid the domain to get IO ABI protocol for + * @return guest protocol on success, NULL on failure + */ +const char *xc_domain_get_native_protocol(xc_interface *xch, + uint32_t domid); + +/** * This function returns information about the execution context of a * particular vcpu of a domain. * @@ -910,8 +966,8 @@ int xc_evtchn_status(xc_interface *xch, xc_evtchn_status_t *status); /* - * Return a handle to the event channel driver, or -1 on failure, in which case - * errno will be set appropriately. + * Return a handle to the event channel driver, or NULL on failure, in + * which case errno will be set appropriately. * * Note: * After fork a child process must not use any opened xc evtchn @@ -1122,6 +1178,10 @@ unsigned int mem_flags, xen_pfn_t *extent_start); +int xc_domain_claim_pages(xc_interface *xch, + uint32_t domid, + unsigned long nr_pages); + int xc_domain_memory_exchange_pages(xc_interface *xch, int domid, unsigned long nr_in_extents, @@ -1248,8 +1308,6 @@ int xc_get_pfn_list(xc_interface *xch, uint32_t domid, uint64_t *pfn_buf, unsigned long max_pfns); -unsigned long xc_ia64_fpsr_default(void); - int xc_copy_to_domain_page(xc_interface *xch, uint32_t domid, unsigned long dst_pfn, const char *src_page); @@ -1659,15 +1717,6 @@ int xc_set_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long value); int xc_get_hvm_param(xc_interface *handle, domid_t dom, int param, unsigned long *value); -/* IA64 specific, nvram save */ -int xc_ia64_save_to_nvram(xc_interface *xch, uint32_t dom); - -/* IA64 specific, nvram init */ -int xc_ia64_nvram_init(xc_interface *xch, char *dom_name, uint32_t dom); - -/* IA64 specific, set guest OS type optimizations */ -int xc_ia64_set_os_type(xc_interface *xch, char *guest_os_type, uint32_t dom); - /* HVM guest pass-through */ int xc_assign_device(xc_interface *xch, uint32_t domid, @@ -1778,7 +1827,7 @@ int xc_cpuid_apply_policy(xc_interface *xch, domid_t domid); void xc_cpuid_to_str(const unsigned int *regs, - char **strs); + char **strs); /* some strs[] may be NULL if ENOMEM */ int xc_mca_op(xc_interface *xch, struct xen_mc *mc); #endif @@ -2173,6 +2222,7 @@ int xc_flask_avc_hashstats(xc_interface *xc_handle, char *buf, int size); int xc_flask_getavc_threshold(xc_interface *xc_handle); int xc_flask_setavc_threshold(xc_interface *xc_handle, int threshold); +int xc_flask_relabel_domain(xc_interface *xch, int domid, uint32_t sid); struct elf_binary; void xc_elf_set_logfile(xc_interface *xch, struct elf_binary *elf, diff -Nru xen-4.2.2/tools/libxc/xenctrl_osdep_ENOSYS.c xen-4.3.0/tools/libxc/xenctrl_osdep_ENOSYS.c --- xen-4.2.2/tools/libxc/xenctrl_osdep_ENOSYS.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xenctrl_osdep_ENOSYS.c 2013-07-09 10:46:56.000000000 +0000 @@ -198,7 +198,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xenctrlosdep.h xen-4.3.0/tools/libxc/xenctrlosdep.h --- xen-4.2.2/tools/libxc/xenctrlosdep.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xenctrlosdep.h 2013-07-09 10:46:56.000000000 +0000 @@ -164,7 +164,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xenguest.h xen-4.3.0/tools/libxc/xenguest.h --- xen-4.2.2/tools/libxc/xenguest.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xenguest.h 2013-07-09 10:46:56.000000000 +0000 @@ -23,11 +23,12 @@ #ifndef XENGUEST_H #define XENGUEST_H -#define XCFLAGS_LIVE 1 -#define XCFLAGS_DEBUG 2 -#define XCFLAGS_HVM 4 -#define XCFLAGS_STDVGA 8 -#define XCFLAGS_CHECKPOINT_COMPRESS 16 +#define XCFLAGS_LIVE (1 << 0) +#define XCFLAGS_DEBUG (1 << 1) +#define XCFLAGS_HVM (1 << 2) +#define XCFLAGS_STDVGA (1 << 3) +#define XCFLAGS_CHECKPOINT_COMPRESS (1 << 4) + #define X86_64_B_SIZE 64 #define X86_32_B_SIZE 32 @@ -102,6 +103,8 @@ /** * This function will restore a saved domain. * + * Domain is restored in a suspended state ready to be unpaused. + * * @parm xch a handle to an open hypervisor interface * @parm fd the file descriptor to restore a domain from * @parm dom the id of the domain @@ -211,11 +214,25 @@ unsigned int console_evtchn, unsigned long *console_mfn); +struct xc_hvm_firmware_module { + uint8_t *data; + uint32_t length; + uint64_t guest_addr_out; +}; + struct xc_hvm_build_args { uint64_t mem_size; /* Memory size in bytes. */ uint64_t mem_target; /* Memory target in bytes. */ uint64_t mmio_size; /* Size of the MMIO hole in bytes. */ const char *image_file_name; /* File name of the image to load. */ + + /* Extra ACPI tables passed to HVMLOADER */ + struct xc_hvm_firmware_module acpi_module; + + /* Extra SMBIOS structures passed to HVMLOADER */ + struct xc_hvm_firmware_module smbios_module; + /* Whether to use claim hypercall (1 - enable, 0 - disable). */ + int claim_enabled; }; /** @@ -228,7 +245,7 @@ * are optional. */ int xc_hvm_build(xc_interface *xch, uint32_t domid, - const struct xc_hvm_build_args *hvm_args); + struct xc_hvm_build_args *hvm_args); int xc_hvm_build_target_mem(xc_interface *xch, uint32_t domid, diff -Nru xen-4.2.2/tools/libxc/xg_private.c xen-4.3.0/tools/libxc/xg_private.c --- xen-4.2.2/tools/libxc/xg_private.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xg_private.c 2013-07-09 10:46:56.000000000 +0000 @@ -192,7 +192,7 @@ __attribute__((weak)) int xc_hvm_build(xc_interface *xch, uint32_t domid, - const struct xc_hvm_build_args *hvm_args) + struct xc_hvm_build_args *hvm_args) { errno = ENOSYS; return -1; @@ -201,7 +201,7 @@ /* * Local variables: * mode: C - * c-set-style: "BSD" + * c-file-style: "BSD" * c-basic-offset: 4 * tab-width: 4 * indent-tabs-mode: nil diff -Nru xen-4.2.2/tools/libxc/xg_private.h xen-4.3.0/tools/libxc/xg_private.h --- xen-4.2.2/tools/libxc/xg_private.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xg_private.h 2013-07-09 10:46:56.000000000 +0000 @@ -84,22 +84,6 @@ #define L3_PAGETABLE_ENTRIES_X86_64 512 #define L4_PAGETABLE_ENTRIES_X86_64 512 -#if defined(__i386__) -#define L1_PAGETABLE_SHIFT L1_PAGETABLE_SHIFT_I386 -#define L2_PAGETABLE_SHIFT L2_PAGETABLE_SHIFT_I386 -#define L1_PAGETABLE_ENTRIES L1_PAGETABLE_ENTRIES_I386 -#define L2_PAGETABLE_ENTRIES L2_PAGETABLE_ENTRIES_I386 -#elif defined(__x86_64__) -#define L1_PAGETABLE_SHIFT L1_PAGETABLE_SHIFT_X86_64 -#define L2_PAGETABLE_SHIFT L2_PAGETABLE_SHIFT_X86_64 -#define L3_PAGETABLE_SHIFT L3_PAGETABLE_SHIFT_X86_64 -#define L4_PAGETABLE_SHIFT L4_PAGETABLE_SHIFT_X86_64 -#define L1_PAGETABLE_ENTRIES L1_PAGETABLE_ENTRIES_X86_64 -#define L2_PAGETABLE_ENTRIES L2_PAGETABLE_ENTRIES_X86_64 -#define L3_PAGETABLE_ENTRIES L3_PAGETABLE_ENTRIES_X86_64 -#define L4_PAGETABLE_ENTRIES L4_PAGETABLE_ENTRIES_X86_64 -#endif - typedef uint32_t l1_pgentry_32_t; typedef uint32_t l2_pgentry_32_t; typedef uint64_t l1_pgentry_64_t; @@ -107,16 +91,6 @@ typedef uint64_t l3_pgentry_64_t; typedef uint64_t l4_pgentry_64_t; -#if defined(__i386__) -typedef l1_pgentry_32_t l1_pgentry_t; -typedef l2_pgentry_32_t l2_pgentry_t; -#elif defined(__x86_64__) -typedef l1_pgentry_64_t l1_pgentry_t; -typedef l2_pgentry_64_t l2_pgentry_t; -typedef l3_pgentry_64_t l3_pgentry_t; -typedef l4_pgentry_64_t l4_pgentry_t; -#endif - #define l1_table_offset_i386(_a) \ (((_a) >> L1_PAGETABLE_SHIFT_I386) & (L1_PAGETABLE_ENTRIES_I386 - 1)) #define l2_table_offset_i386(_a) \ @@ -138,15 +112,9 @@ #define l4_table_offset_x86_64(_a) \ (((_a) >> L4_PAGETABLE_SHIFT_X86_64) & (L4_PAGETABLE_ENTRIES_X86_64 - 1)) -#if defined(__i386__) -#define l1_table_offset(_a) l1_table_offset_i386(_a) -#define l2_table_offset(_a) l2_table_offset_i386(_a) -#elif defined(__x86_64__) -#define l1_table_offset(_a) l1_table_offset_x86_64(_a) -#define l2_table_offset(_a) l2_table_offset_x86_64(_a) -#define l3_table_offset(_a) l3_table_offset_x86_64(_a) -#define l4_table_offset(_a) l4_table_offset_x86_64(_a) -#endif +#define PAGE_SHIFT_ARM 12 +#define PAGE_SIZE_ARM (1UL << PAGE_SHIFT_ARM) +#define PAGE_MASK_ARM (~(PAGE_SIZE_ARM-1)) #define PAGE_SHIFT_X86 12 #define PAGE_SIZE_X86 (1UL << PAGE_SHIFT_X86) diff -Nru xen-4.2.2/tools/libxc/xg_save_restore.h xen-4.3.0/tools/libxc/xg_save_restore.h --- xen-4.2.2/tools/libxc/xg_save_restore.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xg_save_restore.h 2013-07-09 10:46:56.000000000 +0000 @@ -334,8 +334,6 @@ *pt_levels = ( (*guest_width == 8) ? 4 : 3 ); else if (strstr(xen_caps, "xen-3.0-x86_32p")) *pt_levels = 3; - else if (strstr(xen_caps, "xen-3.0-x86_32")) - *pt_levels = 2; else return 0; diff -Nru xen-4.2.2/tools/libxc/xtl_logger_stdio.c xen-4.3.0/tools/libxc/xtl_logger_stdio.c --- xen-4.2.2/tools/libxc/xtl_logger_stdio.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxc/xtl_logger_stdio.c 2013-07-09 10:46:56.000000000 +0000 @@ -35,6 +35,7 @@ xentoollog_level min_level; unsigned flags; int progress_erase_len, progress_last_percent; + int tty; }; static void progress_erase(xentoollog_logger_stdiostream *lg) { @@ -81,6 +82,17 @@ fflush(lg->f); } +static void stdiostream_message(struct xentoollog_logger *logger_in, + xentoollog_level level, + const char *context, + const char *format, ...) +{ + va_list al; + va_start(al,format); + stdiostream_vmessage(logger_in, level, -1, context, format, al); + va_end(al); +} + static void stdiostream_progress(struct xentoollog_logger *logger_in, const char *context, const char *doing_what, int percent, @@ -89,7 +101,7 @@ int newpel, extra_erase; xentoollog_level this_level; - if (!(lg->flags & XTL_STDIOSTREAM_HIDE_PROGRESS)) + if (lg->flags & XTL_STDIOSTREAM_HIDE_PROGRESS) return; if (percent < lg->progress_last_percent) { @@ -105,11 +117,18 @@ if (this_level < lg->min_level) return; + lg->progress_last_percent = percent; + + if (!lg->tty) { + stdiostream_message(logger_in, this_level, context, + "%s: %lu/%lu %3d%%", + doing_what, done, total, percent); + return; + } + if (lg->progress_erase_len) putc('\r', lg->f); - lg->progress_last_percent = percent; - newpel = fprintf(lg->f, "%s%s" "%s: %lu/%lu %3d%%%s", context?context:"", context?": ":"", doing_what, done, total, percent, @@ -148,6 +167,7 @@ newlogger.f = f; newlogger.min_level = min_level; newlogger.flags = flags; + newlogger.tty = isatty(fileno(newlogger.f)) > 0; if (newlogger.flags & XTL_STDIOSTREAM_SHOW_DATE) tzset(); diff -Nru xen-4.2.2/tools/libxen/include/xen/api/xen_all.h xen-4.3.0/tools/libxen/include/xen/api/xen_all.h --- xen-4.2.2/tools/libxen/include/xen/api/xen_all.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxen/include/xen/api/xen_all.h 2013-07-09 10:46:56.000000000 +0000 @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #endif diff -Nru xen-4.2.2/tools/libxen/include/xen/api/xen_vm.h xen-4.3.0/tools/libxen/include/xen/api/xen_vm.h --- xen-4.2.2/tools/libxen/include/xen/api/xen_vm.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxen/include/xen/api/xen_vm.h 2013-07-09 10:46:56.000000000 +0000 @@ -33,7 +33,6 @@ #include #include #include -#include #include @@ -98,7 +97,6 @@ struct xen_vif_record_opt_set *vifs; struct xen_vbd_record_opt_set *vbds; struct xen_crashdump_record_opt_set *crash_dumps; - struct xen_vtpm_record_opt_set *vtpms; char *pv_bootloader; char *pv_kernel; char *pv_ramdisk; @@ -396,13 +394,6 @@ /** - * Get the VTPMs field of the given VM. - */ -extern bool -xen_vm_get_vtpms(xen_session *session, struct xen_vtpm_set **result, xen_vm vm); - - -/** * Get the PV/bootloader field of the given VM. */ extern bool diff -Nru xen-4.2.2/tools/libxen/include/xen/api/xen_vtpm.h xen-4.3.0/tools/libxen/include/xen/api/xen_vtpm.h --- xen-4.2.2/tools/libxen/include/xen/api/xen_vtpm.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxen/include/xen/api/xen_vtpm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,218 +0,0 @@ -/* - * Copyright (c) 2006-2007, XenSource Inc. - * Copyright (c) 2006, IBM Corp. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef XEN_VTPM_H -#define XEN_VTPM_H - -#include -#include -#include - - -/* - * The VTPM class. - * - * A virtual TPM device. - */ - - -/** - * Free the given xen_vtpm. The given handle must have been allocated - * by this library. - */ -extern void -xen_vtpm_free(xen_vtpm vtpm); - - -typedef struct xen_vtpm_set -{ - size_t size; - xen_vtpm *contents[]; -} xen_vtpm_set; - -/** - * Allocate a xen_vtpm_set of the given size. - */ -extern xen_vtpm_set * -xen_vtpm_set_alloc(size_t size); - -/** - * Free the given xen_vtpm_set. The given set must have been allocated - * by this library. - */ -extern void -xen_vtpm_set_free(xen_vtpm_set *set); - - -typedef struct xen_vtpm_record -{ - xen_vtpm handle; - char *uuid; - struct xen_vm_record_opt *vm; - struct xen_vm_record_opt *backend; - xen_string_string_map *other_config; -} xen_vtpm_record; - -/** - * Allocate a xen_vtpm_record. - */ -extern xen_vtpm_record * -xen_vtpm_record_alloc(void); - -/** - * Free the given xen_vtpm_record, and all referenced values. The - * given record must have been allocated by this library. - */ -extern void -xen_vtpm_record_free(xen_vtpm_record *record); - - -typedef struct xen_vtpm_record_opt -{ - bool is_record; - union - { - xen_vtpm handle; - xen_vtpm_record *record; - } u; -} xen_vtpm_record_opt; - -/** - * Allocate a xen_vtpm_record_opt. - */ -extern xen_vtpm_record_opt * -xen_vtpm_record_opt_alloc(void); - -/** - * Free the given xen_vtpm_record_opt, and all referenced values. The - * given record_opt must have been allocated by this library. - */ -extern void -xen_vtpm_record_opt_free(xen_vtpm_record_opt *record_opt); - - -typedef struct xen_vtpm_record_set -{ - size_t size; - xen_vtpm_record *contents[]; -} xen_vtpm_record_set; - -/** - * Allocate a xen_vtpm_record_set of the given size. - */ -extern xen_vtpm_record_set * -xen_vtpm_record_set_alloc(size_t size); - -/** - * Free the given xen_vtpm_record_set, and all referenced values. The - * given set must have been allocated by this library. - */ -extern void -xen_vtpm_record_set_free(xen_vtpm_record_set *set); - - - -typedef struct xen_vtpm_record_opt_set -{ - size_t size; - xen_vtpm_record_opt *contents[]; -} xen_vtpm_record_opt_set; - -/** - * Allocate a xen_vtpm_record_opt_set of the given size. - */ -extern xen_vtpm_record_opt_set * -xen_vtpm_record_opt_set_alloc(size_t size); - -/** - * Free the given xen_vtpm_record_opt_set, and all referenced values. - * The given set must have been allocated by this library. - */ -extern void -xen_vtpm_record_opt_set_free(xen_vtpm_record_opt_set *set); - - -/** - * Get a record containing the current state of the given VTPM. - */ -extern bool -xen_vtpm_get_record(xen_session *session, xen_vtpm_record **result, xen_vtpm vtpm); - - -/** - * Get a reference to the VTPM instance with the specified UUID. - */ -extern bool -xen_vtpm_get_by_uuid(xen_session *session, xen_vtpm *result, char *uuid); - - -/** - * Create a new VTPM instance, and return its handle. - */ -extern bool -xen_vtpm_create(xen_session *session, xen_vtpm *result, xen_vtpm_record *record); - - -/** - * Destroy the specified VTPM instance. - */ -extern bool -xen_vtpm_destroy(xen_session *session, xen_vtpm vtpm); - - -/** - * Get the uuid field of the given VTPM. - */ -extern bool -xen_vtpm_get_uuid(xen_session *session, char **result, xen_vtpm vtpm); - - -/** - * Get the VM field of the given VTPM. - */ -extern bool -xen_vtpm_get_vm(xen_session *session, xen_vm *result, xen_vtpm vtpm); - - -/** - * Get the backend field of the given VTPM. - */ -extern bool -xen_vtpm_get_backend(xen_session *session, xen_vm *result, xen_vtpm vtpm); - - -/** - * Get the other_config field of the given VTPM. - */ -extern bool -xen_vtpm_get_other_config(xen_session *session, - xen_string_string_map **result, - xen_vtpm vtpm); - - -/** - * Set the other_config field of the given VTPM. - */ -extern bool -xen_vtpm_set_other_config(xen_session *session, - xen_vtpm vtpm, - xen_string_string_map *other_config); - - -#endif diff -Nru xen-4.2.2/tools/libxen/include/xen/api/xen_vtpm_decl.h xen-4.3.0/tools/libxen/include/xen/api/xen_vtpm_decl.h --- xen-4.2.2/tools/libxen/include/xen/api/xen_vtpm_decl.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxen/include/xen/api/xen_vtpm_decl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2006, XenSource Inc. - * Copyright (c) 2006, IBM Corp. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef XEN_VTPM_DECL_H -#define XEN_VTPM_DECL_H - -typedef void *xen_vtpm; - -struct xen_vtpm_set; -struct xen_vtpm_record; -struct xen_vtpm_record_set; -struct xen_vtpm_record_opt; -struct xen_vtpm_record_opt_set; - -#endif diff -Nru xen-4.2.2/tools/libxen/src/xen_vm.c xen-4.3.0/tools/libxen/src/xen_vm.c --- xen-4.2.2/tools/libxen/src/xen_vm.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxen/src/xen_vm.c 2013-07-09 10:46:56.000000000 +0000 @@ -35,7 +35,6 @@ #include #include #include -#include #include @@ -119,9 +118,6 @@ { .key = "crash_dumps", .type = &abstract_type_ref_set, .offset = offsetof(xen_vm_record, crash_dumps) }, - { .key = "VTPMs", - .type = &abstract_type_ref_set, - .offset = offsetof(xen_vm_record, vtpms) }, { .key = "PV_bootloader", .type = &abstract_type_string, .offset = offsetof(xen_vm_record, pv_bootloader) }, @@ -203,7 +199,6 @@ xen_vif_record_opt_set_free(record->vifs); xen_vbd_record_opt_set_free(record->vbds); xen_crashdump_record_opt_set_free(record->crash_dumps); - xen_vtpm_record_opt_set_free(record->vtpms); free(record->pv_bootloader); free(record->pv_kernel); free(record->pv_ramdisk); @@ -668,23 +663,6 @@ bool -xen_vm_get_vtpms(xen_session *session, struct xen_vtpm_set **result, xen_vm vm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vm } - }; - - abstract_type result_type = abstract_type_string_set; - - *result = NULL; - XEN_CALL_("VM.get_VTPMs"); - return session->ok; -} - - -bool xen_vm_get_pv_bootloader(xen_session *session, char **result, xen_vm vm) { abstract_value param_values[] = diff -Nru xen-4.2.2/tools/libxen/src/xen_vtpm.c xen-4.3.0/tools/libxen/src/xen_vtpm.c --- xen-4.2.2/tools/libxen/src/xen_vtpm.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxen/src/xen_vtpm.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,235 +0,0 @@ -/* - * Copyright (c) 2006, XenSource Inc. - * Copyright (c) 2006, IBM Corp. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include -#include - -#include "xen_internal.h" -#include -#include -#include - - -XEN_FREE(xen_vtpm) -XEN_SET_ALLOC_FREE(xen_vtpm) -XEN_ALLOC(xen_vtpm_record) -XEN_SET_ALLOC_FREE(xen_vtpm_record) -XEN_ALLOC(xen_vtpm_record_opt) -XEN_RECORD_OPT_FREE(xen_vtpm) -XEN_SET_ALLOC_FREE(xen_vtpm_record_opt) - - -static const struct_member xen_vtpm_record_struct_members[] = - { - { .key = "uuid", - .type = &abstract_type_string, - .offset = offsetof(xen_vtpm_record, uuid) }, - { .key = "VM", - .type = &abstract_type_ref, - .offset = offsetof(xen_vtpm_record, vm) }, - { .key = "backend", - .type = &abstract_type_ref, - .offset = offsetof(xen_vtpm_record, backend) }, - { .key = "other_config", - .type = &abstract_type_string_string_map, - .offset = offsetof(xen_vtpm_record, other_config) } - }; - -const abstract_type xen_vtpm_record_abstract_type_ = - { - .typename = STRUCT, - .struct_size = sizeof(xen_vtpm_record), - .member_count = - sizeof(xen_vtpm_record_struct_members) / sizeof(struct_member), - .members = xen_vtpm_record_struct_members - }; - - -void -xen_vtpm_record_free(xen_vtpm_record *record) -{ - if (record == NULL) - { - return; - } - free(record->handle); - free(record->uuid); - xen_vm_record_opt_free(record->vm); - xen_vm_record_opt_free(record->backend); - xen_string_string_map_free(record->other_config); - free(record); -} - - -bool -xen_vtpm_get_record(xen_session *session, xen_vtpm_record **result, xen_vtpm vtpm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vtpm } - }; - - abstract_type result_type = xen_vtpm_record_abstract_type_; - - *result = NULL; - XEN_CALL_("VTPM.get_record"); - - if (session->ok) - { - (*result)->handle = xen_strdup_((*result)->uuid); - } - - return session->ok; -} - - -bool -xen_vtpm_get_by_uuid(xen_session *session, xen_vtpm *result, char *uuid) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = uuid } - }; - - abstract_type result_type = abstract_type_string; - - *result = NULL; - XEN_CALL_("VTPM.get_by_uuid"); - return session->ok; -} - - -bool -xen_vtpm_create(xen_session *session, xen_vtpm *result, xen_vtpm_record *record) -{ - abstract_value param_values[] = - { - { .type = &xen_vtpm_record_abstract_type_, - .u.struct_val = record } - }; - - abstract_type result_type = abstract_type_string; - - *result = NULL; - XEN_CALL_("VTPM.create"); - return session->ok; -} - - -bool -xen_vtpm_destroy(xen_session *session, xen_vtpm vtpm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vtpm } - }; - - xen_call_(session, "VTPM.destroy", param_values, 1, NULL, NULL); - return session->ok; -} - - -bool -xen_vtpm_get_vm(xen_session *session, xen_vm *result, xen_vtpm vtpm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vtpm } - }; - - abstract_type result_type = abstract_type_string; - - *result = NULL; - XEN_CALL_("VTPM.get_VM"); - return session->ok; -} - - -bool -xen_vtpm_get_backend(xen_session *session, xen_vm *result, xen_vtpm vtpm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vtpm } - }; - - abstract_type result_type = abstract_type_string; - - *result = NULL; - XEN_CALL_("VTPM.get_backend"); - return session->ok; -} - - -bool -xen_vtpm_get_uuid(xen_session *session, char **result, xen_vtpm vtpm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vtpm } - }; - - abstract_type result_type = abstract_type_string; - - *result = NULL; - XEN_CALL_("VTPM.get_uuid"); - return session->ok; -} - - -bool -xen_vtpm_get_other_config(xen_session *session, xen_string_string_map **result, - xen_vtpm vtpm) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vtpm } - }; - - abstract_type result_type = abstract_type_string_string_map; - - *result = NULL; - XEN_CALL_("VTPM.get_other_config"); - return session->ok; -} - - -bool -xen_vtpm_set_other_config(xen_session *session, xen_vtpm vtpm, - xen_string_string_map *other_config) -{ - abstract_value param_values[] = - { - { .type = &abstract_type_string, - .u.string_val = vtpm }, - { .type = &abstract_type_string_string_map, - .u.set_val = (arbitrary_set *)other_config } - }; - - xen_call_(session, "VTPM.set_other_config", param_values, 2, NULL, NULL); - return session->ok; -} diff -Nru xen-4.2.2/tools/libxl/Makefile xen-4.3.0/tools/libxl/Makefile --- xen-4.2.2/tools/libxl/Makefile 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/Makefile 2013-07-09 10:46:56.000000000 +0000 @@ -5,11 +5,11 @@ XEN_ROOT = $(CURDIR)/../.. include $(XEN_ROOT)/tools/Rules.mk -MAJOR = 2.0 +MAJOR = 4.3 MINOR = 0 -XLUMAJOR = 1.0 -XLUMINOR = 1 +XLUMAJOR = 4.3 +XLUMINOR = 0 CFLAGS += -Werror -Wno-format-zero-length -Wmissing-declarations \ -Wno-declaration-after-statement -Wformat-nonliteral @@ -22,6 +22,12 @@ LIBXL_LIBS = LIBXL_LIBS = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS) +CFLAGS_LIBXL += $(CFLAGS_libxenctrl) +CFLAGS_LIBXL += $(CFLAGS_libxenguest) +CFLAGS_LIBXL += $(CFLAGS_libxenstore) +CFLAGS_LIBXL += $(CFLAGS_libblktapctl) +CFLAGS_LIBXL += -Wshadow + CFLAGS += $(PTHREAD_CFLAGS) LDFLAGS += $(PTHREAD_LDFLAGS) LIBXL_LIBS += $(PTHREAD_LIBS) @@ -71,7 +77,7 @@ libxl_qmp.o libxl_event.o libxl_fork.o $(LIBXL_OBJS-y) LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o -$(LIBXL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) $(CFLAGS_libxenstore) $(CFLAGS_libblktapctl) -include $(XEN_ROOT)/tools/config.h +$(LIBXL_OBJS): CFLAGS += $(CFLAGS_LIBXL) -include $(XEN_ROOT)/tools/config.h AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h _libxl_list.h _paths.h \ _libxl_save_msgs_callout.h _libxl_save_msgs_helper.h @@ -83,10 +89,13 @@ CLIENTS = xl testidl libxl-save-helper +CFLAGS_XL += $(CFLAGS_libxenlight) +CFLAGS_XL += -Wshadow + XL_OBJS = xl.o xl_cmdimpl.o xl_cmdtable.o xl_sxp.o $(XL_OBJS) _libxl.api-for-check: \ CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h -$(XL_OBJS): CFLAGS += $(CFLAGS_libxenlight) +$(XL_OBJS): CFLAGS += $(CFLAGS_XL) $(XL_OBJS): CFLAGS += -include $(XEN_ROOT)/tools/config.h # libxl_json.h needs it. SAVE_HELPER_OBJS = libxl_save_helper.o _libxl_save_msgs_helper.o diff -Nru xen-4.2.2/tools/libxl/flexarray.c xen-4.3.0/tools/libxl/flexarray.c --- xen-4.2.2/tools/libxl/flexarray.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/flexarray.c 2013-07-09 10:46:56.000000000 +0000 @@ -16,51 +16,57 @@ #include "libxl_internal.h" #include -flexarray_t *flexarray_make(int size, int autogrow) +/* + * It is safe to store gc in the struct because: + * - If it an actual gc, then the flexarray should not be used after the gc + * have been freed. + * - If it is a NOGC, then this point to a structure embedded in libxl_ctx, + * therefore will survive across several libxl calls. + */ + +flexarray_t *flexarray_make(libxl__gc *gc, int size, int autogrow) { - flexarray_t *array = malloc(sizeof(struct flexarray)); - if (array) { - array->size = size; - array->autogrow = autogrow; - array->count = 0; - array->data = calloc(size, sizeof(void *)); - } + flexarray_t *array; + + GCNEW(array); + array->size = size; + array->autogrow = autogrow; + array->count = 0; + array->gc = gc; + GCNEW_ARRAY(array->data, size); + return array; } void flexarray_free(flexarray_t *array) { + assert(!libxl__gc_is_real(array->gc)); free(array->data); free(array); } -int flexarray_grow(flexarray_t *array, int extents) +void flexarray_grow(flexarray_t *array, int extents) { - void **data; int newsize; + libxl__gc *gc = array->gc; newsize = array->size + extents; - data = realloc(array->data, sizeof(void *) * newsize); - if (!data) - return 1; + GCREALLOC_ARRAY(array->data, newsize); array->size += extents; - array->data = data; - return 0; } -int flexarray_set(flexarray_t *array, unsigned int index, void *ptr) +int flexarray_set(flexarray_t *array, unsigned int idx, void *ptr) { - if (index >= array->size) { + if (idx >= array->size) { int newsize; if (!array->autogrow) return 1; - newsize = (array->size * 2 < index) ? index + 1 : array->size * 2; - if (flexarray_grow(array, newsize - array->size)) - return 2; + newsize = (array->size * 2 < idx) ? idx + 1 : array->size * 2; + flexarray_grow(array, newsize - array->size); } - if ( index + 1 > array->count ) - array->count = index + 1; - array->data[index] = ptr; + if ( idx + 1 > array->count ) + array->count = idx + 1; + array->data[idx] = ptr; return 0; } @@ -92,11 +98,11 @@ return ret; } -int flexarray_get(flexarray_t *array, int index, void **ptr) +int flexarray_get(flexarray_t *array, int idx, void **ptr) { - if (index >= array->size) + if (idx >= array->size) return 1; - *ptr = array->data[index]; + *ptr = array->data[idx]; return 0; } @@ -104,7 +110,8 @@ { void **data; data = array->data; - free(array); + if (!libxl__gc_is_real(array->gc)) + free(array); return data; } diff -Nru xen-4.2.2/tools/libxl/flexarray.h xen-4.3.0/tools/libxl/flexarray.h --- xen-4.2.2/tools/libxl/flexarray.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/flexarray.h 2013-07-09 10:46:56.000000000 +0000 @@ -16,16 +16,25 @@ #ifndef FLEXARRAY_H #define FLEXARRAY_H +struct libxl__gc; + typedef struct flexarray { int size; int autogrow; unsigned int count; void **data; /* array of pointer */ + struct libxl__gc *gc; } flexarray_t; -_hidden flexarray_t *flexarray_make(int size, int autogrow); +/* + * NOGC can be used with flexarrays, but flexarray_free will need to be called + * to free the struct. The content of the flexarray will not be freed through + * flexarray_free. + */ +_hidden flexarray_t *flexarray_make(struct libxl__gc *gc_opt, + int size, int autogrow); _hidden void flexarray_free(flexarray_t *array); -_hidden int flexarray_grow(flexarray_t *array, int extents); +_hidden void flexarray_grow(flexarray_t *array, int extents); _hidden int flexarray_set(flexarray_t *array, unsigned int index, void *ptr); _hidden int flexarray_append(flexarray_t *array, void *ptr); _hidden int flexarray_append_pair(flexarray_t *array, void *ptr1, void *ptr2); diff -Nru xen-4.2.2/tools/libxl/libxl.c xen-4.3.0/tools/libxl/libxl.c --- xen-4.2.2/tools/libxl/libxl.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl.c 2013-07-09 10:46:56.000000000 +0000 @@ -528,6 +528,7 @@ else xlinfo->shutdown_reason = ~0; + xlinfo->outstanding_memkb = PAGE_TO_MEMKB(xcinfo->outstanding_pages); xlinfo->current_memkb = PAGE_TO_MEMKB(xcinfo->tot_pages); xlinfo->shared_memkb = PAGE_TO_MEMKB(xcinfo->shr_pages); xlinfo->paged_memkb = PAGE_TO_MEMKB(xcinfo->paged_pages); @@ -666,7 +667,7 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm_out) { libxl_vminfo *ptr; - int index, i, ret; + int idx, i, ret; xc_domaininfo_t info[1024]; int size = 1024; @@ -679,15 +680,15 @@ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "geting domain info list"); return NULL; } - for (index = i = 0; i < ret; i++) { + for (idx = i = 0; i < ret; i++) { if (libxl_is_stubdom(ctx, info[i].domain, NULL)) continue; - memcpy(&(ptr[index].uuid), info[i].handle, sizeof(xen_domain_handle_t)); - ptr[index].domid = info[i].domain; + memcpy(&(ptr[idx].uuid), info[i].handle, sizeof(xen_domain_handle_t)); + ptr[idx].domid = info[i].domain; - index++; + idx++; } - *nb_vm_out = index; + *nb_vm_out = idx; return ptr; } @@ -1695,12 +1696,12 @@ if (aodev->rc) { if (aodev->dev) { LOG(ERROR, "unable to %s %s with id %u", - aodev->action == DEVICE_CONNECT ? "add" : "remove", + libxl__device_action_to_string(aodev->action), libxl__device_kind_to_string(aodev->dev->kind), aodev->dev->devid); } else { LOG(ERROR, "unable to %s device", - aodev->action == DEVICE_CONNECT ? "add" : "remove"); + libxl__device_action_to_string(aodev->action)); } goto out; } @@ -1710,15 +1711,278 @@ return; } +/* common function to get next device id */ +static int libxl__device_nextid(libxl__gc *gc, uint32_t domid, char *device) +{ + char *dompath, **l; + unsigned int nb; + int nextid = -1; + + if (!(dompath = libxl__xs_get_dompath(gc, domid))) + return nextid; + + l = libxl__xs_directory(gc, XBT_NULL, + GCSPRINTF("%s/device/%s", dompath, device), &nb); + if (l == NULL || nb == 0) + nextid = 0; + else + nextid = strtoul(l[nb - 1], NULL, 10) + 1; + + return nextid; +} + +static int libxl__resolve_domid(libxl__gc *gc, const char *name, + uint32_t *domid) +{ + if (!name) + return 0; + return libxl_domain_qualifier_to_domid(CTX, name, domid); +} + +/******************************************************************************/ +int libxl__device_vtpm_setdefault(libxl__gc *gc, libxl_device_vtpm *vtpm) +{ + int rc; + if (libxl_uuid_is_nil(&vtpm->uuid)) { + libxl_uuid_generate(&vtpm->uuid); + } + rc = libxl__resolve_domid(gc, vtpm->backend_domname, &vtpm->backend_domid); + return rc; +} + +static int libxl__device_from_vtpm(libxl__gc *gc, uint32_t domid, + libxl_device_vtpm *vtpm, + libxl__device *device) +{ + device->backend_devid = vtpm->devid; + device->backend_domid = vtpm->backend_domid; + device->backend_kind = LIBXL__DEVICE_KIND_VTPM; + device->devid = vtpm->devid; + device->domid = domid; + device->kind = LIBXL__DEVICE_KIND_VTPM; + + return 0; +} + +void libxl__device_vtpm_add(libxl__egc *egc, uint32_t domid, + libxl_device_vtpm *vtpm, + libxl__ao_device *aodev) +{ + STATE_AO_GC(aodev->ao); + flexarray_t *front; + flexarray_t *back; + libxl__device *device; + unsigned int rc; + + rc = libxl__device_vtpm_setdefault(gc, vtpm); + if (rc) goto out; + + front = flexarray_make(gc, 16, 1); + back = flexarray_make(gc, 16, 1); + + if (vtpm->devid == -1) { + if ((vtpm->devid = libxl__device_nextid(gc, domid, "vtpm")) < 0) { + rc = ERROR_FAIL; + goto out; + } + } + + GCNEW(device); + rc = libxl__device_from_vtpm(gc, domid, vtpm, device); + if ( rc != 0 ) goto out; + + flexarray_append(back, "frontend-id"); + flexarray_append(back, GCSPRINTF("%d", domid)); + flexarray_append(back, "online"); + flexarray_append(back, "1"); + flexarray_append(back, "state"); + flexarray_append(back, GCSPRINTF("%d", 1)); + flexarray_append(back, "handle"); + flexarray_append(back, GCSPRINTF("%d", vtpm->devid)); + + flexarray_append(back, "uuid"); + flexarray_append(back, GCSPRINTF(LIBXL_UUID_FMT, LIBXL_UUID_BYTES(vtpm->uuid))); + flexarray_append(back, "resume"); + flexarray_append(back, "False"); + + flexarray_append(front, "backend-id"); + flexarray_append(front, GCSPRINTF("%d", vtpm->backend_domid)); + flexarray_append(front, "state"); + flexarray_append(front, GCSPRINTF("%d", 1)); + flexarray_append(front, "handle"); + flexarray_append(front, GCSPRINTF("%d", vtpm->devid)); + + libxl__device_generic_add(gc, XBT_NULL, device, + libxl__xs_kvs_of_flexarray(gc, back, back->count), + libxl__xs_kvs_of_flexarray(gc, front, front->count), + NULL); + + aodev->dev = device; + aodev->action = LIBXL__DEVICE_ACTION_ADD; + libxl__wait_device_connection(egc, aodev); + + rc = 0; +out: + aodev->rc = rc; + if(rc) aodev->callback(egc, aodev); + return; +} + +libxl_device_vtpm *libxl_device_vtpm_list(libxl_ctx *ctx, uint32_t domid, int *num) +{ + GC_INIT(ctx); + + libxl_device_vtpm* vtpms = NULL; + char* fe_path = NULL; + char** dir = NULL; + unsigned int ndirs = 0; + + *num = 0; + + fe_path = libxl__sprintf(gc, "%s/device/vtpm", libxl__xs_get_dompath(gc, domid)); + dir = libxl__xs_directory(gc, XBT_NULL, fe_path, &ndirs); + if(dir) { + vtpms = malloc(sizeof(*vtpms) * ndirs); + libxl_device_vtpm* vtpm; + libxl_device_vtpm* end = vtpms + ndirs; + for(vtpm = vtpms; vtpm < end; ++vtpm, ++dir) { + char* tmp; + const char* be_path = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/%s/backend", + fe_path, *dir)); + + libxl_device_vtpm_init(vtpm); + + vtpm->devid = atoi(*dir); + + tmp = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/%s/backend-id", + fe_path, *dir)); + vtpm->backend_domid = atoi(tmp); + + tmp = libxl__xs_read(gc, XBT_NULL, GCSPRINTF("%s/uuid", be_path)); + if(tmp) { + if(libxl_uuid_from_string(&(vtpm->uuid), tmp)) { + LOG(ERROR, "%s/uuid is a malformed uuid?? (%s) Probably a bug!!\n", be_path, tmp); + exit(1); + } + } + } + } + *num = ndirs; + + GC_FREE; + return vtpms; +} + +int libxl_device_vtpm_getinfo(libxl_ctx *ctx, + uint32_t domid, + libxl_device_vtpm *vtpm, + libxl_vtpminfo *vtpminfo) +{ + GC_INIT(ctx); + char *dompath, *vtpmpath; + char *val; + int rc = 0; + + libxl_vtpminfo_init(vtpminfo); + dompath = libxl__xs_get_dompath(gc, domid); + vtpminfo->devid = vtpm->devid; + + vtpmpath = GCSPRINTF("%s/device/vtpm/%d", dompath, vtpminfo->devid); + vtpminfo->backend = xs_read(ctx->xsh, XBT_NULL, + GCSPRINTF("%s/backend", vtpmpath), NULL); + if (!vtpminfo->backend) { + goto err; + } + if(!libxl__xs_read(gc, XBT_NULL, vtpminfo->backend)) { + goto err; + } + + val = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/backend-id", vtpmpath)); + vtpminfo->backend_id = val ? strtoul(val, NULL, 10) : -1; + + val = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/state", vtpmpath)); + vtpminfo->state = val ? strtoul(val, NULL, 10) : -1; + + val = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/event-channel", vtpmpath)); + vtpminfo->evtch = val ? strtoul(val, NULL, 10) : -1; + + val = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/ring-ref", vtpmpath)); + vtpminfo->rref = val ? strtoul(val, NULL, 10) : -1; + + vtpminfo->frontend = xs_read(ctx->xsh, XBT_NULL, + GCSPRINTF("%s/frontend", vtpminfo->backend), NULL); + + val = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/frontend-id", vtpminfo->backend)); + vtpminfo->frontend_id = val ? strtoul(val, NULL, 10) : -1; + + val = libxl__xs_read(gc, XBT_NULL, + GCSPRINTF("%s/uuid", vtpminfo->backend)); + if(val == NULL) { + LOG(ERROR, "%s/uuid does not exist!\n", vtpminfo->backend); + goto err; + } + if(libxl_uuid_from_string(&(vtpminfo->uuid), val)) { + LOG(ERROR, + "%s/uuid is a malformed uuid?? (%s) Probably a bug!\n", + vtpminfo->backend, val); + goto err; + } + + goto exit; +err: + rc = ERROR_FAIL; +exit: + GC_FREE; + return rc; +} + +int libxl_devid_to_device_vtpm(libxl_ctx *ctx, + uint32_t domid, + int devid, + libxl_device_vtpm *vtpm) +{ + libxl_device_vtpm *vtpms; + int nb, i; + int rc; + + vtpms = libxl_device_vtpm_list(ctx, domid, &nb); + if (!vtpms) + return ERROR_FAIL; + + libxl_device_vtpm_init(vtpm); + rc = 1; + for (i = 0; i < nb; ++i) { + if(devid == vtpms[i].devid) { + vtpm->backend_domid = vtpms[i].backend_domid; + vtpm->devid = vtpms[i].devid; + libxl_uuid_copy(&vtpm->uuid, &vtpms[i].uuid); + rc = 0; + break; + } + } + + libxl_device_vtpm_list_free(vtpms, nb); + return rc; +} + + /******************************************************************************/ int libxl__device_disk_setdefault(libxl__gc *gc, libxl_device_disk *disk) { int rc; - rc = libxl__device_disk_set_backend(gc, disk); - if (rc) return rc; + rc = libxl__resolve_domid(gc, disk->backend_domname, &disk->backend_domid); + if (rc < 0) return rc; + rc = libxl__device_disk_set_backend(gc, disk); return rc; } @@ -1789,6 +2053,12 @@ libxl_ctx *ctx = gc->owner; xs_transaction_t t = XBT_NULL; + libxl_domain_type type = libxl__domain_type(gc, domid); + if (type == LIBXL_DOMAIN_TYPE_INVALID) { + rc = ERROR_FAIL; + goto out; + } + for (;;) { rc = libxl__xs_transaction_start(gc, &t); if (rc) goto out; @@ -1805,27 +2075,15 @@ rc = libxl__device_disk_setdefault(gc, disk); if (rc) goto out; - if (front) - flexarray_free(front); - front = flexarray_make(16, 1); - if (!front) { - rc = ERROR_NOMEM; - goto out; - } - if (back) - flexarray_free(back); - back = flexarray_make(16, 1); - if (!back) { - rc = ERROR_NOMEM; - goto out_free; - } + front = flexarray_make(gc, 16, 1); + back = flexarray_make(gc, 16, 1); GCNEW(device); rc = libxl__device_from_disk(gc, domid, disk, device); if (rc != 0) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported" " virtual disk identifier %s", disk->vdev); - goto out_free; + goto out; } switch (disk->backend) { @@ -1847,7 +2105,8 @@ * responsible for this since the block device may not * exist yet. */ - if (!disk->script) { + if (!disk->script && + disk->backend_domid == LIBXL_TOOLSTACK_DOMID) { int major, minor; libxl__device_physdisk_major_minor(dev, &major, &minor); flexarray_append_pair(back, "physical-device", @@ -1865,7 +2124,7 @@ LOG(ERROR, "failed to get blktap devpath for %p\n", disk->pdev_path); rc = ERROR_FAIL; - goto out_free; + goto out; } } flexarray_append(back, "tapdisk-params"); @@ -1888,7 +2147,7 @@ default: LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend); rc = ERROR_INVAL; - goto out_free; + goto out; } flexarray_append(back, "frontend-id"); @@ -1919,24 +2178,39 @@ flexarray_append(front, "device-type"); flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk"); + /* + * Old PV kernel disk frontends before 2.6.26 rely on tool stack to + * write disk native protocol to frontend node. Xend does this, port + * this behaviour to xl. + * + * New kernels write this node themselves. In that case it just + * overwrites an existing node which is OK. + */ + if (type == LIBXL_DOMAIN_TYPE_PV) { + const char *protocol = + xc_domain_get_native_protocol(ctx->xch, domid); + if (protocol) { + flexarray_append(front, "protocol"); + flexarray_append(front, libxl__strdup(gc, protocol)); + } + } + libxl__device_generic_add(gc, t, device, - libxl__xs_kvs_of_flexarray(gc, back, back->count), - libxl__xs_kvs_of_flexarray(gc, front, front->count)); + libxl__xs_kvs_of_flexarray(gc, back, back->count), + libxl__xs_kvs_of_flexarray(gc, front, front->count), + NULL); rc = libxl__xs_transaction_commit(gc, &t); if (!rc) break; - if (rc < 0) goto out_free; + if (rc < 0) goto out; } aodev->dev = device; - aodev->action = DEVICE_CONNECT; + aodev->action = LIBXL__DEVICE_ACTION_ADD; libxl__wait_device_connection(egc, aodev); rc = 0; -out_free: - flexarray_free(back); - flexarray_free(front); out: libxl__xs_transaction_abort(gc, &t); aodev->rc = rc; @@ -1950,9 +2224,9 @@ device_disk_add(egc, domid, disk, aodev, NULL, NULL); } -static void libxl__device_disk_from_xs_be(libxl__gc *gc, - const char *be_path, - libxl_device_disk *disk) +static int libxl__device_disk_from_xs_be(libxl__gc *gc, + const char *be_path, + libxl_device_disk *disk) { libxl_ctx *ctx = libxl__gc_owner(gc); unsigned int len; @@ -1960,6 +2234,7 @@ libxl_device_disk_init(disk); + /* "params" may not be present; but everything else must be. */ tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/params", be_path), &len); if (tmp && strchr(tmp, ':')) { @@ -1968,21 +2243,36 @@ } else { disk->pdev_path = tmp; } - libxl_string_to_backend(ctx, - libxl__xs_read(gc, XBT_NULL, - libxl__sprintf(gc, "%s/type", be_path)), - &(disk->backend)); + + + tmp = libxl__xs_read(gc, XBT_NULL, + libxl__sprintf(gc, "%s/type", be_path)); + if (!tmp) { + LOG(ERROR, "Missing xenstore node %s/type", be_path); + goto cleanup; + } + libxl_string_to_backend(ctx, tmp, &(disk->backend)); + disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/dev", be_path), &len); + if (!disk->vdev) { + LOG(ERROR, "Missing xenstore node %s/dev", be_path); + goto cleanup; + } + tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf (gc, "%s/removable", be_path)); - - if (tmp) - disk->removable = atoi(tmp); - else - disk->removable = 0; + if (!tmp) { + LOG(ERROR, "Missing xenstore node %s/removable", be_path); + goto cleanup; + } + disk->removable = atoi(tmp); tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path)); + if (!tmp) { + LOG(ERROR, "Missing xenstore node %s/mode", be_path); + goto cleanup; + } if (!strcmp(tmp, "w")) disk->readwrite = 1; else @@ -1990,9 +2280,18 @@ tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/device-type", be_path)); + if (!tmp) { + LOG(ERROR, "Missing xenstore node %s/device-type", be_path); + goto cleanup; + } disk->is_cdrom = !strcmp(tmp, "cdrom"); disk->format = LIBXL_DISK_FORMAT_UNKNOWN; + + return 0; +cleanup: + libxl_device_disk_dispose(disk); + return ERROR_FAIL; } int libxl_vdev_to_device_disk(libxl_ctx *ctx, uint32_t domid, @@ -2018,9 +2317,7 @@ if (!path) goto out; - libxl__device_disk_from_xs_be(gc, path, disk); - - rc = 0; + rc = libxl__device_disk_from_xs_be(gc, path, disk); out: GC_FREE; return rc; @@ -2037,6 +2334,8 @@ char **dir = NULL; unsigned int n = 0; libxl_device_disk *pdisk = NULL, *pdisk_end = NULL; + int rc=0; + int initial_disks = *ndisks; be_path = libxl__sprintf(gc, "%s/backend/%s/%d", libxl__xs_get_dompath(gc, 0), type, domid); @@ -2047,17 +2346,19 @@ if (tmp == NULL) return ERROR_NOMEM; *disks = tmp; - pdisk = *disks + *ndisks; - *ndisks += n; - pdisk_end = *disks + *ndisks; + pdisk = *disks + initial_disks; + pdisk_end = *disks + initial_disks + n; for (; pdisk < pdisk_end; pdisk++, dir++) { const char *p; p = libxl__sprintf(gc, "%s/%s", be_path, *dir); - libxl__device_disk_from_xs_be(gc, p, pdisk); + if ((rc=libxl__device_disk_from_xs_be(gc, p, pdisk))) + goto out; pdisk->backend_domid = 0; + *ndisks += 1; } } - return 0; +out: + return rc; } libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num) @@ -2135,6 +2436,7 @@ libxl__device device; const char * path; + char * tmp; flexarray_t *insert = NULL; @@ -2161,18 +2463,15 @@ rc = ERROR_FAIL; goto out; } - if (dm_ver != LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL) { - LOG(ERROR, "cdrom-insert does not work with %s", - libxl_device_model_version_to_string(dm_ver)); - rc = ERROR_INVAL; - goto out; - } disks = libxl_device_disk_list(ctx, domid, &num); for (i = 0; i < num; i++) { if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev)) - /* found */ + { + /* Found. Set backend type appropriately. */ + disk->backend=disks[i].backend; break; + } } if (i == num) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual device not found"); @@ -2190,9 +2489,26 @@ rc = libxl__device_from_disk(gc, domid, disk, &device); if (rc) goto out; + + if (dm_ver == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) { + rc = libxl__qmp_insert_cdrom(gc, domid, disk); + if (rc) goto out; + } + path = libxl__device_backend_path(gc, &device); - insert = flexarray_make(4, 1); + /* Sanity check: make sure the backend exists before writing here */ + tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", path)); + if (!tmp) + { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Internal error: %s does not exist", + libxl__sprintf(gc, "%s/frontend", path)); + rc = ERROR_FAIL; + goto out; + } + + + insert = flexarray_make(gc, 4, 1); flexarray_append_pair(insert, "type", libxl__device_disk_string_of_backend(disk->backend)); @@ -2218,8 +2534,6 @@ libxl_device_disk_dispose(&disks[i]); free(disks); - if (insert) flexarray_free(insert); - if (rc) return AO_ABORT(rc); return AO_INPROGRESS; } @@ -2357,7 +2671,7 @@ rc = aodev->rc; if (rc) { LOGE(ERROR, "unable to %s %s with id %u", - aodev->action == DEVICE_CONNECT ? "add" : "remove", + libxl__device_action_to_string(aodev->action), libxl__device_kind_to_string(aodev->dev->kind), aodev->dev->devid); goto out; @@ -2411,7 +2725,7 @@ disk, device); if (rc != 0) goto out; - aodev->action = DEVICE_DISCONNECT; + aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->dev = device; aodev->callback = local_device_detach_cb; aodev->force = 0; @@ -2442,7 +2756,7 @@ if (aodev->rc) { LOGE(ERROR, "unable to %s %s with id %u", - aodev->action == DEVICE_CONNECT ? "add" : "remove", + libxl__device_action_to_string(aodev->action), libxl__device_kind_to_string(aodev->dev->kind), aodev->dev->devid); goto out; @@ -2465,6 +2779,7 @@ uint32_t domid) { int run_hotplug_scripts; + int rc; if (!nic->mtu) nic->mtu = 1492; @@ -2500,6 +2815,10 @@ LOG(ERROR, "unable to get current hotplug scripts execution setting"); return run_hotplug_scripts; } + + rc = libxl__resolve_domid(gc, nic->backend_domname, &nic->backend_domid); + if (rc < 0) return rc; + if (nic->backend_domid != LIBXL_TOOLSTACK_DOMID && run_hotplug_scripts) { LOG(ERROR, "cannot use a backend domain different than %d if" "hotplug scripts are executed from libxl", @@ -2525,7 +2844,7 @@ abort(); } - return 0; + return rc; } static int libxl__device_from_nic(libxl__gc *gc, uint32_t domid, @@ -2549,40 +2868,24 @@ flexarray_t *front; flexarray_t *back; libxl__device *device; - char *dompath, **l; - unsigned int nb, rc; + unsigned int rc; rc = libxl__device_nic_setdefault(gc, nic, domid); if (rc) goto out; - front = flexarray_make(16, 1); - if (!front) { - rc = ERROR_NOMEM; - goto out; - } - back = flexarray_make(16, 1); - if (!back) { - rc = ERROR_NOMEM; - goto out_free; - } + front = flexarray_make(gc, 16, 1); + back = flexarray_make(gc, 18, 1); if (nic->devid == -1) { - if (!(dompath = libxl__xs_get_dompath(gc, domid))) { + if ((nic->devid = libxl__device_nextid(gc, domid, "vif")) < 0) { rc = ERROR_FAIL; - goto out_free; - } - if (!(l = libxl__xs_directory(gc, XBT_NULL, - libxl__sprintf(gc, "%s/device/vif", dompath), &nb)) || - nb == 0) { - nic->devid = 0; - } else { - nic->devid = strtoul(l[nb - 1], NULL, 10) + 1; + goto out; } } GCNEW(device); rc = libxl__device_from_nic(gc, domid, nic, device); - if ( rc != 0 ) goto out_free; + if ( rc != 0 ) goto out; flexarray_append(back, "frontend-id"); flexarray_append(back, libxl__sprintf(gc, "%d", domid)); @@ -2607,6 +2910,10 @@ flexarray_append(back, "ip"); flexarray_append(back, libxl__strdup(gc, nic->ip)); } + if (nic->gatewaydev) { + flexarray_append(back, "gatewaydev"); + flexarray_append(back, libxl__strdup(gc, nic->gatewaydev)); + } if (nic->rate_interval_usecs > 0) { flexarray_append(back, "rate"); @@ -2633,17 +2940,15 @@ flexarray_append(front, libxl__sprintf(gc, LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac))); libxl__device_generic_add(gc, XBT_NULL, device, - libxl__xs_kvs_of_flexarray(gc, back, back->count), - libxl__xs_kvs_of_flexarray(gc, front, front->count)); + libxl__xs_kvs_of_flexarray(gc, back, back->count), + libxl__xs_kvs_of_flexarray(gc, front, front->count), + NULL); aodev->dev = device; - aodev->action = DEVICE_CONNECT; + aodev->action = LIBXL__DEVICE_ACTION_ADD; libxl__wait_device_connection(egc, aodev); rc = 0; -out_free: - flexarray_free(back); - flexarray_free(front); out: aodev->rc = rc; if (rc) aodev->callback(egc, aodev); @@ -2659,7 +2964,7 @@ char *tmp; int rc; - memset(nic, 0, sizeof(*nic)); + libxl_device_nic_init(nic); tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/handle", be_path), &len); @@ -2698,7 +3003,7 @@ char *dompath, *path; int rc = ERROR_FAIL; - memset(nic, 0, sizeof (libxl_device_nic)); + libxl_device_nic_init(nic); dompath = libxl__xs_get_dompath(gc, domid); if (!dompath) goto out; @@ -2830,7 +3135,7 @@ libxl__device_console *console, libxl__domain_build_state *state) { - flexarray_t *front; + flexarray_t *front, *ro_front; flexarray_t *back; libxl__device device; int rc; @@ -2840,16 +3145,9 @@ goto out; } - front = flexarray_make(16, 1); - if (!front) { - rc = ERROR_NOMEM; - goto out; - } - back = flexarray_make(16, 1); - if (!back) { - rc = ERROR_NOMEM; - goto out_free; - } + front = flexarray_make(gc, 16, 1); + ro_front = flexarray_make(gc, 16, 1); + back = flexarray_make(gc, 16, 1); device.backend_devid = console->devid; device.backend_domid = console->backend_domid; @@ -2871,21 +3169,24 @@ flexarray_append(front, "backend-id"); flexarray_append(front, libxl__sprintf(gc, "%d", console->backend_domid)); - flexarray_append(front, "limit"); - flexarray_append(front, libxl__sprintf(gc, "%d", LIBXL_XENCONSOLE_LIMIT)); - flexarray_append(front, "type"); + + flexarray_append(ro_front, "limit"); + flexarray_append(ro_front, libxl__sprintf(gc, "%d", LIBXL_XENCONSOLE_LIMIT)); + flexarray_append(ro_front, "type"); if (console->consback == LIBXL__CONSOLE_BACKEND_XENCONSOLED) - flexarray_append(front, "xenconsoled"); + flexarray_append(ro_front, "xenconsoled"); else - flexarray_append(front, "ioemu"); - flexarray_append(front, "output"); - flexarray_append(front, console->output); + flexarray_append(ro_front, "ioemu"); + flexarray_append(ro_front, "output"); + flexarray_append(ro_front, console->output); + flexarray_append(ro_front, "tty"); + flexarray_append(ro_front, ""); if (state) { - flexarray_append(front, "port"); - flexarray_append(front, libxl__sprintf(gc, "%"PRIu32, state->console_port)); - flexarray_append(front, "ring-ref"); - flexarray_append(front, libxl__sprintf(gc, "%lu", state->console_mfn)); + flexarray_append(ro_front, "port"); + flexarray_append(ro_front, libxl__sprintf(gc, "%"PRIu32, state->console_port)); + flexarray_append(ro_front, "ring-ref"); + flexarray_append(ro_front, libxl__sprintf(gc, "%lu", state->console_mfn)); } else { flexarray_append(front, "state"); flexarray_append(front, libxl__sprintf(gc, "%d", 1)); @@ -2894,12 +3195,10 @@ } libxl__device_generic_add(gc, XBT_NULL, &device, - libxl__xs_kvs_of_flexarray(gc, back, back->count), - libxl__xs_kvs_of_flexarray(gc, front, front->count)); + libxl__xs_kvs_of_flexarray(gc, back, back->count), + libxl__xs_kvs_of_flexarray(gc, front, front->count), + libxl__xs_kvs_of_flexarray(gc, ro_front, ro_front->count)); rc = 0; -out_free: - flexarray_free(back); - flexarray_free(front); out: return rc; } @@ -2908,7 +3207,9 @@ int libxl__device_vkb_setdefault(libxl__gc *gc, libxl_device_vkb *vkb) { - return 0; + int rc; + rc = libxl__resolve_domid(gc, vkb->backend_domname, &vkb->backend_domid); + return rc; } static int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid, @@ -2953,19 +3254,18 @@ rc = libxl__device_vkb_setdefault(gc, vkb); if (rc) goto out; - front = flexarray_make(16, 1); - if (!front) { - rc = ERROR_NOMEM; - goto out; - } - back = flexarray_make(16, 1); - if (!back) { - rc = ERROR_NOMEM; - goto out_free; + front = flexarray_make(gc, 16, 1); + back = flexarray_make(gc, 16, 1); + + if (vkb->devid == -1) { + if ((vkb->devid = libxl__device_nextid(gc, domid, "vkb")) < 0) { + rc = ERROR_FAIL; + goto out; + } } rc = libxl__device_from_vkb(gc, domid, vkb, &device); - if (rc != 0) goto out_free; + if (rc != 0) goto out; flexarray_append(back, "frontend-id"); flexarray_append(back, libxl__sprintf(gc, "%d", domid)); @@ -2982,12 +3282,10 @@ flexarray_append(front, libxl__sprintf(gc, "%d", 1)); libxl__device_generic_add(gc, XBT_NULL, &device, - libxl__xs_kvs_of_flexarray(gc, back, back->count), - libxl__xs_kvs_of_flexarray(gc, front, front->count)); + libxl__xs_kvs_of_flexarray(gc, back, back->count), + libxl__xs_kvs_of_flexarray(gc, front, front->count), + NULL); rc = 0; -out_free: - flexarray_free(back); - flexarray_free(front); out: return rc; } @@ -2996,6 +3294,8 @@ int libxl__device_vfb_setdefault(libxl__gc *gc, libxl_device_vfb *vfb) { + int rc; + libxl_defbool_setdefault(&vfb->vnc.enable, true); if (libxl_defbool_val(vfb->vnc.enable)) { if (!vfb->vnc.listen) { @@ -3011,7 +3311,8 @@ libxl_defbool_setdefault(&vfb->sdl.enable, false); libxl_defbool_setdefault(&vfb->sdl.opengl, false); - return 0; + rc = libxl__resolve_domid(gc, vfb->backend_domname, &vfb->backend_domid); + return rc; } static int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid, @@ -3054,19 +3355,18 @@ rc = libxl__device_vfb_setdefault(gc, vfb); if (rc) goto out; - front = flexarray_make(16, 1); - if (!front) { - rc = ERROR_NOMEM; - goto out; - } - back = flexarray_make(16, 1); - if (!back) { - rc = ERROR_NOMEM; - goto out_free; + front = flexarray_make(gc, 16, 1); + back = flexarray_make(gc, 16, 1); + + if (vfb->devid == -1) { + if ((vfb->devid = libxl__device_nextid(gc, domid, "vfb")) < 0) { + rc = ERROR_FAIL; + goto out; + } } rc = libxl__device_from_vfb(gc, domid, vfb, &device); - if (rc != 0) goto out_free; + if (rc != 0) goto out; flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", domid)); flexarray_append_pair(back, "online", "1"); @@ -3096,12 +3396,10 @@ flexarray_append_pair(front, "state", libxl__sprintf(gc, "%d", 1)); libxl__device_generic_add(gc, XBT_NULL, &device, - libxl__xs_kvs_of_flexarray(gc, back, back->count), - libxl__xs_kvs_of_flexarray(gc, front, front->count)); + libxl__xs_kvs_of_flexarray(gc, back, back->count), + libxl__xs_kvs_of_flexarray(gc, front, front->count), + NULL); rc = 0; -out_free: - flexarray_free(front); - flexarray_free(back); out: return rc; } @@ -3114,6 +3412,8 @@ * libxl_device_disk_destroy * libxl_device_nic_remove * libxl_device_nic_destroy + * libxl_device_vtpm_remove + * libxl_device_vtpm_destroy * libxl_device_vkb_remove * libxl_device_vkb_destroy * libxl_device_vfb_remove @@ -3135,7 +3435,7 @@ \ GCNEW(aodev); \ libxl__prepare_ao_device(ao, aodev); \ - aodev->action = DEVICE_DISCONNECT; \ + aodev->action = LIBXL__DEVICE_ACTION_REMOVE; \ aodev->dev = device; \ aodev->callback = device_addrm_aocomplete; \ aodev->force = f; \ @@ -3165,6 +3465,10 @@ DEFINE_DEVICE_REMOVE(vfb, remove, 0) DEFINE_DEVICE_REMOVE(vfb, destroy, 1) +/* vtpm */ +DEFINE_DEVICE_REMOVE(vtpm, remove, 0) +DEFINE_DEVICE_REMOVE(vtpm, destroy, 1) + #undef DEFINE_DEVICE_REMOVE /******************************************************************************/ @@ -3173,6 +3477,7 @@ /* The following functions are defined: * libxl_device_disk_add * libxl_device_nic_add + * libxl_device_vtpm_add */ #define DEFINE_DEVICE_ADD(type) \ @@ -3199,6 +3504,9 @@ /* nic */ DEFINE_DEVICE_ADD(nic) +/* vtpm */ +DEFINE_DEVICE_ADD(vtpm) + #undef DEFINE_DEVICE_ADD /******************************************************************************/ @@ -3345,7 +3653,7 @@ int32_t target_memkb, int relative, int enforce) { GC_INIT(ctx); - int rc = 1, abort = 0; + int rc = 1, abort_transaction = 0; uint32_t memorykb = 0, videoram = 0; uint32_t current_target_memkb = 0, new_target_memkb = 0; char *memmax, *endptr, *videoram_s = NULL, *target = NULL; @@ -3364,7 +3672,7 @@ xs_transaction_end(ctx->xsh, t, 1); rc = libxl__fill_dom0_memory_info(gc, ¤t_target_memkb); if (rc < 0) { - abort = 1; + abort_transaction = 1; goto out; } goto retry_transaction; @@ -3372,7 +3680,7 @@ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot get target memory info from %s/memory/target\n", dompath); - abort = 1; + abort_transaction = 1; goto out; } else { current_target_memkb = strtoul(target, &endptr, 10); @@ -3380,7 +3688,7 @@ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "invalid memory target %s from %s/memory/target\n", target, dompath); - abort = 1; + abort_transaction = 1; goto out; } } @@ -3390,7 +3698,7 @@ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot get memory info from %s/memory/static-max\n", dompath); - abort = 1; + abort_transaction = 1; goto out; } memorykb = strtoul(memmax, &endptr, 10); @@ -3398,7 +3706,7 @@ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "invalid max memory %s from %s/memory/static-max\n", memmax, dompath); - abort = 1; + abort_transaction = 1; goto out; } @@ -3413,7 +3721,7 @@ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "memory_dynamic_max must be less than or equal to" " memory_static_max\n"); - abort = 1; + abort_transaction = 1; goto out; } @@ -3421,7 +3729,7 @@ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "new target %d for dom0 is below the minimum threshold\n", new_target_memkb); - abort = 1; + abort_transaction = 1; goto out; } videoram_s = libxl__xs_read(gc, t, libxl__sprintf(gc, @@ -3436,7 +3744,7 @@ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_domain_setmaxmem domid=%d memkb=%d failed " "rc=%d\n", domid, memorykb + LIBXL_MAXMEM_CONSTANT, rc); - abort = 1; + abort_transaction = 1; goto out; } } @@ -3449,7 +3757,7 @@ "xc_domain_set_pod_target domid=%d, memkb=%d " "failed rc=%d\n", domid, new_target_memkb / 4, rc); - abort = 1; + abort_transaction = 1; goto out; } @@ -3457,7 +3765,7 @@ dompath), "%"PRIu32, new_target_memkb); rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info); if (rc != 1 || info.domain != domid) { - abort = 1; + abort_transaction = 1; goto out; } xcinfo2xlinfo(&info, &ptr); @@ -3466,7 +3774,8 @@ "%"PRIu32, new_target_memkb / 1024); out: - if (!xs_transaction_end(ctx->xsh, t, abort) && !abort) + if (!xs_transaction_end(ctx->xsh, t, abort_transaction) + && !abort_transaction) if (errno == EAGAIN) goto retry_transaction; @@ -3613,9 +3922,9 @@ rc = libxl_domain_info(ctx, &info, domid); if (rc < 0) return rc; - } while (wait_secs > 0 && info.current_memkb > target_memkb); + } while (wait_secs > 0 && (info.current_memkb + info.outstanding_memkb) > target_memkb); - if (info.current_memkb <= target_memkb) + if ((info.current_memkb + info.outstanding_memkb) <= target_memkb) rc = 0; else rc = ERROR_FAIL; @@ -3643,26 +3952,23 @@ physinfo->total_pages = xcphysinfo.total_pages; physinfo->free_pages = xcphysinfo.free_pages; physinfo->scrub_pages = xcphysinfo.scrub_pages; + physinfo->outstanding_pages = xcphysinfo.outstanding_pages; l = xc_sharing_freed_pages(ctx->xch); - if (l < 0) { - if (errno == ENOSYS) { - l = 0; - } else { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, - "getting sharing freed pages"); - return ERROR_FAIL; - } + if (l == -ENOSYS) { + l = 0; + } else if (l < 0) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, l, + "getting sharing freed pages"); + return ERROR_FAIL; } physinfo->sharing_freed_pages = l; l = xc_sharing_used_frames(ctx->xch); - if (l < 0) { - if (errno == ENOSYS) { - l = 0; - } else { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, - "getting sharing used frames"); - return ERROR_FAIL; - } + if (l == -ENOSYS) { + l = 0; + } else if (l < 0) { + LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, l, + "getting sharing used frames"); + return ERROR_FAIL; } physinfo->sharing_used_frames = l; physinfo->nr_nodes = xcphysinfo.nr_nodes; @@ -3921,33 +4227,93 @@ return rc; } -int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap) +int libxl_domain_set_nodeaffinity(libxl_ctx *ctx, uint32_t domid, + libxl_bitmap *nodemap) +{ + if (xc_domain_node_setaffinity(ctx->xch, domid, nodemap->map)) { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "setting node affinity"); + return ERROR_FAIL; + } + return 0; +} + +int libxl_domain_get_nodeaffinity(libxl_ctx *ctx, uint32_t domid, + libxl_bitmap *nodemap) +{ + if (xc_domain_node_getaffinity(ctx->xch, domid, nodemap->map)) { + LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting node affinity"); + return ERROR_FAIL; + } + return 0; +} + +static int libxl__set_vcpuonline_xenstore(libxl__gc *gc, uint32_t domid, + libxl_bitmap *cpumap) { - GC_INIT(ctx); libxl_dominfo info; char *dompath; xs_transaction_t t; int i, rc = ERROR_FAIL; - if (libxl_domain_info(ctx, &info, domid) < 0) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list"); + if (libxl_domain_info(CTX, &info, domid) < 0) { + LOGE(ERROR, "getting domain info list"); goto out; } if (!(dompath = libxl__xs_get_dompath(gc, domid))) goto out; retry_transaction: - t = xs_transaction_start(ctx->xsh); + t = xs_transaction_start(CTX->xsh); for (i = 0; i <= info.vcpu_max_id; i++) libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/cpu/%u/availability", dompath, i), "%s", libxl_bitmap_test(cpumap, i) ? "online" : "offline"); - if (!xs_transaction_end(ctx->xsh, t, 0)) { + if (!xs_transaction_end(CTX->xsh, t, 0)) { if (errno == EAGAIN) goto retry_transaction; } else rc = 0; out: + return rc; +} + +static int libxl__set_vcpuonline_qmp(libxl__gc *gc, uint32_t domid, + libxl_bitmap *cpumap) +{ + libxl_dominfo info; + int i; + + if (libxl_domain_info(CTX, &info, domid) < 0) { + LOGE(ERROR, "getting domain info list"); + return ERROR_FAIL; + } + for (i = 0; i <= info.vcpu_max_id; i++) { + if (libxl_bitmap_test(cpumap, i)) { + /* Return value is ignore because it does not tell anything useful + * on the completion of the command. + * (For instance, "CPU already plugged-in" give the same return + * value as "command not supported".) + */ + libxl__qmp_cpu_add(gc, domid, i); + } + } + return 0; +} + +int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap) +{ + GC_INIT(ctx); + int rc; + switch (libxl__device_model_version_running(gc, domid)) { + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: + rc = libxl__set_vcpuonline_xenstore(gc, domid, cpumap); + break; + case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: + rc = libxl__set_vcpuonline_qmp(gc, domid, cpumap); + break; + default: + rc = ERROR_INVAL; + } GC_FREE; return rc; } diff -Nru xen-4.2.2/tools/libxl/libxl.h xen-4.3.0/tools/libxl/libxl.h --- xen-4.2.2/tools/libxl/libxl.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl.h 2013-07-09 10:46:56.000000000 +0000 @@ -68,6 +68,20 @@ */ /* + * LIBXL_HAVE_FIRMWARE_PASSTHROUGH indicates the feature for + * passing in SMBIOS and ACPI firmware to HVM guests is present + * in the library. + */ +#define LIBXL_HAVE_FIRMWARE_PASSTHROUGH 1 + +/* + * LIBXL_HAVE_DOMAIN_NODEAFFINITY indicates that a 'nodemap' field + * (of libxl_bitmap type) is present in libxl_domain_build_info, + * containing the node-affinity for the domain. + */ +#define LIBXL_HAVE_DOMAIN_NODEAFFINITY 1 + +/* * libxl ABI compatibility * * The only guarantee which libxl makes regarding ABI compatibility @@ -259,13 +273,69 @@ #include #include <_libxl_list.h> -/* API compatibility. Only 0x040200 is supported at this time. */ +/* API compatibility. */ #ifdef LIBXL_API_VERSION -#if LIBXL_API_VERSION != 0x040200 +#if LIBXL_API_VERSION != 0x040200 && LIBXL_API_VERSION != 0x040300 #error Unknown LIBXL_API_VERSION #endif #endif +/* + * LIBXL_HAVE_BUILDINFO_USBDEVICE_LIST + * + * If this is defined, then the libxl_domain_build_info structure will + * contain hvm.usbdevice_list, a libxl_string_list type that contains + * a list of USB devices to specify on the qemu command-line. + * + * If it is set, callers may use either hvm.usbdevice or + * hvm.usbdevice_list, but not both; if both are set, libxl will + * throw an error. + * + * If this is not defined, callers can only use hvm.usbdevice. Note + * that this means only one device can be added at domain build time. + */ +#define LIBXL_HAVE_BUILDINFO_USBDEVICE_LIST 1 + +/* + * LIBXL_HAVE_DEVICE_BACKEND_DOMNAME + * + * If this is defined, libxl_device_* structures containing a backend_domid + * field also contain a backend_domname field. If backend_domname is set, it is + * resolved to a domain ID when the device is used and takes precedence over the + * backend_domid field. + * + * If this is not defined, the backend_domname field does not exist. + */ +#define LIBXL_HAVE_DEVICE_BACKEND_DOMNAME 1 + +/* + * LIBXL_HAVE_NONCONST_EVENT_OCCURS_EVENT_ARG + * + * This argument was erroneously "const" in the 4.2 release despite + * the requirement for the callback to free the event. + */ +#if LIBXL_API_VERSION != 0x040200 +#define LIBXL_HAVE_NONCONST_EVENT_OCCURS_EVENT_ARG 1 +#endif + +/* + * LIBXL_HAVE_PHYSINFO_OUTSTANDING_PAGES + * + * If this is defined, libxl_physinfo structure will contain an uint64 field + * called outstanding_pages, containing the number of pages claimed but not + * yet allocated for all domains. + */ +#define LIBXL_HAVE_PHYSINFO_OUTSTANDING_PAGES 1 + +/* + * LIBXL_HAVE_DOMINFO_OUTSTANDING_MEMKB 1 + * + * If this is defined, libxl_dominfo will contain a MemKB type field called + * outstanding_memkb, containing the amount of claimed but not yet allocated + * memory for a specific domain. + */ +#define LIBXL_HAVE_DOMINFO_OUTSTANDING_MEMKB 1 + /* Functions annotated with LIBXL_EXTERNAL_CALLERS_ONLY may not be * called from within libxl itself. Callers outside libxl, who * do not #include libxl_internal.h, are fine. */ @@ -474,25 +544,6 @@ #define LIBXL_VERSION 0 -typedef struct { - libxl_domain_create_info c_info; - libxl_domain_build_info b_info; - - int num_disks, num_nics, num_pcidevs, num_vfbs, num_vkbs; - - libxl_device_disk *disks; - libxl_device_nic *nics; - libxl_device_pci *pcidevs; - libxl_device_vfb *vfbs; - libxl_device_vkb *vkbs; - - libxl_action_on_shutdown on_poweroff; - libxl_action_on_shutdown on_reboot; - libxl_action_on_shutdown on_watchdog; - libxl_action_on_shutdown on_crash; -} libxl_domain_config; -char *libxl_domain_config_to_json(libxl_ctx *ctx, libxl_domain_config *p); - /* context functions */ int libxl_ctx_alloc(libxl_ctx **pctx, int version, unsigned flags /* none currently defined */, @@ -591,7 +642,6 @@ /* wait for the memory target of a domain to be reached */ int libxl_wait_for_memory_target(libxl_ctx *ctx, uint32_t domid, int wait_secs); - int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass); int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_console_type type); /* libxl_primary_console_exec finds the domid and console number @@ -645,6 +695,9 @@ int *nb_vcpu, int *nr_vcpus_out); void libxl_vcpuinfo_list_free(libxl_vcpuinfo *, int nr_vcpus); +void libxl_device_vtpm_list_free(libxl_device_vtpm*, int nr_vtpms); +void libxl_vtpminfo_list_free(libxl_vtpminfo *, int nr_vtpms); + /* * Devices * ======= @@ -745,6 +798,23 @@ int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, libxl_nicinfo *nicinfo); +/* Virtual TPMs */ +int libxl_device_vtpm_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vtpm *vtpm, + const libxl_asyncop_how *ao_how) + LIBXL_EXTERNAL_CALLERS_ONLY; +int libxl_device_vtpm_remove(libxl_ctx *ctx, uint32_t domid, + libxl_device_vtpm *vtpm, + const libxl_asyncop_how *ao_how) + LIBXL_EXTERNAL_CALLERS_ONLY; +int libxl_device_vtpm_destroy(libxl_ctx *ctx, uint32_t domid, + libxl_device_vtpm *vtpm, + const libxl_asyncop_how *ao_how) + LIBXL_EXTERNAL_CALLERS_ONLY; + +libxl_device_vtpm *libxl_device_vtpm_list(libxl_ctx *ctx, uint32_t domid, int *num); +int libxl_device_vtpm_getinfo(libxl_ctx *ctx, uint32_t domid, + libxl_device_vtpm *vtpm, libxl_vtpminfo *vtpminfo); + /* Keyboard */ int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb, const libxl_asyncop_how *ao_how) @@ -860,6 +930,10 @@ libxl_bitmap *cpumap); int libxl_set_vcpuaffinity_all(libxl_ctx *ctx, uint32_t domid, unsigned int max_vcpus, libxl_bitmap *cpumap); +int libxl_domain_set_nodeaffinity(libxl_ctx *ctx, uint32_t domid, + libxl_bitmap *nodemap); +int libxl_domain_get_nodeaffinity(libxl_ctx *ctx, uint32_t domid, + libxl_bitmap *nodemap); int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap); libxl_scheduler libxl_get_scheduler(libxl_ctx *ctx); diff -Nru xen-4.2.2/tools/libxl/libxl_bootloader.c xen-4.3.0/tools/libxl/libxl_bootloader.c --- xen-4.2.2/tools/libxl/libxl_bootloader.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_bootloader.c 2013-07-09 10:46:56.000000000 +0000 @@ -419,7 +419,7 @@ const char *bltmp; struct stat st; - bltmp = libxl__abs_path(gc, bootloader, libxl__libexec_path()); + bltmp = libxl__abs_path(gc, bootloader, libxl__private_bindir_path()); /* Check to see if the file exists in this location; if not, * fall back to checking the path */ LOG(DEBUG, "Checking for bootloader in libexec path: %s", bltmp); diff -Nru xen-4.2.2/tools/libxl/libxl_cpuid.c xen-4.3.0/tools/libxl/libxl_cpuid.c --- xen-4.2.2/tools/libxl/libxl_cpuid.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_cpuid.c 2013-07-09 10:46:56.000000000 +0000 @@ -99,8 +99,11 @@ {"popcnt", 0x00000001, NA, CPUID_REG_ECX, 23, 1}, {"movbe", 0x00000001, NA, CPUID_REG_ECX, 22, 1}, {"x2apic", 0x00000001, NA, CPUID_REG_ECX, 21, 1}, + /* Linux uses sse4_{1,2}. Keep sse4.{1,2} for compatibility */ {"sse4.2", 0x00000001, NA, CPUID_REG_ECX, 20, 1}, + {"sse4_2", 0x00000001, NA, CPUID_REG_ECX, 20, 1}, {"sse4.1", 0x00000001, NA, CPUID_REG_ECX, 19, 1}, + {"sse4_1", 0x00000001, NA, CPUID_REG_ECX, 19, 1}, {"dca", 0x00000001, NA, CPUID_REG_ECX, 18, 1}, {"pdcm", 0x00000001, NA, CPUID_REG_ECX, 15, 1}, {"xtpr", 0x00000001, NA, CPUID_REG_ECX, 14, 1}, diff -Nru xen-4.2.2/tools/libxl/libxl_create.c xen-4.3.0/tools/libxl/libxl_create.c --- xen-4.2.2/tools/libxl/libxl_create.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_create.c 2013-07-09 10:46:56.000000000 +0000 @@ -24,41 +24,6 @@ #include #include -void libxl_domain_config_init(libxl_domain_config *d_config) -{ - memset(d_config, 0, sizeof(*d_config)); - libxl_domain_create_info_init(&d_config->c_info); - libxl_domain_build_info_init(&d_config->b_info); -} - -void libxl_domain_config_dispose(libxl_domain_config *d_config) -{ - int i; - - for (i=0; inum_disks; i++) - libxl_device_disk_dispose(&d_config->disks[i]); - free(d_config->disks); - - for (i=0; inum_nics; i++) - libxl_device_nic_dispose(&d_config->nics[i]); - free(d_config->nics); - - for (i=0; inum_pcidevs; i++) - libxl_device_pci_dispose(&d_config->pcidevs[i]); - free(d_config->pcidevs); - - for (i=0; inum_vfbs; i++) - libxl_device_vfb_dispose(&d_config->vfbs[i]); - free(d_config->vfbs); - - for (i=0; inum_vkbs; i++) - libxl_device_vkb_dispose(&d_config->vkbs[i]); - free(d_config->vkbs); - - libxl_domain_create_info_dispose(&d_config->c_info); - libxl_domain_build_info_dispose(&d_config->b_info); -} - int libxl__domain_create_info_setdefault(libxl__gc *gc, libxl_domain_create_info *c_info) { @@ -140,22 +105,29 @@ libxl_defbool_setdefault(&b_info->device_model_stubdomain, false); if (!b_info->device_model_version) { - if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) + if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) { + if (libxl_defbool_val(b_info->device_model_stubdomain)) { + b_info->device_model_version = + LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; + } else { + b_info->device_model_version = libxl__default_device_model(gc); + } + } else { b_info->device_model_version = - LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; - else { + LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN; + } + if (b_info->device_model_version + == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) { const char *dm; int rc; - b_info->device_model_version = - LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN; dm = libxl__domain_device_model(gc, b_info); rc = access(dm, X_OK); if (rc < 0) { /* qemu-xen unavailable, use qemu-xen-traditional */ if (errno == ENOENT) { LIBXL__LOG_ERRNO(CTX, XTL_VERBOSE, "qemu-xen is unavailable" - ", use qemu-xen-traditional instead"); + ", use qemu-xen-traditional instead"); b_info->device_model_version = LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; } else { @@ -219,11 +191,19 @@ libxl_defbool_setdefault(&b_info->numa_placement, true); + if (!b_info->nodemap.size) { + if (libxl_node_bitmap_alloc(CTX, &b_info->nodemap, 0)) + return ERROR_FAIL; + libxl_bitmap_set_any(&b_info->nodemap); + } + if (b_info->max_memkb == LIBXL_MEMKB_DEFAULT) b_info->max_memkb = 32 * 1024; if (b_info->target_memkb == LIBXL_MEMKB_DEFAULT) b_info->target_memkb = b_info->max_memkb; + libxl_defbool_setdefault(&b_info->claim_mode, false); + libxl_defbool_setdefault(&b_info->localtime, false); libxl_defbool_setdefault(&b_info->disable_migrate, false); @@ -239,12 +219,11 @@ if (b_info->video_memkb == LIBXL_MEMKB_DEFAULT) b_info->video_memkb = 16 * 1024; else if (b_info->video_memkb < (16 * 1024) ){ - LOG(ERROR, - "videoram must be at least 16 mb with stdvga"); + LOG(ERROR, "videoram must be at least 16 mb with stdvga"); return ERROR_INVAL; } } else if (b_info->video_memkb == LIBXL_MEMKB_DEFAULT) - b_info->video_memkb = 8 * 1024; + b_info->video_memkb = 8 * 1024; else if (b_info->video_memkb < (8 * 1024) ){ LOG(ERROR,"videoram must be at least 8 mb"); return ERROR_INVAL; @@ -618,6 +597,8 @@ static void domcreate_launch_dm(libxl__egc *egc, libxl__multidev *aodevs, int ret); +static void domcreate_attach_vtpms(libxl__egc *egc, libxl__multidev *multidev, + int ret); static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *aodevs, int ret); @@ -960,7 +941,7 @@ ret = xc_domain_ioport_permission(CTX->xch, domid, io->first, io->number, 1); - if ( ret<0 ){ + if (ret < 0) { LOGE(ERROR, "failed give dom%d access to ioports %"PRIx32"-%"PRIx32, domid, io->first, io->first + io->number - 1); @@ -977,12 +958,30 @@ : -EOVERFLOW; if (!ret) ret = xc_domain_irq_permission(CTX->xch, domid, irq, 1); - if ( ret<0 ){ + if (ret < 0) { LOGE(ERROR, "failed give dom%d access to irq %d", domid, irq); ret = ERROR_FAIL; } } + for (i = 0; i < d_config->b_info.num_iomem; i++) { + libxl_iomem_range *io = &d_config->b_info.iomem[i]; + + LOG(DEBUG, "dom%d iomem %"PRIx64"-%"PRIx64, + domid, io->start, io->start + io->number - 1); + + ret = xc_domain_iomem_permission(CTX->xch, domid, + io->start, io->number, 1); + if (ret < 0) { + LOGE(ERROR, + "failed give dom%d access to iomem range %"PRIx64"-%"PRIx64, + domid, io->start, io->start + io->number - 1); + ret = ERROR_FAIL; + } + } + + + for (i = 0; i < d_config->num_nics; i++) { /* We have to init the nic here, because we still haven't * called libxl_device_nic_add at this point, but qemu needs @@ -1001,6 +1000,7 @@ ret = init_console_info(&console, 0); if ( ret ) goto error_out; + console.backend_domid = state->console_domid; libxl__device_console_add(gc, domid, &console, state); libxl__device_console_dispose(&console); @@ -1033,6 +1033,7 @@ d_config->num_vfbs, d_config->vfbs, d_config->num_disks, &d_config->disks[0]); + console.backend_domid = state->console_domid; libxl__device_console_add(gc, domid, &console, state); libxl__device_console_dispose(&console); @@ -1086,13 +1087,13 @@ if (d_config->num_nics > 0) { /* Attach nics */ libxl__multidev_begin(ao, &dcs->multidev); - dcs->multidev.callback = domcreate_attach_pci; + dcs->multidev.callback = domcreate_attach_vtpms; libxl__add_nics(egc, ao, domid, d_config, &dcs->multidev); libxl__multidev_prepared(egc, &dcs->multidev, 0); return; } - domcreate_attach_pci(egc, &dcs->multidev, 0); + domcreate_attach_vtpms(egc, &dcs->multidev, 0); return; error_out: @@ -1100,6 +1101,39 @@ domcreate_complete(egc, dcs, ret); } +static void domcreate_attach_vtpms(libxl__egc *egc, + libxl__multidev *multidev, + int ret) +{ + libxl__domain_create_state *dcs = CONTAINER_OF(multidev, *dcs, multidev); + STATE_AO_GC(dcs->ao); + int domid = dcs->guest_domid; + + libxl_domain_config* const d_config = dcs->guest_config; + + if(ret) { + LOG(ERROR, "unable to add nic devices"); + goto error_out; + } + + /* Plug vtpm devices */ + if (d_config->num_vtpms > 0) { + /* Attach vtpms */ + libxl__multidev_begin(ao, &dcs->multidev); + dcs->multidev.callback = domcreate_attach_pci; + libxl__add_vtpms(egc, ao, domid, d_config, &dcs->multidev); + libxl__multidev_prepared(egc, &dcs->multidev, 0); + return; + } + + domcreate_attach_pci(egc, multidev, 0); + return; + +error_out: + assert(ret); + domcreate_complete(egc, dcs, ret); +} + static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *multidev, int ret) { @@ -1113,7 +1147,7 @@ libxl_domain_config *const d_config = dcs->guest_config; if (ret) { - LOG(ERROR, "unable to add nic devices"); + LOG(ERROR, "unable to add vtpm devices"); goto error_out; } @@ -1145,6 +1179,10 @@ int rc) { STATE_AO_GC(dcs->ao); + libxl_domain_config *const d_config = dcs->guest_config; + + if (!rc && d_config->b_info.exec_ssidref) + rc = xc_flask_relabel_domain(CTX->xch, dcs->guest_domid, d_config->b_info.exec_ssidref); if (rc) { if (dcs->guest_domid) { diff -Nru xen-4.2.2/tools/libxl/libxl_device.c xen-4.3.0/tools/libxl/libxl_device.c --- xen-4.2.2/tools/libxl/libxl_device.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_device.c 2013-07-09 10:46:56.000000000 +0000 @@ -84,11 +84,12 @@ } int libxl__device_generic_add(libxl__gc *gc, xs_transaction_t t, - libxl__device *device, char **bents, char **fents) + libxl__device *device, char **bents, char **fents, char **ro_fents) { libxl_ctx *ctx = libxl__gc_owner(gc); char *frontend_path, *backend_path; struct xs_permissions frontend_perms[2]; + struct xs_permissions ro_frontend_perms[2]; struct xs_permissions backend_perms[2]; int create_transaction = t == XBT_NULL; @@ -100,22 +101,37 @@ frontend_perms[1].id = device->backend_domid; frontend_perms[1].perms = XS_PERM_READ; - backend_perms[0].id = device->backend_domid; - backend_perms[0].perms = XS_PERM_NONE; - backend_perms[1].id = device->domid; - backend_perms[1].perms = XS_PERM_READ; + ro_frontend_perms[0].id = backend_perms[0].id = device->backend_domid; + ro_frontend_perms[0].perms = backend_perms[0].perms = XS_PERM_NONE; + ro_frontend_perms[1].id = backend_perms[1].id = device->domid; + ro_frontend_perms[1].perms = backend_perms[1].perms = XS_PERM_READ; retry_transaction: if (create_transaction) t = xs_transaction_start(ctx->xsh); /* FIXME: read frontend_path and check state before removing stuff */ - if (fents) { + if (fents || ro_fents) { xs_rm(ctx->xsh, t, frontend_path); xs_mkdir(ctx->xsh, t, frontend_path); - xs_set_permissions(ctx->xsh, t, frontend_path, frontend_perms, ARRAY_SIZE(frontend_perms)); + /* Console 0 is a special case. It doesn't use the regular PV + * state machine but also the frontend directory has + * historically contained other information, such as the + * vnc-port, which we don't want the guest fiddling with. + */ + if (device->kind == LIBXL__DEVICE_KIND_CONSOLE && device->devid == 0) + xs_set_permissions(ctx->xsh, t, frontend_path, + ro_frontend_perms, ARRAY_SIZE(ro_frontend_perms)); + else + xs_set_permissions(ctx->xsh, t, frontend_path, + frontend_perms, ARRAY_SIZE(frontend_perms)); xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/backend", frontend_path), backend_path, strlen(backend_path)); - libxl__xs_writev(gc, t, frontend_path, fents); + if (fents) + libxl__xs_writev_perms(gc, t, frontend_path, fents, + frontend_perms, ARRAY_SIZE(frontend_perms)); + if (ro_fents) + libxl__xs_writev_perms(gc, t, frontend_path, ro_fents, + ro_frontend_perms, ARRAY_SIZE(ro_frontend_perms)); } if (bents) { @@ -161,6 +177,12 @@ goto bad_format; } + if (a->disk->backend_domid != LIBXL_TOOLSTACK_DOMID) { + LOG(DEBUG, "Disk vdev=%s, is using a storage driver domain, " + "skipping physical device check", a->disk->vdev); + return backend; + } + if (a->disk->script) { LOG(DEBUG, "Disk vdev=%s, uses script=... assuming phy backend", a->disk->vdev); @@ -178,6 +200,12 @@ case LIBXL_DISK_BACKEND_TAP: if (a->disk->script) goto bad_script; + if (a->disk->is_cdrom) { + LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, backend tap" + " unsuitable for cdroms", + a->disk->vdev); + return 0; + } if (!libxl__blktap_enabled(a->gc)) { LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, backend tap" " unsuitable because blktap not available", @@ -236,7 +264,10 @@ return ERROR_INVAL; } memset(&a.stab, 0, sizeof(a.stab)); - } else if (!disk->script) { + } else if ((disk->backend == LIBXL_DISK_BACKEND_UNKNOWN || + disk->backend == LIBXL_DISK_BACKEND_PHY) && + disk->backend_domid == LIBXL_TOOLSTACK_DOMID && + !disk->script) { if (stat(disk->pdev_path, &a.stab)) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Disk vdev=%s " "failed to stat: %s", @@ -409,6 +440,7 @@ aodev->ao = ao; aodev->rc = 0; aodev->dev = NULL; + aodev->num_exec = 0; /* Initialize timer for QEMU Bodge and hotplug execution */ libxl__ev_time_init(&aodev->timeout); aodev->active = 1; @@ -497,6 +529,7 @@ * The following functions are defined: * libxl__add_disks * libxl__add_nics + * libxl__add_vtpms */ #define DEFINE_DEVICES_ADD(type) \ @@ -515,6 +548,7 @@ DEFINE_DEVICES_ADD(disk) DEFINE_DEVICES_ADD(nic) +DEFINE_DEVICES_ADD(vtpm) #undef DEFINE_DEVICES_ADD @@ -611,7 +645,7 @@ continue; } aodev = libxl__multidev_prepare(multidev); - aodev->action = DEVICE_DISCONNECT; + aodev->action = LIBXL__DEVICE_ACTION_REMOVE; aodev->dev = dev; aodev->force = drs->force; libxl__initiate_device_remove(egc, aodev); @@ -846,7 +880,8 @@ device_backend_cleanup(gc, aodev); - if (rc == ERROR_TIMEDOUT && aodev->action == DEVICE_DISCONNECT && + if (rc == ERROR_TIMEDOUT && + aodev->action == LIBXL__DEVICE_ACTION_REMOVE && !aodev->force) { aodev->force = 1; libxl__initiate_device_remove(egc, aodev); @@ -855,7 +890,7 @@ if (rc) { LOG(ERROR, "unable to %s device with path %s", - aodev->action == DEVICE_CONNECT ? "connect" : "disconnect", + libxl__device_action_to_string(aodev->action), libxl__device_backend_path(gc, aodev->dev)); goto out; } @@ -884,6 +919,13 @@ int hotplug; pid_t pid; + /* + * If device is attached from a driver domain don't try to execute + * hotplug scripts + */ + if (aodev->dev->backend_domid != LIBXL_TOOLSTACK_DOMID) + goto out; + /* Check if we have to execute hotplug scripts for this device * and return the necessary args/env vars for execution */ hotplug = libxl__get_hotplug_script_info(gc, aodev->dev, &args, &env, @@ -978,7 +1020,7 @@ if (hotplug_error) LOG(ERROR, "script: %s", hotplug_error); aodev->rc = ERROR_FAIL; - if (aodev->action == DEVICE_CONNECT) + if (aodev->action == LIBXL__DEVICE_ACTION_ADD) /* * Only fail on device connection, on disconnection * ignore error, and continue with the remove process @@ -1008,7 +1050,7 @@ device_hotplug_clean(gc, aodev); /* Clean xenstore if it's a disconnection */ - if (aodev->action == DEVICE_DISCONNECT) { + if (aodev->action == LIBXL__DEVICE_ACTION_REMOVE) { rc = libxl__device_destroy(gc, aodev->dev); if (!aodev->rc) aodev->rc = rc; diff -Nru xen-4.2.2/tools/libxl/libxl_dm.c xen-4.3.0/tools/libxl/libxl_dm.c --- xen-4.2.2/tools/libxl/libxl_dm.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_dm.c 2013-07-09 10:46:56.000000000 +0000 @@ -109,10 +109,7 @@ const char *keymap = dm_keymap(guest_config); int i; flexarray_t *dm_args; - dm_args = flexarray_make(16, 1); - - if (!dm_args) - return NULL; + dm_args = flexarray_make(gc, 16, 1); flexarray_vappend(dm_args, dm, "-d", libxl__sprintf(gc, "%d", domid), NULL); @@ -121,33 +118,43 @@ flexarray_vappend(dm_args, "-domain-name", c_info->name, NULL); if (vnc) { - char *vncarg; - if (vnc->display) { - if (vnc->listen && strchr(vnc->listen, ':') == NULL) { - vncarg = libxl__sprintf(gc, "%s:%d", - vnc->listen, - vnc->display); - } else { - vncarg = libxl__sprintf(gc, "127.0.0.1:%d", vnc->display); - } - } else if (vnc->listen) { + char *vncarg = NULL; + + flexarray_append(dm_args, "-vnc"); + + /* + * If vnc->listen is present and contains a :, and + * - vnc->display is 0, use vnc->listen + * - vnc->display is non-zero, be confused + * If vnc->listen is present but doesn't, use vnc->listen:vnc->display. + * If vnc->listen is not present, use 127.0.0.1:vnc->display + * (Remembering that vnc->display already defaults to 0.) + */ + if (vnc->listen) { if (strchr(vnc->listen, ':') != NULL) { + if (vnc->display) { + LOG(ERROR, "vncdisplay set, vnclisten contains display"); + return NULL; + } vncarg = vnc->listen; } else { - vncarg = libxl__sprintf(gc, "%s:0", vnc->listen); + vncarg = libxl__sprintf(gc, "%s:%d", vnc->listen, + vnc->display); } - } else { - vncarg = "127.0.0.1:0"; - } - if (vnc->passwd && (vnc->passwd[0] != '\0')) + } else + vncarg = libxl__sprintf(gc, "127.0.0.1:%d", vnc->display); + + if (vnc->passwd && vnc->passwd[0]) { vncarg = libxl__sprintf(gc, "%s,password", vncarg); - flexarray_append(dm_args, "-vnc"); + } + flexarray_append(dm_args, vncarg); if (libxl_defbool_val(vnc->findunused)) { flexarray_append(dm_args, "-vncunused"); } } + if (sdl) { flexarray_append(dm_args, "-sdl"); if (!libxl_defbool_val(sdl->opengl)) { @@ -189,11 +196,28 @@ if (b_info->u.hvm.boot) { flexarray_vappend(dm_args, "-boot", b_info->u.hvm.boot, NULL); } - if (libxl_defbool_val(b_info->u.hvm.usb) || b_info->u.hvm.usbdevice) { + if (libxl_defbool_val(b_info->u.hvm.usb) + || b_info->u.hvm.usbdevice + || b_info->u.hvm.usbdevice_list) { + if ( b_info->u.hvm.usbdevice && b_info->u.hvm.usbdevice_list ) + { + LOG(ERROR, "%s: Both usbdevice and usbdevice_list set", + __func__); + return NULL; + } flexarray_append(dm_args, "-usb"); if (b_info->u.hvm.usbdevice) { flexarray_vappend(dm_args, "-usbdevice", b_info->u.hvm.usbdevice, NULL); + } else if (b_info->u.hvm.usbdevice_list) { + char **p; + for (p = b_info->u.hvm.usbdevice_list; + *p; + p++) { + flexarray_vappend(dm_args, + "-usbdevice", + *p, NULL); + } } } if (b_info->u.hvm.soundhw) { @@ -340,9 +364,7 @@ int i; uint64_t ram_size; - dm_args = flexarray_make(16, 1); - if (!dm_args) - return NULL; + dm_args = flexarray_make(gc, 16, 1); flexarray_vappend(dm_args, dm, "-xen-domid", @@ -364,37 +386,48 @@ if (c_info->name) { flexarray_vappend(dm_args, "-name", c_info->name, NULL); } + if (vnc) { - int display = 0; - const char *listen = "127.0.0.1"; char *vncarg = NULL; flexarray_append(dm_args, "-vnc"); - if (vnc->display) { - display = vnc->display; - if (vnc->listen && strchr(vnc->listen, ':') == NULL) { - listen = vnc->listen; + /* + * If vnc->listen is present and contains a :, and + * - vnc->display is 0, use vnc->listen + * - vnc->display is non-zero, be confused + * If vnc->listen is present but doesn't, use vnc->listen:vnc->display. + * If vnc->listen is not present, use 127.0.0.1:vnc->display + * (Remembering that vnc->display already defaults to 0.) + */ + if (vnc->listen) { + if (strchr(vnc->listen, ':') != NULL) { + if (vnc->display) { + LOG(ERROR, "vncdisplay set, vnclisten contains display"); + return NULL; + } + vncarg = vnc->listen; + } else { + vncarg = libxl__sprintf(gc, "%s:%d", vnc->listen, + vnc->display); } - } else if (vnc->listen) { - listen = vnc->listen; - } + } else + vncarg = libxl__sprintf(gc, "127.0.0.1:%d", vnc->display); - if (strchr(listen, ':') != NULL) - vncarg = libxl__sprintf(gc, "%s", listen); - else - vncarg = libxl__sprintf(gc, "%s:%d", listen, display); if (vnc->passwd && vnc->passwd[0]) { vncarg = libxl__sprintf(gc, "%s,password", vncarg); } + if (libxl_defbool_val(vnc->findunused)) { /* This option asks to QEMU to try this number of port before to * give up. So QEMU will try ports between $display and $display + * 99. This option needs to be the last one of the vnc options. */ vncarg = libxl__sprintf(gc, "%s,to=99", vncarg); } + flexarray_append(dm_args, vncarg); } + if (sdl) { flexarray_append(dm_args, "-sdl"); /* XXX sdl->{display,xauthority} into $DISPLAY/$XAUTHORITY */ @@ -411,6 +444,9 @@ if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) { int ioemu_nics = 0; + /* Disable useless empty floppy drive */ + flexarray_vappend(dm_args, "-global", "isa-fdc.driveA=", NULL); + if (b_info->u.hvm.serial) { flexarray_vappend(dm_args, "-serial", b_info->u.hvm.serial, NULL); } @@ -437,9 +473,8 @@ flexarray_vappend(dm_args, "-vga", "cirrus", NULL); if (b_info->video_memkb) { flexarray_vappend(dm_args, "-global", - libxl__sprintf(gc, "vga.vram_size_mb=%d", - libxl__sizekb_to_mb(b_info->video_memkb)), - NULL); + GCSPRINTF("vga.vram_size_mb=%d", + libxl__sizekb_to_mb(b_info->video_memkb)), NULL); } break; } @@ -448,11 +483,28 @@ flexarray_vappend(dm_args, "-boot", libxl__sprintf(gc, "order=%s", b_info->u.hvm.boot), NULL); } - if (libxl_defbool_val(b_info->u.hvm.usb) || b_info->u.hvm.usbdevice) { + if (libxl_defbool_val(b_info->u.hvm.usb) + || b_info->u.hvm.usbdevice + || b_info->u.hvm.usbdevice_list) { + if ( b_info->u.hvm.usbdevice && b_info->u.hvm.usbdevice_list ) + { + LOG(ERROR, "%s: Both usbdevice and usbdevice_list set", + __func__); + return NULL; + } flexarray_append(dm_args, "-usb"); if (b_info->u.hvm.usbdevice) { flexarray_vappend(dm_args, "-usbdevice", b_info->u.hvm.usbdevice, NULL); + } else if (b_info->u.hvm.usbdevice_list) { + char **p; + for (p = b_info->u.hvm.usbdevice_list; + *p; + p++) { + flexarray_vappend(dm_args, + "-usbdevice", + *p, NULL); + } } } if (b_info->u.hvm.soundhw) { @@ -468,8 +520,8 @@ nr_set_cpus = libxl_bitmap_count_set(&b_info->avail_vcpus); flexarray_append(dm_args, libxl__sprintf(gc, "%d,maxcpus=%d", - b_info->max_vcpus, - nr_set_cpus)); + nr_set_cpus, + b_info->max_vcpus)); } else flexarray_append(dm_args, libxl__sprintf(gc, "%d", b_info->max_vcpus)); @@ -555,11 +607,12 @@ if (disks[i].is_cdrom) { if (disks[i].format == LIBXL_DISK_FORMAT_EMPTY) drive = libxl__sprintf - (gc, "if=ide,index=%d,media=cdrom,cache=writeback", disk); + (gc, "if=ide,index=%d,media=cdrom,cache=writeback,id=ide-%i", + disk, dev_number); else drive = libxl__sprintf - (gc, "file=%s,if=ide,index=%d,media=cdrom,format=%s,cache=writeback", - disks[i].pdev_path, disk, format); + (gc, "file=%s,if=ide,index=%d,media=cdrom,format=%s,cache=writeback,id=ide-%i", + disks[i].pdev_path, disk, format, dev_number); } else { if (disks[i].format == LIBXL_DISK_FORMAT_EMPTY) { LIBXL__LOG(ctx, LIBXL__LOG_WARNING, "cannot support" @@ -843,7 +896,7 @@ "setting target domain %d -> %d", dm_domid, guest_domid); ret = ERROR_FAIL; - goto out_free; + goto out; } xs_set_target(ctx->xsh, dm_domid, guest_domid); @@ -867,11 +920,8 @@ libxl__add_disks(egc, ao, dm_domid, dm_config, &sdss->multidev); libxl__multidev_prepared(egc, &sdss->multidev, 0); - free(args); return; -out_free: - free(args); out: assert(ret); spawn_stubdom_pvqemu_cb(egc, &sdss->pvqemu, ret); @@ -1104,6 +1154,14 @@ libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "%s/hvmloader/bios", path), "%s", libxl_bios_type_to_string(b_info->u.hvm.bios)); + /* Disable relocating memory to make the MMIO hole larger + * unless we're running qemu-traditional */ + libxl__xs_write(gc, XBT_NULL, + libxl__sprintf(gc, + "%s/hvmloader/allow-memory-relocate", + path), + "%d", + b_info->device_model_version==LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL); free(path); } @@ -1171,7 +1229,6 @@ out_close: close(null); close(logfile_w); - free(args); out: if (rc) device_model_spawn_outcome(egc, dmss, rc); @@ -1229,8 +1286,6 @@ } } - rc = 0; - out: dmss->callback(egc, dmss, rc); } diff -Nru xen-4.2.2/tools/libxl/libxl_dom.c xen-4.3.0/tools/libxl/libxl_dom.c --- xen-4.2.2/tools/libxl/libxl_dom.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_dom.c 2013-07-09 10:46:56.000000000 +0000 @@ -22,6 +22,7 @@ #include #include +#include libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid) { @@ -31,8 +32,7 @@ ret = xc_domain_getinfolist(ctx->xch, domid, 1, &info); if (ret != 1 || info.domain != domid) { - LIBXL__LOG(CTX, LIBXL__LOG_ERROR, - "unable to get domain type for domid=%"PRIu32, domid); + LOG(ERROR, "unable to get domain type for domid=%"PRIu32, domid); return LIBXL_DOMAIN_TYPE_INVALID; } if (info.flags & XEN_DOMINF_hvm_guest) @@ -134,13 +134,13 @@ { int found; libxl__numa_candidate candidate; - libxl_bitmap candidate_nodemap; + libxl_bitmap cpupool_nodemap; libxl_cpupoolinfo cpupool_info; int i, cpupool, rc = 0; uint32_t memkb; libxl__numa_candidate_init(&candidate); - libxl_bitmap_init(&candidate_nodemap); + libxl_bitmap_init(&cpupool_nodemap); /* * Extract the cpumap from the cpupool the domain belong to. In fact, @@ -157,7 +157,7 @@ rc = libxl_domain_need_memory(CTX, info, &memkb); if (rc) goto out; - if (libxl_node_bitmap_alloc(CTX, &candidate_nodemap, 0)) { + if (libxl_node_bitmap_alloc(CTX, &cpupool_nodemap, 0)) { rc = ERROR_FAIL; goto out; } @@ -175,17 +175,19 @@ if (found == 0) goto out; - /* Map the candidate's node map to the domain's info->cpumap */ - libxl__numa_candidate_get_nodemap(gc, &candidate, &candidate_nodemap); - rc = libxl_nodemap_to_cpumap(CTX, &candidate_nodemap, &info->cpumap); + /* Map the candidate's node map to the domain's info->nodemap */ + libxl__numa_candidate_get_nodemap(gc, &candidate, &info->nodemap); + + /* Avoid trying to set the affinity to nodes that might be in the + * candidate's nodemap but out of our cpupool. */ + rc = libxl_cpumap_to_nodemap(CTX, &cpupool_info.cpumap, + &cpupool_nodemap); if (rc) goto out; - /* Avoid trying to set the affinity to cpus that might be in the - * nodemap but not in our cpupool. */ - libxl_for_each_set_bit(i, info->cpumap) { - if (!libxl_bitmap_test(&cpupool_info.cpumap, i)) - libxl_bitmap_reset(&info->cpumap, i); + libxl_for_each_set_bit(i, info->nodemap) { + if (!libxl_bitmap_test(&cpupool_nodemap, i)) + libxl_bitmap_reset(&info->nodemap, i); } LOG(DETAIL, "NUMA placement candidate with %d nodes, %d cpus and " @@ -194,7 +196,7 @@ out: libxl__numa_candidate_dispose(&candidate); - libxl_bitmap_dispose(&candidate_nodemap); + libxl_bitmap_dispose(&cpupool_nodemap); libxl_cpupoolinfo_dispose(&cpupool_info); return rc; } @@ -204,9 +206,7 @@ { libxl_domain_build_info *const info = &d_config->b_info; libxl_ctx *ctx = libxl__gc_owner(gc); - int tsc_mode; char *xs_domid, *con_domid; - uint32_t rtc_timeoffset; int rc; xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus); @@ -214,10 +214,10 @@ /* * Check if the domain has any CPU affinity. If not, try to build * up one. In case numa_place_domain() find at least a suitable - * candidate, it will affect info->cpumap accordingly; if it + * candidate, it will affect info->nodemap accordingly; if it * does not, it just leaves it as it is. This means (unless * some weird error manifests) the subsequent call to - * libxl_set_vcpuaffinity_all() will do the actual placement, + * libxl_domain_set_nodeaffinity() will do the actual placement, * whatever that turns out to be. */ if (libxl_defbool_val(info->numa_placement)) { @@ -232,52 +232,10 @@ if (rc) return rc; } + libxl_domain_set_nodeaffinity(ctx, domid, &info->nodemap); libxl_set_vcpuaffinity_all(ctx, domid, info->max_vcpus, &info->cpumap); xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT); - if (info->type == LIBXL_DOMAIN_TYPE_PV) - xc_domain_set_memmap_limit(ctx->xch, domid, - (info->max_memkb + info->u.pv.slack_memkb)); - switch (info->tsc_mode) { - case LIBXL_TSC_MODE_DEFAULT: - tsc_mode = 0; - break; - case LIBXL_TSC_MODE_ALWAYS_EMULATE: - tsc_mode = 1; - break; - case LIBXL_TSC_MODE_NATIVE: - tsc_mode = 2; - break; - case LIBXL_TSC_MODE_NATIVE_PARAVIRT: - tsc_mode = 3; - break; - default: - abort(); - } - xc_domain_set_tsc_info(ctx->xch, domid, tsc_mode, 0, 0, 0); - if (libxl_defbool_val(info->disable_migrate)) - xc_domain_disable_migrate(ctx->xch, domid); - - rtc_timeoffset = info->rtc_timeoffset; - if (libxl_defbool_val(info->localtime)) { - time_t t; - struct tm *tm; - - t = time(NULL); - tm = localtime(&t); - - rtc_timeoffset += tm->tm_gmtoff; - } - - if (rtc_timeoffset) - xc_domain_set_time_offset(ctx->xch, domid, rtc_timeoffset); - - if (info->type == LIBXL_DOMAIN_TYPE_HVM) { - unsigned long shadow; - shadow = (info->shadow_memkb + 1023) / 1024; - xc_shadow_control(ctx->xch, domid, XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, NULL, 0, &shadow, 0, NULL); - } - xs_domid = xs_read(ctx->xsh, XBT_NULL, "/tool/xenstored/domid", NULL); state->store_domid = xs_domid ? atoi(xs_domid) : 0; free(xs_domid); @@ -316,20 +274,19 @@ ents = libxl__calloc(gc, 12 + (info->max_vcpus * 2) + 2, sizeof(char *)); ents[0] = "memory/static-max"; - ents[1] = libxl__sprintf(gc, "%"PRId64, info->max_memkb); + ents[1] = GCSPRINTF("%"PRId64, info->max_memkb); ents[2] = "memory/target"; - ents[3] = libxl__sprintf(gc, "%"PRId64, - info->target_memkb - info->video_memkb); + ents[3] = GCSPRINTF("%"PRId64, info->target_memkb - info->video_memkb); ents[4] = "memory/videoram"; - ents[5] = libxl__sprintf(gc, "%"PRId64, info->video_memkb); + ents[5] = GCSPRINTF("%"PRId64, info->video_memkb); ents[6] = "domid"; - ents[7] = libxl__sprintf(gc, "%d", domid); + ents[7] = GCSPRINTF("%d", domid); ents[8] = "store/port"; - ents[9] = libxl__sprintf(gc, "%"PRIu32, state->store_port); + ents[9] = GCSPRINTF("%"PRIu32, state->store_port); ents[10] = "store/ring-ref"; - ents[11] = libxl__sprintf(gc, "%lu", state->store_mfn); + ents[11] = GCSPRINTF("%lu", state->store_mfn); for (i = 0; i < info->max_vcpus; i++) { - ents[12+(i*2)] = libxl__sprintf(gc, "cpu/%d/availability", i); + ents[12+(i*2)] = GCSPRINTF("cpu/%d/availability", i); ents[12+(i*2)+1] = libxl_bitmap_test(&info->avail_vcpus, i) ? "online" : "offline"; } @@ -338,7 +295,7 @@ if (info->type == LIBXL_DOMAIN_TYPE_HVM) { hvm_ents = libxl__calloc(gc, 3, sizeof(char *)); hvm_ents[0] = "hvmloader/generation-id-address"; - hvm_ents[1] = libxl__sprintf(gc, "0x%lx", state->vm_generationid_addr); + hvm_ents[1] = GCSPRINTF("0x%lx", state->vm_generationid_addr); } dom_path = libxl__xs_get_dompath(gc, domid); @@ -346,7 +303,7 @@ return ERROR_FAIL; } - vm_path = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path), NULL); + vm_path = xs_read(ctx->xsh, XBT_NULL, GCSPRINTF("%s/vm", dom_path), NULL); retry_transaction: t = xs_transaction_start(ctx->xsh); @@ -377,7 +334,7 @@ dom = xc_dom_allocate(ctx->xch, state->pv_cmdline, info->u.pv.features); if (!dom) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_allocate failed"); + LOGE(ERROR, "xc_dom_allocate failed"); return ERROR_FAIL; } @@ -387,13 +344,13 @@ state->pv_kernel.data, state->pv_kernel.size); if ( ret != 0) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_kernel_mem failed"); + LOGE(ERROR, "xc_dom_kernel_mem failed"); goto out; } } else { ret = xc_dom_kernel_file(dom, state->pv_kernel.path); if ( ret != 0) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_kernel_file failed"); + LOGE(ERROR, "xc_dom_kernel_file failed"); goto out; } } @@ -401,12 +358,12 @@ if ( state->pv_ramdisk.path && strlen(state->pv_ramdisk.path) ) { if (state->pv_ramdisk.mapped) { if ( (ret = xc_dom_ramdisk_mem(dom, state->pv_ramdisk.data, state->pv_ramdisk.size)) != 0 ) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_ramdisk_mem failed"); + LOGE(ERROR, "xc_dom_ramdisk_mem failed"); goto out; } } else { if ( (ret = xc_dom_ramdisk_file(dom, state->pv_ramdisk.path)) != 0 ) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_ramdisk_file failed"); + LOGE(ERROR, "xc_dom_ramdisk_file failed"); goto out; } } @@ -417,38 +374,44 @@ dom->console_domid = state->console_domid; dom->xenstore_evtchn = state->store_port; dom->xenstore_domid = state->store_domid; + dom->claim_enabled = libxl_defbool_val(info->claim_mode); if ( (ret = xc_dom_boot_xen_init(dom, ctx->xch, domid)) != 0 ) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_boot_xen_init failed"); + LOGE(ERROR, "xc_dom_boot_xen_init failed"); goto out; } if ( (ret = xc_dom_parse_image(dom)) != 0 ) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_parse_image failed"); + LOGE(ERROR, "xc_dom_parse_image failed"); goto out; } if ( (ret = xc_dom_mem_init(dom, info->target_memkb / 1024)) != 0 ) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_mem_init failed"); + LOGE(ERROR, "xc_dom_mem_init failed"); goto out; } if ( (ret = xc_dom_boot_mem_init(dom)) != 0 ) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_boot_mem_init failed"); + LOGE(ERROR, "xc_dom_boot_mem_init failed"); goto out; } if ( (ret = xc_dom_build_image(dom)) != 0 ) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_build_image failed"); + LOGE(ERROR, "xc_dom_build_image failed"); goto out; } if ( (ret = xc_dom_boot_image(dom)) != 0 ) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_boot_image failed"); + LOGE(ERROR, "xc_dom_boot_image failed"); goto out; } if ( (ret = xc_dom_gnttab_init(dom)) != 0 ) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_dom_gnttab_init failed"); + LOGE(ERROR, "xc_dom_gnttab_init failed"); goto out; } - state->console_mfn = xc_dom_p2m_host(dom, dom->console_pfn); - state->store_mfn = xc_dom_p2m_host(dom, dom->xenstore_pfn); + if (xc_dom_feature_translated(dom)) { + state->console_mfn = dom->console_pfn; + state->store_mfn = dom->xenstore_pfn; + } else { + state->console_mfn = xc_dom_p2m_host(dom, dom->console_pfn); + state->store_mfn = xc_dom_p2m_host(dom, dom->xenstore_pfn); + } libxl__file_reference_unmap(&state->pv_kernel); libxl__file_reference_unmap(&state->pv_ramdisk); @@ -462,7 +425,7 @@ static unsigned long timer_mode(const libxl_domain_build_info *info) { const libxl_timer_mode mode = info->u.hvm.timer_mode; - assert(mode != LIBXL_TIMER_MODE_DELAY_FOR_MISSED_TICKS && + assert(mode >= LIBXL_TIMER_MODE_DELAY_FOR_MISSED_TICKS && mode <= LIBXL_TIMER_MODE_ONE_MISSED_TICK_PENDING); return ((unsigned long)mode); } @@ -514,11 +477,61 @@ return 0; } -static const char *libxl__domain_firmware(libxl__gc *gc, - libxl_domain_build_info *info) +static int hvm_build_set_xs_values(libxl__gc *gc, + uint32_t domid, + struct xc_hvm_build_args *args) +{ + char *path = NULL; + int ret = 0; + + if (args->smbios_module.guest_addr_out) { + path = GCSPRINTF("/local/domain/%d/"HVM_XS_SMBIOS_PT_ADDRESS, domid); + + ret = libxl__xs_write(gc, XBT_NULL, path, "0x%"PRIx64, + args->smbios_module.guest_addr_out); + if (ret) + goto err; + + path = GCSPRINTF("/local/domain/%d/"HVM_XS_SMBIOS_PT_LENGTH, domid); + + ret = libxl__xs_write(gc, XBT_NULL, path, "0x%x", + args->smbios_module.length); + if (ret) + goto err; + } + + if (args->acpi_module.guest_addr_out) { + path = GCSPRINTF("/local/domain/%d/"HVM_XS_ACPI_PT_ADDRESS, domid); + + ret = libxl__xs_write(gc, XBT_NULL, path, "0x%"PRIx64, + args->acpi_module.guest_addr_out); + if (ret) + goto err; + + path = GCSPRINTF("/local/domain/%d/"HVM_XS_ACPI_PT_LENGTH, domid); + + ret = libxl__xs_write(gc, XBT_NULL, path, "0x%x", + args->acpi_module.length); + if (ret) + goto err; + } + + return 0; + +err: + LOG(ERROR, "failed to write firmware xenstore value, err: %d", ret); + return ret; +} + +static int libxl__domain_firmware(libxl__gc *gc, + libxl_domain_build_info *info, + struct xc_hvm_build_args *args) { libxl_ctx *ctx = libxl__gc_owner(gc); const char *firmware; + int e, rc = ERROR_FAIL; + int datalen = 0; + void *data; if (info->u.hvm.firmware) firmware = info->u.hvm.firmware; @@ -532,13 +545,52 @@ firmware = "hvmloader"; break; default: - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "invalid device model version %d", - info->device_model_version); - return NULL; + LOG(ERROR, "invalid device model version %d", + info->device_model_version); + return ERROR_FAIL; break; } } - return libxl__abs_path(gc, firmware, libxl__xenfirmwaredir_path()); + args->image_file_name = libxl__abs_path(gc, firmware, + libxl__xenfirmwaredir_path()); + + if (info->u.hvm.smbios_firmware) { + data = NULL; + e = libxl_read_file_contents(ctx, info->u.hvm.smbios_firmware, + &data, &datalen); + if (e) { + LOGEV(ERROR, e, "failed to read SMBIOS firmware file %s", + info->u.hvm.smbios_firmware); + goto out; + } + libxl__ptr_add(gc, data); + if (datalen) { + /* Only accept non-empty files */ + args->smbios_module.data = data; + args->smbios_module.length = (uint32_t)datalen; + } + } + + if (info->u.hvm.acpi_firmware) { + data = NULL; + e = libxl_read_file_contents(ctx, info->u.hvm.acpi_firmware, + &data, &datalen); + if (e) { + LOGEV(ERROR, e, "failed to read ACPI firmware file %s", + info->u.hvm.acpi_firmware); + goto out; + } + libxl__ptr_add(gc, data); + if (datalen) { + /* Only accept non-empty files */ + args->acpi_module.data = data; + args->acpi_module.length = (uint32_t)datalen; + } + } + + return 0; +out: + return rc; } int libxl__build_hvm(libxl__gc *gc, uint32_t domid, @@ -546,30 +598,45 @@ libxl__domain_build_state *state) { libxl_ctx *ctx = libxl__gc_owner(gc); + struct xc_hvm_build_args args = {}; int ret, rc = ERROR_FAIL; - const char *firmware = libxl__domain_firmware(gc, info); - if (!firmware) + memset(&args, 0, sizeof(struct xc_hvm_build_args)); + /* The params from the configuration file are in Mb, which are then + * multiplied by 1 Kb. This was then divided off when calling + * the old xc_hvm_build_target_mem() which then turned them to bytes. + * Do all this in one step here... + */ + args.mem_size = (uint64_t)(info->max_memkb - info->video_memkb) << 10; + args.mem_target = (uint64_t)(info->target_memkb - info->video_memkb) << 10; + args.claim_enabled = libxl_defbool_val(info->claim_mode); + if (libxl__domain_firmware(gc, info, &args)) { + LOG(ERROR, "initializing domain firmware failed"); goto out; - ret = xc_hvm_build_target_mem( - ctx->xch, - domid, - (info->max_memkb - info->video_memkb) / 1024, - (info->target_memkb - info->video_memkb) / 1024, - firmware); + } + + ret = xc_hvm_build(ctx->xch, domid, &args); if (ret) { - LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, ret, "hvm building failed"); + LOGEV(ERROR, ret, "hvm building failed"); goto out; } + ret = hvm_build_set_params(ctx->xch, domid, info, state->store_port, &state->store_mfn, state->console_port, &state->console_mfn, state->store_domid, state->console_domid); if (ret) { - LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, ret, "hvm build set params failed"); + LOGEV(ERROR, ret, "hvm build set params failed"); goto out; } - rc = 0; + + ret = hvm_build_set_xs_values(gc, domid, &args); + if (ret) { + LOG(ERROR, "hvm build set xenstore values failed (ret=%d)", ret); + goto out; + } + + return 0; out: return rc; } @@ -578,8 +645,7 @@ const char *cmd) { char *path = NULL; - path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", - domid); + path = GCSPRINTF("/local/domain/0/device-model/%d/command", domid); return libxl__xs_write(gc, XBT_NULL, path, "%s", cmd); } @@ -596,8 +662,7 @@ static inline char *restore_helper(libxl__gc *gc, uint32_t domid, uint64_t phys_offset, char *node) { - return libxl__sprintf(gc, - "/local/domain/0/device-model/%d/physmap/%"PRIx64"/%s", + return GCSPRINTF("/local/domain/0/device-model/%d/physmap/%"PRIx64"/%s", domid, phys_offset, node); } @@ -607,7 +672,6 @@ libxl__save_helper_state *shs = user; libxl__domain_create_state *dcs = CONTAINER_OF(shs, *dcs, shs); STATE_AO_GC(dcs->ao); - libxl_ctx *ctx = CTX; int i, ret; const uint8_t *ptr = buf; uint32_t count = 0, version = 0; @@ -617,7 +681,7 @@ LOG(DEBUG,"domain=%"PRIu32" toolstack data size=%"PRIu32, domid, size); if (size < sizeof(version) + sizeof(count)) { - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "wrong size"); + LOG(ERROR, "wrong size"); return -1; } @@ -625,16 +689,16 @@ ptr += sizeof(version); if (version != TOOLSTACK_SAVE_VERSION) { - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "wrong version"); + LOG(ERROR, "wrong version"); return -1; } memcpy(&count, ptr, sizeof(count)); ptr += sizeof(count); - + if (size < sizeof(version) + sizeof(count) + count * (sizeof(struct libxl__physmap_info))) { - LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "wrong size"); + LOG(ERROR, "wrong size"); return -1; } @@ -729,7 +793,7 @@ rc = libxl__xs_read_checked(gc, t, lds->ret_path, &got_ret); if (rc) goto out; - if (strcmp(got, got_ret)) { + if (!got_ret || strcmp(got, got_ret)) { LOG(ERROR,"controlling logdirty: qemu was already sent" " command `%s' (xenstore path `%s') but result is `%s'", got, lds->cmd_path, got_ret ? got_ret : ""); @@ -845,7 +909,7 @@ rc = libxl__xs_rm_checked(gc, t, lds->ret_path); if (rc) goto out; - rc = libxl__xs_transaction_commit(gc, &t); + rc = libxl__xs_transaction_commit(gc, &t); if (!rc) break; if (rc<0) goto out; } @@ -883,15 +947,13 @@ int libxl__domain_suspend_device_model(libxl__gc *gc, libxl__domain_suspend_state *dss) { - libxl_ctx *ctx = libxl__gc_owner(gc); int ret = 0; uint32_t const domid = dss->domid; const char *const filename = dss->dm_savefile; switch (libxl__device_model_version_running(gc, domid)) { case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL: { - LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, - "Saving device model state to %s", filename); + LOG(DEBUG, "Saving device model state to %s", filename); libxl__qemu_traditional_cmd(gc, domid, "save"); libxl__wait_for_device_model(gc, domid, "paused", NULL, NULL, NULL); break; @@ -1067,8 +1129,7 @@ static inline char *physmap_path(libxl__gc *gc, uint32_t domid, char *phys_offset, char *node) { - return libxl__sprintf(gc, - "/local/domain/0/device-model/%d/physmap/%s/%s", + return GCSPRINTF("/local/domain/0/device-model/%d/physmap/%s/%s", domid, phys_offset, node); } @@ -1085,7 +1146,7 @@ char **entries = NULL; struct libxl__physmap_info *pi; - entries = libxl__xs_directory(gc, 0, libxl__sprintf(gc, + entries = libxl__xs_directory(gc, 0, GCSPRINTF( "/local/domain/0/device-model/%d/physmap", domid), &num); count = num; @@ -1226,7 +1287,7 @@ char *path; char *addr; - path = libxl__sprintf(gc, "%s/hvmloader/generation-id-address", + path = GCSPRINTF("%s/hvmloader/generation-id-address", libxl__xs_get_dompath(gc, domid)); addr = libxl__xs_read(gc, XBT_NULL, path); @@ -1242,9 +1303,9 @@ abort(); } - dss->xcflags = (live) ? XCFLAGS_LIVE : 0 - | (debug) ? XCFLAGS_DEBUG : 0 - | (dss->hvm) ? XCFLAGS_HVM : 0; + dss->xcflags = (live ? XCFLAGS_LIVE : 0) + | (debug ? XCFLAGS_DEBUG : 0) + | (dss->hvm ? XCFLAGS_HVM : 0); dss->suspend_eventchn = -1; dss->guest_responded = 0; @@ -1317,7 +1378,7 @@ if (type == LIBXL_DOMAIN_TYPE_HVM) { rc = libxl__domain_suspend_device_model(gc, dss); if (rc) goto out; - + libxl__domain_save_device_model(egc, dss, domain_suspend_done); return; } @@ -1440,10 +1501,7 @@ char *libxl__uuid2string(libxl__gc *gc, const libxl_uuid uuid) { - char *s = libxl__sprintf(gc, LIBXL_UUID_FMT, LIBXL_UUID_BYTES(uuid)); - if (!s) - LIBXL__LOG(libxl__gc_owner(gc), LIBXL__LOG_ERROR, "cannot allocate for uuid"); - return s; + return GCSPRINTF(LIBXL_UUID_FMT, LIBXL_UUID_BYTES(uuid)); } static const char *userdata_path(libxl__gc *gc, uint32_t domid, @@ -1451,34 +1509,27 @@ const char *wh) { libxl_ctx *ctx = libxl__gc_owner(gc); - char *path, *uuid_string; + char *uuid_string; libxl_dominfo info; int rc; rc = libxl_domain_info(ctx, &info, domid); if (rc) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unable to find domain info" - " for domain %"PRIu32, domid); + LOGE(ERROR, "unable to find domain info for domain %"PRIu32, domid); return NULL; } - uuid_string = libxl__sprintf(gc, LIBXL_UUID_FMT, LIBXL_UUID_BYTES(info.uuid)); + uuid_string = GCSPRINTF(LIBXL_UUID_FMT, LIBXL_UUID_BYTES(info.uuid)); - path = libxl__sprintf(gc, "/var/lib/xen/" - "userdata-%s.%u.%s.%s", - wh, domid, uuid_string, userdata_userid); - if (!path) - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unable to allocate for" - " userdata path"); - return path; + return GCSPRINTF("/var/lib/xen/userdata-%s.%u.%s.%s", + wh, domid, uuid_string, userdata_userid); } static int userdata_delete(libxl__gc *gc, const char *path) { - libxl_ctx *ctx = libxl__gc_owner(gc); int r; r = unlink(path); if (r) { - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "remove failed for %s", path); + LOGE(ERROR, "remove failed for %s", path); return errno; } return 0; @@ -1486,7 +1537,6 @@ void libxl__userdata_destroyall(libxl__gc *gc, uint32_t domid) { - libxl_ctx *ctx = libxl__gc_owner(gc); const char *pattern; glob_t gl; int r, i; @@ -1502,7 +1552,7 @@ if (r == GLOB_NOMATCH) goto out; if (r) - LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "glob failed for %s", pattern); + LOGE(ERROR, "glob failed for %s", pattern); for (i=0; iwatch_nslots + 1) << 2; int i; libxl__ev_watch_slot *newarray = - realloc(CTX->watch_slots, sizeof(*newarray) * newarraysize); + libxl__realloc(NOGC, + CTX->watch_slots, sizeof(*newarray) * newarraysize); if (!newarray) goto out_nomem; for (i = CTX->watch_nslots; i < newarraysize; i++) LIBXL_SLIST_INSERT_HEAD(&CTX->watch_freeslots, @@ -1412,7 +1413,7 @@ struct pollfd *newarray = (nfds > INT_MAX / sizeof(struct pollfd) / 2) ? 0 : - realloc(poller->fd_polls, sizeof(*newarray) * nfds); + libxl__realloc(NOGC, poller->fd_polls, sizeof(*newarray) * nfds); if (!newarray) { rc = ERROR_NOMEM; goto out; } diff -Nru xen-4.2.2/tools/libxl/libxl_event.h xen-4.3.0/tools/libxl/libxl_event.h --- xen-4.2.2/tools/libxl/libxl_event.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_event.h 2013-07-09 10:46:56.000000000 +0000 @@ -64,7 +64,11 @@ typedef struct libxl_event_hooks { uint64_t event_occurs_mask; - void (*event_occurs)(void *user, const libxl_event *event); + void (*event_occurs)(void *user, +#ifndef LIBXL_HAVE_NONCONST_EVENT_OCCURS_EVENT_ARG + const +#endif + libxl_event *event); void (*disaster)(void *user, libxl_event_type type, const char *msg, int errnoval); } libxl_event_hooks; diff -Nru xen-4.2.2/tools/libxl/libxl_exec.c xen-4.3.0/tools/libxl/libxl_exec.c --- xen-4.2.2/tools/libxl/libxl_exec.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_exec.c 2013-07-09 10:46:56.000000000 +0000 @@ -35,7 +35,7 @@ #ifdef __linux__ size_t len; char path[PATH_MAX]; - char link[PATH_MAX+1]; + char linkpath[PATH_MAX+1]; #endif flags = fcntl(i, F_GETFD); if ( flags == -1 ) { @@ -52,11 +52,11 @@ #ifdef __linux__ snprintf(path, PATH_MAX, "/proc/%d/fd/%d", getpid(), i); - len = readlink(path, link, PATH_MAX); + len = readlink(path, linkpath, PATH_MAX); if (len > 0) { - link[len] = '\0'; + linkpath[len] = '\0'; fprintf(stderr, "libxl: execing %s: fd %d is open to %s with flags %#x\n", - what, i, link, flags); + what, i, linkpath, flags); } else #endif fprintf(stderr, "libxl: execing %s: fd %d is open with flags %#x\n", diff -Nru xen-4.2.2/tools/libxl/libxl_internal.c xen-4.3.0/tools/libxl/libxl_internal.c --- xen-4.2.2/tools/libxl/libxl_internal.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_internal.c 2013-07-09 10:46:56.000000000 +0000 @@ -30,16 +30,11 @@ #undef L } -static int gc_is_real(const libxl__gc *gc) -{ - return gc->alloc_maxsize >= 0; -} - void libxl__ptr_add(libxl__gc *gc, void *ptr) { int i; - if (!gc_is_real(gc)) + if (!libxl__gc_is_real(gc)) return; if (!ptr) @@ -71,7 +66,7 @@ void *ptr; int i; - assert(gc_is_real(gc)); + assert(libxl__gc_is_real(gc)); for (i = 0; i < gc->alloc_maxsize; i++) { ptr = gc->alloc_ptrs[i]; @@ -111,7 +106,7 @@ if (ptr == NULL) { libxl__ptr_add(gc, new_ptr); - } else if (new_ptr != ptr && gc_is_real(gc)) { + } else if (new_ptr != ptr && libxl__gc_is_real(gc)) { for (i = 0; i < gc->alloc_maxsize; i++) { if (gc->alloc_ptrs[i] == ptr) { gc->alloc_ptrs[i] = new_ptr; diff -Nru xen-4.2.2/tools/libxl/libxl_internal.h xen-4.3.0/tools/libxl/libxl_internal.h --- xen-4.2.2/tools/libxl/libxl_internal.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_internal.h 2013-07-09 10:46:56.000000000 +0000 @@ -377,8 +377,6 @@ #define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f) #define PCI_FUNC(devfn) ((devfn) & 0x07) #define AUTO_PHP_SLOT 0x100 -#define SYSFS_PCI_DEV "/sys/bus/pci/devices" -#define SYSFS_PCIBACK_DRIVER "/sys/bus/pci/drivers/pciback" #define XENSTORE_PID_FILE "/var/run/xenstored.pid" #define PROC_PCI_NUM_RESOURCES 7 @@ -450,6 +448,11 @@ return gc->owner; } +static inline int libxl__gc_is_real(const libxl__gc *gc) +{ + return gc->alloc_maxsize >= 0; +} + /* * Memory allocation tracking/helpers * @@ -516,6 +519,11 @@ /* treats kvs as pairs of keys and values and writes each to dir. */ _hidden int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t, const char *dir, char **kvs); +/* as writev but also sets the permissions on each path */ +_hidden int libxl__xs_writev_perms(libxl__gc *gc, xs_transaction_t t, + const char *dir, char *kvs[], + struct xs_permissions *perms, + unsigned int num_perms); /* _atonce creates a transaction and writes all keys at once */ _hidden int libxl__xs_writev_atonce(libxl__gc *gc, const char *dir, char **kvs); @@ -930,7 +938,7 @@ libxl__domain_build_state *state); _hidden int libxl__device_generic_add(libxl__gc *gc, xs_transaction_t t, - libxl__device *device, char **bents, char **fents); + libxl__device *device, char **bents, char **fents, char **ro_fents); _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device); _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device); _hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path, @@ -960,6 +968,7 @@ libxl_device_disk *disk); _hidden int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic, uint32_t domid); +_hidden int libxl__device_vtpm_setdefault(libxl__gc *gc, libxl_device_vtpm *vtpm); _hidden int libxl__device_vfb_setdefault(libxl__gc *gc, libxl_device_vfb *vfb); _hidden int libxl__device_vkb_setdefault(libxl__gc *gc, libxl_device_vkb *vkb); _hidden int libxl__device_pci_setdefault(libxl__gc *gc, libxl_device_pci *pci); @@ -1042,7 +1051,7 @@ * type of file using the PHY backend * st_mode: mode_t of the file, as returned by stat function * - * Returns 0 on success, and < 0 on error. + * Returns 1 on success, and 0 if not suitable for phy backend. */ _hidden int libxl__try_phy_backend(mode_t st_mode); @@ -1407,6 +1416,9 @@ _hidden int libxl__qmp_save(libxl__gc *gc, int domid, const char *filename); /* Set dirty bitmap logging status */ _hidden int libxl__qmp_set_global_dirty_log(libxl__gc *gc, int domid, bool enable); +_hidden int libxl__qmp_insert_cdrom(libxl__gc *gc, int domid, const libxl_device_disk *disk); +/* Add a virtual CPU */ +_hidden int libxl__qmp_cpu_add(libxl__gc *gc, int domid, int index); /* close and free the QMP handler */ _hidden void libxl__qmp_close(libxl__qmp_handler *qmp); /* remove the socket file, if the file has already been removed, @@ -1557,6 +1569,8 @@ /* Based on /local/domain/$domid/dm-version xenstore key * default is qemu xen traditional */ _hidden int libxl__device_model_version_running(libxl__gc *gc, uint32_t domid); + /* Return the system-wide default device model */ +_hidden libxl_device_model_version libxl__default_device_model(libxl__gc *gc); /* Check how executes hotplug script currently */ int libxl__hotplug_settings(libxl__gc *gc, xs_transaction_t t); @@ -1829,12 +1843,6 @@ /*----- device addition/removal -----*/ -/* Action to perform (either connect or disconnect) */ -typedef enum { - DEVICE_CONNECT, - DEVICE_DISCONNECT -} libxl__device_action; - typedef struct libxl__ao_device libxl__ao_device; typedef struct libxl__multidev libxl__multidev; typedef void libxl__device_callback(libxl__egc*, libxl__ao_device*); @@ -2008,6 +2016,10 @@ libxl_device_nic *nic, libxl__ao_device *aodev); +_hidden void libxl__device_vtpm_add(libxl__egc *egc, uint32_t domid, + libxl_device_vtpm *vtpm, + libxl__ao_device *aodev); + /* Internal function to connect a vkb device */ _hidden int libxl__device_vkb_add(libxl__gc *gc, uint32_t domid, libxl_device_vkb *vkb); @@ -2440,6 +2452,10 @@ libxl_domain_config *d_config, libxl__multidev *multidev); +_hidden void libxl__add_vtpms(libxl__egc *egc, libxl__ao *ao, uint32_t domid, + libxl_domain_config *d_config, + libxl__multidev *multidev); + /*----- device model creation -----*/ /* First layer; wraps libxl__spawn_spawn. */ diff -Nru xen-4.2.2/tools/libxl/libxl_json.c xen-4.3.0/tools/libxl/libxl_json.c --- xen-4.2.2/tools/libxl/libxl_json.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_json.c 2013-07-09 10:46:56.000000000 +0000 @@ -210,23 +210,12 @@ { libxl__json_object *obj; - obj = calloc(1, sizeof (libxl__json_object)); - if (obj == NULL) { - LIBXL__LOG_ERRNO(libxl__gc_owner(gc), LIBXL__LOG_ERROR, - "Failed to allocate a libxl__json_object"); - return NULL; - } + obj = libxl__zalloc(gc, sizeof(*obj)); obj->type = type; if (type == JSON_MAP || type == JSON_ARRAY) { - flexarray_t *array = flexarray_make(1, 1); - if (array == NULL) { - LIBXL__LOG_ERRNO(libxl__gc_owner(gc), LIBXL__LOG_ERROR, - "Failed to allocate a flexarray"); - free(obj); - return NULL; - } + flexarray_t *array = flexarray_make(gc, 1, 1); if (type == JSON_MAP) obj->u.map = array; else @@ -256,11 +245,7 @@ break; } case JSON_ARRAY: - if (flexarray_append(dst->u.array, obj) == 2) { - LIBXL__LOG_ERRNO(libxl__gc_owner(gc), LIBXL__LOG_ERROR, - "Failed to grow a flexarray"); - return -1; - } + flexarray_append(dst->u.array, obj); break; default: LIBXL__LOG(libxl__gc_owner(gc), LIBXL__LOG_ERROR, @@ -275,7 +260,7 @@ void libxl__json_object_free(libxl__gc *gc, libxl__json_object *obj) { - int index = 0; + int idx = 0; if (obj == NULL) return; @@ -287,8 +272,8 @@ case JSON_MAP: { libxl__json_map_node *node = NULL; - for (index = 0; index < obj->u.map->count; index++) { - if (flexarray_get(obj->u.map, index, (void**)&node) != 0) + for (idx = 0; idx < obj->u.map->count; idx++) { + if (flexarray_get(obj->u.map, idx, (void**)&node) != 0) break; libxl__json_object_free(gc, node->obj); free(node->map_key); @@ -302,8 +287,8 @@ libxl__json_object *node = NULL; break; - for (index = 0; index < obj->u.array->count; index++) { - if (flexarray_get(obj->u.array, index, (void**)&node) != 0) + for (idx = 0; idx < obj->u.array->count; idx++) { + if (flexarray_get(obj->u.array, idx, (void**)&node) != 0) break; libxl__json_object_free(gc, node); node = NULL; @@ -359,14 +344,14 @@ libxl__json_node_type expected_type) { flexarray_t *maps = NULL; - int index = 0; + int idx = 0; if (libxl__json_object_is_map(o)) { libxl__json_map_node *node = NULL; maps = o->u.map; - for (index = 0; index < maps->count; index++) { - if (flexarray_get(maps, index, (void**)&node) != 0) + for (idx = 0; idx < maps->count; idx++) { + if (flexarray_get(maps, idx, (void**)&node) != 0) return NULL; if (strcmp(key, node->map_key) == 0) { if (expected_type == JSON_ANY @@ -454,11 +439,9 @@ DEBUG_GEN(ctx, null); - if ((obj = libxl__json_object_alloc(ctx->gc, JSON_NULL)) == NULL) - return 0; + obj = libxl__json_object_alloc(ctx->gc, JSON_NULL); if (libxl__json_object_append_to(ctx->gc, obj, ctx->current) == -1) { - libxl__json_object_free(ctx->gc, obj); return 0; } @@ -472,11 +455,10 @@ DEBUG_GEN_VALUE(ctx, bool, boolean); - if ((obj = libxl__json_object_alloc(ctx->gc, JSON_BOOL)) == NULL) - return 0; + obj = libxl__json_object_alloc(ctx->gc, JSON_BOOL); + obj->u.b = boolean; if (libxl__json_object_append_to(ctx->gc, obj, ctx->current) == -1) { - libxl__json_object_free(ctx->gc, obj); return 0; } @@ -508,8 +490,7 @@ goto error; } - if ((obj = libxl__json_object_alloc(ctx->gc, JSON_DOUBLE)) == NULL) - return 0; + obj = libxl__json_object_alloc(ctx->gc, JSON_DOUBLE); obj->u.d = d; } else { long long i = strtoll(s, NULL, 10); @@ -518,23 +499,16 @@ goto error; } - if ((obj = libxl__json_object_alloc(ctx->gc, JSON_INTEGER)) == NULL) - return 0; + obj = libxl__json_object_alloc(ctx->gc, JSON_INTEGER); obj->u.i = i; } goto out; error: /* If the conversion fail, we just store the original string. */ - if ((obj = libxl__json_object_alloc(ctx->gc, JSON_NUMBER)) == NULL) - return 0; + obj = libxl__json_object_alloc(ctx->gc, JSON_NUMBER); - t = malloc(len + 1); - if (t == NULL) { - LIBXL__LOG_ERRNO(libxl__gc_owner(ctx->gc), LIBXL__LOG_ERROR, - "Failed to allocate"); - return 0; - } + t = libxl__zalloc(ctx->gc, len + 1); strncpy(t, s, len); t[len] = 0; @@ -542,7 +516,6 @@ out: if (libxl__json_object_append_to(ctx->gc, obj, ctx->current) == -1) { - libxl__json_object_free(ctx->gc, obj); return 0; } @@ -556,26 +529,17 @@ char *t = NULL; libxl__json_object *obj = NULL; - t = malloc(len + 1); - if (t == NULL) { - LIBXL__LOG_ERRNO(libxl__gc_owner(ctx->gc), LIBXL__LOG_ERROR, - "Failed to allocate"); - return 0; - } + t = libxl__zalloc(ctx->gc, len + 1); DEBUG_GEN_STRING(ctx, str, len); strncpy(t, (const char *) str, len); t[len] = 0; - if ((obj = libxl__json_object_alloc(ctx->gc, JSON_STRING)) == NULL) { - free(t); - return 0; - } + obj = libxl__json_object_alloc(ctx->gc, JSON_STRING); obj->u.string = t; if (libxl__json_object_append_to(ctx->gc, obj, ctx->current) == -1) { - libxl__json_object_free(ctx->gc, obj); return 0; } @@ -588,13 +552,9 @@ libxl__yajl_ctx *ctx = opaque; char *t = NULL; libxl__json_object *obj = ctx->current; + libxl__gc *gc = ctx->gc; - t = malloc(len + 1); - if (t == NULL) { - LIBXL__LOG_ERRNO(libxl__gc_owner(ctx->gc), LIBXL__LOG_ERROR, - "Failed to allocate"); - return 0; - } + t = libxl__zalloc(gc, len + 1); DEBUG_GEN_STRING(ctx, str, len); @@ -602,21 +562,13 @@ t[len] = 0; if (libxl__json_object_is_map(obj)) { - libxl__json_map_node *node = malloc(sizeof (libxl__json_map_node)); - if (node == NULL) { - LIBXL__LOG_ERRNO(libxl__gc_owner(ctx->gc), LIBXL__LOG_ERROR, - "Failed to allocate"); - return 0; - } + libxl__json_map_node *node; + GCNEW(node); node->map_key = t; node->obj = NULL; - if (flexarray_append(obj->u.map, node) == 2) { - LIBXL__LOG_ERRNO(libxl__gc_owner(ctx->gc), LIBXL__LOG_ERROR, - "Failed to grow a flexarray"); - return 0; - } + flexarray_append(obj->u.map, node); } else { LIBXL__LOG(libxl__gc_owner(ctx->gc), LIBXL__LOG_ERROR, "Current json object is not a map"); @@ -633,12 +585,10 @@ DEBUG_GEN(ctx, map_open); - if ((obj = libxl__json_object_alloc(ctx->gc, JSON_MAP)) == NULL) - return 0; + obj = libxl__json_object_alloc(ctx->gc, JSON_MAP); if (ctx->current) { if (libxl__json_object_append_to(ctx->gc, obj, ctx->current) == -1) { - libxl__json_object_free(ctx->gc, obj); return 0; } } @@ -675,12 +625,10 @@ DEBUG_GEN(ctx, array_open); - if ((obj = libxl__json_object_alloc(ctx->gc, JSON_ARRAY)) == NULL) - return 0; + obj = libxl__json_object_alloc(ctx->gc, JSON_ARRAY); if (ctx->current) { if (libxl__json_object_append_to(ctx->gc, obj, ctx->current) == -1) { - libxl__json_object_free(ctx->gc, obj); return 0; } } @@ -770,8 +718,6 @@ LIBXL__LOG(libxl__gc_owner(gc), LIBXL__LOG_ERROR, "yajl error: %s", str); yajl_free_error(yajl_ctx.hand, str); - - libxl__json_object_free(gc, yajl_ctx.head); yajl_ctx_free(&yajl_ctx); return NULL; } @@ -840,158 +786,6 @@ return ret; } -yajl_gen_status libxl_domain_config_gen_json(yajl_gen hand, - libxl_domain_config *p) -{ - yajl_gen_status s; - int i; - - s = yajl_gen_map_open(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"c_info", - sizeof("c_info")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_domain_create_info_gen_json(hand, &p->c_info); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"b_info", - sizeof("b_info")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_domain_build_info_gen_json(hand, &p->b_info); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"disks", - sizeof("disks")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_disks; i++) { - s = libxl_device_disk_gen_json(hand, &p->disks[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"nics", - sizeof("nics")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_nics; i++) { - s = libxl_device_nic_gen_json(hand, &p->nics[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"pcidevs", - sizeof("pcidevs")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_pcidevs; i++) { - s = libxl_device_pci_gen_json(hand, &p->pcidevs[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"vfbs", - sizeof("vfbs")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_vfbs; i++) { - s = libxl_device_vfb_gen_json(hand, &p->vfbs[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"vkbs", - sizeof("vkbs")-1); - if (s != yajl_gen_status_ok) - goto out; - s = yajl_gen_array_open(hand); - if (s != yajl_gen_status_ok) - goto out; - for (i = 0; i < p->num_vkbs; i++) { - s = libxl_device_vkb_gen_json(hand, &p->vkbs[i]); - if (s != yajl_gen_status_ok) - goto out; - } - s = yajl_gen_array_close(hand); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"on_poweroff", - sizeof("on_poweroff")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_action_on_shutdown_gen_json(hand, &p->on_poweroff); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"on_reboot", - sizeof("on_reboot")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_action_on_shutdown_gen_json(hand, &p->on_reboot); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"on_watchdog", - sizeof("on_watchdog")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_action_on_shutdown_gen_json(hand, &p->on_watchdog); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_string(hand, (const unsigned char *)"on_crash", - sizeof("on_crash")-1); - if (s != yajl_gen_status_ok) - goto out; - s = libxl_action_on_shutdown_gen_json(hand, &p->on_crash); - if (s != yajl_gen_status_ok) - goto out; - - s = yajl_gen_map_close(hand); - if (s != yajl_gen_status_ok) - goto out; - out: - return s; -} - -char *libxl_domain_config_to_json(libxl_ctx *ctx, libxl_domain_config *p) -{ - return libxl__object_to_json(ctx, "libxl_domain_config", - (libxl__gen_json_callback)&libxl_domain_config_gen_json, - (void *)p); -} - /* * Local variables: * mode: C diff -Nru xen-4.2.2/tools/libxl/libxl_json.h xen-4.3.0/tools/libxl/libxl_json.h --- xen-4.2.2/tools/libxl/libxl_json.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_json.h 2013-07-09 10:46:56.000000000 +0000 @@ -54,7 +54,11 @@ static inline yajl_gen libxl_yajl_gen_alloc(const yajl_alloc_funcs *allocFuncs) { - return yajl_gen_alloc(allocFuncs); + yajl_gen g; + g = yajl_gen_alloc(allocFuncs); + if (g) + yajl_gen_config(g, yajl_gen_beautify, 1); + return g; } #else /* !HAVE_YAJL_V2 */ diff -Nru xen-4.2.2/tools/libxl/libxl_linux.c xen-4.3.0/tools/libxl/libxl_linux.c --- xen-4.2.2/tools/libxl/libxl_linux.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_linux.c 2013-07-09 10:46:56.000000000 +0000 @@ -84,11 +84,16 @@ char *script, libxl__device *dev) { const char *type = libxl__device_kind_to_string(dev->backend_kind); + char *be_path = libxl__device_backend_path(gc, dev); char **env; + char *gatewaydev; int nr = 0; libxl_nic_type nictype; - const int arraysize = 13; + gatewaydev = libxl__xs_read(gc, XBT_NULL, GCSPRINTF("%s/%s", be_path, + "gatewaydev")); + + const int arraysize = 15; GCNEW_ARRAY(env, arraysize); env[nr++] = "script"; env[nr++] = script; @@ -98,6 +103,8 @@ env[nr++] = GCSPRINTF("backend/%s/%u/%d", type, dev->domid, dev->devid); env[nr++] = "XENBUS_BASE_PATH"; env[nr++] = "backend"; + env[nr++] = "netdev"; + env[nr++] = gatewaydev ? : ""; if (dev->backend_kind == LIBXL__DEVICE_KIND_VIF) { if (libxl__nic_type(gc, dev, &nictype)) { LOG(ERROR, "unable to get nictype"); @@ -173,11 +180,12 @@ (*args)[nr++] = script; if (nictype == LIBXL_NIC_TYPE_VIF_IOEMU && num_exec) { - (*args)[nr++] = action == DEVICE_CONNECT ? "add" : "remove"; + (*args)[nr++] = (char *) libxl__device_action_to_string(action); (*args)[nr++] = "type_if=tap"; (*args)[nr++] = NULL; } else { - (*args)[nr++] = action == DEVICE_CONNECT ? "online" : "offline"; + (*args)[nr++] = action == LIBXL__DEVICE_ACTION_ADD ? "online" : + "offline"; (*args)[nr++] = "type_if=vif"; (*args)[nr++] = NULL; } @@ -213,7 +221,7 @@ const int arraysize = 3; GCNEW_ARRAY(*args, arraysize); (*args)[nr++] = script; - (*args)[nr++] = action == DEVICE_CONNECT ? "add" : "remove"; + (*args)[nr++] = (char *) libxl__device_action_to_string(action); (*args)[nr++] = NULL; assert(nr == arraysize); @@ -266,3 +274,8 @@ out: return rc; } + +libxl_device_model_version libxl__default_device_model(libxl__gc *gc) +{ + return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN; +} diff -Nru xen-4.2.2/tools/libxl/libxl_memory.txt xen-4.3.0/tools/libxl/libxl_memory.txt --- xen-4.2.2/tools/libxl/libxl_memory.txt 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_memory.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -/* === Domain memory breakdown: HVM guests ================================== - - + +----------+ + - | | shadow | | - | +----------+ | - overhead | | extra | | - | | external | | - | +----------+ + | - | | extra | | | - | | internal | | | - + +----------+ + | | footprint - | | video | | | | - | +----------+ + + | | xen | - | | | | | | actual | maximum | - | | | | | | target | | - | | guest | | | build | | | - | | | | | start | | | - static | | | | | | | | - maximum | +----------+ | + + + + - | | | | - | | | | - | | balloon | | build - | | | | maximum - | | | | - + +----------+ + - - - extra internal = LIBXL_MAXMEM_CONSTANT - extra external = LIBXL_HVM_EXTRA_MEMORY - shadow = libxl_domain_build_info.shadow_memkb - static maximum = libxl_domain_build_info.max_memkb - video = libxl_domain_build_info.video_memkb - build start = libxl_domain_build_info.target_memkb - libxl_domain_setmaxmem -> xen maximum - libxl_set_memory_target -> actual target - - - === Domain memory breakdown: PV guests ================================== - - - + +----------+ + - overhead | | extra | | - | | external | | - | +----------+ + | - | | extra | | | - | | internal | | | - + +----------+ + + + | | footprint - | | | | | | | xen | - | | | | | | actual | maximum | - | | guest | | | build | target | | - | | | | | start | | | - static | | | | | | | | - maximum | +----------+ | + + + + - | | | | - | | | | - | | balloon | | build - | | | | maximum - | | | | - + +----------+ + - - - extra internal = LIBXL_MAXMEM_CONSTANT - extra external = LIBXL_PV_EXTRA_MEMORY - static maximum = libxl_domain_build_info.max_memkb - build start = libxl_domain_build_info.target_memkb - libxl_domain_setmaxmem -> xen maximum - libxl_set_memory_target -> actual target - - - ========================================================================= */ diff -Nru xen-4.2.2/tools/libxl/libxl_netbsd.c xen-4.3.0/tools/libxl/libxl_netbsd.c --- xen-4.2.2/tools/libxl/libxl_netbsd.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_netbsd.c 2013-07-09 10:46:56.000000000 +0000 @@ -50,7 +50,7 @@ GCNEW_ARRAY(*args, arraysize); (*args)[nr++] = script; (*args)[nr++] = be_path; - (*args)[nr++] = GCSPRINTF("%d", action == DEVICE_CONNECT ? + (*args)[nr++] = GCSPRINTF("%d", action == LIBXL__DEVICE_ACTION_ADD ? XenbusStateInitWait : XenbusStateClosed); (*args)[nr++] = NULL; assert(nr == arraysize); @@ -76,10 +76,6 @@ switch (dev->backend_kind) { case LIBXL__DEVICE_KIND_VBD: case LIBXL__DEVICE_KIND_VIF: - if (num_exec != 0) { - rc = 0; - goto out; - } rc = libxl__hotplug(gc, dev, args, action); if (!rc) rc = 1; break; @@ -94,3 +90,8 @@ out: return rc; } + +libxl_device_model_version libxl__default_device_model(libxl__gc *gc) +{ + return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; +} diff -Nru xen-4.2.2/tools/libxl/libxl_numa.c xen-4.3.0/tools/libxl/libxl_numa.c --- xen-4.2.2/tools/libxl/libxl_numa.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_numa.c 2013-07-09 10:46:56.000000000 +0000 @@ -165,22 +165,40 @@ return free_memkb; } -/* Retrieve the number of vcpus able to run on the cpus of the nodes - * that are part of the nodemap. */ -static int nodemap_to_nr_vcpus(libxl__gc *gc, libxl_cputopology *tinfo, +/* Retrieve the number of vcpus able to run on the nodes in nodemap */ +static int nodemap_to_nr_vcpus(libxl__gc *gc, int vcpus_on_node[], const libxl_bitmap *nodemap) { + int i, nr_vcpus = 0; + + libxl_for_each_set_bit(i, *nodemap) + nr_vcpus += vcpus_on_node[i]; + + return nr_vcpus; +} + +/* Number of vcpus able to run on the cpus of the various nodes + * (reported by filling the array vcpus_on_node[]). */ +static int nr_vcpus_on_nodes(libxl__gc *gc, libxl_cputopology *tinfo, + const libxl_bitmap *suitable_cpumap, + int vcpus_on_node[]) +{ libxl_dominfo *dinfo = NULL; - libxl_bitmap vcpu_nodemap; + libxl_bitmap dom_nodemap, nodes_counted; int nr_doms, nr_cpus; - int nr_vcpus = 0; int i, j, k; dinfo = libxl_list_domain(CTX, &nr_doms); if (dinfo == NULL) return ERROR_FAIL; - if (libxl_node_bitmap_alloc(CTX, &vcpu_nodemap, 0) < 0) { + if (libxl_node_bitmap_alloc(CTX, &nodes_counted, 0) < 0) { + libxl_dominfo_list_free(dinfo, nr_doms); + return ERROR_FAIL; + } + + if (libxl_node_bitmap_alloc(CTX, &dom_nodemap, 0) < 0) { + libxl_bitmap_dispose(&nodes_counted); libxl_dominfo_list_free(dinfo, nr_doms); return ERROR_FAIL; } @@ -193,19 +211,24 @@ if (vinfo == NULL) continue; - /* For each vcpu of each domain ... */ - for (j = 0; j < nr_dom_vcpus; j++) { + /* Retrieve the domain's node-affinity map */ + libxl_domain_get_nodeaffinity(CTX, dinfo[i].domid, &dom_nodemap); - /* Build up a map telling on which nodes the vcpu is runnable on */ - libxl_bitmap_set_none(&vcpu_nodemap); - libxl_for_each_set_bit(k, vinfo[j].cpumap) - libxl_bitmap_set(&vcpu_nodemap, tinfo[k].node); - - /* And check if that map has any intersection with our nodemap */ - libxl_for_each_set_bit(k, vcpu_nodemap) { - if (libxl_bitmap_test(nodemap, k)) { - nr_vcpus++; - break; + for (j = 0; j < nr_dom_vcpus; j++) { + /* + * For each vcpu of each domain, it must have both vcpu-affinity + * and node-affinity to (a pcpu belonging to) a certain node to + * cause an increment in the corresponding element of the array. + */ + libxl_bitmap_set_none(&nodes_counted); + libxl_for_each_set_bit(k, vinfo[j].cpumap) { + int node = tinfo[k].node; + + if (libxl_bitmap_test(suitable_cpumap, k) && + libxl_bitmap_test(&dom_nodemap, node) && + !libxl_bitmap_test(&nodes_counted, node)) { + libxl_bitmap_set(&nodes_counted, node); + vcpus_on_node[node]++; } } } @@ -213,9 +236,10 @@ libxl_vcpuinfo_list_free(vinfo, nr_dom_vcpus); } - libxl_bitmap_dispose(&vcpu_nodemap); + libxl_bitmap_dispose(&dom_nodemap); + libxl_bitmap_dispose(&nodes_counted); libxl_dominfo_list_free(dinfo, nr_doms); - return nr_vcpus; + return 0; } /* @@ -270,7 +294,7 @@ libxl_numainfo *ninfo = NULL; int nr_nodes = 0, nr_suit_nodes, nr_cpus = 0; libxl_bitmap suitable_nodemap, nodemap; - int rc = 0; + int *vcpus_on_node, rc = 0; libxl_bitmap_init(&nodemap); libxl_bitmap_init(&suitable_nodemap); @@ -281,6 +305,8 @@ if (ninfo == NULL) return ERROR_FAIL; + GCNEW_ARRAY(vcpus_on_node, nr_nodes); + /* * The good thing about this solution is that it is based on heuristics * (implemented in numa_cmpf() ), but we at least can evaluate it on @@ -330,6 +356,19 @@ goto out; /* + * Later on, we will try to figure out how many vcpus are runnable on + * each candidate (as a part of choosing the best one of them). That + * requires going through all the vcpus of all the domains and check + * their affinities. So, instead of doing that for each candidate, + * let's count here the number of vcpus runnable on each node, so that + * all we have to do later is summing up the right elements of the + * vcpus_on_node array. + */ + rc = nr_vcpus_on_nodes(gc, tinfo, suitable_cpumap, vcpus_on_node); + if (rc) + goto out; + + /* * If the minimum number of NUMA nodes is not explicitly specified * (i.e., min_nodes == 0), we try to figure out a sensible number of nodes * from where to start generating candidates, if possible (or just start @@ -414,7 +453,8 @@ * current best one (if any). */ libxl__numa_candidate_put_nodemap(gc, &new_cndt, &nodemap); - new_cndt.nr_vcpus = nodemap_to_nr_vcpus(gc, tinfo, &nodemap); + new_cndt.nr_vcpus = nodemap_to_nr_vcpus(gc, vcpus_on_node, + &nodemap); new_cndt.free_memkb = nodes_free_memkb; new_cndt.nr_nodes = libxl_bitmap_count_set(&nodemap); new_cndt.nr_cpus = nodes_cpus; diff -Nru xen-4.2.2/tools/libxl/libxl_osdeps.h xen-4.3.0/tools/libxl/libxl_osdeps.h --- xen-4.2.2/tools/libxl/libxl_osdeps.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_osdeps.h 2013-07-09 10:46:56.000000000 +0000 @@ -23,14 +23,27 @@ #define _GNU_SOURCE -#if defined(__NetBSD__) || defined(__OpenBSD__) +#if defined(__NetBSD__) +#define SYSFS_PCI_DEV "/sys/bus/pci/devices" +#define SYSFS_PCIBACK_DRIVER "/kern/xen/pci" +#include +#elif defined(__OpenBSD__) #include #elif defined(__linux__) +#define SYSFS_PCI_DEV "/sys/bus/pci/devices" +#define SYSFS_PCIBACK_DRIVER "/sys/bus/pci/drivers/pciback" #include #elif defined(__sun__) #include #endif +#ifndef SYSFS_PCIBACK_DRIVER +#error define SYSFS_PCIBACK_DRIVER for your platform +#endif +#ifndef SYSFS_PCI_DEV +#error define SYSFS_PCI_DEV for your platform +#endif + #ifdef NEED_OWN_ASPRINTF #include diff -Nru xen-4.2.2/tools/libxl/libxl_pci.c xen-4.3.0/tools/libxl/libxl_pci.c --- xen-4.2.2/tools/libxl/libxl_pci.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_pci.c 2013-07-09 10:46:56.000000000 +0000 @@ -73,12 +73,8 @@ libxl__device device; int ret = ERROR_NOMEM, i; - front = flexarray_make(16, 1); - if (!front) - goto out; - back = flexarray_make(16, 1); - if (!back) - goto out; + front = flexarray_make(gc, 16, 1); + back = flexarray_make(gc, 16, 1); ret = 0; @@ -106,13 +102,9 @@ libxl__device_generic_add(gc, XBT_NULL, &device, libxl__xs_kvs_of_flexarray(gc, back, back->count), - libxl__xs_kvs_of_flexarray(gc, front, front->count)); + libxl__xs_kvs_of_flexarray(gc, front, front->count), + NULL); -out: - if (back) - flexarray_free(back); - if (front) - flexarray_free(front); return 0; } @@ -138,9 +130,7 @@ return ERROR_FAIL; } - back = flexarray_make(16, 1); - if (!back) - return ERROR_NOMEM; + back = flexarray_make(gc, 16, 1); LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Adding new pci device to xenstore"); num = atoi(num_devs); @@ -157,7 +147,6 @@ if (errno == EAGAIN) goto retry_transaction; - flexarray_free(back); return 0; } @@ -167,7 +156,6 @@ char *be_path, *num_devs_path, *num_devs, *xsdev, *tmp, *tmppath; int num, i, j; xs_transaction_t t; - unsigned int domain = 0, bus = 0, dev = 0, func = 0; be_path = libxl__sprintf(gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(gc, 0), domid); num_devs_path = libxl__sprintf(gc, "%s/num_devs", be_path); @@ -188,6 +176,7 @@ } for (i = 0; i < num; i++) { + unsigned int domain = 0, bus = 0, dev = 0, func = 0; xsdev = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/dev-%d", be_path, i)); sscanf(xsdev, PCI_BDF, &domain, &bus, &dev, &func); if (domain == pcidev->domain && bus == pcidev->bus && @@ -1047,6 +1036,18 @@ int num_assigned, i, rc; int stubdomid = 0; + if (libxl__domain_type(gc, domid) == LIBXL_DOMAIN_TYPE_HVM) { + rc = xc_test_assign_device(ctx->xch, domid, pcidev_encode_bdf(pcidev)); + if (rc) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, + "PCI device %04x:%02x:%02x.%u %s?", + pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func, + errno == ENOSYS ? "cannot be assigned - no IOMMU" + : "already assigned to a different guest"); + goto out; + } + } + rc = libxl__device_pci_setdefault(gc, pcidev); if (rc) goto out; diff -Nru xen-4.2.2/tools/libxl/libxl_qmp.c xen-4.3.0/tools/libxl/libxl_qmp.c --- xen-4.2.2/tools/libxl/libxl_qmp.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_qmp.c 2013-07-09 10:46:56.000000000 +0000 @@ -171,7 +171,7 @@ { GC_INIT(qmp->ctx); const libxl__json_object *obj; - const char *listen, *port; + const char *addr, *port; int rc = -1; if (!libxl__json_object_is_map(o)) { @@ -185,17 +185,17 @@ } obj = libxl__json_map_get("host", o, JSON_STRING); - listen = libxl__json_object_get_string(obj); + addr = libxl__json_object_get_string(obj); obj = libxl__json_map_get("service", o, JSON_STRING); port = libxl__json_object_get_string(obj); - if (!listen || !port) { + if (!addr || !port) { LIBXL__LOG(qmp->ctx, LIBXL__LOG_ERROR, "Failed to retreive VNC connect information."); goto out; } - rc = qmp_write_domain_console_item(gc, qmp->domid, "vnc-listen", listen); + rc = qmp_write_domain_console_item(gc, qmp->domid, "vnc-listen", addr); if (!rc) rc = qmp_write_domain_console_item(gc, qmp->domid, "vnc-port", port); @@ -485,7 +485,6 @@ if (o) { rc = qmp_handle_response(qmp, o); - libxl__json_object_free(gc, o); } else { LIBXL__LOG(qmp->ctx, LIBXL__LOG_ERROR, "Parse error of : %s\n", s); @@ -669,6 +668,18 @@ qmp_parameters_common_add(gc, param, name, obj); } +static void qmp_parameters_add_integer(libxl__gc *gc, + libxl__json_object **param, + const char *name, const int i) +{ + libxl__json_object *obj; + + obj = libxl__json_object_alloc(gc, JSON_INTEGER); + obj->u.i = i; + + qmp_parameters_common_add(gc, param, name, obj); +} + #define QMP_PARAMETERS_SPRINTF(args, name, format, ...) \ qmp_parameters_add_string(gc, args, name, \ libxl__sprintf(gc, format, __VA_ARGS__)) @@ -914,6 +925,31 @@ NULL, NULL); } +int libxl__qmp_insert_cdrom(libxl__gc *gc, int domid, + const libxl_device_disk *disk) +{ + libxl__json_object *args = NULL; + int dev_number = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); + + QMP_PARAMETERS_SPRINTF(&args, "device", "ide-%i", dev_number); + + if (disk->format == LIBXL_DISK_FORMAT_EMPTY) { + return qmp_run_command(gc, domid, "eject", args, NULL, NULL); + } else { + qmp_parameters_add_string(gc, &args, "target", disk->pdev_path); + return qmp_run_command(gc, domid, "change", args, NULL, NULL); + } +} + +int libxl__qmp_cpu_add(libxl__gc *gc, int domid, int idx) +{ + libxl__json_object *args = NULL; + + qmp_parameters_add_integer(gc, &args, "id", idx); + + return qmp_run_command(gc, domid, "cpu-add", args, NULL, NULL); +} + int libxl__qmp_initializations(libxl__gc *gc, uint32_t domid, const libxl_domain_config *guest_config) { diff -Nru xen-4.2.2/tools/libxl/libxl_save_callout.c xen-4.3.0/tools/libxl/libxl_save_callout.c --- xen-4.2.2/tools/libxl/libxl_save_callout.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_save_callout.c 2013-07-09 10:46:56.000000000 +0000 @@ -172,7 +172,7 @@ shs->stdout_what = GCSPRINTF("domain %"PRIu32" save/restore helper" " stdout pipe", domid); - *arg++ = getenv("LIBXL_SAVE_HELPER") ?: LIBEXEC "/" "libxl-save-helper"; + *arg++ = getenv("LIBXL_SAVE_HELPER") ?: PRIVATE_BINDIR "/" "libxl-save-helper"; *arg++ = mode_arg; const char **stream_fd_arg = arg++; for (i=0; ibackend_domid = vtpms[i].backend_domid; + vtpm->devid = vtpms[i].devid; + libxl_uuid_copy(&vtpm->uuid, &vtpms[i].uuid); + rc = 0; + break; + } + } + + libxl_device_vtpm_list_free(vtpms, nb); + return rc; +} + int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid, const char *mac, libxl_device_nic *nic) { @@ -808,6 +865,22 @@ free(list); } +void libxl_vtpminfo_list_free(libxl_vtpminfo* list, int nr) +{ + int i; + for (i = 0; i < nr; i++) + libxl_vtpminfo_dispose(&list[i]); + free(list); +} + +void libxl_device_vtpm_list_free(libxl_device_vtpm* list, int nr) +{ + int i; + for (i = 0; i < nr; i++) + libxl_device_vtpm_dispose(&list[i]); + free(list); +} + int libxl_domid_valid_guest(uint32_t domid) { /* returns 1 if the value _could_ be a valid guest domid, 0 otherwise diff -Nru xen-4.2.2/tools/libxl/libxl_utils.h xen-4.3.0/tools/libxl/libxl_utils.h --- xen-4.2.2/tools/libxl/libxl_utils.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_utils.h 2013-07-09 10:46:56.000000000 +0000 @@ -21,9 +21,11 @@ const char *libxl_basename(const char *name); /* returns string from strdup */ unsigned long libxl_get_required_shadow_memory(unsigned long maxmem_kb, unsigned int smp_cpus); int libxl_name_to_domid(libxl_ctx *ctx, const char *name, uint32_t *domid); +int libxl_domain_qualifier_to_domid(libxl_ctx *ctx, const char *name, uint32_t *domid); char *libxl_domid_to_name(libxl_ctx *ctx, uint32_t domid); int libxl_name_to_cpupoolid(libxl_ctx *ctx, const char *name, uint32_t *poolid); char *libxl_cpupoolid_to_name(libxl_ctx *ctx, uint32_t poolid); +int libxl_cpupoolid_is_valid(libxl_ctx *ctx, uint32_t poolid); int libxl_get_stubdom_id(libxl_ctx *ctx, int guest_domid); int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid); int libxl_create_logfile(libxl_ctx *ctx, const char *name, char **full_name); @@ -63,6 +65,11 @@ int libxl_vdev_to_device_disk(libxl_ctx *ctx, uint32_t domid, const char *vdev, libxl_device_disk *disk); +int libxl_uuid_to_device_vtpm(libxl_ctx *ctx, uint32_t domid, + libxl_uuid *uuid, libxl_device_vtpm *vtpm); +int libxl_devid_to_device_vtpm(libxl_ctx *ctx, uint32_t domid, + int devid, libxl_device_vtpm *vtpm); + int libxl_bitmap_alloc(libxl_ctx *ctx, libxl_bitmap *bitmap, int n_bits); /* Allocated bimap is from malloc, libxl_bitmap_dispose() to be * called by the application when done. */ diff -Nru xen-4.2.2/tools/libxl/libxl_x86.c xen-4.3.0/tools/libxl/libxl_x86.c --- xen-4.2.2/tools/libxl/libxl_x86.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_x86.c 2013-07-09 10:46:56.000000000 +0000 @@ -182,7 +182,7 @@ idx++; } /* At this point we have the mapped RAM + E820 entries from src. */ - if (balloon_kb) { + if (balloon_kb || delta_kb) { /* and if we truncated the RAM region, then add it to the end. */ e820[idx].type = E820_RAM; e820[idx].addr = (uint64_t)(1ULL << 32) > last ? @@ -248,6 +248,54 @@ uint32_t domid) { int ret = 0; + int tsc_mode; + uint32_t rtc_timeoffset; + libxl_ctx *ctx = libxl__gc_owner(gc); + + if (d_config->b_info.type == LIBXL_DOMAIN_TYPE_PV) + xc_domain_set_memmap_limit(ctx->xch, domid, + (d_config->b_info.max_memkb + + d_config->b_info.u.pv.slack_memkb)); + + switch (d_config->b_info.tsc_mode) { + case LIBXL_TSC_MODE_DEFAULT: + tsc_mode = 0; + break; + case LIBXL_TSC_MODE_ALWAYS_EMULATE: + tsc_mode = 1; + break; + case LIBXL_TSC_MODE_NATIVE: + tsc_mode = 2; + break; + case LIBXL_TSC_MODE_NATIVE_PARAVIRT: + tsc_mode = 3; + break; + default: + abort(); + } + xc_domain_set_tsc_info(ctx->xch, domid, tsc_mode, 0, 0, 0); + if (libxl_defbool_val(d_config->b_info.disable_migrate)) + xc_domain_disable_migrate(ctx->xch, domid); + rtc_timeoffset = d_config->b_info.rtc_timeoffset; + if (libxl_defbool_val(d_config->b_info.localtime)) { + time_t t; + struct tm *tm; + + t = time(NULL); + tm = localtime(&t); + + rtc_timeoffset += tm->tm_gmtoff; + } + + if (rtc_timeoffset) + xc_domain_set_time_offset(ctx->xch, domid, rtc_timeoffset); + + if (d_config->b_info.type == LIBXL_DOMAIN_TYPE_HVM) { + unsigned long shadow; + shadow = (d_config->b_info.shadow_memkb + 1023) / 1024; + xc_shadow_control(ctx->xch, domid, XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION, NULL, 0, &shadow, 0, NULL); + } + if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV && libxl_defbool_val(d_config->b_info.u.pv.e820_host)) { ret = libxl__e820_alloc(gc, domid, d_config); diff -Nru xen-4.2.2/tools/libxl/libxl_xshelp.c xen-4.3.0/tools/libxl/libxl_xshelp.c --- xen-4.2.2/tools/libxl/libxl_xshelp.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxl_xshelp.c 2013-07-09 10:46:56.000000000 +0000 @@ -41,8 +41,10 @@ return kvs; } -int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t, - const char *dir, char *kvs[]) +int libxl__xs_writev_perms(libxl__gc *gc, xs_transaction_t t, + const char *dir, char *kvs[], + struct xs_permissions *perms, + unsigned int num_perms) { libxl_ctx *ctx = libxl__gc_owner(gc); char *path; @@ -56,11 +58,19 @@ if (path && kvs[i + 1]) { int length = strlen(kvs[i + 1]); xs_write(ctx->xsh, t, path, kvs[i + 1], length); + if (perms) + xs_set_permissions(ctx->xsh, t, path, perms, num_perms); } } return 0; } +int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t, + const char *dir, char *kvs[]) +{ + return libxl__xs_writev_perms(gc, t, dir, kvs, NULL, 0); +} + int libxl__xs_writev_atonce(libxl__gc *gc, const char *dir, char *kvs[]) { diff -Nru xen-4.2.2/tools/libxl/libxlu_cfg_l.c xen-4.3.0/tools/libxl/libxlu_cfg_l.c --- xen-4.2.2/tools/libxl/libxlu_cfg_l.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxlu_cfg_l.c 2013-07-09 10:46:56.000000000 +0000 @@ -393,16 +393,16 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 4, 5, 1, 1, 1, 6, 7, - 7, 1, 7, 8, 7, 7, 1, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 7, 10, 1, - 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 7, 1, 7, 8, 7, 9, 1, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 7, 11, 1, + 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 12, 13, 14, 1, 15, 1, 16, 16, 16, 16, + 13, 14, 15, 1, 16, 1, 17, 17, 17, 17, - 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 16, - 17, 17, 1, 1, 1, 1, 1, 1, 1, 1, + 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 17, + 18, 18, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -419,18 +419,18 @@ 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[18] = +static yyconst flex_int32_t yy_meta[19] = { 0, - 1, 2, 3, 1, 1, 1, 1, 1, 4, 1, - 1, 1, 1, 1, 4, 4, 4 + 1, 2, 3, 1, 1, 1, 1, 1, 4, 4, + 1, 1, 1, 1, 1, 4, 4, 4 } ; static yyconst flex_int16_t yy_base[41] = { 0, - 0, 0, 16, 18, 50, 56, 56, 56, 18, 39, - 17, 56, 56, 16, 56, 56, 56, 56, 0, 0, - 56, 56, 20, 56, 0, 26, 56, 21, 56, 0, - 19, 0, 0, 56, 35, 39, 43, 47, 22, 51 + 0, 0, 17, 19, 44, 58, 58, 58, 19, 28, + 18, 58, 58, 17, 58, 58, 58, 58, 0, 0, + 58, 58, 21, 58, 0, 26, 58, 22, 58, 0, + 20, 0, 0, 58, 37, 41, 45, 49, 22, 53 } ; static yyconst flex_int16_t yy_def[41] = @@ -441,28 +441,28 @@ 34, 39, 40, 0, 34, 34, 34, 34, 34, 34 } ; -static yyconst flex_int16_t yy_nxt[74] = +static yyconst flex_int16_t yy_nxt[77] = { 0, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 6, 18, 6, 19, 19, 21, 22, 21, - 22, 24, 29, 24, 31, 32, 29, 31, 27, 30, - 25, 31, 25, 30, 31, 20, 20, 20, 20, 23, - 23, 27, 23, 26, 26, 26, 26, 28, 28, 34, - 28, 33, 34, 34, 33, 5, 34, 34, 34, 34, + 6, 7, 8, 9, 10, 11, 12, 13, 12, 14, + 15, 16, 17, 6, 18, 6, 19, 19, 21, 22, + 21, 22, 24, 29, 24, 32, 31, 29, 27, 31, + 27, 30, 25, 31, 25, 30, 31, 20, 20, 20, + 20, 23, 23, 34, 23, 26, 26, 26, 26, 28, + 28, 34, 28, 33, 34, 34, 33, 5, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34 + 34, 34, 34, 34, 34, 34 } ; -static yyconst flex_int16_t yy_chk[74] = +static yyconst flex_int16_t yy_chk[77] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 3, 4, - 4, 9, 11, 23, 14, 39, 28, 31, 26, 11, - 9, 14, 23, 28, 31, 35, 35, 35, 35, 36, - 36, 10, 36, 37, 37, 37, 37, 38, 38, 5, - 38, 40, 0, 0, 40, 34, 34, 34, 34, 34, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, + 4, 4, 9, 11, 23, 39, 14, 28, 26, 31, + 10, 11, 9, 14, 23, 28, 31, 35, 35, 35, + 35, 36, 36, 5, 36, 37, 37, 37, 37, 38, + 38, 0, 38, 40, 0, 0, 40, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34 + 34, 34, 34, 34, 34, 34 } ; /* Table of booleans, true if rule could match eol. */ diff -Nru xen-4.2.2/tools/libxl/libxlu_cfg_l.l xen-4.3.0/tools/libxl/libxlu_cfg_l.l --- xen-4.2.2/tools/libxl/libxlu_cfg_l.l 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxlu_cfg_l.l 2013-07-09 10:46:56.000000000 +0000 @@ -52,7 +52,7 @@ %% -[a-z][_0-9a-z]* { +[a-z][._0-9a-z]* { yylval->string= xlu__cfgl_strdup(ctx,yytext); GOT(IDENT); } diff -Nru xen-4.2.2/tools/libxl/libxlu_disk_l.c xen-4.3.0/tools/libxl/libxlu_disk_l.c --- xen-4.2.2/tools/libxl/libxlu_disk_l.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxlu_disk_l.c 2013-07-09 10:46:56.000000000 +0000 @@ -361,8 +361,8 @@ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 25 -#define YY_END_OF_BUFFER 26 +#define YY_NUM_RULES 26 +#define YY_END_OF_BUFFER 27 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -370,60 +370,61 @@ flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_acclist[447] = +static yyconst flex_int16_t yy_acclist[454] = { 0, - 24, 24, 26, 22, 23, 25, 8193, 22, 23, 25, - 16385, 8193, 22, 25,16385, 22, 23, 25, 23, 25, - 22, 23, 25, 22, 23, 25, 22, 23, 25, 22, - 23, 25, 22, 23, 25, 22, 23, 25, 22, 23, - 25, 22, 23, 25, 22, 23, 25, 22, 23, 25, - 22, 23, 25, 22, 23, 25, 22, 23, 25, 22, - 23, 25, 22, 23, 25, 24, 25, 25, 22, 22, - 8193, 22, 8193, 22,16385, 8193, 22, 8193, 22, 22, - 8213, 22,16405, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - - 22, 22, 24, 8193, 22, 8193, 22, 8193, 8213, 22, - 8213, 22, 8213, 12, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 8213, 22, 8213, 22, 8213, 12, 22, 17, - 8213, 22,16405, 22, 22, 22, 22, 22, 22, 22, - 8206, 8213, 22,16398,16405, 20, 8213, 22,16405, 22, - 8205, 8213, 22,16397,16405, 22, 22, 8208, 8213, 22, - 16400,16405, 22, 22, 22, 22, 17, 8213, 22, 17, - 8213, 22, 17, 22, 17, 8213, 22, 3, 22, 22, - 19, 8213, 22,16405, 22, 22, 8206, 8213, 22, 8206, - - 8213, 22, 8206, 22, 8206, 8213, 20, 8213, 22, 20, - 8213, 22, 20, 22, 20, 8213, 8205, 8213, 22, 8205, - 8213, 22, 8205, 22, 8205, 8213, 22, 8208, 8213, 22, - 8208, 8213, 22, 8208, 22, 8208, 8213, 22, 22, 9, - 22, 17, 8213, 22, 17, 8213, 22, 17, 8213, 17, - 22, 17, 22, 3, 22, 22, 19, 8213, 22, 19, - 8213, 22, 19, 22, 19, 8213, 22, 18, 8213, 22, - 16405, 8206, 8213, 22, 8206, 8213, 22, 8206, 8213, 8206, - 22, 8206, 20, 8213, 22, 20, 8213, 22, 20, 8213, - 20, 22, 20, 8205, 8213, 22, 8205, 8213, 22, 8205, - - 8213, 8205, 22, 8205, 22, 8208, 8213, 22, 8208, 8213, - 22, 8208, 8213, 8208, 22, 8208, 22, 22, 9, 12, - 9, 7, 22, 22, 19, 8213, 22, 19, 8213, 22, - 19, 8213, 19, 22, 19, 2, 18, 8213, 22, 18, - 8213, 22, 18, 22, 18, 8213, 10, 22, 11, 9, - 9, 12, 7, 12, 7, 22, 6, 2, 12, 2, - 18, 8213, 22, 18, 8213, 22, 18, 8213, 18, 22, - 18, 10, 12, 10, 15, 8213, 22,16405, 11, 12, - 11, 7, 7, 12, 22, 6, 12, 6, 6, 12, - 6, 12, 2, 2, 12, 10, 10, 12, 15, 8213, - - 22, 15, 8213, 22, 15, 22, 15, 8213, 11, 12, - 22, 6, 6, 12, 6, 6, 15, 8213, 22, 15, - 8213, 22, 15, 8213, 15, 22, 15, 22, 6, 6, - 8, 6, 5, 6, 8, 12, 8, 4, 6, 5, - 6, 8, 8, 12, 4, 6 + 25, 25, 27, 23, 24, 26, 8193, 23, 24, 26, + 16385, 8193, 23, 26,16385, 23, 24, 26, 24, 26, + 23, 24, 26, 23, 24, 26, 23, 24, 26, 23, + 24, 26, 23, 24, 26, 23, 24, 26, 23, 24, + 26, 23, 24, 26, 23, 24, 26, 23, 24, 26, + 23, 24, 26, 23, 24, 26, 23, 24, 26, 23, + 24, 26, 23, 24, 26, 25, 26, 26, 23, 23, + 8193, 23, 8193, 23,16385, 8193, 23, 8193, 23, 23, + 8214, 23,16406, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + + 23, 23, 25, 8193, 23, 8193, 23, 8193, 8214, 23, + 8214, 23, 8214, 13, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 8214, 23, 8214, 23, 8214, 13, 23, 18, + 8214, 23,16406, 23, 23, 23, 23, 23, 23, 23, + 8207, 8214, 23,16399,16406, 21, 8214, 23,16406, 23, + 8206, 8214, 23,16398,16406, 23, 23, 8209, 8214, 23, + 16401,16406, 23, 23, 23, 23, 18, 8214, 23, 18, + 8214, 23, 18, 23, 18, 8214, 23, 3, 23, 23, + 20, 8214, 23,16406, 23, 23, 8207, 8214, 23, 8207, + + 8214, 23, 8207, 23, 8207, 8214, 21, 8214, 23, 21, + 8214, 23, 21, 23, 21, 8214, 8206, 8214, 23, 8206, + 8214, 23, 8206, 23, 8206, 8214, 23, 8209, 8214, 23, + 8209, 8214, 23, 8209, 23, 8209, 8214, 23, 23, 10, + 23, 18, 8214, 23, 18, 8214, 23, 18, 8214, 18, + 23, 18, 23, 3, 23, 23, 20, 8214, 23, 20, + 8214, 23, 20, 23, 20, 8214, 23, 19, 8214, 23, + 16406, 8207, 8214, 23, 8207, 8214, 23, 8207, 8214, 8207, + 23, 8207, 21, 8214, 23, 21, 8214, 23, 21, 8214, + 21, 23, 21, 8206, 8214, 23, 8206, 8214, 23, 8206, + + 8214, 8206, 23, 8206, 23, 8209, 8214, 23, 8209, 8214, + 23, 8209, 8214, 8209, 23, 8209, 23, 23, 10, 13, + 10, 7, 23, 23, 20, 8214, 23, 20, 8214, 23, + 20, 8214, 20, 23, 20, 2, 19, 8214, 23, 19, + 8214, 23, 19, 23, 19, 8214, 11, 23, 12, 10, + 10, 13, 7, 13, 7, 8, 23, 6, 2, 13, + 2, 19, 8214, 23, 19, 8214, 23, 19, 8214, 19, + 23, 19, 11, 13, 11, 16, 8214, 23,16406, 12, + 13, 12, 7, 7, 13, 8, 13, 8, 23, 6, + 13, 6, 6, 13, 6, 13, 2, 2, 13, 11, + + 11, 13, 16, 8214, 23, 16, 8214, 23, 16, 23, + 16, 8214, 12, 13, 8, 8, 13, 23, 6, 6, + 13, 6, 6, 16, 8214, 23, 16, 8214, 23, 16, + 8214, 16, 23, 16, 23, 6, 6, 9, 6, 5, + 6, 9, 13, 9, 4, 6, 5, 6, 9, 9, + 13, 4, 6 } ; -static yyconst flex_int16_t yy_accept[252] = +static yyconst flex_int16_t yy_accept[257] = { 0, 1, 1, 1, 2, 3, 4, 7, 12, 16, 19, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, @@ -445,14 +446,14 @@ 293, 294, 297, 300, 302, 304, 305, 306, 309, 312, 314, 316, 317, 318, 319, 321, 322, 323, 324, 325, 328, 331, 333, 335, 336, 337, 340, 343, 345, 347, - 348, 349, 350, 351, 353, 355, 356, 357, 358, 360, + 348, 349, 350, 351, 353, 355, 356, 357, 358, 359, - 361, 364, 367, 369, 371, 372, 374, 375, 379, 381, - 382, 383, 385, 386, 388, 389, 391, 393, 394, 396, - 397, 399, 402, 405, 407, 409, 411, 412, 413, 415, - 416, 417, 420, 423, 425, 427, 428, 429, 430, 431, - 432, 433, 435, 437, 438, 440, 442, 443, 445, 447, - 447 + 361, 362, 365, 368, 370, 372, 373, 375, 376, 380, + 382, 383, 384, 386, 388, 389, 390, 392, 393, 395, + 397, 398, 400, 401, 403, 406, 409, 411, 413, 415, + 416, 418, 419, 420, 422, 423, 424, 427, 430, 432, + 434, 435, 436, 437, 438, 439, 440, 442, 444, 445, + 447, 449, 450, 452, 454, 454 } ; static yyconst flex_int32_t yy_ec[256] = @@ -495,83 +496,85 @@ 1, 1, 1 } ; -static yyconst flex_int16_t yy_base[308] = +static yyconst flex_int16_t yy_base[315] = { 0, - 0, 0, 546, 538, 533, 521, 32, 35, 656, 656, - 44, 62, 30, 41, 50, 51, 507, 64, 47, 66, - 67, 499, 68, 487, 72, 0, 656, 465, 656, 87, - 91, 0, 0, 100, 452, 109, 0, 74, 95, 87, + 0, 0, 563, 559, 558, 546, 32, 35, 665, 665, + 44, 62, 30, 41, 50, 51, 532, 64, 47, 66, + 67, 524, 68, 516, 72, 0, 665, 514, 665, 87, + 91, 0, 0, 100, 500, 109, 0, 74, 95, 87, 32, 96, 105, 110, 77, 97, 40, 113, 116, 112, 118, 120, 121, 122, 123, 125, 0, 137, 0, 0, - 147, 0, 0, 449, 129, 126, 134, 143, 145, 147, + 147, 0, 0, 494, 129, 126, 134, 143, 145, 147, 148, 149, 151, 153, 156, 160, 155, 167, 162, 175, - 168, 159, 188, 0, 0, 656, 166, 197, 179, 185, - 176, 200, 435, 186, 193, 216, 225, 205, 234, 221, + 168, 159, 188, 0, 0, 665, 166, 197, 179, 185, + 176, 200, 460, 186, 193, 216, 225, 205, 234, 221, 237, 247, 204, 230, 244, 213, 254, 0, 256, 0, 251, 258, 254, 279, 256, 259, 267, 0, 269, 0, 286, 0, 288, 0, 290, 0, 297, 0, 267, 299, - 0, 301, 0, 288, 297, 421, 302, 310, 0, 0, - 0, 0, 305, 656, 307, 319, 0, 321, 0, 322, + 0, 301, 0, 288, 297, 459, 302, 310, 0, 0, + 0, 0, 305, 665, 307, 319, 0, 321, 0, 322, 332, 335, 0, 0, 0, 0, 339, 0, 0, 0, 0, 342, 0, 0, 0, 0, 340, 349, 0, 0, - 0, 0, 337, 345, 420, 656, 419, 346, 350, 358, - 0, 0, 0, 0, 418, 360, 0, 362, 0, 417, - 319, 369, 416, 656, 415, 656, 276, 364, 414, 656, - - 375, 0, 0, 0, 0, 413, 656, 384, 412, 0, - 410, 656, 370, 409, 656, 370, 378, 408, 656, 366, - 656, 394, 0, 396, 0, 0, 380, 316, 656, 377, - 387, 398, 0, 0, 0, 0, 399, 402, 407, 271, - 406, 228, 200, 656, 175, 656, 77, 656, 656, 656, - 428, 432, 435, 439, 443, 447, 451, 455, 459, 463, - 467, 471, 475, 479, 483, 487, 491, 495, 499, 503, - 507, 511, 515, 519, 523, 527, 531, 535, 539, 543, - 547, 551, 555, 559, 563, 567, 571, 575, 579, 583, - 587, 591, 595, 599, 603, 607, 611, 615, 619, 623, + 0, 0, 337, 345, 450, 665, 442, 350, 352, 360, + 0, 0, 0, 0, 424, 362, 0, 364, 0, 420, + 319, 371, 419, 665, 418, 665, 417, 276, 368, 416, + + 665, 373, 0, 0, 0, 0, 415, 665, 382, 414, + 0, 413, 665, 412, 665, 368, 411, 665, 384, 352, + 410, 665, 409, 665, 391, 0, 395, 0, 0, 405, + 665, 382, 316, 665, 385, 397, 399, 0, 0, 0, + 0, 396, 403, 406, 271, 407, 228, 200, 665, 175, + 665, 77, 665, 665, 665, 429, 433, 436, 440, 444, + 448, 452, 456, 460, 464, 468, 472, 476, 480, 484, + 488, 492, 496, 500, 504, 508, 512, 516, 520, 524, + 528, 532, 536, 540, 544, 548, 552, 556, 560, 564, + 568, 572, 576, 580, 584, 588, 592, 596, 600, 604, - 627, 631, 635, 639, 643, 647, 651 + 608, 612, 616, 620, 624, 628, 632, 636, 640, 644, + 648, 652, 656, 660 } ; -static yyconst flex_int16_t yy_def[308] = +static yyconst flex_int16_t yy_def[315] = { 0, - 250, 1, 251, 251, 250, 252, 253, 253, 250, 250, - 254, 254, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 255, 250, 252, 250, 256, - 253, 257, 257, 258, 12, 252, 259, 12, 12, 12, + 255, 1, 256, 256, 255, 257, 258, 258, 255, 255, + 259, 259, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 260, 255, 257, 255, 261, + 258, 262, 262, 263, 12, 257, 264, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 255, 256, 257, 257, - 260, 261, 261, 250, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 260, 261, 262, 262, + 265, 266, 266, 255, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 260, 261, 261, 250, 12, 262, 12, 12, - 12, 12, 12, 12, 12, 263, 264, 12, 265, 12, + 12, 12, 265, 266, 266, 255, 12, 267, 12, 12, + 12, 12, 12, 12, 12, 268, 269, 12, 270, 12, - 12, 266, 12, 12, 12, 12, 267, 268, 262, 268, - 12, 12, 12, 269, 12, 12, 270, 271, 263, 271, - 272, 273, 264, 273, 274, 275, 265, 275, 12, 276, - 277, 266, 277, 12, 12, 278, 12, 267, 268, 268, - 279, 279, 12, 250, 12, 280, 281, 269, 281, 12, - 282, 270, 271, 271, 283, 283, 272, 273, 273, 284, - 284, 274, 275, 275, 285, 285, 12, 276, 277, 277, - 286, 286, 12, 12, 287, 250, 288, 12, 12, 280, - 281, 281, 289, 289, 290, 291, 292, 282, 292, 293, - 12, 294, 287, 250, 295, 250, 12, 296, 297, 250, - - 291, 292, 292, 298, 298, 299, 250, 300, 301, 301, - 295, 250, 12, 302, 250, 302, 302, 297, 250, 299, - 250, 303, 304, 300, 304, 301, 12, 302, 250, 302, - 302, 303, 304, 304, 305, 305, 12, 302, 302, 306, - 302, 302, 307, 250, 302, 250, 307, 250, 250, 0, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, + 12, 271, 12, 12, 12, 12, 272, 273, 267, 273, + 12, 12, 12, 274, 12, 12, 275, 276, 268, 276, + 277, 278, 269, 278, 279, 280, 270, 280, 12, 281, + 282, 271, 282, 12, 12, 283, 12, 272, 273, 273, + 284, 284, 12, 255, 12, 285, 286, 274, 286, 12, + 287, 275, 276, 276, 288, 288, 277, 278, 278, 289, + 289, 279, 280, 280, 290, 290, 12, 281, 282, 282, + 291, 291, 12, 12, 292, 255, 293, 12, 12, 285, + 286, 286, 294, 294, 295, 296, 297, 287, 297, 298, + 12, 299, 292, 255, 300, 255, 301, 12, 302, 303, + + 255, 296, 297, 297, 304, 304, 305, 255, 306, 307, + 307, 300, 255, 308, 255, 12, 309, 255, 309, 309, + 303, 255, 305, 255, 310, 311, 306, 311, 307, 308, + 255, 12, 309, 255, 309, 309, 310, 311, 311, 312, + 312, 12, 309, 309, 313, 309, 309, 314, 255, 309, + 255, 314, 255, 255, 0, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 250, 250, 250, 250, 250, 250, 250 + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255 } ; -static yyconst flex_int16_t yy_nxt[690] = +static yyconst flex_int16_t yy_nxt[699] = { 0, 6, 7, 8, 9, 6, 6, 6, 6, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 17, 17, @@ -581,7 +584,7 @@ 35, 36, 37, 73, 42, 38, 35, 49, 68, 35, 35, 39, 28, 28, 28, 29, 34, 43, 45, 36, 37, 40, 44, 35, 46, 35, 35, 35, 51, 53, - 244, 35, 50, 35, 55, 65, 35, 47, 56, 28, + 249, 35, 50, 35, 55, 65, 35, 47, 56, 28, 59, 48, 31, 31, 32, 60, 35, 71, 67, 33, 28, 28, 28, 29, 35, 35, 35, 28, 37, 61, @@ -591,66 +594,68 @@ 59, 77, 87, 35, 76, 60, 80, 79, 81, 28, 84, 78, 35, 89, 35, 85, 35, 35, 35, 75, 35, 92, 35, 96, 35, 35, 90, 97, 35, 35, - 93, 35, 94, 91, 99, 35, 35, 35, 249, 100, + 93, 35, 94, 91, 99, 35, 35, 35, 254, 100, 95, 101, 102, 104, 35, 35, 98, 103, 35, 105, 28, 84, 111, 106, 35, 35, 85, 107, 107, 61, - 108, 107, 35, 248, 107, 110, 112, 114, 113, 35, + 108, 107, 35, 253, 107, 110, 112, 114, 113, 35, 75, 78, 99, 35, 35, 116, 117, 117, 61, 118, 117, 134, 35, 117, 120, 121, 121, 61, 122, 121, - 35, 246, 121, 124, 125, 125, 61, 126, 125, 35, + 35, 251, 121, 124, 125, 125, 61, 126, 125, 35, 137, 125, 128, 135, 102, 129, 35, 130, 130, 61, 131, 130, 136, 35, 130, 133, 28, 139, 28, 141, 35, 144, 140, 35, 142, 35, 151, 35, 35, 28, - 153, 28, 155, 143, 244, 154, 35, 156, 145, 146, + 153, 28, 155, 143, 249, 154, 35, 156, 145, 146, 146, 61, 147, 146, 150, 35, 146, 149, 28, 158, 28, 160, 28, 163, 159, 167, 161, 35, 164, 28, - 165, 28, 169, 28, 171, 166, 35, 170, 213, 172, - 177, 35, 28, 139, 35, 173, 35, 178, 140, 215, - 179, 28, 181, 28, 183, 174, 208, 182, 35, 184, + 165, 28, 169, 28, 171, 166, 35, 170, 216, 172, + 177, 35, 28, 139, 35, 173, 35, 178, 140, 218, + 179, 28, 181, 28, 183, 174, 209, 182, 35, 184, 185, 35, 186, 186, 61, 187, 186, 28, 153, 186, 189, 28, 158, 154, 28, 163, 35, 159, 190, 35, - 164, 28, 169, 192, 35, 35, 191, 170, 198, 35, - 28, 181, 28, 202, 28, 204, 182, 215, 203, 207, - 205, 64, 210, 229, 197, 216, 217, 28, 202, 35, - 215, 229, 230, 203, 222, 222, 61, 223, 222, 35, - 215, 222, 225, 237, 227, 231, 28, 233, 28, 235, - - 28, 233, 234, 238, 236, 215, 234, 240, 35, 215, - 215, 200, 229, 196, 239, 226, 221, 219, 212, 176, - 207, 200, 196, 194, 176, 241, 242, 245, 26, 26, - 26, 26, 28, 28, 28, 30, 30, 30, 30, 35, - 35, 35, 35, 57, 115, 57, 57, 58, 58, 58, - 58, 60, 86, 60, 60, 34, 34, 34, 34, 64, - 64, 35, 64, 83, 83, 83, 83, 85, 29, 85, - 85, 109, 109, 109, 109, 119, 119, 119, 119, 123, - 123, 123, 123, 127, 127, 127, 127, 132, 132, 132, - 132, 138, 138, 138, 138, 140, 54, 140, 140, 148, - - 148, 148, 148, 152, 152, 152, 152, 154, 52, 154, - 154, 157, 157, 157, 157, 159, 35, 159, 159, 162, - 162, 162, 162, 164, 29, 164, 164, 168, 168, 168, - 168, 170, 250, 170, 170, 175, 175, 175, 175, 142, - 27, 142, 142, 180, 180, 180, 180, 182, 27, 182, - 182, 188, 188, 188, 188, 156, 250, 156, 156, 161, - 250, 161, 161, 166, 250, 166, 166, 172, 250, 172, - 172, 193, 193, 193, 193, 195, 195, 195, 195, 184, - 250, 184, 184, 199, 199, 199, 199, 201, 201, 201, - 201, 203, 250, 203, 203, 206, 206, 206, 206, 209, - - 209, 209, 209, 211, 211, 211, 211, 214, 214, 214, - 214, 218, 218, 218, 218, 205, 250, 205, 205, 220, - 220, 220, 220, 224, 224, 224, 224, 210, 250, 210, - 210, 228, 228, 228, 228, 232, 232, 232, 232, 234, - 250, 234, 234, 236, 250, 236, 236, 243, 243, 243, - 243, 247, 247, 247, 247, 5, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250 + 164, 28, 169, 192, 35, 234, 191, 170, 197, 35, + 199, 35, 28, 181, 28, 203, 28, 205, 182, 236, + 204, 218, 206, 64, 211, 28, 203, 35, 198, 219, + 220, 204, 225, 225, 61, 226, 225, 234, 218, 225, + 228, 35, 232, 28, 238, 242, 235, 28, 240, 239, + + 218, 28, 238, 241, 245, 35, 218, 239, 215, 218, + 218, 243, 208, 201, 234, 231, 196, 229, 224, 222, + 215, 213, 176, 208, 244, 247, 246, 201, 250, 26, + 26, 26, 26, 28, 28, 28, 30, 30, 30, 30, + 35, 35, 35, 35, 57, 196, 57, 57, 58, 58, + 58, 58, 60, 194, 60, 60, 34, 34, 34, 34, + 64, 64, 176, 64, 83, 83, 83, 83, 85, 115, + 85, 85, 109, 109, 109, 109, 119, 119, 119, 119, + 123, 123, 123, 123, 127, 127, 127, 127, 132, 132, + 132, 132, 138, 138, 138, 138, 140, 86, 140, 140, + + 148, 148, 148, 148, 152, 152, 152, 152, 154, 35, + 154, 154, 157, 157, 157, 157, 159, 29, 159, 159, + 162, 162, 162, 162, 164, 54, 164, 164, 168, 168, + 168, 168, 170, 52, 170, 170, 175, 175, 175, 175, + 142, 35, 142, 142, 180, 180, 180, 180, 182, 29, + 182, 182, 188, 188, 188, 188, 156, 255, 156, 156, + 161, 27, 161, 161, 166, 27, 166, 166, 172, 255, + 172, 172, 193, 193, 193, 193, 195, 195, 195, 195, + 184, 255, 184, 184, 200, 200, 200, 200, 202, 202, + 202, 202, 204, 255, 204, 204, 207, 207, 207, 207, + + 210, 210, 210, 210, 212, 212, 212, 212, 214, 214, + 214, 214, 217, 217, 217, 217, 221, 221, 221, 221, + 206, 255, 206, 206, 223, 223, 223, 223, 227, 227, + 227, 227, 211, 255, 211, 211, 230, 230, 230, 230, + 233, 233, 233, 233, 237, 237, 237, 237, 239, 255, + 239, 239, 241, 255, 241, 241, 248, 248, 248, 248, + 252, 252, 252, 252, 5, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255 + } ; -static yyconst flex_int16_t yy_chk[690] = +static yyconst flex_int16_t yy_chk[699] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -660,7 +665,7 @@ 14, 11, 11, 47, 14, 11, 19, 19, 41, 15, 16, 11, 12, 12, 12, 12, 12, 14, 16, 12, 12, 12, 15, 18, 16, 20, 21, 23, 21, 23, - 247, 25, 20, 38, 25, 38, 45, 18, 25, 30, + 252, 25, 20, 38, 25, 38, 45, 18, 25, 30, 30, 18, 31, 31, 31, 30, 40, 45, 40, 31, 34, 34, 34, 34, 39, 42, 46, 34, 34, 36, @@ -670,63 +675,65 @@ 58, 51, 65, 67, 50, 58, 54, 53, 54, 61, 61, 52, 68, 67, 69, 61, 70, 71, 72, 70, 73, 71, 74, 75, 77, 75, 68, 76, 82, 76, - 72, 79, 73, 69, 78, 87, 78, 81, 245, 79, + 72, 79, 73, 69, 78, 87, 78, 81, 250, 79, 74, 80, 80, 81, 80, 91, 77, 80, 89, 82, 83, 83, 89, 87, 90, 94, 83, 88, 88, 88, - 88, 88, 95, 243, 88, 88, 90, 92, 91, 92, + 88, 88, 95, 248, 88, 88, 90, 92, 91, 92, 95, 98, 98, 103, 98, 94, 96, 96, 96, 96, 96, 103, 106, 96, 96, 97, 97, 97, 97, 97, - 100, 242, 97, 97, 99, 99, 99, 99, 99, 104, + 100, 247, 97, 97, 99, 99, 99, 99, 99, 104, 106, 99, 99, 104, 101, 100, 101, 102, 102, 102, 102, 102, 105, 105, 102, 102, 107, 107, 109, 109, 111, 112, 107, 113, 109, 115, 116, 112, 116, 117, - 117, 119, 119, 111, 240, 117, 129, 119, 113, 114, - 114, 114, 114, 114, 115, 197, 114, 114, 121, 121, + 117, 119, 119, 111, 245, 117, 129, 119, 113, 114, + 114, 114, 114, 114, 115, 198, 114, 114, 121, 121, 123, 123, 125, 125, 121, 129, 123, 134, 125, 127, - 127, 130, 130, 132, 132, 127, 135, 130, 197, 132, - 137, 137, 138, 138, 143, 134, 145, 143, 138, 228, + 127, 130, 130, 132, 132, 127, 135, 130, 198, 132, + 137, 137, 138, 138, 143, 134, 145, 143, 138, 233, 145, 146, 146, 148, 148, 135, 191, 146, 191, 148, 150, 150, 151, 151, 151, 151, 151, 152, 152, 151, 151, 157, 157, 152, 162, 162, 173, 157, 167, 167, - 162, 168, 168, 174, 174, 178, 173, 168, 179, 179, - 180, 180, 186, 186, 188, 188, 180, 198, 186, 220, - 188, 192, 192, 216, 178, 198, 198, 201, 201, 213, - 230, 217, 216, 201, 208, 208, 208, 208, 208, 227, - 231, 208, 208, 227, 213, 217, 222, 222, 224, 224, - - 232, 232, 222, 230, 224, 238, 232, 237, 237, 241, - 239, 218, 214, 211, 231, 209, 206, 199, 195, 193, - 190, 185, 177, 175, 136, 238, 239, 241, 251, 251, - 251, 251, 252, 252, 252, 253, 253, 253, 253, 254, - 254, 254, 254, 255, 93, 255, 255, 256, 256, 256, - 256, 257, 64, 257, 257, 258, 258, 258, 258, 259, - 259, 35, 259, 260, 260, 260, 260, 261, 28, 261, - 261, 262, 262, 262, 262, 263, 263, 263, 263, 264, - 264, 264, 264, 265, 265, 265, 265, 266, 266, 266, - 266, 267, 267, 267, 267, 268, 24, 268, 268, 269, - - 269, 269, 269, 270, 270, 270, 270, 271, 22, 271, - 271, 272, 272, 272, 272, 273, 17, 273, 273, 274, - 274, 274, 274, 275, 6, 275, 275, 276, 276, 276, - 276, 277, 5, 277, 277, 278, 278, 278, 278, 279, - 4, 279, 279, 280, 280, 280, 280, 281, 3, 281, - 281, 282, 282, 282, 282, 283, 0, 283, 283, 284, - 0, 284, 284, 285, 0, 285, 285, 286, 0, 286, - 286, 287, 287, 287, 287, 288, 288, 288, 288, 289, - 0, 289, 289, 290, 290, 290, 290, 291, 291, 291, - 291, 292, 0, 292, 292, 293, 293, 293, 293, 294, - - 294, 294, 294, 295, 295, 295, 295, 296, 296, 296, - 296, 297, 297, 297, 297, 298, 0, 298, 298, 299, - 299, 299, 299, 300, 300, 300, 300, 301, 0, 301, - 301, 302, 302, 302, 302, 303, 303, 303, 303, 304, - 0, 304, 304, 305, 0, 305, 305, 306, 306, 306, - 306, 307, 307, 307, 307, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, - 250, 250, 250, 250, 250, 250, 250, 250, 250 + 162, 168, 168, 174, 174, 220, 173, 168, 178, 178, + 179, 179, 180, 180, 186, 186, 188, 188, 180, 220, + 186, 199, 188, 192, 192, 202, 202, 216, 178, 199, + 199, 202, 209, 209, 209, 209, 209, 219, 235, 209, + 209, 232, 216, 225, 225, 232, 219, 227, 227, 225, + + 236, 237, 237, 227, 242, 242, 243, 237, 230, 244, + 246, 235, 223, 221, 217, 214, 212, 210, 207, 200, + 197, 195, 193, 190, 236, 244, 243, 185, 246, 256, + 256, 256, 256, 257, 257, 257, 258, 258, 258, 258, + 259, 259, 259, 259, 260, 177, 260, 260, 261, 261, + 261, 261, 262, 175, 262, 262, 263, 263, 263, 263, + 264, 264, 136, 264, 265, 265, 265, 265, 266, 93, + 266, 266, 267, 267, 267, 267, 268, 268, 268, 268, + 269, 269, 269, 269, 270, 270, 270, 270, 271, 271, + 271, 271, 272, 272, 272, 272, 273, 64, 273, 273, + + 274, 274, 274, 274, 275, 275, 275, 275, 276, 35, + 276, 276, 277, 277, 277, 277, 278, 28, 278, 278, + 279, 279, 279, 279, 280, 24, 280, 280, 281, 281, + 281, 281, 282, 22, 282, 282, 283, 283, 283, 283, + 284, 17, 284, 284, 285, 285, 285, 285, 286, 6, + 286, 286, 287, 287, 287, 287, 288, 5, 288, 288, + 289, 4, 289, 289, 290, 3, 290, 290, 291, 0, + 291, 291, 292, 292, 292, 292, 293, 293, 293, 293, + 294, 0, 294, 294, 295, 295, 295, 295, 296, 296, + 296, 296, 297, 0, 297, 297, 298, 298, 298, 298, + + 299, 299, 299, 299, 300, 300, 300, 300, 301, 301, + 301, 301, 302, 302, 302, 302, 303, 303, 303, 303, + 304, 0, 304, 304, 305, 305, 305, 305, 306, 306, + 306, 306, 307, 0, 307, 307, 308, 308, 308, 308, + 309, 309, 309, 309, 310, 310, 310, 310, 311, 0, + 311, 311, 312, 0, 312, 312, 313, 313, 313, 313, + 314, 314, 314, 314, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255 + } ; #define YY_TRAILING_MASK 0x2000 @@ -883,7 +890,7 @@ #define DPC ((DiskParseContext*)yyextra) -#line 887 "libxlu_disk_l.c" +#line 894 "libxlu_disk_l.c" #define INITIAL 0 #define LEXERR 1 @@ -1124,7 +1131,7 @@ /*----- the scanner rules which do the parsing -----*/ -#line 1128 "libxlu_disk_l.c" +#line 1135 "libxlu_disk_l.c" if ( !yyg->yy_init ) { @@ -1188,14 +1195,14 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 251 ) + if ( yy_current_state >= 256 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; *yyg->yy_state_ptr++ = yy_current_state; ++yy_cp; } - while ( yy_current_state != 250 ); + while ( yy_current_state != 255 ); yy_find_action: yy_current_state = *--yyg->yy_state_ptr; @@ -1286,48 +1293,54 @@ /* rule 8 can match eol */ YY_RULE_SETUP #line 171 "libxlu_disk_l.l" -{ STRIP(','); setbackendtype(DPC,FROMEQUALS); } +{ STRIP(','); SAVESTRING("backend", backend_domname, FROMEQUALS); } YY_BREAK case 9: /* rule 9 can match eol */ YY_RULE_SETUP -#line 173 "libxlu_disk_l.l" -{ STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); } +#line 172 "libxlu_disk_l.l" +{ STRIP(','); setbackendtype(DPC,FROMEQUALS); } YY_BREAK case 10: /* rule 10 can match eol */ YY_RULE_SETUP #line 174 "libxlu_disk_l.l" +{ STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); } + YY_BREAK +case 11: +/* rule 11 can match eol */ +YY_RULE_SETUP +#line 175 "libxlu_disk_l.l" { STRIP(','); SAVESTRING("script", script, FROMEQUALS); } YY_BREAK /* the target magic parameter, eats the rest of the string */ -case 11: +case 12: YY_RULE_SETUP -#line 178 "libxlu_disk_l.l" +#line 179 "libxlu_disk_l.l" { STRIP(','); SAVESTRING("target", pdev_path, FROMEQUALS); } YY_BREAK /* unknown parameters */ -case 12: -/* rule 12 can match eol */ +case 13: +/* rule 13 can match eol */ YY_RULE_SETUP -#line 182 "libxlu_disk_l.l" +#line 183 "libxlu_disk_l.l" { xlu__disk_err(DPC,yytext,"unknown parameter"); } YY_BREAK /* deprecated prefixes */ /* the "/.*" in these patterns ensures that they count as if they * matched the whole string, so these patterns take precedence */ -case 13: +case 14: YY_RULE_SETUP -#line 189 "libxlu_disk_l.l" +#line 190 "libxlu_disk_l.l" { STRIP(':'); DPC->had_depr_prefix=1; DEPRECATE("use `[format=]...,'"); setformat(DPC, yytext); } YY_BREAK -case 14: +case 15: YY_RULE_SETUP -#line 195 "libxlu_disk_l.l" +#line 196 "libxlu_disk_l.l" { char *newscript; STRIP(':'); @@ -1341,30 +1354,22 @@ free(newscript); } YY_BREAK -case 15: +case 16: *yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ yyg->yy_c_buf_p = yy_cp = yy_bp + 8; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 208 "libxlu_disk_l.l" -{ DPC->had_depr_prefix=1; DEPRECATE(0); } - YY_BREAK -case 16: -YY_RULE_SETUP #line 209 "libxlu_disk_l.l" { DPC->had_depr_prefix=1; DEPRECATE(0); } YY_BREAK case 17: -*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -yyg->yy_c_buf_p = yy_cp = yy_bp + 4; -YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 210 "libxlu_disk_l.l" { DPC->had_depr_prefix=1; DEPRECATE(0); } YY_BREAK case 18: *yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -yyg->yy_c_buf_p = yy_cp = yy_bp + 6; +yyg->yy_c_buf_p = yy_cp = yy_bp + 4; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 211 "libxlu_disk_l.l" @@ -1372,7 +1377,7 @@ YY_BREAK case 19: *yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -yyg->yy_c_buf_p = yy_cp = yy_bp + 5; +yyg->yy_c_buf_p = yy_cp = yy_bp + 6; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 212 "libxlu_disk_l.l" @@ -1380,26 +1385,34 @@ YY_BREAK case 20: *yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ -yyg->yy_c_buf_p = yy_cp = yy_bp + 4; +yyg->yy_c_buf_p = yy_cp = yy_bp + 5; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP #line 213 "libxlu_disk_l.l" { DPC->had_depr_prefix=1; DEPRECATE(0); } YY_BREAK case 21: -/* rule 21 can match eol */ +*yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ +yyg->yy_c_buf_p = yy_cp = yy_bp + 4; +YY_DO_BEFORE_ACTION; /* set up yytext again */ +YY_RULE_SETUP +#line 214 "libxlu_disk_l.l" +{ DPC->had_depr_prefix=1; DEPRECATE(0); } + YY_BREAK +case 22: +/* rule 22 can match eol */ YY_RULE_SETUP -#line 215 "libxlu_disk_l.l" +#line 216 "libxlu_disk_l.l" { xlu__disk_err(DPC,yytext,"unknown deprecated disk prefix"); return 0; } YY_BREAK /* positional parameters */ -case 22: -/* rule 22 can match eol */ +case 23: +/* rule 23 can match eol */ YY_RULE_SETUP -#line 222 "libxlu_disk_l.l" +#line 223 "libxlu_disk_l.l" { STRIP(','); @@ -1426,27 +1439,27 @@ } } YY_BREAK -case 23: +case 24: YY_RULE_SETUP -#line 248 "libxlu_disk_l.l" +#line 249 "libxlu_disk_l.l" { BEGIN(LEXERR); yymore(); } YY_BREAK -case 24: +case 25: YY_RULE_SETUP -#line 252 "libxlu_disk_l.l" +#line 253 "libxlu_disk_l.l" { xlu__disk_err(DPC,yytext,"bad disk syntax"); return 0; } YY_BREAK -case 25: +case 26: YY_RULE_SETUP -#line 255 "libxlu_disk_l.l" +#line 256 "libxlu_disk_l.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 1450 "libxlu_disk_l.c" +#line 1463 "libxlu_disk_l.c" case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(LEXERR): yyterminate(); @@ -1710,7 +1723,7 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 251 ) + if ( yy_current_state >= 256 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1734,11 +1747,11 @@ while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 251 ) + if ( yy_current_state >= 256 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 250); + yy_is_jam = (yy_current_state == 255); if ( ! yy_is_jam ) *yyg->yy_state_ptr++ = yy_current_state; @@ -2538,4 +2551,4 @@ #define YYTABLES_NAME "yytables" -#line 255 "libxlu_disk_l.l" +#line 256 "libxlu_disk_l.l" diff -Nru xen-4.2.2/tools/libxl/libxlu_disk_l.h xen-4.3.0/tools/libxl/libxlu_disk_l.h --- xen-4.2.2/tools/libxl/libxlu_disk_l.h 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxlu_disk_l.h 2013-07-09 10:46:56.000000000 +0000 @@ -344,7 +344,7 @@ #undef YY_DECL #endif -#line 255 "libxlu_disk_l.l" +#line 256 "libxlu_disk_l.l" #line 350 "libxlu_disk_l.h" #undef xlu__disk_yyIN_HEADER diff -Nru xen-4.2.2/tools/libxl/libxlu_disk_l.l xen-4.3.0/tools/libxl/libxlu_disk_l.l --- xen-4.2.2/tools/libxl/libxlu_disk_l.l 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/libxlu_disk_l.l 2013-07-09 10:46:56.000000000 +0000 @@ -168,6 +168,7 @@ devtype=[^,]*,? { xlu__disk_err(DPC,yytext,"unknown value for type"); } access=[^,]*,? { STRIP(','); setaccess(DPC, FROMEQUALS); } +backend=[^,]*,? { STRIP(','); SAVESTRING("backend", backend_domname, FROMEQUALS); } backendtype=[^,]*,? { STRIP(','); setbackendtype(DPC,FROMEQUALS); } vdev=[^,]*,? { STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); } diff -Nru xen-4.2.2/tools/libxl/xl.c xen-4.3.0/tools/libxl/xl.c --- xen-4.2.2/tools/libxl/xl.c 2013-04-23 16:42:55.000000000 +0000 +++ xen-4.3.0/tools/libxl/xl.c 2013-07-09 10:46:56.000000000 +0000 @@ -26,6 +26,7 @@ #include #include #include +#include #include "libxl.h" #include "libxl_utils.h" @@ -37,16 +38,41 @@ xentoollog_logger_stdiostream *logger; int dryrun_only; int force_execution; -int autoballoon = 1; +int autoballoon = -1; char *blkdev_start; int run_hotplug_scripts = 1; char *lockfile; char *default_vifscript = NULL; char *default_bridge = NULL; +char *default_gatewaydev = NULL; enum output_format default_output_format = OUTPUT_FORMAT_JSON; +int claim_mode = 0; static xentoollog_level minmsglevel = XTL_PROGRESS; +/* Get autoballoon option based on presence of dom0_mem Xen command + line option. */ +static int auto_autoballoon(void) +{ + const libxl_version_info *info; + regex_t regex; + int ret; + + info = libxl_get_version_info(ctx); + if (!info) + return 1; /* default to on */ + + ret = regcomp(®ex, + "(^| )dom0_mem=((|min:|max:)[0-9]+[bBkKmMgG]?,?)+($| )", + REG_NOSUB | REG_EXTENDED); + if (ret) + return 1; + + ret = regexec(®ex, info->commandline, 0, NULL, 0); + regfree(®ex); + return ret == REG_NOMATCH; +} + static void parse_global_config(const char *configfile, const char *configfile_data, int configfile_len) @@ -68,8 +94,18 @@ exit(1); } - if (!xlu_cfg_get_long (config, "autoballoon", &l, 0)) - autoballoon = l; + if (!xlu_cfg_get_string(config, "autoballoon", &buf, 0)) { + if (!strcmp(buf, "on") || !strcmp(buf, "1")) + autoballoon = 1; + else if (!strcmp(buf, "off") || !strcmp(buf, "0")) + autoballoon = 0; + else if (!strcmp(buf, "auto")) + autoballoon = -1; + else + fprintf(stderr, "invalid autoballoon option"); + } + if (autoballoon == -1) + autoballoon = auto_autoballoon(); if (!xlu_cfg_get_long (config, "run_hotplug_scripts", &l, 0)) run_hotplug_scripts = l; @@ -85,11 +121,42 @@ exit(1); } - if (!xlu_cfg_get_string (config, "vifscript", &buf, 0)) + /* + * For global options that are related to a specific type of device + * we use the following nomenclature: + * + * .default.