From xen-users-bounces@lists.xensource.com Thu Dec 01 10:38:01 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Thu, 01 Dec 2011 10:38:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-users-bounces@lists.xensource.com>)
	id 1RW41A-0005Ul-Dv; Thu, 01 Dec 2011 10:37:28 +0000
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <rpurinton@unifiedtechnologies.com>)
	id 1RVout-0002OP-TJ
	for xen-users@lists.xensource.com; Wed, 30 Nov 2011 18:30:00 +0000
X-Env-Sender: rpurinton@unifiedtechnologies.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1322677757!3733183!1
X-Originating-IP: [65.126.239.122]
X-SpamReason: No, hits=0.8 required=7.0 tests=EXTRA_MPART_TYPE, HTML_MESSAGE
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11780 invoked from network); 30 Nov 2011 18:29:18 -0000
Received: from mailsentry1.itpartnersllc.com (HELO
	mailsentry1.itpartnersllc.com) (65.126.239.122)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 30 Nov 2011 18:29:18 -0000
Received: from mb002.v019.myunifiedcloud.net
	(64-151-62-23.static.everestkc.net [64.151.62.23])
	by mailsentry1.itpartnersllc.com with ESMTP id
	pAUISTDO008602-pAUISTDT008602
	(version=TLSv1 cipher=AES128-SHA bits=128 verify=CAFAIL);
	Wed, 30 Nov 2011 13:29:15 -0500
Received: from mb001.v019.myunifiedcloud.net ([172.18.106.40]) by mb002
	([172.18.106.41]) with mapi; Wed, 30 Nov 2011 18:28:50 +0000
From: Russ Purinton <rpurinton@unifiedtechnologies.com>
To: akhilesh kumar <akhipatel@gmail.com>, "Xen-users@lists.xensource.com"
	<Xen-users@lists.xensource.com>
Date: Wed, 30 Nov 2011 18:28:21 +0000
Thread-Topic: [Xen-users] GPU pass through support for GTX 480/590
Thread-Index: AcyviQ3U2moDHdFcTyWpnKV/fuWRMQABJevg
Message-ID: <DCD0554F601CF946A51CAE28BBABDC4C2F7AE2D20E@mb001>
References: <CANR4xP7mr31qWFrKVPdhdBe8UOZCqKzYBqEiqU59M6YCyVrQaQ@mail.gmail.com>
In-Reply-To: <CANR4xP7mr31qWFrKVPdhdBe8UOZCqKzYBqEiqU59M6YCyVrQaQ@mail.gmail.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
MIME-Version: 1.0
X-FEAS-SYSTEM-WL: 64.151.62.23
X-Mailman-Approved-At: Thu, 01 Dec 2011 10:37:24 +0000
Subject: Re: [Xen-users] GPU pass through support for GTX 480/590
X-BeenThere: xen-users@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xensource.com>
List-Help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============1841065679264679203=="
Sender: xen-users-bounces@lists.xensource.com
Errors-To: xen-users-bounces@lists.xensource.com

--===============1841065679264679203==
Content-Language: en-US
Content-Type: multipart/related;
	boundary="_004_DCD0554F601CF946A51CAE28BBABDC4C2F7AE2D20Emb001_";
	type="multipart/alternative"

--_004_DCD0554F601CF946A51CAE28BBABDC4C2F7AE2D20Emb001_
Content-Type: multipart/alternative;
	boundary="_000_DCD0554F601CF946A51CAE28BBABDC4C2F7AE2D20Emb001_"

--_000_DCD0554F601CF946A51CAE28BBABDC4C2F7AE2D20Emb001_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

I have 2 gtx 590 in SLI mode (4 GPU Quad SLI)
Can't get any drivers to compile/run under xenserver.
Loaded Gnome GUI on Dom0 and can run it at 720p resolution, but not higher,=
 and the 720p looks ugly on my 1600p monitor  Can't get resolution to run h=
igher

[cid:image001.png@01CCAF63.EE02DD50]

From: xen-users-bounces@lists.xensource.com [mailto:xen-users-bounces@lists=
.xensource.com] On Behalf Of akhilesh kumar
Sent: Wednesday, November 30, 2011 12:52 PM
To: Xen-users@lists.xensource.com
Subject: [Xen-users] GPU pass through support for GTX 480/590

Hi All,

My graphics is slow on HVM guest so To make it fast I want to use GPU pass =
through
but in xen source i did not find support for that (device ID for graphics c=
ard GTX 480/590)
I have bellow configuration
1->Intel VT support board
2->xen 4.0
3->GTX 480/590

I have the following query

1->with open source xen 4.0, Can  I use GPU pass-through for GTX 480/590 or=
 I need to apply some patces
2->Will GPU pass through really make graphics fast on HVM

Thanks,
Akhilesh



--_000_DCD0554F601CF946A51CAE28BBABDC4C2F7AE2D20Emb001_
Content-Type: text/html; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" xmlns=3D"http:=
//www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV=3D"Content-Type" CONTENT=
=3D"text/html; charset=3Dus-ascii"><meta name=3DGenerator content=3D"Micros=
oft Word 14 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#def=
ault#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:12.0pt;
	font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:purple;
	text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
	{mso-style-priority:99;
	mso-style-link:"Balloon Text Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:8.0pt;
	font-family:"Tahoma","sans-serif";}
span.EmailStyle17
	{mso-style-type:personal-reply;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
span.BalloonTextChar
	{mso-style-name:"Balloon Text Char";
	mso-style-priority:99;
	mso-style-link:"Balloon Text";
	font-family:"Tahoma","sans-serif";}
.MsoChpDefault
	{mso-style-type:export-only;
	font-family:"Calibri","sans-serif";}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]--></head><body lang=3DEN-US link=3Dblue vli=
nk=3Dpurple><div class=3DWordSection1><p class=3DMsoNormal><span style=3D'f=
ont-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I have 2 =
gtx 590 in SLI mode (4 GPU Quad SLI)<o:p></o:p></span></p><p class=3DMsoNor=
mal><span style=3D'font-size:11.0pt;font-family:"Calibri","sans-serif";colo=
r:#1F497D'>Can&#8217;t get any drivers to compile/run under xenserver.<o:p>=
</o:p></span></p><p class=3DMsoNormal><span style=3D'font-size:11.0pt;font-=
family:"Calibri","sans-serif";color:#1F497D'>Loaded Gnome GUI on Dom0 and c=
an run it at 720p resolution, but not higher, and the 720p looks ugly on my=
 1600p monitor&nbsp; Can&#8217;t get resolution to run higher<o:p></o:p></s=
pan></p><p class=3DMsoNormal><span style=3D'font-size:11.0pt;font-family:"C=
alibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=3D=
MsoNormal><span style=3D'font-size:11.0pt;font-family:"Calibri","sans-serif=
";color:#1F497D'><img width=3D431 height=3D200 id=3D"Picture_x0020_1" src=
=3D"cid:image001.png@01CCAF63.EE02DD50" alt=3D"Description: sig"><o:p></o:p=
></span></p><p class=3DMsoNormal><span style=3D'font-size:11.0pt;font-famil=
y:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p clas=
s=3DMsoNormal><b><span style=3D'font-size:10.0pt;font-family:"Tahoma","sans=
-serif"'>From:</span></b><span style=3D'font-size:10.0pt;font-family:"Tahom=
a","sans-serif"'> xen-users-bounces@lists.xensource.com [mailto:xen-users-b=
ounces@lists.xensource.com] <b>On Behalf Of </b>akhilesh kumar<br><b>Sent:<=
/b> Wednesday, November 30, 2011 12:52 PM<br><b>To:</b> Xen-users@lists.xen=
source.com<br><b>Subject:</b> [Xen-users] GPU pass through support for GTX =
480/590<o:p></o:p></span></p><p class=3DMsoNormal><o:p>&nbsp;</o:p></p><div=
><p class=3DMsoNormal>Hi All,<o:p></o:p></p></div><div><p class=3DMsoNormal=
><o:p>&nbsp;</o:p></p></div><div><p class=3DMsoNormal>My graphics is slow o=
n HVM guest so To make it fast I want to use GPU pass through<o:p></o:p></p=
></div><div><p class=3DMsoNormal>but in xen source i did not find support f=
or that (device ID for graphics card GTX 480/590)<o:p></o:p></p></div><div>=
<p class=3DMsoNormal>I have bellow configuration&nbsp;<o:p></o:p></p></div>=
<div><p class=3DMsoNormal>1-&gt;Intel VT support board&nbsp;<o:p></o:p></p>=
</div><div><p class=3DMsoNormal>2-&gt;xen 4.0<o:p></o:p></p></div><div><p c=
lass=3DMsoNormal>3-&gt;GTX 480/590&nbsp;<o:p></o:p></p></div><div><p class=
=3DMsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=3DMsoNormal>I have th=
e following query&nbsp;<o:p></o:p></p></div><div><p class=3DMsoNormal><o:p>=
&nbsp;</o:p></p></div><div><p class=3DMsoNormal>1-&gt;with open source xen =
4.0, Can &nbsp;I use GPU&nbsp;pass-through for GTX 480/590 or I need to app=
ly some patces&nbsp;<o:p></o:p></p></div><div><p class=3DMsoNormal>2-&gt;Wi=
ll GPU pass through really make graphics fast on HVM&nbsp;<o:p></o:p></p></=
div><div><p class=3DMsoNormal><o:p>&nbsp;</o:p></p></div><div><p class=3DMs=
oNormal>Thanks,<o:p></o:p></p></div><div><p class=3DMsoNormal>Akhilesh&nbsp=
;<o:p></o:p></p></div><div><p class=3DMsoNormal><o:p>&nbsp;</o:p></p></div>=
<div><p class=3DMsoNormal>&nbsp; &nbsp;<o:p></o:p></p></div></div></body></=
html>=

--_000_DCD0554F601CF946A51CAE28BBABDC4C2F7AE2D20Emb001_--

--_004_DCD0554F601CF946A51CAE28BBABDC4C2F7AE2D20Emb001_
Content-Type: image/png; name="image001.png"
Content-Description: image001.png
Content-Disposition: inline; filename="image001.png"; size=69043;
	creation-date="Wed, 30 Nov 2011 18:28:49 GMT";
	modification-date="Wed, 30 Nov 2011 18:28:49 GMT"
Content-ID: <image001.png@01CCAF63.EE02DD50>
Content-Transfer-Encoding: base64

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
ODwez8yZM91ud0VFRVZWFpylAiLr+cof20iQyMKeYqkxccnxHKtEsxGTRgBBOIEMC1YSW7EaASAj
B39ScvQU509sDkUekKI+SEFnK6jAbD2azIAH6cjJGhjuO7T09/ffuXMnJiZGq9W2t7dv2rSpqKiI
YZi2trZNmzadO3fuk08+2bhxY2xsrMfjOXLkSHV19bJlyyoqKlJTU0tKSgoLC8+dO/fhhx9euXLF
ZDLt3bv3f/7nf+B1inAJCAiIiYmxWCz79u377rvvaJoeHBzcv3//t99+e/369U2bNlVUVOTn50ul
0k2bNpWXl2/btm3fvn16vV4ul2/evPnAgQNxcXEAgCeeeMJgMHz44Yfnz59PTk7evXv3hg0bKioq
tm7dum/fPoPBIJPJvvnmmy1btpDmAsMdR8a8QP5s2LChtLQUANDS0hIaGmqz2XQ6XVRUVG9vb1VV
1U8//SSVSn18fJxOJ6QXi8UajebKlSsRERG+vr5Go/H27dtpaWlDQ0OVlZWzZ882mUycUwc/P79x
48Y9++yzCQkJ8J1czK19fX1Xr159+eWXp0yZ8tJLL1VUVEil0tjY2GPHjqWlpSkUisjIyPz8/EWL
Ful0OnbHaZlMlp2d/dhjj82YMSM8PFwmk7W1tVksFofDYbfb4eU/LC6XC86zqqurGYaZMWMGfLKB
FojUAICenp7Ozk5O640fP/7y5cvl5eVx976op1AosrKysrKyMjMz4ZbgFEVFRkb29/e73e76+vrk
5ORly5a99NJLGRkZsbGx7GU1LCEhIU6n02azOZ1OiqKqqqp27doVGBio0WjY763f149okaDQgM04
yCkbQDKNj5it5BOFbIvJROYt36yKpBdoSMIlGf2cinPqguEOaiXUFJhBBOyDwjQnGdodp01ITfmE
Ycs777wzMDCgVCo//fTT7OzsgoICjADuDOr1ekNCQvLz841GY29vr8PhkMlkCQkJmzdvNhqNn3zy
yYULF7755huTyVRQULBv376pU6cKiAQAqKur27179w8//DBlypTKykr2KgktL7744vTp0+E1Miwj
R47861//WlNT88MPP9TU1MTGxgIAUlNTT548eeLEiW+//Xb+/PldXV0bN27Mzs4GAGRlZb399ts1
NTXff/99SUkJ5iDWpJwBKWxkiqJmzpz5xRdfbN68efz48TNmzLBarS+//LKvr++SJUtiY2PPnj27
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
kydPbtq0SafT7dmzp7+/3+1233vvvYIgLF26FMvW2toaDocfeOCBzs7On//85+PGjcN7lNxwww1f
f/11SkrKzJkzIYSCILhcLizngQMHbrjhhmXLlhkMhsOHD992220mkwnvFxUTE1NfX+90OvGDEM3N
zU6nE28fFQgE8LMKbM3B9SZu1+8pU+4EQ+MJMOGlFjQUe9bB5DpMBTHlOZI7SYQbcBRxNpJI93PD
iJrLVZ8NYio/1cKRawFqPMWRdSElJGt8NeIaZqGcBSH87rvvPvroo6amJrvdvnTp0ltuuUWv11dX
V7/11lvt7e2zZs168MEHBUF4/vnnjx49qvCNjIzE+29jOh6P59133929e7fC6Omnny4rKzt37ty6
deu6u7vnzZu3atUqrJ3b7X777bdjY2PxRwEpK3k8np07d+7cuTMQCNx7772zZs1qa2t7/fXX8Tck
f/SjH1kslkAgsGnTpq1bt8bExNx7773jx48PhUL79+/fuHFjX1/fhAkTVq9eTe3Qw+I+27T71VKA
C15c16jhKTWd62IuccCEogbuq/V4PB78hYDm5maj0fjJJ59MmzYtIiLiH//4x4MPPnjgwIHly5fj
R7ImTJjwwgsv5OXlDQwMREZGZmRkvPzyy7GxsQ6HIzIy0u/3v/HGG/hn6PPnz3d1dY0ePToYDL71
1ltdXV0FBQVZWVm7d+/esGFDZWXlvHnzLl68eODAgezs7KNHjz722GM7d+7EH/zbuHEjfg73oYce
unTp0rFjxxITE+vr6++555633377448/xjswOp3O119//ZZbbjl//nxZWZlyV5pyGdehVxv+Lgq6
1tinGck/tZ9y5D4YiYg27HRyyggfTGWlHSEvDY24wozkOU+u3dRUo8yiJpW2gmp20BivQQf/+eGH
H7766qt1dXV79uxZunTpwYMH+/v77777bvyE84oVKzZt2iTLcn9/f2dnZ2dnJ8amxYsXk1bq7+9f
vXo1ft0FD/P7/R0dHUuWLNm4cWN1dfVtt922ceNGzHTevHnJycn/9V//xUrV39//wgsvvPTSS/X1
9fgrAuFweMWKFX/+859ra2sfeuihl19+WZblTz/9dNWqVefOndu4cePq1asvXbp04cKFGTNm7N27
t76+/oknnnjyySfR0EYpzrpP6dd4+poNcq5TWBbkgbYkGoIhFddTsqnFm/In/pCx8mcgEMC3/tra
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
UqZjLgAAAABJRU5ErkJggg==

--_004_DCD0554F601CF946A51CAE28BBABDC4C2F7AE2D20Emb001_--


--===============1841065679264679203==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users
--===============1841065679264679203==--


From xen-devel-bounces@lists.xensource.com Fri Dec 02 19:24:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Fri, 02 Dec 2011 19:24:15 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RWYhr-0002t0-9c; Fri, 02 Dec 2011 19:23:35 +0000
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <quartex73@gmail.com>) id 1RWYhp-0002sv-3q
	for xen-devel@lists.xensource.com; Fri, 02 Dec 2011 19:23:33 +0000
X-Env-Sender: quartex73@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1322853731!45227328!1
X-Originating-IP: [209.85.213.171]
X-SpamReason: No, hits=1.0 required=7.0 tests=BODY_RANDOM_LONG,
	ML_RADAR_SPEW_LINKS_14,RCVD_BY_IP,UPPERCASE_50_75,spamassassin: 
X-StarScan-Version: 6.4.2; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7471 invoked from network); 2 Dec 2011 19:22:12 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Dec 2011 19:22:12 -0000
Received: by yenr9 with SMTP id r9so31546431yen.30
	for <xen-devel@lists.xensource.com>;
	Fri, 02 Dec 2011 11:22:47 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:content-type; bh=RXNxx1PvvwnAfefquqmNx1XFfkd44871k5B5/yYWNEg=;
	b=ga5j0DLFosYLDK7Nb405pm62KELlVzEoxdyAkdHr/77Nq5KK/J8DbQye6MTuLUOnZm
	+sei2jmQ7jrO2WQC2rl2eqB5UB6t1tGT6MXVX92M5x6CScbXXsy7VtYyzq/68S/EVskS
	bmR8QBvka8h7gwKXwlYj2PFAClGrXBbGK86Fw=
MIME-Version: 1.0
Received: by 10.236.190.40 with SMTP id d28mr21366128yhn.92.1322853767052;
	Fri, 02 Dec 2011 11:22:47 -0800 (PST)
Received: by 10.147.146.14 with HTTP; Fri, 2 Dec 2011 11:22:46 -0800 (PST)
In-Reply-To: <CAMhBqqiLc1994GUKtA7UY52pR29nktmFy+XiwTwpZb_E+fwFRQ@mail.gmail.com>
References: <CAMhBqqiLc1994GUKtA7UY52pR29nktmFy+XiwTwpZb_E+fwFRQ@mail.gmail.com>
Date: Fri, 2 Dec 2011 20:22:46 +0100
Message-ID: <CAMhBqqgu6v8NB-X0dNdfrzd12=Y2i==fYCCC2Z+MkDupqqKAOg@mail.gmail.com>
From: Quartexx <quartex73@gmail.com>
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] xen 4.0.1 w/2.6.32.47 hangs at boot
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

### lspci

00:00.0 Host bridge: Intel Corporation Core Processor DMI (rev 11)
	Subsystem: Intel Corporation Device 0000
	Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR+ FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort+
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Capabilities: [40] #00 [0000]

00:05.0 PCI bridge: Intel Corporation Core Processor PCI Express Root
Port 3 (rev 11) (prog-if 00 [Normal decode])
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR+ FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
	I/O behind bridge: 00002000-00002fff
	Memory behind bridge: b3a00000-b3afffff
	Prefetchable memory behind bridge: 00000000b0000000-00000000b1ffffff
	Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- <SERR- <PERR-
	BridgeCtl: Parity+ SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
		PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
	Capabilities: [40] Subsystem: Intel Corporation Device 0000
	Capabilities: [60] MSI: Enable+ Count=1/2 Maskable+ 64bit-
		Address: fee0100c  Data: 4139
		Masking: 00000002  Pending: 00000000
	Capabilities: [90] Express (v2) Root Port (Slot+), MSI 00
		DevCap:	MaxPayload 256 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
			ExtTag+ RBE+ FLReset-
		DevCtl:	Report errors: Correctable+ Non-Fatal+ Fatal+ Unsupported+
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
		LnkCap:	Port #5, Speed 5GT/s, Width x8, ASPM unknown, Latency L0
<512ns, L1 <4us
			ClockPM- Surprise+ LLActRep+ BwNot+
		LnkCtl:	ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk-
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed 2.5GT/s, Width x8, TrErr- Train- SlotClk+ DLActive+
BWMgmt- ABWMgmt-
		SltCap:	AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug- Surprise-
			Slot #21, PowerLimit 0.000W; Interlock- NoCompl-
		SltCtl:	Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq- LinkChg-
			Control: AttnInd Off, PwrInd Off, Power- Interlock-
		SltSta:	Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet- Interlock-
			Changed: MRL- PresDet- LinkState-
		RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna- CRSVisible-
		RootCap: CRSVisible-
		RootSta: PME ReqID 0000, PMEStatus- PMEPending-
		DevCap2: Completion Timeout: Range BCD, TimeoutDis+ ARIFwd+
		DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- ARIFwd-
		LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-,
Selectable De-emphasis: -3.5dB
			 Transmit Margin: Normal Operating Range, EnterModifiedCompliance-
ComplianceSOS-
			 Compliance De-emphasis: -6dB
		LnkSta2: Current De-emphasis Level: -6dB
	Capabilities: [e0] Power Management version 3
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [100 v1] Advanced Error Reporting
		UESta:	DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF-
MalfTLP- ECRC- UnsupReq- ACSViol-
		UEMsk:	DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF-
MalfTLP- ECRC- UnsupReq+ ACSViol-
		UESvrt:	DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+
MalfTLP+ ECRC- UnsupReq- ACSViol-
		CESta:	RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
		CEMsk:	RxErr+ BadTLP+ BadDLLP+ Rollover+ Timeout+ NonFatalErr+
		AERCap:	First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
	Capabilities: [150 v1] Access Control Services
		ACSCap:	SrcValid+ TransBlk+ ReqRedir+ CmpltRedir+ UpstreamFwd+
EgressCtrl- DirectTrans-
		ACSCtl:	SrcValid- TransBlk- ReqRedir- CmpltRedir- UpstreamFwd-
EgressCtrl- DirectTrans-
	Kernel driver in use: pcieport

00:08.0 System peripheral: Intel Corporation Core Processor System
Management Registers (rev 11)
	Subsystem: Device 0086:00ec
	Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Capabilities: [40] Express (v2) Root Complex Integrated Endpoint, MSI 00
		DevCap:	MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
			ExtTag- RBE+ FLReset-
		DevCtl:	Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
		LnkCap:	Port #0, Speed unknown, Width x0, ASPM L0s, Latency L0
unlimited, L1 unlimited
			ClockPM- Surprise+ LLActRep+ BwNot+
		LnkCtl:	ASPM Disabled; Disabled- Retrain- CommClk-
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed unknown, Width x0, TrErr- Train- SlotClk+ DLActive-
BWMgmt- ABWMgmt-
		DevCap2: Completion Timeout: Not Supported, TimeoutDis-
		DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-
		LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-,
Selectable De-emphasis: -6dB
			 Transmit Margin: Normal Operating Range, EnterModifiedCompliance-
ComplianceSOS-
			 Compliance De-emphasis: -6dB
		LnkSta2: Current De-emphasis Level: -6dB
	Capabilities: [100 v0] Vendor Specific Information: ID=0000 Rev=0 Len=000 <?>

00:08.1 System peripheral: Intel Corporation Core Processor Semaphore
and Scratchpad Registers (rev 11)
	Subsystem: Device 0086:00ec
	Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Capabilities: [40] Express (v2) Root Complex Integrated Endpoint, MSI 00
		DevCap:	MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
			ExtTag- RBE+ FLReset-
		DevCtl:	Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
		LnkCap:	Port #0, Speed unknown, Width x0, ASPM L0s, Latency L0
unlimited, L1 unlimited
			ClockPM- Surprise+ LLActRep+ BwNot+
		LnkCtl:	ASPM Disabled; Disabled- Retrain- CommClk-
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed unknown, Width x0, TrErr- Train- SlotClk+ DLActive-
BWMgmt- ABWMgmt-
		DevCap2: Completion Timeout: Not Supported, TimeoutDis-
		DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-
		LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-,
Selectable De-emphasis: -6dB
			 Transmit Margin: Normal Operating Range, EnterModifiedCompliance-
ComplianceSOS-
			 Compliance De-emphasis: -6dB
		LnkSta2: Current De-emphasis Level: -6dB
	Capabilities: [100 v0] Vendor Specific Information: ID=0000 Rev=0 Len=000 <?>

00:08.2 System peripheral: Intel Corporation Core Processor System
Control and Status Registers (rev 11)
	Subsystem: Device 0086:00ec
	Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Capabilities: [40] Express (v2) Root Complex Integrated Endpoint, MSI 00
		DevCap:	MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
			ExtTag- RBE+ FLReset-
		DevCtl:	Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
		LnkCap:	Port #0, Speed unknown, Width x0, ASPM L0s, Latency L0
unlimited, L1 unlimited
			ClockPM- Surprise+ LLActRep+ BwNot+
		LnkCtl:	ASPM Disabled; Disabled- Retrain- CommClk-
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed unknown, Width x0, TrErr- Train- SlotClk+ DLActive-
BWMgmt- ABWMgmt-
		DevCap2: Completion Timeout: Not Supported, TimeoutDis-
		DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-
		LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-,
Selectable De-emphasis: -6dB
			 Transmit Margin: Normal Operating Range, EnterModifiedCompliance-
ComplianceSOS-
			 Compliance De-emphasis: -6dB
		LnkSta2: Current De-emphasis Level: -6dB
	Capabilities: [100 v0] Vendor Specific Information: ID=0000 Rev=0 Len=000 <?>

00:08.3 System peripheral: Intel Corporation Core Processor
Miscellaneous Registers (rev 11)
	Subsystem: Device 0086:00ec
	Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-

00:10.0 System peripheral: Intel Corporation Core Processor QPI Link (rev 11)
	Subsystem: Device 0086:00ec
	Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-

00:10.1 System peripheral: Intel Corporation Core Processor QPI
Routing and Protocol Registers (rev 11)
	Subsystem: Device 0086:00ec
	Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-

00:19.0 Ethernet controller: Intel Corporation 82578DM Gigabit Network
Connection (rev 05)
	Subsystem: Intel Corporation Device 34ec
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin A routed to IRQ 1251
	Region 0: Memory at b3b00000 (32-bit, non-prefetchable) [size=128K]
	Region 1: Memory at b3b24000 (32-bit, non-prefetchable) [size=4K]
	Region 2: I/O ports at 3020 [size=32]
	Capabilities: [c8] Power Management version 2
		Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=1 PME-
	Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
		Address: 00000000fee0100c  Data: 41b1
	Capabilities: [e0] PCI Advanced Features
		AFCap: TP+ FLR+
		AFCtrl: FLR-
		AFStatus: TP-
	Kernel driver in use: e1000e

00:1a.0 USB Controller: Intel Corporation 5 Series/3400 Series Chipset
USB2 Enhanced Host Controller (rev 05) (prog-if 20 [EHCI])
	Subsystem: Intel Corporation Device 34ec
	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR+ FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin A routed to IRQ 21
	Region 0: Memory at b3b21000 (32-bit, non-prefetchable) [size=1K]
	Capabilities: [50] Power Management version 2
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [58] Debug port: BAR=1 offset=00a0
	Capabilities: [98] PCI Advanced Features
		AFCap: TP+ FLR+
		AFCtrl: FLR-
		AFStatus: TP-
	Kernel driver in use: ehci_hcd

00:1c.0 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI
Express Root Port 1 (rev 05) (prog-if 00 [Normal decode])
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR+ FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Bus: primary=00, secondary=02, subordinate=02, sec-latency=0
	I/O behind bridge: 0000f000-00000fff
	Memory behind bridge: fff00000-000fffff
	Prefetchable memory behind bridge: 00000000fff00000-00000000000fffff
	Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort+ <SERR- <PERR-
	BridgeCtl: Parity+ SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
		PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
	Capabilities: [40] Express (v2) Root Port (Slot+), MSI 00
		DevCap:	MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
			ExtTag- RBE+ FLReset-
		DevCtl:	Report errors: Correctable+ Non-Fatal+ Fatal+ Unsupported-
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend-
		LnkCap:	Port #1, Speed 2.5GT/s, Width x4, ASPM L0s L1, Latency L0
<1us, L1 <4us
			ClockPM- Surprise- LLActRep+ BwNot-
		LnkCtl:	ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk-
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed 2.5GT/s, Width x0, TrErr- Train- SlotClk+ DLActive-
BWMgmt- ABWMgmt-
		SltCap:	AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug- Surprise+
			Slot #0, PowerLimit 25.000W; Interlock- NoCompl+
		SltCtl:	Enable: AttnBtn- PwrFlt- MRL- PresDet+ CmdCplt- HPIrq- LinkChg-
			Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock-
		SltSta:	Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet+ Interlock-
			Changed: MRL- PresDet- LinkState-
		RootCtl: ErrCorrectable+ ErrNon-Fatal+ ErrFatal+ PMEIntEna- CRSVisible-
		RootCap: CRSVisible-
		RootSta: PME ReqID 0000, PMEStatus- PMEPending-
		DevCap2: Completion Timeout: Range BC, TimeoutDis+ ARIFwd-
		DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- ARIFwd-
		LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-,
Selectable De-emphasis: -6dB
			 Transmit Margin: Normal Operating Range, EnterModifiedCompliance-
ComplianceSOS-
			 Compliance De-emphasis: -6dB
		LnkSta2: Current De-emphasis Level: -6dB
	Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
		Address: fee0100c  Data: 4141
	Capabilities: [90] Subsystem: Intel Corporation Device 34ec
	Capabilities: [a0] Power Management version 2
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Kernel driver in use: pcieport

00:1c.4 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI
Express Root Port 5 (rev 05) (prog-if 00 [Normal decode])
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR+ FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Bus: primary=00, secondary=03, subordinate=03, sec-latency=0
	I/O behind bridge: 00001000-00001fff
	Memory behind bridge: b3900000-b39fffff
	Prefetchable memory behind bridge: 00000000fff00000-00000000000fffff
	Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- <SERR- <PERR-
	BridgeCtl: Parity+ SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
		PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
	Capabilities: [40] Express (v2) Root Port (Slot-), MSI 00
		DevCap:	MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
			ExtTag- RBE+ FLReset-
		DevCtl:	Report errors: Correctable+ Non-Fatal+ Fatal+ Unsupported-
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend-
		LnkCap:	Port #5, Speed 2.5GT/s, Width x1, ASPM L0s L1, Latency L0
<256ns, L1 <4us
			ClockPM- Surprise- LLActRep+ BwNot-
		LnkCtl:	ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive+
BWMgmt- ABWMgmt-
		RootCtl: ErrCorrectable+ ErrNon-Fatal+ ErrFatal+ PMEIntEna- CRSVisible-
		RootCap: CRSVisible-
		RootSta: PME ReqID 0000, PMEStatus- PMEPending-
		DevCap2: Completion Timeout: Range BC, TimeoutDis+ ARIFwd-
		DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- ARIFwd-
		LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-,
Selectable De-emphasis: -6dB
			 Transmit Margin: Normal Operating Range, EnterModifiedCompliance-
ComplianceSOS-
			 Compliance De-emphasis: -6dB
		LnkSta2: Current De-emphasis Level: -6dB
	Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
		Address: fee0100c  Data: 4149
	Capabilities: [90] Subsystem: Intel Corporation Device 34ec
	Capabilities: [a0] Power Management version 2
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Kernel driver in use: pcieport

00:1c.6 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI
Express Root Port 7 (rev 05) (prog-if 00 [Normal decode])
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort+
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Bus: primary=00, secondary=04, subordinate=04, sec-latency=0
	I/O behind bridge: 0000f000-00000fff
	Memory behind bridge: b3000000-b38fffff
	Prefetchable memory behind bridge: 00000000b2000000-00000000b2ffffff
	Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort+ <MAbort- <SERR- <PERR-
	BridgeCtl: Parity- SERR- NoISA- VGA+ MAbort- >Reset- FastB2B-
		PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
	Capabilities: [40] Express (v2) Root Port (Slot-), MSI 00
		DevCap:	MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
			ExtTag- RBE+ FLReset-
		DevCtl:	Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr- UncorrErr+ FatalErr- UnsuppReq- AuxPwr+ TransPend-
		LnkCap:	Port #7, Speed 2.5GT/s, Width x1, ASPM L0s L1, Latency L0
<256ns, L1 <4us
			ClockPM- Surprise- LLActRep+ BwNot-
		LnkCtl:	ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive+
BWMgmt- ABWMgmt-
		RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna- CRSVisible-
		RootCap: CRSVisible-
		RootSta: PME ReqID 0000, PMEStatus- PMEPending-
		DevCap2: Completion Timeout: Range BC, TimeoutDis+ ARIFwd-
		DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- ARIFwd-
		LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-,
Selectable De-emphasis: -6dB
			 Transmit Margin: Normal Operating Range, EnterModifiedCompliance-
ComplianceSOS-
			 Compliance De-emphasis: -6dB
		LnkSta2: Current De-emphasis Level: -6dB
	Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
		Address: fee0100c  Data: 4151
	Capabilities: [90] Subsystem: Intel Corporation Device 34ec
	Capabilities: [a0] Power Management version 2
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Kernel driver in use: pcieport

00:1c.7 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI
Express Root Port 8 (rev 05) (prog-if 00 [Normal decode])
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR+ FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Bus: primary=00, secondary=05, subordinate=05, sec-latency=0
	I/O behind bridge: 0000f000-00000fff
	Memory behind bridge: fff00000-000fffff
	Prefetchable memory behind bridge: 00000000fff00000-00000000000fffff
	Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort+ <SERR- <PERR-
	BridgeCtl: Parity+ SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
		PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
	Capabilities: [40] Express (v2) Root Port (Slot+), MSI 00
		DevCap:	MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
			ExtTag- RBE+ FLReset-
		DevCtl:	Report errors: Correctable+ Non-Fatal+ Fatal+ Unsupported-
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend-
		LnkCap:	Port #8, Speed 2.5GT/s, Width x1, ASPM L0s L1, Latency L0
<1us, L1 <4us
			ClockPM- Surprise- LLActRep+ BwNot-
		LnkCtl:	ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk-
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed 2.5GT/s, Width x0, TrErr- Train- SlotClk+ DLActive-
BWMgmt- ABWMgmt-
		SltCap:	AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug- Surprise+
			Slot #7, PowerLimit 10.000W; Interlock- NoCompl+
		SltCtl:	Enable: AttnBtn- PwrFlt- MRL- PresDet+ CmdCplt- HPIrq- LinkChg-
			Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock-
		SltSta:	Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet+ Interlock-
			Changed: MRL- PresDet- LinkState-
		RootCtl: ErrCorrectable+ ErrNon-Fatal+ ErrFatal+ PMEIntEna- CRSVisible-
		RootCap: CRSVisible-
		RootSta: PME ReqID 0000, PMEStatus- PMEPending-
		DevCap2: Completion Timeout: Range BC, TimeoutDis+ ARIFwd-
		DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- ARIFwd-
		LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-,
Selectable De-emphasis: -6dB
			 Transmit Margin: Normal Operating Range, EnterModifiedCompliance-
ComplianceSOS-
			 Compliance De-emphasis: -6dB
		LnkSta2: Current De-emphasis Level: -6dB
	Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
		Address: fee0100c  Data: 4159
	Capabilities: [90] Subsystem: Intel Corporation Device 34ec
	Capabilities: [a0] Power Management version 2
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Kernel driver in use: pcieport

00:1d.0 USB Controller: Intel Corporation 5 Series/3400 Series Chipset
USB2 Enhanced Host Controller (rev 05) (prog-if 20 [EHCI])
	Subsystem: Intel Corporation Device 34ec
	Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR+ FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin A routed to IRQ 23
	Region 0: Memory at b3b20000 (32-bit, non-prefetchable) [size=1K]
	Capabilities: [50] Power Management version 2
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [58] Debug port: BAR=1 offset=00a0
	Capabilities: [98] PCI Advanced Features
		AFCap: TP+ FLR+
		AFCtrl: FLR-
		AFStatus: TP-
	Kernel driver in use: ehci_hcd

00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev a5)
(prog-if 01 [Subtractive decode])
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR+ FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Bus: primary=00, secondary=06, subordinate=06, sec-latency=32
	I/O behind bridge: 0000f000-00000fff
	Memory behind bridge: fff00000-000fffff
	Prefetchable memory behind bridge: 00000000fff00000-00000000000fffff
	Secondary status: 66MHz- FastB2B+ ParErr- DEVSEL=medium >TAbort-
<TAbort- <MAbort+ <SERR- <PERR-
	BridgeCtl: Parity+ SERR+ NoISA- VGA- MAbort- >Reset- FastB2B-
		PriDiscTmr- SecDiscTmr+ DiscTmrStat- DiscTmrSERREn+
	Capabilities: [50] Subsystem: Intel Corporation Device 34ec

00:1f.0 ISA bridge: Intel Corporation 3400 Series Chipset LPC
Interface Controller (rev 05)
	Subsystem: Intel Corporation Device 34ec
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR+ FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Capabilities: [e0] Vendor Specific Information: Len=10 <?>

00:1f.2 IDE interface: Intel Corporation 5 Series/3400 Series Chipset
4 port SATA IDE Controller (rev 05) (prog-if 8f [Master SecP SecO PriP
PriO])
	Subsystem: Intel Corporation Device 34ec
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin B routed to IRQ 18
	Region 0: I/O ports at 3098 [size=8]
	Region 1: I/O ports at 30ac [size=4]
	Region 2: I/O ports at 3090 [size=8]
	Region 3: I/O ports at 30a8 [size=4]
	Region 4: I/O ports at 3070 [size=16]
	Region 5: I/O ports at 3060 [size=16]
	Capabilities: [70] Power Management version 3
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
		Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [b0] PCI Advanced Features
		AFCap: TP+ FLR+
		AFCtrl: FLR-
		AFStatus: TP-
	Kernel driver in use: ata_piix

00:1f.3 SMBus: Intel Corporation 5 Series/3400 Series Chipset SMBus
Controller (rev 05)
	Subsystem: Intel Corporation Device 34ec
	Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Interrupt: pin B routed to IRQ 18
	Region 0: Memory at b3b22000 (64-bit, non-prefetchable) [size=256]
	Region 4: I/O ports at 3000 [size=32]
	Kernel driver in use: i801_smbus

00:1f.5 IDE interface: Intel Corporation 5 Series/3400 Series Chipset
2 port SATA IDE Controller (rev 05) (prog-if 85 [Master SecO PriO])
	Subsystem: Intel Corporation Device 34ec
	Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin D routed to IRQ 22
	Region 0: I/O ports at 3088 [size=8]
	Region 1: I/O ports at 30a4 [size=4]
	Region 2: I/O ports at 3080 [size=8]
	Region 3: I/O ports at 30a0 [size=4]
	Region 4: I/O ports at 3050 [size=16]
	Region 5: I/O ports at 3040 [size=16]
	Capabilities: [70] Power Management version 3
		Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
		Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [b0] PCI Advanced Features
		AFCap: TP+ FLR+
		AFCtrl: FLR-
		AFStatus: TP-
	Kernel driver in use: ata_piix

01:00.0 RAID bus controller: 3ware Inc 9690SA SAS/SATA-II RAID PCIe (rev 01)
	Subsystem: 3ware Inc 9690SA SAS/SATA-II RAID PCIe
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0, Cache Line Size: 64 bytes
	Interrupt: pin A routed to IRQ 16
	Region 0: Memory at b0000000 (64-bit, prefetchable) [size=32M]
	Region 2: Memory at b3a00000 (64-bit, non-prefetchable) [size=4K]
	Region 4: I/O ports at 2000 [size=256]
	Expansion ROM at b3a20000 [disabled] [size=128K]
	Capabilities: [40] Power Management version 2
		Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [50] MSI: Enable- Count=1/32 Maskable- 64bit+
		Address: 0000000000000000  Data: 0000
	Capabilities: [70] Express (v1) Legacy Endpoint, MSI 00
		DevCap:	MaxPayload 512 bytes, PhantFunc 0, Latency L0s <128ns, L1 <2us
			ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
		DevCtl:	Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
			RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+
			MaxPayload 128 bytes, MaxReadReq 512 bytes
		DevSta:	CorrErr+ UncorrErr- FatalErr- UnsuppReq+ AuxPwr- TransPend-
		LnkCap:	Port #0, Speed 2.5GT/s, Width x8, ASPM L0s L1, Latency L0
<512ns, L1 <64us
			ClockPM- Surprise- LLActRep+ BwNot-
		LnkCtl:	ASPM Disabled; RCB 128 bytes Disabled- Retrain- CommClk-
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed 2.5GT/s, Width x8, TrErr- Train- SlotClk- DLActive+
BWMgmt- ABWMgmt-
	Capabilities: [100 v1] Advanced Error Reporting
		UESta:	DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF-
MalfTLP- ECRC- UnsupReq+ ACSViol-
		UEMsk:	DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF-
MalfTLP- ECRC- UnsupReq- ACSViol-
		UESvrt:	DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+
MalfTLP+ ECRC- UnsupReq- ACSViol-
		CESta:	RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
		CEMsk:	RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
		AERCap:	First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn-
	Kernel driver in use: 3w-9xxx

03:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection
	Subsystem: Intel Corporation Device 34ec
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx+
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0, Cache Line Size: 64 bytes
	Interrupt: pin A routed to IRQ 16
	Region 0: Memory at b3900000 (32-bit, non-prefetchable) [size=128K]
	Region 2: I/O ports at 1000 [size=32]
	Region 3: Memory at b3920000 (32-bit, non-prefetchable) [size=16K]
	Capabilities: [c8] Power Management version 2
		Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=1 PME-
	Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+
		Address: 0000000000000000  Data: 0000
	Capabilities: [e0] Express (v1) Endpoint, MSI 00
		DevCap:	MaxPayload 256 bytes, PhantFunc 0, Latency L0s <512ns, L1 <64us
			ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
		DevCtl:	Report errors: Correctable+ Non-Fatal+ Fatal+ Unsupported+
			RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+
			MaxPayload 128 bytes, MaxReadReq 512 bytes
		DevSta:	CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend-
		LnkCap:	Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Latency L0
<128ns, L1 <64us
			ClockPM- Surprise- LLActRep- BwNot-
		LnkCtl:	ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive-
BWMgmt- ABWMgmt-
	Capabilities: [a0] MSI-X: Enable+ Count=5 Masked-
		Vector table: BAR=3 offset=00000000
		PBA: BAR=3 offset=00002000
	Capabilities: [100 v1] Advanced Error Reporting
		UESta:	DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF-
MalfTLP- ECRC- UnsupReq- ACSViol-
		UEMsk:	DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF-
MalfTLP- ECRC- UnsupReq- ACSViol-
		UESvrt:	DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+
MalfTLP+ ECRC- UnsupReq- ACSViol-
		CESta:	RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-
		CEMsk:	RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
		AERCap:	First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
	Capabilities: [140 v1] Device Serial Number 00-1e-67-ff-ff-02-c2-ca
	Kernel driver in use: e1000e

04:00.0 VGA compatible controller: Matrox Graphics, Inc. MGA G200e
[Pilot] ServerEngines (SEP1) (rev 02) (prog-if 00 [VGA controller])
	Subsystem: Intel Corporation Device 0101
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr-
Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort-
<TAbort+ <MAbort- >SERR- <PERR- INTx-
	Latency: 0, Cache Line Size: 64 bytes
	Interrupt: pin A routed to IRQ 11
	Region 0: Memory at b2000000 (32-bit, prefetchable) [size=16M]
	Region 1: Memory at b3800000 (32-bit, non-prefetchable) [size=16K]
	Region 2: Memory at b3000000 (32-bit, non-prefetchable) [size=8M]
	Expansion ROM at b3810000 [disabled] [size=64K]
	Capabilities: [dc] Power Management version 2
		Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
		Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
	Capabilities: [e4] Express (v1) Legacy Endpoint, MSI 00
		DevCap:	MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
			ExtTag- AttnBtn- AttnInd- PwrInd- RBE- FLReset-
		DevCtl:	Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
			RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop-
			MaxPayload 128 bytes, MaxReadReq 128 bytes
		DevSta:	CorrErr+ UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-
		LnkCap:	Port #0, Speed 2.5GT/s, Width x1, ASPM L0s, Latency L0 <64ns, L1 <1us
			ClockPM- Surprise- LLActRep- BwNot-
		LnkCtl:	ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+
			ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
		LnkSta:	Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive-
BWMgmt- ABWMgmt-
	Capabilities: [54] MSI: Enable- Count=1/1 Maskable- 64bit-
		Address: 00000000  Data: 0000



### dmidecode

# dmidecode 2.9
SMBIOS 2.5 present.
64 structures occupying 2689 bytes.
Table at 0x9F6A4000.

Handle 0x0001, DMI type 38, 20 bytes
IPMI Device Information
	Interface Type: KCS (Keyboard Control Style)
	Specification Version: 2.0
	I2C Slave Address: 0x10
	NV Storage Device: Not Present
	Base Address: 0x0000000000000CA2 (I/O)
	Register Spacing: Successive Byte Boundaries

Handle 0x0002, DMI type 1, 27 bytes
System Information
	Manufacturer: Intel Corporation
	Product Name: S3420GP
	Version: ....................
	Serial Number: ............
	UUID: 0FD8E440-1952-11E0-B578-001E6702C2CA
	Wake-up Type: Power Switch
	SKU Number: Not Specified
	Family: Not Specified

Handle 0x0003, DMI type 2, 16 bytes
Base Board Information
	Manufacturer: Intel Corporation
	Product Name: S3420GP
	Version: E51976-406
	Serial Number: AZGP10200424
	Asset Tag: ....................
	Features:
		Board is a hosting board
		Board is replaceable
	Location In Chassis: Not Specified
	Chassis Handle: 0x0004
	Type: Motherboard
	Contained Object Handles: 0

Handle 0x0004, DMI type 3, 22 bytes
Chassis Information
	Manufacturer: ..............................
	Type: Main Server Chassis
	Lock: Not Present
	Version: ..................
	Serial Number: ..................
	Asset Tag: ....................
	Boot-up State: Safe
	Power Supply State: Safe
	Thermal State: Safe
	Security Status: Unknown
	OEM Information: 0x01000181
	Height: 1 U
	Number Of Power Cords: 1
	Contained Elements: 0

Handle 0x0005, DMI type 0, 24 bytes
BIOS Information
	Vendor: Intel Corp.
	Version: S3420GP.86B.01.00.0046.092920101143
	Release Date: 09/29/2010
	Address: 0xF0000
	Runtime Size: 64 kB
	ROM Size: 8192 kB
	Characteristics:
		PCI is supported
		PNP is supported
		BIOS is upgradeable
		BIOS shadowing is allowed
		Boot from CD is supported
		Selectable boot is supported
		EDD is supported
		3.5"/2.88 MB floppy services are supported (int 13h)
		Print screen service is supported (int 5h)
		8042 keyboard services are supported (int 9h)
		Serial services are supported (int 14h)
		CGA/mono video services are supported (int 10h)
		ACPI is supported
		USB legacy is supported
		LS-120 boot is supported
		ATAPI Zip drive boot is supported
		Function key-initiated network boot is supported
		Targeted content distribution is supported
	BIOS Revision: 17.18
	Firmware Revision: 0.0

Handle 0x0006, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J8A1 - SERIAL A
	Internal Connector Type: Other
	External Reference Designator: SERIAL A
	External Connector Type: DB-9 male
	Port Type: Serial Port 16550A Compatible

Handle 0x0007, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1B2 - SERIAL B
	Internal Connector Type: 9 Pin Dual Inline (pin 10 cut)
	External Reference Designator: SERIAL B
	External Connector Type: None
	Port Type: Serial Port 16550A Compatible

Handle 0x0008, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J7A1 - VGA
	Internal Connector Type: None
	External Reference Designator: VGA
	External Connector Type: DB-15 female
	Port Type: Video Port

Handle 0x0009, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J6A1 - USB 0
	Internal Connector Type: None
	External Reference Designator: USB 0
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x000A, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J6A1 - USB 1
	Internal Connector Type: None
	External Reference Designator: USB 1
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x000B, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J5A1 - USB 2
	Internal Connector Type: None
	External Reference Designator: USB 2
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x000C, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J5A1 - USB 3
	Internal Connector Type: None
	External Reference Designator: USB 3
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x000D, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J3F2 - USB SSD
	Internal Connector Type: None
	External Reference Designator: USB SSD
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x000E, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1J2 - USB 5 FLOPPY
	Internal Connector Type: None
	External Reference Designator: USB 5 FLOPPY
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x000F, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1D1 - USB 6
	Internal Connector Type: None
	External Reference Designator: USB 6
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x0010, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1D1 - USB 7
	Internal Connector Type: None
	External Reference Designator: USB 7
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x0011, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1E1 - USB 8
	Internal Connector Type: None
	External Reference Designator: USB 8
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x0012, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1E1 - USB 9
	Internal Connector Type: None
	External Reference Designator: USB 9
	External Connector Type: Access Bus (USB)
	Port Type: USB

Handle 0x0013, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J6A1 - NIC 1
	Internal Connector Type: None
	External Reference Designator: NIC 1
	External Connector Type: RJ-45
	Port Type: Network Port

Handle 0x0014, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J5A1 - NIC 2
	Internal Connector Type: None
	External Reference Designator: NIC 2
	External Connector Type: RJ-45
	Port Type: Network Port

Handle 0x0015, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1H4 - 1x7 Pin SATA 0
	Internal Connector Type: Other
	External Reference Designator: SATA 0
	External Connector Type: None
	Port Type: Other

Handle 0x0016, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1H1 - 1x7 Pin SATA 1
	Internal Connector Type: Other
	External Reference Designator: SATA 1
	External Connector Type: None
	Port Type: Other

Handle 0x0017, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1G1 - 1x7 Pin SATA 2
	Internal Connector Type: Other
	External Reference Designator: SATA 2
	External Connector Type: None
	Port Type: Other

Handle 0x0018, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1H3 - 1x7 Pin SATA 3
	Internal Connector Type: Other
	External Reference Designator: SATA 3
	External Connector Type: None
	Port Type: Other

Handle 0x0019, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1G3 - 1x7 Pin SATA 4
	Internal Connector Type: Other
	External Reference Designator: SATA 4
	External Connector Type: None
	Port Type: Other

Handle 0x001A, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1F4 - 1x7 Pin SATA 5
	Internal Connector Type: Other
	External Reference Designator: SATA 5
	External Connector Type: None
	Port Type: Other

Handle 0x001B, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1C1 - 24-Pin Male Front Panel
	Internal Connector Type: Other
	External Reference Designator: Front Panel
	External Connector Type: None
	Port Type: Other

Handle 0x001C, DMI type 8, 9 bytes
Port Connector Information
	Internal Reference Designator: J1H2 4-Pin Male IPMB
	Internal Connector Type: Other
	External Reference Designator: IPMB
	External Connector Type: None
	Port Type: Other

Handle 0x001D, DMI type 9, 13 bytes
System Slot Information
	Designation: PCI SLOT1
	Type: 32-bit PCI
	Current Usage: Available
	Length: Long
	ID: 1
	Characteristics:
		3.3 V is provided
		PME signal is supported

Handle 0x001E, DMI type 9, 13 bytes
System Slot Information
	Designation: PCI-E SLOT3
	Type: x4 PCI Express
	Current Usage: Available
	Length: Long
	ID: 3
	Characteristics:
		3.3 V is provided
		PME signal is supported

Handle 0x001F, DMI type 9, 13 bytes
System Slot Information
	Designation: PCI-E SLOT5
	Type: x8 PCI Express
	Current Usage: Available
	Length: Long
	ID: 5
	Characteristics:
		3.3 V is provided
		PME signal is supported

Handle 0x0020, DMI type 9, 13 bytes
System Slot Information
	Designation: PCI-E SLOT6
	Type: x16 PCI Express
	Current Usage: In Use
	Length: Long
	ID: 6
	Characteristics:
		3.3 V is provided
		PME signal is supported

Handle 0x0021, DMI type 10, 6 bytes
On Board Device Information
	Type: Video
	Status: Enabled
	Description: ServerEngines Pilot II

Handle 0x0022, DMI type 10, 6 bytes
On Board Device Information
	Type: Ethernet
	Status: Enabled
	Description: Intel 82574L

Handle 0x0023, DMI type 10, 6 bytes
On Board Device Information
	Type: Ethernet
	Status: Enabled
	Description: Intel 82578DM

Handle 0x0024, DMI type 10, 6 bytes
On Board Device Information
	Type: SATA Controller
	Status: Enabled
	Description: PCH Integrated SATA Controller

Handle 0x0025, DMI type 12, 5 bytes
System Configuration Options
	Option 1: J1F2 2-3: Close to clear Password

Handle 0x0026, DMI type 12, 5 bytes
System Configuration Options
	Option 1: J1F5 2-3: Close to clear CMOS

Handle 0x0027, DMI type 12, 5 bytes
System Configuration Options
	Option 1: J1F3 2-3: Close for BIOS Recovery

Handle 0x0028, DMI type 12, 5 bytes
System Configuration Options
	Option 1: J1A2 2-3: Close to Force BMC Update Mode

Handle 0x0029, DMI type 12, 5 bytes
System Configuration Options
	Option 1: J1F1 2-3: Close to Force ME Update Mode

Handle 0x002A, DMI type 24, 5 bytes
Hardware Security
	Power-On Password Status: Disabled
	Keyboard Password Status: Disabled
	Administrator Password Status: Disabled
	Front Panel Reset Status: Disabled

Handle 0x002B, DMI type 13, 22 bytes
BIOS Language Information
	Installable Languages: 1
		en|US|iso8859-1
	Currently Installed Language: en|US|iso8859-1

Handle 0x002C, DMI type 11, 5 bytes
OEM Strings
	String 1:
	String 2:
	String 3:
	String 4:
	String 5:

Handle 0x002D, DMI type 32, 20 bytes
System Boot Information
	Status: No errors detected

Handle 0x002E, DMI type 16, 15 bytes
Physical Memory Array
	Location: System Board Or Motherboard
	Use: System Memory
	Error Correction Type: Multi-bit ECC
	Maximum Capacity: 32 GB
	Error Information Handle: Not Provided
	Number Of Devices: 6

Handle 0x002F, DMI type 19, 15 bytes
Memory Array Mapped Address
	Starting Address: 0x00000000000
	Ending Address: 0x003FFFFFFFF
	Range Size: 16 GB
	Physical Array Handle: 0x002E
	Partition Width: 0

Handle 0x0030, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x002E
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 4096 MB
	Form Factor: DIMM
	Set: 1
	Locator: DIMM_A1
	Bank Locator: NODE 0 CHANNEL 0 DIMM 0
	Type: Other
	Type Detail: Synchronous
	Speed: 1333 MHz (0.8 ns)
	Manufacturer: 0x0198
	Serial Number: 0x40247588
	Asset Tag: Unknown
	Part Number: 9965413-002.A00LF

Handle 0x0031, DMI type 20, 19 bytes
Memory Device Mapped Address
	Starting Address: 0x00000000000
	Ending Address: 0x000FFFFFFFF
	Range Size: 4 GB
	Physical Device Handle: 0x0030
	Memory Array Mapped Address Handle: 0x002F
	Partition Row Position: 1
	Interleave Position: 1
	Interleaved Data Depth: 1

Handle 0x0032, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x002E
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 4096 MB
	Form Factor: DIMM
	Set: 2
	Locator: DIMM_A2
	Bank Locator: NODE 0 CHANNEL 0 DIMM 1
	Type: Other
	Type Detail: Synchronous
	Speed: 1333 MHz (0.8 ns)
	Manufacturer: 0x0198
	Serial Number: 0x4324FA41
	Asset Tag: Unknown
	Part Number: 9965413-002.A00LF

Handle 0x0033, DMI type 20, 19 bytes
Memory Device Mapped Address
	Starting Address: 0x00100000000
	Ending Address: 0x001FFFFFFFF
	Range Size: 4 GB
	Physical Device Handle: 0x0032
	Memory Array Mapped Address Handle: 0x002F
	Partition Row Position: 1
	Interleave Position: 1
	Interleaved Data Depth: 1

Handle 0x0034, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x002E
	Error Information Handle: Not Provided
	Total Width: Unknown
	Data Width: Unknown
	Size: No Module Installed
	Form Factor: DIMM
	Set: 3
	Locator: DIMM_A3
	Bank Locator: NODE 0 CHANNEL 0 DIMM 2
	Type: Other
	Type Detail: Synchronous
	Speed: 1333 MHz (0.8 ns)
	Manufacturer: NO DIMM
	Serial Number: NO DIMM
	Asset Tag: NO DIMM
	Part Number: NO DIMM

Handle 0x0035, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x002E
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 4096 MB
	Form Factor: DIMM
	Set: 1
	Locator: DIMM_B1
	Bank Locator: NODE 0 CHANNEL 1 DIMM 0
	Type: Other
	Type Detail: Synchronous
	Speed: 1333 MHz (0.8 ns)
	Manufacturer: 0x0198
	Serial Number: 0x4524FB41
	Asset Tag: Unknown
	Part Number: 9965413-002.A00LF

Handle 0x0036, DMI type 20, 19 bytes
Memory Device Mapped Address
	Starting Address: 0x00200000000
	Ending Address: 0x002FFFFFFFF
	Range Size: 4 GB
	Physical Device Handle: 0x0035
	Memory Array Mapped Address Handle: 0x002F
	Partition Row Position: 1
	Interleave Position: 1
	Interleaved Data Depth: 1

Handle 0x0037, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x002E
	Error Information Handle: Not Provided
	Total Width: 72 bits
	Data Width: 64 bits
	Size: 4096 MB
	Form Factor: DIMM
	Set: 2
	Locator: DIMM_B2
	Bank Locator: NODE 0 CHANNEL 1 DIMM 1
	Type: Other
	Type Detail: Synchronous
	Speed: 1333 MHz (0.8 ns)
	Manufacturer: 0x0198
	Serial Number: 0x4524F841
	Asset Tag: Unknown
	Part Number: 9965413-002.A00LF

Handle 0x0038, DMI type 20, 19 bytes
Memory Device Mapped Address
	Starting Address: 0x00300000000
	Ending Address: 0x003FFFFFFFF
	Range Size: 4 GB
	Physical Device Handle: 0x0037
	Memory Array Mapped Address Handle: 0x002F
	Partition Row Position: 1
	Interleave Position: 1
	Interleaved Data Depth: 1

Handle 0x0039, DMI type 17, 27 bytes
Memory Device
	Array Handle: 0x002E
	Error Information Handle: Not Provided
	Total Width: Unknown
	Data Width: Unknown
	Size: No Module Installed
	Form Factor: DIMM
	Set: 3
	Locator: DIMM_B3
	Bank Locator: NODE 0 CHANNEL 1 DIMM 2
	Type: Other
	Type Detail: Synchronous
	Speed: 1333 MHz (0.8 ns)
	Manufacturer: NO DIMM
	Serial Number: NO DIMM
	Asset Tag: NO DIMM
	Part Number: NO DIMM

Handle 0x003A, DMI type 131, 45 bytes
OEM-specific Type
	Header and Data:
		83 2D 3A 00 01 77 00 00 00 00 00 00 00 33 00 00
		00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
		00 00 00 00 00 00 00 00 00 00 00 00 00

Handle 0x003B, DMI type 4, 40 bytes
Processor Information
	Socket Designation: CPU1
	Type: Central Processor
	Family: Xeon
	Manufacturer: Intel(R) Corporation
	ID: E5 06 01 00 FF FB EB BF
	Signature: Type 0, Family 6, Model 30, Stepping 5
	Flags:
		FPU (Floating-point unit on-chip)
		VME (Virtual mode extension)
		DE (Debugging extension)
		PSE (Page size extension)
		TSC (Time stamp counter)
		MSR (Model specific registers)
		PAE (Physical address extension)
		MCE (Machine check exception)
		CX8 (CMPXCHG8 instruction supported)
		APIC (On-chip APIC hardware supported)
		SEP (Fast system call)
		MTRR (Memory type range registers)
		PGE (Page global enable)
		MCA (Machine check architecture)
		CMOV (Conditional move instruction supported)
		PAT (Page attribute table)
		PSE-36 (36-bit page size extension)
		CLFSH (CLFLUSH instruction supported)
		DS (Debug store)
		ACPI (ACPI supported)
		MMX (MMX technology supported)
		FXSR (Fast floating-point save and restore)
		SSE (Streaming SIMD extensions)
		SSE2 (Streaming SIMD extensions 2)
		SS (Self-snoop)
		HTT (Hyper-threading technology)
		TM (Thermal monitor supported)
		PBE (Pending break enabled)
	Version: Intel(R) Xeon(R) CPU           X3430  @ 2.40GHz
	Voltage: 0.0 V
	External Clock: 133 MHz
	Max Speed: 4000 MHz
	Current Speed: 2400 MHz
	Status: Populated, Enabled
	Upgrade: Other
	L1 Cache Handle: 0x003F
	L2 Cache Handle: 0x003E
	L3 Cache Handle: 0x003C
	Serial Number: Not Specified
	Asset Tag: Not Specified
	Part Number: Not Specified
	Core Count: 4
	Core Enabled: 4
	Thread Count: 8
	Characteristics:
		64-bit capable

Handle 0x003C, DMI type 7, 19 bytes
Cache Information
	Socket Designation: L3-Cache
	Configuration: Enabled, Not Socketed, Level 3
	Operational Mode: Write Back
	Location: Internal
	Installed Size: 8192 KB
	Maximum Size: 8192 KB
	Supported SRAM Types:
		Asynchronous
	Installed SRAM Type: Asynchronous
	Speed: Unknown
	Error Correction Type: Single-bit ECC
	System Type: Unified
	Associativity: 16-way Set-associative

Handle 0x003D, DMI type 7, 19 bytes
Cache Information
	Socket Designation: L1-Cache
	Configuration: Enabled, Not Socketed, Level 1
	Operational Mode: Write Back
	Location: Internal
	Installed Size: 128 KB
	Maximum Size: 128 KB
	Supported SRAM Types:
		Asynchronous
	Installed SRAM Type: Asynchronous
	Speed: Unknown
	Error Correction Type: Single-bit ECC
	System Type: Data
	Associativity: 8-way Set-associative

Handle 0x003E, DMI type 7, 19 bytes
Cache Information
	Socket Designation: L2-Cache
	Configuration: Enabled, Not Socketed, Level 2
	Operational Mode: Write Back
	Location: Internal
	Installed Size: 1024 KB
	Maximum Size: 1024 KB
	Supported SRAM Types:
		Asynchronous
	Installed SRAM Type: Asynchronous
	Speed: Unknown
	Error Correction Type: Single-bit ECC
	System Type: Unified
	Associativity: 8-way Set-associative

Handle 0x003F, DMI type 7, 19 bytes
Cache Information
	Socket Designation: L1-Cache
	Configuration: Enabled, Not Socketed, Level 1
	Operational Mode: Write Back
	Location: Internal
	Installed Size: 128 KB
	Maximum Size: 128 KB
	Supported SRAM Types:
		Asynchronous
	Installed SRAM Type: Asynchronous
	Speed: Unknown
	Error Correction Type: Single-bit ECC
	System Type: Instruction
	Associativity: 4-way Set-associative

Handle 0xFEFF, DMI type 127, 4 bytes
End Of Table



#### .config

#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.32.47
# Fri Dec  2 13:02:03 2011
#
CONFIG_64BIT=y
# CONFIG_X86_32 is not set
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
CONFIG_ZONE_DMA=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_DEFAULT_IDLE=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_HAVE_CPUMASK_OF_CPU_MAP=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ZONE_DMA32=y
CONFIG_ARCH_POPULATES_NODE_MAP=y
CONFIG_AUDIT_ARCH=y
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_PENDING_IRQ=y
CONFIG_USE_GENERIC_SMP_HELPERS=y
CONFIG_X86_64_SMP=y
CONFIG_X86_HT=y
CONFIG_X86_TRAMPOLINE=y
# CONFIG_KTIME_SCALAR is not set
CONFIG_ARCH_CPU_PROBE_RELEASE=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_CONSTRUCTORS=y

#
# General setup
#
CONFIG_EXPERIMENTAL=y
CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
CONFIG_BSD_PROCESS_ACCT=y
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_TREE=y

#
# RCU Subsystem
#
CONFIG_TREE_RCU=y
# CONFIG_TREE_PREEMPT_RCU is not set
# CONFIG_RCU_TRACE is not set
CONFIG_RCU_FANOUT=32
# CONFIG_RCU_FANOUT_EXACT is not set
# CONFIG_TREE_RCU_TRACE is not set
# CONFIG_IKCONFIG is not set
CONFIG_LOG_BUF_SHIFT=18
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_NS=y
CONFIG_CGROUP_FREEZER=y
# CONFIG_CGROUP_DEVICE is not set
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_RESOURCE_COUNTERS=y
# CONFIG_CGROUP_MEM_RES_CTLR is not set
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y
# CONFIG_RT_GROUP_SCHED is not set
# CONFIG_SYSFS_DEPRECATED_V2 is not set
CONFIG_RELAY=y
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
# CONFIG_EMBEDDED is not set
CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_EXTRA_PASS=y
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
CONFIG_HAVE_PERF_EVENTS=y

#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
CONFIG_EVENT_PROFILE=y
# CONFIG_PERF_COUNTERS is not set
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_PCI_QUIRKS=y
CONFIG_SLUB_DEBUG=y
# CONFIG_COMPAT_BRK is not set
# CONFIG_SLAB is not set
CONFIG_SLUB=y
# CONFIG_SLOB is not set
CONFIG_PROFILING=y
CONFIG_TRACEPOINTS=y
# CONFIG_OPROFILE is not set
CONFIG_HAVE_OPROFILE=y
CONFIG_KPROBES=y
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_KRETPROBES=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_ATTRS=y
CONFIG_HAVE_DMA_API_DEBUG=y

#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not set
CONFIG_SLOW_WORK=y
# CONFIG_SLOW_WORK_DEBUG is not set
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
# CONFIG_MODULE_FORCE_LOAD is not set
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_STOP_MACHINE=y
CONFIG_BLOCK=y
CONFIG_BLK_DEV_BSG=y
# CONFIG_BLK_DEV_INTEGRITY is not set
CONFIG_BLOCK_COMPAT=y

#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_DEFAULT_AS is not set
# CONFIG_DEFAULT_DEADLINE is not set
CONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="cfq"
CONFIG_PREEMPT_NOTIFIERS=y
CONFIG_FREEZER=y

#
# Processor type and features
#
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
CONFIG_SMP=y
CONFIG_SPARSE_IRQ=y
CONFIG_X86_MPPARSE=y
CONFIG_X86_EXTENDED_PLATFORM=y
# CONFIG_X86_VSMP is not set
CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_PARAVIRT_GUEST=y
CONFIG_XEN=y
CONFIG_XEN_PVHVM=y
CONFIG_XEN_MAX_DOMAIN_MEMORY=128
CONFIG_XEN_SAVE_RESTORE=y
CONFIG_XEN_DEBUG_FS=y
CONFIG_SWIOTLB_XEN=y
CONFIG_MICROCODE_XEN=y
CONFIG_XEN_DOM0=y
CONFIG_XEN_PRIVILEGED_GUEST=y
CONFIG_XEN_DOM0_PCI=y
# CONFIG_XEN_PCI_PASSTHROUGH is not set
CONFIG_KVM_CLOCK=y
# CONFIG_KVM_GUEST is not set
CONFIG_PARAVIRT=y
# CONFIG_PARAVIRT_SPINLOCKS is not set
CONFIG_PARAVIRT_CLOCK=y
CONFIG_PARAVIRT_DEBUG=y
# CONFIG_MEMTEST is not set
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
# CONFIG_M686 is not set
# CONFIG_MPENTIUMII is not set
# CONFIG_MPENTIUMIII is not set
# CONFIG_MPENTIUMM is not set
# CONFIG_MPENTIUM4 is not set
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MEFFICEON is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MGEODEGX1 is not set
# CONFIG_MGEODE_LX is not set
# CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set
# CONFIG_MVIAC7 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
# CONFIG_MATOM is not set
CONFIG_GENERIC_CPU=y
CONFIG_X86_CPU=y
CONFIG_X86_L1_CACHE_BYTES=64
CONFIG_X86_INTERNODE_CACHE_BYTES=64
CONFIG_X86_CMPXCHG=y
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_X86_XADD=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_TSC=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_CENTAUR=y
# CONFIG_X86_DS is not set
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_DMI=y
CONFIG_GART_IOMMU=y
# CONFIG_CALGARY_IOMMU is not set
# CONFIG_AMD_IOMMU is not set
CONFIG_SWIOTLB=y
CONFIG_IOMMU_HELPER=y
# CONFIG_IOMMU_API is not set
# CONFIG_MAXSMP is not set
CONFIG_NR_CPUS=8
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
# CONFIG_IRQ_TIME_ACCOUNTING is not set
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
CONFIG_X86_MCE=y
# CONFIG_X86_MCE_INTEL is not set
# CONFIG_X86_MCE_AMD is not set
# CONFIG_X86_MCE_INJECT is not set
# CONFIG_I8K is not set
CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=y
CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
CONFIG_DIRECT_GBPAGES=y
# CONFIG_NUMA is not set
CONFIG_ARCH_PROC_KCORE_TEXT=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_FLATMEM_MANUAL is not set
# CONFIG_DISCONTIGMEM_MANUAL is not set
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_HAVE_MEMORY_PRESENT=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
# CONFIG_SPARSEMEM_VMEMMAP is not set
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_HAVE_MLOCK=y
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
CONFIG_MMU_NOTIFIER=y
# CONFIG_KSM is not set
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
# CONFIG_MEMORY_FAILURE is not set
CONFIG_X86_CHECK_BIOS_CORRUPTION=y
CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
CONFIG_X86_RESERVE_LOW_64K=y
CONFIG_MTRR=y
# CONFIG_MTRR_SANITIZER is not set
CONFIG_X86_PAT=y
CONFIG_ARCH_USES_PG_UNCACHED=y
CONFIG_EFI=y
CONFIG_SECCOMP=y
# CONFIG_CC_STACKPROTECTOR is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
CONFIG_SCHED_HRTICK=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
# CONFIG_KEXEC_JUMP is not set
CONFIG_PHYSICAL_START=0x1000000
CONFIG_RELOCATABLE=y
CONFIG_PHYSICAL_ALIGN=0x1000000
CONFIG_HOTPLUG_CPU=y
# CONFIG_COMPAT_VDSO is not set
# CONFIG_CMDLINE_BOOL is not set
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y

#
# Power management and ACPI options
#
CONFIG_ARCH_HIBERNATION_HEADER=y
CONFIG_PM=y
CONFIG_PM_DEBUG=y
# CONFIG_PM_VERBOSE is not set
CONFIG_CAN_PM_TRACE=y
CONFIG_PM_TRACE=y
CONFIG_PM_TRACE_RTC=y
CONFIG_PM_SLEEP_SMP=y
CONFIG_PM_SLEEP=y
CONFIG_SUSPEND=y
# CONFIG_PM_TEST_SUSPEND is not set
CONFIG_SUSPEND_FREEZER=y
CONFIG_HIBERNATION_NVS=y
CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION=""
# CONFIG_PM_RUNTIME is not set
CONFIG_ACPI=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_PROCFS=y
CONFIG_ACPI_PROCFS_POWER=y
# CONFIG_ACPI_POWER_METER is not set
CONFIG_ACPI_SYSFS_POWER=y
CONFIG_ACPI_PROC_EVENT=y
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_VIDEO=y
CONFIG_ACPI_FAN=y
CONFIG_ACPI_DOCK=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_HOTPLUG_CPU=y
# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set
CONFIG_ACPI_THERMAL=y
# CONFIG_ACPI_CUSTOM_DSDT is not set
CONFIG_ACPI_BLACKLIST_YEAR=0
# CONFIG_ACPI_DEBUG is not set
# CONFIG_ACPI_PCI_SLOT is not set
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_CONTAINER=y
# CONFIG_ACPI_SBS is not set
# CONFIG_SFI is not set

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
CONFIG_CPU_FREQ_DEBUG=y
# CONFIG_CPU_FREQ_STAT is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set

#
# CPUFreq processor drivers
#
CONFIG_X86_ACPI_CPUFREQ=y
# CONFIG_X86_POWERNOW_K8 is not set
# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
# CONFIG_X86_P4_CLOCKMOD is not set

#
# shared options
#
# CONFIG_X86_SPEEDSTEP_LIB is not set
CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y

#
# Memory power savings
#
# CONFIG_I7300_IDLE is not set

#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_XEN=y
CONFIG_PCI_DOMAINS=y
# CONFIG_DMAR is not set
# CONFIG_INTR_REMAP is not set
CONFIG_PCIEPORTBUS=y
# CONFIG_HOTPLUG_PCI_PCIE is not set
CONFIG_PCIEAER=y
# CONFIG_PCIE_ECRC is not set
# CONFIG_PCIEAER_INJECT is not set
# CONFIG_PCIEASPM is not set
CONFIG_ARCH_SUPPORTS_MSI=y
CONFIG_PCI_MSI=y
# CONFIG_PCI_LEGACY is not set
# CONFIG_PCI_DEBUG is not set
# CONFIG_PCI_STUB is not set
CONFIG_XEN_PCIDEV_FRONTEND=y
CONFIG_HT_IRQ=y
# CONFIG_PCI_IOV is not set
CONFIG_ISA_DMA_API=y
CONFIG_K8_NB=y
CONFIG_PCCARD=y
# CONFIG_PCMCIA_DEBUG is not set
CONFIG_PCMCIA=y
CONFIG_PCMCIA_LOAD_CIS=y
CONFIG_PCMCIA_IOCTL=y
CONFIG_CARDBUS=y

#
# PC-card bridges
#
CONFIG_YENTA=y
CONFIG_YENTA_O2=y
CONFIG_YENTA_RICOH=y
CONFIG_YENTA_TI=y
CONFIG_YENTA_ENE_TUNE=y
CONFIG_YENTA_TOSHIBA=y
# CONFIG_PD6729 is not set
# CONFIG_I82092 is not set
CONFIG_PCCARD_NONSTATIC=y
CONFIG_HOTPLUG_PCI=y
# CONFIG_HOTPLUG_PCI_FAKE is not set
# CONFIG_HOTPLUG_PCI_ACPI is not set
# CONFIG_HOTPLUG_PCI_CPCI is not set
# CONFIG_HOTPLUG_PCI_SHPC is not set

#
# Executable file formats / Emulations
#
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
# CONFIG_HAVE_AOUT is not set
CONFIG_BINFMT_MISC=y
CONFIG_IA32_EMULATION=y
# CONFIG_IA32_AOUT is not set
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_NET=y
CONFIG_COMPAT_NETLINK_MESSAGES=y

#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y
CONFIG_XFRM=y
CONFIG_XFRM_USER=y
# CONFIG_XFRM_SUB_POLICY is not set
# CONFIG_XFRM_MIGRATE is not set
# CONFIG_XFRM_STATISTICS is not set
CONFIG_XFRM_IPCOMP=y
CONFIG_NET_KEY=y
# CONFIG_NET_KEY_MIGRATE is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_ASK_IP_FIB_HASH=y
# CONFIG_IP_FIB_TRIE is not set
CONFIG_IP_FIB_HASH=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
# CONFIG_ARPD is not set
CONFIG_SYN_COOKIES=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
CONFIG_INET_IPCOMP=y
CONFIG_INET_XFRM_TUNNEL=y
CONFIG_INET_TUNNEL=y
CONFIG_INET_XFRM_MODE_TRANSPORT=y
CONFIG_INET_XFRM_MODE_TUNNEL=y
# CONFIG_INET_XFRM_MODE_BEET is not set
CONFIG_INET_LRO=y
# CONFIG_INET_DIAG is not set
CONFIG_TCP_CONG_ADVANCED=y
# CONFIG_TCP_CONG_BIC is not set
CONFIG_TCP_CONG_CUBIC=y
# CONFIG_TCP_CONG_WESTWOOD is not set
# CONFIG_TCP_CONG_HTCP is not set
# CONFIG_TCP_CONG_HSTCP is not set
# CONFIG_TCP_CONG_HYBLA is not set
# CONFIG_TCP_CONG_VEGAS is not set
# CONFIG_TCP_CONG_SCALABLE is not set
# CONFIG_TCP_CONG_LP is not set
# CONFIG_TCP_CONG_VENO is not set
# CONFIG_TCP_CONG_YEAH is not set
# CONFIG_TCP_CONG_ILLINOIS is not set
# CONFIG_DEFAULT_BIC is not set
CONFIG_DEFAULT_CUBIC=y
# CONFIG_DEFAULT_HTCP is not set
# CONFIG_DEFAULT_VEGAS is not set
# CONFIG_DEFAULT_WESTWOOD is not set
# CONFIG_DEFAULT_RENO is not set
CONFIG_DEFAULT_TCP_CONG="cubic"
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6=y
# CONFIG_IPV6_PRIVACY is not set
# CONFIG_IPV6_ROUTER_PREF is not set
# CONFIG_IPV6_OPTIMISTIC_DAD is not set
CONFIG_INET6_AH=y
CONFIG_INET6_ESP=y
# CONFIG_INET6_IPCOMP is not set
# CONFIG_IPV6_MIP6 is not set
# CONFIG_INET6_XFRM_TUNNEL is not set
# CONFIG_INET6_TUNNEL is not set
CONFIG_INET6_XFRM_MODE_TRANSPORT=y
CONFIG_INET6_XFRM_MODE_TUNNEL=y
CONFIG_INET6_XFRM_MODE_BEET=y
# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
CONFIG_IPV6_SIT=y
CONFIG_IPV6_NDISC_NODETYPE=y
# CONFIG_IPV6_TUNNEL is not set
# CONFIG_IPV6_MULTIPLE_TABLES is not set
# CONFIG_IPV6_MROUTE is not set
CONFIG_NETLABEL=y
CONFIG_NETWORK_SECMARK=y
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=y

#
# Core Netfilter Configuration
#
CONFIG_NETFILTER_NETLINK=y
# CONFIG_NETFILTER_NETLINK_QUEUE is not set
CONFIG_NETFILTER_NETLINK_LOG=y
CONFIG_NF_CONNTRACK=y
# CONFIG_NF_CT_ACCT is not set
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_NF_CONNTRACK_SECMARK=y
# CONFIG_NF_CONNTRACK_EVENTS is not set
# CONFIG_NF_CT_PROTO_DCCP is not set
CONFIG_NF_CT_PROTO_GRE=y
# CONFIG_NF_CT_PROTO_SCTP is not set
# CONFIG_NF_CT_PROTO_UDPLITE is not set
# CONFIG_NF_CONNTRACK_AMANDA is not set
CONFIG_NF_CONNTRACK_FTP=y
CONFIG_NF_CONNTRACK_H323=y
CONFIG_NF_CONNTRACK_IRC=y
CONFIG_NF_CONNTRACK_NETBIOS_NS=y
CONFIG_NF_CONNTRACK_PPTP=y
# CONFIG_NF_CONNTRACK_SANE is not set
CONFIG_NF_CONNTRACK_SIP=y
CONFIG_NF_CONNTRACK_TFTP=y
CONFIG_NF_CT_NETLINK=y
# CONFIG_NETFILTER_TPROXY is not set
CONFIG_NETFILTER_XTABLES=y
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
# CONFIG_NETFILTER_XT_TARGET_HL is not set
# CONFIG_NETFILTER_XT_TARGET_LED is not set
CONFIG_NETFILTER_XT_TARGET_MARK=y
CONFIG_NETFILTER_XT_TARGET_NFLOG=y
# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set
CONFIG_NETFILTER_XT_TARGET_SECMARK=y
CONFIG_NETFILTER_XT_TARGET_TCPMSS=y
# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set
# CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set
# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
# CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
CONFIG_NETFILTER_XT_MATCH_ESP=y
# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
CONFIG_NETFILTER_XT_MATCH_HELPER=y
# CONFIG_NETFILTER_XT_MATCH_HL is not set
CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
CONFIG_NETFILTER_XT_MATCH_LIMIT=y
CONFIG_NETFILTER_XT_MATCH_MAC=y
CONFIG_NETFILTER_XT_MATCH_MARK=y
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
# CONFIG_NETFILTER_XT_MATCH_OWNER is not set
CONFIG_NETFILTER_XT_MATCH_POLICY=y
# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set
# CONFIG_NETFILTER_XT_MATCH_REALM is not set
CONFIG_NETFILTER_XT_MATCH_RECENT=y
# CONFIG_NETFILTER_XT_MATCH_RECENT_PROC_COMPAT is not set
# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
CONFIG_NETFILTER_XT_MATCH_STATE=y
# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
CONFIG_NETFILTER_XT_MATCH_STRING=y
CONFIG_NETFILTER_XT_MATCH_TCPMSS=y
CONFIG_NETFILTER_XT_MATCH_TIME=y
# CONFIG_NETFILTER_XT_MATCH_U32 is not set
# CONFIG_NETFILTER_XT_MATCH_OSF is not set
# CONFIG_IP_VS is not set

#
# IP: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV4=y
CONFIG_NF_CONNTRACK_IPV4=y
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
# CONFIG_IP_NF_QUEUE is not set
CONFIG_IP_NF_IPTABLES=y
# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
# CONFIG_IP_NF_MATCH_AH is not set
# CONFIG_IP_NF_MATCH_ECN is not set
# CONFIG_IP_NF_MATCH_TTL is not set
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_TARGET_REJECT=y
CONFIG_IP_NF_TARGET_LOG=y
CONFIG_IP_NF_TARGET_ULOG=y
CONFIG_NF_NAT=y
CONFIG_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_IP_NF_TARGET_NETMAP=y
CONFIG_IP_NF_TARGET_REDIRECT=y
# CONFIG_NF_NAT_SNMP_BASIC is not set
CONFIG_NF_NAT_PROTO_GRE=y
CONFIG_NF_NAT_FTP=y
CONFIG_NF_NAT_IRC=y
CONFIG_NF_NAT_TFTP=y
# CONFIG_NF_NAT_AMANDA is not set
CONFIG_NF_NAT_PPTP=y
CONFIG_NF_NAT_H323=y
CONFIG_NF_NAT_SIP=y
CONFIG_IP_NF_MANGLE=y
# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
# CONFIG_IP_NF_TARGET_ECN is not set
# CONFIG_IP_NF_TARGET_TTL is not set
# CONFIG_IP_NF_RAW is not set
# CONFIG_IP_NF_SECURITY is not set
# CONFIG_IP_NF_ARPTABLES is not set

#
# IPv6: Netfilter Configuration
#
CONFIG_NF_CONNTRACK_IPV6=y
# CONFIG_IP6_NF_QUEUE is not set
CONFIG_IP6_NF_IPTABLES=y
# CONFIG_IP6_NF_MATCH_AH is not set
# CONFIG_IP6_NF_MATCH_EUI64 is not set
# CONFIG_IP6_NF_MATCH_FRAG is not set
# CONFIG_IP6_NF_MATCH_OPTS is not set
# CONFIG_IP6_NF_MATCH_HL is not set
CONFIG_IP6_NF_MATCH_IPV6HEADER=y
# CONFIG_IP6_NF_MATCH_MH is not set
# CONFIG_IP6_NF_MATCH_RT is not set
# CONFIG_IP6_NF_TARGET_HL is not set
CONFIG_IP6_NF_TARGET_LOG=y
CONFIG_IP6_NF_FILTER=y
CONFIG_IP6_NF_TARGET_REJECT=y
CONFIG_IP6_NF_MANGLE=y
# CONFIG_IP6_NF_RAW is not set
# CONFIG_IP6_NF_SECURITY is not set
# CONFIG_BRIDGE_NF_EBTABLES is not set
# CONFIG_IP_DCCP is not set
# CONFIG_IP_SCTP is not set
# CONFIG_RDS is not set
# CONFIG_TIPC is not set
# CONFIG_ATM is not set
CONFIG_STP=y
CONFIG_BRIDGE=y
# CONFIG_NET_DSA is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
CONFIG_LLC=y
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_PHONET is not set
# CONFIG_IEEE802154 is not set
CONFIG_NET_SCHED=y

#
# Queueing/Scheduling
#
# CONFIG_NET_SCH_CBQ is not set
# CONFIG_NET_SCH_HTB is not set
# CONFIG_NET_SCH_HFSC is not set
# CONFIG_NET_SCH_PRIO is not set
# CONFIG_NET_SCH_MULTIQ is not set
# CONFIG_NET_SCH_RED is not set
# CONFIG_NET_SCH_SFQ is not set
# CONFIG_NET_SCH_TEQL is not set
# CONFIG_NET_SCH_TBF is not set
# CONFIG_NET_SCH_GRED is not set
# CONFIG_NET_SCH_DSMARK is not set
# CONFIG_NET_SCH_NETEM is not set
# CONFIG_NET_SCH_DRR is not set
# CONFIG_NET_SCH_INGRESS is not set
# CONFIG_NET_SCH_PLUG is not set

#
# Classification
#
CONFIG_NET_CLS=y
# CONFIG_NET_CLS_BASIC is not set
# CONFIG_NET_CLS_TCINDEX is not set
# CONFIG_NET_CLS_ROUTE4 is not set
# CONFIG_NET_CLS_FW is not set
# CONFIG_NET_CLS_U32 is not set
# CONFIG_NET_CLS_RSVP is not set
# CONFIG_NET_CLS_RSVP6 is not set
# CONFIG_NET_CLS_FLOW is not set
# CONFIG_NET_CLS_CGROUP is not set
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
# CONFIG_NET_EMATCH_CMP is not set
# CONFIG_NET_EMATCH_NBYTE is not set
# CONFIG_NET_EMATCH_U32 is not set
# CONFIG_NET_EMATCH_META is not set
# CONFIG_NET_EMATCH_TEXT is not set
CONFIG_NET_CLS_ACT=y
# CONFIG_NET_ACT_POLICE is not set
# CONFIG_NET_ACT_GACT is not set
# CONFIG_NET_ACT_MIRRED is not set
# CONFIG_NET_ACT_IPT is not set
# CONFIG_NET_ACT_NAT is not set
# CONFIG_NET_ACT_PEDIT is not set
# CONFIG_NET_ACT_SIMP is not set
# CONFIG_NET_ACT_SKBEDIT is not set
CONFIG_NET_SCH_FIFO=y
# CONFIG_DCB is not set

#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_NET_TCPPROBE is not set
# CONFIG_NET_DROP_MONITOR is not set
CONFIG_HAMRADIO=y

#
# Packet Radio protocols
#
# CONFIG_AX25 is not set
# CONFIG_CAN is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_AF_RXRPC is not set
CONFIG_FIB_RULES=y
CONFIG_WIRELESS=y
CONFIG_CFG80211=y
# CONFIG_NL80211_TESTMODE is not set
# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
# CONFIG_CFG80211_REG_DEBUG is not set
CONFIG_CFG80211_DEFAULT_PS=y
CONFIG_CFG80211_DEFAULT_PS_VALUE=1
# CONFIG_CFG80211_DEBUGFS is not set
CONFIG_WIRELESS_OLD_REGULATORY=y
CONFIG_WIRELESS_EXT=y
CONFIG_WIRELESS_EXT_SYSFS=y
# CONFIG_LIB80211 is not set
CONFIG_MAC80211=y
CONFIG_MAC80211_HAS_RC=y
CONFIG_MAC80211_RC_MINSTREL=y
# CONFIG_MAC80211_RC_DEFAULT_PID is not set
CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
CONFIG_MAC80211_RC_DEFAULT="minstrel"
# CONFIG_MAC80211_MESH is not set
CONFIG_MAC80211_LEDS=y
# CONFIG_MAC80211_DEBUGFS is not set
# CONFIG_MAC80211_DEBUG_MENU is not set
# CONFIG_WIMAX is not set
CONFIG_RFKILL=y
CONFIG_RFKILL_LEDS=y
CONFIG_RFKILL_INPUT=y
# CONFIG_NET_9P is not set

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
# CONFIG_DEVTMPFS is not set
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
CONFIG_FIRMWARE_IN_KERNEL=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_DEBUG_DRIVER is not set
CONFIG_DEBUG_DEVRES=y
CONFIG_SYS_HYPERVISOR=y
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
# CONFIG_MTD is not set
# CONFIG_PARPORT is not set
CONFIG_PNP=y
CONFIG_PNP_DEBUG_MESSAGES=y

#
# Protocols
#
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_CPQ_DA is not set
CONFIG_BLK_CPQ_CISS_DA=m
# CONFIG_CISS_SCSI_TAPE is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_UB is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
# CONFIG_BLK_DEV_XIP is not set
# CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set
CONFIG_XEN_BLKDEV_FRONTEND=y
# CONFIG_BLK_DEV_HD is not set
CONFIG_MISC_DEVICES=y
# CONFIG_IBM_ASM is not set
# CONFIG_PHANTOM is not set
# CONFIG_SGI_IOC4 is not set
# CONFIG_TIFM_CORE is not set
# CONFIG_ICS932S401 is not set
# CONFIG_ENCLOSURE_SERVICES is not set
# CONFIG_HP_ILO is not set
# CONFIG_ISL29003 is not set
# CONFIG_C2PORT is not set

#
# EEPROM support
#
# CONFIG_EEPROM_AT24 is not set
# CONFIG_EEPROM_LEGACY is not set
# CONFIG_EEPROM_MAX6875 is not set
# CONFIG_EEPROM_93CX6 is not set
# CONFIG_CB710_CORE is not set
CONFIG_HAVE_IDE=y
# CONFIG_IDE is not set

#
# SCSI device support
#
# CONFIG_RAID_ATTRS is not set
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
# CONFIG_SCSI_TGT is not set
# CONFIG_SCSI_NETLINK is not set
CONFIG_SCSI_PROC_FS=y

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
CONFIG_BLK_DEV_SR=y
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=y
# CONFIG_CHR_DEV_SCH is not set
# CONFIG_SCSI_MULTI_LUN is not set
CONFIG_SCSI_CONSTANTS=y
# CONFIG_SCSI_LOGGING is not set
# CONFIG_SCSI_SCAN_ASYNC is not set
CONFIG_SCSI_WAIT_SCAN=m

#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not set
CONFIG_SCSI_ISCSI_ATTRS=m
CONFIG_SCSI_SAS_ATTRS=m
# CONFIG_SCSI_SAS_LIBSAS is not set
# CONFIG_SCSI_SRP_ATTRS is not set
CONFIG_SCSI_LOWLEVEL=y
CONFIG_ISCSI_TCP=m
# CONFIG_SCSI_CXGB3_ISCSI is not set
# CONFIG_SCSI_BNX2_ISCSI is not set
# CONFIG_BE2ISCSI is not set
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
CONFIG_SCSI_3W_9XXX=y
# CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AACRAID is not set
# CONFIG_SCSI_AIC7XXX is not set
# CONFIG_SCSI_AIC7XXX_OLD is not set
# CONFIG_SCSI_AIC79XX is not set
# CONFIG_SCSI_AIC94XX is not set
# CONFIG_SCSI_MVSAS is not set
# CONFIG_SCSI_DPT_I2O is not set
# CONFIG_SCSI_ADVANSYS is not set
# CONFIG_SCSI_ARCMSR is not set
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set
# CONFIG_MEGARAID_SAS is not set
# CONFIG_SCSI_MPT2SAS is not set
# CONFIG_SCSI_HPTIOP is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_LIBFC is not set
# CONFIG_LIBFCOE is not set
# CONFIG_FCOE is not set
# CONFIG_FCOE_FNIC is not set
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_IPS is not set
# CONFIG_SCSI_INITIO is not set
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_STEX is not set
# CONFIG_SCSI_SYM53C8XX_2 is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_QLOGIC_1280 is not set
# CONFIG_SCSI_QLA_FC is not set
# CONFIG_SCSI_QLA_ISCSI is not set
# CONFIG_SCSI_LPFC is not set
# CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_DEBUG is not set
# CONFIG_SCSI_PMCRAID is not set
# CONFIG_SCSI_SRP is not set
# CONFIG_SCSI_BFA_FC is not set
# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
# CONFIG_SCSI_DH is not set
# CONFIG_SCSI_OSD_INITIATOR is not set
CONFIG_ATA=y
# CONFIG_ATA_NONSTANDARD is not set
CONFIG_ATA_VERBOSE_ERROR=y
CONFIG_ATA_ACPI=y
CONFIG_SATA_PMP=y
CONFIG_SATA_AHCI=y
# CONFIG_SATA_SIL24 is not set
CONFIG_ATA_SFF=y
# CONFIG_SATA_SVW is not set
CONFIG_ATA_PIIX=y
# CONFIG_SATA_MV is not set
# CONFIG_SATA_NV is not set
# CONFIG_PDC_ADMA is not set
# CONFIG_SATA_QSTOR is not set
# CONFIG_SATA_PROMISE is not set
# CONFIG_SATA_SX4 is not set
# CONFIG_SATA_SIL is not set
# CONFIG_SATA_SIS is not set
# CONFIG_SATA_ULI is not set
# CONFIG_SATA_VIA is not set
# CONFIG_SATA_VITESSE is not set
# CONFIG_SATA_INIC162X is not set
# CONFIG_PATA_ACPI is not set
# CONFIG_PATA_ALI is not set
CONFIG_PATA_AMD=y
# CONFIG_PATA_ARTOP is not set
# CONFIG_PATA_ATP867X is not set
# CONFIG_PATA_ATIIXP is not set
# CONFIG_PATA_CMD640_PCI is not set
# CONFIG_PATA_CMD64X is not set
# CONFIG_PATA_CS5520 is not set
# CONFIG_PATA_CS5530 is not set
# CONFIG_PATA_CYPRESS is not set
# CONFIG_PATA_EFAR is not set
CONFIG_ATA_GENERIC=y
# CONFIG_PATA_HPT366 is not set
# CONFIG_PATA_HPT37X is not set
# CONFIG_PATA_HPT3X2N is not set
# CONFIG_PATA_HPT3X3 is not set
# CONFIG_PATA_IT821X is not set
# CONFIG_PATA_IT8213 is not set
# CONFIG_PATA_JMICRON is not set
# CONFIG_PATA_TRIFLEX is not set
# CONFIG_PATA_MARVELL is not set
CONFIG_PATA_MPIIX=y
CONFIG_PATA_OLDPIIX=y
# CONFIG_PATA_NETCELL is not set
# CONFIG_PATA_NINJA32 is not set
# CONFIG_PATA_NS87410 is not set
# CONFIG_PATA_NS87415 is not set
# CONFIG_PATA_OPTI is not set
# CONFIG_PATA_OPTIDMA is not set
# CONFIG_PATA_PCMCIA is not set
# CONFIG_PATA_PDC_OLD is not set
# CONFIG_PATA_RADISYS is not set
# CONFIG_PATA_RDC is not set
# CONFIG_PATA_RZ1000 is not set
# CONFIG_PATA_SC1200 is not set
# CONFIG_PATA_SERVERWORKS is not set
# CONFIG_PATA_PDC2027X is not set
# CONFIG_PATA_SIL680 is not set
# CONFIG_PATA_SIS is not set
# CONFIG_PATA_VIA is not set
# CONFIG_PATA_WINBOND is not set
CONFIG_PATA_SCH=y
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
CONFIG_MD_AUTODETECT=y
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
CONFIG_MD_RAID1=m
# CONFIG_MD_RAID10 is not set
# CONFIG_MD_RAID456 is not set
# CONFIG_MD_MULTIPATH is not set
# CONFIG_MD_FAULTY is not set
CONFIG_BLK_DEV_DM=y
# CONFIG_DM_DEBUG is not set
# CONFIG_DM_CRYPT is not set
# CONFIG_DM_SNAPSHOT is not set
CONFIG_DM_MIRROR=y
# CONFIG_DM_LOG_USERSPACE is not set
CONFIG_DM_ZERO=y
# CONFIG_DM_MULTIPATH is not set
# CONFIG_DM_DELAY is not set
# CONFIG_DM_UEVENT is not set
CONFIG_FUSION=y
CONFIG_FUSION_SPI=m
# CONFIG_FUSION_FC is not set
CONFIG_FUSION_SAS=m
CONFIG_FUSION_MAX_SGE=128
# CONFIG_FUSION_CTL is not set
# CONFIG_FUSION_LOGGING is not set

#
# IEEE 1394 (FireWire) support
#

#
# You can enable one or both FireWire driver stacks.
#

#
# See the help texts for more information.
#
# CONFIG_FIREWIRE is not set
# CONFIG_IEEE1394 is not set
# CONFIG_I2O is not set
CONFIG_MACINTOSH_DRIVERS=y
CONFIG_MAC_EMUMOUSEBTN=y
CONFIG_NETDEVICES=y
# CONFIG_IFB is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set
# CONFIG_EQUALIZER is not set
CONFIG_TUN=y
# CONFIG_VETH is not set
# CONFIG_NET_SB1000 is not set
# CONFIG_ARCNET is not set
CONFIG_PHYLIB=y

#
# MII PHY device drivers
#
# CONFIG_MARVELL_PHY is not set
# CONFIG_DAVICOM_PHY is not set
# CONFIG_QSEMI_PHY is not set
# CONFIG_LXT_PHY is not set
# CONFIG_CICADA_PHY is not set
# CONFIG_VITESSE_PHY is not set
# CONFIG_SMSC_PHY is not set
# CONFIG_BROADCOM_PHY is not set
# CONFIG_ICPLUS_PHY is not set
# CONFIG_REALTEK_PHY is not set
# CONFIG_NATIONAL_PHY is not set
# CONFIG_STE10XP is not set
# CONFIG_LSI_ET1011C_PHY is not set
# CONFIG_FIXED_PHY is not set
# CONFIG_MDIO_BITBANG is not set
CONFIG_NET_ETHERNET=y
CONFIG_MII=y
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set
# CONFIG_CASSINI is not set
CONFIG_NET_VENDOR_3COM=y
# CONFIG_VORTEX is not set
# CONFIG_TYPHOON is not set
# CONFIG_ETHOC is not set
# CONFIG_DNET is not set
CONFIG_NET_TULIP=y
# CONFIG_DE2104X is not set
# CONFIG_TULIP is not set
# CONFIG_DE4X5 is not set
# CONFIG_WINBOND_840 is not set
# CONFIG_DM9102 is not set
# CONFIG_ULI526X is not set
# CONFIG_PCMCIA_XIRCOM is not set
# CONFIG_HP100 is not set
# CONFIG_IBM_NEW_EMAC_ZMII is not set
# CONFIG_IBM_NEW_EMAC_RGMII is not set
# CONFIG_IBM_NEW_EMAC_TAH is not set
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
CONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
# CONFIG_AMD8111_ETH is not set
# CONFIG_ADAPTEC_STARFIRE is not set
# CONFIG_B44 is not set
CONFIG_FORCEDETH=y
# CONFIG_FORCEDETH_NAPI is not set
CONFIG_E100=y
# CONFIG_FEALNX is not set
# CONFIG_NATSEMI is not set
CONFIG_NE2K_PCI=y
# CONFIG_8139CP is not set
CONFIG_8139TOO=y
# CONFIG_8139TOO_PIO is not set
# CONFIG_8139TOO_TUNE_TWISTER is not set
# CONFIG_8139TOO_8129 is not set
# CONFIG_8139_OLD_RX_RESET is not set
# CONFIG_R6040 is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SMSC9420 is not set
# CONFIG_SUNDANCE is not set
# CONFIG_TLAN is not set
# CONFIG_KS8842 is not set
# CONFIG_KS8851_MLL is not set
# CONFIG_VIA_RHINE is not set
# CONFIG_SC92031 is not set
# CONFIG_ATL2 is not set
CONFIG_NETDEV_1000=y
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
CONFIG_E1000=y
CONFIG_E1000E=y
# CONFIG_IP1000 is not set
# CONFIG_IGB is not set
# CONFIG_IGBVF is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
CONFIG_R8169=y
# CONFIG_SIS190 is not set
# CONFIG_SKGE is not set
CONFIG_SKY2=y
# CONFIG_SKY2_DEBUG is not set
# CONFIG_VIA_VELOCITY is not set
CONFIG_TIGON3=y
CONFIG_BNX2=y
# CONFIG_CNIC is not set
# CONFIG_QLA3XXX is not set
# CONFIG_ATL1 is not set
# CONFIG_ATL1E is not set
# CONFIG_ATL1C is not set
# CONFIG_JME is not set
CONFIG_NETDEV_10000=y
# CONFIG_CHELSIO_T1 is not set
CONFIG_CHELSIO_T3_DEPENDS=y
# CONFIG_CHELSIO_T3 is not set
# CONFIG_ENIC is not set
# CONFIG_IXGBE is not set
# CONFIG_IXGB is not set
# CONFIG_S2IO is not set
# CONFIG_VXGE is not set
# CONFIG_MYRI10GE is not set
# CONFIG_NETXEN_NIC is not set
# CONFIG_NIU is not set
# CONFIG_MLX4_EN is not set
# CONFIG_MLX4_CORE is not set
# CONFIG_TEHUTI is not set
# CONFIG_BNX2X is not set
# CONFIG_QLGE is not set
# CONFIG_SFC is not set
# CONFIG_BE2NET is not set
CONFIG_TR=y
# CONFIG_IBMOL is not set
# CONFIG_3C359 is not set
# CONFIG_TMS380TR is not set
CONFIG_WLAN=y
# CONFIG_WLAN_PRE80211 is not set
CONFIG_WLAN_80211=y
# CONFIG_PCMCIA_RAYCS is not set
# CONFIG_LIBERTAS is not set
# CONFIG_LIBERTAS_THINFIRM is not set
# CONFIG_AIRO is not set
# CONFIG_ATMEL is not set
# CONFIG_AT76C50X_USB is not set
# CONFIG_AIRO_CS is not set
# CONFIG_PCMCIA_WL3501 is not set
# CONFIG_PRISM54 is not set
# CONFIG_USB_ZD1201 is not set
# CONFIG_USB_NET_RNDIS_WLAN is not set
# CONFIG_RTL8180 is not set
# CONFIG_RTL8187 is not set
# CONFIG_ADM8211 is not set
# CONFIG_MAC80211_HWSIM is not set
# CONFIG_MWL8K is not set
# CONFIG_P54_COMMON is not set
# CONFIG_ATH_COMMON is not set
# CONFIG_IPW2100 is not set
# CONFIG_IPW2200 is not set
# CONFIG_IWLWIFI is not set
# CONFIG_HOSTAP is not set
# CONFIG_B43 is not set
# CONFIG_B43LEGACY is not set
# CONFIG_ZD1211RW is not set
# CONFIG_RT2X00 is not set
# CONFIG_HERMES is not set
# CONFIG_WL12XX is not set

#
# Enable WiMAX (Networking options) to see the WiMAX drivers
#

#
# USB Network Adapters
#
# CONFIG_USB_CATC is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_RTL8150 is not set
# CONFIG_USB_USBNET is not set
# CONFIG_USB_HSO is not set
CONFIG_NET_PCMCIA=y
# CONFIG_PCMCIA_3C589 is not set
# CONFIG_PCMCIA_3C574 is not set
# CONFIG_PCMCIA_FMVJ18X is not set
# CONFIG_PCMCIA_PCNET is not set
# CONFIG_PCMCIA_NMCLAN is not set
# CONFIG_PCMCIA_SMC91C92 is not set
# CONFIG_PCMCIA_XIRC2PS is not set
# CONFIG_PCMCIA_AXNET is not set
# CONFIG_PCMCIA_IBMTR is not set
# CONFIG_WAN is not set
CONFIG_XEN_NETDEV_FRONTEND=y
CONFIG_FDDI=y
# CONFIG_DEFXX is not set
# CONFIG_SKFP is not set
# CONFIG_HIPPI is not set
CONFIG_PPP=y
# CONFIG_PPP_MULTILINK is not set
# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=y
CONFIG_PPP_DEFLATE=y
CONFIG_PPP_BSDCOMP=y
# CONFIG_PPP_MPPE is not set
CONFIG_PPPOE=y
CONFIG_PPPOL2TP=y
# CONFIG_SLIP is not set
CONFIG_SLHC=y
# CONFIG_NET_FC is not set
CONFIG_NETCONSOLE=m
# CONFIG_NETCONSOLE_DYNAMIC is not set
CONFIG_NETPOLL=y
# CONFIG_NETPOLL_TRAP is not set
CONFIG_NET_POLL_CONTROLLER=y
# CONFIG_VMXNET3 is not set
# CONFIG_ISDN is not set
# CONFIG_PHONE is not set

#
# Input device support
#
CONFIG_INPUT=y
CONFIG_INPUT_FF_MEMLESS=y
CONFIG_INPUT_POLLDEV=y

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set
CONFIG_XEN_KBDDEV_FRONTEND=y

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ADP5588 is not set
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_QT2160 is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_LM8323 is not set
# CONFIG_KEYBOARD_MAX7359 is not set
# CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_OPENCORES is not set
# CONFIG_KEYBOARD_STOWAWAY is not set
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
# CONFIG_MOUSE_PS2_ELANTECH is not set
# CONFIG_MOUSE_PS2_SENTELIC is not set
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
# CONFIG_MOUSE_SERIAL is not set
# CONFIG_MOUSE_APPLETOUCH is not set
# CONFIG_MOUSE_BCM5974 is not set
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_MOUSE_SYNAPTICS_I2C is not set
CONFIG_INPUT_JOYSTICK=y
# CONFIG_JOYSTICK_ANALOG is not set
# CONFIG_JOYSTICK_A3D is not set
# CONFIG_JOYSTICK_ADI is not set
# CONFIG_JOYSTICK_COBRA is not set
# CONFIG_JOYSTICK_GF2K is not set
# CONFIG_JOYSTICK_GRIP is not set
# CONFIG_JOYSTICK_GRIP_MP is not set
# CONFIG_JOYSTICK_GUILLEMOT is not set
# CONFIG_JOYSTICK_INTERACT is not set
# CONFIG_JOYSTICK_SIDEWINDER is not set
# CONFIG_JOYSTICK_TMDC is not set
# CONFIG_JOYSTICK_IFORCE is not set
# CONFIG_JOYSTICK_WARRIOR is not set
# CONFIG_JOYSTICK_MAGELLAN is not set
# CONFIG_JOYSTICK_SPACEORB is not set
# CONFIG_JOYSTICK_SPACEBALL is not set
# CONFIG_JOYSTICK_STINGER is not set
# CONFIG_JOYSTICK_TWIDJOY is not set
# CONFIG_JOYSTICK_ZHENHUA is not set
# CONFIG_JOYSTICK_JOYDUMP is not set
# CONFIG_JOYSTICK_XPAD is not set
CONFIG_INPUT_TABLET=y
# CONFIG_TABLET_USB_ACECAD is not set
# CONFIG_TABLET_USB_AIPTEK is not set
# CONFIG_TABLET_USB_GTCO is not set
# CONFIG_TABLET_USB_KBTAB is not set
# CONFIG_TABLET_USB_WACOM is not set
CONFIG_INPUT_TOUCHSCREEN=y
# CONFIG_TOUCHSCREEN_AD7879_I2C is not set
# CONFIG_TOUCHSCREEN_AD7879 is not set
# CONFIG_TOUCHSCREEN_EETI is not set
# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GUNZE is not set
# CONFIG_TOUCHSCREEN_ELO is not set
# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
# CONFIG_TOUCHSCREEN_MCS5000 is not set
# CONFIG_TOUCHSCREEN_MTOUCH is not set
# CONFIG_TOUCHSCREEN_INEXIO is not set
# CONFIG_TOUCHSCREEN_MK712 is not set
# CONFIG_TOUCHSCREEN_PENMOUNT is not set
# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
# CONFIG_TOUCHSCREEN_TSC2007 is not set
CONFIG_INPUT_MISC=y
# CONFIG_INPUT_PCSPKR is not set
# CONFIG_INPUT_APANEL is not set
# CONFIG_INPUT_ATLAS_BTNS is not set
# CONFIG_INPUT_ATI_REMOTE is not set
# CONFIG_INPUT_ATI_REMOTE2 is not set
# CONFIG_INPUT_KEYSPAN_REMOTE is not set
# CONFIG_INPUT_POWERMATE is not set
# CONFIG_INPUT_YEALINK is not set
# CONFIG_INPUT_CM109 is not set
# CONFIG_INPUT_UINPUT is not set
# CONFIG_INPUT_WINBOND_CIR is not set

#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PCIPS2 is not set
CONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set
# CONFIG_GAMEPORT is not set

#
# Character devices
#
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_DEVKMEM=y
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_COMPUTONE is not set
# CONFIG_ROCKETPORT is not set
# CONFIG_CYCLADES is not set
# CONFIG_DIGIEPCA is not set
# CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set
# CONFIG_ISI is not set
# CONFIG_SYNCLINK is not set
# CONFIG_SYNCLINKMP is not set
# CONFIG_SYNCLINK_GT is not set
# CONFIG_N_HDLC is not set
# CONFIG_RISCOM8 is not set
# CONFIG_SPECIALIX is not set
# CONFIG_STALDRV is not set
# CONFIG_NOZOMI is not set

#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_PNP=y
# CONFIG_SERIAL_8250_CS is not set
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_DETECT_IRQ=y
CONFIG_SERIAL_8250_RSA=y

#
# Non-8250 serial port support
#
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not set
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
# CONFIG_LEGACY_PTYS is not set
CONFIG_HVC_DRIVER=y
CONFIG_HVC_IRQ=y
CONFIG_HVC_XEN=y
# CONFIG_IPMI_HANDLER is not set
CONFIG_HW_RANDOM=y
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
CONFIG_HW_RANDOM_INTEL=y
CONFIG_HW_RANDOM_AMD=y
CONFIG_HW_RANDOM_VIA=y
CONFIG_NVRAM=y
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set

#
# PCMCIA character devices
#
# CONFIG_SYNCLINK_CS is not set
# CONFIG_CARDMAN_4000 is not set
# CONFIG_CARDMAN_4040 is not set
# CONFIG_IPWIRELESS is not set
# CONFIG_MWAVE is not set
# CONFIG_PC8736x_GPIO is not set
# CONFIG_RAW_DRIVER is not set
CONFIG_HPET=y
# CONFIG_HPET_MMAP is not set
# CONFIG_HANGCHECK_TIMER is not set
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not set
CONFIG_DEVPORT=y
CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_COMPAT=y
CONFIG_I2C_CHARDEV=m
CONFIG_I2C_HELPER_AUTO=y
CONFIG_I2C_ALGOBIT=y
CONFIG_I2C_ALGOPCA=m

#
# I2C Hardware Bus support
#

#
# PC SMBus host controller drivers
#
CONFIG_I2C_ALI1535=m
CONFIG_I2C_ALI1563=m
CONFIG_I2C_ALI15X3=m
CONFIG_I2C_AMD756=m
CONFIG_I2C_AMD756_S4882=m
CONFIG_I2C_AMD8111=m
CONFIG_I2C_I801=y
CONFIG_I2C_ISCH=m
CONFIG_I2C_PIIX4=m
CONFIG_I2C_NFORCE2=m
CONFIG_I2C_NFORCE2_S4985=m
CONFIG_I2C_SIS5595=m
CONFIG_I2C_SIS630=m
CONFIG_I2C_SIS96X=m
CONFIG_I2C_VIA=m
CONFIG_I2C_VIAPRO=m

#
# ACPI drivers
#
CONFIG_I2C_SCMI=m

#
# I2C system bus drivers (mostly embedded / system-on-chip)
#
CONFIG_I2C_OCORES=m
CONFIG_I2C_SIMTEC=m

#
# External I2C/SMBus adapter drivers
#
CONFIG_I2C_PARPORT_LIGHT=m
CONFIG_I2C_TAOS_EVM=m
CONFIG_I2C_TINY_USB=m

#
# Graphics adapter I2C/DDC channel drivers
#
CONFIG_I2C_VOODOO3=m

#
# Other I2C/SMBus bus drivers
#
CONFIG_I2C_PCA_PLATFORM=m
CONFIG_I2C_STUB=m

#
# Miscellaneous I2C Chip support
#
CONFIG_DS1682=m
CONFIG_SENSORS_TSL2550=m
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_I2C_DEBUG_CHIP is not set
# CONFIG_SPI is not set

#
# PPS support
#
# CONFIG_PPS is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
# CONFIG_GPIOLIB is not set
# CONFIG_W1 is not set
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
# CONFIG_PDA_POWER is not set
# CONFIG_BATTERY_DS2760 is not set
# CONFIG_BATTERY_DS2782 is not set
# CONFIG_BATTERY_BQ27x00 is not set
# CONFIG_BATTERY_MAX17040 is not set
CONFIG_HWMON=y
# CONFIG_HWMON_VID is not set
# CONFIG_HWMON_DEBUG_CHIP is not set

#
# Native drivers
#
# CONFIG_SENSORS_ABITUGURU is not set
# CONFIG_SENSORS_ABITUGURU3 is not set
# CONFIG_SENSORS_AD7414 is not set
# CONFIG_SENSORS_AD7418 is not set
# CONFIG_SENSORS_ADM1021 is not set
# CONFIG_SENSORS_ADM1025 is not set
# CONFIG_SENSORS_ADM1026 is not set
# CONFIG_SENSORS_ADM1029 is not set
# CONFIG_SENSORS_ADM1031 is not set
# CONFIG_SENSORS_ADM9240 is not set
# CONFIG_SENSORS_ADT7462 is not set
# CONFIG_SENSORS_ADT7470 is not set
# CONFIG_SENSORS_ADT7473 is not set
# CONFIG_SENSORS_ADT7475 is not set
# CONFIG_SENSORS_K8TEMP is not set
# CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_ATXP1 is not set
# CONFIG_SENSORS_DS1621 is not set
# CONFIG_SENSORS_I5K_AMB is not set
# CONFIG_SENSORS_F71805F is not set
# CONFIG_SENSORS_F71882FG is not set
# CONFIG_SENSORS_F75375S is not set
# CONFIG_SENSORS_FSCHMD is not set
# CONFIG_SENSORS_G760A is not set
# CONFIG_SENSORS_GL518SM is not set
# CONFIG_SENSORS_GL520SM is not set
# CONFIG_SENSORS_CORETEMP is not set
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM75 is not set
# CONFIG_SENSORS_LM77 is not set
# CONFIG_SENSORS_LM78 is not set
# CONFIG_SENSORS_LM80 is not set
# CONFIG_SENSORS_LM83 is not set
# CONFIG_SENSORS_LM85 is not set
# CONFIG_SENSORS_LM87 is not set
# CONFIG_SENSORS_LM90 is not set
# CONFIG_SENSORS_LM92 is not set
# CONFIG_SENSORS_LM93 is not set
# CONFIG_SENSORS_LTC4215 is not set
# CONFIG_SENSORS_LTC4245 is not set
# CONFIG_SENSORS_LM95241 is not set
# CONFIG_SENSORS_MAX1619 is not set
# CONFIG_SENSORS_MAX6650 is not set
# CONFIG_SENSORS_PC87360 is not set
# CONFIG_SENSORS_PC87427 is not set
# CONFIG_SENSORS_PCF8591 is not set
# CONFIG_SENSORS_SIS5595 is not set
# CONFIG_SENSORS_DME1737 is not set
# CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_SMSC47M192 is not set
# CONFIG_SENSORS_SMSC47B397 is not set
# CONFIG_SENSORS_ADS7828 is not set
# CONFIG_SENSORS_THMC50 is not set
# CONFIG_SENSORS_TMP401 is not set
# CONFIG_SENSORS_TMP421 is not set
# CONFIG_SENSORS_VIA686A is not set
# CONFIG_SENSORS_VT1211 is not set
# CONFIG_SENSORS_VT8231 is not set
# CONFIG_SENSORS_W83781D is not set
# CONFIG_SENSORS_W83791D is not set
# CONFIG_SENSORS_W83792D is not set
# CONFIG_SENSORS_W83793 is not set
# CONFIG_SENSORS_W83L785TS is not set
# CONFIG_SENSORS_W83L786NG is not set
# CONFIG_SENSORS_W83627HF is not set
# CONFIG_SENSORS_W83627EHF is not set
# CONFIG_SENSORS_HDAPS is not set
# CONFIG_SENSORS_APPLESMC is not set

#
# ACPI drivers
#
# CONFIG_SENSORS_ATK0110 is not set
# CONFIG_SENSORS_LIS3LV02D is not set
CONFIG_THERMAL=y
# CONFIG_THERMAL_HWMON is not set
CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_NOWAYOUT is not set

#
# Watchdog Device Drivers
#
# CONFIG_SOFT_WATCHDOG is not set
# CONFIG_ACQUIRE_WDT is not set
# CONFIG_ADVANTECH_WDT is not set
# CONFIG_ALIM1535_WDT is not set
# CONFIG_ALIM7101_WDT is not set
# CONFIG_SC520_WDT is not set
# CONFIG_SBC_FITPC2_WATCHDOG is not set
# CONFIG_EUROTECH_WDT is not set
# CONFIG_IB700_WDT is not set
# CONFIG_IBMASR is not set
# CONFIG_WAFER_WDT is not set
# CONFIG_I6300ESB_WDT is not set
# CONFIG_ITCO_WDT is not set
# CONFIG_IT8712F_WDT is not set
# CONFIG_IT87_WDT is not set
# CONFIG_HP_WATCHDOG is not set
# CONFIG_SC1200_WDT is not set
# CONFIG_PC87413_WDT is not set
# CONFIG_60XX_WDT is not set
# CONFIG_SBC8360_WDT is not set
# CONFIG_CPU5_WDT is not set
# CONFIG_SMSC_SCH311X_WDT is not set
# CONFIG_SMSC37B787_WDT is not set
# CONFIG_W83627HF_WDT is not set
# CONFIG_W83697HF_WDT is not set
# CONFIG_W83697UG_WDT is not set
# CONFIG_W83877F_WDT is not set
# CONFIG_W83977F_WDT is not set
# CONFIG_MACHZ_WDT is not set
# CONFIG_SBC_EPX_C3_WATCHDOG is not set
# CONFIG_XEN_WDT is not set

#
# PCI-based Watchdog Cards
#
# CONFIG_PCIPCWATCHDOG is not set
# CONFIG_WDTPCI is not set

#
# USB-based Watchdog Cards
#
# CONFIG_USBPCWATCHDOG is not set
CONFIG_SSB_POSSIBLE=y

#
# Sonics Silicon Backplane
#
# CONFIG_SSB is not set

#
# Multifunction device drivers
#
# CONFIG_MFD_CORE is not set
# CONFIG_MFD_SM501 is not set
# CONFIG_HTC_PASIC3 is not set
# CONFIG_TWL4030_CORE is not set
# CONFIG_MFD_TMIO is not set
# CONFIG_PMIC_DA903X is not set
# CONFIG_MFD_WM8400 is not set
# CONFIG_MFD_WM831X is not set
# CONFIG_MFD_WM8350_I2C is not set
# CONFIG_MFD_PCF50633 is not set
# CONFIG_AB3100_CORE is not set
# CONFIG_REGULATOR is not set
# CONFIG_MEDIA_SUPPORT is not set

#
# Graphics support
#
CONFIG_AGP=y
CONFIG_AGP_AMD64=y
CONFIG_AGP_INTEL=y
# CONFIG_AGP_SIS is not set
# CONFIG_AGP_VIA is not set
CONFIG_VGA_ARB=y
CONFIG_DRM=y
CONFIG_DRM_KMS_HELPER=y
# CONFIG_DRM_TDFX is not set
# CONFIG_DRM_R128 is not set
# CONFIG_DRM_RADEON is not set
# CONFIG_DRM_I810 is not set
# CONFIG_DRM_I830 is not set
CONFIG_DRM_I915=y
# CONFIG_DRM_I915_KMS is not set
# CONFIG_DRM_MGA is not set
# CONFIG_DRM_SIS is not set
# CONFIG_DRM_VIA is not set
# CONFIG_DRM_SAVAGE is not set
# CONFIG_VGASTATE is not set
CONFIG_VIDEO_OUTPUT_CONTROL=y
CONFIG_FB=y
# CONFIG_FIRMWARE_EDID is not set
# CONFIG_FB_DDC is not set
# CONFIG_FB_BOOT_VESA_SUPPORT is not set
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_IMAGEBLIT=y
# CONFIG_FB_FOREIGN_ENDIAN is not set
CONFIG_FB_SYS_FOPS=y
CONFIG_FB_DEFERRED_IO=y
# CONFIG_FB_SVGALIB is not set
# CONFIG_FB_MACMODES is not set
# CONFIG_FB_BACKLIGHT is not set
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y

#
# Frame buffer hardware drivers
#
# CONFIG_FB_CIRRUS is not set
# CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ARC is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
# CONFIG_FB_VGA16 is not set
# CONFIG_FB_UVESA is not set
# CONFIG_FB_VESA is not set
CONFIG_FB_EFI=y
# CONFIG_FB_N411 is not set
# CONFIG_FB_HGA is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_LE80578 is not set
# CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON is not set
# CONFIG_FB_ATY128 is not set
# CONFIG_FB_ATY is not set
# CONFIG_FB_S3 is not set
# CONFIG_FB_SAVAGE is not set
# CONFIG_FB_SIS is not set
# CONFIG_FB_VIA is not set
# CONFIG_FB_NEOMAGIC is not set
# CONFIG_FB_KYRO is not set
# CONFIG_FB_3DFX is not set
# CONFIG_FB_VOODOO1 is not set
# CONFIG_FB_VT8623 is not set
# CONFIG_FB_TRIDENT is not set
# CONFIG_FB_ARK is not set
# CONFIG_FB_PM3 is not set
# CONFIG_FB_CARMINE is not set
# CONFIG_FB_GEODE is not set
# CONFIG_FB_VIRTUAL is not set
CONFIG_XEN_FBDEV_FRONTEND=y
# CONFIG_FB_METRONOME is not set
# CONFIG_FB_MB862XX is not set
# CONFIG_FB_BROADSHEET is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
# CONFIG_LCD_CLASS_DEVICE is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_BACKLIGHT_GENERIC=y
# CONFIG_BACKLIGHT_PROGEAR is not set
# CONFIG_BACKLIGHT_MBP_NVIDIA is not set
# CONFIG_BACKLIGHT_SAHARA is not set

#
# Display device support
#
# CONFIG_DISPLAY_SUPPORT is not set

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
CONFIG_VGACON_SOFT_SCROLLBACK=y
CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_MONO is not set
# CONFIG_LOGO_LINUX_VGA16 is not set
CONFIG_LOGO_LINUX_CLUT224=y
CONFIG_SOUND=y
CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND=y
CONFIG_SND_TIMER=y
CONFIG_SND_PCM=y
CONFIG_SND_HWDEP=y
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQ_DUMMY=y
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_HRTIMER=y
CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
CONFIG_SND_DYNAMIC_MINORS=y
CONFIG_SND_SUPPORT_OLD_API=y
CONFIG_SND_VERBOSE_PROCFS=y
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not set
CONFIG_SND_VMASTER=y
CONFIG_SND_DMA_SGBUF=y
# CONFIG_SND_RAWMIDI_SEQ is not set
# CONFIG_SND_OPL3_LIB_SEQ is not set
# CONFIG_SND_OPL4_LIB_SEQ is not set
# CONFIG_SND_SBAWE_SEQ is not set
# CONFIG_SND_EMU10K1_SEQ is not set
CONFIG_SND_DRIVERS=y
# CONFIG_SND_PCSP is not set
# CONFIG_SND_DUMMY is not set
# CONFIG_SND_VIRMIDI is not set
# CONFIG_SND_MTPAV is not set
# CONFIG_SND_SERIAL_U16550 is not set
# CONFIG_SND_MPU401 is not set
CONFIG_SND_PCI=y
# CONFIG_SND_AD1889 is not set
# CONFIG_SND_ALS300 is not set
# CONFIG_SND_ALS4000 is not set
# CONFIG_SND_ALI5451 is not set
# CONFIG_SND_ATIIXP is not set
# CONFIG_SND_ATIIXP_MODEM is not set
# CONFIG_SND_AU8810 is not set
# CONFIG_SND_AU8820 is not set
# CONFIG_SND_AU8830 is not set
# CONFIG_SND_AW2 is not set
# CONFIG_SND_AZT3328 is not set
# CONFIG_SND_BT87X is not set
# CONFIG_SND_CA0106 is not set
# CONFIG_SND_CMIPCI is not set
# CONFIG_SND_OXYGEN is not set
# CONFIG_SND_CS4281 is not set
# CONFIG_SND_CS46XX is not set
# CONFIG_SND_CS5530 is not set
# CONFIG_SND_CS5535AUDIO is not set
# CONFIG_SND_CTXFI is not set
# CONFIG_SND_DARLA20 is not set
# CONFIG_SND_GINA20 is not set
# CONFIG_SND_LAYLA20 is not set
# CONFIG_SND_DARLA24 is not set
# CONFIG_SND_GINA24 is not set
# CONFIG_SND_LAYLA24 is not set
# CONFIG_SND_MONA is not set
# CONFIG_SND_MIA is not set
# CONFIG_SND_ECHO3G is not set
# CONFIG_SND_INDIGO is not set
# CONFIG_SND_INDIGOIO is not set
# CONFIG_SND_INDIGODJ is not set
# CONFIG_SND_INDIGOIOX is not set
# CONFIG_SND_INDIGODJX is not set
# CONFIG_SND_EMU10K1 is not set
# CONFIG_SND_EMU10K1X is not set
# CONFIG_SND_ENS1370 is not set
# CONFIG_SND_ENS1371 is not set
# CONFIG_SND_ES1938 is not set
# CONFIG_SND_ES1968 is not set
# CONFIG_SND_FM801 is not set
CONFIG_SND_HDA_INTEL=y
CONFIG_SND_HDA_HWDEP=y
# CONFIG_SND_HDA_RECONFIG is not set
# CONFIG_SND_HDA_INPUT_BEEP is not set
# CONFIG_SND_HDA_INPUT_JACK is not set
# CONFIG_SND_HDA_PATCH_LOADER is not set
CONFIG_SND_HDA_CODEC_REALTEK=y
CONFIG_SND_HDA_CODEC_ANALOG=y
CONFIG_SND_HDA_CODEC_SIGMATEL=y
CONFIG_SND_HDA_CODEC_VIA=y
CONFIG_SND_HDA_CODEC_ATIHDMI=y
CONFIG_SND_HDA_CODEC_NVHDMI=y
CONFIG_SND_HDA_CODEC_INTELHDMI=y
CONFIG_SND_HDA_ELD=y
CONFIG_SND_HDA_CODEC_CIRRUS=y
CONFIG_SND_HDA_CODEC_CONEXANT=y
CONFIG_SND_HDA_CODEC_CA0110=y
CONFIG_SND_HDA_CODEC_CMEDIA=y
CONFIG_SND_HDA_CODEC_SI3054=y
CONFIG_SND_HDA_GENERIC=y
# CONFIG_SND_HDA_POWER_SAVE is not set
# CONFIG_SND_HDSP is not set
# CONFIG_SND_HDSPM is not set
# CONFIG_SND_HIFIER is not set
# CONFIG_SND_ICE1712 is not set
# CONFIG_SND_ICE1724 is not set
# CONFIG_SND_INTEL8X0 is not set
# CONFIG_SND_INTEL8X0M is not set
# CONFIG_SND_KORG1212 is not set
# CONFIG_SND_LX6464ES is not set
# CONFIG_SND_MAESTRO3 is not set
# CONFIG_SND_MIXART is not set
# CONFIG_SND_NM256 is not set
# CONFIG_SND_PCXHR is not set
# CONFIG_SND_RIPTIDE is not set
# CONFIG_SND_RME32 is not set
# CONFIG_SND_RME96 is not set
# CONFIG_SND_RME9652 is not set
# CONFIG_SND_SONICVIBES is not set
# CONFIG_SND_TRIDENT is not set
# CONFIG_SND_VIA82XX is not set
# CONFIG_SND_VIA82XX_MODEM is not set
# CONFIG_SND_VIRTUOSO is not set
# CONFIG_SND_VX222 is not set
# CONFIG_SND_YMFPCI is not set
CONFIG_SND_USB=y
# CONFIG_SND_USB_AUDIO is not set
# CONFIG_SND_USB_USX2Y is not set
# CONFIG_SND_USB_CAIAQ is not set
# CONFIG_SND_USB_US122L is not set
CONFIG_SND_PCMCIA=y
# CONFIG_SND_VXPOCKET is not set
# CONFIG_SND_PDAUDIOCF is not set
# CONFIG_SND_SOC is not set
# CONFIG_SOUND_PRIME is not set
CONFIG_HID_SUPPORT=y
CONFIG_HID=y
CONFIG_HIDRAW=y

#
# USB Input Devices
#
CONFIG_USB_HID=y
CONFIG_HID_PID=y
CONFIG_USB_HIDDEV=y

#
# Special HID drivers
#
CONFIG_HID_A4TECH=y
CONFIG_HID_APPLE=y
CONFIG_HID_BELKIN=y
CONFIG_HID_CHERRY=y
CONFIG_HID_CHICONY=y
CONFIG_HID_CYPRESS=y
CONFIG_HID_DRAGONRISE=y
# CONFIG_DRAGONRISE_FF is not set
CONFIG_HID_EZKEY=y
CONFIG_HID_KYE=y
CONFIG_HID_GYRATION=y
CONFIG_HID_TWINHAN=y
CONFIG_HID_KENSINGTON=y
CONFIG_HID_LOGITECH=y
CONFIG_LOGITECH_FF=y
# CONFIG_LOGIRUMBLEPAD2_FF is not set
CONFIG_HID_MICROSOFT=y
CONFIG_HID_MONTEREY=y
CONFIG_HID_NTRIG=y
CONFIG_HID_PANTHERLORD=y
CONFIG_PANTHERLORD_FF=y
CONFIG_HID_PETALYNX=y
CONFIG_HID_SAMSUNG=y
CONFIG_HID_SONY=y
CONFIG_HID_SUNPLUS=y
CONFIG_HID_GREENASIA=y
# CONFIG_GREENASIA_FF is not set
CONFIG_HID_SMARTJOYPLUS=y
# CONFIG_SMARTJOYPLUS_FF is not set
CONFIG_HID_TOPSEED=y
CONFIG_HID_THRUSTMASTER=y
CONFIG_THRUSTMASTER_FF=y
CONFIG_HID_ZEROPLUS=y
CONFIG_ZEROPLUS_FF=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB=y
CONFIG_USB_DEBUG=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y

#
# Miscellaneous USB options
#
CONFIG_USB_DEVICEFS=y
# CONFIG_USB_DEVICE_CLASS is not set
# CONFIG_USB_DYNAMIC_MINORS is not set
CONFIG_USB_SUSPEND=y
# CONFIG_USB_OTG is not set
CONFIG_USB_MON=y
# CONFIG_USB_WUSB is not set
# CONFIG_USB_WUSB_CBAF is not set

#
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
# CONFIG_USB_XHCI_HCD is not set
CONFIG_USB_EHCI_HCD=y
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
# CONFIG_USB_OXU210HP_HCD is not set
# CONFIG_USB_ISP116X_HCD is not set
# CONFIG_USB_ISP1760_HCD is not set
# CONFIG_USB_ISP1362_HCD is not set
CONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_UHCI_HCD=y
# CONFIG_USB_SL811_HCD is not set
# CONFIG_USB_R8A66597_HCD is not set
# CONFIG_USB_WHCI_HCD is not set
# CONFIG_USB_HWA_HCD is not set

#
# USB Device Class drivers
#
# CONFIG_USB_ACM is not set
CONFIG_USB_PRINTER=y
# CONFIG_USB_WDM is not set
# CONFIG_USB_TMC is not set

#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
#

#
# also be needed; see USB_STORAGE Help for more info
#
CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
# CONFIG_USB_STORAGE_ISD200 is not set
# CONFIG_USB_STORAGE_USBAT is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_STORAGE_SDDR55 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set
# CONFIG_USB_STORAGE_ALAUDA is not set
# CONFIG_USB_STORAGE_ONETOUCH is not set
# CONFIG_USB_STORAGE_KARMA is not set
# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
CONFIG_USB_LIBUSUAL=y

#
# USB Imaging devices
#
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set

#
# USB port drivers
#
# CONFIG_USB_SERIAL is not set

#
# USB Miscellaneous drivers
#
# CONFIG_USB_EMI62 is not set
# CONFIG_USB_EMI26 is not set
# CONFIG_USB_ADUTUX is not set
# CONFIG_USB_SEVSEG is not set
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_LEGOTOWER is not set
# CONFIG_USB_LCD is not set
# CONFIG_USB_BERRY_CHARGE is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_IDMOUSE is not set
# CONFIG_USB_FTDI_ELAN is not set
# CONFIG_USB_APPLEDISPLAY is not set
# CONFIG_USB_SISUSBVGA is not set
# CONFIG_USB_LD is not set
# CONFIG_USB_TRANCEVIBRATOR is not set
# CONFIG_USB_IOWARRIOR is not set
# CONFIG_USB_TEST is not set
# CONFIG_USB_ISIGHTFW is not set
# CONFIG_USB_VST is not set
# CONFIG_USB_GADGET is not set

#
# OTG and related infrastructure
#
# CONFIG_NOP_USB_XCEIV is not set
# CONFIG_UWB is not set
# CONFIG_MMC is not set
# CONFIG_MEMSTICK is not set
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y

#
# LED drivers
#
# CONFIG_LEDS_ALIX2 is not set
# CONFIG_LEDS_PCA9532 is not set
# CONFIG_LEDS_LP3944 is not set
# CONFIG_LEDS_CLEVO_MAIL is not set
# CONFIG_LEDS_PCA955X is not set
# CONFIG_LEDS_BD2802 is not set

#
# LED Triggers
#
CONFIG_LEDS_TRIGGERS=y
# CONFIG_LEDS_TRIGGER_TIMER is not set
# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set

#
# iptables trigger is under Netfilter config (LED target)
#
# CONFIG_ACCESSIBILITY is not set
# CONFIG_INFINIBAND is not set
CONFIG_EDAC=y

#
# Reporting subsystems
#
# CONFIG_EDAC_DEBUG is not set
CONFIG_EDAC_DECODE_MCE=y
# CONFIG_EDAC_MM_EDAC is not set
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
# CONFIG_RTC_HCTOSYS is not set
# CONFIG_RTC_DEBUG is not set

#
# RTC interfaces
#
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
# CONFIG_RTC_DRV_TEST is not set

#
# I2C RTC drivers
#
# CONFIG_RTC_DRV_DS1307 is not set
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_MAX6900 is not set
# CONFIG_RTC_DRV_RS5C372 is not set
# CONFIG_RTC_DRV_ISL1208 is not set
# CONFIG_RTC_DRV_X1205 is not set
# CONFIG_RTC_DRV_PCF8563 is not set
# CONFIG_RTC_DRV_PCF8583 is not set
# CONFIG_RTC_DRV_M41T80 is not set
# CONFIG_RTC_DRV_S35390A is not set
# CONFIG_RTC_DRV_FM3130 is not set
# CONFIG_RTC_DRV_RX8581 is not set
# CONFIG_RTC_DRV_RX8025 is not set

#
# SPI RTC drivers
#

#
# Platform RTC drivers
#
CONFIG_RTC_DRV_CMOS=y
# CONFIG_RTC_DRV_DS1286 is not set
# CONFIG_RTC_DRV_DS1511 is not set
# CONFIG_RTC_DRV_DS1553 is not set
# CONFIG_RTC_DRV_DS1742 is not set
# CONFIG_RTC_DRV_STK17TA8 is not set
# CONFIG_RTC_DRV_M48T86 is not set
# CONFIG_RTC_DRV_M48T35 is not set
# CONFIG_RTC_DRV_M48T59 is not set
# CONFIG_RTC_DRV_BQ4802 is not set
# CONFIG_RTC_DRV_V3020 is not set

#
# on-CPU RTC drivers
#
CONFIG_DMADEVICES=y

#
# DMA Devices
#
# CONFIG_INTEL_IOATDMA is not set
# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set

#
# TI VLYNQ
#
CONFIG_XEN_BALLOON=y
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DEV_EVTCHN=y
CONFIG_XEN_BACKEND=y
CONFIG_XEN_NETDEV_BACKEND=y
CONFIG_XEN_BLKDEV_BACKEND=y
CONFIG_XEN_BLKDEV_TAP=y
CONFIG_XEN_BLKBACK_PAGEMAP=y
CONFIG_XEN_PCIDEV_BACKEND=y
CONFIG_XEN_PCIDEV_BACKEND_VPCI=y
# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
# CONFIG_XEN_PCIDEV_BACKEND_CONTROLLER is not set
# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
CONFIG_XENFS=y
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_XEN_SYS_HYPERVISOR=y
CONFIG_XEN_XENBUS_FRONTEND=y
CONFIG_XEN_GNTDEV=y
CONFIG_XEN_S3=y
CONFIG_ACPI_PROCESSOR_XEN=y
CONFIG_XEN_PLATFORM_PCI=m
# CONFIG_STAGING is not set
CONFIG_X86_PLATFORM_DEVICES=y
# CONFIG_ACER_WMI is not set
# CONFIG_ASUS_LAPTOP is not set
# CONFIG_FUJITSU_LAPTOP is not set
# CONFIG_MSI_LAPTOP is not set
# CONFIG_PANASONIC_LAPTOP is not set
# CONFIG_COMPAL_LAPTOP is not set
# CONFIG_SONY_LAPTOP is not set
# CONFIG_THINKPAD_ACPI is not set
# CONFIG_INTEL_MENLOW is not set
CONFIG_EEEPC_LAPTOP=y
# CONFIG_ACPI_WMI is not set
# CONFIG_ACPI_ASUS is not set
# CONFIG_TOPSTAR_LAPTOP is not set
# CONFIG_ACPI_TOSHIBA is not set

#
# Firmware Drivers
#
# CONFIG_EDD is not set
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_EFI_VARS=y
# CONFIG_DELL_RBU is not set
# CONFIG_DCDBAS is not set
CONFIG_DMIID=y
# CONFIG_ISCSI_IBFT_FIND is not set

#
# File systems
#
# CONFIG_EXT2_FS is not set
CONFIG_EXT3_FS=y
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
# CONFIG_EXT4_FS is not set
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_FS_MBCACHE=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
CONFIG_FS_POSIX_ACL=y
# CONFIG_XFS_FS is not set
# CONFIG_GFS2_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_BTRFS_FS is not set
# CONFIG_NILFS2_FS is not set
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY=y
CONFIG_INOTIFY_USER=y
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_PRINT_QUOTA_WARNING is not set
CONFIG_QUOTA_TREE=y
# CONFIG_QFMT_V1 is not set
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y
# CONFIG_AUTOFS_FS is not set
CONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not set
CONFIG_GENERIC_ACL=y

#
# Caches
#
# CONFIG_FSCACHE is not set

#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
# CONFIG_UDF_FS is not set

#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
# CONFIG_NTFS_FS is not set

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
# CONFIG_CONFIGFS_FS is not set
CONFIG_MISC_FILESYSTEMS=y
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_ECRYPT_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_CRAMFS is not set
# CONFIG_SQUASHFS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=y
# CONFIG_NFS_V4_1 is not set
CONFIG_ROOT_NFS=y
CONFIG_NFSD=m
CONFIG_NFSD_V2_ACL=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_V3_ACL=y
CONFIG_NFSD_V4=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_EXPORTFS=m
CONFIG_NFS_ACL_SUPPORT=y
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y
CONFIG_SUNRPC_GSS=y
CONFIG_RPCSEC_GSS_KRB5=y
# CONFIG_RPCSEC_GSS_SPKM3 is not set
# CONFIG_SMB_FS is not set
CONFIG_CIFS=m
# CONFIG_CIFS_STATS is not set
CONFIG_CIFS_WEAK_PW_HASH=y
CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
# CONFIG_CIFS_DEBUG2 is not set
# CONFIG_CIFS_DFS_UPCALL is not set
# CONFIG_CIFS_EXPERIMENTAL is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set

#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
# CONFIG_ACORN_PARTITION is not set
CONFIG_OSF_PARTITION=y
CONFIG_AMIGA_PARTITION=y
# CONFIG_ATARI_PARTITION is not set
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_BSD_DISKLABEL=y
CONFIG_MINIX_SUBPARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_UNIXWARE_DISKLABEL=y
# CONFIG_LDM_PARTITION is not set
CONFIG_SGI_PARTITION=y
# CONFIG_ULTRIX_PARTITION is not set
CONFIG_SUN_PARTITION=y
CONFIG_KARMA_PARTITION=y
CONFIG_EFI_PARTITION=y
# CONFIG_SYSV68_PARTITION is not set
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=y
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
CONFIG_NLS_UTF8=y
# CONFIG_DLM is not set

#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_PRINTK_TIME=y
# CONFIG_ENABLE_WARN_DEPRECATED is not set
CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=2048
CONFIG_MAGIC_SYSRQ=y
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_UNUSED_SYMBOLS is not set
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
# CONFIG_DETECT_SOFTLOCKUP is not set
# CONFIG_DETECT_HUNG_TASK is not set
# CONFIG_SCHED_DEBUG is not set
CONFIG_SCHEDSTATS=y
CONFIG_TIMER_STATS=y
# CONFIG_DEBUG_OBJECTS is not set
# CONFIG_SLUB_DEBUG_ON is not set
# CONFIG_SLUB_STATS is not set
# CONFIG_DEBUG_KMEMLEAK is not set
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_RT_MUTEX_TESTER is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_PROVE_LOCKING is not set
# CONFIG_LOCK_STAT is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_KOBJECT is not set
CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_VIRTUAL is not set
# CONFIG_DEBUG_WRITECOUNT is not set
CONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_DEBUG_LIST is not set
# CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set
CONFIG_ARCH_WANT_FRAME_POINTERS=y
CONFIG_FRAME_POINTER=y
# CONFIG_BOOT_PRINTK_DELAY is not set
# CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
# CONFIG_KPROBES_SANITY_TEST is not set
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
# CONFIG_LKDTM is not set
# CONFIG_FAULT_INJECTION is not set
# CONFIG_LATENCYTOP is not set
CONFIG_SYSCTL_SYSCALL_CHECK=y
# CONFIG_DEBUG_PAGEALLOC is not set
CONFIG_USER_STACKTRACE_SUPPORT=y
CONFIG_NOP_TRACER=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_RING_BUFFER=y
CONFIG_EVENT_TRACING=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
# CONFIG_FUNCTION_TRACER is not set
# CONFIG_IRQSOFF_TRACER is not set
# CONFIG_SYSPROF_TRACER is not set
# CONFIG_SCHED_TRACER is not set
# CONFIG_FTRACE_SYSCALLS is not set
# CONFIG_BOOT_TRACER is not set
CONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
# CONFIG_PROFILE_ALL_BRANCHES is not set
# CONFIG_POWER_TRACER is not set
# CONFIG_STACK_TRACER is not set
# CONFIG_KMEMTRACE is not set
# CONFIG_WORKQUEUE_TRACER is not set
CONFIG_BLK_DEV_IO_TRACE=y
# CONFIG_FTRACE_STARTUP_TEST is not set
# CONFIG_MMIOTRACE is not set
# CONFIG_RING_BUFFER_BENCHMARK is not set
CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
# CONFIG_DYNAMIC_DEBUG is not set
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_SAMPLES is not set
CONFIG_HAVE_ARCH_KGDB=y
# CONFIG_KGDB is not set
CONFIG_HAVE_ARCH_KMEMCHECK=y
# CONFIG_STRICT_DEVMEM is not set
CONFIG_X86_VERBOSE_BOOTUP=y
CONFIG_EARLY_PRINTK=y
CONFIG_EARLY_PRINTK_DBGP=y
CONFIG_DEBUG_STACKOVERFLOW=y
# CONFIG_DEBUG_STACK_USAGE is not set
# CONFIG_DEBUG_PER_CPU_MAPS is not set
# CONFIG_X86_PTDUMP is not set
CONFIG_DEBUG_RODATA=y
# CONFIG_DEBUG_RODATA_TEST is not set
CONFIG_DEBUG_NX_TEST=m
# CONFIG_IOMMU_DEBUG is not set
# CONFIG_IOMMU_STRESS is not set
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IO_DELAY_TYPE_NONE=3
CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not set
CONFIG_DEFAULT_IO_DELAY_TYPE=0
CONFIG_DEBUG_BOOT_PARAMS=y
# CONFIG_CPA_DEBUG is not set
CONFIG_OPTIMIZE_INLINING=y

#
# Security options
#
CONFIG_KEYS=y
CONFIG_KEYS_DEBUG_PROC_KEYS=y
CONFIG_SECURITY=y
# CONFIG_SECURITYFS is not set
CONFIG_SECURITY_NETWORK=y
# CONFIG_SECURITY_NETWORK_XFRM is not set
# CONFIG_SECURITY_PATH is not set
CONFIG_SECURITY_FILE_CAPABILITIES=y
# CONFIG_SECURITY_ROOTPLUG is not set
CONFIG_LSM_MMAP_MIN_ADDR=65536
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
# CONFIG_SECURITY_SMACK is not set
# CONFIG_SECURITY_TOMOYO is not set
# CONFIG_IMA is not set
CONFIG_CRYPTO=y

#
# Crypto core or helper
#
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ALGAPI2=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_AEAD2=y
CONFIG_CRYPTO_BLKCIPHER=y
CONFIG_CRYPTO_BLKCIPHER2=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_HASH2=y
CONFIG_CRYPTO_RNG2=y
CONFIG_CRYPTO_PCOMP=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
# CONFIG_CRYPTO_GF128MUL is not set
CONFIG_CRYPTO_NULL=y
CONFIG_CRYPTO_WORKQUEUE=y
# CONFIG_CRYPTO_CRYPTD is not set
CONFIG_CRYPTO_AUTHENC=y
# CONFIG_CRYPTO_TEST is not set

#
# Authenticated Encryption with Associated Data
#
# CONFIG_CRYPTO_CCM is not set
# CONFIG_CRYPTO_GCM is not set
# CONFIG_CRYPTO_SEQIV is not set

#
# Block modes
#
CONFIG_CRYPTO_CBC=y
# CONFIG_CRYPTO_CTR is not set
# CONFIG_CRYPTO_CTS is not set
CONFIG_CRYPTO_ECB=y
# CONFIG_CRYPTO_LRW is not set
# CONFIG_CRYPTO_PCBC is not set
# CONFIG_CRYPTO_XTS is not set

#
# Hash modes
#
CONFIG_CRYPTO_HMAC=y
# CONFIG_CRYPTO_XCBC is not set
# CONFIG_CRYPTO_VMAC is not set

#
# Digest
#
CONFIG_CRYPTO_CRC32C=y
# CONFIG_CRYPTO_CRC32C_INTEL is not set
# CONFIG_CRYPTO_GHASH is not set
# CONFIG_CRYPTO_MD4 is not set
CONFIG_CRYPTO_MD5=y
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_RMD128 is not set
# CONFIG_CRYPTO_RMD160 is not set
# CONFIG_CRYPTO_RMD256 is not set
# CONFIG_CRYPTO_RMD320 is not set
CONFIG_CRYPTO_SHA1=y
# CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set
# CONFIG_CRYPTO_TGR192 is not set
# CONFIG_CRYPTO_WP512 is not set

#
# Ciphers
#
CONFIG_CRYPTO_AES=y
# CONFIG_CRYPTO_AES_X86_64 is not set
# CONFIG_CRYPTO_AES_NI_INTEL is not set
# CONFIG_CRYPTO_ANUBIS is not set
CONFIG_CRYPTO_ARC4=y
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_CAMELLIA is not set
# CONFIG_CRYPTO_CAST5 is not set
# CONFIG_CRYPTO_CAST6 is not set
CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_FCRYPT is not set
# CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_SALSA20 is not set
# CONFIG_CRYPTO_SALSA20_X86_64 is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_TWOFISH_X86_64 is not set

#
# Compression
#
CONFIG_CRYPTO_DEFLATE=y
CONFIG_CRYPTO_ZLIB=y
CONFIG_CRYPTO_LZO=y

#
# Random Number Generation
#
# CONFIG_CRYPTO_ANSI_CPRNG is not set
CONFIG_CRYPTO_HW=y
# CONFIG_CRYPTO_DEV_PADLOCK is not set
# CONFIG_CRYPTO_DEV_HIFN_795X is not set
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_KVM_INTEL=y
CONFIG_KVM_AMD=y
# CONFIG_VIRTIO_PCI is not set
# CONFIG_VIRTIO_BALLOON is not set
CONFIG_BINARY_PRINTF=y

#
# Library routines
#
CONFIG_BITREVERSE=y
CONFIG_GENERIC_FIND_FIRST_BIT=y
CONFIG_GENERIC_FIND_NEXT_BIT=y
CONFIG_GENERIC_FIND_LAST_BIT=y
CONFIG_CRC_CCITT=y
# CONFIG_CRC16 is not set
CONFIG_CRC_T10DIF=y
# CONFIG_CRC_ITU_T is not set
CONFIG_CRC32=y
# CONFIG_CRC7 is not set
# CONFIG_LIBCRC32C is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_DECOMPRESS=y
CONFIG_DECOMPRESS_GZIP=y
CONFIG_DECOMPRESS_BZIP2=y
CONFIG_DECOMPRESS_LZMA=y
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=y
CONFIG_TEXTSEARCH_BM=y
CONFIG_TEXTSEARCH_FSM=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
CONFIG_NLATTR=y

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Dec 05 18:11:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Mon, 05 Dec 2011 18:11:32 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RXd0Y-0006AR-Ur; Mon, 05 Dec 2011 18:11:18 +0000
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>) id 1RXd0U-000660-Px
	for xen-devel@lists.xensource.com; Mon, 05 Dec 2011 18:11:15 +0000
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1323108629!5440616!2
X-Originating-IP: [62.200.22.115]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjIuMjAwLjIyLjExNSA9PiA5MjAyNg==\n
X-StarScan-Version: 6.4.2; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14036 invoked from network); 5 Dec 2011 18:10:29 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Dec 2011 18:10:29 -0000
X-IronPort-AV: E=Sophos;i="4.71,300,1320624000"; 
   d="scan'208";a="9297531"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Dec 2011 18:10:29 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.213.0; Mon, 5 Dec 2011 18:10:29 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RXczl-0003kR-2X; Mon, 05 Dec 2011 18:10:29 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RXczl-0006Wb-1c;
	Mon, 05 Dec 2011 18:10:29 +0000
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Mon, 5 Dec 2011 18:10:18 +0000
Message-ID: <1323108621-22654-13-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1323108621-22654-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1323108621-22654-1-git-send-email-ian.jackson@eu.citrix.com>
MIME-Version: 1.0
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 12/15] libxl: Use GC_INIT and GC_FREE everywhere
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Replace
    libxl__gc gc = LIBXL_INIT_GC(ctx);
    ...
    libxl__free_all(&gc);
with
    GC_INIT(ctx);
    ...
    GC_FREE;
throughout with a couple of perl runes.

We must then adjust uses of the resulting gc for pointerness, which is
mostly just replacing all occurrences of "&gc" with "gc".  Also a
couple of unusual uses of LIBXL_INIT_GC needed to be fixed up by hand.

Here are those runes:
 perl -i -pe 's/\Q    libxl__gc gc = LIBXL_INIT_GC(ctx);/    GC_INIT(ctx);/' tools/libxl/*.c
 perl -i -pe 's/\Q    libxl__free_all(&gc);/    GC_FREE;/' tools/libxl/*.c

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/libxl.c            |  590 ++++++++++++++++++++--------------------
 tools/libxl/libxl_bootloader.c |   14 +-
 tools/libxl/libxl_create.c     |   12 +-
 tools/libxl/libxl_dom.c        |   16 +-
 tools/libxl/libxl_pci.c        |   34 ++--
 tools/libxl/libxl_qmp.c        |   32 +-
 tools/libxl/libxl_utils.c      |   36 ++--
 7 files changed, 367 insertions(+), 367 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 7488538..3a8cfe3 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -232,19 +232,19 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid,
 int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid,
                         const char *old_name, const char *new_name)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = libxl__domain_rename(&gc, domid, old_name, new_name, XBT_NULL);
-    libxl__free_all(&gc);
+    rc = libxl__domain_rename(gc, domid, old_name, new_name, XBT_NULL);
+    GC_FREE;
     return rc;
 }
 
 int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = 0;
 
-    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
+    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
         LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Called domain_resume on "
                 "non-cooperative hvm domain %u", domid);
         rc = ERROR_NI;
@@ -264,7 +264,7 @@ int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid)
         rc = ERROR_FAIL;
     }
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -277,7 +277,7 @@ out:
 int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
                           libxl_domain_create_info *info, const char *name_suffix, libxl_uuid new_uuid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     struct xs_permissions roperm[2];
     xs_transaction_t t;
     char *preserved_name;
@@ -287,27 +287,27 @@ int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
 
     int rc;
 
-    preserved_name = libxl__sprintf(&gc, "%s%s", info->name, name_suffix);
+    preserved_name = libxl__sprintf(gc, "%s%s", info->name, name_suffix);
     if (!preserved_name) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
-    uuid_string = libxl__uuid2string(&gc, new_uuid);
+    uuid_string = libxl__uuid2string(gc, new_uuid);
     if (!uuid_string) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
-    vm_path = libxl__sprintf(&gc, "/vm/%s", uuid_string);
+    vm_path = libxl__sprintf(gc, "/vm/%s", uuid_string);
     if (!vm_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
@@ -323,20 +323,20 @@ int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
     xs_mkdir(ctx->xsh, t, vm_path);
     xs_set_permissions(ctx->xsh, t, vm_path, roperm, ARRAY_SIZE(roperm));
 
-    xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
-    rc = libxl__domain_rename(&gc, domid, info->name, preserved_name, t);
+    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
+    rc = libxl__domain_rename(gc, domid, info->name, preserved_name, t);
     if (rc) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return rc;
     }
 
-    xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
+    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
 
     if (!xs_transaction_end(ctx->xsh, t, 0))
         if (errno == EAGAIN)
             goto retry_transaction;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -478,16 +478,16 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm)
 int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info,
                          uint32_t domid, int fd)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    libxl_domain_type type = libxl__domain_type(&gc, domid);
+    GC_INIT(ctx);
+    libxl_domain_type type = libxl__domain_type(gc, domid);
     int live = info != NULL && info->flags & XL_SUSPEND_LIVE;
     int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG;
     int rc = 0;
 
-    rc = libxl__domain_suspend_common(&gc, domid, fd, type, live, debug);
+    rc = libxl__domain_suspend_common(gc, domid, fd, type, live, debug);
     if (!rc && type == LIBXL_DOMAIN_TYPE_HVM)
-        rc = libxl__domain_save_device_model(&gc, domid, fd);
-    libxl__free_all(&gc);
+        rc = libxl__domain_save_device_model(gc, domid, fd);
+    GC_FREE;
     return rc;
 }
 
@@ -517,17 +517,17 @@ int libxl_domain_core_dump(libxl_ctx *ctx, uint32_t domid,
 
 int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *path;
     char *state;
     int ret, rc = 0;
 
-    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
-        path = libxl__sprintf(&gc, "/local/domain/0/device-model/%d/state", domid);
-        state = libxl__xs_read(&gc, XBT_NULL, path);
+    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
+        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+        state = libxl__xs_read(gc, XBT_NULL, path);
         if (state != NULL && !strcmp(state, "paused")) {
-            libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/0/device-model/%d/command", domid), "continue");
-            libxl__wait_for_device_model(&gc, domid, "running",
+            libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid), "continue");
+            libxl__wait_for_device_model(gc, domid, "running",
                                          NULL, NULL, NULL);
         }
     }
@@ -536,7 +536,7 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unpausing domain %d", domid);
         rc = ERROR_FAIL;
     }
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -550,42 +550,42 @@ static char *req_table[] = {
 
 int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *shutdown_path;
     char *dom_path;
 
     if (req > ARRAY_SIZE(req_table)) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_INVAL;
     }
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
-    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
+    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
         unsigned long pvdriver = 0;
         int ret;
         ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
         if (ret<0) {
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting HVM callback IRQ");
-            libxl__free_all(&gc);
+            GC_FREE;
             return ERROR_FAIL;
         }
         if (!pvdriver) {
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "HVM domain without PV drivers:"
                        " graceful shutdown not possible, use destroy");
-            libxl__free_all(&gc);
+            GC_FREE;
             return ERROR_FAIL;
         }
     }
 
-    shutdown_path = libxl__sprintf(&gc, "%s/control/shutdown", dom_path);
+    shutdown_path = libxl__sprintf(gc, "%s/control/shutdown", dom_path);
     xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req]));
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -607,7 +607,7 @@ int libxl_wait_for_domain_death(libxl_ctx *ctx, uint32_t domid, libxl_waiter *wa
 
 int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_device_disk *disks, int num_disks, libxl_waiter *waiter)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int i, rc = -1;
     uint32_t domid = libxl_get_stubdom_id(ctx, guest_domid);
 
@@ -616,7 +616,7 @@ int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_devic
 
     for (i = 0; i < num_disks; i++) {
         if (asprintf(&(waiter[i].path), "%s/device/vbd/%d/eject",
-                     libxl__xs_get_dompath(&gc, domid),
+                     libxl__xs_get_dompath(gc, domid),
                      libxl__device_disk_dev_number(disks[i].vdev,
                                                    NULL, NULL)) < 0)
             goto out;
@@ -626,7 +626,7 @@ int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_devic
     }
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -680,22 +680,22 @@ int libxl_event_get_domain_death_info(libxl_ctx *ctx, uint32_t domid, libxl_even
 
 int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *path;
     char *backend;
     char *value;
     char backend_type[BACKEND_STRING_SIZE+1];
 
-    value = libxl__xs_read(&gc, XBT_NULL, event->path);
+    value = libxl__xs_read(gc, XBT_NULL, event->path);
 
     if (!value || strcmp(value,  "eject")) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return 0;
     }
 
     path = strdup(event->path);
     path[strlen(path) - 6] = '\0';
-    backend = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", path));
+    backend = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", path));
 
     sscanf(backend,
             "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE) "[a-z]/%*d/%*d",
@@ -711,19 +711,19 @@ int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event
     disk->pdev_path = strdup("");
     disk->format = LIBXL_DISK_FORMAT_EMPTY;
     /* this value is returned to the user: do not free right away */
-    disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend), NULL);
+    disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/dev", backend), NULL);
     disk->removable = 1;
     disk->readwrite = 0;
     disk->is_cdrom = 1;
 
     free(path);
-    libxl__free_all(&gc);
+    GC_FREE;
     return 1;
 }
 
 int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_dominfo dominfo;
     char *dom_path;
     char *vm_path;
@@ -740,40 +740,40 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
         return rc;
     }
 
-    switch (libxl__domain_type(&gc, domid)) {
+    switch (libxl__domain_type(gc, domid)) {
     case LIBXL_DOMAIN_TYPE_HVM:
         dm_present = 1;
         break;
     case LIBXL_DOMAIN_TYPE_PV:
-        pid = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/%d/image/device-model-pid", domid));
+        pid = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/%d/image/device-model-pid", domid));
         dm_present = (pid != NULL);
         break;
     default:
         abort();
     }
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
         rc = ERROR_FAIL;
         goto out;
     }
 
-    if (libxl__device_pci_destroy_all(&gc, domid) < 0)
+    if (libxl__device_pci_destroy_all(gc, domid) < 0)
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "pci shutdown failed for domid %d", domid);
     rc = xc_domain_pause(ctx->xch, domid);
     if (rc < 0) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "xc_domain_pause failed for %d", domid);
     }
     if (dm_present) {
-        if (libxl__destroy_device_model(&gc, domid) < 0)
+        if (libxl__destroy_device_model(gc, domid) < 0)
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl__destroy_device_model failed for %d", domid);
 
-        libxl__qmp_cleanup(&gc, domid);
+        libxl__qmp_cleanup(gc, domid);
     }
-    if (libxl__devices_destroy(&gc, domid, force) < 0)
+    if (libxl__devices_destroy(gc, domid, force) < 0)
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_devices_dispose failed for %d", domid);
 
-    vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
+    vm_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path));
     if (vm_path)
         if (!xs_rm(ctx->xsh, XBT_NULL, vm_path))
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", vm_path);
@@ -781,9 +781,9 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
     if (!xs_rm(ctx->xsh, XBT_NULL, dom_path))
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", dom_path);
 
-    xs_rm(ctx->xsh, XBT_NULL, libxl__xs_libxl_path(&gc, domid));
+    xs_rm(ctx->xsh, XBT_NULL, libxl__xs_libxl_path(gc, domid));
 
-    libxl__userdata_destroyall(&gc, domid);
+    libxl__userdata_destroyall(gc, domid);
 
     rc = xc_domain_destroy(ctx->xch, domid);
     if (rc < 0) {
@@ -793,16 +793,16 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
     }
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_console_type type)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *p = libxl__sprintf(&gc, "%s/xenconsole", libxl_private_bindir_path());
-    char *domid_s = libxl__sprintf(&gc, "%d", domid);
-    char *cons_num_s = libxl__sprintf(&gc, "%d", cons_num);
+    GC_INIT(ctx);
+    char *p = libxl__sprintf(gc, "%s/xenconsole", libxl_private_bindir_path());
+    char *domid_s = libxl__sprintf(gc, "%d", domid);
+    char *cons_num_s = libxl__sprintf(gc, "%d", cons_num);
     char *cons_type_s;
 
     switch (type) {
@@ -819,20 +819,20 @@ int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_conso
     execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, (void *)NULL);
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return ERROR_FAIL;
 }
 
 int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm);
     int rc;
     if (stubdomid)
         rc = libxl_console_exec(ctx, stubdomid,
                                 STUBDOM_CONSOLE_SERIAL, LIBXL_CONSOLE_TYPE_PV);
     else {
-        switch (libxl__domain_type(&gc, domid_vm)) {
+        switch (libxl__domain_type(gc, domid_vm)) {
         case LIBXL_DOMAIN_TYPE_HVM:
             rc = libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSOLE_TYPE_SERIAL);
             break;
@@ -843,13 +843,13 @@ int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
             abort();
         }
     }
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     const char *vnc_port;
     const char *vnc_listen = NULL, *vnc_pass = NULL;
     int port = 0, autopass_fd = -1;
@@ -860,19 +860,19 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
         NULL,
     };
 
-    vnc_port = libxl__xs_read(&gc, XBT_NULL,
-                            libxl__sprintf(&gc,
+    vnc_port = libxl__xs_read(gc, XBT_NULL,
+                            libxl__sprintf(gc,
                             "/local/domain/%d/console/vnc-port", domid));
     if ( vnc_port )
         port = atoi(vnc_port) - 5900;
 
-    vnc_listen = libxl__xs_read(&gc, XBT_NULL,
-                                libxl__sprintf(&gc,
+    vnc_listen = libxl__xs_read(gc, XBT_NULL,
+                                libxl__sprintf(gc,
                             "/local/domain/%d/console/vnc-listen", domid));
 
     if ( autopass )
-        vnc_pass = libxl__xs_read(&gc, XBT_NULL,
-                                  libxl__sprintf(&gc,
+        vnc_pass = libxl__xs_read(gc, XBT_NULL,
+                                  libxl__sprintf(gc,
                             "/local/domain/%d/console/vnc-pass", domid));
 
     if ( NULL == vnc_listen )
@@ -881,7 +881,7 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
     if ( (vnc_bin = getenv("VNCVIEWER")) )
         args[0] = vnc_bin;
 
-    args[1] = libxl__sprintf(&gc, "%s:%d", vnc_listen, port);
+    args[1] = libxl__sprintf(gc, "%s:%d", vnc_listen, port);
 
     if ( vnc_pass ) {
         char tmpname[] = "/tmp/vncautopass.XXXXXX";
@@ -916,7 +916,7 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
     abort();
 
  x_fail:
-    libxl__free_all(&gc);
+    GC_FREE;
     return ERROR_FAIL;
 }
 
@@ -970,17 +970,17 @@ static int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
 
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     char *dev;
     libxl__device device;
     int major, minor, rc;
 
-    rc = libxl__device_disk_set_backend(&gc, disk);
+    rc = libxl__device_disk_set_backend(gc, disk);
     if (rc) goto out;
 
-    rc = libxl__device_disk_set_backend(&gc, disk);
+    rc = libxl__device_disk_set_backend(gc, disk);
     if (rc) goto out;
 
     front = flexarray_make(16, 1);
@@ -1001,7 +1001,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
         goto out_free;
     }
 
-    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
     if (rc != 0) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
                " virtual disk identifier %s", disk->vdev);
@@ -1014,7 +1014,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
     do_backend_phy:
             libxl__device_physdisk_major_minor(dev, &major, &minor);
             flexarray_append(back, "physical-device");
-            flexarray_append(back, libxl__sprintf(&gc, "%x:%x", major, minor));
+            flexarray_append(back, libxl__sprintf(gc, "%x:%x", major, minor));
 
             flexarray_append(back, "params");
             flexarray_append(back, dev);
@@ -1022,13 +1022,13 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
             assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD);
             break;
         case LIBXL_DISK_BACKEND_TAP:
-            dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format);
+            dev = libxl__blktap_devpath(gc, disk->pdev_path, disk->format);
             if (!dev) {
                 rc = ERROR_FAIL;
                 goto out_free;
             }
             flexarray_append(back, "tapdisk-params");
-            flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
+            flexarray_append(back, libxl__sprintf(gc, "%s:%s",
                 libxl__device_disk_string_of_format(disk->format),
                 disk->pdev_path));
 
@@ -1036,7 +1036,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
             goto do_backend_phy;
         case LIBXL_DISK_BACKEND_QDISK:
             flexarray_append(back, "params");
-            flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
+            flexarray_append(back, libxl__sprintf(gc, "%s:%s",
                           libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
             assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK);
             break;
@@ -1047,15 +1047,15 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
     }
 
     flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
     flexarray_append(back, "online");
     flexarray_append(back, "1");
     flexarray_append(back, "removable");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", (disk->removable) ? 1 : 0));
+    flexarray_append(back, libxl__sprintf(gc, "%d", (disk->removable) ? 1 : 0));
     flexarray_append(back, "bootable");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     flexarray_append(back, "dev");
     flexarray_append(back, disk->vdev);
     flexarray_append(back, "type");
@@ -1066,17 +1066,17 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
     flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
 
     flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid));
     flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
     flexarray_append(front, "virtual-device");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", device.devid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", device.devid));
     flexarray_append(front, "device-type");
     flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk");
 
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
 
     rc = 0;
 
@@ -1084,39 +1084,39 @@ out_free:
     flexarray_free(back);
     flexarray_free(front);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid,
                              libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1168,27 +1168,27 @@ static void libxl__device_disk_from_xs_be(libxl__gc *gc,
 int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
                                int devid, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *path;
     int rc = ERROR_FAIL;
 
     libxl_device_disk_init(ctx, disk);
 
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     if (!dompath) {
         goto out;
     }
-    path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
+    path = libxl__xs_read(gc, XBT_NULL,
+                          libxl__sprintf(gc, "%s/device/vbd/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
 
-    libxl__device_disk_from_xs_be(&gc, path, disk);
+    libxl__device_disk_from_xs_be(gc, path, disk);
 
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1228,22 +1228,22 @@ static int libxl__append_disk_list_of_type(libxl__gc *gc,
 
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_device_disk *disks = NULL;
     int rc;
 
     *num = 0;
 
-    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
+    rc = libxl__append_disk_list_of_type(gc, domid, "vbd", &disks, num);
     if (rc) goto out_err;
 
-    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
+    rc = libxl__append_disk_list_of_type(gc, domid, "tap", &disks, num);
     if (rc) goto out_err;
 
-    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
+    rc = libxl__append_disk_list_of_type(gc, domid, "qdisk", &disks, num);
     if (rc) goto out_err;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return disks;
 
 out_err:
@@ -1259,35 +1259,35 @@ out_err:
 int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk, libxl_diskinfo *diskinfo)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *diskpath;
     char *val;
 
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
 
     /* tap devices entries in xenstore are written as vbd devices. */
-    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
+    diskpath = libxl__sprintf(gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
     diskinfo->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", diskpath), NULL);
+                                libxl__sprintf(gc, "%s/backend", diskpath), NULL);
     if (!diskinfo->backend) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend-id", diskpath));
     diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/state", diskpath));
     diskinfo->state = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/event-channel", diskpath));
     diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/ring-ref", diskpath));
     diskinfo->rref = val ? strtoul(val, NULL, 10) : -1;
     diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend));
+                                 libxl__sprintf(gc, "%s/frontend", diskinfo->backend), NULL);
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend-id", diskinfo->backend));
     diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -1331,12 +1331,12 @@ out:
 
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dev = NULL;
     char *ret = NULL;
     int rc;
 
-    rc = libxl__device_disk_set_backend(&gc, disk);
+    rc = libxl__device_disk_set_backend(gc, disk);
     if (rc) goto out;
 
     switch (disk->backend) {
@@ -1355,7 +1355,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
                 dev = disk->pdev_path;
                 break;
             case LIBXL_DISK_FORMAT_VHD:
-                dev = libxl__blktap_devpath(&gc, disk->pdev_path,
+                dev = libxl__blktap_devpath(gc, disk->pdev_path,
                                             disk->format);
                 break;
             case LIBXL_DISK_FORMAT_QCOW:
@@ -1386,7 +1386,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
  out:
     if (dev != NULL)
         ret = strdup(dev);
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -1448,7 +1448,7 @@ static int libxl__device_from_nic(libxl__gc *gc, uint32_t domid,
 
 int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     libxl__device device;
@@ -1467,59 +1467,59 @@ int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic)
     }
 
     if (nic->devid == -1) {
-        if (!(dompath = libxl__xs_get_dompath(&gc, domid))) {
+        if (!(dompath = libxl__xs_get_dompath(gc, domid))) {
             rc = ERROR_FAIL;
             goto out_free;
         }
-        if (!(l = libxl__xs_directory(&gc, XBT_NULL,
-                                     libxl__sprintf(&gc, "%s/device/vif", dompath), &nb))) {
+        if (!(l = libxl__xs_directory(gc, XBT_NULL,
+                                     libxl__sprintf(gc, "%s/device/vif", dompath), &nb))) {
             nic->devid = 0;
         } else {
             nic->devid = strtoul(l[nb - 1], NULL, 10) + 1;
         }
     }
 
-    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
     if ( rc != 0 ) goto out_free;
 
     flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
     flexarray_append(back, "online");
     flexarray_append(back, "1");
     flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     if (nic->script) {
         flexarray_append(back, "script");
         flexarray_append(back, nic->script[0]=='/' ? nic->script
-                         : libxl__sprintf(&gc, "%s/%s",
+                         : libxl__sprintf(gc, "%s/%s",
                                           libxl_xen_script_dir_path(),
                                           nic->script));
     }
     flexarray_append(back, "mac");
-    flexarray_append(back,libxl__sprintf(&gc,
+    flexarray_append(back,libxl__sprintf(gc,
                                     LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
     if (nic->ip) {
         flexarray_append(back, "ip");
-        flexarray_append(back, libxl__strdup(&gc, nic->ip));
+        flexarray_append(back, libxl__strdup(gc, nic->ip));
     }
 
     flexarray_append(back, "bridge");
-    flexarray_append(back, libxl__strdup(&gc, nic->bridge));
+    flexarray_append(back, libxl__strdup(gc, nic->bridge));
     flexarray_append(back, "handle");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", nic->devid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", nic->devid));
 
     flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->backend_domid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", nic->backend_domid));
     flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
     flexarray_append(front, "handle");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->devid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", nic->devid));
     flexarray_append(front, "mac");
-    flexarray_append(front, libxl__sprintf(&gc,
+    flexarray_append(front, libxl__sprintf(gc,
                                     LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
 
     /* FIXME: wait for plug */
     rc = 0;
@@ -1527,39 +1527,39 @@ out_free:
     flexarray_free(back);
     flexarray_free(front);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1607,26 +1607,26 @@ static void libxl__device_nic_from_xs_be(libxl__gc *gc,
 int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
                               int devid, libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *path;
     int rc = ERROR_FAIL;
 
     memset(nic, 0, sizeof (libxl_device_nic));
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     if (!dompath)
         goto out;
 
-    path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vif/%d/backend",
+    path = libxl__xs_read(gc, XBT_NULL,
+                          libxl__sprintf(gc, "%s/device/vif/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
 
-    libxl__device_nic_from_xs_be(&gc, path, nic);
+    libxl__device_nic_from_xs_be(gc, path, nic);
 
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1665,16 +1665,16 @@ static int libxl__append_nic_list_of_type(libxl__gc *gc,
 
 libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_device_nic *nics = NULL;
     int rc;
 
     *num = 0;
 
-    rc = libxl__append_nic_list_of_type(&gc, domid, "vif", &nics, num);
+    rc = libxl__append_nic_list_of_type(gc, domid, "vif", &nics, num);
     if (rc) goto out_err;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return nics;
 
 out_err:
@@ -1690,36 +1690,36 @@ out_err:
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *nicpath;
     char *val;
 
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     nicinfo->devid = nic->devid;
 
-    nicpath = libxl__sprintf(&gc, "%s/device/vif/%d", dompath, nicinfo->devid);
+    nicpath = libxl__sprintf(gc, "%s/device/vif/%d", dompath, nicinfo->devid);
     nicinfo->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", nicpath), NULL);
+                                libxl__sprintf(gc, "%s/backend", nicpath), NULL);
     if (!nicinfo->backend) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend-id", nicpath));
     nicinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/state", nicpath));
     nicinfo->state = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/event-channel", nicpath));
     nicinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/tx-ring-ref", nicpath));
     nicinfo->rref_tx = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/rx-ring-ref", nicpath));
     nicinfo->rref_rx = val ? strtoul(val, NULL, 10) : -1;
     nicinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", nicinfo->backend), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nicinfo->backend));
+                                 libxl__sprintf(gc, "%s/frontend", nicinfo->backend), NULL);
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend-id", nicinfo->backend));
     nicinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -1825,7 +1825,7 @@ static int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid,
 
 int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     libxl__device device;
@@ -1842,64 +1842,64 @@ int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
         goto out_free;
     }
 
-    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
     if (rc != 0) goto out_free;
 
     flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
     flexarray_append(back, "online");
     flexarray_append(back, "1");
     flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     flexarray_append(back, "domain");
-    flexarray_append(back, libxl__domid_to_name(&gc, domid));
+    flexarray_append(back, libxl__domid_to_name(gc, domid));
 
     flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", vkb->backend_domid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", vkb->backend_domid));
     flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
 
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
     rc = 0;
 out_free:
     flexarray_free(back);
     flexarray_free(front);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_vkb *vkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_vkb *vkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1935,7 +1935,7 @@ static int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid,
 
 int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     libxl__device device;
@@ -1952,20 +1952,20 @@ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
         goto out_free;
     }
 
-    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
     if (rc != 0) goto out_free;
 
-    flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid));
+    flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", domid));
     flexarray_append_pair(back, "online", "1");
-    flexarray_append_pair(back, "state", libxl__sprintf(&gc, "%d", 1));
-    flexarray_append_pair(back, "domain", libxl__domid_to_name(&gc, domid));
-    flexarray_append_pair(back, "vnc", libxl__sprintf(&gc, "%d", vfb->vnc));
+    flexarray_append_pair(back, "state", libxl__sprintf(gc, "%d", 1));
+    flexarray_append_pair(back, "domain", libxl__domid_to_name(gc, domid));
+    flexarray_append_pair(back, "vnc", libxl__sprintf(gc, "%d", vfb->vnc));
     flexarray_append_pair(back, "vnclisten", vfb->vnclisten);
     flexarray_append_pair(back, "vncpasswd", vfb->vncpasswd);
-    flexarray_append_pair(back, "vncdisplay", libxl__sprintf(&gc, "%d", vfb->vncdisplay));
-    flexarray_append_pair(back, "vncunused", libxl__sprintf(&gc, "%d", vfb->vncunused));
-    flexarray_append_pair(back, "sdl", libxl__sprintf(&gc, "%d", vfb->sdl));
-    flexarray_append_pair(back, "opengl", libxl__sprintf(&gc, "%d", vfb->opengl));
+    flexarray_append_pair(back, "vncdisplay", libxl__sprintf(gc, "%d", vfb->vncdisplay));
+    flexarray_append_pair(back, "vncunused", libxl__sprintf(gc, "%d", vfb->vncunused));
+    flexarray_append_pair(back, "sdl", libxl__sprintf(gc, "%d", vfb->sdl));
+    flexarray_append_pair(back, "opengl", libxl__sprintf(gc, "%d", vfb->opengl));
     if (vfb->xauthority) {
         flexarray_append_pair(back, "xauthority", vfb->xauthority);
     }
@@ -1973,50 +1973,50 @@ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
         flexarray_append_pair(back, "display", vfb->display);
     }
 
-    flexarray_append_pair(front, "backend-id", libxl__sprintf(&gc, "%d", vfb->backend_domid));
-    flexarray_append_pair(front, "state", libxl__sprintf(&gc, "%d", 1));
+    flexarray_append_pair(front, "backend-id", libxl__sprintf(gc, "%d", vfb->backend_domid));
+    flexarray_append_pair(front, "state", libxl__sprintf(gc, "%d", 1));
 
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
     rc = 0;
 out_free:
     flexarray_free(front);
     flexarray_free(back);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_vfb *vfb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_vfb *vfb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2024,13 +2024,13 @@ out:
 
 int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *mem, *endptr;
     uint32_t memorykb;
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     int rc = 1;
 
-    mem = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/memory/target", dompath));
+    mem = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/memory/target", dompath));
     if (!mem) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot get memory info from %s/memory/target\n", dompath);
         goto out;
@@ -2055,7 +2055,7 @@ int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
 
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2163,12 +2163,12 @@ retry:
 int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid,
         int32_t target_memkb, int relative, int enforce)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = 1, abort = 0;
     uint32_t memorykb = 0, videoram = 0;
     uint32_t current_target_memkb = 0, new_target_memkb = 0;
     char *memmax, *endptr, *videoram_s = NULL, *target = NULL;
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     xc_domaininfo_t info;
     libxl_dominfo ptr;
     char *uuid;
@@ -2177,11 +2177,11 @@ int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid,
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
 
-    target = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+    target = libxl__xs_read(gc, t, libxl__sprintf(gc,
                 "%s/memory/target", dompath));
     if (!target && !domid) {
         xs_transaction_end(ctx->xsh, t, 1);
-        rc = libxl__fill_dom0_memory_info(&gc, &current_target_memkb);
+        rc = libxl__fill_dom0_memory_info(gc, &current_target_memkb);
         if (rc < 0) {
             abort = 1;
             goto out;
@@ -2203,7 +2203,7 @@ retry_transaction:
             goto out;
         }
     }
-    memmax = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+    memmax = libxl__xs_read(gc, t, libxl__sprintf(gc,
                 "%s/memory/static-max", dompath));
     if (!memmax) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
@@ -2243,7 +2243,7 @@ retry_transaction:
         abort = 1;
         goto out;
     }
-    videoram_s = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+    videoram_s = libxl__xs_read(gc, t, libxl__sprintf(gc,
                 "%s/memory/videoram", dompath));
     videoram = videoram_s ? atoi(videoram_s) : 0;
 
@@ -2272,7 +2272,7 @@ retry_transaction:
         goto out;
     }
 
-    libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/memory/target",
+    libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/memory/target",
                 dompath), "%"PRIu32, new_target_memkb);
     rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info);
     if (rc != 1 || info.domain != domid) {
@@ -2280,8 +2280,8 @@ retry_transaction:
         goto out;
     }
     xcinfo2xlinfo(&info, &ptr);
-    uuid = libxl__uuid2string(&gc, ptr.uuid);
-    libxl__xs_write(&gc, t, libxl__sprintf(&gc, "/vm/%s/memory", uuid),
+    uuid = libxl__uuid2string(gc, ptr.uuid);
+    libxl__xs_write(gc, t, libxl__sprintf(gc, "/vm/%s/memory", uuid),
             "%"PRIu32, new_target_memkb / 1024);
 
 out:
@@ -2289,22 +2289,22 @@ out:
         if (errno == EAGAIN)
             goto retry_transaction;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = 1;
     char *target = NULL, *endptr = NULL;
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     uint32_t target_memkb;
 
-    target = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc,
+    target = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc,
                 "%s/memory/target", dompath));
     if (!target && !domid) {
-        rc = libxl__fill_dom0_memory_info(&gc, &target_memkb);
+        rc = libxl__fill_dom0_memory_info(gc, &target_memkb);
         if (rc < 0)
             goto out;
     } else if (!target) {
@@ -2325,14 +2325,14 @@ int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target
     rc = 0;
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
         libxl_device_model_info *dm_info, uint32_t *need_memkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = ERROR_INVAL;
     *need_memkb = b_info->target_memkb;
     switch (b_info->type) {
@@ -2351,7 +2351,7 @@ int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
         *need_memkb += (2 * 1024) - (*need_memkb % (2 * 1024));
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 
 }
@@ -2361,12 +2361,12 @@ int libxl_get_free_memory(libxl_ctx *ctx, uint32_t *memkb)
     int rc = 0;
     libxl_physinfo info;
     uint32_t freemem_slack;
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
 
     rc = libxl_get_physinfo(ctx, &info);
     if (rc < 0)
         goto out;
-    rc = libxl__get_free_memory_slack(&gc, &freemem_slack);
+    rc = libxl__get_free_memory_slack(gc, &freemem_slack);
     if (rc < 0)
         goto out;
 
@@ -2376,7 +2376,7 @@ int libxl_get_free_memory(libxl_ctx *ctx, uint32_t *memkb)
         *memkb = 0;
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2386,9 +2386,9 @@ int libxl_wait_for_free_memory(libxl_ctx *ctx, uint32_t domid, uint32_t
     int rc = 0;
     libxl_physinfo info;
     uint32_t freemem_slack;
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
 
-    rc = libxl__get_free_memory_slack(&gc, &freemem_slack);
+    rc = libxl__get_free_memory_slack(gc, &freemem_slack);
     if (rc < 0)
         goto out;
     while (wait_secs > 0) {
@@ -2405,7 +2405,7 @@ int libxl_wait_for_free_memory(libxl_ctx *ctx, uint32_t domid, uint32_t
     rc = ERROR_NOMEM;
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2631,7 +2631,7 @@ int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid,
 
 int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_dominfo info;
     char *dompath;
     xs_transaction_t t;
@@ -2641,14 +2641,14 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap)
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
         goto out;
     }
-    if (!(dompath = libxl__xs_get_dompath(&gc, domid)))
+    if (!(dompath = libxl__xs_get_dompath(gc, domid)))
         goto out;
 
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
     for (i = 0; i <= info.vcpu_max_id; i++)
-        libxl__xs_write(&gc, t,
-                       libxl__sprintf(&gc, "%s/cpu/%u/availability", dompath, i),
+        libxl__xs_write(gc, t,
+                       libxl__sprintf(gc, "%s/cpu/%u/availability", dompath, i),
                        "%s", libxl_cpumap_test(cpumap, i) ? "online" : "offline");
     if (!xs_transaction_end(ctx->xsh, t, 0)) {
         if (errno == EAGAIN)
@@ -2656,7 +2656,7 @@ retry_transaction:
     } else
         rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2776,12 +2776,12 @@ int libxl_send_trigger(libxl_ctx *ctx, uint32_t domid, char *trigger_name, uint3
 
 int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    GC_INIT(ctx);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
 
-    libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/control/sysrq", dompath), "%c", sysrq);
+    libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "%s/control/sysrq", dompath), "%c", sysrq);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -2868,15 +2868,15 @@ void libxl_xen_console_read_finish(libxl_ctx *ctx,
 
 uint32_t libxl_vm_get_start_time(libxl_ctx *ctx, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    GC_INIT(ctx);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     char *vm_path, *start_time;
     uint32_t ret;
 
     vm_path = libxl__xs_read(
-        &gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dompath));
+        gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dompath));
     start_time = libxl__xs_read(
-        &gc, XBT_NULL, libxl__sprintf(&gc, "%s/start_time", vm_path));
+        gc, XBT_NULL, libxl__sprintf(gc, "%s/start_time", vm_path));
     if (start_time == NULL) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, -1,
                         "Can't get start time of domain '%d'", domid);
@@ -2884,7 +2884,7 @@ uint32_t libxl_vm_get_start_time(libxl_ctx *ctx, uint32_t domid)
     }else{
         ret = strtoul(start_time, NULL, 10);
     }
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -3037,15 +3037,15 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
                          libxl_cpumap cpumap, libxl_uuid *uuid,
                          uint32_t *poolid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
     int i;
     xs_transaction_t t;
     char *uuid_string;
 
-    uuid_string = libxl__uuid2string(&gc, *uuid);
+    uuid_string = libxl__uuid2string(gc, *uuid);
     if (!uuid_string) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
@@ -3053,7 +3053,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
     if (rc) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
            "Could not create cpupool");
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
@@ -3064,7 +3064,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
                 LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
                     "Error moving cpu to cpupool");
                 libxl_cpupool_destroy(ctx, *poolid);
-                libxl__free_all(&gc);
+                GC_FREE;
                 return ERROR_FAIL;
             }
         }
@@ -3072,16 +3072,16 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        xs_mkdir(ctx->xsh, t, libxl__sprintf(&gc, "/local/pool/%d", *poolid));
-        libxl__xs_write(&gc, t,
-                        libxl__sprintf(&gc, "/local/pool/%d/uuid", *poolid),
+        xs_mkdir(ctx->xsh, t, libxl__sprintf(gc, "/local/pool/%d", *poolid));
+        libxl__xs_write(gc, t,
+                        libxl__sprintf(gc, "/local/pool/%d/uuid", *poolid),
                         "%s", uuid_string);
-        libxl__xs_write(&gc, t,
-                        libxl__sprintf(&gc, "/local/pool/%d/name", *poolid),
+        libxl__xs_write(gc, t,
+                        libxl__sprintf(gc, "/local/pool/%d/name", *poolid),
                         "%s", name);
 
         if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) {
-            libxl__free_all(&gc);
+            GC_FREE;
             return 0;
         }
     }
@@ -3089,7 +3089,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
 
 int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc, i;
     xc_cpupoolinfo_t *info;
     xs_transaction_t t;
@@ -3097,7 +3097,7 @@ int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
 
     info = xc_cpupool_getinfo(ctx->xch, poolid);
     if (info == NULL) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
@@ -3131,7 +3131,7 @@ int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "/local/pool/%d", poolid));
+        xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "/local/pool/%d", poolid));
 
         if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN))
             break;
@@ -3143,21 +3143,21 @@ out1:
     libxl_cpumap_dispose(&cpumap);
 out:
     xc_cpupool_infofree(ctx->xch, info);
-    libxl__free_all(&gc);
+    GC_FREE;
 
     return rc;
 }
 
 int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     xs_transaction_t t;
     xc_cpupoolinfo_t *info;
     int rc;
 
     info = xc_cpupool_getinfo(ctx->xch, poolid);
     if (info == NULL) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
@@ -3170,8 +3170,8 @@ int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        libxl__xs_write(&gc, t,
-                        libxl__sprintf(&gc, "/local/pool/%d/name", poolid),
+        libxl__xs_write(gc, t,
+                        libxl__sprintf(gc, "/local/pool/%d/name", poolid),
                         "%s", name);
 
         if (xs_transaction_end(ctx->xsh, t, 0))
@@ -3186,7 +3186,7 @@ int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
 
 out:
     xc_cpupool_infofree(ctx->xch, info);
-    libxl__free_all(&gc);
+    GC_FREE;
 
     return rc;
 }
@@ -3293,16 +3293,16 @@ out:
 
 int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
     char *dom_path;
     char *vm_path;
     char *poolname;
     xs_transaction_t t;
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
@@ -3310,26 +3310,26 @@ int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid)
     if (rc) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
             "Error moving domain to cpupool");
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        poolname = libxl__cpupoolid_to_name(&gc, poolid);
-        vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
+        poolname = libxl__cpupoolid_to_name(gc, poolid);
+        vm_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path));
         if (!vm_path)
             break;
 
-        libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/pool_name", vm_path),
+        libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/pool_name", vm_path),
                         "%s", poolname);
 
         if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN))
             break;
     }
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c
index b8399a1..ce83b8e 100644
--- a/tools/libxl/libxl_bootloader.c
+++ b/tools/libxl/libxl_bootloader.c
@@ -328,7 +328,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
                          libxl_device_disk *disk,
                          uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int ret, rc = 0;
     char *fifo = NULL;
     char *diskpath = NULL;
@@ -388,7 +388,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
         goto out_close;
     }
 
-    args = make_bootloader_args(&gc, info, domid, fifo, diskpath);
+    args = make_bootloader_args(gc, info, domid, fifo, diskpath);
     if (args == NULL) {
         rc = ERROR_NOMEM;
         goto out_close;
@@ -411,8 +411,8 @@ int libxl_run_bootloader(libxl_ctx *ctx,
         goto out_close;
     }
 
-    dom_console_xs_path = libxl__sprintf(&gc, "%s/console/tty", libxl__xs_get_dompath(&gc, domid));
-    libxl__xs_write(&gc, XBT_NULL, dom_console_xs_path, "%s", dom_console_slave_tty_path);
+    dom_console_xs_path = libxl__sprintf(gc, "%s/console/tty", libxl__xs_get_dompath(gc, domid));
+    libxl__xs_write(gc, XBT_NULL, dom_console_xs_path, "%s", dom_console_slave_tty_path);
 
     pid = fork_exec_bootloader(&bootloader_fd, info->u.pv.bootloader, args);
     if (pid < 0) {
@@ -435,7 +435,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
 
     fcntl(fifo_fd, F_SETFL, O_NDELAY);
 
-    blout = bootloader_interact(&gc, xenconsoled_fd, bootloader_fd, fifo_fd);
+    blout = bootloader_interact(gc, xenconsoled_fd, bootloader_fd, fifo_fd);
     if (blout == NULL) {
         goto out_close;
     }
@@ -445,7 +445,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
         goto out_close;
     }
 
-    parse_bootloader_result(&gc, info, blout);
+    parse_bootloader_result(gc, info, blout);
 
     rc = 0;
 out_close:
@@ -472,7 +472,7 @@ out_close:
     free(args);
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index ccb56c7..69f10fe 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -670,20 +670,20 @@ error_out:
 int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config,
                             libxl_console_ready cb, void *priv, uint32_t *domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = do_domain_create(&gc, d_config, cb, priv, domid, -1);
-    libxl__free_all(&gc);
+    rc = do_domain_create(gc, d_config, cb, priv, domid, -1);
+    GC_FREE;
     return rc;
 }
 
 int libxl_domain_create_restore(libxl_ctx *ctx, libxl_domain_config *d_config,
                                 libxl_console_ready cb, void *priv, uint32_t *domid, int restore_fd)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = do_domain_create(&gc, d_config, cb, priv, domid, restore_fd);
-    libxl__free_all(&gc);
+    rc = do_domain_create(gc, d_config, cb, priv, domid, restore_fd);
+    GC_FREE;
     return rc;
 }
 
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index 96098de..b1ff967 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -730,7 +730,7 @@ int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
                               const char *userdata_userid,
                               const uint8_t *data, int datalen)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     const char *filename;
     const char *newfilename;
     int e, rc;
@@ -738,18 +738,18 @@ int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
     FILE *f = NULL;
     size_t rs;
 
-    filename = userdata_path(&gc, domid, userdata_userid, "d");
+    filename = userdata_path(gc, domid, userdata_userid, "d");
     if (!filename) {
         rc = ERROR_NOMEM;
         goto out;
     }
 
     if (!datalen) {
-        rc = userdata_delete(&gc, filename);
+        rc = userdata_delete(gc, filename);
         goto out;
     }
 
-    newfilename = userdata_path(&gc, domid, userdata_userid, "n");
+    newfilename = userdata_path(gc, domid, userdata_userid, "n");
     if (!newfilename) {
         rc = ERROR_NOMEM;
         goto out;
@@ -791,7 +791,7 @@ err:
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot write %s for %s",
                  newfilename, filename);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -799,13 +799,13 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid,
                                  const char *userdata_userid,
                                  uint8_t **data_r, int *datalen_r)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     const char *filename;
     int e, rc;
     int datalen = 0;
     void *data = 0;
 
-    filename = userdata_path(&gc, domid, userdata_userid, "d");
+    filename = userdata_path(gc, domid, userdata_userid, "d");
     if (!filename) {
         rc = ERROR_NOMEM;
         goto out;
@@ -827,7 +827,7 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid,
     if (datalen_r) *datalen_r = datalen;
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 63c3050..120c239 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -483,7 +483,7 @@ static int is_assigned(libxl_device_pci *assigned, int num_assigned,
 
 libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_device_pci *pcidevs = NULL, *new, *assigned;
     struct dirent *de;
     DIR *dir;
@@ -491,7 +491,7 @@ libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
 
     *num = 0;
 
-    rc = get_all_assigned_devices(&gc, &assigned, &num_assigned);
+    rc = get_all_assigned_devices(gc, &assigned, &num_assigned);
     if ( rc )
         goto out;
 
@@ -528,7 +528,7 @@ libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
 out_closedir:
     closedir(dir);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return pcidevs;
 }
 
@@ -782,10 +782,10 @@ static int libxl__device_pci_reset(libxl__gc *gc, unsigned int domain, unsigned
 
 int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = libxl__device_pci_add(&gc, domid, pcidev, 0);
-    libxl__free_all(&gc);
+    rc = libxl__device_pci_add(gc, domid, pcidev, 0);
+    GC_FREE;
     return rc;
 }
 
@@ -1057,24 +1057,24 @@ out:
 
 int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
 
-    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 0);
+    rc = libxl__device_pci_remove_common(gc, domid, pcidev, 0);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_pci *pcidev)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
 
-    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 1);
+    rc = libxl__device_pci_remove_common(gc, domid, pcidev, 1);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1115,15 +1115,15 @@ static void libxl__device_pci_from_xs_be(libxl__gc *gc,
 
 libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *be_path, *num_devs;
     int n, i;
     libxl_device_pci *pcidevs = NULL;
 
     *num = 0;
 
-    be_path = libxl__sprintf(&gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(&gc, 0), domid);
-    num_devs = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/num_devs", be_path));
+    be_path = libxl__sprintf(gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(gc, 0), domid);
+    num_devs = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/num_devs", be_path));
     if (!num_devs)
         goto out;
 
@@ -1131,11 +1131,11 @@ libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num
     pcidevs = calloc(n, sizeof(libxl_device_pci));
 
     for (i = 0; i < n; i++)
-        libxl__device_pci_from_xs_be(&gc, be_path, pcidevs + i, i);
+        libxl__device_pci_from_xs_be(gc, be_path, pcidevs + i, i);
 
     *num = n;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return pcidevs;
 }
 
diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index c7696d7..60af98c 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -94,7 +94,7 @@ static int store_serial_port_info(libxl__qmp_handler *qmp,
                                   const char *chardev,
                                   int port)
 {
-    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    GC_INIT(qmp->ctx);
     char *path = NULL;
     int ret = 0;
 
@@ -102,12 +102,12 @@ static int store_serial_port_info(libxl__qmp_handler *qmp,
         return 0;
     }
 
-    path = libxl__xs_get_dompath(&gc, qmp->domid);
-    path = libxl__sprintf(&gc, "%s/serial/%d/tty", path, port);
+    path = libxl__xs_get_dompath(gc, qmp->domid);
+    path = libxl__sprintf(gc, "%s/serial/%d/tty", path, port);
 
-    ret = libxl__xs_write(&gc, XBT_NULL, path, "%s", chardev + 4);
+    ret = libxl__xs_write(gc, XBT_NULL, path, "%s", chardev + 4);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -521,7 +521,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
 {
     int id = 0;
     int ret = 0;
-    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    GC_INIT(qmp->ctx);
     qmp_request_context context = { .rc = 0 };
 
     id = qmp_send(qmp, cmd, args, callback, opaque, &context);
@@ -531,7 +531,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
     qmp->wait_for_id = id;
 
     while (qmp->wait_for_id == id) {
-        if ((ret = qmp_next(&gc, qmp)) < 0) {
+        if ((ret = qmp_next(gc, qmp)) < 0) {
             break;
         }
     }
@@ -540,7 +540,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
         ret = context.rc;
     }
 
-    libxl__free_all(&gc);
+    GC_FREE;
 
     return ret;
 }
@@ -559,15 +559,15 @@ libxl__qmp_handler *libxl__qmp_initialize(libxl_ctx *ctx, uint32_t domid)
     int ret = 0;
     libxl__qmp_handler *qmp = NULL;
     char *qmp_socket;
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
 
     qmp = qmp_init_handler(ctx, domid);
 
-    qmp_socket = libxl__sprintf(&gc, "%s/qmp-libxl-%d",
+    qmp_socket = libxl__sprintf(gc, "%s/qmp-libxl-%d",
                                 libxl_run_dir_path(), domid);
     if ((ret = qmp_open(qmp, qmp_socket, QMP_SOCKET_CONNECT_TIMEOUT)) < 0) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Connection error");
-        libxl__free_all(&gc);
+        GC_FREE;
         qmp_free_handler(qmp);
         return NULL;
     }
@@ -576,12 +576,12 @@ libxl__qmp_handler *libxl__qmp_initialize(libxl_ctx *ctx, uint32_t domid)
 
     /* Wait for the response to qmp_capabilities */
     while (!qmp->connected) {
-        if ((ret = qmp_next(&gc, qmp)) < 0) {
+        if ((ret = qmp_next(gc, qmp)) < 0) {
             break;
         }
     }
 
-    libxl__free_all(&gc);
+    GC_FREE;
     if (!qmp->connected) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Failed to connect to QMP");
         libxl__qmp_close(qmp);
@@ -626,9 +626,9 @@ static int pci_add_callback(libxl__qmp_handler *qmp,
 {
     libxl_device_pci *pcidev = opaque;
     const libxl__json_object *bus = NULL;
-    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    GC_INIT(qmp->ctx);
     int i, j, rc = -1;
-    char *asked_id = libxl__sprintf(&gc, PCI_PT_QDEV_ID,
+    char *asked_id = libxl__sprintf(gc, PCI_PT_QDEV_ID,
                                     pcidev->bus, pcidev->dev, pcidev->func);
 
     for (i = 0; (bus = libxl__json_array_get(response, i)); i++) {
@@ -665,7 +665,7 @@ static int pci_add_callback(libxl__qmp_handler *qmp,
 
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index f1f2a6d..d36c737 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -186,29 +186,29 @@ char *libxl_schedid_to_name(libxl_ctx *ctx, int schedid)
 
 int libxl_get_stubdom_id(libxl_ctx *ctx, int guest_domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char * stubdom_id_s;
     int ret;
 
-    stubdom_id_s = libxl__xs_read(&gc, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/image/device-model-domid",
-                                               libxl__xs_get_dompath(&gc, guest_domid)));
+    stubdom_id_s = libxl__xs_read(gc, XBT_NULL,
+                                 libxl__sprintf(gc, "%s/image/device-model-domid",
+                                               libxl__xs_get_dompath(gc, guest_domid)));
     if (stubdom_id_s)
         ret = atoi(stubdom_id_s);
     else
         ret = 0;
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
 int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *target, *endptr;
     uint32_t value;
     int ret = 0;
 
-    target = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/target", libxl__xs_get_dompath(&gc, domid)));
+    target = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/target", libxl__xs_get_dompath(gc, domid)));
     if (!target)
         goto out;
     value = strtol(target, &endptr, 10);
@@ -218,7 +218,7 @@ int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid)
         *target_domid = value;
     ret = 1;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -240,27 +240,27 @@ static int logrename(libxl__gc *gc, const char *old, const char *new)
 
 int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     struct stat stat_buf;
     char *logfile, *logfile_new;
     int i, rc;
 
-    logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log", name);
+    logfile = libxl__sprintf(gc, "/var/log/xen/%s.log", name);
     if (stat(logfile, &stat_buf) == 0) {
         /* file exists, rotate */
-        logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log.10", name);
+        logfile = libxl__sprintf(gc, "/var/log/xen/%s.log.10", name);
         unlink(logfile);
         for (i = 9; i > 0; i--) {
-            logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i);
-            logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i + 1);
-            rc = logrename(&gc, logfile, logfile_new);
+            logfile = libxl__sprintf(gc, "/var/log/xen/%s.log.%d", name, i);
+            logfile_new = libxl__sprintf(gc, "/var/log/xen/%s.log.%d", name, i + 1);
+            rc = logrename(gc, logfile, logfile_new);
             if (rc)
                 goto out;
         }
-        logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log", name);
-        logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.1", name);
+        logfile = libxl__sprintf(gc, "/var/log/xen/%s.log", name);
+        logfile_new = libxl__sprintf(gc, "/var/log/xen/%s.log.1", name);
 
-        rc = logrename(&gc, logfile, logfile_new);
+        rc = logrename(gc, logfile, logfile_new);
         if (rc)
             goto out;
     } else {
@@ -272,7 +272,7 @@ int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name)
     *full_name = strdup(logfile);
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Dec 05 23:02:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Mon, 05 Dec 2011 23:02:00 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RXhXN-0004At-44; Mon, 05 Dec 2011 23:01:29 +0000
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <darnok@68k.org>) id 1RXhXK-0004Am-VB
	for xen-devel@lists.xensource.com; Mon, 05 Dec 2011 23:01:27 +0000
X-Env-Sender: darnok@68k.org
X-Msg-Ref: server-12.tower-174.messagelabs.com!1323126034!4319077!1
X-Originating-IP: [206.212.254.10]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Version: 6.4.2; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12981 invoked from network); 5 Dec 2011 23:00:36 -0000
Received: from andromeda.dapyr.net (HELO andromeda.dapyr.net) (206.212.254.10)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 5 Dec 2011 23:00:36 -0000
Received: from andromeda.dapyr.net (darnok@localhost [127.0.0.1])
	by andromeda.dapyr.net (8.13.4/8.13.4/Debian-3sarge3) with ESMTP id
	pB5N0Ku8015829
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT);
	Mon, 5 Dec 2011 18:00:20 -0500
Received: (from darnok@localhost)
	by andromeda.dapyr.net (8.13.4/8.13.4/Submit) id pB5N0K88015827;
	Mon, 5 Dec 2011 18:00:20 -0500
Date: Mon, 5 Dec 2011 19:00:20 -0400
From: Konrad Rzeszutek Wilk <konrad@darnok.org>
To: Anthony PERARD <anthony.perard@citrix.com>
Message-ID: <20111205230019.GA9560@andromeda.dapyr.net>
References: <1322156679-9441-1-git-send-email-anthony.perard@citrix.com>
	<1322156679-9441-9-git-send-email-anthony.perard@citrix.com>
Mime-Version: 1.0
Content-Disposition: inline
In-Reply-To: <1322156679-9441-9-git-send-email-anthony.perard@citrix.com>
User-Agent: Mutt/1.5.9i
Cc: Guy Zana <guy@neocleus.com>, Xen Devel <xen-devel@lists.xensource.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH V5 08/10] Introduce Xen PCI Passthrough,
	PCI config space helpers (2/3)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Nov 24, 2011 at 05:44:37PM +0000, Anthony PERARD wrote:
> From: Allen Kay <allen.m.kay@intel.com>
> 
> A more complete history can be found here:
> git://xenbits.xensource.com/qemu-xen-unstable.git
> 
> Signed-off-by: Allen Kay <allen.m.kay@intel.com>
> Signed-off-by: Guy Zana <guy@neocleus.com>
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  hw/xen_pci_passthrough.c             |   15 +
>  hw/xen_pci_passthrough_config_init.c | 2131 ++++++++++++++++++++++++++++++++++
>  2 files changed, 2146 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/xen_pci_passthrough.c b/hw/xen_pci_passthrough.c
> index 998470b..c816ed5 100644
> --- a/hw/xen_pci_passthrough.c
> +++ b/hw/xen_pci_passthrough.c
> @@ -360,6 +360,11 @@ out:
>              PT_ERR(d, "pci_write_block failed. return value: %d.\n", rc);
>          }
>      }
> +
> +    if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING) {
> +        qemu_mod_timer(s->pm_state->pm_timer,
> +                       qemu_get_clock_ms(rt_clock) + s->pm_state->pm_delay);
> +    }

Is this in the right place? There is code before in this function that
does:

if (s->pm_state != NULL && s->pm_state->flags & PT_FLAG_TRANSITING)
	return;

so we would never get here, I think?

>  }
>  
>  /* ioport/iomem space*/
> @@ -706,6 +711,13 @@ static int pt_initfn(PCIDevice *pcidev)
>      /* Handle real device's MMIO/PIO BARs */
>      pt_register_regions(s);
>  
> +    /* reinitialize each config register to be emulated */
> +    if (pt_config_init(s)) {
> +        PT_ERR(pcidev, "PCI Config space initialisation failed.\n");
> +        host_pci_device_put(s->real_device);
> +        return -1;
> +    }
> +
>      /* Bind interrupt */
>      if (!s->dev.config[PCI_INTERRUPT_PIN]) {
>          PT_LOG(pcidev, "no pin interrupt\n");
> @@ -798,6 +810,9 @@ static int pt_unregister_device(PCIDevice *pcidev)
>          }
>      }
>  
> +    /* delete all emulated config registers */
> +    pt_config_delete(s);
> +
>      /* unregister real device's MMIO/PIO BARs */
>      pt_unregister_regions(s);
>  
> diff --git a/hw/xen_pci_passthrough_config_init.c b/hw/xen_pci_passthrough_config_init.c
> index 1e9de64..ae64544 100644
> --- a/hw/xen_pci_passthrough_config_init.c
> +++ b/hw/xen_pci_passthrough_config_init.c
> @@ -1,11 +1,2142 @@
> +/*
> + * Copyright (c) 2007, Neocleus Corporation.
> + * Copyright (c) 2007, Intel Corporation.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + *
> + * Alex Novik <alex@neocleus.com>
> + * Allen Kay <allen.m.kay@intel.com>
> + * Guy Zana <guy@neocleus.com>
> + *
> + * This file implements direct PCI assignment to a HVM guest
> + */
> +
> +#include "qemu-timer.h"
> +#include "xen_backend.h"
>  #include "xen_pci_passthrough.h"
>  
> +#define PT_MERGE_VALUE(value, data, val_mask) \
> +    (((value) & (val_mask)) | ((data) & ~(val_mask)))
> +
> +#define PT_INVALID_REG          0xFFFFFFFF      /* invalid register value */
> +
> +/* prototype */
> +
> +static int pt_ptr_reg_init(XenPCIPassthroughState *s, XenPTRegInfo *reg,
> +                           uint32_t real_offset, uint32_t *data);
> +static int pt_init_pci_config(XenPCIPassthroughState *s);
> +
> +
> +/* helper */
> +
> +/* A return value of 1 means the capability should NOT be exposed to guest. */
> +static int pt_hide_dev_cap(const HostPCIDevice *d, uint8_t grp_id)
> +{
> +    switch (grp_id) {
> +    case PCI_CAP_ID_EXP:
> +        /* The PCI Express Capability Structure of the VF of Intel 82599 10GbE
> +         * Controller looks trivial, e.g., the PCI Express Capabilities
> +         * Register is 0. We should not try to expose it to guest.
> +         *
> +         * The datasheet is available at
> +         * http://download.intel.com/design/network/datashts/82599_datasheet.pdf
> +         *
> +         * See 'Table 9.7. VF PCIe Configuration Space' of the datasheet, the
> +         * PCI Express Capability Structure of the VF of Intel 82599 10GbE
> +         * Controller looks trivial, e.g., the PCI Express Capabilities
> +         * Register is 0, so the Capability Version is 0 and
> +         * pt_pcie_size_init() would fail.
> +         */
> +        if (d->vendor_id == PCI_VENDOR_ID_INTEL &&
> +            d->device_id == PCI_DEVICE_ID_INTEL_82599_VF) {
> +            return 1;
> +        }
> +        break;
> +    }
> +    return 0;
> +}
> +
> +/*   find emulate register group entry */
>  XenPTRegGroup *pt_find_reg_grp(XenPCIPassthroughState *s, uint32_t address)
>  {
> +    XenPTRegGroup *entry = NULL;
> +
> +    /* find register group entry */
> +    QLIST_FOREACH(entry, &s->reg_grp_tbl, entries) {
> +        /* check address */
> +        if ((entry->base_offset <= address)
> +            && ((entry->base_offset + entry->size) > address)) {
> +            return entry;
> +        }
> +    }
> +
> +    /* group entry not found */
>      return NULL;
>  }
>  
> +/* find emulate register entry */
>  XenPTReg *pt_find_reg(XenPTRegGroup *reg_grp, uint32_t address)
>  {
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegInfo *reg = NULL;
> +    uint32_t real_offset = 0;
> +
> +    /* find register entry */
> +    QLIST_FOREACH(reg_entry, &reg_grp->reg_tbl_list, entries) {
> +        reg = reg_entry->reg;
> +        real_offset = reg_grp->base_offset + reg->offset;
> +        /* check address */
> +        if ((real_offset <= address)
> +            && ((real_offset + reg->size) > address)) {
> +            return reg_entry;
> +        }
> +    }
> +
>      return NULL;
>  }
> +
> +/* parse BAR */
> +static PTBarFlag pt_bar_reg_parse(XenPCIPassthroughState *s, XenPTRegInfo *reg)
> +{
> +    PCIDevice *d = &s->dev;
> +    XenPTRegion *region = NULL;
> +    PCIIORegion *r;
> +    int index = 0;
> +
> +    /* check 64bit BAR */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if ((0 < index) && (index < PCI_ROM_SLOT)) {
> +        int flags = s->real_device->io_regions[index - 1].flags;

Can you put a comment explaining why you need to shift it?
I presume its b/c the ROM slot is its own variable, but it would useful
to have that explicitly stated.

> +
> +        if ((flags & IORESOURCE_MEM) && (flags & IORESOURCE_MEM_64)) {

You could collapse these two I think?
(flags & (IORESOURCE_MEM | IORESOURCE_MEM_64))

> +            region = &s->bases[index - 1];
> +            if (region->bar_flag != PT_BAR_FLAG_UPPER) {
> +                return PT_BAR_FLAG_UPPER;
> +            }
> +        }
> +    }
> +
> +    /* check unused BAR */
> +    r = &d->io_regions[index];
> +    if (r->size == 0) {
> +        return PT_BAR_FLAG_UNUSED;
> +    }
> +
> +    /* for ExpROM BAR */
> +    if (index == PCI_ROM_SLOT) {
> +        return PT_BAR_FLAG_MEM;
> +    }
> +
> +    /* check BAR I/O indicator */
> +    if (s->real_device->io_regions[index].flags & IORESOURCE_IO) {
> +        return PT_BAR_FLAG_IO;
> +    } else {
> +        return PT_BAR_FLAG_MEM;
> +    }
> +}
> +
> +
> +/****************
> + * general register functions
> + */
> +
> +/* register initialization function */
> +
> +static int pt_common_reg_init(XenPCIPassthroughState *s,
> +                              XenPTRegInfo *reg, uint32_t real_offset,
> +                              uint32_t *data)
> +{
> +    *data = reg->init_val;
> +    return 0;
> +}
> +
> +/* Read register functions */
> +
> +static int pt_byte_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint8_t *value, uint8_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint8_t valid_emu_mask = 0;
> +
> +    /* emulate byte register */
> +    valid_emu_mask = reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +static int pt_word_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint16_t *value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t valid_emu_mask = 0;
> +
> +    /* emulate word register */
> +    valid_emu_mask = reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +static int pt_long_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint32_t *value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t valid_emu_mask = 0;
> +
> +    /* emulate long register */
> +    valid_emu_mask = reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +   return 0;
> +}
> +
> +/* Write register functions */
> +
> +static int pt_byte_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint8_t *value, uint8_t dev_value,
> +                             uint8_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint8_t writable_mask = 0;
> +    uint8_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    return 0;
> +}
> +static int pt_word_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint16_t *value, uint16_t dev_value,
> +                             uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    return 0;
> +}
> +static int pt_long_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint32_t *value, uint32_t dev_value,
> +                             uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +
> +    /* modify emulate register */
> +    writable_mask = reg->emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~reg->emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    return 0;
> +}
> +
> +/* common restore register fonctions */
> +static int pt_byte_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                               uint32_t real_offset, uint8_t dev_value,
> +                               uint8_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +
> +    /* use I/O device register's value as restore value */
> +    *value = pci_get_byte(d->config + real_offset);
> +
> +    /* create value for restoring to I/O device register */
> +    *value = PT_MERGE_VALUE(*value, dev_value, reg->emu_mask);
> +
> +    return 0;
> +}
> +static int pt_word_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                               uint32_t real_offset, uint16_t dev_value,
> +                               uint16_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +
> +    /* use I/O device register's value as restore value */
> +    *value = pci_get_word(d->config + real_offset);
> +
> +    /* create value for restoring to I/O device register */
> +    *value = PT_MERGE_VALUE(*value, dev_value, reg->emu_mask);
> +
> +    return 0;
> +}
> +
> +
> +/* XenPTRegInfo declaration
> + * - only for emulated register (either a part or whole bit).
> + * - for passthrough register that need special behavior (like interacting with
> + *   other component), set emu_mask to all 0 and specify r/w func properly.
> + * - do NOT use ALL F for init_val, otherwise the tbl will not be registered.
> + */
> +
> +/********************
> + * Header Type0
> + */
> +
> +static int pt_vendor_reg_init(XenPCIPassthroughState *s,
> +                              XenPTRegInfo *reg, uint32_t real_offset,
> +                              uint32_t *data)
> +{
> +    *data = s->real_device->vendor_id;
> +    return 0;
> +}
> +static int pt_device_reg_init(XenPCIPassthroughState *s,
> +                              XenPTRegInfo *reg, uint32_t real_offset,
> +                              uint32_t *data)
> +{
> +    *data = s->real_device->device_id;
> +    return 0;
> +}
> +static int pt_status_reg_init(XenPCIPassthroughState *s,
> +                              XenPTRegInfo *reg, uint32_t real_offset,
> +                              uint32_t *data)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    uint32_t reg_field = 0;
> +
> +    /* find Header register group */
> +    reg_grp_entry = pt_find_reg_grp(s, PCI_CAPABILITY_LIST);
> +    if (reg_grp_entry) {
> +        /* find Capabilities Pointer register */
> +        reg_entry = pt_find_reg(reg_grp_entry, PCI_CAPABILITY_LIST);
> +        if (reg_entry) {
> +            /* check Capabilities Pointer register */
> +            if (reg_entry->data) {
> +                reg_field |= PCI_STATUS_CAP_LIST;
> +            } else {
> +                reg_field &= ~PCI_STATUS_CAP_LIST;
> +            }
> +        } else {
> +            xen_shutdown_fatal_error("Internal error: Couldn't find XenPTReg*"
> +                                     " for Capabilities Pointer register."
> +                                     " (%s)\n", __func__);
> +            return -1;
> +        }
> +    } else {
> +        xen_shutdown_fatal_error("Internal error: Couldn't find XenPTRegGroup"
> +                                 " for Header. (%s)\n", __func__);
> +        return -1;
> +    }
> +
> +    *data = reg_field;
> +    return 0;
> +}
> +static int pt_header_type_reg_init(XenPCIPassthroughState *s,
> +                                   XenPTRegInfo *reg, uint32_t real_offset,
> +                                   uint32_t *data)
> +{
> +    /* read PCI_HEADER_TYPE */
> +    *data = reg->init_val | 0x80;
> +    return 0;
> +}
> +
> +/* initialize Interrupt Pin register */
> +static int pt_irqpin_reg_init(XenPCIPassthroughState *s,
> +                              XenPTRegInfo *reg, uint32_t real_offset,
> +                              uint32_t *data)
> +{
> +    *data = pci_read_intx(s);
> +    return 0;
> +}
> +
> +/* Command register */
> +static int pt_cmd_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                           uint16_t *value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t valid_emu_mask = 0;
> +    uint16_t emu_mask = reg->emu_mask;
> +
> +    if (s->is_virtfn) {
> +        emu_mask |= PCI_COMMAND_MEMORY;
> +    }
> +
> +    /* emulate word register */
> +    valid_emu_mask = emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +static int pt_cmd_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint16_t *value, uint16_t dev_value,

So the *value here is the return value right? How about
*response ?

> +                            uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +    uint16_t wr_value = *value;
> +    uint16_t emu_mask = reg->emu_mask;
> +
> +    if (s->is_virtfn) {
> +        emu_mask |= PCI_COMMAND_MEMORY;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~emu_mask & valid_mask;

What does 'throughable' mean? Is there a better term for it?
Say filtered? emulated? cleaned?

> +
> +    if (*value & PCI_COMMAND_INTX_DISABLE) {
> +        throughable_mask |= PCI_COMMAND_INTX_DISABLE;
> +    } else {
> +        if (s->machine_irq) {
> +            throughable_mask |= PCI_COMMAND_INTX_DISABLE;
> +        }
> +    }
> +
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* mapping BAR */
> +    pt_bar_mapping(s, wr_value & PCI_COMMAND_IO,
> +                   wr_value & PCI_COMMAND_MEMORY);

Ah, here we kick of the real memory mapping with the hypervisor.
You might want to expand the comment to say that.

> +
> +    return 0;
> +}
> +static int pt_cmd_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                              uint32_t real_offset, uint16_t dev_value,
> +                              uint16_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +    uint16_t restorable_mask = 0;
> +
> +    /* use I/O device register's value as restore value */
> +    *value = pci_get_word(d->config + real_offset);
> +
> +    /* create value for restoring to I/O device register

s/to/the/

> +     * but do not include Fast Back-to-Back Enable bit.
> +     */
> +    restorable_mask = reg->emu_mask & ~PCI_COMMAND_FAST_BACK;
> +    *value = PT_MERGE_VALUE(*value, dev_value, restorable_mask);
> +
> +    if (!s->machine_irq) {
> +        *value |= PCI_COMMAND_INTX_DISABLE;
> +    } else {
> +        *value &= ~PCI_COMMAND_INTX_DISABLE;
> +    }
> +
> +    return 0;
> +}
> +
> +/* BAR */
> +#define PT_BAR_MEM_RO_MASK      0x0000000F      /* BAR ReadOnly mask(Memory) */
> +#define PT_BAR_MEM_EMU_MASK     0xFFFFFFF0      /* BAR emul mask(Memory) */
> +#define PT_BAR_IO_RO_MASK       0x00000003      /* BAR ReadOnly mask(I/O) */
> +#define PT_BAR_IO_EMU_MASK      0xFFFFFFFC      /* BAR emul mask(I/O) */
> +
> +static inline uint32_t base_address_with_flags(HostPCIIORegion *hr)
> +{
> +    if ((hr->flags & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
> +        return hr->base_addr | (hr->flags & ~PCI_BASE_ADDRESS_IO_MASK);
> +    } else {
> +        return hr->base_addr | (hr->flags & ~PCI_BASE_ADDRESS_MEM_MASK);
> +    }
> +}
> +
> +static int pt_bar_reg_init(XenPCIPassthroughState *s, XenPTRegInfo *reg,
> +                           uint32_t real_offset, uint32_t *data)
> +{
> +    uint32_t reg_field = 0;
> +    int index;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {

Should we check for index > PCI_ROM_BASE as well?
> +        PT_ERR(&s->dev, "Internal error: Invalid BAR index [%d].\n", index);
> +        return -1;
> +    }
> +
> +    /* set initial guest physical base address to -1 */
> +    s->bases[index].e_physbase = -1;
> +
> +    /* set BAR flag */
> +    s->bases[index].bar_flag = pt_bar_reg_parse(s, reg);
> +    if (s->bases[index].bar_flag == PT_BAR_FLAG_UNUSED) {
> +        reg_field = PT_INVALID_REG;
> +    }
> +
> +    *data = reg_field;
> +    return 0;
> +}
> +static int pt_bar_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                           uint32_t *value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t valid_emu_mask = 0;
> +    uint32_t bar_emu_mask = 0;
> +    int index;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {

Should we check for index > PCI_ROM_BASE?
> +        PT_ERR(&s->dev, "Internal error: Invalid BAR index [%d].\n", index);
> +        return -1;
> +    }
> +
> +    /* use fixed-up value from kernel sysfs */
> +    *value = base_address_with_flags(&s->real_device->io_regions[index]);
> +
> +    /* set emulate mask depend on BAR flag */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        bar_emu_mask = PT_BAR_MEM_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        bar_emu_mask = PT_BAR_IO_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        bar_emu_mask = PT_BAR_ALLF;
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    /* emulate BAR */
> +    valid_emu_mask = bar_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +   return 0;
> +}
> +static int pt_bar_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                            uint32_t *value, uint32_t dev_value,
> +                            uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegion *base = NULL;
> +    PCIDevice *d = &s->dev;
> +    PCIIORegion *r;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +    uint32_t bar_emu_mask = 0;
> +    uint32_t bar_ro_mask = 0;
> +    uint32_t new_addr, last_addr;
> +    uint32_t prev_offset;
> +    uint32_t r_size = 0;
> +    int index = 0;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        PT_ERR(d, "Internal error: Invalid BAR index [%d].\n", index);
> +        return -1;
> +    }
> +
> +    r = &d->io_regions[index];
> +    base = &s->bases[index];
> +    r_size = pt_get_emul_size(base->bar_flag, r->size);
> +
> +    /* set emulate mask and read-only mask depend on BAR flag */
                                             ^^values   ^^ the

> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        bar_emu_mask = PT_BAR_MEM_EMU_MASK;
> +        bar_ro_mask = PT_BAR_MEM_RO_MASK | (r_size - 1);
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        bar_emu_mask = PT_BAR_IO_EMU_MASK;
> +        bar_ro_mask = PT_BAR_IO_RO_MASK | (r_size - 1);
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        bar_emu_mask = PT_BAR_ALLF;
> +        bar_ro_mask = 0;    /* all upper 32bit are R/W */
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = bar_emu_mask & ~bar_ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* check whether we need to update the virtual region address or not */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        /* nothing to do */
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        new_addr = cfg_entry->data;
> +        last_addr = new_addr + r_size - 1;
> +        /* check invalid address */
> +        if (last_addr <= new_addr || !new_addr || last_addr >= UINT16_MAX) {
> +            /* check 64K range */
> +            if ((last_addr >= UINT16_MAX) &&
> +                (cfg_entry->data != (PT_BAR_ALLF & ~bar_ro_mask))) {

You seem to be using 'PT_BAR_ALLF & ~bar_ro_mask' this function and
never actually use the bar_ro_mask by itself. Perhaps you can
(before this switch statement) do:

  bar_ro_mask = PT_BAR_ALLF & ~bar_ro_mask;


> +                PT_WARN(d, "Guest attempt to set Base Address "
> +                       "over the 64KB. (offset: 0x%02x,"
> +                       " addr: 0x%08x, size: 0x%08x)\n",
> +                       reg->offset, new_addr, r_size);
> +            }
> +            /* just remove mapping */
> +            r->addr = PCI_BAR_UNMAPPED;
> +            goto exit;
> +        }
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        if (cfg_entry->data) {
> +            if (cfg_entry->data != (PT_BAR_ALLF & ~bar_ro_mask)) {
> +                PT_WARN(d, "Guest attempt to set high MMIO Base Address. "
> +                        "Ignore mapping. "
> +                        "(offset: 0x%02x, high address: 0x%08x)\n",
> +                        reg->offset, cfg_entry->data);
> +            }
> +            /* clear lower address */
> +            d->io_regions[index-1].addr = -1;
> +        } else {
> +            /* find lower 32bit BAR */
> +            prev_offset = (reg->offset - 4);
> +            reg_grp_entry = pt_find_reg_grp(s, prev_offset);
> +            if (reg_grp_entry) {
> +                reg_entry = pt_find_reg(reg_grp_entry, prev_offset);
> +                if (reg_entry) {
> +                    /* restore lower address */
> +                    d->io_regions[index-1].addr = reg_entry->data;
> +                } else {
> +                    return -1;
> +                }
> +            } else {
> +                return -1;
> +            }
> +        }
> +
> +        /* never mapping the 'empty' upper region,
> +         * because we'll do it enough for the lower region.

umm, not sure what you mean here. Do you mean to say:
"Do not map the 'empty' upper region b/c we do not need to.
As we only need the lower region."?


> +         */
> +        r->addr = -1;
> +        goto exit;
> +    default:
> +        break;
> +    }
> +
> +    /* update the corresponding virtual region address */
> +    /*
> +     * When guest code tries to get block size of mmio, it will write all "1"s
> +     * into pci bar register. In this case, cfg_entry->data == writable_mask.
> +     * Especially for devices with large mmio, the value of writable_mask
> +     * is likely to be a guest physical address that has been mapped to ram
> +     * rather than mmio. Remapping this value to mmio should be prevented.
> +     */
> +
> +    if (cfg_entry->data != writable_mask) {
> +        r->addr = cfg_entry->data;
> +    }
> +
> +exit:
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~bar_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* After BAR reg update, we need to remap BAR */
> +    reg_grp_entry = pt_find_reg_grp(s, PCI_COMMAND);
> +    if (reg_grp_entry) {
> +        reg_entry = pt_find_reg(reg_grp_entry, PCI_COMMAND);
> +        if (reg_entry) {
> +            pt_bar_mapping_one(s, index, reg_entry->data & PCI_COMMAND_IO,
> +                               reg_entry->data & PCI_COMMAND_MEMORY);
> +        }
> +    }
> +
> +    return 0;
> +}
> +static int pt_bar_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                              uint32_t real_offset, uint32_t dev_value,
> +                              uint32_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t bar_emu_mask = 0;
> +    int index = 0;
> +
> +    /* get BAR index */
> +    index = pt_bar_offset_to_index(reg->offset);
> +    if (index < 0) {
> +        PT_ERR(&s->dev, "Internal error: Invalid BAR index [%d].\n", index);
> +        return -1;
> +    }
> +
> +    /* use value from kernel sysfs */
> +    if (s->bases[index].bar_flag == PT_BAR_FLAG_UPPER) {
> +        *value = s->real_device->io_regions[index - 1].base_addr >> 32;
> +    } else {
> +        *value = base_address_with_flags(&s->real_device->io_regions[index]);
> +    }
> +
> +    /* set emulate mask depend on BAR flag */
> +    switch (s->bases[index].bar_flag) {
> +    case PT_BAR_FLAG_MEM:
> +        bar_emu_mask = PT_BAR_MEM_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_IO:
> +        bar_emu_mask = PT_BAR_IO_EMU_MASK;
> +        break;
> +    case PT_BAR_FLAG_UPPER:
> +        bar_emu_mask = PT_BAR_ALLF;
> +        break;
> +    default:
> +        break;
> +    }
> +
> +    /* create value for restoring to I/O device register */
> +    *value = PT_MERGE_VALUE(*value, dev_value, bar_emu_mask);
> +
> +    return 0;
> +}
> +
> +/* write Exp ROM BAR */
> +static int pt_exp_rom_bar_reg_write(XenPCIPassthroughState *s,
> +                                    XenPTReg *cfg_entry, uint32_t *value,
> +                                    uint32_t dev_value, uint32_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegion *base = NULL;
> +    PCIDevice *d = (PCIDevice *)&s->dev;
> +    PCIIORegion *r;
> +    uint32_t writable_mask = 0;
> +    uint32_t throughable_mask = 0;
> +    pcibus_t r_size = 0;
> +    uint32_t bar_emu_mask = 0;
> +    uint32_t bar_ro_mask = 0;
> +
> +    r = &d->io_regions[PCI_ROM_SLOT];
> +    r_size = r->size;
> +    base = &s->bases[PCI_ROM_SLOT];
> +    /* align memory type resource size */
> +    pt_get_emul_size(base->bar_flag, r_size);
> +
> +    /* set emulate mask and read-only mask */
> +    bar_emu_mask = reg->emu_mask;
> +    bar_ro_mask = (reg->ro_mask | (r_size - 1)) & ~PCI_ROM_ADDRESS_ENABLE;
> +
> +    /* modify emulate register */
> +    writable_mask = ~bar_ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* update the corresponding virtual region address */
> +    /*
> +     * When guest code tries to get block size of mmio, it will write all "1"s
> +     * into pci bar register. In this case, cfg_entry->data == writable_mask.
> +     * Especially for devices with large mmio, the value of writable_mask
> +     * is likely to be a guest physical address that has been mapped to ram
> +     * rather than mmio. Remapping this value to mmio should be prevented.
> +     */
> +
> +    if (cfg_entry->data != writable_mask) {
> +        r->addr = cfg_entry->data;
> +    }
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~bar_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    /* After BAR reg update, we need to remap BAR*/
> +    reg_grp_entry = pt_find_reg_grp(s, PCI_COMMAND);
> +    if (reg_grp_entry) {
> +        reg_entry = pt_find_reg(reg_grp_entry, PCI_COMMAND);
> +        if (reg_entry) {
> +            pt_bar_mapping_one(s, PCI_ROM_SLOT,
> +                               reg_entry->data & PCI_COMMAND_IO,
> +                               reg_entry->data & PCI_COMMAND_MEMORY);
> +        }
> +    }
> +
> +    return 0;
> +}
> +/* restore ROM BAR */
> +static int pt_exp_rom_bar_reg_restore(XenPCIPassthroughState *s,
> +                                      XenPTReg *cfg_entry,
> +                                      uint32_t real_offset,
> +                                      uint32_t dev_value, uint32_t *value)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint32_t v;
> +
> +    if (host_pci_get_long(s->real_device, PCI_ROM_ADDRESS, &v)) {
> +        return -1;
> +    }
> +    /* use value from kernel sysfs */
> +    *value = PT_MERGE_VALUE(v, dev_value, reg->emu_mask);
> +    return 0;
> +}
> +
> +/* Header Type0 reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_header0_tbl[] = {
> +    /* Vendor ID reg */
> +    {
> +        .offset     = PCI_VENDOR_ID,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFFF,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_vendor_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Device ID reg */
> +    {
> +        .offset     = PCI_DEVICE_ID,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFFF,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_device_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Command reg */
> +    {
> +        .offset     = PCI_COMMAND,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xF880,
> +        .emu_mask   = 0x0740,
> +        .init       = pt_common_reg_init,
> +        .u.w.read   = pt_cmd_reg_read,
> +        .u.w.write  = pt_cmd_reg_write,
> +        .u.w.restore  = pt_cmd_reg_restore,
> +    },
> +    /* Capabilities Pointer reg */
> +    {
> +        .offset     = PCI_CAPABILITY_LIST,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Status reg */
> +    /* use emulated Cap Ptr value to initialize,
> +     * so need to be declared after Cap Ptr reg
> +     */
> +    {
> +        .offset     = PCI_STATUS,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0x06FF,
> +        .emu_mask   = 0x0010,
> +        .init       = pt_status_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* Cache Line Size reg */
> +    {
> +        .offset     = PCI_CACHE_LINE_SIZE,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0x00,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_common_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = pt_byte_reg_restore,
> +    },
> +    /* Latency Timer reg */
> +    {
> +        .offset     = PCI_LATENCY_TIMER,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0x00,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_common_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = pt_byte_reg_restore,
> +    },
> +    /* Header Type reg */
> +    {
> +        .offset     = PCI_HEADER_TYPE,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0x00,
> +        .init       = pt_header_type_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Interrupt Line reg */
> +    {
> +        .offset     = PCI_INTERRUPT_LINE,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0x00,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_common_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Interrupt Pin reg */
> +    {
> +        .offset     = PCI_INTERRUPT_PIN,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_irqpin_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* BAR 0 reg */
> +    /* mask of BAR need to be decided later, depends on IO/MEM type */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_0,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 1 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_1,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 2 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_2,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 3 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_3,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 4 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_4,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* BAR 5 reg */
> +    {
> +        .offset     = PCI_BASE_ADDRESS_5,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_bar_reg_read,
> +        .u.dw.write = pt_bar_reg_write,
> +        .u.dw.restore = pt_bar_reg_restore,
> +    },
> +    /* Expansion ROM BAR reg */
> +    {
> +        .offset     = PCI_ROM_ADDRESS,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .ro_mask    = 0x000007FE,
> +        .emu_mask   = 0xFFFFF800,
> +        .init       = pt_bar_reg_init,
> +        .u.dw.read  = pt_long_reg_read,
> +        .u.dw.write = pt_exp_rom_bar_reg_write,
> +        .u.dw.restore = pt_exp_rom_bar_reg_restore,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/*********************************
> + * Vital Product Data Capability
> + */
> +
> +/* Vital Product Data Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_vpd_tbl[] = {
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/**************************************
> + * Vendor Specific Capability
> + */
> +
> +/* Vendor Specific Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_vendor_tbl[] = {
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/*****************************
> + * PCI Express Capability
> + */
> +
> +/* initialize Link Control register */
> +static int pt_linkctrl_reg_init(XenPCIPassthroughState *s,
> +                                XenPTRegInfo *reg, uint32_t real_offset,
> +                                uint32_t *data)
> +{
> +    uint8_t cap_ver = 0;
> +    uint8_t dev_type = 0;
> +
> +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                           + PCI_EXP_FLAGS)
> +        & PCI_EXP_FLAGS_VERS;

Hmm. Weird tabbing? Or maybe it is my mailer?

> +    dev_type = (pci_get_byte(s->dev.config + real_offset - reg->offset
> +                             + PCI_EXP_FLAGS)
> +                & PCI_EXP_FLAGS_TYPE) >> 4;

Here it looks better.. but still not sure about the "+ PCI_EXP_FLAGS"?

> +
> +    /* no need to initialize in case of Root Complex Integrated Endpoint
> +     * with cap_ver 1.x
> +     */
> +    if ((dev_type == PCI_EXP_TYPE_RC_END) && (cap_ver == 1)) {
> +        *data = PT_INVALID_REG;
> +    }
> +
> +    *data = reg->init_val;
> +    return 0;
> +}
> +/* initialize Device Control 2 register */
> +static int pt_devctrl2_reg_init(XenPCIPassthroughState *s,
> +                                XenPTRegInfo *reg, uint32_t real_offset,
> +                                uint32_t *data)
> +{
> +    uint8_t cap_ver = 0;
> +
> +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                           + PCI_EXP_FLAGS)
> +        & PCI_EXP_FLAGS_VERS;

Tab-mayhem!

> +
> +    /* no need to initialize in case of cap_ver 1.x */
> +    if (cap_ver == 1) {
> +        *data = PT_INVALID_REG;
> +    }
> +
> +    *data = reg->init_val;
> +    return 0;
> +}
> +/* initialize Link Control 2 register */
> +static int pt_linkctrl2_reg_init(XenPCIPassthroughState *s,
> +                                 XenPTRegInfo *reg, uint32_t real_offset,
> +                                 uint32_t *data)
> +{
> +    uint32_t reg_field = 0;
> +    uint8_t cap_ver = 0;
> +
> +    cap_ver = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                           + PCI_EXP_FLAGS)
> +        & PCI_EXP_FLAGS_VERS;

.. strikes again!

> +
> +    /* no need to initialize in case of cap_ver 1.x */
> +    if (cap_ver == 1) {
> +        reg_field = PT_INVALID_REG;
> +    } else {
> +        /* set Supported Link Speed */
> +        uint8_t lnkcap = pci_get_byte(s->dev.config + real_offset - reg->offset
> +                                      + PCI_EXP_LNKCAP);
> +        reg_field |= PCI_EXP_LNKCAP_SLS & lnkcap;
> +    }
> +
> +    *data = reg_field;
> +    return 0;
> +}
> +
> +/* PCI Express Capability Structure reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_pcie_tbl[] = {
> +    /* Next Pointer reg */
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Device Capabilities reg */
> +    {
> +        .offset     = PCI_EXP_DEVCAP,
> +        .size       = 4,
> +        .init_val   = 0x00000000,
> +        .ro_mask    = 0x1FFCFFFF,
> +        .emu_mask   = 0x10000000,
> +        .init       = pt_common_reg_init,
> +        .u.dw.read  = pt_long_reg_read,
> +        .u.dw.write = pt_long_reg_write,
> +        .u.dw.restore = NULL,
> +    },
> +    /* Device Control reg */
> +    {
> +        .offset     = PCI_EXP_DEVCTL,
> +        .size       = 2,
> +        .init_val   = 0x2810,
> +        .ro_mask    = 0x8400,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_common_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    /* Link Control reg */
> +    {
> +        .offset     = PCI_EXP_LNKCTL,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFC34,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_linkctrl_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    /* Device Control 2 reg */
> +    {
> +        .offset     = 0x28,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFE0,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_devctrl2_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    /* Link Control 2 reg */
> +    {
> +        .offset     = 0x30,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xE040,
> +        .emu_mask   = 0xFFFF,
> +        .init       = pt_linkctrl2_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = pt_word_reg_restore,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/*********************************
> + * Power Management Capability
> + */
> +
> +/* initialize Power Management Capabilities register */
> +static int pt_pmc_reg_init(XenPCIPassthroughState *s,
> +                           XenPTRegInfo *reg, uint32_t real_offset,
> +                           uint32_t *data)
> +{
> +    PCIDevice *d = &s->dev;
> +
> +    if (s->power_mgmt) {
> +        /* set Power Management Capabilities register */
> +        s->pm_state->pmc_field = pci_get_word(d->config + real_offset);
> +    }
> +
> +    *data = reg->init_val;
> +    return 0;
> +}
> +/* initialize PCI Power Management Control/Status register */
> +static int pt_pmcsr_reg_init(XenPCIPassthroughState *s,
> +                             XenPTRegInfo *reg, uint32_t real_offset,
> +                             uint32_t *data)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint16_t cap_ver  = 0;
> +    uint16_t v = 0;
> +
> +    if (!s->power_mgmt) {
> +        *data = reg->init_val;
> +        return 0;
> +    }
> +
> +    /* check PCI Power Management support version */
> +    cap_ver = s->pm_state->pmc_field & PCI_PM_CAP_VER_MASK;
> +
> +    if (cap_ver > 2) {
> +        /* set No Soft Reset */
> +        s->pm_state->no_soft_reset =
> +            pci_get_byte(d->config + real_offset) & PCI_PM_CTRL_NO_SOFT_RESET;
> +    }
> +
> +    host_pci_get_word(s->real_device, real_offset, &v);
> +    /* wake up real physical device */
> +    switch (v & PCI_PM_CTRL_STATE_MASK) {
> +    case 0:
> +        break;
> +    case 1:
> +        PT_LOG(d, "Power state transition D1 -> D0active\n");
> +        host_pci_set_word(s->real_device, real_offset, 0);
> +        break;
> +    case 2:
> +        PT_LOG(d, "Power state transition D2 -> D0active\n");
> +        host_pci_set_word(s->real_device, real_offset, 0);
> +        usleep(200);
> +        break;
> +    case 3:
> +        PT_LOG(d, "Power state transition D3hot -> D0active\n");
> +        host_pci_set_word(s->real_device, real_offset, 0);
> +        usleep(10 * 1000);
> +        if (pt_init_pci_config(s)) {
> +            return -1;
> +        }
> +        break;
> +    }
> +
> +    *data = reg->init_val;
> +    return 0;
> +}
> +/* read Power Management Control/Status register */
> +static int pt_pmcsr_reg_read(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                             uint16_t *value, uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    uint16_t valid_emu_mask = reg->emu_mask;
> +
> +    if (!s->power_mgmt) {
> +        valid_emu_mask |= PCI_PM_CTRL_STATE_MASK | PCI_PM_CTRL_NO_SOFT_RESET;
> +    }
> +
> +    valid_emu_mask = valid_emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, cfg_entry->data, ~valid_emu_mask);
> +
> +    return 0;
> +}
> +/* reset Interrupt and I/O resource  */
> +static void pt_reset_interrupt_and_io_mapping(XenPCIPassthroughState *s)
> +{
> +    PCIDevice *d = &s->dev;
> +    PCIIORegion *r;
> +    int i = 0;
> +    uint8_t e_device = 0;
> +    uint8_t e_intx = 0;
> +
> +    /* unbind INTx */
> +    e_device = PCI_SLOT(s->dev.devfn);
> +    e_intx = pci_intx(s);
> +
> +    if (s->machine_irq) {
> +        if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, s->machine_irq,
> +                                    PT_IRQ_TYPE_PCI, 0, e_device, e_intx, 0)) {
> +            PT_ERR(d, "Unbinding of interrupt failed!\n");
> +        }
> +    }
> +
> +    /* clear all virtual region address */
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        r = &d->io_regions[i];
> +        r->addr = -1;
> +    }
> +
> +    /* unmapping BAR */
> +    pt_bar_mapping(s, 0, 0);
> +}
> +/* check power state transition */
> +static int check_power_state(XenPCIPassthroughState *s)
> +{
> +    XenPTPM *pm_state = s->pm_state;
> +    PCIDevice *d = &s->dev;
> +    uint16_t read_val = 0;
> +    uint16_t cur_state = 0;
> +
> +    /* get current power state */
> +    if (host_pci_get_word(s->real_device, pm_state->pm_base + PCI_PM_CTRL,
> +                          &read_val)) {
> +        return -1;
> +    }
> +    cur_state = read_val & PCI_PM_CTRL_STATE_MASK;
> +
> +    if (pm_state->req_state != cur_state) {
> +        PT_ERR(d, "Failed to change power state. "
> +               "(requested state: %d, current state: %d)\n",
> +               pm_state->req_state, cur_state);
> +        return -1;
> +    }
> +    return 0;
> +}
> +/* write Power Management Control/Status register */
> +static void pt_from_d3hot_to_d0_with_reset(void *opaque)
> +{
> +    XenPCIPassthroughState *s = opaque;
> +    XenPTPM *pm_state = s->pm_state;
> +    int ret = 0;
> +
> +    /* check power state */
> +    ret = check_power_state(s);
> +
> +    if (ret < 0) {
> +        goto out;
> +    }
> +
> +    pt_init_pci_config(s);
> +
> +out:
> +    /* power state transition flags off */
> +    pm_state->flags &= ~PT_FLAG_TRANSITING;
> +
> +    qemu_free_timer(pm_state->pm_timer);
> +    pm_state->pm_timer = NULL;
> +}
> +static void pt_default_power_transition(void *opaque)
> +{
> +    XenPCIPassthroughState *ptdev = opaque;
> +    XenPTPM *pm_state = ptdev->pm_state;
> +
> +    /* check power state */
> +    check_power_state(ptdev);
> +
> +    /* power state transition flags off */
> +    pm_state->flags &= ~PT_FLAG_TRANSITING;
> +
> +    qemu_free_timer(pm_state->pm_timer);
> +    pm_state->pm_timer = NULL;
> +}
> +static int pt_pmcsr_reg_write(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                              uint16_t *value, uint16_t dev_value,
> +                              uint16_t valid_mask)
> +{
> +    XenPTRegInfo *reg = cfg_entry->reg;
> +    PCIDevice *d = &s->dev;
> +    uint16_t emu_mask = reg->emu_mask;
> +    uint16_t writable_mask = 0;
> +    uint16_t throughable_mask = 0;
> +    XenPTPM *pm_state = s->pm_state;
> +
> +    if (!s->power_mgmt) {
> +        emu_mask |= PCI_PM_CTRL_STATE_MASK | PCI_PM_CTRL_NO_SOFT_RESET;
> +    }
> +
> +    /* modify emulate register */
> +    writable_mask = emu_mask & ~reg->ro_mask & valid_mask;
> +    cfg_entry->data = PT_MERGE_VALUE(*value, cfg_entry->data, writable_mask);
> +
> +    /* create value for writing to I/O device register */
> +    throughable_mask = ~emu_mask & valid_mask;
> +    *value = PT_MERGE_VALUE(*value, dev_value, throughable_mask);
> +
> +    if (!s->power_mgmt) {
> +        return 0;
> +    }
> +
> +    /* set I/O device power state */
> +    pm_state->cur_state = dev_value & PCI_PM_CTRL_STATE_MASK;
> +
> +    /* set Guest requested PowerState */
> +    pm_state->req_state = *value & PCI_PM_CTRL_STATE_MASK;
> +
> +    /* check power state transition or not */
> +    if (pm_state->cur_state == pm_state->req_state) {
> +        /* not power state transition */

.. No power state transition.

> +        return 0;
> +    }
> +
> +    /* check enable power state transition */
> +    if ((pm_state->req_state != 0) &&
> +        (pm_state->cur_state > pm_state->req_state)) {
> +        PT_ERR(d, "Invalid power transition. "
> +               "(requested state: %d, current state: %d)\n",
> +               pm_state->req_state, pm_state->cur_state);
> +
> +        return 0;
> +    }
> +
> +    /* check if this device supports the requested power state */
> +    if (((pm_state->req_state == 1) && !(pm_state->pmc_field & PCI_PM_CAP_D1))
> +        || ((pm_state->req_state == 2) &&
> +            !(pm_state->pmc_field & PCI_PM_CAP_D2))) {
> +        PT_ERR(d, "Invalid power transition. "
> +               "(requested state: %d, current state: %d)\n",
> +               pm_state->req_state, pm_state->cur_state);
> +
> +        return 0;
> +    }
> +
> +    /* in case of transition related to D3hot, it's necessary to wait 10 ms.
> +     * But because writing to register will be performed later on actually,

'performed later on,'
> +     * don't start QEMUTimer right now, just alloc and init QEMUTimer here.

You might want to say where it will be started.

> +     */
> +    if ((pm_state->cur_state == 3) || (pm_state->req_state == 3)) {
> +        if (pm_state->req_state == 0) {
> +            /* alloc and init QEMUTimer */
> +            if (!pm_state->no_soft_reset) {
> +                pm_state->pm_timer = qemu_new_timer_ms(rt_clock,
> +                    pt_from_d3hot_to_d0_with_reset, s);
> +
> +                /* reset Interrupt and I/O resource mapping */
> +                pt_reset_interrupt_and_io_mapping(s);
> +            } else {
> +                pm_state->pm_timer = qemu_new_timer_ms(rt_clock,
> +                                        pt_default_power_transition, s);
> +            }
> +        } else {
> +            /* alloc and init QEMUTimer */
> +            pm_state->pm_timer = qemu_new_timer_ms(rt_clock,
> +                pt_default_power_transition, s);
> +        }
> +
> +        /* set power state transition delay */
> +        pm_state->pm_delay = 10;
> +
> +        /* power state transition flags on */
> +        pm_state->flags |= PT_FLAG_TRANSITING;
> +    }
> +    /* in case of transition related to D0, D1 and D2,
> +     * no need to use QEMUTimer.
> +     * So, we perfom writing to register here and then read it back.
> +     */
> +    else {
> +        /* write power state to I/O device register */
> +        host_pci_set_word(s->real_device, pm_state->pm_base + PCI_PM_CTRL,
> +                          *value);
> +
> +        /* in case of transition related to D2,
> +         * it's necessary to wait 200 usec.
> +         * But because QEMUTimer do not support microsec unit right now,
> +         * so we do wait ourself here.

'.. QEMUTimer does not support microsec resolution, we will wait here.'

> +         */
> +        if ((pm_state->cur_state == 2) || (pm_state->req_state == 2)) {
> +            usleep(200);
> +        }
> +
> +        /* check power state */
> +        check_power_state(s);
> +
> +        /* recreate value for writing to I/O device register */
> +        if (host_pci_get_word(s->real_device, pm_state->pm_base + PCI_PM_CTRL,
> +                              value)) {
> +            return -1;
> +        }
> +    }
> +
> +    return 0;
> +}
> +
> +/* restore Power Management Control/Status register */
> +static int pt_pmcsr_reg_restore(XenPCIPassthroughState *s, XenPTReg *cfg_entry,
> +                                uint32_t real_offset, uint16_t dev_value,
> +                                uint16_t *value)
> +{
> +    /* create value for restoring to I/O device register
> +     * No need to restore, just clear PME Enable and PME Status bit
> +     * Note: register type of PME Status bit is RW1C, so clear by writing 1b
> +     */
> +    *value = (dev_value & ~PCI_PM_CTRL_PME_ENABLE) | PCI_PM_CTRL_PME_STATUS;
> +
> +    return 0;
> +}
> +
> +
> +/* Power Management Capability reg static infomation table */
> +static XenPTRegInfo pt_emu_reg_pm_tbl[] = {
> +    /* Next Pointer reg */
> +    {
> +        .offset     = PCI_CAP_LIST_NEXT,
> +        .size       = 1,
> +        .init_val   = 0x00,
> +        .ro_mask    = 0xFF,
> +        .emu_mask   = 0xFF,
> +        .init       = pt_ptr_reg_init,
> +        .u.b.read   = pt_byte_reg_read,
> +        .u.b.write  = pt_byte_reg_write,
> +        .u.b.restore  = NULL,
> +    },
> +    /* Power Management Capabilities reg */
> +    {
> +        .offset     = PCI_CAP_FLAGS,
> +        .size       = 2,
> +        .init_val   = 0x0000,
> +        .ro_mask    = 0xFFFF,
> +        .emu_mask   = 0xF9C8,
> +        .init       = pt_pmc_reg_init,
> +        .u.w.read   = pt_word_reg_read,
> +        .u.w.write  = pt_word_reg_write,
> +        .u.w.restore  = NULL,
> +    },
> +    /* PCI Power Management Control/Status reg */
> +    {
> +        .offset     = PCI_PM_CTRL,
> +        .size       = 2,
> +        .init_val   = 0x0008,
> +        .ro_mask    = 0xE1FC,
> +        .emu_mask   = 0x8100,
> +        .init       = pt_pmcsr_reg_init,
> +        .u.w.read   = pt_pmcsr_reg_read,
> +        .u.w.write  = pt_pmcsr_reg_write,
> +        .u.w.restore  = pt_pmcsr_reg_restore,
> +    },
> +    {
> +        .size = 0,
> +    },
> +};
> +
> +
> +/****************************
> + * Capabilities
> + */
> +
> +/* AER register operations */
> +
> +static void aer_save_one_register(XenPCIPassthroughState *s, int offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint32_t aer_base = s->pm_state->aer_base;
> +    uint32_t val = 0;
> +
> +    if (host_pci_get_long(s->real_device, aer_base + offset, &val)) {
> +        return;
> +    }
> +    pci_set_long(d->config + aer_base + offset, val);
> +}
> +static void pt_aer_reg_save(XenPCIPassthroughState *s)
> +{
> +    /* after reset, following register values should be restored.
> +     * So, save them.
> +     */
> +    aer_save_one_register(s, PCI_ERR_UNCOR_MASK);
> +    aer_save_one_register(s, PCI_ERR_UNCOR_SEVER);
> +    aer_save_one_register(s, PCI_ERR_COR_MASK);
> +    aer_save_one_register(s, PCI_ERR_CAP);
> +}
> +static void aer_restore_one_register(XenPCIPassthroughState *s, int offset)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint32_t aer_base = s->pm_state->aer_base;
> +    uint32_t config = 0;
> +
> +    config = pci_get_long(d->config + aer_base + offset);
> +    host_pci_set_long(s->real_device, aer_base + offset, config);
> +}
> +static void pt_aer_reg_restore(XenPCIPassthroughState *s)
> +{
> +    /* the following registers should be reconfigured to correct values

the -> The
> +     * after reset. restore them.

reset. -> reset, hence
> +     * other registers should not be reconfigured after reset

'Other'

> +     * if there is no reason

So what are the other registers? Every other register _but_ the
ones that are enumerated here? If so, please state that explicitly.

> +     */
> +    aer_restore_one_register(s, PCI_ERR_UNCOR_MASK);
> +    aer_restore_one_register(s, PCI_ERR_UNCOR_SEVER);
> +    aer_restore_one_register(s, PCI_ERR_COR_MASK);
> +    aer_restore_one_register(s, PCI_ERR_CAP);
> +}
> +
> +/* capability structure register group size functions */
> +
> +static int pt_reg_grp_size_init(XenPCIPassthroughState *s,
> +                                const XenPTRegGroupInfo *grp_reg,
> +                                uint32_t base_offset, uint8_t *size)
> +{
> +    *size = grp_reg->grp_size;
> +    return 0;
> +}
> +/* get Power Management Capability Structure register group size */
> +static int pt_pm_size_init(XenPCIPassthroughState *s,
> +                           const XenPTRegGroupInfo *grp_reg,
> +                           uint32_t base_offset, uint8_t *size)
> +{
> +    *size = grp_reg->grp_size;
> +
> +    if (!s->power_mgmt) {
> +        return 0;
> +    }
> +
> +    s->pm_state = g_new0(XenPTPM, 1);
> +
> +    /* set Power Management Capability base offset */
> +    s->pm_state->pm_base = base_offset;
> +
> +    /* find AER register and set AER Capability base offset */
> +    s->pm_state->aer_base = host_pci_find_ext_cap_offset(s->real_device,
> +                                                         PCI_EXT_CAP_ID_ERR);
> +
> +    /* save AER register */
> +    if (s->pm_state->aer_base) {
> +        pt_aer_reg_save(s);
> +    }
> +
> +    return 0;
> +}
> +/* get Vendor Specific Capability Structure register group size */
> +static int pt_vendor_size_init(XenPCIPassthroughState *s,
> +                               const XenPTRegGroupInfo *grp_reg,
> +                               uint32_t base_offset, uint8_t *size)
> +{
> +    *size = pci_get_byte(s->dev.config + base_offset + 0x02);
> +    return 0;
> +}
> +/* get PCI Express Capability Structure register group size */
> +static int pt_pcie_size_init(XenPCIPassthroughState *s,
> +                             const XenPTRegGroupInfo *grp_reg,
> +                             uint32_t base_offset, uint8_t *size)
> +{
> +    PCIDevice *d = &s->dev;
> +    uint16_t exp_flag = 0;
> +    uint16_t type = 0;
> +    uint16_t version = 0;
> +    uint8_t pcie_size = 0;
> +
> +    exp_flag = pci_get_word(d->config + base_offset + PCI_EXP_FLAGS);
> +    type = (exp_flag & PCI_EXP_FLAGS_TYPE) >> 4;
> +    version = exp_flag & PCI_EXP_FLAGS_VERS;
> +
> +    /* calculate size depend on capability version and device/port type */
> +    /* in case of PCI Express Base Specification Rev 1.x */
> +    if (version == 1) {
> +        /* The PCI Express Capabilities, Device Capabilities, and Device
> +         * Status/Control registers are required for all PCI Express devices.
> +         * The Link Capabilities and Link Status/Control are required for all
> +         * Endpoints that are not Root Complex Integrated Endpoints. Endpoints
> +         * are not required to implement registers other than those listed
> +         * above and terminate the capability structure.
> +         */
> +        switch (type) {
> +        case PCI_EXP_TYPE_ENDPOINT:
> +        case PCI_EXP_TYPE_LEG_END:
> +            pcie_size = 0x14;
> +            break;
> +        case PCI_EXP_TYPE_RC_END:
> +            /* has no link */
> +            pcie_size = 0x0C;
> +            break;
> +        /* only EndPoint passthrough is supported */
> +        case PCI_EXP_TYPE_ROOT_PORT:
> +        case PCI_EXP_TYPE_UPSTREAM:
> +        case PCI_EXP_TYPE_DOWNSTREAM:
> +        case PCI_EXP_TYPE_PCI_BRIDGE:
> +        case PCI_EXP_TYPE_PCIE_BRIDGE:
> +        case PCI_EXP_TYPE_RC_EC:
> +        default:
> +            PT_ERR(d, "Internal error: Unsupported device/port type (%d).\n",
> +                   type);
> +            return -1;
> +        }
> +    }
> +    /* in case of PCI Express Base Specification Rev 2.0 */
> +    else if (version == 2) {
> +        switch (type) {
> +        case PCI_EXP_TYPE_ENDPOINT:
> +        case PCI_EXP_TYPE_LEG_END:
> +        case PCI_EXP_TYPE_RC_END:
> +            /* For Functions that do not implement the registers,
> +             * these spaces must be hardwired to 0b.

So this comment applies to the functions below the 'break' right?
Should you move it? But that doesn't make sense - we end up hitting
return -1 so it bails out and does not return 0b. Hmmm.. So what is
this comment referring to?

> +             */
> +            pcie_size = 0x3C;
> +            break;
> +        /* only EndPoint passthrough is supported */
> +        case PCI_EXP_TYPE_ROOT_PORT:
> +        case PCI_EXP_TYPE_UPSTREAM:
> +        case PCI_EXP_TYPE_DOWNSTREAM:
> +        case PCI_EXP_TYPE_PCI_BRIDGE:
> +        case PCI_EXP_TYPE_PCIE_BRIDGE:
> +        case PCI_EXP_TYPE_RC_EC:
> +        default:
> +            PT_ERR(d, "Internal error: Unsupported device/port type (%d).\n",
> +                   type);
> +            return -1;
> +        }
> +    } else {
> +        PT_ERR(d, "Internal error: Unsupported capability version (%d).\n",
> +               version);
> +        return -1;
> +    }
> +
> +    *size = pcie_size;
> +    return 0;
> +}
> +
> +static const XenPTRegGroupInfo pt_emu_reg_grp_tbl[] = {
> +    /* Header Type0 reg group */
> +    {
> +        .grp_id      = 0xFF,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0x40,
> +        .size_init   = pt_reg_grp_size_init,
> +        .emu_reg_tbl = pt_emu_reg_header0_tbl,
> +    },
> +    /* PCI PowerManagement Capability reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_PM,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = PCI_PM_SIZEOF,
> +        .size_init   = pt_pm_size_init,
> +        .emu_reg_tbl = pt_emu_reg_pm_tbl,
> +    },
> +    /* AGP Capability Structure reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_AGP,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x30,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* Vital Product Data Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_VPD,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0x08,
> +        .size_init   = pt_reg_grp_size_init,
> +        .emu_reg_tbl = pt_emu_reg_vpd_tbl,
> +    },
> +    /* Slot Identification reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_SLOTID,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x04,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* PCI-X Capabilities List Item reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_PCIX,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x18,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* Vendor Specific Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_VNDR,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0xFF,
> +        .size_init   = pt_vendor_size_init,
> +        .emu_reg_tbl = pt_emu_reg_vendor_tbl,
> +    },
> +    /* SHPC Capability List Item reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_SHPC,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x08,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* Subsystem ID and Subsystem Vendor ID Capability List Item reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_SSVID,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x08,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* AGP 8x Capability Structure reg group */
> +    {
> +        .grp_id     = PCI_CAP_ID_AGP3,
> +        .grp_type   = GRP_TYPE_HARDWIRED,
> +        .grp_size   = 0x30,
> +        .size_init  = pt_reg_grp_size_init,
> +    },
> +    /* PCI Express Capability Structure reg group */
> +    {
> +        .grp_id      = PCI_CAP_ID_EXP,
> +        .grp_type    = GRP_TYPE_EMU,
> +        .grp_size    = 0xFF,
> +        .size_init   = pt_pcie_size_init,
> +        .emu_reg_tbl = pt_emu_reg_pcie_tbl,
> +    },
> +    {
> +        .grp_size = 0,
> +    },
> +};
> +
> +/* initialize Capabilities Pointer or Next Pointer register */
> +static int pt_ptr_reg_init(XenPCIPassthroughState *s,
> +                           XenPTRegInfo *reg, uint32_t real_offset,
> +                           uint32_t *data)
> +{
> +    /* uint32_t reg_field = (uint32_t)s->dev.config[real_offset]; */
> +    uint32_t reg_field = pci_get_byte(s->dev.config + real_offset);

There is no check whether real_offset > than the size of what is
in dev.config. Perhaps that should be done?

> +    int i;
> +
> +    /* find capability offset */
> +    while (reg_field) {
> +        for (i = 0; pt_emu_reg_grp_tbl[i].grp_size != 0; i++) {
> +            if (pt_hide_dev_cap(s->real_device,
> +                                pt_emu_reg_grp_tbl[i].grp_id)) {
> +                continue;
> +            }
> +            if (pt_emu_reg_grp_tbl[i].grp_id == s->dev.config[reg_field]) {
> +                if (pt_emu_reg_grp_tbl[i].grp_type == GRP_TYPE_EMU) {
> +                    goto out;
> +                }
> +                /* ignore the 0 hardwired capability, find next one */
> +                break;
> +            }
> +        }
> +        /* next capability */
> +        /* reg_field = (uint32_t)s->dev.config[reg_field + 1]; */
> +        reg_field = pci_get_byte(s->dev.config + reg_field + 1);
> +    }
> +
> +out:
> +    *data = reg_field;
> +    return 0;
> +}
> +
> +
> +/*************
> + * Main
> + */
> +
> +/* restore a part of I/O device register */
> +static int pt_config_restore(XenPCIPassthroughState *s)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegInfo *reg = NULL;
> +    uint32_t real_offset = 0;
> +    uint32_t read_val = 0;
> +    uint32_t val = 0;
> +    int rc = 0;
> +
> +    /* find emulate register group entry */
> +    QLIST_FOREACH(reg_grp_entry, &s->reg_grp_tbl, entries) {
> +        /* find emulate register entry */
> +        QLIST_FOREACH(reg_entry, &reg_grp_entry->reg_tbl_list, entries) {
> +            reg = reg_entry->reg;
> +
> +            /* check whether restoring is needed */
> +            if (!reg->u.b.restore) {
> +                continue;
> +            }
> +
> +            real_offset = reg_grp_entry->base_offset + reg->offset;
> +
> +            /* read I/O device register value */
> +            rc = host_pci_get_block(s->real_device, real_offset,
> +                                    (uint8_t *)&read_val, reg->size);
> +
> +            if (rc < 0) {
> +                PT_ERR(&s->dev, "pci_read_block failed. "
> +                       "return value: %d.\n", rc);
> +                memset(&read_val, 0xff, reg->size);
> +            }
> +
> +            val = 0;
> +
> +            /* restore based on register size */
> +            switch (reg->size) {
> +            case 1:
> +                /* byte register */
> +                rc = reg->u.b.restore(s, reg_entry, real_offset,
> +                                      (uint8_t)read_val, (uint8_t *)&val);
> +                break;
> +            case 2:
> +                /* word register */
> +                rc = reg->u.w.restore(s, reg_entry, real_offset,
> +                                      (uint16_t)read_val, (uint16_t *)&val);
> +                break;
> +            case 4:
> +                /* double word register */
> +                rc = reg->u.dw.restore(s, reg_entry, real_offset,
> +                                       (uint32_t)read_val, (uint32_t *)&val);
> +                break;
> +            }
> +
> +            /* restoring error */
> +            if (rc < 0) {
> +                xen_shutdown_fatal_error("Internal error: Invalid restoring."
> +                                         " (%s, rc: %d)\n", __func__, rc);
> +                return -1;
> +            }
> +
> +            PT_LOG_CONFIG(&s->dev, real_offset, val, reg->size);
> +
> +            rc = host_pci_set_block(s->real_device, real_offset,
> +                                    (uint8_t *)&val, reg->size);
> +
> +            if (rc < 0) {
> +                PT_ERR(&s->dev, "pci_write_block failed. "
> +                       "return value: %d.\n", rc);
> +                return -1;
> +            }
> +        }
> +    }
> +
> +    /* if AER supported, restore it */
> +    if (s->pm_state->aer_base) {
> +        pt_aer_reg_restore(s);
> +    }
> +    return 0;
> +}
> +/* reinitialize all emulate registers */
> +static int pt_config_reinit(XenPCIPassthroughState *s)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    XenPTReg *reg_entry = NULL;
> +    XenPTRegInfo *reg = NULL;
> +    int rc = 0;
> +
> +    /* find emulate register group entry */
> +    QLIST_FOREACH(reg_grp_entry, &s->reg_grp_tbl, entries) {
> +        /* find emulate register entry */
> +        QLIST_FOREACH(reg_entry, &reg_grp_entry->reg_tbl_list, entries) {
> +            reg = reg_entry->reg;
> +            if (reg->init) {
> +                /* initialize emulate register */
> +                rc = reg->init(s, reg_entry->reg,
> +                               reg_grp_entry->base_offset + reg->offset,
> +                               &reg_entry->data);
> +                if (rc < 0) {
> +                    return rc;
> +                }
> +            }
> +        }
> +    }
> +    return 0;
> +}
> +
> +static int pt_init_pci_config(XenPCIPassthroughState *s)
> +{
> +    PCIDevice *d = &s->dev;
> +    int rc = 0;
> +
> +    PT_LOG(d, "Reinitialize PCI configuration registers due to power state"
> +           " transition with internal reset.\n");
> +
> +    /* restore a part of I/O device register */
> +    rc = pt_config_restore(s);
> +    if (rc < 0) {
> +        return rc;
> +    }
> +
> +    /* reinitialize all emulate register */
> +    rc = pt_config_reinit(s);
> +    if (rc < 0) {
> +        return rc;
> +    }
> +
> +    /* rebind machine_irq to device */
> +    if (s->machine_irq != 0) {
> +        uint8_t e_device = PCI_SLOT(s->dev.devfn);
> +        uint8_t e_intx = pci_intx(s);
> +
> +        rc = xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, s->machine_irq, 0,
> +                                       e_device, e_intx);
> +        if (rc < 0) {
> +            PT_ERR(d, "Rebinding of interrupt failed! rc=%d\n", rc);
> +        }
> +    }
> +
> +    return rc;
> +}
> +
> +static uint8_t find_cap_offset(XenPCIPassthroughState *s, uint8_t cap)
> +{
> +    uint8_t id;
> +    int max_cap = 48;

You need to use #define for that. Also you might want just make it an
unsigned.

> +    uint8_t pos = PCI_CAPABILITY_LIST;
> +    uint8_t status = 0;
> +
> +    if (host_pci_get_byte(s->real_device, PCI_STATUS, &status)) {
> +        return 0;
> +    }
> +    if ((status & PCI_STATUS_CAP_LIST) == 0) {
> +        return 0;
> +    }
> +
> +    while (max_cap--) {
> +        if (host_pci_get_byte(s->real_device, pos, &pos)) {
> +            break;
> +        }
> +        if (pos < 0x40) {

Can you explain why? (I presume it is b/c the capabilities entries do
not exist before 0x40 offset?)

> +            break;
> +        }
> +
> +        pos &= ~3;
> +        if (host_pci_get_byte(s->real_device, pos + PCI_CAP_LIST_ID, &id)) {
> +            break;
> +        }
> +
> +        if (id == 0xff) {
> +            break;
> +        }
> +        if (id == cap) {
> +            return pos;
> +        }
> +
> +        pos += PCI_CAP_LIST_NEXT;
> +    }
> +    return 0;
> +}
> +
> +static int pt_config_reg_init(XenPCIPassthroughState *s,
> +                              XenPTRegGroup *reg_grp, XenPTRegInfo *reg)
> +{
> +    XenPTReg *reg_entry;
> +    uint32_t data = 0;
> +    int rc = 0;
> +
> +    reg_entry = g_new0(XenPTReg, 1);
> +    reg_entry->reg = reg;
> +
> +    if (reg->init) {
> +        /* initialize emulate register */
> +        rc = reg->init(s, reg_entry->reg,
> +                       reg_grp->base_offset + reg->offset, &data);
> +        if (rc < 0) {
> +            free(reg_entry);
> +            return rc;
> +        }
> +        if (data == PT_INVALID_REG) {
> +            /* free unused BAR register entry */
> +            free(reg_entry);
> +            return 0;
> +        }
> +        /* set register value */
> +        reg_entry->data = data;
> +    }
> +    /* list add register entry */
> +    QLIST_INSERT_HEAD(&reg_grp->reg_tbl_list, reg_entry, entries);
> +
> +    return 0;
> +}
> +
> +int pt_config_init(XenPCIPassthroughState *s)
> +{
> +    XenPTRegGroup *reg_grp_entry = NULL;
> +    uint32_t reg_grp_offset = 0;
> +    XenPTRegInfo *reg_tbl = NULL;
> +    int i, j, rc;
> +
> +    QLIST_INIT(&s->reg_grp_tbl);
> +
> +    for (i = 0; pt_emu_reg_grp_tbl[i].grp_size != 0; i++) {
> +        if (pt_emu_reg_grp_tbl[i].grp_id != 0xFF) {
> +            if (pt_hide_dev_cap(s->real_device,
> +                                pt_emu_reg_grp_tbl[i].grp_id)) {
> +                continue;
> +            }
> +
> +            reg_grp_offset = find_cap_offset(s, pt_emu_reg_grp_tbl[i].grp_id);
> +
> +            if (!reg_grp_offset) {
> +                continue;
> +            }
> +        }
> +
> +        reg_grp_entry = g_new0(XenPTRegGroup, 1);
> +        QLIST_INIT(&reg_grp_entry->reg_tbl_list);
> +        QLIST_INSERT_HEAD(&s->reg_grp_tbl, reg_grp_entry, entries);
> +
> +        reg_grp_entry->base_offset = reg_grp_offset;
> +        reg_grp_entry->reg_grp = pt_emu_reg_grp_tbl + i;
> +        if (pt_emu_reg_grp_tbl[i].size_init) {
> +            /* get register group size */
> +            rc = pt_emu_reg_grp_tbl[i].size_init(s, reg_grp_entry->reg_grp,
> +                                                 reg_grp_offset,
> +                                                 &reg_grp_entry->size);
> +            if (rc < 0) {
> +                pt_config_delete(s);
> +                return rc;
> +            }
> +        }
> +
> +        if (pt_emu_reg_grp_tbl[i].grp_type == GRP_TYPE_EMU) {
> +            if (pt_emu_reg_grp_tbl[i].emu_reg_tbl) {
> +                reg_tbl = pt_emu_reg_grp_tbl[i].emu_reg_tbl;
> +                /* initialize capability register */
> +                for (j = 0; reg_tbl->size != 0; j++, reg_tbl++) {
> +                    /* initialize capability register */
> +                    rc = pt_config_reg_init(s, reg_grp_entry, reg_tbl);
> +                    if (rc < 0) {
> +                        pt_config_delete(s);
> +                        return rc;
> +                    }
> +                }
> +            }
> +        }
> +        reg_grp_offset = 0;

Can you move this to the top of the loop?
> +    }
> +
> +    return 0;
> +}
> +
> +/* delete all emulate register */
> +void pt_config_delete(XenPCIPassthroughState *s)
> +{
> +    struct XenPTRegGroup *reg_group, *next_grp;
> +    struct XenPTReg *reg, *next_reg;
> +
> +    /* free Power Management info table */
> +    if (s->pm_state) {
> +        if (s->pm_state->pm_timer) {
> +            qemu_del_timer(s->pm_state->pm_timer);
> +            qemu_free_timer(s->pm_state->pm_timer);
> +            s->pm_state->pm_timer = NULL;
> +        }
> +
> +        g_free(s->pm_state);
> +    }
> +
> +    /* free all register group entry */
> +    QLIST_FOREACH_SAFE(reg_group, &s->reg_grp_tbl, entries, next_grp) {
> +        /* free all register entry */
> +        QLIST_FOREACH_SAFE(reg, &reg_group->reg_tbl_list, entries, next_reg) {
> +            QLIST_REMOVE(reg, entries);
> +            g_free(reg);
> +        }
> +
> +        QLIST_REMOVE(reg_group, entries);
> +        g_free(reg_group);
> +    }
> +}
> -- 
> Anthony PERARD
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Dec 06 18:20:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Tue, 06 Dec 2011 18:20:36 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RXzd0-0007w7-Bx; Tue, 06 Dec 2011 18:20:30 +0000
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Stefano.Stabellini@eu.citrix.com>)
	id 1RXzcy-0007uy-E2
	for xen-devel@lists.xensource.com; Tue, 06 Dec 2011 18:20:29 +0000
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1323195545!51363948!3
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAyMzAwOTc=\n
X-StarScan-Version: 6.4.2; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4073 invoked from network); 6 Dec 2011 18:19:13 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Dec 2011 18:19:13 -0000
X-IronPort-AV: E=Sophos;i="4.71,307,1320642000"; d="scan'208";a="173120747"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Dec 2011 13:19:45 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.213.0; Tue, 6 Dec 2011 13:19:44 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pB6IJEjK019549;
	Tue, 6 Dec 2011 10:19:28 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Tue, 6 Dec 2011 18:19:54 +0000
Message-ID: <1323195609-17277-10-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <alpine.DEB.2.00.1112061753410.31179@kaball-desktop>
References: <alpine.DEB.2.00.1112061753410.31179@kaball-desktop>
MIME-Version: 1.0
Cc: Ian Campbell <ian.campbell@citrix.com>, Tim.Deegan@citrix.com,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC 10/25] arm: header files
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

A simple implementation of everything under asm-arm and arch-arm.h; some
of these files are shamelessly taken from Linux.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
---
 xen/include/asm-arm/atomic.h      |  212 +++++++++++++++++++++++++++++
 xen/include/asm-arm/bitops.h      |  195 +++++++++++++++++++++++++++
 xen/include/asm-arm/bug.h         |   15 ++
 xen/include/asm-arm/byteorder.h   |   16 +++
 xen/include/asm-arm/cache.h       |   20 +++
 xen/include/asm-arm/config.h      |  124 +++++++++++++++++
 xen/include/asm-arm/cpregs.h      |  207 ++++++++++++++++++++++++++++
 xen/include/asm-arm/current.h     |   60 ++++++++
 xen/include/asm-arm/debugger.h    |   15 ++
 xen/include/asm-arm/delay.h       |   15 ++
 xen/include/asm-arm/desc.h        |   12 ++
 xen/include/asm-arm/div64.h       |  241 +++++++++++++++++++++++++++++++++
 xen/include/asm-arm/elf.h         |   33 +++++
 xen/include/asm-arm/event.h       |   41 ++++++
 xen/include/asm-arm/flushtlb.h    |   31 +++++
 xen/include/asm-arm/grant_table.h |   35 +++++
 xen/include/asm-arm/hardirq.h     |   28 ++++
 xen/include/asm-arm/hypercall.h   |   24 ++++
 xen/include/asm-arm/init.h        |   12 ++
 xen/include/asm-arm/io.h          |   12 ++
 xen/include/asm-arm/iocap.h       |   20 +++
 xen/include/asm-arm/multicall.h   |   23 +++
 xen/include/asm-arm/nmi.h         |   15 ++
 xen/include/asm-arm/numa.h        |   21 +++
 xen/include/asm-arm/paging.h      |   13 ++
 xen/include/asm-arm/percpu.h      |   28 ++++
 xen/include/asm-arm/processor.h   |  269 +++++++++++++++++++++++++++++++++++++
 xen/include/asm-arm/regs.h        |   43 ++++++
 xen/include/asm-arm/setup.h       |   16 +++
 xen/include/asm-arm/smp.h         |   25 ++++
 xen/include/asm-arm/softirq.h     |   15 ++
 xen/include/asm-arm/spinlock.h    |  144 ++++++++++++++++++++
 xen/include/asm-arm/string.h      |   38 +++++
 xen/include/asm-arm/system.h      |  202 ++++++++++++++++++++++++++++
 xen/include/asm-arm/trace.h       |   12 ++
 xen/include/asm-arm/types.h       |   57 ++++++++
 xen/include/asm-arm/xenoprof.h    |   12 ++
 xen/include/public/arch-arm.h     |  125 +++++++++++++++++
 xen/include/public/xen.h          |    2 +
 39 files changed, 2428 insertions(+), 0 deletions(-)
 create mode 100644 xen/include/asm-arm/atomic.h
 create mode 100644 xen/include/asm-arm/bitops.h
 create mode 100644 xen/include/asm-arm/bug.h
 create mode 100644 xen/include/asm-arm/byteorder.h
 create mode 100644 xen/include/asm-arm/cache.h
 create mode 100644 xen/include/asm-arm/config.h
 create mode 100644 xen/include/asm-arm/cpregs.h
 create mode 100644 xen/include/asm-arm/current.h
 create mode 100644 xen/include/asm-arm/debugger.h
 create mode 100644 xen/include/asm-arm/delay.h
 create mode 100644 xen/include/asm-arm/desc.h
 create mode 100644 xen/include/asm-arm/div64.h
 create mode 100644 xen/include/asm-arm/elf.h
 create mode 100644 xen/include/asm-arm/event.h
 create mode 100644 xen/include/asm-arm/flushtlb.h
 create mode 100644 xen/include/asm-arm/grant_table.h
 create mode 100644 xen/include/asm-arm/hardirq.h
 create mode 100644 xen/include/asm-arm/hypercall.h
 create mode 100644 xen/include/asm-arm/init.h
 create mode 100644 xen/include/asm-arm/io.h
 create mode 100644 xen/include/asm-arm/iocap.h
 create mode 100644 xen/include/asm-arm/multicall.h
 create mode 100644 xen/include/asm-arm/nmi.h
 create mode 100644 xen/include/asm-arm/numa.h
 create mode 100644 xen/include/asm-arm/paging.h
 create mode 100644 xen/include/asm-arm/percpu.h
 create mode 100644 xen/include/asm-arm/processor.h
 create mode 100644 xen/include/asm-arm/regs.h
 create mode 100644 xen/include/asm-arm/setup.h
 create mode 100644 xen/include/asm-arm/smp.h
 create mode 100644 xen/include/asm-arm/softirq.h
 create mode 100644 xen/include/asm-arm/spinlock.h
 create mode 100644 xen/include/asm-arm/string.h
 create mode 100644 xen/include/asm-arm/system.h
 create mode 100644 xen/include/asm-arm/trace.h
 create mode 100644 xen/include/asm-arm/types.h
 create mode 100644 xen/include/asm-arm/xenoprof.h
 create mode 100644 xen/include/public/arch-arm.h

diff --git a/xen/include/asm-arm/atomic.h b/xen/include/asm-arm/atomic.h
new file mode 100644
index 0000000..2b9ce0e
--- /dev/null
+++ b/xen/include/asm-arm/atomic.h
@@ -0,0 +1,212 @@
+/*
+ *  arch/arm/include/asm/atomic.h
+ *
+ *  Copyright (C) 1996 Russell King.
+ *  Copyright (C) 2002 Deep Blue Solutions Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef __ARCH_ARM_ATOMIC__
+#define __ARCH_ARM_ATOMIC__
+
+#include <xen/config.h>
+#include <asm/system.h>
+
+#define build_atomic_read(name, size, type, reg)   \
+static inline type name(const volatile type *addr) \
+{                                                  \
+    type ret;                                      \
+    asm volatile("ldr" size " %0,%1"               \
+                 : reg (ret)                       \
+                 : "m" (*(volatile type *)addr));  \
+    return ret;                                    \
+}
+
+#define build_atomic_write(name, size, type, reg)      \
+static inline void name(volatile type *addr, type val) \
+{                                                      \
+    asm volatile("str" size " %1,%0"                   \
+                 : "=m" (*(volatile type *)addr)       \
+                 : reg (val));                         \
+}
+
+build_atomic_read(atomic_read8, "b", uint8_t, "=q")
+build_atomic_read(atomic_read16, "h", uint16_t, "=r")
+build_atomic_read(atomic_read32, "", uint32_t, "=r")
+//build_atomic_read(atomic_read64, "d", uint64_t, "=r")
+build_atomic_read(atomic_read_int, "", int, "=r")
+
+build_atomic_write(atomic_write8, "b", uint8_t, "q")
+build_atomic_write(atomic_write16, "h", uint16_t, "r")
+build_atomic_write(atomic_write32, "", uint32_t, "r")
+//build_atomic_write(atomic_write64, "d", uint64_t, "r")
+build_atomic_write(atomic_write_int, "", int, "r")
+
+/*
+ * NB. I've pushed the volatile qualifier into the operations. This allows
+ * fast accessors such as _atomic_read() and _atomic_set() which don't give
+ * the compiler a fit.
+ */
+typedef struct { int counter; } atomic_t;
+
+#define ATOMIC_INIT(i) { (i) }
+
+/*
+ * On ARM, ordinary assignment (str instruction) doesn't clear the local
+ * strex/ldrex monitor on some implementations. The reason we can use it for
+ * atomic_set() is the clrex or dummy strex done on every exception return.
+ */
+#define _atomic_read(v) ((v).counter)
+#define atomic_read(v)  (*(volatile int *)&(v)->counter)
+
+#define _atomic_set(v,i) (((v).counter) = (i))
+#define atomic_set(v,i) (((v)->counter) = (i))
+
+/*
+ * ARMv6 UP and SMP safe atomic ops.  We use load exclusive and
+ * store exclusive to ensure that these are atomic.  We may loop
+ * to ensure that the update happens.
+ */
+static inline void atomic_add(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        __asm__ __volatile__("@ atomic_add\n"
+"1:     ldrex   %0, [%3]\n"
+"       add     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+}
+
+static inline int atomic_add_return(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        smp_mb();
+
+        __asm__ __volatile__("@ atomic_add_return\n"
+"1:     ldrex   %0, [%3]\n"
+"       add     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+
+        smp_mb();
+
+        return result;
+}
+
+static inline void atomic_sub(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        __asm__ __volatile__("@ atomic_sub\n"
+"1:     ldrex   %0, [%3]\n"
+"       sub     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+}
+
+static inline int atomic_sub_return(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        smp_mb();
+
+        __asm__ __volatile__("@ atomic_sub_return\n"
+"1:     ldrex   %0, [%3]\n"
+"       sub     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+
+        smp_mb();
+
+        return result;
+}
+
+static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
+{
+        unsigned long oldval, res;
+
+        smp_mb();
+
+        do {
+                __asm__ __volatile__("@ atomic_cmpxchg\n"
+                "ldrex  %1, [%3]\n"
+                "mov    %0, #0\n"
+                "teq    %1, %4\n"
+                "strexeq %0, %5, [%3]\n"
+                    : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter)
+                    : "r" (&ptr->counter), "Ir" (old), "r" (new)
+                    : "cc");
+        } while (res);
+
+        smp_mb();
+
+        return oldval;
+}
+
+static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
+{
+        unsigned long tmp, tmp2;
+
+        __asm__ __volatile__("@ atomic_clear_mask\n"
+"1:     ldrex   %0, [%3]\n"
+"       bic     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (tmp), "=&r" (tmp2), "+Qo" (*addr)
+        : "r" (addr), "Ir" (mask)
+        : "cc");
+}
+
+#define atomic_inc(v)           atomic_add(1, v)
+#define atomic_dec(v)           atomic_sub(1, v)
+
+#define atomic_inc_and_test(v)  (atomic_add_return(1, v) == 0)
+#define atomic_dec_and_test(v)  (atomic_sub_return(1, v) == 0)
+#define atomic_inc_return(v)    (atomic_add_return(1, v))
+#define atomic_dec_return(v)    (atomic_sub_return(1, v))
+#define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
+
+#define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0)
+
+static inline atomic_t atomic_compareandswap(
+    atomic_t old, atomic_t new, atomic_t *v)
+{
+    atomic_t rc;
+    rc.counter = __cmpxchg(&v->counter, old.counter, new.counter, sizeof(int));
+    return rc;
+}
+
+#endif /* __ARCH_ARM_ATOMIC__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/bitops.h b/xen/include/asm-arm/bitops.h
new file mode 100644
index 0000000..3d6b30b
--- /dev/null
+++ b/xen/include/asm-arm/bitops.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright 1995, Russell King.
+ * Various bits and pieces copyrights include:
+ *  Linus Torvalds (test_bit).
+ * Big endian support: Copyright 2001, Nicolas Pitre
+ *  reworked by rmk.
+ */
+
+#ifndef _ARM_BITOPS_H
+#define _ARM_BITOPS_H
+
+extern void _set_bit(int nr, volatile void * p);
+extern void _clear_bit(int nr, volatile void * p);
+extern void _change_bit(int nr, volatile void * p);
+extern int _test_and_set_bit(int nr, volatile void * p);
+extern int _test_and_clear_bit(int nr, volatile void * p);
+extern int _test_and_change_bit(int nr, volatile void * p);
+
+#define set_bit(n,p)              _set_bit(n,p)
+#define clear_bit(n,p)            _clear_bit(n,p)
+#define change_bit(n,p)           _change_bit(n,p)
+#define test_and_set_bit(n,p)     _test_and_set_bit(n,p)
+#define test_and_clear_bit(n,p)   _test_and_clear_bit(n,p)
+#define test_and_change_bit(n,p)  _test_and_change_bit(n,p)
+
+#define BIT(nr)                 (1UL << (nr))
+#define BIT_MASK(nr)            (1UL << ((nr) % BITS_PER_LONG))
+#define BIT_WORD(nr)            ((nr) / BITS_PER_LONG)
+#define BITS_PER_BYTE           8
+
+#define ADDR (*(volatile long *) addr)
+#define CONST_ADDR (*(const volatile long *) addr)
+
+/**
+ * __test_and_set_bit - Set a bit and return its old value
+ * @nr: Bit to set
+ * @addr: Address to count from
+ *
+ * This operation is non-atomic and can be reordered.
+ * If two examples of this operation race, one can appear to succeed
+ * but actually fail.  You must protect multiple accesses with a lock.
+ */
+static inline int __test_and_set_bit(int nr, volatile void *addr)
+{
+        unsigned long mask = BIT_MASK(nr);
+        volatile unsigned long *p =
+                ((volatile unsigned long *)addr) + BIT_WORD(nr);
+        unsigned long old = *p;
+
+        *p = old | mask;
+        return (old & mask) != 0;
+}
+
+/**
+ * __test_and_clear_bit - Clear a bit and return its old value
+ * @nr: Bit to clear
+ * @addr: Address to count from
+ *
+ * This operation is non-atomic and can be reordered.
+ * If two examples of this operation race, one can appear to succeed
+ * but actually fail.  You must protect multiple accesses with a lock.
+ */
+static inline int __test_and_clear_bit(int nr, volatile void *addr)
+{
+        unsigned long mask = BIT_MASK(nr);
+        volatile unsigned long *p =
+                ((volatile unsigned long *)addr) + BIT_WORD(nr);
+        unsigned long old = *p;
+
+        *p = old & ~mask;
+        return (old & mask) != 0;
+}
+
+/* WARNING: non atomic and it can be reordered! */
+static inline int __test_and_change_bit(int nr,
+                                            volatile void *addr)
+{
+        unsigned long mask = BIT_MASK(nr);
+        volatile unsigned long *p =
+                ((volatile unsigned long *)addr) + BIT_WORD(nr);
+        unsigned long old = *p;
+
+        *p = old ^ mask;
+        return (old & mask) != 0;
+}
+
+/**
+ * test_bit - Determine whether a bit is set
+ * @nr: bit number to test
+ * @addr: Address to start counting from
+ */
+static inline int test_bit(int nr, const volatile void *addr)
+{
+        const volatile unsigned long *p = (const volatile unsigned long *)addr;
+        return 1UL & (p[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
+}
+
+
+extern unsigned int _find_first_bit(
+    const unsigned long *addr, unsigned int size);
+extern unsigned int _find_next_bit(
+    const unsigned long *addr, unsigned int size, unsigned int offset);
+extern unsigned int _find_first_zero_bit(
+    const unsigned long *addr, unsigned int size);
+extern unsigned int _find_next_zero_bit(
+    const unsigned long *addr, unsigned int size, unsigned int offset);
+
+/*
+ * These are the little endian, atomic definitions.
+ */
+#define find_first_zero_bit(p,sz)       _find_first_zero_bit(p,sz)
+#define find_next_zero_bit(p,sz,off)    _find_next_zero_bit(p,sz,off)
+#define find_first_bit(p,sz)            _find_first_bit(p,sz)
+#define find_next_bit(p,sz,off)         _find_next_bit(p,sz,off)
+
+static inline int constant_fls(int x)
+{
+        int r = 32;
+
+        if (!x)
+                return 0;
+        if (!(x & 0xffff0000u)) {
+                x <<= 16;
+                r -= 16;
+        }
+        if (!(x & 0xff000000u)) {
+                x <<= 8;
+                r -= 8;
+        }
+        if (!(x & 0xf0000000u)) {
+                x <<= 4;
+                r -= 4;
+        }
+        if (!(x & 0xc0000000u)) {
+                x <<= 2;
+                r -= 2;
+        }
+        if (!(x & 0x80000000u)) {
+                x <<= 1;
+                r -= 1;
+        }
+        return r;
+}
+
+/*
+ * On ARMv5 and above those functions can be implemented around
+ * the clz instruction for much better code efficiency.
+ */
+
+static inline int fls(int x)
+{
+        int ret;
+
+        if (__builtin_constant_p(x))
+               return constant_fls(x);
+
+        asm("clz\t%0, %1" : "=r" (ret) : "r" (x));
+        ret = 32 - ret;
+        return ret;
+}
+
+#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
+
+/**
+ * find_first_set_bit - find the first set bit in @word
+ * @word: the word to search
+ *
+ * Returns the bit-number of the first set bit (first bit being 0).
+ * The input must *not* be zero.
+ */
+static inline unsigned int find_first_set_bit(unsigned long word)
+{
+        return ffs(word) - 1;
+}
+
+/**
+ * hweightN - returns the hamming weight of a N-bit word
+ * @x: the word to weigh
+ *
+ * The Hamming Weight of a number is the total number of bits set in it.
+ */
+#define hweight64(x) generic_hweight64(x)
+#define hweight32(x) generic_hweight32(x)
+#define hweight16(x) generic_hweight16(x)
+#define hweight8(x) generic_hweight8(x)
+
+#endif /* _ARM_BITOPS_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/bug.h b/xen/include/asm-arm/bug.h
new file mode 100644
index 0000000..bc2532c
--- /dev/null
+++ b/xen/include/asm-arm/bug.h
@@ -0,0 +1,15 @@
+#ifndef __ARM_BUG_H__
+#define __ARM_BUG_H__
+
+#define BUG() __bug(__FILE__, __LINE__)
+#define WARN() __warn(__FILE__, __LINE__)
+
+#endif /* __X86_BUG_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/byteorder.h b/xen/include/asm-arm/byteorder.h
new file mode 100644
index 0000000..f6ad883
--- /dev/null
+++ b/xen/include/asm-arm/byteorder.h
@@ -0,0 +1,16 @@
+#ifndef __ASM_ARM_BYTEORDER_H__
+#define __ASM_ARM_BYTEORDER_H__
+
+#define __BYTEORDER_HAS_U64__
+
+#include <xen/byteorder/little_endian.h>
+
+#endif /* __ASM_ARM_BYTEORDER_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/cache.h b/xen/include/asm-arm/cache.h
new file mode 100644
index 0000000..41b6291
--- /dev/null
+++ b/xen/include/asm-arm/cache.h
@@ -0,0 +1,20 @@
+#ifndef __ARCH_ARM_CACHE_H
+#define __ARCH_ARM_CACHE_H
+
+#include <xen/config.h>
+
+/* L1 cache line size */
+#define L1_CACHE_SHIFT  (CONFIG_ARM_L1_CACHE_SHIFT)
+#define L1_CACHE_BYTES  (1 << L1_CACHE_SHIFT)
+
+#define __read_mostly __attribute__((__section__(".data.read_mostly")))
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h
new file mode 100644
index 0000000..671ac52
--- /dev/null
+++ b/xen/include/asm-arm/config.h
@@ -0,0 +1,124 @@
+/******************************************************************************
+ * config.h
+ *
+ * A Linux-style configuration list.
+ */
+
+#ifndef __ARM_CONFIG_H__
+#define __ARM_CONFIG_H__
+
+#define CONFIG_PAGING_LEVELS 3
+
+#define CONFIG_ARM 1
+
+#define CONFIG_ARM_L1_CACHE_SHIFT 7 /* XXX */
+
+#define CONFIG_SMP 1
+
+#define CONFIG_DOMAIN_PAGE 1
+
+#define OPT_CONSOLE_STR "com1"
+
+#ifdef MAX_PHYS_CPUS
+#define NR_CPUS MAX_PHYS_CPUS
+#else
+#define NR_CPUS 128
+#endif
+
+#define MAX_VIRT_CPUS 128 /* XXX */
+#define MAX_HVM_VCPUS MAX_VIRT_CPUS
+
+#define asmlinkage /* Nothing needed */
+
+/* Linkage for ARM */
+#define __ALIGN .align 2
+#define __ALIGN_STR ".align 2"
+#ifdef __ASSEMBLY__
+#define ALIGN __ALIGN
+#define ALIGN_STR __ALIGN_STR
+#define ENTRY(name)                             \
+  .globl name;                                  \
+  ALIGN;                                        \
+  name:
+#define END(name) \
+  .size name, .-name
+#define ENDPROC(name) \
+  .type name, %function; \
+  END(name)
+#endif
+
+#define CONFIG_KERNEL_NO_RELOC 1
+
+/*
+ * Memory layout:
+ *  0  -   2M   Unmapped
+ *  2M -   4M   Xen text, data, bss
+ *  4M -   6M   Fixmap: special-purpose 4K mapping slots
+ *
+ * 32M - 128M   Frametable: 24 bytes per page for 16GB of RAM
+ *
+ *  1G -   2G   Xenheap: always-mapped memory
+ *  2G -   4G   Domheap: on-demand-mapped
+ */
+
+#define XEN_VIRT_START         0x00200000
+#define FIXMAP_ADDR(n)        (0x00400000 + (n) * PAGE_SIZE)
+#define FRAMETABLE_VIRT_START  0x02000000
+#define XENHEAP_VIRT_START     0x40000000
+#define DOMHEAP_VIRT_START     0x80000000
+
+#define HYPERVISOR_VIRT_START mk_unsigned_long(XEN_VIRT_START)
+
+#define DOMHEAP_ENTRIES        1024  /* 1024 2MB mapping slots */
+
+/* Fixmap slots */
+#define FIXMAP_CONSOLE  0  /* The primary UART */
+#define FIXMAP_PT       1  /* Temporary mappings of pagetable pages */
+#define FIXMAP_MISC     2  /* Ephemeral mappings of hardware */
+#define FIXMAP_GICD     3  /* Interrupt controller: distributor registers */
+#define FIXMAP_GICC1    4  /* Interrupt controller: CPU registers (first page) */
+#define FIXMAP_GICC2    5  /* Interrupt controller: CPU registers (second page) */
+#define FIXMAP_GICH     6  /* Interrupt controller: virtual interface control registers */
+
+#define PAGE_SHIFT              12
+
+#ifndef __ASSEMBLY__
+#define PAGE_SIZE           (1L << PAGE_SHIFT)
+#else
+#define PAGE_SIZE           (1 << PAGE_SHIFT)
+#endif
+#define PAGE_MASK           (~(PAGE_SIZE-1))
+#define PAGE_FLAG_MASK      (~0)
+
+#define STACK_ORDER 3
+#define STACK_SIZE  (PAGE_SIZE << STACK_ORDER)
+
+#ifndef __ASSEMBLY__
+extern unsigned long xen_phys_start;
+extern unsigned long xenheap_phys_end;
+extern unsigned long frametable_virt_end;
+#endif
+
+#define supervisor_mode_kernel (0)
+
+#define watchdog_disable() ((void)0)
+#define watchdog_enable()  ((void)0)
+
+/* Board-specific: base address of PL011 UART */
+#define EARLY_UART_ADDRESS 0x1c090000
+/* Board-specific: base address of GIC + its regs */
+#define GIC_BASE_ADDRESS 0x2c000000
+#define GIC_DR_OFFSET 0x1000
+#define GIC_CR_OFFSET 0x2000
+#define GIC_HR_OFFSET 0x4000 /* Guess work http://lists.infradead.org/pipermail/linux-arm-kernel/2011-September/064219.html */
+#define GIC_VR_OFFSET 0x6000 /* Virtual Machine CPU interface) */
+
+#endif /* __ARM_CONFIG_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/cpregs.h b/xen/include/asm-arm/cpregs.h
new file mode 100644
index 0000000..3a4028d
--- /dev/null
+++ b/xen/include/asm-arm/cpregs.h
@@ -0,0 +1,207 @@
+#ifndef __ASM_ARM_CPREGS_H
+#define __ASM_ARM_CPREGS_H
+
+#include <xen/stringify.h>
+
+/* Co-processor registers */
+
+/* Layout as used in assembly, with src/dest registers mixed in */
+#define __CP32(r, coproc, opc1, crn, crm, opc2) coproc, opc1, r, crn, crm, opc2
+#define __CP64(r1, r2, coproc, opc, crm) coproc, opc, r1, r2, crm
+#define CP32(r, name...) __CP32(r, name)
+#define CP64(r, name...) __CP64(r, name)
+
+/* Stringified for inline assembly */
+#define LOAD_CP32(r, name...)  "mrc " __stringify(CP32(%r, name)) ";"
+#define STORE_CP32(r, name...) "mcr " __stringify(CP32(%r, name)) ";"
+#define LOAD_CP64(r, name...)  "mrrc " __stringify(CP64(%r, %H##r, name)) ";"
+#define STORE_CP64(r, name...) "mcrr " __stringify(CP64(%r, %H##r, name)) ";"
+
+/* C wrappers */
+#define READ_CP32(name...) ({                                   \
+    register uint32_t _r;                                       \
+    asm volatile(LOAD_CP32(0, name) : "=r" (_r));               \
+    _r; })
+
+#define WRITE_CP32(v, name...) do {                             \
+    register uint32_t _r = (v);                                 \
+    asm volatile(STORE_CP32(0, name) : : "r" (_r));             \
+} while (0)
+
+#define READ_CP64(name...) ({                                   \
+    register uint64_t _r;                                       \
+    asm volatile(LOAD_CP64(0, name) : "=r" (_r));               \
+    _r; })
+
+#define WRITE_CP64(v, name...) do {                             \
+    register uint64_t _r = (v);                                 \
+    asm volatile(STORE_CP64(0, name) : : "r" (_r));             \
+} while (0)
+
+#define __HSR_CPREG_c0  0
+#define __HSR_CPREG_c1  1
+#define __HSR_CPREG_c2  2
+#define __HSR_CPREG_c3  3
+#define __HSR_CPREG_c4  4
+#define __HSR_CPREG_c5  5
+#define __HSR_CPREG_c6  6
+#define __HSR_CPREG_c7  7
+#define __HSR_CPREG_c8  8
+#define __HSR_CPREG_c9  9
+#define __HSR_CPREG_c10 10
+#define __HSR_CPREG_c11 11
+#define __HSR_CPREG_c12 12
+#define __HSR_CPREG_c13 13
+#define __HSR_CPREG_c14 14
+#define __HSR_CPREG_c15 15
+
+#define __HSR_CPREG_0   0
+#define __HSR_CPREG_1   1
+#define __HSR_CPREG_2   2
+#define __HSR_CPREG_3   3
+#define __HSR_CPREG_4   4
+#define __HSR_CPREG_5   5
+#define __HSR_CPREG_6   6
+#define __HSR_CPREG_7   7
+
+#define _HSR_CPREG32(cp,op1,crn,crm,op2) \
+    ((__HSR_CPREG_##crn) << HSR_CP32_CRN_SHIFT) | \
+    ((__HSR_CPREG_##crm) << HSR_CP32_CRM_SHIFT) | \
+    ((__HSR_CPREG_##op1) << HSR_CP32_OP1_SHIFT) | \
+    ((__HSR_CPREG_##op2) << HSR_CP32_OP2_SHIFT)
+
+#define _HSR_CPREG64(cp,op1,crm) \
+    ((__HSR_CPREG_##crm) << HSR_CP64_CRM_SHIFT) | \
+    ((__HSR_CPREG_##op1) << HSR_CP64_OP1_SHIFT)
+
+/* Encode a register as per HSR ISS pattern */
+#define HSR_CPREG32(X) _HSR_CPREG32(X)
+#define HSR_CPREG64(X) _HSR_CPREG64(X)
+
+/*
+ * Order registers by Coprocessor-> CRn-> Opcode 1-> CRm-> Opcode 2
+ *
+ * This matches the ordering used in the ARM as well as the groupings
+ * which the CP registers are allocated in.
+ *
+ * This is slightly different to the form of the instruction
+ * arguments, which are cp,opc1,crn,crm,opc2.
+ */
+
+/* Coprocessor 15 */
+
+/* CP15 CR0: CPUID and Cache Type Registers */
+#define ID_PFR0         p15,0,c0,c1,0   /* Processor Feature Register 0 */
+#define ID_PFR1         p15,0,c0,c1,1   /* Processor Feature Register 1 */
+#define CCSIDR          p15,1,c0,c0,0   /* Cache Size ID Registers */
+#define CLIDR           p15,1,c0,c0,1   /* Cache Level ID Register */
+#define CSSELR          p15,2,c0,c0,0   /* Cache Size Selection Register */
+
+/* CP15 CR1: System Control Registers */
+#define SCTLR           p15,0,c1,c0,0   /* System Control Register */
+#define SCR             p15,0,c1,c1,0   /* Secure Configuration Register */
+#define NSACR           p15,0,c1,c1,2   /* Non-Secure Access Control Register */
+#define HSCTLR          p15,4,c1,c0,0   /* Hyp. System Control Register */
+#define HCR             p15,4,c1,c1,0   /* Hyp. Configuration Register */
+
+/* CP15 CR2: Translation Table Base and Control Registers */
+#define TTBR0           p15,0,c2,c0,0   /* Translation Table Base Reg. 0 */
+#define TTBR1           p15,0,c2,c0,1   /* Translation Table Base Reg. 1 */
+#define TTBCR           p15,0,c2,c0,2   /* Translatation Table Base Control Register */
+#define HTTBR           p15,4,c2        /* Hyp. Translation Table Base Register */
+#define HTCR            p15,4,c2,c0,2   /* Hyp. Translation Control Register */
+#define VTCR            p15,4,c2,c1,2   /* Virtualization Translation Control Register */
+#define VTTBR           p15,6,c2        /* Virtualization Translation Table Base Register */
+
+/* CP15 CR3: Domain Access Control Register */
+
+/* CP15 CR4: */
+
+/* CP15 CR5: Fault Status Registers */
+#define DFSR            p15,0,c5,c0,0   /* Data Fault Status Register */
+#define IFSR            p15,0,c5,c0,1   /* Instruction Fault Status Register */
+#define HSR             p15,4,c5,c2,0   /* Hyp. Syndrome Register */
+
+/* CP15 CR6: Fault Address Registers */
+#define DFAR            p15,0,c6,c0,0   /* Data Fault Address Register  */
+#define IFAR            p15,0,c6,c0,2   /* Instruction Fault Address Register */
+#define HDFAR           p15,4,c6,c0,0   /* Hyp. Data Fault Address Register */
+#define HIFAR           p15,4,c6,c0,2   /* Hyp. Instruction Fault Address Register */
+#define HPFAR           p15,4,c6,c0,4   /* Hyp. IPA Fault Address Register */
+
+/* CP15 CR7: Cache and address translation operations */
+#define PAR             p15,0,c7        /* Physical Address Register */
+#define ICIALLUIS       p15,0,c7,c1,0   /* Invalidate all instruction caches to PoU inner shareable */
+#define BPIALLIS        p15,0,c7,c1,6   /* Invalidate entire branch predictor array inner shareable */
+#define ICIALLU         p15,0,c7,c5,0   /* Invalidate all instruction caches to PoU */
+#define BPIALL          p15,0,c7,c5,6   /* Invalidate entire branch predictor array */
+#define ATS1CPR         p15,0,c7,c8,0   /* Address Translation Stage 1. Non-Secure Kernel Read */
+#define ATS1CPW         p15,0,c7,c8,1   /* Address Translation Stage 1. Non-Secure Kernel Write */
+#define ATS1CUR         p15,0,c7,c8,2   /* Address Translation Stage 1. Non-Secure User Read */
+#define ATS1CUW         p15,0,c7,c8,3   /* Address Translation Stage 1. Non-Secure User Write */
+#define ATS12NSOPR      p15,0,c7,c8,4   /* Address Translation Stage 1+2 Non-Secure Kernel Read */
+#define ATS12NSOPW      p15,0,c7,c8,5   /* Address Translation Stage 1+2 Non-Secure Kernel Write */
+#define ATS12NSOUR      p15,0,c7,c8,6   /* Address Translation Stage 1+2 Non-Secure User Read */
+#define ATS12NSOUW      p15,0,c7,c8,7   /* Address Translation Stage 1+2 Non-Secure User Write */
+#define DCCMVAC         p15,0,c7,c10,1  /* Clean data or unified cache line by MVA to PoC */
+#define DCCISW          p15,0,c7,c14,2  /* Clean and invalidate data cache line by set/way */
+#define ATS1HR          p15,4,c7,c8,0   /* Address Translation Stage 1 Hyp. Read */
+#define ATS1HW          p15,4,c7,c8,1   /* Address Translation Stage 1 Hyp. Write */
+
+/* CP15 CR8: TLB maintenance operations */
+#define TLBIALLIS       p15,0,c8,c3,0   /* Invalidate entire TLB innrer shareable */
+#define TLBIMVAIS       p15,0,c8,c3,1   /* Invalidate unified TLB entry by MVA inner shareable */
+#define TLBIASIDIS      p15,0,c8,c3,2   /* Invalidate unified TLB by ASID match inner shareable */
+#define TLBIMVAAIS      p15,0,c8,c3,3   /* Invalidate unified TLB entry by MVA all ASID inner shareable */
+#define DTLBIALL        p15,0,c8,c6,0   /* Invalidate data TLB */
+#define DTLBIMVA        p15,0,c8,c6,1   /* Invalidate data TLB entry by MVA */
+#define DTLBIASID       p15,0,c8,c6,2   /* Invalidate data TLB by ASID match */
+#define TLBILLHIS       p15,4,c8,c3,0   /* Invalidate Entire Hyp. Unified TLB inner shareable */
+#define TLBIMVAHIS      p15,4,c8,c3,1   /* Invalidate Unified Hyp. TLB by MVA inner shareable */
+#define TLBIALLNSNHIS   p15,4,c8,c7,4   /* Invalidate Entire Non-Secure Non-Hyp. Unified TLB inner shareable */
+#define TLBIALLH        p15,4,c8,c7,0   /* Invalidate Entire Hyp. Unified TLB */
+#define TLBIMVAH        p15,4,c8,c7,1   /* Invalidate Unified Hyp. TLB by MVA */
+#define TLBIALLNSNH     p15,4,c8,c7,4   /* Invalidate Entire Non-Secure Non-Hyp. Unified TLB */
+
+/* CP15 CR9: */
+
+/* CP15 CR10: */
+#define MAIR0           p15,0,c10,c2,0  /* Memory Attribute Indirection Register 0 */
+#define MAIR1           p15,0,c10,c2,1  /* Memory Attribute Indirection Register 1 */
+#define HMAIR0          p15,4,c10,c2,0  /* Hyp. Memory Attribute Indirection Register 0 */
+#define HMAIR1          p15,4,c10,c2,1  /* Hyp. Memory Attribute Indirection Register 1 */
+
+/* CP15 CR11: DMA Operations for TCM Access */
+
+/* CP15 CR12:  */
+#define HVBAR           p15,4,c12,c0,0  /* Hyp. Vector Base Address Register */
+
+/* CP15 CR13:  */
+#define FCSEIDR         p15,0,c13,c0,0  /* FCSE Process ID Register */
+#define CONTEXTIDR      p15,0,c13,c0,1  /* Context ID Register */
+
+/* CP15 CR14:  */
+#define CNTPCT          p15,0,c14       /* Time counter value */
+#define CNTFRQ          p15,0,c14,c0,0  /* Time counter frequency */
+#define CNTKCTL         p15,0,c14,c1,0  /* Time counter kernel control */
+#define CNTP_TVAL       p15,0,c14,c2,0  /* Physical Timer value */
+#define CNTP_CTL        p15,0,c14,c2,1  /* Physical Timer control register */
+#define CNTVCT          p15,1,c14       /* Time counter value + offset */
+#define CNTP_CVAL       p15,2,c14       /* Physical Timer comparator */
+#define CNTVOFF         p15,4,c14       /* Time counter offset */
+#define CNTHCTL         p15,4,c14,c1,0  /* Time counter hyp. control */
+#define CNTHP_TVAL      p15,4,c14,c2,0  /* Hyp. Timer value */
+#define CNTHP_CTL       p15,4,c14,c2,1  /* Hyp. Timer control register */
+#define CNTHP_CVAL      p15,6,c14       /* Hyp. Timer comparator */
+
+/* CP15 CR15: Implementation Defined Registers */
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/current.h b/xen/include/asm-arm/current.h
new file mode 100644
index 0000000..826efa5
--- /dev/null
+++ b/xen/include/asm-arm/current.h
@@ -0,0 +1,60 @@
+#ifndef __ARM_CURRENT_H__
+#define __ARM_CURRENT_H__
+
+#include <xen/config.h>
+#include <xen/percpu.h>
+#include <public/xen.h>
+
+#ifndef __ASSEMBLY__
+
+struct vcpu;
+
+struct cpu_info {
+    struct cpu_user_regs guest_cpu_user_regs;
+    unsigned long elr;
+    unsigned int processor_id;
+    struct vcpu *current_vcpu;
+    unsigned long per_cpu_offset;
+};
+
+static inline struct cpu_info *get_cpu_info(void)
+{
+        register unsigned long sp asm ("sp");
+        return (struct cpu_info *)((sp & ~(STACK_SIZE - 1)) + STACK_SIZE - sizeof(struct cpu_info));
+}
+
+#define get_current()         (get_cpu_info()->current_vcpu)
+#define set_current(vcpu)     (get_cpu_info()->current_vcpu = (vcpu))
+#define current               (get_current())
+
+#define get_processor_id()    (get_cpu_info()->processor_id)
+#define set_processor_id(id)  do {                                      \
+    struct cpu_info *ci__ = get_cpu_info();                             \
+    ci__->per_cpu_offset = __per_cpu_offset[ci__->processor_id = (id)]; \
+} while (0)
+
+#define guest_cpu_user_regs() (&get_cpu_info()->guest_cpu_user_regs)
+
+#define reset_stack_and_jump(__fn)              \
+    __asm__ __volatile__ (                      \
+        "mov sp,%0; b "STR(__fn)      \
+        : : "r" (guest_cpu_user_regs()) : "memory" )
+#endif
+
+
+/*
+ * Which VCPU's state is currently running on each CPU?
+ * This is not necesasrily the same as 'current' as a CPU may be
+ * executing a lazy state switch.
+ */
+DECLARE_PER_CPU(struct vcpu *, curr_vcpu);
+
+#endif /* __ARM_CURRENT_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/debugger.h b/xen/include/asm-arm/debugger.h
new file mode 100644
index 0000000..84b2eec
--- /dev/null
+++ b/xen/include/asm-arm/debugger.h
@@ -0,0 +1,15 @@
+#ifndef __ARM_DEBUGGER_H__
+#define __ARM_DEBUGGER_H__
+
+#define debugger_trap_fatal(v, r) (0)
+#define debugger_trap_immediate() (0)
+
+#endif /* __ARM_DEBUGGER_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/delay.h b/xen/include/asm-arm/delay.h
new file mode 100644
index 0000000..6250774
--- /dev/null
+++ b/xen/include/asm-arm/delay.h
@@ -0,0 +1,15 @@
+#ifndef _ARM_DELAY_H
+#define _ARM_DELAY_H
+
+extern void __udelay(unsigned long usecs);
+#define udelay(n) __udelay(n)
+
+#endif /* defined(_ARM_DELAY_H) */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/desc.h b/xen/include/asm-arm/desc.h
new file mode 100644
index 0000000..3989e8a
--- /dev/null
+++ b/xen/include/asm-arm/desc.h
@@ -0,0 +1,12 @@
+#ifndef __ARCH_DESC_H
+#define __ARCH_DESC_H
+
+#endif /* __ARCH_DESC_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/div64.h b/xen/include/asm-arm/div64.h
new file mode 100644
index 0000000..5f23b65
--- /dev/null
+++ b/xen/include/asm-arm/div64.h
@@ -0,0 +1,241 @@
+/* Taken from Linux arch/arm */
+#ifndef __ASM_ARM_DIV64
+#define __ASM_ARM_DIV64
+
+#include <asm/system.h>
+#include <xen/types.h>
+
+/*
+ * The semantics of do_div() are:
+ *
+ * uint32_t do_div(uint64_t *n, uint32_t base)
+ * {
+ * 	uint32_t remainder = *n % base;
+ * 	*n = *n / base;
+ * 	return remainder;
+ * }
+ *
+ * In other words, a 64-bit dividend with a 32-bit divisor producing
+ * a 64-bit result and a 32-bit remainder.  To accomplish this optimally
+ * we call a special __do_div64 helper with completely non standard
+ * calling convention for arguments and results (beware).
+ */
+
+#ifdef __ARMEB__
+#define __xh "r0"
+#define __xl "r1"
+#else
+#define __xl "r0"
+#define __xh "r1"
+#endif
+
+#define __do_div_asm(n, base)					\
+({								\
+	register unsigned int __base      asm("r4") = base;	\
+	register unsigned long long __n   asm("r0") = n;	\
+	register unsigned long long __res asm("r2");		\
+	register unsigned int __rem       asm(__xh);		\
+	asm(	__asmeq("%0", __xh)				\
+		__asmeq("%1", "r2")				\
+		__asmeq("%2", "r0")				\
+		__asmeq("%3", "r4")				\
+		"bl	__do_div64"				\
+		: "=r" (__rem), "=r" (__res)			\
+		: "r" (__n), "r" (__base)			\
+		: "ip", "lr", "cc");				\
+	n = __res;						\
+	__rem;							\
+})
+
+#if __GNUC__ < 4
+
+/*
+ * gcc versions earlier than 4.0 are simply too problematic for the
+ * optimized implementation below. First there is gcc PR 15089 that
+ * tend to trig on more complex constructs, spurious .global __udivsi3
+ * are inserted even if none of those symbols are referenced in the
+ * generated code, and those gcc versions are not able to do constant
+ * propagation on long long values anyway.
+ */
+#define do_div(n, base) __do_div_asm(n, base)
+
+#elif __GNUC__ >= 4
+
+#include <asm/bug.h>
+
+/*
+ * If the divisor happens to be constant, we determine the appropriate
+ * inverse at compile time to turn the division into a few inline
+ * multiplications instead which is much faster. And yet only if compiling
+ * for ARMv4 or higher (we need umull/umlal) and if the gcc version is
+ * sufficiently recent to perform proper long long constant propagation.
+ * (It is unfortunate that gcc doesn't perform all this internally.)
+ */
+#define do_div(n, base)							\
+({									\
+	unsigned int __r, __b = (base);					\
+	if (!__builtin_constant_p(__b) || __b == 0) {			\
+		/* non-constant divisor (or zero): slow path */		\
+		__r = __do_div_asm(n, __b);				\
+	} else if ((__b & (__b - 1)) == 0) {				\
+		/* Trivial: __b is constant and a power of 2 */		\
+		/* gcc does the right thing with this code.  */		\
+		__r = n;						\
+		__r &= (__b - 1);					\
+		n /= __b;						\
+	} else {							\
+		/* Multiply by inverse of __b: n/b = n*(p/b)/p       */	\
+		/* We rely on the fact that most of this code gets   */	\
+		/* optimized away at compile time due to constant    */	\
+		/* propagation and only a couple inline assembly     */	\
+		/* instructions should remain. Better avoid any      */	\
+		/* code construct that might prevent that.           */	\
+		unsigned long long __res, __x, __t, __m, __n = n;	\
+		unsigned int __c, __p, __z = 0;				\
+		/* preserve low part of n for reminder computation */	\
+		__r = __n;						\
+		/* determine number of bits to represent __b */		\
+		__p = 1 << __div64_fls(__b);				\
+		/* compute __m = ((__p << 64) + __b - 1) / __b */	\
+		__m = (~0ULL / __b) * __p;				\
+		__m += (((~0ULL % __b + 1) * __p) + __b - 1) / __b;	\
+		/* compute __res = __m*(~0ULL/__b*__b-1)/(__p << 64) */	\
+		__x = ~0ULL / __b * __b - 1;				\
+		__res = (__m & 0xffffffff) * (__x & 0xffffffff);	\
+		__res >>= 32;						\
+		__res += (__m & 0xffffffff) * (__x >> 32);		\
+		__t = __res;						\
+		__res += (__x & 0xffffffff) * (__m >> 32);		\
+		__t = (__res < __t) ? (1ULL << 32) : 0;			\
+		__res = (__res >> 32) + __t;				\
+		__res += (__m >> 32) * (__x >> 32);			\
+		__res /= __p;						\
+		/* Now sanitize and optimize what we've got. */		\
+		if (~0ULL % (__b / (__b & -__b)) == 0) {		\
+			/* those cases can be simplified with: */	\
+			__n /= (__b & -__b);				\
+			__m = ~0ULL / (__b / (__b & -__b));		\
+			__p = 1;					\
+			__c = 1;					\
+		} else if (__res != __x / __b) {			\
+			/* We can't get away without a correction    */	\
+			/* to compensate for bit truncation errors.  */	\
+			/* To avoid it we'd need an additional bit   */	\
+			/* to represent __m which would overflow it. */	\
+			/* Instead we do m=p/b and n/b=(n*m+m)/p.    */	\
+			__c = 1;					\
+			/* Compute __m = (__p << 64) / __b */		\
+			__m = (~0ULL / __b) * __p;			\
+			__m += ((~0ULL % __b + 1) * __p) / __b;		\
+		} else {						\
+			/* Reduce __m/__p, and try to clear bit 31   */	\
+			/* of __m when possible otherwise that'll    */	\
+			/* need extra overflow handling later.       */	\
+			unsigned int __bits = -(__m & -__m);		\
+			__bits |= __m >> 32;				\
+			__bits = (~__bits) << 1;			\
+			/* If __bits == 0 then setting bit 31 is     */	\
+			/* unavoidable.  Simply apply the maximum    */	\
+			/* possible reduction in that case.          */	\
+			/* Otherwise the MSB of __bits indicates the */	\
+			/* best reduction we should apply.           */	\
+			if (!__bits) {					\
+				__p /= (__m & -__m);			\
+				__m /= (__m & -__m);			\
+			} else {					\
+				__p >>= __div64_fls(__bits);		\
+				__m >>= __div64_fls(__bits);		\
+			}						\
+			/* No correction needed. */			\
+			__c = 0;					\
+		}							\
+		/* Now we have a combination of 2 conditions:        */	\
+		/* 1) whether or not we need a correction (__c), and */	\
+		/* 2) whether or not there might be an overflow in   */	\
+		/*    the cross product (__m & ((1<<63) | (1<<31)))  */	\
+		/* Select the best insn combination to perform the   */	\
+		/* actual __m * __n / (__p << 64) operation.         */	\
+		if (!__c) {						\
+			asm (	"umull	%Q0, %R0, %1, %Q2\n\t"		\
+				"mov	%Q0, #0"			\
+				: "=&r" (__res)				\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		} else if (!(__m & ((1ULL << 63) | (1ULL << 31)))) {	\
+			__res = __m;					\
+			asm (	"umlal	%Q0, %R0, %Q1, %Q2\n\t"		\
+				"mov	%Q0, #0"			\
+				: "+&r" (__res)				\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		} else {						\
+			asm (	"umull	%Q0, %R0, %Q1, %Q2\n\t"		\
+				"cmn	%Q0, %Q1\n\t"			\
+				"adcs	%R0, %R0, %R1\n\t"		\
+				"adc	%Q0, %3, #0"			\
+				: "=&r" (__res)				\
+				: "r" (__m), "r" (__n), "r" (__z)	\
+				: "cc" );				\
+		}							\
+		if (!(__m & ((1ULL << 63) | (1ULL << 31)))) {		\
+			asm (	"umlal	%R0, %Q0, %R1, %Q2\n\t"		\
+				"umlal	%R0, %Q0, %Q1, %R2\n\t"		\
+				"mov	%R0, #0\n\t"			\
+				"umlal	%Q0, %R0, %R1, %R2"		\
+				: "+&r" (__res)				\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		} else {						\
+			asm (	"umlal	%R0, %Q0, %R2, %Q3\n\t"		\
+				"umlal	%R0, %1, %Q2, %R3\n\t"		\
+				"mov	%R0, #0\n\t"			\
+				"adds	%Q0, %1, %Q0\n\t"		\
+				"adc	%R0, %R0, #0\n\t"		\
+				"umlal	%Q0, %R0, %R2, %R3"		\
+				: "+&r" (__res), "+&r" (__z)		\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		}							\
+		__res /= __p;						\
+		/* The reminder can be computed with 32-bit regs     */	\
+		/* only, and gcc is good at that.                    */	\
+		{							\
+			unsigned int __res0 = __res;			\
+			unsigned int __b0 = __b;			\
+			__r -= __res0 * __b0;				\
+		}							\
+		/* BUG_ON(__r >= __b || __res * __b + __r != n); */	\
+		n = __res;						\
+	}								\
+	__r;								\
+})
+
+/* our own fls implementation to make sure constant propagation is fine */
+#define __div64_fls(bits)						\
+({									\
+	unsigned int __left = (bits), __nr = 0;				\
+	if (__left & 0xffff0000) __nr += 16, __left >>= 16;		\
+	if (__left & 0x0000ff00) __nr +=  8, __left >>=  8;		\
+	if (__left & 0x000000f0) __nr +=  4, __left >>=  4;		\
+	if (__left & 0x0000000c) __nr +=  2, __left >>=  2;		\
+	if (__left & 0x00000002) __nr +=  1;				\
+	__nr;								\
+})
+
+#endif
+
+static inline uint64_t div64(uint64_t n, uint32_t base)
+{
+	do_div(n, base);
+	return n;
+}
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/elf.h b/xen/include/asm-arm/elf.h
new file mode 100644
index 0000000..12d487c
--- /dev/null
+++ b/xen/include/asm-arm/elf.h
@@ -0,0 +1,33 @@
+#ifndef __ARM_ELF_H__
+#define __ARM_ELF_H__
+
+typedef struct {
+    unsigned long r0;
+    unsigned long r1;
+    unsigned long r2;
+    unsigned long r3;
+    unsigned long r4;
+    unsigned long r5;
+    unsigned long r6;
+    unsigned long r7;
+    unsigned long r8;
+    unsigned long r9;
+    unsigned long r10;
+    unsigned long r11;
+    unsigned long r12;
+    unsigned long sp;
+    unsigned long lr;
+    unsigned long pc;
+} ELF_Gregset;
+
+#endif /* __ARM_ELF_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/event.h b/xen/include/asm-arm/event.h
new file mode 100644
index 0000000..6b2fb7c
--- /dev/null
+++ b/xen/include/asm-arm/event.h
@@ -0,0 +1,41 @@
+#ifndef __ASM_EVENT_H__
+#define __ASM_EVENT_H__
+
+void vcpu_kick(struct vcpu *v);
+void vcpu_mark_events_pending(struct vcpu *v);
+
+static inline int local_events_need_delivery(void)
+{
+    /* TODO
+     * return (vcpu_info(v, evtchn_upcall_pending) &&
+                        !vcpu_info(v, evtchn_upcall_mask)); */
+        return 0;
+}
+
+int local_event_delivery_is_enabled(void);
+
+static inline void local_event_delivery_disable(void)
+{
+    /* TODO current->vcpu_info->evtchn_upcall_mask = 1; */
+}
+
+static inline void local_event_delivery_enable(void)
+{
+    /* TODO current->vcpu_info->evtchn_upcall_mask = 0; */
+}
+
+/* No arch specific virq definition now. Default to global. */
+static inline int arch_virq_is_global(int virq)
+{
+    return 1;
+}
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/flushtlb.h b/xen/include/asm-arm/flushtlb.h
new file mode 100644
index 0000000..c8486fc
--- /dev/null
+++ b/xen/include/asm-arm/flushtlb.h
@@ -0,0 +1,31 @@
+#ifndef __FLUSHTLB_H__
+#define __FLUSHTLB_H__
+
+#include <xen/cpumask.h>
+
+/*
+ * Filter the given set of CPUs, removing those that definitely flushed their
+ * TLB since @page_timestamp.
+ */
+/* XXX lazy implementation just doesn't clear anything.... */
+#define tlbflush_filter(mask, page_timestamp)                           \
+do {                                                                    \
+} while ( 0 )
+
+#define tlbflush_current_time()                 (0)
+
+/* Flush local TLBs */
+void flush_tlb_local(void);
+
+/* Flush specified CPUs' TLBs */
+void flush_tlb_mask(const cpumask_t *mask);
+
+#endif /* __FLUSHTLB_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h
new file mode 100644
index 0000000..8f6ffd8
--- /dev/null
+++ b/xen/include/asm-arm/grant_table.h
@@ -0,0 +1,35 @@
+#ifndef __ASM_GRANT_TABLE_H__
+#define __ASM_GRANT_TABLE_H__
+
+#include <xen/grant_table.h>
+
+#define INVALID_GFN (-1UL)
+#define INITIAL_NR_GRANT_FRAMES 1
+
+void gnttab_clear_flag(unsigned long nr, uint16_t *addr);
+int create_grant_host_mapping(unsigned long gpaddr,
+		unsigned long mfn, unsigned int flags, unsigned int
+		cache_flags);
+#define gnttab_host_mapping_get_page_type(op, d, rd) (0)
+int replace_grant_host_mapping(unsigned long gpaddr, unsigned long mfn,
+		unsigned long new_gpaddr, unsigned int flags);
+void gnttab_mark_dirty(struct domain *d, unsigned long l);
+#define gnttab_create_status_page(d, t, i) (0)
+#define gnttab_create_shared_page(d, t, i) (0)
+#define gnttab_shared_gmfn(d, t, i) (0)
+#define gnttab_status_gmfn(d, t, i) (0)
+#define gnttab_release_host_mappings(domain) 1
+static inline int replace_grant_supported(void)
+{
+    return 1;
+}
+
+#endif /* __ASM_GRANT_TABLE_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/hardirq.h b/xen/include/asm-arm/hardirq.h
new file mode 100644
index 0000000..9c031a8
--- /dev/null
+++ b/xen/include/asm-arm/hardirq.h
@@ -0,0 +1,28 @@
+#ifndef __ASM_HARDIRQ_H
+#define __ASM_HARDIRQ_H
+
+#include <xen/config.h>
+#include <xen/cache.h>
+#include <xen/smp.h>
+
+typedef struct {
+        unsigned long __softirq_pending;
+        unsigned int __local_irq_count;
+} __cacheline_aligned irq_cpustat_t;
+
+#include <xen/irq_cpustat.h>    /* Standard mappings for irq_cpustat_t above */
+
+#define in_irq() (local_irq_count(smp_processor_id()) != 0)
+
+#define irq_enter()     (local_irq_count(smp_processor_id())++)
+#define irq_exit()      (local_irq_count(smp_processor_id())--)
+
+#endif /* __ASM_HARDIRQ_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/hypercall.h b/xen/include/asm-arm/hypercall.h
new file mode 100644
index 0000000..90a87ef
--- /dev/null
+++ b/xen/include/asm-arm/hypercall.h
@@ -0,0 +1,24 @@
+#ifndef __ASM_ARM_HYPERCALL_H__
+#define __ASM_ARM_HYPERCALL_H__
+
+#include <public/domctl.h> /* for arch_do_domctl */
+
+struct vcpu;
+extern long
+arch_do_vcpu_op(
+    int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg);
+
+extern long
+arch_do_sysctl(
+    struct xen_sysctl *op,
+    XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl);
+
+#endif /* __ASM_ARM_HYPERCALL_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/init.h b/xen/include/asm-arm/init.h
new file mode 100644
index 0000000..5f44929
--- /dev/null
+++ b/xen/include/asm-arm/init.h
@@ -0,0 +1,12 @@
+#ifndef _XEN_ASM_INIT_H
+#define _XEN_ASM_INIT_H
+
+#endif /* _XEN_ASM_INIT_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/io.h b/xen/include/asm-arm/io.h
new file mode 100644
index 0000000..1babbab
--- /dev/null
+++ b/xen/include/asm-arm/io.h
@@ -0,0 +1,12 @@
+#ifndef _ASM_IO_H
+#define _ASM_IO_H
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/iocap.h b/xen/include/asm-arm/iocap.h
new file mode 100644
index 0000000..f647f30
--- /dev/null
+++ b/xen/include/asm-arm/iocap.h
@@ -0,0 +1,20 @@
+#ifndef __X86_IOCAP_H__
+#define __X86_IOCAP_H__
+
+#define cache_flush_permitted(d)                        \
+    (!rangeset_is_empty((d)->iomem_caps))
+
+#define multipage_allocation_permitted(d, order)        \
+    (((order) <= 9) || /* allow 2MB superpages */       \
+     !rangeset_is_empty((d)->iomem_caps))
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/multicall.h b/xen/include/asm-arm/multicall.h
new file mode 100644
index 0000000..c800940
--- /dev/null
+++ b/xen/include/asm-arm/multicall.h
@@ -0,0 +1,23 @@
+#ifndef __ASM_ARM_MULTICALL_H__
+#define __ASM_ARM_MULTICALL_H__
+
+#define do_multicall_call(_call)                             \
+    do {                                                     \
+        __asm__ __volatile__ (                               \
+            ".word 0xe7f000f0@; do_multicall_call\n"         \
+            "    mov r0,#0; @ do_multicall_call\n"           \
+            "    str r0, [r0];\n"                            \
+            :                                                \
+            :                                                \
+            : );                                             \
+    } while ( 0 )
+
+#endif /* __ASM_ARM_MULTICALL_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/nmi.h b/xen/include/asm-arm/nmi.h
new file mode 100644
index 0000000..e0f19f9
--- /dev/null
+++ b/xen/include/asm-arm/nmi.h
@@ -0,0 +1,15 @@
+#ifndef ASM_NMI_H
+#define ASM_NMI_H
+
+#define register_guest_nmi_callback(a)  (-ENOSYS)
+#define unregister_guest_nmi_callback() (-ENOSYS)
+
+#endif /* ASM_NMI_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/numa.h b/xen/include/asm-arm/numa.h
new file mode 100644
index 0000000..cffee5c
--- /dev/null
+++ b/xen/include/asm-arm/numa.h
@@ -0,0 +1,21 @@
+#ifndef __ARCH_ARM_NUMA_H
+#define __ARCH_ARM_NUMA_H
+
+/* Fake one node for now... */
+#define cpu_to_node(cpu) 0
+#define node_to_cpumask(node)	(cpu_online_map)
+
+static inline __attribute__((pure)) int phys_to_nid(paddr_t addr)
+{
+        return 0;
+}
+
+#endif /* __ARCH_ARM_NUMA_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/paging.h b/xen/include/asm-arm/paging.h
new file mode 100644
index 0000000..4dc340f
--- /dev/null
+++ b/xen/include/asm-arm/paging.h
@@ -0,0 +1,13 @@
+#ifndef _XEN_PAGING_H
+#define _XEN_PAGING_H
+
+#endif /* XEN_PAGING_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/percpu.h b/xen/include/asm-arm/percpu.h
new file mode 100644
index 0000000..9d369eb
--- /dev/null
+++ b/xen/include/asm-arm/percpu.h
@@ -0,0 +1,28 @@
+#ifndef __ARM_PERCPU_H__
+#define __ARM_PERCPU_H__
+
+#ifndef __ASSEMBLY__
+extern char __per_cpu_start[], __per_cpu_data_end[];
+extern unsigned long __per_cpu_offset[NR_CPUS];
+void percpu_init_areas(void);
+#endif
+
+/* Separate out the type, so (int[3], foo) works. */
+#define __DEFINE_PER_CPU(type, name, suffix)                    \
+    __attribute__((__section__(".bss.percpu" #suffix)))         \
+    __typeof__(type) per_cpu_##name
+
+#define per_cpu(var, cpu) ((&per_cpu__##var)[cpu?0:0])
+#define __get_cpu_var(var) per_cpu__##var
+
+#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
+
+#endif /* __ARM_PERCPU_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h
new file mode 100644
index 0000000..1f85d31
--- /dev/null
+++ b/xen/include/asm-arm/processor.h
@@ -0,0 +1,269 @@
+#ifndef __ASM_ARM_PROCESSOR_H
+#define __ASM_ARM_PROCESSOR_H
+
+#include <asm/cpregs.h>
+
+/* PSR bits (CPSR, SPSR)*/
+
+/* 0-4: Mode */
+#define PSR_MODE_MASK 0x1f
+#define PSR_MODE_USR 0x10
+#define PSR_MODE_FIQ 0x11
+#define PSR_MODE_IRQ 0x12
+#define PSR_MODE_SVC 0x13
+#define PSR_MODE_MON 0x16
+#define PSR_MODE_ABT 0x17
+#define PSR_MODE_HYP 0x1a
+#define PSR_MODE_UND 0x1b
+#define PSR_MODE_SYS 0x1f
+
+#define PSR_THUMB        (1<<5)        /* Thumb Mode enable */
+#define PSR_FIQ_MASK        (1<<6)        /* Fast Interrupt mask */
+#define PSR_IRQ_MASK        (1<<7)        /* Interrupt mask */
+#define PSR_ABT_MASK         (1<<8)        /* Asynchronous Abort mask */
+#define PSR_BIG_ENDIAN        (1<<9)        /* Big Endian Mode */
+#define PSR_JAZELLE        (1<<24)        /* Jazelle Mode */
+
+/* TTBCR Translation Table Base Control Register */
+#define TTBCR_N_MASK 0x07
+#define TTBCR_N_16KB 0x00
+#define TTBCR_N_8KB  0x01
+#define TTBCR_N_4KB  0x02
+#define TTBCR_N_2KB  0x03
+#define TTBCR_N_1KB  0x04
+
+/* SCTLR System Control Register. */
+/* HSCTLR is a subset of this. */
+#define SCTLR_TE        (1<<30)
+#define SCTLR_AFE        (1<<29)
+#define SCTLR_TRE        (1<<28)
+#define SCTLR_NMFI        (1<<27)
+#define SCTLR_EE        (1<<25)
+#define SCTLR_VE        (1<<24)
+#define SCTLR_U                (1<<22)
+#define SCTLR_FI        (1<<21)
+#define SCTLR_WXN        (1<<19)
+#define SCTLR_HA        (1<<17)
+#define SCTLR_RR        (1<<14)
+#define SCTLR_V                (1<<13)
+#define SCTLR_I                (1<<12)
+#define SCTLR_Z                (1<<11)
+#define SCTLR_SW        (1<<10)
+#define SCTLR_B                (1<<7)
+#define SCTLR_C                (1<<2)
+#define SCTLR_A                (1<<1)
+#define SCTLR_M                (1<<0)
+
+#define SCTLR_BASE        0x00c50078
+#define HSCTLR_BASE        0x30c51878
+
+/* HCR Hyp Configuration Register */
+#define HCR_TGE                (1<<27)
+#define HCR_TVM                (1<<26)
+#define HCR_TTLB        (1<<25)
+#define HCR_TPU                (1<<24)
+#define HCR_TPC                (1<<23)
+#define HCR_TSW                (1<<22)
+#define HCR_TAC                (1<<21)
+#define HCR_TIDCP        (1<<20)
+#define HCR_TSC                (1<<19)
+#define HCR_TID3        (1<<18)
+#define HCR_TID2        (1<<17)
+#define HCR_TID1        (1<<16)
+#define HCR_TID0        (1<<15)
+#define HCR_TWE                (1<<14)
+#define HCR_TWI                (1<<13)
+#define HCR_DC                (1<<12)
+#define HCR_BSU_MASK        (3<<10)
+#define HCR_FB                (1<<9)
+#define HCR_VA                (1<<8)
+#define HCR_VI                (1<<7)
+#define HCR_VF                (1<<6)
+#define HCR_AMO                (1<<5)
+#define HCR_IMO                (1<<4)
+#define HCR_FMO                (1<<3)
+#define HCR_PTW                (1<<2)
+#define HCR_SWIO        (1<<1)
+#define HCR_VM                (1<<0)
+
+#define HSR_EC_WFI_WFE              0x01
+#define HSR_EC_CP15_32              0x03
+#define HSR_EC_CP15_64              0x04
+#define HSR_EC_CP14_32              0x05
+#define HSR_EC_CP14_DBG             0x06
+#define HSR_EC_CP                   0x07
+#define HSR_EC_CP10                 0x08
+#define HSR_EC_JAZELLE              0x09
+#define HSR_EC_BXJ                  0x0a
+#define HSR_EC_CP14_64              0x0c
+#define HSR_EC_SVC                  0x11
+#define HSR_EC_HVC                  0x12
+#define HSR_EC_INSTR_ABORT_GUEST    0x20
+#define HSR_EC_INSTR_ABORT_HYP      0x21
+#define HSR_EC_DATA_ABORT_GUEST     0x24
+#define HSR_EC_DATA_ABORT_HYP       0x25
+
+#ifndef __ASSEMBLY__
+union hsr {
+    uint32_t bits;
+    struct {
+        unsigned long iss:25;  /* Instruction Specific Syndrome */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    };
+
+    struct hsr_cp32 {
+        unsigned long read:1;  /* Direction */
+        unsigned long crm:4;   /* CRm */
+        unsigned long reg:4;   /* Rt */
+        unsigned long sbzp:1;
+        unsigned long crn:4;   /* CRn */
+        unsigned long op1:3;   /* Op1 */
+        unsigned long op2:3;   /* Op2 */
+        unsigned long cc:4;    /* Condition Code */
+        unsigned long ccvalid:1;/* CC Valid */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    } cp32; /* HSR_EC_CP15_32, CP14_32, CP10 */
+
+    struct hsr_cp64 {
+        unsigned long read:1;   /* Direction */
+        unsigned long crm:4;    /* CRm */
+        unsigned long reg1:4;   /* Rt1 */
+        unsigned long sbzp1:1;
+        unsigned long reg2:4;   /* Rt2 */
+        unsigned long sbzp2:2;
+        unsigned long op1:4;   /* Op1 */
+        unsigned long cc:4;    /* Condition Code */
+        unsigned long ccvalid:1;/* CC Valid */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    } cp64; /* HSR_EC_CP15_64, HSR_EC_CP14_64 */
+
+    struct hsr_dabt {
+        unsigned long dfsc:6;  /* Data Fault Status Code */
+        unsigned long write:1; /* Write / not Read */
+        unsigned long s1ptw:1; /* */
+        unsigned long cache:1; /* Cache Maintenance */
+        unsigned long eat:1;   /* External Abort Type */
+        unsigned long sbzp0:6;
+        unsigned long reg:4;   /* Register */
+        unsigned long sbzp1:1;
+        unsigned long sign:1;  /* Sign extend */
+        unsigned long size:2;  /* Access Size */
+        unsigned long valid:1; /* Syndrome Valid */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    } dabt; /* HSR_EC_DATA_ABORT_* */
+};
+#endif
+
+/* HSR.EC == HSR_CP{15,14,10}_32 */
+#define HSR_CP32_OP2_MASK (0x000e0000)
+#define HSR_CP32_OP2_SHIFT (17)
+#define HSR_CP32_OP1_MASK (0x0001c000)
+#define HSR_CP32_OP1_SHIFT (14)
+#define HSR_CP32_CRN_MASK (0x00003c00)
+#define HSR_CP32_CRN_SHIFT (10)
+#define HSR_CP32_CRM_MASK (0x0000001e)
+#define HSR_CP32_CRM_SHIFT (1)
+#define HSR_CP32_REGS_MASK (HSR_CP32_OP1_MASK|HSR_CP32_OP2_MASK|\
+                            HSR_CP32_CRN_MASK|HSR_CP32_CRM_MASK)
+
+/* HSR.EC == HSR_CP{15,14}_64 */
+#define HSR_CP64_OP1_MASK (0x000f0000)
+#define HSR_CP64_OP1_SHIFT (16)
+#define HSR_CP64_CRM_MASK (0x0000001e)
+#define HSR_CP64_CRM_SHIFT (1)
+#define HSR_CP64_REGS_MASK (HSR_CP64_OP1_MASK|HSR_CP64_CRM_MASK)
+
+/* Physical Address Register */
+#define PAR_F           (1<<0)
+
+/* .... If F == 1 */
+#define PAR_FSC_SHIFT   (1)
+#define PAR_FSC_MASK    (0x3f<<PAR_FSC_SHIFT)
+#define PAR_STAGE21     (1<<8)     /* Stage 2 Fault During Stage 1 Walk */
+#define PAR_STAGE2      (1<<9)     /* Stage 2 Fault */
+
+/* If F == 0 */
+#define PAR_MAIR_SHIFT  56                       /* Memory Attributes */
+#define PAR_MAIR_MASK   (0xffLL<<PAR_MAIR_SHIFT)
+#define PAR_NS          (1<<9)                   /* Non-Secure */
+#define PAR_SH_SHIFT    7                        /* Shareability */
+#define PAR_SH_MASK     (3<<PAR_SH_SHIFT)
+
+/* Fault Status Register */
+/*
+ * 543210 BIT
+ * 00XXLL -- XX Fault Level LL
+ * ..01LL -- Translation Fault LL
+ * ..10LL -- Access Fault LL
+ * ..11LL -- Permission Fault LL
+ * 01xxxx -- Abort/Parity
+ * 10xxxx -- Other
+ * 11xxxx -- Implementation Defined
+ */
+#define FSC_TYPE_MASK (0x3<<4)
+#define FSC_TYPE_FAULT (0x00<<4)
+#define FSC_TYPE_ABT   (0x01<<4)
+#define FSC_TYPE_OTH   (0x02<<4)
+#define FSC_TYPE_IMPL  (0x03<<4)
+
+#define FSC_FLT_TRANS  (0x04)
+#define FSC_FLT_ACCESS (0x08)
+#define FSC_FLT_PERM   (0x0c)
+#define FSC_SEA        (0x10) /* Synchronous External Abort */
+#define FSC_SPE        (0x18) /* Memory Access Synchronous Parity Error */
+#define FSC_APE        (0x11) /* Memory Access Asynchronous Parity Error */
+#define FSC_SEATT      (0x14) /* Sync. Ext. Abort Translation Table */
+#define FSC_SPETT      (0x1c) /* Sync. Parity. Error Translation Table */
+#define FSC_AF         (0x21) /* Alignment Fault */
+#define FSC_DE         (0x22) /* Debug Event */
+#define FSC_LKD        (0x34) /* Lockdown Abort */
+#define FSC_CPR        (0x3a) /* Coprocossor Abort */
+
+#define FSC_LL_MASK    (0x03<<0)
+
+/* Time counter hypervisor control register */
+#define CNTHCTL_PA      (1u<<0)  /* Kernel/user access to physical counter */
+#define CNTHCTL_TA      (1u<<1)  /* Kernel/user access to CNTP timer */
+
+/* Timer control registers */
+#define CNTx_CTL_ENABLE   (1u<<0)  /* Enable timer */
+#define CNTx_CTL_MASK     (1u<<1)  /* Mask IRQ */
+#define CNTx_CTL_PENDING  (1u<<2)  /* IRQ pending */
+
+/* CPUID bits */
+#define ID_PFR1_GT_MASK  0x000F0000  /* Generic Timer interface support */
+#define ID_PFR1_GT_v1    0x00010000
+
+#define MSR(reg,val)        asm volatile ("msr "#reg", %0\n" : : "r" (val))
+#define MRS(val,reg)        asm volatile ("mrs %0,"#reg"\n" : "=r" (v))
+
+#ifndef __ASSEMBLY__
+extern uint32_t hyp_traps_vector[8];
+
+void panic_PAR(uint64_t par, const char *when);
+
+void show_execution_state(struct cpu_user_regs *regs);
+void show_registers(struct cpu_user_regs *regs);
+//#define dump_execution_state() run_in_exception_handler(show_execution_state)
+#define dump_execution_state() asm volatile (".word 0xe7f000f0\n"); /* XXX */
+
+#define cpu_relax() barrier() /* Could yield? */
+
+/* All a bit UP for the moment */
+#define cpu_to_core(_cpu)   (0)
+#define cpu_to_socket(_cpu) (0)
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ASM_ARM_PROCESSOR_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/regs.h b/xen/include/asm-arm/regs.h
new file mode 100644
index 0000000..ee095bf
--- /dev/null
+++ b/xen/include/asm-arm/regs.h
@@ -0,0 +1,43 @@
+#ifndef __ARM_REGS_H__
+#define __ARM_REGS_H__
+
+#include <xen/types.h>
+#include <public/xen.h>
+#include <asm/processor.h>
+
+#define psr_mode(psr,m) (((psr) & PSR_MODE_MASK) == m)
+
+#define usr_mode(r)     psr_mode((r)->cpsr,PSR_MODE_USR)
+#define fiq_mode(r)     psr_mode((r)->cpsr,PSR_MODE_FIQ)
+#define irq_mode(r)     psr_mode((r)->cpsr,PSR_MODE_IRQ)
+#define svc_mode(r)     psr_mode((r)->cpsr,PSR_MODE_SVC)
+#define mon_mode(r)     psr_mode((r)->cpsr,PSR_MODE_MON)
+#define abt_mode(r)     psr_mode((r)->cpsr,PSR_MODE_ABT)
+#define hyp_mode(r)     psr_mode((r)->cpsr,PSR_MODE_HYP)
+#define und_mode(r)     psr_mode((r)->cpsr,PSR_MODE_UND)
+#define sys_mode(r)     psr_mode((r)->cpsr,PSR_MODE_SYS)
+
+#define guest_mode(r)                                                         \
+({                                                                            \
+    unsigned long diff = (char *)guest_cpu_user_regs() - (char *)(r);         \
+    /* Frame pointer must point into current CPU stack. */                    \
+    ASSERT(diff < STACK_SIZE);                                                \
+    /* If not a guest frame, it must be a hypervisor frame. */                \
+    ASSERT((diff == 0) || hyp_mode(r));                                       \
+    /* Return TRUE if it's a guest frame. */                                  \
+    (diff == 0);                                                              \
+})
+
+#define return_reg(v) ((v)->arch.user_regs.r0)
+
+#define CTXT_SWITCH_STACK_BYTES (sizeof(struct cpu_user_regs))
+
+#endif /* __ARM_REGS_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
new file mode 100644
index 0000000..c27d438
--- /dev/null
+++ b/xen/include/asm-arm/setup.h
@@ -0,0 +1,16 @@
+#ifndef __ARM_SETUP_H_
+#define __ARM_SETUP_H_
+
+#include <public/version.h>
+
+void arch_get_xen_caps(xen_capabilities_info_t *info);
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/smp.h b/xen/include/asm-arm/smp.h
new file mode 100644
index 0000000..9cdd87f
--- /dev/null
+++ b/xen/include/asm-arm/smp.h
@@ -0,0 +1,25 @@
+#ifndef __ASM_SMP_H
+#define __ASM_SMP_H
+
+#ifndef __ASSEMBLY__
+#include <xen/config.h>
+#include <xen/cpumask.h>
+#include <asm/current.h>
+#endif
+
+DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_mask);
+DECLARE_PER_CPU(cpumask_var_t, cpu_core_mask);
+
+#define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
+
+#define raw_smp_processor_id() (get_processor_id())
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/softirq.h b/xen/include/asm-arm/softirq.h
new file mode 100644
index 0000000..536af38
--- /dev/null
+++ b/xen/include/asm-arm/softirq.h
@@ -0,0 +1,15 @@
+#ifndef __ASM_SOFTIRQ_H__
+#define __ASM_SOFTIRQ_H__
+
+#define VGIC_SOFTIRQ        (NR_COMMON_SOFTIRQS + 0)
+#define NR_ARCH_SOFTIRQS       1
+
+#endif /* __ASM_SOFTIRQ_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/spinlock.h b/xen/include/asm-arm/spinlock.h
new file mode 100644
index 0000000..b1825c9
--- /dev/null
+++ b/xen/include/asm-arm/spinlock.h
@@ -0,0 +1,144 @@
+#ifndef __ASM_SPINLOCK_H
+#define __ASM_SPINLOCK_H
+
+#include <xen/config.h>
+#include <xen/lib.h>
+
+static inline void dsb_sev(void)
+{
+    __asm__ __volatile__ (
+        "dsb\n"
+        "sev\n"
+        );
+}
+
+typedef struct {
+    volatile unsigned int lock;
+} raw_spinlock_t;
+
+#define _RAW_SPIN_LOCK_UNLOCKED { 0 }
+
+#define _raw_spin_is_locked(x)          ((x)->lock != 0)
+
+static always_inline void _raw_spin_unlock(raw_spinlock_t *lock)
+{
+    ASSERT(_raw_spin_is_locked(lock));
+
+    smp_mb();
+
+    __asm__ __volatile__(
+"   str     %1, [%0]\n"
+    :
+    : "r" (&lock->lock), "r" (0)
+    : "cc");
+
+    dsb_sev();
+}
+
+static always_inline int _raw_spin_trylock(raw_spinlock_t *lock)
+{
+    unsigned long tmp;
+
+    __asm__ __volatile__(
+"   ldrex   %0, [%1]\n"
+"   teq     %0, #0\n"
+"   strexeq %0, %2, [%1]"
+    : "=&r" (tmp)
+    : "r" (&lock->lock), "r" (1)
+    : "cc");
+
+    if (tmp == 0) {
+        smp_mb();
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+typedef struct {
+    volatile unsigned int lock;
+} raw_rwlock_t;
+
+#define _RAW_RW_LOCK_UNLOCKED { 0 }
+
+static always_inline int _raw_read_trylock(raw_rwlock_t *rw)
+{
+    unsigned long tmp, tmp2 = 1;
+
+    __asm__ __volatile__(
+"1: ldrex   %0, [%2]\n"
+"   adds    %0, %0, #1\n"
+"   strexpl %1, %0, [%2]\n"
+    : "=&r" (tmp), "+r" (tmp2)
+    : "r" (&rw->lock)
+    : "cc");
+
+    smp_mb();
+    return tmp2 == 0;
+}
+
+static always_inline int _raw_write_trylock(raw_rwlock_t *rw)
+{
+    unsigned long tmp;
+
+    __asm__ __volatile__(
+"1: ldrex   %0, [%1]\n"
+"   teq     %0, #0\n"
+"   strexeq %0, %2, [%1]"
+    : "=&r" (tmp)
+    : "r" (&rw->lock), "r" (0x80000000)
+    : "cc");
+
+    if (tmp == 0) {
+        smp_mb();
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+static inline void _raw_read_unlock(raw_rwlock_t *rw)
+{
+    unsigned long tmp, tmp2;
+
+    smp_mb();
+
+    __asm__ __volatile__(
+"1: ldrex   %0, [%2]\n"
+"   sub     %0, %0, #1\n"
+"   strex   %1, %0, [%2]\n"
+"   teq     %1, #0\n"
+"   bne     1b"
+    : "=&r" (tmp), "=&r" (tmp2)
+    : "r" (&rw->lock)
+    : "cc");
+
+    if (tmp == 0)
+        dsb_sev();
+}
+
+static inline void _raw_write_unlock(raw_rwlock_t *rw)
+{
+    smp_mb();
+
+    __asm__ __volatile__(
+    "str    %1, [%0]\n"
+    :
+    : "r" (&rw->lock), "r" (0)
+    : "cc");
+
+    dsb_sev();
+}
+
+#define _raw_rw_is_locked(x) ((x)->lock != 0)
+#define _raw_rw_is_write_locked(x) ((x)->lock == 0x80000000)
+
+#endif /* __ASM_SPINLOCK_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/string.h b/xen/include/asm-arm/string.h
new file mode 100644
index 0000000..f2d643d
--- /dev/null
+++ b/xen/include/asm-arm/string.h
@@ -0,0 +1,38 @@
+#ifndef __ARM_STRING_H__
+#define __ARM_STRING_H__
+
+#include <xen/config.h>
+
+#define __HAVE_ARCH_MEMCPY
+extern void * memcpy(void *, const void *, __kernel_size_t);
+
+/* Some versions of gcc don't have this builtin. It's non-critical anyway. */
+#define __HAVE_ARCH_MEMMOVE
+extern void *memmove(void *dest, const void *src, size_t n);
+
+#define __HAVE_ARCH_MEMSET
+extern void * memset(void *, int, __kernel_size_t);
+
+extern void __memzero(void *ptr, __kernel_size_t n);
+
+#define memset(p,v,n)                                                   \
+        ({                                                              \
+                void *__p = (p); size_t __n = n;                        \
+                if ((__n) != 0) {                                       \
+                        if (__builtin_constant_p((v)) && (v) == 0)      \
+                                __memzero((__p),(__n));                 \
+                        else                                            \
+                                memset((__p),(v),(__n));                \
+                }                                                       \
+                (__p);                                                  \
+        })
+
+#endif /* __ARM_STRING_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/system.h b/xen/include/asm-arm/system.h
new file mode 100644
index 0000000..731d89f
--- /dev/null
+++ b/xen/include/asm-arm/system.h
@@ -0,0 +1,202 @@
+/* Portions taken from Linux arch arm */
+#ifndef __ASM_SYSTEM_H
+#define __ASM_SYSTEM_H
+
+#include <xen/lib.h>
+#include <asm/processor.h>
+
+#define nop() \
+    asm volatile ( "nop" )
+
+#define xchg(ptr,x) \
+        ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
+
+#define isb() __asm__ __volatile__ ("isb" : : : "memory")
+#define dsb() __asm__ __volatile__ ("dsb" : : : "memory")
+#define dmb() __asm__ __volatile__ ("dmb" : : : "memory")
+
+#define mb()            dsb()
+#define rmb()           dsb()
+#define wmb()           mb()
+
+#define smp_mb()        dmb()
+#define smp_rmb()       dmb()
+#define smp_wmb()       dmb()
+
+/*
+ * This is used to ensure the compiler did actually allocate the register we
+ * asked it for some inline assembly sequences.  Apparently we can't trust
+ * the compiler from one version to another so a bit of paranoia won't hurt.
+ * This string is meant to be concatenated with the inline asm string and
+ * will cause compilation to stop on mismatch.
+ * (for details, see gcc PR 15089)
+ */
+#define __asmeq(x, y)  ".ifnc " x "," y " ; .err ; .endif\n\t"
+
+extern void __bad_xchg(volatile void *, int);
+
+static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
+{
+        unsigned long ret;
+        unsigned int tmp;
+
+        smp_mb();
+
+        switch (size) {
+        case 1:
+                asm volatile("@ __xchg1\n"
+                "1:     ldrexb  %0, [%3]\n"
+                "       strexb  %1, %2, [%3]\n"
+                "       teq     %1, #0\n"
+                "       bne     1b"
+                        : "=&r" (ret), "=&r" (tmp)
+                        : "r" (x), "r" (ptr)
+                        : "memory", "cc");
+                break;
+        case 4:
+                asm volatile("@ __xchg4\n"
+                "1:     ldrex   %0, [%3]\n"
+                "       strex   %1, %2, [%3]\n"
+                "       teq     %1, #0\n"
+                "       bne     1b"
+                        : "=&r" (ret), "=&r" (tmp)
+                        : "r" (x), "r" (ptr)
+                        : "memory", "cc");
+                break;
+        default:
+                __bad_xchg(ptr, size), ret = 0;
+                break;
+        }
+        smp_mb();
+
+        return ret;
+}
+
+/*
+ * Atomic compare and exchange.  Compare OLD with MEM, if identical,
+ * store NEW in MEM.  Return the initial value in MEM.  Success is
+ * indicated by comparing RETURN with OLD.
+ */
+
+extern void __bad_cmpxchg(volatile void *ptr, int size);
+
+static always_inline unsigned long __cmpxchg(
+    volatile void *ptr, unsigned long old, unsigned long new, int size)
+{
+    unsigned long /*long*/ oldval, res;
+
+    switch (size) {
+    case 1:
+        do {
+            asm volatile("@ __cmpxchg1\n"
+                         "       ldrexb  %1, [%2]\n"
+                         "       mov     %0, #0\n"
+                         "       teq     %1, %3\n"
+                         "       strexbeq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+    case 2:
+        do {
+            asm volatile("@ __cmpxchg2\n"
+                         "       ldrexh  %1, [%2]\n"
+                         "       mov     %0, #0\n"
+                         "       teq     %1, %3\n"
+                         "       strexheq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+    case 4:
+        do {
+            asm volatile("@ __cmpxchg4\n"
+                         "       ldrex   %1, [%2]\n"
+                         "       mov     %0, #0\n"
+                         "       teq     %1, %3\n"
+                         "       strexeq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+#if 0
+    case 8:
+        do {
+            asm volatile("@ __cmpxchg8\n"
+                         "       ldrexd   %1, [%2]\n"
+                         "       mov      %0, #0\n"
+                         "       teq      %1, %3\n"
+                         "       strexdeq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+#endif
+    default:
+        __bad_cmpxchg(ptr, size);
+        oldval = 0;
+    }
+
+    return oldval;
+}
+#define cmpxchg(ptr,o,n)                                                \
+    ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),            \
+                                   (unsigned long)(n),sizeof(*(ptr))))
+
+#define local_irq_disable() asm volatile ( "cpsid i @ local_irq_disable\n" : : : "cc" )
+#define local_irq_enable()  asm volatile ( "cpsie i @ local_irq_enable\n" : : : "cc" )
+
+#define local_save_flags(x)                                      \
+({                                                               \
+    BUILD_BUG_ON(sizeof(x) != sizeof(long));                     \
+    asm volatile ( "mrs %0, cpsr     @ local_save_flags\n"       \
+                  : "=r" (x) :: "memory", "cc" );                \
+})
+#define local_irq_save(x)                                        \
+({                                                               \
+    local_save_flags(x);                                         \
+    local_irq_disable();                                         \
+})
+#define local_irq_restore(x)                                     \
+({                                                               \
+    BUILD_BUG_ON(sizeof(x) != sizeof(long));                     \
+    asm volatile (                                               \
+            "msr     cpsr_c, %0      @ local_irq_restore\n"      \
+            :                                                    \
+            : "r" (flags)                                        \
+            : "memory", "cc");                                   \
+})
+
+static inline int local_irq_is_enabled(void)
+{
+    unsigned long flags;
+    local_save_flags(flags);
+    return !(flags & PSR_IRQ_MASK);
+}
+
+#define local_fiq_enable()  __asm__("cpsie f   @ __stf\n" : : : "memory", "cc")
+#define local_fiq_disable() __asm__("cpsid f   @ __clf\n" : : : "memory", "cc")
+
+#define local_abort_enable() __asm__("cpsie a  @ __sta\n" : : : "memory", "cc")
+#define local_abort_disable() __asm__("cpsid a @ __sta\n" : : : "memory", "cc")
+
+static inline int local_fiq_is_enabled(void)
+{
+    unsigned long flags;
+    local_save_flags(flags);
+    return !!(flags & PSR_FIQ_MASK);
+}
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/trace.h b/xen/include/asm-arm/trace.h
new file mode 100644
index 0000000..db84541
--- /dev/null
+++ b/xen/include/asm-arm/trace.h
@@ -0,0 +1,12 @@
+#ifndef __ASM_TRACE_H__
+#define __ASM_TRACE_H__
+
+#endif /* __ASM_TRACE_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/types.h b/xen/include/asm-arm/types.h
new file mode 100644
index 0000000..48864f9
--- /dev/null
+++ b/xen/include/asm-arm/types.h
@@ -0,0 +1,57 @@
+#ifndef __ARM_TYPES_H__
+#define __ARM_TYPES_H__
+
+#ifndef __ASSEMBLY__
+
+#include <xen/config.h>
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+typedef signed char s8;
+typedef unsigned char u8;
+
+typedef signed short s16;
+typedef unsigned short u16;
+
+typedef signed int s32;
+typedef unsigned int u32;
+
+typedef signed long long s64;
+typedef unsigned long long u64;
+typedef u64 paddr_t;
+#define INVALID_PADDR (~0ULL)
+#define PRIpaddr "016llx"
+
+typedef unsigned long size_t;
+
+typedef char bool_t;
+#define test_and_set_bool(b)   xchg(&(b), 1)
+#define test_and_clear_bool(b) xchg(&(b), 0)
+
+#endif /* __ASSEMBLY__ */
+
+#define BITS_PER_LONG 32
+#define BYTES_PER_LONG 4
+#define LONG_BYTEORDER 2
+
+#endif /* __ARM_TYPES_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/xenoprof.h b/xen/include/asm-arm/xenoprof.h
new file mode 100644
index 0000000..131ac13
--- /dev/null
+++ b/xen/include/asm-arm/xenoprof.h
@@ -0,0 +1,12 @@
+#ifndef __ASM_XENOPROF_H__
+#define __ASM_XENOPROF_H__
+
+#endif /* __ASM_XENOPROF_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h
new file mode 100644
index 0000000..4d1daa9
--- /dev/null
+++ b/xen/include/public/arch-arm.h
@@ -0,0 +1,125 @@
+/******************************************************************************
+ * arch-arm.h
+ *
+ * Guest OS interface to ARM Xen.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Copyright 2011 (C) Citrix Systems
+ */
+
+#ifndef __XEN_PUBLIC_ARCH_ARM_H__
+#define __XEN_PUBLIC_ARCH_ARM_H__
+
+#ifndef __ASSEMBLY__
+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
+    typedef struct { type *p; } __guest_handle_ ## name
+
+#define __DEFINE_XEN_GUEST_HANDLE(name, type) \
+    ___DEFINE_XEN_GUEST_HANDLE(name, type);   \
+    ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type)
+#define DEFINE_XEN_GUEST_HANDLE(name)   __DEFINE_XEN_GUEST_HANDLE(name, name)
+#define __XEN_GUEST_HANDLE(name)        __guest_handle_ ## name
+#define XEN_GUEST_HANDLE(name)          __XEN_GUEST_HANDLE(name)
+#define set_xen_guest_handle_raw(hnd, val)  do { (hnd).p = val; } while (0)
+#ifdef __XEN_TOOLS__
+#define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
+#endif
+#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)
+
+struct cpu_user_regs
+{
+    uint32_t r0;
+    uint32_t r1;
+    uint32_t r2;
+    uint32_t r3;
+    uint32_t r4;
+    uint32_t r5;
+    uint32_t r6;
+    uint32_t r7;
+    uint32_t r8;
+    uint32_t r9;
+    uint32_t r10;
+    union {
+	uint32_t r11;
+	uint32_t fp;
+    };
+    uint32_t r12;
+
+    uint32_t sp; /* r13 - SP: Valid for Hyp. frames only, o/w banked (see below) */
+    uint32_t lr; /* r14 - LR: Valid for Hyp. Same physical register as lr_usr. */
+
+    uint32_t pc; /* Return IP */
+    uint32_t cpsr; /* Return mode */
+    uint32_t pad0; /* Doubleword-align the kernel half of the frame */
+
+    /* Outer guest frame only from here on... */
+
+    uint32_t r8_fiq, r9_fiq, r10_fiq, r11_fiq, r12_fiq;
+
+    uint32_t sp_usr, sp_svc, sp_abt, sp_und, sp_irq, sp_fiq;
+    uint32_t lr_usr, lr_svc, lr_abt, lr_und, lr_irq, lr_fiq;
+
+    uint32_t spsr_svc, spsr_abt, spsr_und, spsr_irq, spsr_fiq;
+};
+typedef struct cpu_user_regs cpu_user_regs_t;
+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
+
+typedef uint64_t xen_pfn_t;
+#define PRI_xen_pfn PRIx64
+
+/* Maximum number of virtual CPUs in legacy multi-processor guests. */
+/* Only one. All other VCPUS must use VCPUOP_register_vcpu_info */
+#define XEN_LEGACY_MAX_VCPUS 1
+
+typedef uint32_t xen_ulong_t;
+
+struct vcpu_guest_context {
+    struct cpu_user_regs user_regs;         /* User-level CPU registers     */
+    union {
+	uint32_t reg[16];
+	struct {
+	    uint32_t __pad[12];
+	    uint32_t sp; /* r13 */
+	    uint32_t lr; /* r14 */
+	    uint32_t pc; /* r15 */
+	};
+    };
+};
+typedef struct vcpu_guest_context vcpu_guest_context_t;
+DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
+
+struct arch_vcpu_info { };
+typedef struct arch_vcpu_info arch_vcpu_info_t;
+
+struct arch_shared_info { };
+typedef struct arch_shared_info arch_shared_info_t;
+#endif
+
+#endif /*  __XEN_PUBLIC_ARCH_ARM_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
index fde9fa5..7196400 100644
--- a/xen/include/public/xen.h
+++ b/xen/include/public/xen.h
@@ -33,6 +33,8 @@
 #include "arch-x86/xen.h"
 #elif defined(__ia64__)
 #include "arch-ia64.h"
+#elif defined(__arm__)
+#include "arch-arm.h"
 #else
 #error "Unsupported architecture"
 #endif
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Dec 07 16:29:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 07 Dec 2011 16:29:19 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RYKMd-0000M5-DJ; Wed, 07 Dec 2011 16:28:59 +0000
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Ian.Campbell@citrix.com>) id 1RYKMb-0000LG-Kk
	for xen-devel@lists.xensource.com; Wed, 07 Dec 2011 16:28:58 +0000
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1323275290!7310616!1
X-Originating-IP: [62.200.22.115]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjIuMjAwLjIyLjExNSA9PiA5MjA3NQ==\n
X-StarScan-Version: 6.4.2; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6068 invoked from network); 7 Dec 2011 16:28:10 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Dec 2011 16:28:10 -0000
X-IronPort-AV: E=Sophos;i="4.71,314,1320624000"; 
   d="scan'208";a="9347120"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Dec 2011 16:28:00 +0000
Received: from [10.80.2.42] (10.80.2.42) by LONPMAILMX01.citrite.net
	(10.30.203.162) with Microsoft SMTP Server id 8.3.213.0; Wed, 7 Dec 2011
	16:28:00 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Wed, 7 Dec 2011 16:28:00 +0000
In-Reply-To: <1323108621-22654-13-git-send-email-ian.jackson@eu.citrix.com>
References: <1323108621-22654-1-git-send-email-ian.jackson@eu.citrix.com>
	<1323108621-22654-13-git-send-email-ian.jackson@eu.citrix.com>
Organization: Citrix Systems, Inc.
X-Mailer: Evolution 3.0.3- 
Message-ID: <1323275280.2969.3.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH 12/15] libxl: Use GC_INIT and GC_FREE
 everywhere
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-12-05 at 18:10 +0000, Ian Jackson wrote:
> Replace
>     libxl__gc gc = LIBXL_INIT_GC(ctx);
>     ...
>     libxl__free_all(&gc);
> with
>     GC_INIT(ctx);
>     ...
>     GC_FREE;

I suppose this really relates to the earlier patch which adds these
macros but wouldn't "GC_FREE();" be nicer?

> throughout with a couple of perl runes.
> 
> We must then adjust uses of the resulting gc for pointerness, which is
> mostly just replacing all occurrences of "&gc" with "gc".

BTW I really like this aspect of the change since one big annoyance when
making an exiting internal function into an external one (or vice versa)
is the need to frob all the uses of gc...

Ian.

>   Also a
> couple of unusual uses of LIBXL_INIT_GC needed to be fixed up by hand.
> 
> Here are those runes:
>  perl -i -pe 's/\Q    libxl__gc gc = LIBXL_INIT_GC(ctx);/    GC_INIT(ctx);/' tools/libxl/*.c
>  perl -i -pe 's/\Q    libxl__free_all(&gc);/    GC_FREE;/' tools/libxl/*.c
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
> ---
>  tools/libxl/libxl.c            |  590 ++++++++++++++++++++--------------------
>  tools/libxl/libxl_bootloader.c |   14 +-
>  tools/libxl/libxl_create.c     |   12 +-
>  tools/libxl/libxl_dom.c        |   16 +-
>  tools/libxl/libxl_pci.c        |   34 ++--
>  tools/libxl/libxl_qmp.c        |   32 +-
>  tools/libxl/libxl_utils.c      |   36 ++--
>  7 files changed, 367 insertions(+), 367 deletions(-)
> 
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 7488538..3a8cfe3 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -232,19 +232,19 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid,
>  int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid,
>                          const char *old_name, const char *new_name)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc;
> -    rc = libxl__domain_rename(&gc, domid, old_name, new_name, XBT_NULL);
> -    libxl__free_all(&gc);
> +    rc = libxl__domain_rename(gc, domid, old_name, new_name, XBT_NULL);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc = 0;
> 
> -    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
> +    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
>          LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Called domain_resume on "
>                  "non-cooperative hvm domain %u", domid);
>          rc = ERROR_NI;
> @@ -264,7 +264,7 @@ int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid)
>          rc = ERROR_FAIL;
>      }
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -277,7 +277,7 @@ out:
>  int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
>                            libxl_domain_create_info *info, const char *name_suffix, libxl_uuid new_uuid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      struct xs_permissions roperm[2];
>      xs_transaction_t t;
>      char *preserved_name;
> @@ -287,27 +287,27 @@ int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
> 
>      int rc;
> 
> -    preserved_name = libxl__sprintf(&gc, "%s%s", info->name, name_suffix);
> +    preserved_name = libxl__sprintf(gc, "%s%s", info->name, name_suffix);
>      if (!preserved_name) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_NOMEM;
>      }
> 
> -    uuid_string = libxl__uuid2string(&gc, new_uuid);
> +    uuid_string = libxl__uuid2string(gc, new_uuid);
>      if (!uuid_string) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_NOMEM;
>      }
> 
> -    dom_path = libxl__xs_get_dompath(&gc, domid);
> +    dom_path = libxl__xs_get_dompath(gc, domid);
>      if (!dom_path) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_FAIL;
>      }
> 
> -    vm_path = libxl__sprintf(&gc, "/vm/%s", uuid_string);
> +    vm_path = libxl__sprintf(gc, "/vm/%s", uuid_string);
>      if (!vm_path) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_FAIL;
>      }
> 
> @@ -323,20 +323,20 @@ int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
>      xs_mkdir(ctx->xsh, t, vm_path);
>      xs_set_permissions(ctx->xsh, t, vm_path, roperm, ARRAY_SIZE(roperm));
> 
> -    xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
> -    rc = libxl__domain_rename(&gc, domid, info->name, preserved_name, t);
> +    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
> +    rc = libxl__domain_rename(gc, domid, info->name, preserved_name, t);
>      if (rc) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return rc;
>      }
> 
> -    xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
> +    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
> 
>      if (!xs_transaction_end(ctx->xsh, t, 0))
>          if (errno == EAGAIN)
>              goto retry_transaction;
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return 0;
>  }
> 
> @@ -478,16 +478,16 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm)
>  int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info,
>                           uint32_t domid, int fd)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> -    libxl_domain_type type = libxl__domain_type(&gc, domid);
> +    GC_INIT(ctx);
> +    libxl_domain_type type = libxl__domain_type(gc, domid);
>      int live = info != NULL && info->flags & XL_SUSPEND_LIVE;
>      int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG;
>      int rc = 0;
> 
> -    rc = libxl__domain_suspend_common(&gc, domid, fd, type, live, debug);
> +    rc = libxl__domain_suspend_common(gc, domid, fd, type, live, debug);
>      if (!rc && type == LIBXL_DOMAIN_TYPE_HVM)
> -        rc = libxl__domain_save_device_model(&gc, domid, fd);
> -    libxl__free_all(&gc);
> +        rc = libxl__domain_save_device_model(gc, domid, fd);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -517,17 +517,17 @@ int libxl_domain_core_dump(libxl_ctx *ctx, uint32_t domid,
> 
>  int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *path;
>      char *state;
>      int ret, rc = 0;
> 
> -    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
> -        path = libxl__sprintf(&gc, "/local/domain/0/device-model/%d/state", domid);
> -        state = libxl__xs_read(&gc, XBT_NULL, path);
> +    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
> +        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
> +        state = libxl__xs_read(gc, XBT_NULL, path);
>          if (state != NULL && !strcmp(state, "paused")) {
> -            libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/0/device-model/%d/command", domid), "continue");
> -            libxl__wait_for_device_model(&gc, domid, "running",
> +            libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid), "continue");
> +            libxl__wait_for_device_model(gc, domid, "running",
>                                           NULL, NULL, NULL);
>          }
>      }
> @@ -536,7 +536,7 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
>          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unpausing domain %d", domid);
>          rc = ERROR_FAIL;
>      }
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -550,42 +550,42 @@ static char *req_table[] = {
> 
>  int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *shutdown_path;
>      char *dom_path;
> 
>      if (req > ARRAY_SIZE(req_table)) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_INVAL;
>      }
> 
> -    dom_path = libxl__xs_get_dompath(&gc, domid);
> +    dom_path = libxl__xs_get_dompath(gc, domid);
>      if (!dom_path) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_FAIL;
>      }
> 
> -    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
> +    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
>          unsigned long pvdriver = 0;
>          int ret;
>          ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
>          if (ret<0) {
>              LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting HVM callback IRQ");
> -            libxl__free_all(&gc);
> +            GC_FREE;
>              return ERROR_FAIL;
>          }
>          if (!pvdriver) {
>              LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "HVM domain without PV drivers:"
>                         " graceful shutdown not possible, use destroy");
> -            libxl__free_all(&gc);
> +            GC_FREE;
>              return ERROR_FAIL;
>          }
>      }
> 
> -    shutdown_path = libxl__sprintf(&gc, "%s/control/shutdown", dom_path);
> +    shutdown_path = libxl__sprintf(gc, "%s/control/shutdown", dom_path);
>      xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req]));
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return 0;
>  }
> 
> @@ -607,7 +607,7 @@ int libxl_wait_for_domain_death(libxl_ctx *ctx, uint32_t domid, libxl_waiter *wa
> 
>  int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_device_disk *disks, int num_disks, libxl_waiter *waiter)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int i, rc = -1;
>      uint32_t domid = libxl_get_stubdom_id(ctx, guest_domid);
> 
> @@ -616,7 +616,7 @@ int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_devic
> 
>      for (i = 0; i < num_disks; i++) {
>          if (asprintf(&(waiter[i].path), "%s/device/vbd/%d/eject",
> -                     libxl__xs_get_dompath(&gc, domid),
> +                     libxl__xs_get_dompath(gc, domid),
>                       libxl__device_disk_dev_number(disks[i].vdev,
>                                                     NULL, NULL)) < 0)
>              goto out;
> @@ -626,7 +626,7 @@ int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_devic
>      }
>      rc = 0;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -680,22 +680,22 @@ int libxl_event_get_domain_death_info(libxl_ctx *ctx, uint32_t domid, libxl_even
> 
>  int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_device_disk *disk)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *path;
>      char *backend;
>      char *value;
>      char backend_type[BACKEND_STRING_SIZE+1];
> 
> -    value = libxl__xs_read(&gc, XBT_NULL, event->path);
> +    value = libxl__xs_read(gc, XBT_NULL, event->path);
> 
>      if (!value || strcmp(value,  "eject")) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return 0;
>      }
> 
>      path = strdup(event->path);
>      path[strlen(path) - 6] = '\0';
> -    backend = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", path));
> +    backend = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", path));
> 
>      sscanf(backend,
>              "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE) "[a-z]/%*d/%*d",
> @@ -711,19 +711,19 @@ int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event
>      disk->pdev_path = strdup("");
>      disk->format = LIBXL_DISK_FORMAT_EMPTY;
>      /* this value is returned to the user: do not free right away */
> -    disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend), NULL);
> +    disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/dev", backend), NULL);
>      disk->removable = 1;
>      disk->readwrite = 0;
>      disk->is_cdrom = 1;
> 
>      free(path);
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return 1;
>  }
> 
>  int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl_dominfo dominfo;
>      char *dom_path;
>      char *vm_path;
> @@ -740,40 +740,40 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
>          return rc;
>      }
> 
> -    switch (libxl__domain_type(&gc, domid)) {
> +    switch (libxl__domain_type(gc, domid)) {
>      case LIBXL_DOMAIN_TYPE_HVM:
>          dm_present = 1;
>          break;
>      case LIBXL_DOMAIN_TYPE_PV:
> -        pid = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/%d/image/device-model-pid", domid));
> +        pid = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/%d/image/device-model-pid", domid));
>          dm_present = (pid != NULL);
>          break;
>      default:
>          abort();
>      }
> 
> -    dom_path = libxl__xs_get_dompath(&gc, domid);
> +    dom_path = libxl__xs_get_dompath(gc, domid);
>      if (!dom_path) {
>          rc = ERROR_FAIL;
>          goto out;
>      }
> 
> -    if (libxl__device_pci_destroy_all(&gc, domid) < 0)
> +    if (libxl__device_pci_destroy_all(gc, domid) < 0)
>          LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "pci shutdown failed for domid %d", domid);
>      rc = xc_domain_pause(ctx->xch, domid);
>      if (rc < 0) {
>          LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "xc_domain_pause failed for %d", domid);
>      }
>      if (dm_present) {
> -        if (libxl__destroy_device_model(&gc, domid) < 0)
> +        if (libxl__destroy_device_model(gc, domid) < 0)
>              LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl__destroy_device_model failed for %d", domid);
> 
> -        libxl__qmp_cleanup(&gc, domid);
> +        libxl__qmp_cleanup(gc, domid);
>      }
> -    if (libxl__devices_destroy(&gc, domid, force) < 0)
> +    if (libxl__devices_destroy(gc, domid, force) < 0)
>          LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_devices_dispose failed for %d", domid);
> 
> -    vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
> +    vm_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path));
>      if (vm_path)
>          if (!xs_rm(ctx->xsh, XBT_NULL, vm_path))
>              LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", vm_path);
> @@ -781,9 +781,9 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
>      if (!xs_rm(ctx->xsh, XBT_NULL, dom_path))
>          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", dom_path);
> 
> -    xs_rm(ctx->xsh, XBT_NULL, libxl__xs_libxl_path(&gc, domid));
> +    xs_rm(ctx->xsh, XBT_NULL, libxl__xs_libxl_path(gc, domid));
> 
> -    libxl__userdata_destroyall(&gc, domid);
> +    libxl__userdata_destroyall(gc, domid);
> 
>      rc = xc_domain_destroy(ctx->xch, domid);
>      if (rc < 0) {
> @@ -793,16 +793,16 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
>      }
>      rc = 0;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_console_type type)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> -    char *p = libxl__sprintf(&gc, "%s/xenconsole", libxl_private_bindir_path());
> -    char *domid_s = libxl__sprintf(&gc, "%d", domid);
> -    char *cons_num_s = libxl__sprintf(&gc, "%d", cons_num);
> +    GC_INIT(ctx);
> +    char *p = libxl__sprintf(gc, "%s/xenconsole", libxl_private_bindir_path());
> +    char *domid_s = libxl__sprintf(gc, "%d", domid);
> +    char *cons_num_s = libxl__sprintf(gc, "%d", cons_num);
>      char *cons_type_s;
> 
>      switch (type) {
> @@ -819,20 +819,20 @@ int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_conso
>      execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, (void *)NULL);
> 
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return ERROR_FAIL;
>  }
> 
>  int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm);
>      int rc;
>      if (stubdomid)
>          rc = libxl_console_exec(ctx, stubdomid,
>                                  STUBDOM_CONSOLE_SERIAL, LIBXL_CONSOLE_TYPE_PV);
>      else {
> -        switch (libxl__domain_type(&gc, domid_vm)) {
> +        switch (libxl__domain_type(gc, domid_vm)) {
>          case LIBXL_DOMAIN_TYPE_HVM:
>              rc = libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSOLE_TYPE_SERIAL);
>              break;
> @@ -843,13 +843,13 @@ int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
>              abort();
>          }
>      }
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      const char *vnc_port;
>      const char *vnc_listen = NULL, *vnc_pass = NULL;
>      int port = 0, autopass_fd = -1;
> @@ -860,19 +860,19 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
>          NULL,
>      };
> 
> -    vnc_port = libxl__xs_read(&gc, XBT_NULL,
> -                            libxl__sprintf(&gc,
> +    vnc_port = libxl__xs_read(gc, XBT_NULL,
> +                            libxl__sprintf(gc,
>                              "/local/domain/%d/console/vnc-port", domid));
>      if ( vnc_port )
>          port = atoi(vnc_port) - 5900;
> 
> -    vnc_listen = libxl__xs_read(&gc, XBT_NULL,
> -                                libxl__sprintf(&gc,
> +    vnc_listen = libxl__xs_read(gc, XBT_NULL,
> +                                libxl__sprintf(gc,
>                              "/local/domain/%d/console/vnc-listen", domid));
> 
>      if ( autopass )
> -        vnc_pass = libxl__xs_read(&gc, XBT_NULL,
> -                                  libxl__sprintf(&gc,
> +        vnc_pass = libxl__xs_read(gc, XBT_NULL,
> +                                  libxl__sprintf(gc,
>                              "/local/domain/%d/console/vnc-pass", domid));
> 
>      if ( NULL == vnc_listen )
> @@ -881,7 +881,7 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
>      if ( (vnc_bin = getenv("VNCVIEWER")) )
>          args[0] = vnc_bin;
> 
> -    args[1] = libxl__sprintf(&gc, "%s:%d", vnc_listen, port);
> +    args[1] = libxl__sprintf(gc, "%s:%d", vnc_listen, port);
> 
>      if ( vnc_pass ) {
>          char tmpname[] = "/tmp/vncautopass.XXXXXX";
> @@ -916,7 +916,7 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
>      abort();
> 
>   x_fail:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return ERROR_FAIL;
>  }
> 
> @@ -970,17 +970,17 @@ static int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
> 
>  int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      flexarray_t *front;
>      flexarray_t *back;
>      char *dev;
>      libxl__device device;
>      int major, minor, rc;
> 
> -    rc = libxl__device_disk_set_backend(&gc, disk);
> +    rc = libxl__device_disk_set_backend(gc, disk);
>      if (rc) goto out;
> 
> -    rc = libxl__device_disk_set_backend(&gc, disk);
> +    rc = libxl__device_disk_set_backend(gc, disk);
>      if (rc) goto out;
> 
>      front = flexarray_make(16, 1);
> @@ -1001,7 +1001,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
>          goto out_free;
>      }
> 
> -    rc = libxl__device_from_disk(&gc, domid, disk, &device);
> +    rc = libxl__device_from_disk(gc, domid, disk, &device);
>      if (rc != 0) {
>          LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
>                 " virtual disk identifier %s", disk->vdev);
> @@ -1014,7 +1014,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
>      do_backend_phy:
>              libxl__device_physdisk_major_minor(dev, &major, &minor);
>              flexarray_append(back, "physical-device");
> -            flexarray_append(back, libxl__sprintf(&gc, "%x:%x", major, minor));
> +            flexarray_append(back, libxl__sprintf(gc, "%x:%x", major, minor));
> 
>              flexarray_append(back, "params");
>              flexarray_append(back, dev);
> @@ -1022,13 +1022,13 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
>              assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD);
>              break;
>          case LIBXL_DISK_BACKEND_TAP:
> -            dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format);
> +            dev = libxl__blktap_devpath(gc, disk->pdev_path, disk->format);
>              if (!dev) {
>                  rc = ERROR_FAIL;
>                  goto out_free;
>              }
>              flexarray_append(back, "tapdisk-params");
> -            flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
> +            flexarray_append(back, libxl__sprintf(gc, "%s:%s",
>                  libxl__device_disk_string_of_format(disk->format),
>                  disk->pdev_path));
> 
> @@ -1036,7 +1036,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
>              goto do_backend_phy;
>          case LIBXL_DISK_BACKEND_QDISK:
>              flexarray_append(back, "params");
> -            flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
> +            flexarray_append(back, libxl__sprintf(gc, "%s:%s",
>                            libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
>              assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK);
>              break;
> @@ -1047,15 +1047,15 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
>      }
> 
>      flexarray_append(back, "frontend-id");
> -    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
> +    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
>      flexarray_append(back, "online");
>      flexarray_append(back, "1");
>      flexarray_append(back, "removable");
> -    flexarray_append(back, libxl__sprintf(&gc, "%d", (disk->removable) ? 1 : 0));
> +    flexarray_append(back, libxl__sprintf(gc, "%d", (disk->removable) ? 1 : 0));
>      flexarray_append(back, "bootable");
> -    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
> +    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
>      flexarray_append(back, "state");
> -    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
> +    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
>      flexarray_append(back, "dev");
>      flexarray_append(back, disk->vdev);
>      flexarray_append(back, "type");
> @@ -1066,17 +1066,17 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
>      flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
> 
>      flexarray_append(front, "backend-id");
> -    flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid));
> +    flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid));
>      flexarray_append(front, "state");
> -    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
> +    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
>      flexarray_append(front, "virtual-device");
> -    flexarray_append(front, libxl__sprintf(&gc, "%d", device.devid));
> +    flexarray_append(front, libxl__sprintf(gc, "%d", device.devid));
>      flexarray_append(front, "device-type");
>      flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk");
> 
> -    libxl__device_generic_add(&gc, &device,
> -                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
> -                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
> +    libxl__device_generic_add(gc, &device,
> +                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
> +                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
> 
>      rc = 0;
> 
> @@ -1084,39 +1084,39 @@ out_free:
>      flexarray_free(back);
>      flexarray_free(front);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid,
>                               libxl_device_disk *disk)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl__device device;
>      int rc;
> 
> -    rc = libxl__device_from_disk(&gc, domid, disk, &device);
> +    rc = libxl__device_from_disk(gc, domid, disk, &device);
>      if (rc != 0) goto out;
> 
> -    rc = libxl__device_remove(&gc, &device, 1);
> +    rc = libxl__device_remove(gc, &device, 1);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
>                                libxl_device_disk *disk)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl__device device;
>      int rc;
> 
> -    rc = libxl__device_from_disk(&gc, domid, disk, &device);
> +    rc = libxl__device_from_disk(gc, domid, disk, &device);
>      if (rc != 0) goto out;
> 
> -    rc = libxl__device_destroy(&gc, &device);
> +    rc = libxl__device_destroy(gc, &device);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -1168,27 +1168,27 @@ static void libxl__device_disk_from_xs_be(libxl__gc *gc,
>  int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
>                                 int devid, libxl_device_disk *disk)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *dompath, *path;
>      int rc = ERROR_FAIL;
> 
>      libxl_device_disk_init(ctx, disk);
> 
> -    dompath = libxl__xs_get_dompath(&gc, domid);
> +    dompath = libxl__xs_get_dompath(gc, domid);
>      if (!dompath) {
>          goto out;
>      }
> -    path = libxl__xs_read(&gc, XBT_NULL,
> -                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
> +    path = libxl__xs_read(gc, XBT_NULL,
> +                          libxl__sprintf(gc, "%s/device/vbd/%d/backend",
>                                           dompath, devid));
>      if (!path)
>          goto out;
> 
> -    libxl__device_disk_from_xs_be(&gc, path, disk);
> +    libxl__device_disk_from_xs_be(gc, path, disk);
> 
>      rc = 0;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -1228,22 +1228,22 @@ static int libxl__append_disk_list_of_type(libxl__gc *gc,
> 
>  libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl_device_disk *disks = NULL;
>      int rc;
> 
>      *num = 0;
> 
> -    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
> +    rc = libxl__append_disk_list_of_type(gc, domid, "vbd", &disks, num);
>      if (rc) goto out_err;
> 
> -    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
> +    rc = libxl__append_disk_list_of_type(gc, domid, "tap", &disks, num);
>      if (rc) goto out_err;
> 
> -    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
> +    rc = libxl__append_disk_list_of_type(gc, domid, "qdisk", &disks, num);
>      if (rc) goto out_err;
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return disks;
> 
>  out_err:
> @@ -1259,35 +1259,35 @@ out_err:
>  int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
>                                libxl_device_disk *disk, libxl_diskinfo *diskinfo)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *dompath, *diskpath;
>      char *val;
> 
> -    dompath = libxl__xs_get_dompath(&gc, domid);
> +    dompath = libxl__xs_get_dompath(gc, domid);
>      diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
> 
>      /* tap devices entries in xenstore are written as vbd devices. */
> -    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
> +    diskpath = libxl__sprintf(gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
>      diskinfo->backend = xs_read(ctx->xsh, XBT_NULL,
> -                                libxl__sprintf(&gc, "%s/backend", diskpath), NULL);
> +                                libxl__sprintf(gc, "%s/backend", diskpath), NULL);
>      if (!diskinfo->backend) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_FAIL;
>      }
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend-id", diskpath));
>      diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath));
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/state", diskpath));
>      diskinfo->state = val ? strtoul(val, NULL, 10) : -1;
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath));
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/event-channel", diskpath));
>      diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath));
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/ring-ref", diskpath));
>      diskinfo->rref = val ? strtoul(val, NULL, 10) : -1;
>      diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
> -                                 libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL);
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend));
> +                                 libxl__sprintf(gc, "%s/frontend", diskinfo->backend), NULL);
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend-id", diskinfo->backend));
>      diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return 0;
>  }
> 
> @@ -1331,12 +1331,12 @@ out:
> 
>  char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *dev = NULL;
>      char *ret = NULL;
>      int rc;
> 
> -    rc = libxl__device_disk_set_backend(&gc, disk);
> +    rc = libxl__device_disk_set_backend(gc, disk);
>      if (rc) goto out;
> 
>      switch (disk->backend) {
> @@ -1355,7 +1355,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
>                  dev = disk->pdev_path;
>                  break;
>              case LIBXL_DISK_FORMAT_VHD:
> -                dev = libxl__blktap_devpath(&gc, disk->pdev_path,
> +                dev = libxl__blktap_devpath(gc, disk->pdev_path,
>                                              disk->format);
>                  break;
>              case LIBXL_DISK_FORMAT_QCOW:
> @@ -1386,7 +1386,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
>   out:
>      if (dev != NULL)
>          ret = strdup(dev);
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return ret;
>  }
> 
> @@ -1448,7 +1448,7 @@ static int libxl__device_from_nic(libxl__gc *gc, uint32_t domid,
> 
>  int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      flexarray_t *front;
>      flexarray_t *back;
>      libxl__device device;
> @@ -1467,59 +1467,59 @@ int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic)
>      }
> 
>      if (nic->devid == -1) {
> -        if (!(dompath = libxl__xs_get_dompath(&gc, domid))) {
> +        if (!(dompath = libxl__xs_get_dompath(gc, domid))) {
>              rc = ERROR_FAIL;
>              goto out_free;
>          }
> -        if (!(l = libxl__xs_directory(&gc, XBT_NULL,
> -                                     libxl__sprintf(&gc, "%s/device/vif", dompath), &nb))) {
> +        if (!(l = libxl__xs_directory(gc, XBT_NULL,
> +                                     libxl__sprintf(gc, "%s/device/vif", dompath), &nb))) {
>              nic->devid = 0;
>          } else {
>              nic->devid = strtoul(l[nb - 1], NULL, 10) + 1;
>          }
>      }
> 
> -    rc = libxl__device_from_nic(&gc, domid, nic, &device);
> +    rc = libxl__device_from_nic(gc, domid, nic, &device);
>      if ( rc != 0 ) goto out_free;
> 
>      flexarray_append(back, "frontend-id");
> -    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
> +    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
>      flexarray_append(back, "online");
>      flexarray_append(back, "1");
>      flexarray_append(back, "state");
> -    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
> +    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
>      if (nic->script) {
>          flexarray_append(back, "script");
>          flexarray_append(back, nic->script[0]=='/' ? nic->script
> -                         : libxl__sprintf(&gc, "%s/%s",
> +                         : libxl__sprintf(gc, "%s/%s",
>                                            libxl_xen_script_dir_path(),
>                                            nic->script));
>      }
>      flexarray_append(back, "mac");
> -    flexarray_append(back,libxl__sprintf(&gc,
> +    flexarray_append(back,libxl__sprintf(gc,
>                                      LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
>      if (nic->ip) {
>          flexarray_append(back, "ip");
> -        flexarray_append(back, libxl__strdup(&gc, nic->ip));
> +        flexarray_append(back, libxl__strdup(gc, nic->ip));
>      }
> 
>      flexarray_append(back, "bridge");
> -    flexarray_append(back, libxl__strdup(&gc, nic->bridge));
> +    flexarray_append(back, libxl__strdup(gc, nic->bridge));
>      flexarray_append(back, "handle");
> -    flexarray_append(back, libxl__sprintf(&gc, "%d", nic->devid));
> +    flexarray_append(back, libxl__sprintf(gc, "%d", nic->devid));
> 
>      flexarray_append(front, "backend-id");
> -    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->backend_domid));
> +    flexarray_append(front, libxl__sprintf(gc, "%d", nic->backend_domid));
>      flexarray_append(front, "state");
> -    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
> +    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
>      flexarray_append(front, "handle");
> -    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->devid));
> +    flexarray_append(front, libxl__sprintf(gc, "%d", nic->devid));
>      flexarray_append(front, "mac");
> -    flexarray_append(front, libxl__sprintf(&gc,
> +    flexarray_append(front, libxl__sprintf(gc,
>                                      LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
> -    libxl__device_generic_add(&gc, &device,
> -                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
> -                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
> +    libxl__device_generic_add(gc, &device,
> +                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
> +                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
> 
>      /* FIXME: wait for plug */
>      rc = 0;
> @@ -1527,39 +1527,39 @@ out_free:
>      flexarray_free(back);
>      flexarray_free(front);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid,
>                              libxl_device_nic *nic)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl__device device;
>      int rc;
> 
> -    rc = libxl__device_from_nic(&gc, domid, nic, &device);
> +    rc = libxl__device_from_nic(gc, domid, nic, &device);
>      if (rc != 0) goto out;
> 
> -    rc = libxl__device_remove(&gc, &device, 1);
> +    rc = libxl__device_remove(gc, &device, 1);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid,
>                                    libxl_device_nic *nic)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl__device device;
>      int rc;
> 
> -    rc = libxl__device_from_nic(&gc, domid, nic, &device);
> +    rc = libxl__device_from_nic(gc, domid, nic, &device);
>      if (rc != 0) goto out;
> 
> -    rc = libxl__device_destroy(&gc, &device);
> +    rc = libxl__device_destroy(gc, &device);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -1607,26 +1607,26 @@ static void libxl__device_nic_from_xs_be(libxl__gc *gc,
>  int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
>                                int devid, libxl_device_nic *nic)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *dompath, *path;
>      int rc = ERROR_FAIL;
> 
>      memset(nic, 0, sizeof (libxl_device_nic));
> -    dompath = libxl__xs_get_dompath(&gc, domid);
> +    dompath = libxl__xs_get_dompath(gc, domid);
>      if (!dompath)
>          goto out;
> 
> -    path = libxl__xs_read(&gc, XBT_NULL,
> -                          libxl__sprintf(&gc, "%s/device/vif/%d/backend",
> +    path = libxl__xs_read(gc, XBT_NULL,
> +                          libxl__sprintf(gc, "%s/device/vif/%d/backend",
>                                           dompath, devid));
>      if (!path)
>          goto out;
> 
> -    libxl__device_nic_from_xs_be(&gc, path, nic);
> +    libxl__device_nic_from_xs_be(gc, path, nic);
> 
>      rc = 0;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -1665,16 +1665,16 @@ static int libxl__append_nic_list_of_type(libxl__gc *gc,
> 
>  libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl_device_nic *nics = NULL;
>      int rc;
> 
>      *num = 0;
> 
> -    rc = libxl__append_nic_list_of_type(&gc, domid, "vif", &nics, num);
> +    rc = libxl__append_nic_list_of_type(gc, domid, "vif", &nics, num);
>      if (rc) goto out_err;
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return nics;
> 
>  out_err:
> @@ -1690,36 +1690,36 @@ out_err:
>  int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
>                                libxl_device_nic *nic, libxl_nicinfo *nicinfo)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *dompath, *nicpath;
>      char *val;
> 
> -    dompath = libxl__xs_get_dompath(&gc, domid);
> +    dompath = libxl__xs_get_dompath(gc, domid);
>      nicinfo->devid = nic->devid;
> 
> -    nicpath = libxl__sprintf(&gc, "%s/device/vif/%d", dompath, nicinfo->devid);
> +    nicpath = libxl__sprintf(gc, "%s/device/vif/%d", dompath, nicinfo->devid);
>      nicinfo->backend = xs_read(ctx->xsh, XBT_NULL,
> -                                libxl__sprintf(&gc, "%s/backend", nicpath), NULL);
> +                                libxl__sprintf(gc, "%s/backend", nicpath), NULL);
>      if (!nicinfo->backend) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_FAIL;
>      }
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nicpath));
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend-id", nicpath));
>      nicinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nicpath));
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/state", nicpath));
>      nicinfo->state = val ? strtoul(val, NULL, 10) : -1;
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nicpath));
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/event-channel", nicpath));
>      nicinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nicpath));
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/tx-ring-ref", nicpath));
>      nicinfo->rref_tx = val ? strtoul(val, NULL, 10) : -1;
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nicpath));
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/rx-ring-ref", nicpath));
>      nicinfo->rref_rx = val ? strtoul(val, NULL, 10) : -1;
>      nicinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
> -                                 libxl__sprintf(&gc, "%s/frontend", nicinfo->backend), NULL);
> -    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nicinfo->backend));
> +                                 libxl__sprintf(gc, "%s/frontend", nicinfo->backend), NULL);
> +    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend-id", nicinfo->backend));
>      nicinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return 0;
>  }
> 
> @@ -1825,7 +1825,7 @@ static int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid,
> 
>  int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      flexarray_t *front;
>      flexarray_t *back;
>      libxl__device device;
> @@ -1842,64 +1842,64 @@ int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
>          goto out_free;
>      }
> 
> -    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
> +    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
>      if (rc != 0) goto out_free;
> 
>      flexarray_append(back, "frontend-id");
> -    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
> +    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
>      flexarray_append(back, "online");
>      flexarray_append(back, "1");
>      flexarray_append(back, "state");
> -    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
> +    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
>      flexarray_append(back, "domain");
> -    flexarray_append(back, libxl__domid_to_name(&gc, domid));
> +    flexarray_append(back, libxl__domid_to_name(gc, domid));
> 
>      flexarray_append(front, "backend-id");
> -    flexarray_append(front, libxl__sprintf(&gc, "%d", vkb->backend_domid));
> +    flexarray_append(front, libxl__sprintf(gc, "%d", vkb->backend_domid));
>      flexarray_append(front, "state");
> -    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
> +    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
> 
> -    libxl__device_generic_add(&gc, &device,
> -                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
> -                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
> +    libxl__device_generic_add(gc, &device,
> +                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
> +                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
>      rc = 0;
>  out_free:
>      flexarray_free(back);
>      flexarray_free(front);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid,
>                              libxl_device_vkb *vkb)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl__device device;
>      int rc;
> 
> -    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
> +    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
>      if (rc != 0) goto out;
> 
> -    rc = libxl__device_remove(&gc, &device, 1);
> +    rc = libxl__device_remove(gc, &device, 1);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid,
>                                    libxl_device_vkb *vkb)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl__device device;
>      int rc;
> 
> -    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
> +    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
>      if (rc != 0) goto out;
> 
> -    rc = libxl__device_destroy(&gc, &device);
> +    rc = libxl__device_destroy(gc, &device);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -1935,7 +1935,7 @@ static int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid,
> 
>  int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      flexarray_t *front;
>      flexarray_t *back;
>      libxl__device device;
> @@ -1952,20 +1952,20 @@ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
>          goto out_free;
>      }
> 
> -    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
> +    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
>      if (rc != 0) goto out_free;
> 
> -    flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid));
> +    flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", domid));
>      flexarray_append_pair(back, "online", "1");
> -    flexarray_append_pair(back, "state", libxl__sprintf(&gc, "%d", 1));
> -    flexarray_append_pair(back, "domain", libxl__domid_to_name(&gc, domid));
> -    flexarray_append_pair(back, "vnc", libxl__sprintf(&gc, "%d", vfb->vnc));
> +    flexarray_append_pair(back, "state", libxl__sprintf(gc, "%d", 1));
> +    flexarray_append_pair(back, "domain", libxl__domid_to_name(gc, domid));
> +    flexarray_append_pair(back, "vnc", libxl__sprintf(gc, "%d", vfb->vnc));
>      flexarray_append_pair(back, "vnclisten", vfb->vnclisten);
>      flexarray_append_pair(back, "vncpasswd", vfb->vncpasswd);
> -    flexarray_append_pair(back, "vncdisplay", libxl__sprintf(&gc, "%d", vfb->vncdisplay));
> -    flexarray_append_pair(back, "vncunused", libxl__sprintf(&gc, "%d", vfb->vncunused));
> -    flexarray_append_pair(back, "sdl", libxl__sprintf(&gc, "%d", vfb->sdl));
> -    flexarray_append_pair(back, "opengl", libxl__sprintf(&gc, "%d", vfb->opengl));
> +    flexarray_append_pair(back, "vncdisplay", libxl__sprintf(gc, "%d", vfb->vncdisplay));
> +    flexarray_append_pair(back, "vncunused", libxl__sprintf(gc, "%d", vfb->vncunused));
> +    flexarray_append_pair(back, "sdl", libxl__sprintf(gc, "%d", vfb->sdl));
> +    flexarray_append_pair(back, "opengl", libxl__sprintf(gc, "%d", vfb->opengl));
>      if (vfb->xauthority) {
>          flexarray_append_pair(back, "xauthority", vfb->xauthority);
>      }
> @@ -1973,50 +1973,50 @@ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
>          flexarray_append_pair(back, "display", vfb->display);
>      }
> 
> -    flexarray_append_pair(front, "backend-id", libxl__sprintf(&gc, "%d", vfb->backend_domid));
> -    flexarray_append_pair(front, "state", libxl__sprintf(&gc, "%d", 1));
> +    flexarray_append_pair(front, "backend-id", libxl__sprintf(gc, "%d", vfb->backend_domid));
> +    flexarray_append_pair(front, "state", libxl__sprintf(gc, "%d", 1));
> 
> -    libxl__device_generic_add(&gc, &device,
> -                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
> -                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
> +    libxl__device_generic_add(gc, &device,
> +                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
> +                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
>      rc = 0;
>  out_free:
>      flexarray_free(front);
>      flexarray_free(back);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid,
>                              libxl_device_vfb *vfb)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl__device device;
>      int rc;
> 
> -    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
> +    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
>      if (rc != 0) goto out;
> 
> -    rc = libxl__device_remove(&gc, &device, 1);
> +    rc = libxl__device_remove(gc, &device, 1);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid,
>                                    libxl_device_vfb *vfb)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl__device device;
>      int rc;
> 
> -    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
> +    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
>      if (rc != 0) goto out;
> 
> -    rc = libxl__device_destroy(&gc, &device);
> +    rc = libxl__device_destroy(gc, &device);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -2024,13 +2024,13 @@ out:
> 
>  int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *mem, *endptr;
>      uint32_t memorykb;
> -    char *dompath = libxl__xs_get_dompath(&gc, domid);
> +    char *dompath = libxl__xs_get_dompath(gc, domid);
>      int rc = 1;
> 
> -    mem = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/memory/target", dompath));
> +    mem = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/memory/target", dompath));
>      if (!mem) {
>          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot get memory info from %s/memory/target\n", dompath);
>          goto out;
> @@ -2055,7 +2055,7 @@ int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
> 
>      rc = 0;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -2163,12 +2163,12 @@ retry:
>  int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid,
>          int32_t target_memkb, int relative, int enforce)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc = 1, abort = 0;
>      uint32_t memorykb = 0, videoram = 0;
>      uint32_t current_target_memkb = 0, new_target_memkb = 0;
>      char *memmax, *endptr, *videoram_s = NULL, *target = NULL;
> -    char *dompath = libxl__xs_get_dompath(&gc, domid);
> +    char *dompath = libxl__xs_get_dompath(gc, domid);
>      xc_domaininfo_t info;
>      libxl_dominfo ptr;
>      char *uuid;
> @@ -2177,11 +2177,11 @@ int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid,
>  retry_transaction:
>      t = xs_transaction_start(ctx->xsh);
> 
> -    target = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
> +    target = libxl__xs_read(gc, t, libxl__sprintf(gc,
>                  "%s/memory/target", dompath));
>      if (!target && !domid) {
>          xs_transaction_end(ctx->xsh, t, 1);
> -        rc = libxl__fill_dom0_memory_info(&gc, &current_target_memkb);
> +        rc = libxl__fill_dom0_memory_info(gc, &current_target_memkb);
>          if (rc < 0) {
>              abort = 1;
>              goto out;
> @@ -2203,7 +2203,7 @@ retry_transaction:
>              goto out;
>          }
>      }
> -    memmax = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
> +    memmax = libxl__xs_read(gc, t, libxl__sprintf(gc,
>                  "%s/memory/static-max", dompath));
>      if (!memmax) {
>          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
> @@ -2243,7 +2243,7 @@ retry_transaction:
>          abort = 1;
>          goto out;
>      }
> -    videoram_s = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
> +    videoram_s = libxl__xs_read(gc, t, libxl__sprintf(gc,
>                  "%s/memory/videoram", dompath));
>      videoram = videoram_s ? atoi(videoram_s) : 0;
> 
> @@ -2272,7 +2272,7 @@ retry_transaction:
>          goto out;
>      }
> 
> -    libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/memory/target",
> +    libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/memory/target",
>                  dompath), "%"PRIu32, new_target_memkb);
>      rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info);
>      if (rc != 1 || info.domain != domid) {
> @@ -2280,8 +2280,8 @@ retry_transaction:
>          goto out;
>      }
>      xcinfo2xlinfo(&info, &ptr);
> -    uuid = libxl__uuid2string(&gc, ptr.uuid);
> -    libxl__xs_write(&gc, t, libxl__sprintf(&gc, "/vm/%s/memory", uuid),
> +    uuid = libxl__uuid2string(gc, ptr.uuid);
> +    libxl__xs_write(gc, t, libxl__sprintf(gc, "/vm/%s/memory", uuid),
>              "%"PRIu32, new_target_memkb / 1024);
> 
>  out:
> @@ -2289,22 +2289,22 @@ out:
>          if (errno == EAGAIN)
>              goto retry_transaction;
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc = 1;
>      char *target = NULL, *endptr = NULL;
> -    char *dompath = libxl__xs_get_dompath(&gc, domid);
> +    char *dompath = libxl__xs_get_dompath(gc, domid);
>      uint32_t target_memkb;
> 
> -    target = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc,
> +    target = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc,
>                  "%s/memory/target", dompath));
>      if (!target && !domid) {
> -        rc = libxl__fill_dom0_memory_info(&gc, &target_memkb);
> +        rc = libxl__fill_dom0_memory_info(gc, &target_memkb);
>          if (rc < 0)
>              goto out;
>      } else if (!target) {
> @@ -2325,14 +2325,14 @@ int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target
>      rc = 0;
> 
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
>          libxl_device_model_info *dm_info, uint32_t *need_memkb)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc = ERROR_INVAL;
>      *need_memkb = b_info->target_memkb;
>      switch (b_info->type) {
> @@ -2351,7 +2351,7 @@ int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
>          *need_memkb += (2 * 1024) - (*need_memkb % (2 * 1024));
>      rc = 0;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
> 
>  }
> @@ -2361,12 +2361,12 @@ int libxl_get_free_memory(libxl_ctx *ctx, uint32_t *memkb)
>      int rc = 0;
>      libxl_physinfo info;
>      uint32_t freemem_slack;
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
> 
>      rc = libxl_get_physinfo(ctx, &info);
>      if (rc < 0)
>          goto out;
> -    rc = libxl__get_free_memory_slack(&gc, &freemem_slack);
> +    rc = libxl__get_free_memory_slack(gc, &freemem_slack);
>      if (rc < 0)
>          goto out;
> 
> @@ -2376,7 +2376,7 @@ int libxl_get_free_memory(libxl_ctx *ctx, uint32_t *memkb)
>          *memkb = 0;
> 
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -2386,9 +2386,9 @@ int libxl_wait_for_free_memory(libxl_ctx *ctx, uint32_t domid, uint32_t
>      int rc = 0;
>      libxl_physinfo info;
>      uint32_t freemem_slack;
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
> 
> -    rc = libxl__get_free_memory_slack(&gc, &freemem_slack);
> +    rc = libxl__get_free_memory_slack(gc, &freemem_slack);
>      if (rc < 0)
>          goto out;
>      while (wait_secs > 0) {
> @@ -2405,7 +2405,7 @@ int libxl_wait_for_free_memory(libxl_ctx *ctx, uint32_t domid, uint32_t
>      rc = ERROR_NOMEM;
> 
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -2631,7 +2631,7 @@ int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid,
> 
>  int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl_dominfo info;
>      char *dompath;
>      xs_transaction_t t;
> @@ -2641,14 +2641,14 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap)
>          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
>          goto out;
>      }
> -    if (!(dompath = libxl__xs_get_dompath(&gc, domid)))
> +    if (!(dompath = libxl__xs_get_dompath(gc, domid)))
>          goto out;
> 
>  retry_transaction:
>      t = xs_transaction_start(ctx->xsh);
>      for (i = 0; i <= info.vcpu_max_id; i++)
> -        libxl__xs_write(&gc, t,
> -                       libxl__sprintf(&gc, "%s/cpu/%u/availability", dompath, i),
> +        libxl__xs_write(gc, t,
> +                       libxl__sprintf(gc, "%s/cpu/%u/availability", dompath, i),
>                         "%s", libxl_cpumap_test(cpumap, i) ? "online" : "offline");
>      if (!xs_transaction_end(ctx->xsh, t, 0)) {
>          if (errno == EAGAIN)
> @@ -2656,7 +2656,7 @@ retry_transaction:
>      } else
>          rc = 0;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -2776,12 +2776,12 @@ int libxl_send_trigger(libxl_ctx *ctx, uint32_t domid, char *trigger_name, uint3
> 
>  int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> -    char *dompath = libxl__xs_get_dompath(&gc, domid);
> +    GC_INIT(ctx);
> +    char *dompath = libxl__xs_get_dompath(gc, domid);
> 
> -    libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/control/sysrq", dompath), "%c", sysrq);
> +    libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "%s/control/sysrq", dompath), "%c", sysrq);
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return 0;
>  }
> 
> @@ -2868,15 +2868,15 @@ void libxl_xen_console_read_finish(libxl_ctx *ctx,
> 
>  uint32_t libxl_vm_get_start_time(libxl_ctx *ctx, uint32_t domid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> -    char *dompath = libxl__xs_get_dompath(&gc, domid);
> +    GC_INIT(ctx);
> +    char *dompath = libxl__xs_get_dompath(gc, domid);
>      char *vm_path, *start_time;
>      uint32_t ret;
> 
>      vm_path = libxl__xs_read(
> -        &gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dompath));
> +        gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dompath));
>      start_time = libxl__xs_read(
> -        &gc, XBT_NULL, libxl__sprintf(&gc, "%s/start_time", vm_path));
> +        gc, XBT_NULL, libxl__sprintf(gc, "%s/start_time", vm_path));
>      if (start_time == NULL) {
>          LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, -1,
>                          "Can't get start time of domain '%d'", domid);
> @@ -2884,7 +2884,7 @@ uint32_t libxl_vm_get_start_time(libxl_ctx *ctx, uint32_t domid)
>      }else{
>          ret = strtoul(start_time, NULL, 10);
>      }
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return ret;
>  }
> 
> @@ -3037,15 +3037,15 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
>                           libxl_cpumap cpumap, libxl_uuid *uuid,
>                           uint32_t *poolid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc;
>      int i;
>      xs_transaction_t t;
>      char *uuid_string;
> 
> -    uuid_string = libxl__uuid2string(&gc, *uuid);
> +    uuid_string = libxl__uuid2string(gc, *uuid);
>      if (!uuid_string) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_NOMEM;
>      }
> 
> @@ -3053,7 +3053,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
>      if (rc) {
>          LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
>             "Could not create cpupool");
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_FAIL;
>      }
> 
> @@ -3064,7 +3064,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
>                  LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
>                      "Error moving cpu to cpupool");
>                  libxl_cpupool_destroy(ctx, *poolid);
> -                libxl__free_all(&gc);
> +                GC_FREE;
>                  return ERROR_FAIL;
>              }
>          }
> @@ -3072,16 +3072,16 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
>      for (;;) {
>          t = xs_transaction_start(ctx->xsh);
> 
> -        xs_mkdir(ctx->xsh, t, libxl__sprintf(&gc, "/local/pool/%d", *poolid));
> -        libxl__xs_write(&gc, t,
> -                        libxl__sprintf(&gc, "/local/pool/%d/uuid", *poolid),
> +        xs_mkdir(ctx->xsh, t, libxl__sprintf(gc, "/local/pool/%d", *poolid));
> +        libxl__xs_write(gc, t,
> +                        libxl__sprintf(gc, "/local/pool/%d/uuid", *poolid),
>                          "%s", uuid_string);
> -        libxl__xs_write(&gc, t,
> -                        libxl__sprintf(&gc, "/local/pool/%d/name", *poolid),
> +        libxl__xs_write(gc, t,
> +                        libxl__sprintf(gc, "/local/pool/%d/name", *poolid),
>                          "%s", name);
> 
>          if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) {
> -            libxl__free_all(&gc);
> +            GC_FREE;
>              return 0;
>          }
>      }
> @@ -3089,7 +3089,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
> 
>  int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc, i;
>      xc_cpupoolinfo_t *info;
>      xs_transaction_t t;
> @@ -3097,7 +3097,7 @@ int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
> 
>      info = xc_cpupool_getinfo(ctx->xch, poolid);
>      if (info == NULL) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_NOMEM;
>      }
> 
> @@ -3131,7 +3131,7 @@ int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
>      for (;;) {
>          t = xs_transaction_start(ctx->xsh);
> 
> -        xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "/local/pool/%d", poolid));
> +        xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "/local/pool/%d", poolid));
> 
>          if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN))
>              break;
> @@ -3143,21 +3143,21 @@ out1:
>      libxl_cpumap_dispose(&cpumap);
>  out:
>      xc_cpupool_infofree(ctx->xch, info);
> -    libxl__free_all(&gc);
> +    GC_FREE;
> 
>      return rc;
>  }
> 
>  int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      xs_transaction_t t;
>      xc_cpupoolinfo_t *info;
>      int rc;
> 
>      info = xc_cpupool_getinfo(ctx->xch, poolid);
>      if (info == NULL) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_NOMEM;
>      }
> 
> @@ -3170,8 +3170,8 @@ int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
>      for (;;) {
>          t = xs_transaction_start(ctx->xsh);
> 
> -        libxl__xs_write(&gc, t,
> -                        libxl__sprintf(&gc, "/local/pool/%d/name", poolid),
> +        libxl__xs_write(gc, t,
> +                        libxl__sprintf(gc, "/local/pool/%d/name", poolid),
>                          "%s", name);
> 
>          if (xs_transaction_end(ctx->xsh, t, 0))
> @@ -3186,7 +3186,7 @@ int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
> 
>  out:
>      xc_cpupool_infofree(ctx->xch, info);
> -    libxl__free_all(&gc);
> +    GC_FREE;
> 
>      return rc;
>  }
> @@ -3293,16 +3293,16 @@ out:
> 
>  int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc;
>      char *dom_path;
>      char *vm_path;
>      char *poolname;
>      xs_transaction_t t;
> 
> -    dom_path = libxl__xs_get_dompath(&gc, domid);
> +    dom_path = libxl__xs_get_dompath(gc, domid);
>      if (!dom_path) {
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_FAIL;
>      }
> 
> @@ -3310,26 +3310,26 @@ int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid)
>      if (rc) {
>          LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
>              "Error moving domain to cpupool");
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          return ERROR_FAIL;
>      }
> 
>      for (;;) {
>          t = xs_transaction_start(ctx->xsh);
> 
> -        poolname = libxl__cpupoolid_to_name(&gc, poolid);
> -        vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
> +        poolname = libxl__cpupoolid_to_name(gc, poolid);
> +        vm_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path));
>          if (!vm_path)
>              break;
> 
> -        libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/pool_name", vm_path),
> +        libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/pool_name", vm_path),
>                          "%s", poolname);
> 
>          if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN))
>              break;
>      }
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return 0;
>  }
> 
> diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c
> index b8399a1..ce83b8e 100644
> --- a/tools/libxl/libxl_bootloader.c
> +++ b/tools/libxl/libxl_bootloader.c
> @@ -328,7 +328,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
>                           libxl_device_disk *disk,
>                           uint32_t domid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int ret, rc = 0;
>      char *fifo = NULL;
>      char *diskpath = NULL;
> @@ -388,7 +388,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
>          goto out_close;
>      }
> 
> -    args = make_bootloader_args(&gc, info, domid, fifo, diskpath);
> +    args = make_bootloader_args(gc, info, domid, fifo, diskpath);
>      if (args == NULL) {
>          rc = ERROR_NOMEM;
>          goto out_close;
> @@ -411,8 +411,8 @@ int libxl_run_bootloader(libxl_ctx *ctx,
>          goto out_close;
>      }
> 
> -    dom_console_xs_path = libxl__sprintf(&gc, "%s/console/tty", libxl__xs_get_dompath(&gc, domid));
> -    libxl__xs_write(&gc, XBT_NULL, dom_console_xs_path, "%s", dom_console_slave_tty_path);
> +    dom_console_xs_path = libxl__sprintf(gc, "%s/console/tty", libxl__xs_get_dompath(gc, domid));
> +    libxl__xs_write(gc, XBT_NULL, dom_console_xs_path, "%s", dom_console_slave_tty_path);
> 
>      pid = fork_exec_bootloader(&bootloader_fd, info->u.pv.bootloader, args);
>      if (pid < 0) {
> @@ -435,7 +435,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
> 
>      fcntl(fifo_fd, F_SETFL, O_NDELAY);
> 
> -    blout = bootloader_interact(&gc, xenconsoled_fd, bootloader_fd, fifo_fd);
> +    blout = bootloader_interact(gc, xenconsoled_fd, bootloader_fd, fifo_fd);
>      if (blout == NULL) {
>          goto out_close;
>      }
> @@ -445,7 +445,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
>          goto out_close;
>      }
> 
> -    parse_bootloader_result(&gc, info, blout);
> +    parse_bootloader_result(gc, info, blout);
> 
>      rc = 0;
>  out_close:
> @@ -472,7 +472,7 @@ out_close:
>      free(args);
> 
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index ccb56c7..69f10fe 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -670,20 +670,20 @@ error_out:
>  int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config,
>                              libxl_console_ready cb, void *priv, uint32_t *domid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc;
> -    rc = do_domain_create(&gc, d_config, cb, priv, domid, -1);
> -    libxl__free_all(&gc);
> +    rc = do_domain_create(gc, d_config, cb, priv, domid, -1);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_domain_create_restore(libxl_ctx *ctx, libxl_domain_config *d_config,
>                                  libxl_console_ready cb, void *priv, uint32_t *domid, int restore_fd)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc;
> -    rc = do_domain_create(&gc, d_config, cb, priv, domid, restore_fd);
> -    libxl__free_all(&gc);
> +    rc = do_domain_create(gc, d_config, cb, priv, domid, restore_fd);
> +    GC_FREE;
>      return rc;
>  }
> 
> diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> index 96098de..b1ff967 100644
> --- a/tools/libxl/libxl_dom.c
> +++ b/tools/libxl/libxl_dom.c
> @@ -730,7 +730,7 @@ int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
>                                const char *userdata_userid,
>                                const uint8_t *data, int datalen)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      const char *filename;
>      const char *newfilename;
>      int e, rc;
> @@ -738,18 +738,18 @@ int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
>      FILE *f = NULL;
>      size_t rs;
> 
> -    filename = userdata_path(&gc, domid, userdata_userid, "d");
> +    filename = userdata_path(gc, domid, userdata_userid, "d");
>      if (!filename) {
>          rc = ERROR_NOMEM;
>          goto out;
>      }
> 
>      if (!datalen) {
> -        rc = userdata_delete(&gc, filename);
> +        rc = userdata_delete(gc, filename);
>          goto out;
>      }
> 
> -    newfilename = userdata_path(&gc, domid, userdata_userid, "n");
> +    newfilename = userdata_path(gc, domid, userdata_userid, "n");
>      if (!newfilename) {
>          rc = ERROR_NOMEM;
>          goto out;
> @@ -791,7 +791,7 @@ err:
>          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot write %s for %s",
>                   newfilename, filename);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -799,13 +799,13 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid,
>                                   const char *userdata_userid,
>                                   uint8_t **data_r, int *datalen_r)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      const char *filename;
>      int e, rc;
>      int datalen = 0;
>      void *data = 0;
> 
> -    filename = userdata_path(&gc, domid, userdata_userid, "d");
> +    filename = userdata_path(gc, domid, userdata_userid, "d");
>      if (!filename) {
>          rc = ERROR_NOMEM;
>          goto out;
> @@ -827,7 +827,7 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid,
>      if (datalen_r) *datalen_r = datalen;
>      rc = 0;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
> index 63c3050..120c239 100644
> --- a/tools/libxl/libxl_pci.c
> +++ b/tools/libxl/libxl_pci.c
> @@ -483,7 +483,7 @@ static int is_assigned(libxl_device_pci *assigned, int num_assigned,
> 
>  libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      libxl_device_pci *pcidevs = NULL, *new, *assigned;
>      struct dirent *de;
>      DIR *dir;
> @@ -491,7 +491,7 @@ libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
> 
>      *num = 0;
> 
> -    rc = get_all_assigned_devices(&gc, &assigned, &num_assigned);
> +    rc = get_all_assigned_devices(gc, &assigned, &num_assigned);
>      if ( rc )
>          goto out;
> 
> @@ -528,7 +528,7 @@ libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
>  out_closedir:
>      closedir(dir);
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return pcidevs;
>  }
> 
> @@ -782,10 +782,10 @@ static int libxl__device_pci_reset(libxl__gc *gc, unsigned int domain, unsigned
> 
>  int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc;
> -    rc = libxl__device_pci_add(&gc, domid, pcidev, 0);
> -    libxl__free_all(&gc);
> +    rc = libxl__device_pci_add(gc, domid, pcidev, 0);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -1057,24 +1057,24 @@ out:
> 
>  int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc;
> 
> -    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 0);
> +    rc = libxl__device_pci_remove_common(gc, domid, pcidev, 0);
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
>  int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid,
>                                    libxl_device_pci *pcidev)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      int rc;
> 
> -    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 1);
> +    rc = libxl__device_pci_remove_common(gc, domid, pcidev, 1);
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> @@ -1115,15 +1115,15 @@ static void libxl__device_pci_from_xs_be(libxl__gc *gc,
> 
>  libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *be_path, *num_devs;
>      int n, i;
>      libxl_device_pci *pcidevs = NULL;
> 
>      *num = 0;
> 
> -    be_path = libxl__sprintf(&gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(&gc, 0), domid);
> -    num_devs = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/num_devs", be_path));
> +    be_path = libxl__sprintf(gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(gc, 0), domid);
> +    num_devs = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/num_devs", be_path));
>      if (!num_devs)
>          goto out;
> 
> @@ -1131,11 +1131,11 @@ libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num
>      pcidevs = calloc(n, sizeof(libxl_device_pci));
> 
>      for (i = 0; i < n; i++)
> -        libxl__device_pci_from_xs_be(&gc, be_path, pcidevs + i, i);
> +        libxl__device_pci_from_xs_be(gc, be_path, pcidevs + i, i);
> 
>      *num = n;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return pcidevs;
>  }
> 
> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
> index c7696d7..60af98c 100644
> --- a/tools/libxl/libxl_qmp.c
> +++ b/tools/libxl/libxl_qmp.c
> @@ -94,7 +94,7 @@ static int store_serial_port_info(libxl__qmp_handler *qmp,
>                                    const char *chardev,
>                                    int port)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
> +    GC_INIT(qmp->ctx);
>      char *path = NULL;
>      int ret = 0;
> 
> @@ -102,12 +102,12 @@ static int store_serial_port_info(libxl__qmp_handler *qmp,
>          return 0;
>      }
> 
> -    path = libxl__xs_get_dompath(&gc, qmp->domid);
> -    path = libxl__sprintf(&gc, "%s/serial/%d/tty", path, port);
> +    path = libxl__xs_get_dompath(gc, qmp->domid);
> +    path = libxl__sprintf(gc, "%s/serial/%d/tty", path, port);
> 
> -    ret = libxl__xs_write(&gc, XBT_NULL, path, "%s", chardev + 4);
> +    ret = libxl__xs_write(gc, XBT_NULL, path, "%s", chardev + 4);
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return ret;
>  }
> 
> @@ -521,7 +521,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
>  {
>      int id = 0;
>      int ret = 0;
> -    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
> +    GC_INIT(qmp->ctx);
>      qmp_request_context context = { .rc = 0 };
> 
>      id = qmp_send(qmp, cmd, args, callback, opaque, &context);
> @@ -531,7 +531,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
>      qmp->wait_for_id = id;
> 
>      while (qmp->wait_for_id == id) {
> -        if ((ret = qmp_next(&gc, qmp)) < 0) {
> +        if ((ret = qmp_next(gc, qmp)) < 0) {
>              break;
>          }
>      }
> @@ -540,7 +540,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
>          ret = context.rc;
>      }
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
> 
>      return ret;
>  }
> @@ -559,15 +559,15 @@ libxl__qmp_handler *libxl__qmp_initialize(libxl_ctx *ctx, uint32_t domid)
>      int ret = 0;
>      libxl__qmp_handler *qmp = NULL;
>      char *qmp_socket;
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
> 
>      qmp = qmp_init_handler(ctx, domid);
> 
> -    qmp_socket = libxl__sprintf(&gc, "%s/qmp-libxl-%d",
> +    qmp_socket = libxl__sprintf(gc, "%s/qmp-libxl-%d",
>                                  libxl_run_dir_path(), domid);
>      if ((ret = qmp_open(qmp, qmp_socket, QMP_SOCKET_CONNECT_TIMEOUT)) < 0) {
>          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Connection error");
> -        libxl__free_all(&gc);
> +        GC_FREE;
>          qmp_free_handler(qmp);
>          return NULL;
>      }
> @@ -576,12 +576,12 @@ libxl__qmp_handler *libxl__qmp_initialize(libxl_ctx *ctx, uint32_t domid)
> 
>      /* Wait for the response to qmp_capabilities */
>      while (!qmp->connected) {
> -        if ((ret = qmp_next(&gc, qmp)) < 0) {
> +        if ((ret = qmp_next(gc, qmp)) < 0) {
>              break;
>          }
>      }
> 
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      if (!qmp->connected) {
>          LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Failed to connect to QMP");
>          libxl__qmp_close(qmp);
> @@ -626,9 +626,9 @@ static int pci_add_callback(libxl__qmp_handler *qmp,
>  {
>      libxl_device_pci *pcidev = opaque;
>      const libxl__json_object *bus = NULL;
> -    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
> +    GC_INIT(qmp->ctx);
>      int i, j, rc = -1;
> -    char *asked_id = libxl__sprintf(&gc, PCI_PT_QDEV_ID,
> +    char *asked_id = libxl__sprintf(gc, PCI_PT_QDEV_ID,
>                                      pcidev->bus, pcidev->dev, pcidev->func);
> 
>      for (i = 0; (bus = libxl__json_array_get(response, i)); i++) {
> @@ -665,7 +665,7 @@ static int pci_add_callback(libxl__qmp_handler *qmp,
> 
> 
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
> index f1f2a6d..d36c737 100644
> --- a/tools/libxl/libxl_utils.c
> +++ b/tools/libxl/libxl_utils.c
> @@ -186,29 +186,29 @@ char *libxl_schedid_to_name(libxl_ctx *ctx, int schedid)
> 
>  int libxl_get_stubdom_id(libxl_ctx *ctx, int guest_domid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char * stubdom_id_s;
>      int ret;
> 
> -    stubdom_id_s = libxl__xs_read(&gc, XBT_NULL,
> -                                 libxl__sprintf(&gc, "%s/image/device-model-domid",
> -                                               libxl__xs_get_dompath(&gc, guest_domid)));
> +    stubdom_id_s = libxl__xs_read(gc, XBT_NULL,
> +                                 libxl__sprintf(gc, "%s/image/device-model-domid",
> +                                               libxl__xs_get_dompath(gc, guest_domid)));
>      if (stubdom_id_s)
>          ret = atoi(stubdom_id_s);
>      else
>          ret = 0;
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return ret;
>  }
> 
>  int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      char *target, *endptr;
>      uint32_t value;
>      int ret = 0;
> 
> -    target = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/target", libxl__xs_get_dompath(&gc, domid)));
> +    target = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/target", libxl__xs_get_dompath(gc, domid)));
>      if (!target)
>          goto out;
>      value = strtol(target, &endptr, 10);
> @@ -218,7 +218,7 @@ int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid)
>          *target_domid = value;
>      ret = 1;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return ret;
>  }
> 
> @@ -240,27 +240,27 @@ static int logrename(libxl__gc *gc, const char *old, const char *new)
> 
>  int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name)
>  {
> -    libxl__gc gc = LIBXL_INIT_GC(ctx);
> +    GC_INIT(ctx);
>      struct stat stat_buf;
>      char *logfile, *logfile_new;
>      int i, rc;
> 
> -    logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log", name);
> +    logfile = libxl__sprintf(gc, "/var/log/xen/%s.log", name);
>      if (stat(logfile, &stat_buf) == 0) {
>          /* file exists, rotate */
> -        logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log.10", name);
> +        logfile = libxl__sprintf(gc, "/var/log/xen/%s.log.10", name);
>          unlink(logfile);
>          for (i = 9; i > 0; i--) {
> -            logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i);
> -            logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i + 1);
> -            rc = logrename(&gc, logfile, logfile_new);
> +            logfile = libxl__sprintf(gc, "/var/log/xen/%s.log.%d", name, i);
> +            logfile_new = libxl__sprintf(gc, "/var/log/xen/%s.log.%d", name, i + 1);
> +            rc = logrename(gc, logfile, logfile_new);
>              if (rc)
>                  goto out;
>          }
> -        logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log", name);
> -        logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.1", name);
> +        logfile = libxl__sprintf(gc, "/var/log/xen/%s.log", name);
> +        logfile_new = libxl__sprintf(gc, "/var/log/xen/%s.log.1", name);
> 
> -        rc = logrename(&gc, logfile, logfile_new);
> +        rc = logrename(gc, logfile, logfile_new);
>          if (rc)
>              goto out;
>      } else {
> @@ -272,7 +272,7 @@ int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name)
>      *full_name = strdup(logfile);
>      rc = 0;
>  out:
> -    libxl__free_all(&gc);
> +    GC_FREE;
>      return rc;
>  }
> 
> --
> 1.7.2.5
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Dec 09 13:14:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Fri, 09 Dec 2011 13:14:30 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RZ0HE-0002Mh-5W; Fri, 09 Dec 2011 13:14:12 +0000
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Stefano.Stabellini@eu.citrix.com>)
	id 1RZ0HC-0002I6-Gv
	for xen-devel@lists.xensource.com; Fri, 09 Dec 2011 13:14:11 +0000
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1323436384!4910711!6
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAyMTkxNzY=\n
X-StarScan-Version: 6.4.2; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30724 invoked from network); 9 Dec 2011 13:13:19 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2011 13:13:19 -0000
X-IronPort-AV: E=Sophos;i="4.71,325,1320642000"; d="scan'208";a="173546260"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Dec 2011 08:13:18 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.213.0; Fri, 9 Dec 2011 08:13:17 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pB9DCpDt008248;
	Fri, 9 Dec 2011 05:13:05 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Fri, 9 Dec 2011 13:13:12 +0000
Message-ID: <1323436408-16335-9-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <alpine.DEB.2.00.1112091208420.3517@kaball-desktop>
References: <alpine.DEB.2.00.1112091208420.3517@kaball-desktop>
MIME-Version: 1.0
Cc: keir.xen@gmail.com, Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>, JBeulich@suse.com,
	Tim.Deegan@citrix.com
Subject: [Xen-devel] [PATCH v2 09/25] arm: header files
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

A simple implementation of everything under asm-arm and arch-arm.h; some
of these files are shamelessly taken from Linux.


Changes in v2:

- remove div64.


Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
---
 xen/include/asm-arm/atomic.h      |  212 +++++++++++++++++++++++++++++
 xen/include/asm-arm/bitops.h      |  195 +++++++++++++++++++++++++++
 xen/include/asm-arm/bug.h         |   15 ++
 xen/include/asm-arm/byteorder.h   |   16 +++
 xen/include/asm-arm/cache.h       |   20 +++
 xen/include/asm-arm/config.h      |  122 +++++++++++++++++
 xen/include/asm-arm/cpregs.h      |  207 ++++++++++++++++++++++++++++
 xen/include/asm-arm/current.h     |   60 ++++++++
 xen/include/asm-arm/debugger.h    |   15 ++
 xen/include/asm-arm/delay.h       |   15 ++
 xen/include/asm-arm/desc.h        |   12 ++
 xen/include/asm-arm/div64.h       |  235 ++++++++++++++++++++++++++++++++
 xen/include/asm-arm/elf.h         |   33 +++++
 xen/include/asm-arm/event.h       |   41 ++++++
 xen/include/asm-arm/flushtlb.h    |   31 +++++
 xen/include/asm-arm/grant_table.h |   35 +++++
 xen/include/asm-arm/hardirq.h     |   28 ++++
 xen/include/asm-arm/hypercall.h   |   24 ++++
 xen/include/asm-arm/init.h        |   12 ++
 xen/include/asm-arm/io.h          |   12 ++
 xen/include/asm-arm/iocap.h       |   20 +++
 xen/include/asm-arm/multicall.h   |   23 +++
 xen/include/asm-arm/nmi.h         |   15 ++
 xen/include/asm-arm/numa.h        |   21 +++
 xen/include/asm-arm/paging.h      |   13 ++
 xen/include/asm-arm/percpu.h      |   28 ++++
 xen/include/asm-arm/processor.h   |  269 +++++++++++++++++++++++++++++++++++++
 xen/include/asm-arm/regs.h        |   43 ++++++
 xen/include/asm-arm/setup.h       |   16 +++
 xen/include/asm-arm/smp.h         |   25 ++++
 xen/include/asm-arm/softirq.h     |   15 ++
 xen/include/asm-arm/spinlock.h    |  144 ++++++++++++++++++++
 xen/include/asm-arm/string.h      |   38 +++++
 xen/include/asm-arm/system.h      |  202 ++++++++++++++++++++++++++++
 xen/include/asm-arm/trace.h       |   12 ++
 xen/include/asm-arm/types.h       |   57 ++++++++
 xen/include/asm-arm/xenoprof.h    |   12 ++
 xen/include/public/arch-arm.h     |  125 +++++++++++++++++
 xen/include/public/xen.h          |    2 +
 39 files changed, 2420 insertions(+), 0 deletions(-)
 create mode 100644 xen/include/asm-arm/atomic.h
 create mode 100644 xen/include/asm-arm/bitops.h
 create mode 100644 xen/include/asm-arm/bug.h
 create mode 100644 xen/include/asm-arm/byteorder.h
 create mode 100644 xen/include/asm-arm/cache.h
 create mode 100644 xen/include/asm-arm/config.h
 create mode 100644 xen/include/asm-arm/cpregs.h
 create mode 100644 xen/include/asm-arm/current.h
 create mode 100644 xen/include/asm-arm/debugger.h
 create mode 100644 xen/include/asm-arm/delay.h
 create mode 100644 xen/include/asm-arm/desc.h
 create mode 100644 xen/include/asm-arm/div64.h
 create mode 100644 xen/include/asm-arm/elf.h
 create mode 100644 xen/include/asm-arm/event.h
 create mode 100644 xen/include/asm-arm/flushtlb.h
 create mode 100644 xen/include/asm-arm/grant_table.h
 create mode 100644 xen/include/asm-arm/hardirq.h
 create mode 100644 xen/include/asm-arm/hypercall.h
 create mode 100644 xen/include/asm-arm/init.h
 create mode 100644 xen/include/asm-arm/io.h
 create mode 100644 xen/include/asm-arm/iocap.h
 create mode 100644 xen/include/asm-arm/multicall.h
 create mode 100644 xen/include/asm-arm/nmi.h
 create mode 100644 xen/include/asm-arm/numa.h
 create mode 100644 xen/include/asm-arm/paging.h
 create mode 100644 xen/include/asm-arm/percpu.h
 create mode 100644 xen/include/asm-arm/processor.h
 create mode 100644 xen/include/asm-arm/regs.h
 create mode 100644 xen/include/asm-arm/setup.h
 create mode 100644 xen/include/asm-arm/smp.h
 create mode 100644 xen/include/asm-arm/softirq.h
 create mode 100644 xen/include/asm-arm/spinlock.h
 create mode 100644 xen/include/asm-arm/string.h
 create mode 100644 xen/include/asm-arm/system.h
 create mode 100644 xen/include/asm-arm/trace.h
 create mode 100644 xen/include/asm-arm/types.h
 create mode 100644 xen/include/asm-arm/xenoprof.h
 create mode 100644 xen/include/public/arch-arm.h

diff --git a/xen/include/asm-arm/atomic.h b/xen/include/asm-arm/atomic.h
new file mode 100644
index 0000000..2b9ce0e
--- /dev/null
+++ b/xen/include/asm-arm/atomic.h
@@ -0,0 +1,212 @@
+/*
+ *  arch/arm/include/asm/atomic.h
+ *
+ *  Copyright (C) 1996 Russell King.
+ *  Copyright (C) 2002 Deep Blue Solutions Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef __ARCH_ARM_ATOMIC__
+#define __ARCH_ARM_ATOMIC__
+
+#include <xen/config.h>
+#include <asm/system.h>
+
+#define build_atomic_read(name, size, type, reg)   \
+static inline type name(const volatile type *addr) \
+{                                                  \
+    type ret;                                      \
+    asm volatile("ldr" size " %0,%1"               \
+                 : reg (ret)                       \
+                 : "m" (*(volatile type *)addr));  \
+    return ret;                                    \
+}
+
+#define build_atomic_write(name, size, type, reg)      \
+static inline void name(volatile type *addr, type val) \
+{                                                      \
+    asm volatile("str" size " %1,%0"                   \
+                 : "=m" (*(volatile type *)addr)       \
+                 : reg (val));                         \
+}
+
+build_atomic_read(atomic_read8, "b", uint8_t, "=q")
+build_atomic_read(atomic_read16, "h", uint16_t, "=r")
+build_atomic_read(atomic_read32, "", uint32_t, "=r")
+//build_atomic_read(atomic_read64, "d", uint64_t, "=r")
+build_atomic_read(atomic_read_int, "", int, "=r")
+
+build_atomic_write(atomic_write8, "b", uint8_t, "q")
+build_atomic_write(atomic_write16, "h", uint16_t, "r")
+build_atomic_write(atomic_write32, "", uint32_t, "r")
+//build_atomic_write(atomic_write64, "d", uint64_t, "r")
+build_atomic_write(atomic_write_int, "", int, "r")
+
+/*
+ * NB. I've pushed the volatile qualifier into the operations. This allows
+ * fast accessors such as _atomic_read() and _atomic_set() which don't give
+ * the compiler a fit.
+ */
+typedef struct { int counter; } atomic_t;
+
+#define ATOMIC_INIT(i) { (i) }
+
+/*
+ * On ARM, ordinary assignment (str instruction) doesn't clear the local
+ * strex/ldrex monitor on some implementations. The reason we can use it for
+ * atomic_set() is the clrex or dummy strex done on every exception return.
+ */
+#define _atomic_read(v) ((v).counter)
+#define atomic_read(v)  (*(volatile int *)&(v)->counter)
+
+#define _atomic_set(v,i) (((v).counter) = (i))
+#define atomic_set(v,i) (((v)->counter) = (i))
+
+/*
+ * ARMv6 UP and SMP safe atomic ops.  We use load exclusive and
+ * store exclusive to ensure that these are atomic.  We may loop
+ * to ensure that the update happens.
+ */
+static inline void atomic_add(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        __asm__ __volatile__("@ atomic_add\n"
+"1:     ldrex   %0, [%3]\n"
+"       add     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+}
+
+static inline int atomic_add_return(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        smp_mb();
+
+        __asm__ __volatile__("@ atomic_add_return\n"
+"1:     ldrex   %0, [%3]\n"
+"       add     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+
+        smp_mb();
+
+        return result;
+}
+
+static inline void atomic_sub(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        __asm__ __volatile__("@ atomic_sub\n"
+"1:     ldrex   %0, [%3]\n"
+"       sub     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+}
+
+static inline int atomic_sub_return(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        smp_mb();
+
+        __asm__ __volatile__("@ atomic_sub_return\n"
+"1:     ldrex   %0, [%3]\n"
+"       sub     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+
+        smp_mb();
+
+        return result;
+}
+
+static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
+{
+        unsigned long oldval, res;
+
+        smp_mb();
+
+        do {
+                __asm__ __volatile__("@ atomic_cmpxchg\n"
+                "ldrex  %1, [%3]\n"
+                "mov    %0, #0\n"
+                "teq    %1, %4\n"
+                "strexeq %0, %5, [%3]\n"
+                    : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter)
+                    : "r" (&ptr->counter), "Ir" (old), "r" (new)
+                    : "cc");
+        } while (res);
+
+        smp_mb();
+
+        return oldval;
+}
+
+static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
+{
+        unsigned long tmp, tmp2;
+
+        __asm__ __volatile__("@ atomic_clear_mask\n"
+"1:     ldrex   %0, [%3]\n"
+"       bic     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (tmp), "=&r" (tmp2), "+Qo" (*addr)
+        : "r" (addr), "Ir" (mask)
+        : "cc");
+}
+
+#define atomic_inc(v)           atomic_add(1, v)
+#define atomic_dec(v)           atomic_sub(1, v)
+
+#define atomic_inc_and_test(v)  (atomic_add_return(1, v) == 0)
+#define atomic_dec_and_test(v)  (atomic_sub_return(1, v) == 0)
+#define atomic_inc_return(v)    (atomic_add_return(1, v))
+#define atomic_dec_return(v)    (atomic_sub_return(1, v))
+#define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
+
+#define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0)
+
+static inline atomic_t atomic_compareandswap(
+    atomic_t old, atomic_t new, atomic_t *v)
+{
+    atomic_t rc;
+    rc.counter = __cmpxchg(&v->counter, old.counter, new.counter, sizeof(int));
+    return rc;
+}
+
+#endif /* __ARCH_ARM_ATOMIC__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/bitops.h b/xen/include/asm-arm/bitops.h
new file mode 100644
index 0000000..3d6b30b
--- /dev/null
+++ b/xen/include/asm-arm/bitops.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright 1995, Russell King.
+ * Various bits and pieces copyrights include:
+ *  Linus Torvalds (test_bit).
+ * Big endian support: Copyright 2001, Nicolas Pitre
+ *  reworked by rmk.
+ */
+
+#ifndef _ARM_BITOPS_H
+#define _ARM_BITOPS_H
+
+extern void _set_bit(int nr, volatile void * p);
+extern void _clear_bit(int nr, volatile void * p);
+extern void _change_bit(int nr, volatile void * p);
+extern int _test_and_set_bit(int nr, volatile void * p);
+extern int _test_and_clear_bit(int nr, volatile void * p);
+extern int _test_and_change_bit(int nr, volatile void * p);
+
+#define set_bit(n,p)              _set_bit(n,p)
+#define clear_bit(n,p)            _clear_bit(n,p)
+#define change_bit(n,p)           _change_bit(n,p)
+#define test_and_set_bit(n,p)     _test_and_set_bit(n,p)
+#define test_and_clear_bit(n,p)   _test_and_clear_bit(n,p)
+#define test_and_change_bit(n,p)  _test_and_change_bit(n,p)
+
+#define BIT(nr)                 (1UL << (nr))
+#define BIT_MASK(nr)            (1UL << ((nr) % BITS_PER_LONG))
+#define BIT_WORD(nr)            ((nr) / BITS_PER_LONG)
+#define BITS_PER_BYTE           8
+
+#define ADDR (*(volatile long *) addr)
+#define CONST_ADDR (*(const volatile long *) addr)
+
+/**
+ * __test_and_set_bit - Set a bit and return its old value
+ * @nr: Bit to set
+ * @addr: Address to count from
+ *
+ * This operation is non-atomic and can be reordered.
+ * If two examples of this operation race, one can appear to succeed
+ * but actually fail.  You must protect multiple accesses with a lock.
+ */
+static inline int __test_and_set_bit(int nr, volatile void *addr)
+{
+        unsigned long mask = BIT_MASK(nr);
+        volatile unsigned long *p =
+                ((volatile unsigned long *)addr) + BIT_WORD(nr);
+        unsigned long old = *p;
+
+        *p = old | mask;
+        return (old & mask) != 0;
+}
+
+/**
+ * __test_and_clear_bit - Clear a bit and return its old value
+ * @nr: Bit to clear
+ * @addr: Address to count from
+ *
+ * This operation is non-atomic and can be reordered.
+ * If two examples of this operation race, one can appear to succeed
+ * but actually fail.  You must protect multiple accesses with a lock.
+ */
+static inline int __test_and_clear_bit(int nr, volatile void *addr)
+{
+        unsigned long mask = BIT_MASK(nr);
+        volatile unsigned long *p =
+                ((volatile unsigned long *)addr) + BIT_WORD(nr);
+        unsigned long old = *p;
+
+        *p = old & ~mask;
+        return (old & mask) != 0;
+}
+
+/* WARNING: non atomic and it can be reordered! */
+static inline int __test_and_change_bit(int nr,
+                                            volatile void *addr)
+{
+        unsigned long mask = BIT_MASK(nr);
+        volatile unsigned long *p =
+                ((volatile unsigned long *)addr) + BIT_WORD(nr);
+        unsigned long old = *p;
+
+        *p = old ^ mask;
+        return (old & mask) != 0;
+}
+
+/**
+ * test_bit - Determine whether a bit is set
+ * @nr: bit number to test
+ * @addr: Address to start counting from
+ */
+static inline int test_bit(int nr, const volatile void *addr)
+{
+        const volatile unsigned long *p = (const volatile unsigned long *)addr;
+        return 1UL & (p[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
+}
+
+
+extern unsigned int _find_first_bit(
+    const unsigned long *addr, unsigned int size);
+extern unsigned int _find_next_bit(
+    const unsigned long *addr, unsigned int size, unsigned int offset);
+extern unsigned int _find_first_zero_bit(
+    const unsigned long *addr, unsigned int size);
+extern unsigned int _find_next_zero_bit(
+    const unsigned long *addr, unsigned int size, unsigned int offset);
+
+/*
+ * These are the little endian, atomic definitions.
+ */
+#define find_first_zero_bit(p,sz)       _find_first_zero_bit(p,sz)
+#define find_next_zero_bit(p,sz,off)    _find_next_zero_bit(p,sz,off)
+#define find_first_bit(p,sz)            _find_first_bit(p,sz)
+#define find_next_bit(p,sz,off)         _find_next_bit(p,sz,off)
+
+static inline int constant_fls(int x)
+{
+        int r = 32;
+
+        if (!x)
+                return 0;
+        if (!(x & 0xffff0000u)) {
+                x <<= 16;
+                r -= 16;
+        }
+        if (!(x & 0xff000000u)) {
+                x <<= 8;
+                r -= 8;
+        }
+        if (!(x & 0xf0000000u)) {
+                x <<= 4;
+                r -= 4;
+        }
+        if (!(x & 0xc0000000u)) {
+                x <<= 2;
+                r -= 2;
+        }
+        if (!(x & 0x80000000u)) {
+                x <<= 1;
+                r -= 1;
+        }
+        return r;
+}
+
+/*
+ * On ARMv5 and above those functions can be implemented around
+ * the clz instruction for much better code efficiency.
+ */
+
+static inline int fls(int x)
+{
+        int ret;
+
+        if (__builtin_constant_p(x))
+               return constant_fls(x);
+
+        asm("clz\t%0, %1" : "=r" (ret) : "r" (x));
+        ret = 32 - ret;
+        return ret;
+}
+
+#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
+
+/**
+ * find_first_set_bit - find the first set bit in @word
+ * @word: the word to search
+ *
+ * Returns the bit-number of the first set bit (first bit being 0).
+ * The input must *not* be zero.
+ */
+static inline unsigned int find_first_set_bit(unsigned long word)
+{
+        return ffs(word) - 1;
+}
+
+/**
+ * hweightN - returns the hamming weight of a N-bit word
+ * @x: the word to weigh
+ *
+ * The Hamming Weight of a number is the total number of bits set in it.
+ */
+#define hweight64(x) generic_hweight64(x)
+#define hweight32(x) generic_hweight32(x)
+#define hweight16(x) generic_hweight16(x)
+#define hweight8(x) generic_hweight8(x)
+
+#endif /* _ARM_BITOPS_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/bug.h b/xen/include/asm-arm/bug.h
new file mode 100644
index 0000000..bc2532c
--- /dev/null
+++ b/xen/include/asm-arm/bug.h
@@ -0,0 +1,15 @@
+#ifndef __ARM_BUG_H__
+#define __ARM_BUG_H__
+
+#define BUG() __bug(__FILE__, __LINE__)
+#define WARN() __warn(__FILE__, __LINE__)
+
+#endif /* __X86_BUG_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/byteorder.h b/xen/include/asm-arm/byteorder.h
new file mode 100644
index 0000000..f6ad883
--- /dev/null
+++ b/xen/include/asm-arm/byteorder.h
@@ -0,0 +1,16 @@
+#ifndef __ASM_ARM_BYTEORDER_H__
+#define __ASM_ARM_BYTEORDER_H__
+
+#define __BYTEORDER_HAS_U64__
+
+#include <xen/byteorder/little_endian.h>
+
+#endif /* __ASM_ARM_BYTEORDER_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/cache.h b/xen/include/asm-arm/cache.h
new file mode 100644
index 0000000..41b6291
--- /dev/null
+++ b/xen/include/asm-arm/cache.h
@@ -0,0 +1,20 @@
+#ifndef __ARCH_ARM_CACHE_H
+#define __ARCH_ARM_CACHE_H
+
+#include <xen/config.h>
+
+/* L1 cache line size */
+#define L1_CACHE_SHIFT  (CONFIG_ARM_L1_CACHE_SHIFT)
+#define L1_CACHE_BYTES  (1 << L1_CACHE_SHIFT)
+
+#define __read_mostly __attribute__((__section__(".data.read_mostly")))
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h
new file mode 100644
index 0000000..12285dd
--- /dev/null
+++ b/xen/include/asm-arm/config.h
@@ -0,0 +1,122 @@
+/******************************************************************************
+ * config.h
+ *
+ * A Linux-style configuration list.
+ */
+
+#ifndef __ARM_CONFIG_H__
+#define __ARM_CONFIG_H__
+
+#define CONFIG_PAGING_LEVELS 3
+
+#define CONFIG_ARM 1
+
+#define CONFIG_ARM_L1_CACHE_SHIFT 7 /* XXX */
+
+#define CONFIG_SMP 1
+
+#define CONFIG_DOMAIN_PAGE 1
+
+#define OPT_CONSOLE_STR "com1"
+
+#ifdef MAX_PHYS_CPUS
+#define NR_CPUS MAX_PHYS_CPUS
+#else
+#define NR_CPUS 128
+#endif
+
+#define MAX_VIRT_CPUS 128 /* XXX */
+#define MAX_HVM_VCPUS MAX_VIRT_CPUS
+
+#define asmlinkage /* Nothing needed */
+
+/* Linkage for ARM */
+#define __ALIGN .align 2
+#define __ALIGN_STR ".align 2"
+#ifdef __ASSEMBLY__
+#define ALIGN __ALIGN
+#define ALIGN_STR __ALIGN_STR
+#define ENTRY(name)                             \
+  .globl name;                                  \
+  ALIGN;                                        \
+  name:
+#define END(name) \
+  .size name, .-name
+#define ENDPROC(name) \
+  .type name, %function; \
+  END(name)
+#endif
+
+/*
+ * Memory layout:
+ *  0  -   2M   Unmapped
+ *  2M -   4M   Xen text, data, bss
+ *  4M -   6M   Fixmap: special-purpose 4K mapping slots
+ *
+ * 32M - 128M   Frametable: 24 bytes per page for 16GB of RAM
+ *
+ *  1G -   2G   Xenheap: always-mapped memory
+ *  2G -   4G   Domheap: on-demand-mapped
+ */
+
+#define XEN_VIRT_START         0x00200000
+#define FIXMAP_ADDR(n)        (0x00400000 + (n) * PAGE_SIZE)
+#define FRAMETABLE_VIRT_START  0x02000000
+#define XENHEAP_VIRT_START     0x40000000
+#define DOMHEAP_VIRT_START     0x80000000
+
+#define HYPERVISOR_VIRT_START mk_unsigned_long(XEN_VIRT_START)
+
+#define DOMHEAP_ENTRIES        1024  /* 1024 2MB mapping slots */
+
+/* Fixmap slots */
+#define FIXMAP_CONSOLE  0  /* The primary UART */
+#define FIXMAP_PT       1  /* Temporary mappings of pagetable pages */
+#define FIXMAP_MISC     2  /* Ephemeral mappings of hardware */
+#define FIXMAP_GICD     3  /* Interrupt controller: distributor registers */
+#define FIXMAP_GICC1    4  /* Interrupt controller: CPU registers (first page) */
+#define FIXMAP_GICC2    5  /* Interrupt controller: CPU registers (second page) */
+#define FIXMAP_GICH     6  /* Interrupt controller: virtual interface control registers */
+
+#define PAGE_SHIFT              12
+
+#ifndef __ASSEMBLY__
+#define PAGE_SIZE           (1L << PAGE_SHIFT)
+#else
+#define PAGE_SIZE           (1 << PAGE_SHIFT)
+#endif
+#define PAGE_MASK           (~(PAGE_SIZE-1))
+#define PAGE_FLAG_MASK      (~0)
+
+#define STACK_ORDER 3
+#define STACK_SIZE  (PAGE_SIZE << STACK_ORDER)
+
+#ifndef __ASSEMBLY__
+extern unsigned long xen_phys_start;
+extern unsigned long xenheap_phys_end;
+extern unsigned long frametable_virt_end;
+#endif
+
+#define supervisor_mode_kernel (0)
+
+#define watchdog_disable() ((void)0)
+#define watchdog_enable()  ((void)0)
+
+/* Board-specific: base address of PL011 UART */
+#define EARLY_UART_ADDRESS 0x1c090000
+/* Board-specific: base address of GIC + its regs */
+#define GIC_BASE_ADDRESS 0x2c000000
+#define GIC_DR_OFFSET 0x1000
+#define GIC_CR_OFFSET 0x2000
+#define GIC_HR_OFFSET 0x4000 /* Guess work http://lists.infradead.org/pipermail/linux-arm-kernel/2011-September/064219.html */
+#define GIC_VR_OFFSET 0x6000 /* Virtual Machine CPU interface) */
+
+#endif /* __ARM_CONFIG_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/cpregs.h b/xen/include/asm-arm/cpregs.h
new file mode 100644
index 0000000..3a4028d
--- /dev/null
+++ b/xen/include/asm-arm/cpregs.h
@@ -0,0 +1,207 @@
+#ifndef __ASM_ARM_CPREGS_H
+#define __ASM_ARM_CPREGS_H
+
+#include <xen/stringify.h>
+
+/* Co-processor registers */
+
+/* Layout as used in assembly, with src/dest registers mixed in */
+#define __CP32(r, coproc, opc1, crn, crm, opc2) coproc, opc1, r, crn, crm, opc2
+#define __CP64(r1, r2, coproc, opc, crm) coproc, opc, r1, r2, crm
+#define CP32(r, name...) __CP32(r, name)
+#define CP64(r, name...) __CP64(r, name)
+
+/* Stringified for inline assembly */
+#define LOAD_CP32(r, name...)  "mrc " __stringify(CP32(%r, name)) ";"
+#define STORE_CP32(r, name...) "mcr " __stringify(CP32(%r, name)) ";"
+#define LOAD_CP64(r, name...)  "mrrc " __stringify(CP64(%r, %H##r, name)) ";"
+#define STORE_CP64(r, name...) "mcrr " __stringify(CP64(%r, %H##r, name)) ";"
+
+/* C wrappers */
+#define READ_CP32(name...) ({                                   \
+    register uint32_t _r;                                       \
+    asm volatile(LOAD_CP32(0, name) : "=r" (_r));               \
+    _r; })
+
+#define WRITE_CP32(v, name...) do {                             \
+    register uint32_t _r = (v);                                 \
+    asm volatile(STORE_CP32(0, name) : : "r" (_r));             \
+} while (0)
+
+#define READ_CP64(name...) ({                                   \
+    register uint64_t _r;                                       \
+    asm volatile(LOAD_CP64(0, name) : "=r" (_r));               \
+    _r; })
+
+#define WRITE_CP64(v, name...) do {                             \
+    register uint64_t _r = (v);                                 \
+    asm volatile(STORE_CP64(0, name) : : "r" (_r));             \
+} while (0)
+
+#define __HSR_CPREG_c0  0
+#define __HSR_CPREG_c1  1
+#define __HSR_CPREG_c2  2
+#define __HSR_CPREG_c3  3
+#define __HSR_CPREG_c4  4
+#define __HSR_CPREG_c5  5
+#define __HSR_CPREG_c6  6
+#define __HSR_CPREG_c7  7
+#define __HSR_CPREG_c8  8
+#define __HSR_CPREG_c9  9
+#define __HSR_CPREG_c10 10
+#define __HSR_CPREG_c11 11
+#define __HSR_CPREG_c12 12
+#define __HSR_CPREG_c13 13
+#define __HSR_CPREG_c14 14
+#define __HSR_CPREG_c15 15
+
+#define __HSR_CPREG_0   0
+#define __HSR_CPREG_1   1
+#define __HSR_CPREG_2   2
+#define __HSR_CPREG_3   3
+#define __HSR_CPREG_4   4
+#define __HSR_CPREG_5   5
+#define __HSR_CPREG_6   6
+#define __HSR_CPREG_7   7
+
+#define _HSR_CPREG32(cp,op1,crn,crm,op2) \
+    ((__HSR_CPREG_##crn) << HSR_CP32_CRN_SHIFT) | \
+    ((__HSR_CPREG_##crm) << HSR_CP32_CRM_SHIFT) | \
+    ((__HSR_CPREG_##op1) << HSR_CP32_OP1_SHIFT) | \
+    ((__HSR_CPREG_##op2) << HSR_CP32_OP2_SHIFT)
+
+#define _HSR_CPREG64(cp,op1,crm) \
+    ((__HSR_CPREG_##crm) << HSR_CP64_CRM_SHIFT) | \
+    ((__HSR_CPREG_##op1) << HSR_CP64_OP1_SHIFT)
+
+/* Encode a register as per HSR ISS pattern */
+#define HSR_CPREG32(X) _HSR_CPREG32(X)
+#define HSR_CPREG64(X) _HSR_CPREG64(X)
+
+/*
+ * Order registers by Coprocessor-> CRn-> Opcode 1-> CRm-> Opcode 2
+ *
+ * This matches the ordering used in the ARM as well as the groupings
+ * which the CP registers are allocated in.
+ *
+ * This is slightly different to the form of the instruction
+ * arguments, which are cp,opc1,crn,crm,opc2.
+ */
+
+/* Coprocessor 15 */
+
+/* CP15 CR0: CPUID and Cache Type Registers */
+#define ID_PFR0         p15,0,c0,c1,0   /* Processor Feature Register 0 */
+#define ID_PFR1         p15,0,c0,c1,1   /* Processor Feature Register 1 */
+#define CCSIDR          p15,1,c0,c0,0   /* Cache Size ID Registers */
+#define CLIDR           p15,1,c0,c0,1   /* Cache Level ID Register */
+#define CSSELR          p15,2,c0,c0,0   /* Cache Size Selection Register */
+
+/* CP15 CR1: System Control Registers */
+#define SCTLR           p15,0,c1,c0,0   /* System Control Register */
+#define SCR             p15,0,c1,c1,0   /* Secure Configuration Register */
+#define NSACR           p15,0,c1,c1,2   /* Non-Secure Access Control Register */
+#define HSCTLR          p15,4,c1,c0,0   /* Hyp. System Control Register */
+#define HCR             p15,4,c1,c1,0   /* Hyp. Configuration Register */
+
+/* CP15 CR2: Translation Table Base and Control Registers */
+#define TTBR0           p15,0,c2,c0,0   /* Translation Table Base Reg. 0 */
+#define TTBR1           p15,0,c2,c0,1   /* Translation Table Base Reg. 1 */
+#define TTBCR           p15,0,c2,c0,2   /* Translatation Table Base Control Register */
+#define HTTBR           p15,4,c2        /* Hyp. Translation Table Base Register */
+#define HTCR            p15,4,c2,c0,2   /* Hyp. Translation Control Register */
+#define VTCR            p15,4,c2,c1,2   /* Virtualization Translation Control Register */
+#define VTTBR           p15,6,c2        /* Virtualization Translation Table Base Register */
+
+/* CP15 CR3: Domain Access Control Register */
+
+/* CP15 CR4: */
+
+/* CP15 CR5: Fault Status Registers */
+#define DFSR            p15,0,c5,c0,0   /* Data Fault Status Register */
+#define IFSR            p15,0,c5,c0,1   /* Instruction Fault Status Register */
+#define HSR             p15,4,c5,c2,0   /* Hyp. Syndrome Register */
+
+/* CP15 CR6: Fault Address Registers */
+#define DFAR            p15,0,c6,c0,0   /* Data Fault Address Register  */
+#define IFAR            p15,0,c6,c0,2   /* Instruction Fault Address Register */
+#define HDFAR           p15,4,c6,c0,0   /* Hyp. Data Fault Address Register */
+#define HIFAR           p15,4,c6,c0,2   /* Hyp. Instruction Fault Address Register */
+#define HPFAR           p15,4,c6,c0,4   /* Hyp. IPA Fault Address Register */
+
+/* CP15 CR7: Cache and address translation operations */
+#define PAR             p15,0,c7        /* Physical Address Register */
+#define ICIALLUIS       p15,0,c7,c1,0   /* Invalidate all instruction caches to PoU inner shareable */
+#define BPIALLIS        p15,0,c7,c1,6   /* Invalidate entire branch predictor array inner shareable */
+#define ICIALLU         p15,0,c7,c5,0   /* Invalidate all instruction caches to PoU */
+#define BPIALL          p15,0,c7,c5,6   /* Invalidate entire branch predictor array */
+#define ATS1CPR         p15,0,c7,c8,0   /* Address Translation Stage 1. Non-Secure Kernel Read */
+#define ATS1CPW         p15,0,c7,c8,1   /* Address Translation Stage 1. Non-Secure Kernel Write */
+#define ATS1CUR         p15,0,c7,c8,2   /* Address Translation Stage 1. Non-Secure User Read */
+#define ATS1CUW         p15,0,c7,c8,3   /* Address Translation Stage 1. Non-Secure User Write */
+#define ATS12NSOPR      p15,0,c7,c8,4   /* Address Translation Stage 1+2 Non-Secure Kernel Read */
+#define ATS12NSOPW      p15,0,c7,c8,5   /* Address Translation Stage 1+2 Non-Secure Kernel Write */
+#define ATS12NSOUR      p15,0,c7,c8,6   /* Address Translation Stage 1+2 Non-Secure User Read */
+#define ATS12NSOUW      p15,0,c7,c8,7   /* Address Translation Stage 1+2 Non-Secure User Write */
+#define DCCMVAC         p15,0,c7,c10,1  /* Clean data or unified cache line by MVA to PoC */
+#define DCCISW          p15,0,c7,c14,2  /* Clean and invalidate data cache line by set/way */
+#define ATS1HR          p15,4,c7,c8,0   /* Address Translation Stage 1 Hyp. Read */
+#define ATS1HW          p15,4,c7,c8,1   /* Address Translation Stage 1 Hyp. Write */
+
+/* CP15 CR8: TLB maintenance operations */
+#define TLBIALLIS       p15,0,c8,c3,0   /* Invalidate entire TLB innrer shareable */
+#define TLBIMVAIS       p15,0,c8,c3,1   /* Invalidate unified TLB entry by MVA inner shareable */
+#define TLBIASIDIS      p15,0,c8,c3,2   /* Invalidate unified TLB by ASID match inner shareable */
+#define TLBIMVAAIS      p15,0,c8,c3,3   /* Invalidate unified TLB entry by MVA all ASID inner shareable */
+#define DTLBIALL        p15,0,c8,c6,0   /* Invalidate data TLB */
+#define DTLBIMVA        p15,0,c8,c6,1   /* Invalidate data TLB entry by MVA */
+#define DTLBIASID       p15,0,c8,c6,2   /* Invalidate data TLB by ASID match */
+#define TLBILLHIS       p15,4,c8,c3,0   /* Invalidate Entire Hyp. Unified TLB inner shareable */
+#define TLBIMVAHIS      p15,4,c8,c3,1   /* Invalidate Unified Hyp. TLB by MVA inner shareable */
+#define TLBIALLNSNHIS   p15,4,c8,c7,4   /* Invalidate Entire Non-Secure Non-Hyp. Unified TLB inner shareable */
+#define TLBIALLH        p15,4,c8,c7,0   /* Invalidate Entire Hyp. Unified TLB */
+#define TLBIMVAH        p15,4,c8,c7,1   /* Invalidate Unified Hyp. TLB by MVA */
+#define TLBIALLNSNH     p15,4,c8,c7,4   /* Invalidate Entire Non-Secure Non-Hyp. Unified TLB */
+
+/* CP15 CR9: */
+
+/* CP15 CR10: */
+#define MAIR0           p15,0,c10,c2,0  /* Memory Attribute Indirection Register 0 */
+#define MAIR1           p15,0,c10,c2,1  /* Memory Attribute Indirection Register 1 */
+#define HMAIR0          p15,4,c10,c2,0  /* Hyp. Memory Attribute Indirection Register 0 */
+#define HMAIR1          p15,4,c10,c2,1  /* Hyp. Memory Attribute Indirection Register 1 */
+
+/* CP15 CR11: DMA Operations for TCM Access */
+
+/* CP15 CR12:  */
+#define HVBAR           p15,4,c12,c0,0  /* Hyp. Vector Base Address Register */
+
+/* CP15 CR13:  */
+#define FCSEIDR         p15,0,c13,c0,0  /* FCSE Process ID Register */
+#define CONTEXTIDR      p15,0,c13,c0,1  /* Context ID Register */
+
+/* CP15 CR14:  */
+#define CNTPCT          p15,0,c14       /* Time counter value */
+#define CNTFRQ          p15,0,c14,c0,0  /* Time counter frequency */
+#define CNTKCTL         p15,0,c14,c1,0  /* Time counter kernel control */
+#define CNTP_TVAL       p15,0,c14,c2,0  /* Physical Timer value */
+#define CNTP_CTL        p15,0,c14,c2,1  /* Physical Timer control register */
+#define CNTVCT          p15,1,c14       /* Time counter value + offset */
+#define CNTP_CVAL       p15,2,c14       /* Physical Timer comparator */
+#define CNTVOFF         p15,4,c14       /* Time counter offset */
+#define CNTHCTL         p15,4,c14,c1,0  /* Time counter hyp. control */
+#define CNTHP_TVAL      p15,4,c14,c2,0  /* Hyp. Timer value */
+#define CNTHP_CTL       p15,4,c14,c2,1  /* Hyp. Timer control register */
+#define CNTHP_CVAL      p15,6,c14       /* Hyp. Timer comparator */
+
+/* CP15 CR15: Implementation Defined Registers */
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/current.h b/xen/include/asm-arm/current.h
new file mode 100644
index 0000000..826efa5
--- /dev/null
+++ b/xen/include/asm-arm/current.h
@@ -0,0 +1,60 @@
+#ifndef __ARM_CURRENT_H__
+#define __ARM_CURRENT_H__
+
+#include <xen/config.h>
+#include <xen/percpu.h>
+#include <public/xen.h>
+
+#ifndef __ASSEMBLY__
+
+struct vcpu;
+
+struct cpu_info {
+    struct cpu_user_regs guest_cpu_user_regs;
+    unsigned long elr;
+    unsigned int processor_id;
+    struct vcpu *current_vcpu;
+    unsigned long per_cpu_offset;
+};
+
+static inline struct cpu_info *get_cpu_info(void)
+{
+        register unsigned long sp asm ("sp");
+        return (struct cpu_info *)((sp & ~(STACK_SIZE - 1)) + STACK_SIZE - sizeof(struct cpu_info));
+}
+
+#define get_current()         (get_cpu_info()->current_vcpu)
+#define set_current(vcpu)     (get_cpu_info()->current_vcpu = (vcpu))
+#define current               (get_current())
+
+#define get_processor_id()    (get_cpu_info()->processor_id)
+#define set_processor_id(id)  do {                                      \
+    struct cpu_info *ci__ = get_cpu_info();                             \
+    ci__->per_cpu_offset = __per_cpu_offset[ci__->processor_id = (id)]; \
+} while (0)
+
+#define guest_cpu_user_regs() (&get_cpu_info()->guest_cpu_user_regs)
+
+#define reset_stack_and_jump(__fn)              \
+    __asm__ __volatile__ (                      \
+        "mov sp,%0; b "STR(__fn)      \
+        : : "r" (guest_cpu_user_regs()) : "memory" )
+#endif
+
+
+/*
+ * Which VCPU's state is currently running on each CPU?
+ * This is not necesasrily the same as 'current' as a CPU may be
+ * executing a lazy state switch.
+ */
+DECLARE_PER_CPU(struct vcpu *, curr_vcpu);
+
+#endif /* __ARM_CURRENT_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/debugger.h b/xen/include/asm-arm/debugger.h
new file mode 100644
index 0000000..84b2eec
--- /dev/null
+++ b/xen/include/asm-arm/debugger.h
@@ -0,0 +1,15 @@
+#ifndef __ARM_DEBUGGER_H__
+#define __ARM_DEBUGGER_H__
+
+#define debugger_trap_fatal(v, r) (0)
+#define debugger_trap_immediate() (0)
+
+#endif /* __ARM_DEBUGGER_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/delay.h b/xen/include/asm-arm/delay.h
new file mode 100644
index 0000000..6250774
--- /dev/null
+++ b/xen/include/asm-arm/delay.h
@@ -0,0 +1,15 @@
+#ifndef _ARM_DELAY_H
+#define _ARM_DELAY_H
+
+extern void __udelay(unsigned long usecs);
+#define udelay(n) __udelay(n)
+
+#endif /* defined(_ARM_DELAY_H) */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/desc.h b/xen/include/asm-arm/desc.h
new file mode 100644
index 0000000..3989e8a
--- /dev/null
+++ b/xen/include/asm-arm/desc.h
@@ -0,0 +1,12 @@
+#ifndef __ARCH_DESC_H
+#define __ARCH_DESC_H
+
+#endif /* __ARCH_DESC_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/div64.h b/xen/include/asm-arm/div64.h
new file mode 100644
index 0000000..7b00808
--- /dev/null
+++ b/xen/include/asm-arm/div64.h
@@ -0,0 +1,235 @@
+/* Taken from Linux arch/arm */
+#ifndef __ASM_ARM_DIV64
+#define __ASM_ARM_DIV64
+
+#include <asm/system.h>
+#include <xen/types.h>
+
+/*
+ * The semantics of do_div() are:
+ *
+ * uint32_t do_div(uint64_t *n, uint32_t base)
+ * {
+ * 	uint32_t remainder = *n % base;
+ * 	*n = *n / base;
+ * 	return remainder;
+ * }
+ *
+ * In other words, a 64-bit dividend with a 32-bit divisor producing
+ * a 64-bit result and a 32-bit remainder.  To accomplish this optimally
+ * we call a special __do_div64 helper with completely non standard
+ * calling convention for arguments and results (beware).
+ */
+
+#ifdef __ARMEB__
+#define __xh "r0"
+#define __xl "r1"
+#else
+#define __xl "r0"
+#define __xh "r1"
+#endif
+
+#define __do_div_asm(n, base)					\
+({								\
+	register unsigned int __base      asm("r4") = base;	\
+	register unsigned long long __n   asm("r0") = n;	\
+	register unsigned long long __res asm("r2");		\
+	register unsigned int __rem       asm(__xh);		\
+	asm(	__asmeq("%0", __xh)				\
+		__asmeq("%1", "r2")				\
+		__asmeq("%2", "r0")				\
+		__asmeq("%3", "r4")				\
+		"bl	__do_div64"				\
+		: "=r" (__rem), "=r" (__res)			\
+		: "r" (__n), "r" (__base)			\
+		: "ip", "lr", "cc");				\
+	n = __res;						\
+	__rem;							\
+})
+
+#if __GNUC__ < 4
+
+/*
+ * gcc versions earlier than 4.0 are simply too problematic for the
+ * optimized implementation below. First there is gcc PR 15089 that
+ * tend to trig on more complex constructs, spurious .global __udivsi3
+ * are inserted even if none of those symbols are referenced in the
+ * generated code, and those gcc versions are not able to do constant
+ * propagation on long long values anyway.
+ */
+#define do_div(n, base) __do_div_asm(n, base)
+
+#elif __GNUC__ >= 4
+
+#include <asm/bug.h>
+
+/*
+ * If the divisor happens to be constant, we determine the appropriate
+ * inverse at compile time to turn the division into a few inline
+ * multiplications instead which is much faster. And yet only if compiling
+ * for ARMv4 or higher (we need umull/umlal) and if the gcc version is
+ * sufficiently recent to perform proper long long constant propagation.
+ * (It is unfortunate that gcc doesn't perform all this internally.)
+ */
+#define do_div(n, base)							\
+({									\
+	unsigned int __r, __b = (base);					\
+	if (!__builtin_constant_p(__b) || __b == 0) {			\
+		/* non-constant divisor (or zero): slow path */		\
+		__r = __do_div_asm(n, __b);				\
+	} else if ((__b & (__b - 1)) == 0) {				\
+		/* Trivial: __b is constant and a power of 2 */		\
+		/* gcc does the right thing with this code.  */		\
+		__r = n;						\
+		__r &= (__b - 1);					\
+		n /= __b;						\
+	} else {							\
+		/* Multiply by inverse of __b: n/b = n*(p/b)/p       */	\
+		/* We rely on the fact that most of this code gets   */	\
+		/* optimized away at compile time due to constant    */	\
+		/* propagation and only a couple inline assembly     */	\
+		/* instructions should remain. Better avoid any      */	\
+		/* code construct that might prevent that.           */	\
+		unsigned long long __res, __x, __t, __m, __n = n;	\
+		unsigned int __c, __p, __z = 0;				\
+		/* preserve low part of n for reminder computation */	\
+		__r = __n;						\
+		/* determine number of bits to represent __b */		\
+		__p = 1 << __div64_fls(__b);				\
+		/* compute __m = ((__p << 64) + __b - 1) / __b */	\
+		__m = (~0ULL / __b) * __p;				\
+		__m += (((~0ULL % __b + 1) * __p) + __b - 1) / __b;	\
+		/* compute __res = __m*(~0ULL/__b*__b-1)/(__p << 64) */	\
+		__x = ~0ULL / __b * __b - 1;				\
+		__res = (__m & 0xffffffff) * (__x & 0xffffffff);	\
+		__res >>= 32;						\
+		__res += (__m & 0xffffffff) * (__x >> 32);		\
+		__t = __res;						\
+		__res += (__x & 0xffffffff) * (__m >> 32);		\
+		__t = (__res < __t) ? (1ULL << 32) : 0;			\
+		__res = (__res >> 32) + __t;				\
+		__res += (__m >> 32) * (__x >> 32);			\
+		__res /= __p;						\
+		/* Now sanitize and optimize what we've got. */		\
+		if (~0ULL % (__b / (__b & -__b)) == 0) {		\
+			/* those cases can be simplified with: */	\
+			__n /= (__b & -__b);				\
+			__m = ~0ULL / (__b / (__b & -__b));		\
+			__p = 1;					\
+			__c = 1;					\
+		} else if (__res != __x / __b) {			\
+			/* We can't get away without a correction    */	\
+			/* to compensate for bit truncation errors.  */	\
+			/* To avoid it we'd need an additional bit   */	\
+			/* to represent __m which would overflow it. */	\
+			/* Instead we do m=p/b and n/b=(n*m+m)/p.    */	\
+			__c = 1;					\
+			/* Compute __m = (__p << 64) / __b */		\
+			__m = (~0ULL / __b) * __p;			\
+			__m += ((~0ULL % __b + 1) * __p) / __b;		\
+		} else {						\
+			/* Reduce __m/__p, and try to clear bit 31   */	\
+			/* of __m when possible otherwise that'll    */	\
+			/* need extra overflow handling later.       */	\
+			unsigned int __bits = -(__m & -__m);		\
+			__bits |= __m >> 32;				\
+			__bits = (~__bits) << 1;			\
+			/* If __bits == 0 then setting bit 31 is     */	\
+			/* unavoidable.  Simply apply the maximum    */	\
+			/* possible reduction in that case.          */	\
+			/* Otherwise the MSB of __bits indicates the */	\
+			/* best reduction we should apply.           */	\
+			if (!__bits) {					\
+				__p /= (__m & -__m);			\
+				__m /= (__m & -__m);			\
+			} else {					\
+				__p >>= __div64_fls(__bits);		\
+				__m >>= __div64_fls(__bits);		\
+			}						\
+			/* No correction needed. */			\
+			__c = 0;					\
+		}							\
+		/* Now we have a combination of 2 conditions:        */	\
+		/* 1) whether or not we need a correction (__c), and */	\
+		/* 2) whether or not there might be an overflow in   */	\
+		/*    the cross product (__m & ((1<<63) | (1<<31)))  */	\
+		/* Select the best insn combination to perform the   */	\
+		/* actual __m * __n / (__p << 64) operation.         */	\
+		if (!__c) {						\
+			asm (	"umull	%Q0, %R0, %1, %Q2\n\t"		\
+				"mov	%Q0, #0"			\
+				: "=&r" (__res)				\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		} else if (!(__m & ((1ULL << 63) | (1ULL << 31)))) {	\
+			__res = __m;					\
+			asm (	"umlal	%Q0, %R0, %Q1, %Q2\n\t"		\
+				"mov	%Q0, #0"			\
+				: "+&r" (__res)				\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		} else {						\
+			asm (	"umull	%Q0, %R0, %Q1, %Q2\n\t"		\
+				"cmn	%Q0, %Q1\n\t"			\
+				"adcs	%R0, %R0, %R1\n\t"		\
+				"adc	%Q0, %3, #0"			\
+				: "=&r" (__res)				\
+				: "r" (__m), "r" (__n), "r" (__z)	\
+				: "cc" );				\
+		}							\
+		if (!(__m & ((1ULL << 63) | (1ULL << 31)))) {		\
+			asm (	"umlal	%R0, %Q0, %R1, %Q2\n\t"		\
+				"umlal	%R0, %Q0, %Q1, %R2\n\t"		\
+				"mov	%R0, #0\n\t"			\
+				"umlal	%Q0, %R0, %R1, %R2"		\
+				: "+&r" (__res)				\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		} else {						\
+			asm (	"umlal	%R0, %Q0, %R2, %Q3\n\t"		\
+				"umlal	%R0, %1, %Q2, %R3\n\t"		\
+				"mov	%R0, #0\n\t"			\
+				"adds	%Q0, %1, %Q0\n\t"		\
+				"adc	%R0, %R0, #0\n\t"		\
+				"umlal	%Q0, %R0, %R2, %R3"		\
+				: "+&r" (__res), "+&r" (__z)		\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		}							\
+		__res /= __p;						\
+		/* The reminder can be computed with 32-bit regs     */	\
+		/* only, and gcc is good at that.                    */	\
+		{							\
+			unsigned int __res0 = __res;			\
+			unsigned int __b0 = __b;			\
+			__r -= __res0 * __b0;				\
+		}							\
+		/* BUG_ON(__r >= __b || __res * __b + __r != n); */	\
+		n = __res;						\
+	}								\
+	__r;								\
+})
+
+/* our own fls implementation to make sure constant propagation is fine */
+#define __div64_fls(bits)						\
+({									\
+	unsigned int __left = (bits), __nr = 0;				\
+	if (__left & 0xffff0000) __nr += 16, __left >>= 16;		\
+	if (__left & 0x0000ff00) __nr +=  8, __left >>=  8;		\
+	if (__left & 0x000000f0) __nr +=  4, __left >>=  4;		\
+	if (__left & 0x0000000c) __nr +=  2, __left >>=  2;		\
+	if (__left & 0x00000002) __nr +=  1;				\
+	__nr;								\
+})
+
+#endif
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/elf.h b/xen/include/asm-arm/elf.h
new file mode 100644
index 0000000..12d487c
--- /dev/null
+++ b/xen/include/asm-arm/elf.h
@@ -0,0 +1,33 @@
+#ifndef __ARM_ELF_H__
+#define __ARM_ELF_H__
+
+typedef struct {
+    unsigned long r0;
+    unsigned long r1;
+    unsigned long r2;
+    unsigned long r3;
+    unsigned long r4;
+    unsigned long r5;
+    unsigned long r6;
+    unsigned long r7;
+    unsigned long r8;
+    unsigned long r9;
+    unsigned long r10;
+    unsigned long r11;
+    unsigned long r12;
+    unsigned long sp;
+    unsigned long lr;
+    unsigned long pc;
+} ELF_Gregset;
+
+#endif /* __ARM_ELF_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/event.h b/xen/include/asm-arm/event.h
new file mode 100644
index 0000000..6b2fb7c
--- /dev/null
+++ b/xen/include/asm-arm/event.h
@@ -0,0 +1,41 @@
+#ifndef __ASM_EVENT_H__
+#define __ASM_EVENT_H__
+
+void vcpu_kick(struct vcpu *v);
+void vcpu_mark_events_pending(struct vcpu *v);
+
+static inline int local_events_need_delivery(void)
+{
+    /* TODO
+     * return (vcpu_info(v, evtchn_upcall_pending) &&
+                        !vcpu_info(v, evtchn_upcall_mask)); */
+        return 0;
+}
+
+int local_event_delivery_is_enabled(void);
+
+static inline void local_event_delivery_disable(void)
+{
+    /* TODO current->vcpu_info->evtchn_upcall_mask = 1; */
+}
+
+static inline void local_event_delivery_enable(void)
+{
+    /* TODO current->vcpu_info->evtchn_upcall_mask = 0; */
+}
+
+/* No arch specific virq definition now. Default to global. */
+static inline int arch_virq_is_global(int virq)
+{
+    return 1;
+}
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/flushtlb.h b/xen/include/asm-arm/flushtlb.h
new file mode 100644
index 0000000..c8486fc
--- /dev/null
+++ b/xen/include/asm-arm/flushtlb.h
@@ -0,0 +1,31 @@
+#ifndef __FLUSHTLB_H__
+#define __FLUSHTLB_H__
+
+#include <xen/cpumask.h>
+
+/*
+ * Filter the given set of CPUs, removing those that definitely flushed their
+ * TLB since @page_timestamp.
+ */
+/* XXX lazy implementation just doesn't clear anything.... */
+#define tlbflush_filter(mask, page_timestamp)                           \
+do {                                                                    \
+} while ( 0 )
+
+#define tlbflush_current_time()                 (0)
+
+/* Flush local TLBs */
+void flush_tlb_local(void);
+
+/* Flush specified CPUs' TLBs */
+void flush_tlb_mask(const cpumask_t *mask);
+
+#endif /* __FLUSHTLB_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h
new file mode 100644
index 0000000..8f6ffd8
--- /dev/null
+++ b/xen/include/asm-arm/grant_table.h
@@ -0,0 +1,35 @@
+#ifndef __ASM_GRANT_TABLE_H__
+#define __ASM_GRANT_TABLE_H__
+
+#include <xen/grant_table.h>
+
+#define INVALID_GFN (-1UL)
+#define INITIAL_NR_GRANT_FRAMES 1
+
+void gnttab_clear_flag(unsigned long nr, uint16_t *addr);
+int create_grant_host_mapping(unsigned long gpaddr,
+		unsigned long mfn, unsigned int flags, unsigned int
+		cache_flags);
+#define gnttab_host_mapping_get_page_type(op, d, rd) (0)
+int replace_grant_host_mapping(unsigned long gpaddr, unsigned long mfn,
+		unsigned long new_gpaddr, unsigned int flags);
+void gnttab_mark_dirty(struct domain *d, unsigned long l);
+#define gnttab_create_status_page(d, t, i) (0)
+#define gnttab_create_shared_page(d, t, i) (0)
+#define gnttab_shared_gmfn(d, t, i) (0)
+#define gnttab_status_gmfn(d, t, i) (0)
+#define gnttab_release_host_mappings(domain) 1
+static inline int replace_grant_supported(void)
+{
+    return 1;
+}
+
+#endif /* __ASM_GRANT_TABLE_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/hardirq.h b/xen/include/asm-arm/hardirq.h
new file mode 100644
index 0000000..9c031a8
--- /dev/null
+++ b/xen/include/asm-arm/hardirq.h
@@ -0,0 +1,28 @@
+#ifndef __ASM_HARDIRQ_H
+#define __ASM_HARDIRQ_H
+
+#include <xen/config.h>
+#include <xen/cache.h>
+#include <xen/smp.h>
+
+typedef struct {
+        unsigned long __softirq_pending;
+        unsigned int __local_irq_count;
+} __cacheline_aligned irq_cpustat_t;
+
+#include <xen/irq_cpustat.h>    /* Standard mappings for irq_cpustat_t above */
+
+#define in_irq() (local_irq_count(smp_processor_id()) != 0)
+
+#define irq_enter()     (local_irq_count(smp_processor_id())++)
+#define irq_exit()      (local_irq_count(smp_processor_id())--)
+
+#endif /* __ASM_HARDIRQ_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/hypercall.h b/xen/include/asm-arm/hypercall.h
new file mode 100644
index 0000000..90a87ef
--- /dev/null
+++ b/xen/include/asm-arm/hypercall.h
@@ -0,0 +1,24 @@
+#ifndef __ASM_ARM_HYPERCALL_H__
+#define __ASM_ARM_HYPERCALL_H__
+
+#include <public/domctl.h> /* for arch_do_domctl */
+
+struct vcpu;
+extern long
+arch_do_vcpu_op(
+    int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg);
+
+extern long
+arch_do_sysctl(
+    struct xen_sysctl *op,
+    XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl);
+
+#endif /* __ASM_ARM_HYPERCALL_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/init.h b/xen/include/asm-arm/init.h
new file mode 100644
index 0000000..5f44929
--- /dev/null
+++ b/xen/include/asm-arm/init.h
@@ -0,0 +1,12 @@
+#ifndef _XEN_ASM_INIT_H
+#define _XEN_ASM_INIT_H
+
+#endif /* _XEN_ASM_INIT_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/io.h b/xen/include/asm-arm/io.h
new file mode 100644
index 0000000..1babbab
--- /dev/null
+++ b/xen/include/asm-arm/io.h
@@ -0,0 +1,12 @@
+#ifndef _ASM_IO_H
+#define _ASM_IO_H
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/iocap.h b/xen/include/asm-arm/iocap.h
new file mode 100644
index 0000000..f647f30
--- /dev/null
+++ b/xen/include/asm-arm/iocap.h
@@ -0,0 +1,20 @@
+#ifndef __X86_IOCAP_H__
+#define __X86_IOCAP_H__
+
+#define cache_flush_permitted(d)                        \
+    (!rangeset_is_empty((d)->iomem_caps))
+
+#define multipage_allocation_permitted(d, order)        \
+    (((order) <= 9) || /* allow 2MB superpages */       \
+     !rangeset_is_empty((d)->iomem_caps))
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/multicall.h b/xen/include/asm-arm/multicall.h
new file mode 100644
index 0000000..c800940
--- /dev/null
+++ b/xen/include/asm-arm/multicall.h
@@ -0,0 +1,23 @@
+#ifndef __ASM_ARM_MULTICALL_H__
+#define __ASM_ARM_MULTICALL_H__
+
+#define do_multicall_call(_call)                             \
+    do {                                                     \
+        __asm__ __volatile__ (                               \
+            ".word 0xe7f000f0@; do_multicall_call\n"         \
+            "    mov r0,#0; @ do_multicall_call\n"           \
+            "    str r0, [r0];\n"                            \
+            :                                                \
+            :                                                \
+            : );                                             \
+    } while ( 0 )
+
+#endif /* __ASM_ARM_MULTICALL_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/nmi.h b/xen/include/asm-arm/nmi.h
new file mode 100644
index 0000000..e0f19f9
--- /dev/null
+++ b/xen/include/asm-arm/nmi.h
@@ -0,0 +1,15 @@
+#ifndef ASM_NMI_H
+#define ASM_NMI_H
+
+#define register_guest_nmi_callback(a)  (-ENOSYS)
+#define unregister_guest_nmi_callback() (-ENOSYS)
+
+#endif /* ASM_NMI_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/numa.h b/xen/include/asm-arm/numa.h
new file mode 100644
index 0000000..cffee5c
--- /dev/null
+++ b/xen/include/asm-arm/numa.h
@@ -0,0 +1,21 @@
+#ifndef __ARCH_ARM_NUMA_H
+#define __ARCH_ARM_NUMA_H
+
+/* Fake one node for now... */
+#define cpu_to_node(cpu) 0
+#define node_to_cpumask(node)	(cpu_online_map)
+
+static inline __attribute__((pure)) int phys_to_nid(paddr_t addr)
+{
+        return 0;
+}
+
+#endif /* __ARCH_ARM_NUMA_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/paging.h b/xen/include/asm-arm/paging.h
new file mode 100644
index 0000000..4dc340f
--- /dev/null
+++ b/xen/include/asm-arm/paging.h
@@ -0,0 +1,13 @@
+#ifndef _XEN_PAGING_H
+#define _XEN_PAGING_H
+
+#endif /* XEN_PAGING_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/percpu.h b/xen/include/asm-arm/percpu.h
new file mode 100644
index 0000000..9d369eb
--- /dev/null
+++ b/xen/include/asm-arm/percpu.h
@@ -0,0 +1,28 @@
+#ifndef __ARM_PERCPU_H__
+#define __ARM_PERCPU_H__
+
+#ifndef __ASSEMBLY__
+extern char __per_cpu_start[], __per_cpu_data_end[];
+extern unsigned long __per_cpu_offset[NR_CPUS];
+void percpu_init_areas(void);
+#endif
+
+/* Separate out the type, so (int[3], foo) works. */
+#define __DEFINE_PER_CPU(type, name, suffix)                    \
+    __attribute__((__section__(".bss.percpu" #suffix)))         \
+    __typeof__(type) per_cpu_##name
+
+#define per_cpu(var, cpu) ((&per_cpu__##var)[cpu?0:0])
+#define __get_cpu_var(var) per_cpu__##var
+
+#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
+
+#endif /* __ARM_PERCPU_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h
new file mode 100644
index 0000000..1f85d31
--- /dev/null
+++ b/xen/include/asm-arm/processor.h
@@ -0,0 +1,269 @@
+#ifndef __ASM_ARM_PROCESSOR_H
+#define __ASM_ARM_PROCESSOR_H
+
+#include <asm/cpregs.h>
+
+/* PSR bits (CPSR, SPSR)*/
+
+/* 0-4: Mode */
+#define PSR_MODE_MASK 0x1f
+#define PSR_MODE_USR 0x10
+#define PSR_MODE_FIQ 0x11
+#define PSR_MODE_IRQ 0x12
+#define PSR_MODE_SVC 0x13
+#define PSR_MODE_MON 0x16
+#define PSR_MODE_ABT 0x17
+#define PSR_MODE_HYP 0x1a
+#define PSR_MODE_UND 0x1b
+#define PSR_MODE_SYS 0x1f
+
+#define PSR_THUMB        (1<<5)        /* Thumb Mode enable */
+#define PSR_FIQ_MASK        (1<<6)        /* Fast Interrupt mask */
+#define PSR_IRQ_MASK        (1<<7)        /* Interrupt mask */
+#define PSR_ABT_MASK         (1<<8)        /* Asynchronous Abort mask */
+#define PSR_BIG_ENDIAN        (1<<9)        /* Big Endian Mode */
+#define PSR_JAZELLE        (1<<24)        /* Jazelle Mode */
+
+/* TTBCR Translation Table Base Control Register */
+#define TTBCR_N_MASK 0x07
+#define TTBCR_N_16KB 0x00
+#define TTBCR_N_8KB  0x01
+#define TTBCR_N_4KB  0x02
+#define TTBCR_N_2KB  0x03
+#define TTBCR_N_1KB  0x04
+
+/* SCTLR System Control Register. */
+/* HSCTLR is a subset of this. */
+#define SCTLR_TE        (1<<30)
+#define SCTLR_AFE        (1<<29)
+#define SCTLR_TRE        (1<<28)
+#define SCTLR_NMFI        (1<<27)
+#define SCTLR_EE        (1<<25)
+#define SCTLR_VE        (1<<24)
+#define SCTLR_U                (1<<22)
+#define SCTLR_FI        (1<<21)
+#define SCTLR_WXN        (1<<19)
+#define SCTLR_HA        (1<<17)
+#define SCTLR_RR        (1<<14)
+#define SCTLR_V                (1<<13)
+#define SCTLR_I                (1<<12)
+#define SCTLR_Z                (1<<11)
+#define SCTLR_SW        (1<<10)
+#define SCTLR_B                (1<<7)
+#define SCTLR_C                (1<<2)
+#define SCTLR_A                (1<<1)
+#define SCTLR_M                (1<<0)
+
+#define SCTLR_BASE        0x00c50078
+#define HSCTLR_BASE        0x30c51878
+
+/* HCR Hyp Configuration Register */
+#define HCR_TGE                (1<<27)
+#define HCR_TVM                (1<<26)
+#define HCR_TTLB        (1<<25)
+#define HCR_TPU                (1<<24)
+#define HCR_TPC                (1<<23)
+#define HCR_TSW                (1<<22)
+#define HCR_TAC                (1<<21)
+#define HCR_TIDCP        (1<<20)
+#define HCR_TSC                (1<<19)
+#define HCR_TID3        (1<<18)
+#define HCR_TID2        (1<<17)
+#define HCR_TID1        (1<<16)
+#define HCR_TID0        (1<<15)
+#define HCR_TWE                (1<<14)
+#define HCR_TWI                (1<<13)
+#define HCR_DC                (1<<12)
+#define HCR_BSU_MASK        (3<<10)
+#define HCR_FB                (1<<9)
+#define HCR_VA                (1<<8)
+#define HCR_VI                (1<<7)
+#define HCR_VF                (1<<6)
+#define HCR_AMO                (1<<5)
+#define HCR_IMO                (1<<4)
+#define HCR_FMO                (1<<3)
+#define HCR_PTW                (1<<2)
+#define HCR_SWIO        (1<<1)
+#define HCR_VM                (1<<0)
+
+#define HSR_EC_WFI_WFE              0x01
+#define HSR_EC_CP15_32              0x03
+#define HSR_EC_CP15_64              0x04
+#define HSR_EC_CP14_32              0x05
+#define HSR_EC_CP14_DBG             0x06
+#define HSR_EC_CP                   0x07
+#define HSR_EC_CP10                 0x08
+#define HSR_EC_JAZELLE              0x09
+#define HSR_EC_BXJ                  0x0a
+#define HSR_EC_CP14_64              0x0c
+#define HSR_EC_SVC                  0x11
+#define HSR_EC_HVC                  0x12
+#define HSR_EC_INSTR_ABORT_GUEST    0x20
+#define HSR_EC_INSTR_ABORT_HYP      0x21
+#define HSR_EC_DATA_ABORT_GUEST     0x24
+#define HSR_EC_DATA_ABORT_HYP       0x25
+
+#ifndef __ASSEMBLY__
+union hsr {
+    uint32_t bits;
+    struct {
+        unsigned long iss:25;  /* Instruction Specific Syndrome */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    };
+
+    struct hsr_cp32 {
+        unsigned long read:1;  /* Direction */
+        unsigned long crm:4;   /* CRm */
+        unsigned long reg:4;   /* Rt */
+        unsigned long sbzp:1;
+        unsigned long crn:4;   /* CRn */
+        unsigned long op1:3;   /* Op1 */
+        unsigned long op2:3;   /* Op2 */
+        unsigned long cc:4;    /* Condition Code */
+        unsigned long ccvalid:1;/* CC Valid */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    } cp32; /* HSR_EC_CP15_32, CP14_32, CP10 */
+
+    struct hsr_cp64 {
+        unsigned long read:1;   /* Direction */
+        unsigned long crm:4;    /* CRm */
+        unsigned long reg1:4;   /* Rt1 */
+        unsigned long sbzp1:1;
+        unsigned long reg2:4;   /* Rt2 */
+        unsigned long sbzp2:2;
+        unsigned long op1:4;   /* Op1 */
+        unsigned long cc:4;    /* Condition Code */
+        unsigned long ccvalid:1;/* CC Valid */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    } cp64; /* HSR_EC_CP15_64, HSR_EC_CP14_64 */
+
+    struct hsr_dabt {
+        unsigned long dfsc:6;  /* Data Fault Status Code */
+        unsigned long write:1; /* Write / not Read */
+        unsigned long s1ptw:1; /* */
+        unsigned long cache:1; /* Cache Maintenance */
+        unsigned long eat:1;   /* External Abort Type */
+        unsigned long sbzp0:6;
+        unsigned long reg:4;   /* Register */
+        unsigned long sbzp1:1;
+        unsigned long sign:1;  /* Sign extend */
+        unsigned long size:2;  /* Access Size */
+        unsigned long valid:1; /* Syndrome Valid */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    } dabt; /* HSR_EC_DATA_ABORT_* */
+};
+#endif
+
+/* HSR.EC == HSR_CP{15,14,10}_32 */
+#define HSR_CP32_OP2_MASK (0x000e0000)
+#define HSR_CP32_OP2_SHIFT (17)
+#define HSR_CP32_OP1_MASK (0x0001c000)
+#define HSR_CP32_OP1_SHIFT (14)
+#define HSR_CP32_CRN_MASK (0x00003c00)
+#define HSR_CP32_CRN_SHIFT (10)
+#define HSR_CP32_CRM_MASK (0x0000001e)
+#define HSR_CP32_CRM_SHIFT (1)
+#define HSR_CP32_REGS_MASK (HSR_CP32_OP1_MASK|HSR_CP32_OP2_MASK|\
+                            HSR_CP32_CRN_MASK|HSR_CP32_CRM_MASK)
+
+/* HSR.EC == HSR_CP{15,14}_64 */
+#define HSR_CP64_OP1_MASK (0x000f0000)
+#define HSR_CP64_OP1_SHIFT (16)
+#define HSR_CP64_CRM_MASK (0x0000001e)
+#define HSR_CP64_CRM_SHIFT (1)
+#define HSR_CP64_REGS_MASK (HSR_CP64_OP1_MASK|HSR_CP64_CRM_MASK)
+
+/* Physical Address Register */
+#define PAR_F           (1<<0)
+
+/* .... If F == 1 */
+#define PAR_FSC_SHIFT   (1)
+#define PAR_FSC_MASK    (0x3f<<PAR_FSC_SHIFT)
+#define PAR_STAGE21     (1<<8)     /* Stage 2 Fault During Stage 1 Walk */
+#define PAR_STAGE2      (1<<9)     /* Stage 2 Fault */
+
+/* If F == 0 */
+#define PAR_MAIR_SHIFT  56                       /* Memory Attributes */
+#define PAR_MAIR_MASK   (0xffLL<<PAR_MAIR_SHIFT)
+#define PAR_NS          (1<<9)                   /* Non-Secure */
+#define PAR_SH_SHIFT    7                        /* Shareability */
+#define PAR_SH_MASK     (3<<PAR_SH_SHIFT)
+
+/* Fault Status Register */
+/*
+ * 543210 BIT
+ * 00XXLL -- XX Fault Level LL
+ * ..01LL -- Translation Fault LL
+ * ..10LL -- Access Fault LL
+ * ..11LL -- Permission Fault LL
+ * 01xxxx -- Abort/Parity
+ * 10xxxx -- Other
+ * 11xxxx -- Implementation Defined
+ */
+#define FSC_TYPE_MASK (0x3<<4)
+#define FSC_TYPE_FAULT (0x00<<4)
+#define FSC_TYPE_ABT   (0x01<<4)
+#define FSC_TYPE_OTH   (0x02<<4)
+#define FSC_TYPE_IMPL  (0x03<<4)
+
+#define FSC_FLT_TRANS  (0x04)
+#define FSC_FLT_ACCESS (0x08)
+#define FSC_FLT_PERM   (0x0c)
+#define FSC_SEA        (0x10) /* Synchronous External Abort */
+#define FSC_SPE        (0x18) /* Memory Access Synchronous Parity Error */
+#define FSC_APE        (0x11) /* Memory Access Asynchronous Parity Error */
+#define FSC_SEATT      (0x14) /* Sync. Ext. Abort Translation Table */
+#define FSC_SPETT      (0x1c) /* Sync. Parity. Error Translation Table */
+#define FSC_AF         (0x21) /* Alignment Fault */
+#define FSC_DE         (0x22) /* Debug Event */
+#define FSC_LKD        (0x34) /* Lockdown Abort */
+#define FSC_CPR        (0x3a) /* Coprocossor Abort */
+
+#define FSC_LL_MASK    (0x03<<0)
+
+/* Time counter hypervisor control register */
+#define CNTHCTL_PA      (1u<<0)  /* Kernel/user access to physical counter */
+#define CNTHCTL_TA      (1u<<1)  /* Kernel/user access to CNTP timer */
+
+/* Timer control registers */
+#define CNTx_CTL_ENABLE   (1u<<0)  /* Enable timer */
+#define CNTx_CTL_MASK     (1u<<1)  /* Mask IRQ */
+#define CNTx_CTL_PENDING  (1u<<2)  /* IRQ pending */
+
+/* CPUID bits */
+#define ID_PFR1_GT_MASK  0x000F0000  /* Generic Timer interface support */
+#define ID_PFR1_GT_v1    0x00010000
+
+#define MSR(reg,val)        asm volatile ("msr "#reg", %0\n" : : "r" (val))
+#define MRS(val,reg)        asm volatile ("mrs %0,"#reg"\n" : "=r" (v))
+
+#ifndef __ASSEMBLY__
+extern uint32_t hyp_traps_vector[8];
+
+void panic_PAR(uint64_t par, const char *when);
+
+void show_execution_state(struct cpu_user_regs *regs);
+void show_registers(struct cpu_user_regs *regs);
+//#define dump_execution_state() run_in_exception_handler(show_execution_state)
+#define dump_execution_state() asm volatile (".word 0xe7f000f0\n"); /* XXX */
+
+#define cpu_relax() barrier() /* Could yield? */
+
+/* All a bit UP for the moment */
+#define cpu_to_core(_cpu)   (0)
+#define cpu_to_socket(_cpu) (0)
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ASM_ARM_PROCESSOR_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/regs.h b/xen/include/asm-arm/regs.h
new file mode 100644
index 0000000..ee095bf
--- /dev/null
+++ b/xen/include/asm-arm/regs.h
@@ -0,0 +1,43 @@
+#ifndef __ARM_REGS_H__
+#define __ARM_REGS_H__
+
+#include <xen/types.h>
+#include <public/xen.h>
+#include <asm/processor.h>
+
+#define psr_mode(psr,m) (((psr) & PSR_MODE_MASK) == m)
+
+#define usr_mode(r)     psr_mode((r)->cpsr,PSR_MODE_USR)
+#define fiq_mode(r)     psr_mode((r)->cpsr,PSR_MODE_FIQ)
+#define irq_mode(r)     psr_mode((r)->cpsr,PSR_MODE_IRQ)
+#define svc_mode(r)     psr_mode((r)->cpsr,PSR_MODE_SVC)
+#define mon_mode(r)     psr_mode((r)->cpsr,PSR_MODE_MON)
+#define abt_mode(r)     psr_mode((r)->cpsr,PSR_MODE_ABT)
+#define hyp_mode(r)     psr_mode((r)->cpsr,PSR_MODE_HYP)
+#define und_mode(r)     psr_mode((r)->cpsr,PSR_MODE_UND)
+#define sys_mode(r)     psr_mode((r)->cpsr,PSR_MODE_SYS)
+
+#define guest_mode(r)                                                         \
+({                                                                            \
+    unsigned long diff = (char *)guest_cpu_user_regs() - (char *)(r);         \
+    /* Frame pointer must point into current CPU stack. */                    \
+    ASSERT(diff < STACK_SIZE);                                                \
+    /* If not a guest frame, it must be a hypervisor frame. */                \
+    ASSERT((diff == 0) || hyp_mode(r));                                       \
+    /* Return TRUE if it's a guest frame. */                                  \
+    (diff == 0);                                                              \
+})
+
+#define return_reg(v) ((v)->arch.user_regs.r0)
+
+#define CTXT_SWITCH_STACK_BYTES (sizeof(struct cpu_user_regs))
+
+#endif /* __ARM_REGS_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
new file mode 100644
index 0000000..c27d438
--- /dev/null
+++ b/xen/include/asm-arm/setup.h
@@ -0,0 +1,16 @@
+#ifndef __ARM_SETUP_H_
+#define __ARM_SETUP_H_
+
+#include <public/version.h>
+
+void arch_get_xen_caps(xen_capabilities_info_t *info);
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/smp.h b/xen/include/asm-arm/smp.h
new file mode 100644
index 0000000..9cdd87f
--- /dev/null
+++ b/xen/include/asm-arm/smp.h
@@ -0,0 +1,25 @@
+#ifndef __ASM_SMP_H
+#define __ASM_SMP_H
+
+#ifndef __ASSEMBLY__
+#include <xen/config.h>
+#include <xen/cpumask.h>
+#include <asm/current.h>
+#endif
+
+DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_mask);
+DECLARE_PER_CPU(cpumask_var_t, cpu_core_mask);
+
+#define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
+
+#define raw_smp_processor_id() (get_processor_id())
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/softirq.h b/xen/include/asm-arm/softirq.h
new file mode 100644
index 0000000..536af38
--- /dev/null
+++ b/xen/include/asm-arm/softirq.h
@@ -0,0 +1,15 @@
+#ifndef __ASM_SOFTIRQ_H__
+#define __ASM_SOFTIRQ_H__
+
+#define VGIC_SOFTIRQ        (NR_COMMON_SOFTIRQS + 0)
+#define NR_ARCH_SOFTIRQS       1
+
+#endif /* __ASM_SOFTIRQ_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/spinlock.h b/xen/include/asm-arm/spinlock.h
new file mode 100644
index 0000000..b1825c9
--- /dev/null
+++ b/xen/include/asm-arm/spinlock.h
@@ -0,0 +1,144 @@
+#ifndef __ASM_SPINLOCK_H
+#define __ASM_SPINLOCK_H
+
+#include <xen/config.h>
+#include <xen/lib.h>
+
+static inline void dsb_sev(void)
+{
+    __asm__ __volatile__ (
+        "dsb\n"
+        "sev\n"
+        );
+}
+
+typedef struct {
+    volatile unsigned int lock;
+} raw_spinlock_t;
+
+#define _RAW_SPIN_LOCK_UNLOCKED { 0 }
+
+#define _raw_spin_is_locked(x)          ((x)->lock != 0)
+
+static always_inline void _raw_spin_unlock(raw_spinlock_t *lock)
+{
+    ASSERT(_raw_spin_is_locked(lock));
+
+    smp_mb();
+
+    __asm__ __volatile__(
+"   str     %1, [%0]\n"
+    :
+    : "r" (&lock->lock), "r" (0)
+    : "cc");
+
+    dsb_sev();
+}
+
+static always_inline int _raw_spin_trylock(raw_spinlock_t *lock)
+{
+    unsigned long tmp;
+
+    __asm__ __volatile__(
+"   ldrex   %0, [%1]\n"
+"   teq     %0, #0\n"
+"   strexeq %0, %2, [%1]"
+    : "=&r" (tmp)
+    : "r" (&lock->lock), "r" (1)
+    : "cc");
+
+    if (tmp == 0) {
+        smp_mb();
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+typedef struct {
+    volatile unsigned int lock;
+} raw_rwlock_t;
+
+#define _RAW_RW_LOCK_UNLOCKED { 0 }
+
+static always_inline int _raw_read_trylock(raw_rwlock_t *rw)
+{
+    unsigned long tmp, tmp2 = 1;
+
+    __asm__ __volatile__(
+"1: ldrex   %0, [%2]\n"
+"   adds    %0, %0, #1\n"
+"   strexpl %1, %0, [%2]\n"
+    : "=&r" (tmp), "+r" (tmp2)
+    : "r" (&rw->lock)
+    : "cc");
+
+    smp_mb();
+    return tmp2 == 0;
+}
+
+static always_inline int _raw_write_trylock(raw_rwlock_t *rw)
+{
+    unsigned long tmp;
+
+    __asm__ __volatile__(
+"1: ldrex   %0, [%1]\n"
+"   teq     %0, #0\n"
+"   strexeq %0, %2, [%1]"
+    : "=&r" (tmp)
+    : "r" (&rw->lock), "r" (0x80000000)
+    : "cc");
+
+    if (tmp == 0) {
+        smp_mb();
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+static inline void _raw_read_unlock(raw_rwlock_t *rw)
+{
+    unsigned long tmp, tmp2;
+
+    smp_mb();
+
+    __asm__ __volatile__(
+"1: ldrex   %0, [%2]\n"
+"   sub     %0, %0, #1\n"
+"   strex   %1, %0, [%2]\n"
+"   teq     %1, #0\n"
+"   bne     1b"
+    : "=&r" (tmp), "=&r" (tmp2)
+    : "r" (&rw->lock)
+    : "cc");
+
+    if (tmp == 0)
+        dsb_sev();
+}
+
+static inline void _raw_write_unlock(raw_rwlock_t *rw)
+{
+    smp_mb();
+
+    __asm__ __volatile__(
+    "str    %1, [%0]\n"
+    :
+    : "r" (&rw->lock), "r" (0)
+    : "cc");
+
+    dsb_sev();
+}
+
+#define _raw_rw_is_locked(x) ((x)->lock != 0)
+#define _raw_rw_is_write_locked(x) ((x)->lock == 0x80000000)
+
+#endif /* __ASM_SPINLOCK_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/string.h b/xen/include/asm-arm/string.h
new file mode 100644
index 0000000..f2d643d
--- /dev/null
+++ b/xen/include/asm-arm/string.h
@@ -0,0 +1,38 @@
+#ifndef __ARM_STRING_H__
+#define __ARM_STRING_H__
+
+#include <xen/config.h>
+
+#define __HAVE_ARCH_MEMCPY
+extern void * memcpy(void *, const void *, __kernel_size_t);
+
+/* Some versions of gcc don't have this builtin. It's non-critical anyway. */
+#define __HAVE_ARCH_MEMMOVE
+extern void *memmove(void *dest, const void *src, size_t n);
+
+#define __HAVE_ARCH_MEMSET
+extern void * memset(void *, int, __kernel_size_t);
+
+extern void __memzero(void *ptr, __kernel_size_t n);
+
+#define memset(p,v,n)                                                   \
+        ({                                                              \
+                void *__p = (p); size_t __n = n;                        \
+                if ((__n) != 0) {                                       \
+                        if (__builtin_constant_p((v)) && (v) == 0)      \
+                                __memzero((__p),(__n));                 \
+                        else                                            \
+                                memset((__p),(v),(__n));                \
+                }                                                       \
+                (__p);                                                  \
+        })
+
+#endif /* __ARM_STRING_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/system.h b/xen/include/asm-arm/system.h
new file mode 100644
index 0000000..731d89f
--- /dev/null
+++ b/xen/include/asm-arm/system.h
@@ -0,0 +1,202 @@
+/* Portions taken from Linux arch arm */
+#ifndef __ASM_SYSTEM_H
+#define __ASM_SYSTEM_H
+
+#include <xen/lib.h>
+#include <asm/processor.h>
+
+#define nop() \
+    asm volatile ( "nop" )
+
+#define xchg(ptr,x) \
+        ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
+
+#define isb() __asm__ __volatile__ ("isb" : : : "memory")
+#define dsb() __asm__ __volatile__ ("dsb" : : : "memory")
+#define dmb() __asm__ __volatile__ ("dmb" : : : "memory")
+
+#define mb()            dsb()
+#define rmb()           dsb()
+#define wmb()           mb()
+
+#define smp_mb()        dmb()
+#define smp_rmb()       dmb()
+#define smp_wmb()       dmb()
+
+/*
+ * This is used to ensure the compiler did actually allocate the register we
+ * asked it for some inline assembly sequences.  Apparently we can't trust
+ * the compiler from one version to another so a bit of paranoia won't hurt.
+ * This string is meant to be concatenated with the inline asm string and
+ * will cause compilation to stop on mismatch.
+ * (for details, see gcc PR 15089)
+ */
+#define __asmeq(x, y)  ".ifnc " x "," y " ; .err ; .endif\n\t"
+
+extern void __bad_xchg(volatile void *, int);
+
+static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
+{
+        unsigned long ret;
+        unsigned int tmp;
+
+        smp_mb();
+
+        switch (size) {
+        case 1:
+                asm volatile("@ __xchg1\n"
+                "1:     ldrexb  %0, [%3]\n"
+                "       strexb  %1, %2, [%3]\n"
+                "       teq     %1, #0\n"
+                "       bne     1b"
+                        : "=&r" (ret), "=&r" (tmp)
+                        : "r" (x), "r" (ptr)
+                        : "memory", "cc");
+                break;
+        case 4:
+                asm volatile("@ __xchg4\n"
+                "1:     ldrex   %0, [%3]\n"
+                "       strex   %1, %2, [%3]\n"
+                "       teq     %1, #0\n"
+                "       bne     1b"
+                        : "=&r" (ret), "=&r" (tmp)
+                        : "r" (x), "r" (ptr)
+                        : "memory", "cc");
+                break;
+        default:
+                __bad_xchg(ptr, size), ret = 0;
+                break;
+        }
+        smp_mb();
+
+        return ret;
+}
+
+/*
+ * Atomic compare and exchange.  Compare OLD with MEM, if identical,
+ * store NEW in MEM.  Return the initial value in MEM.  Success is
+ * indicated by comparing RETURN with OLD.
+ */
+
+extern void __bad_cmpxchg(volatile void *ptr, int size);
+
+static always_inline unsigned long __cmpxchg(
+    volatile void *ptr, unsigned long old, unsigned long new, int size)
+{
+    unsigned long /*long*/ oldval, res;
+
+    switch (size) {
+    case 1:
+        do {
+            asm volatile("@ __cmpxchg1\n"
+                         "       ldrexb  %1, [%2]\n"
+                         "       mov     %0, #0\n"
+                         "       teq     %1, %3\n"
+                         "       strexbeq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+    case 2:
+        do {
+            asm volatile("@ __cmpxchg2\n"
+                         "       ldrexh  %1, [%2]\n"
+                         "       mov     %0, #0\n"
+                         "       teq     %1, %3\n"
+                         "       strexheq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+    case 4:
+        do {
+            asm volatile("@ __cmpxchg4\n"
+                         "       ldrex   %1, [%2]\n"
+                         "       mov     %0, #0\n"
+                         "       teq     %1, %3\n"
+                         "       strexeq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+#if 0
+    case 8:
+        do {
+            asm volatile("@ __cmpxchg8\n"
+                         "       ldrexd   %1, [%2]\n"
+                         "       mov      %0, #0\n"
+                         "       teq      %1, %3\n"
+                         "       strexdeq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+#endif
+    default:
+        __bad_cmpxchg(ptr, size);
+        oldval = 0;
+    }
+
+    return oldval;
+}
+#define cmpxchg(ptr,o,n)                                                \
+    ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),            \
+                                   (unsigned long)(n),sizeof(*(ptr))))
+
+#define local_irq_disable() asm volatile ( "cpsid i @ local_irq_disable\n" : : : "cc" )
+#define local_irq_enable()  asm volatile ( "cpsie i @ local_irq_enable\n" : : : "cc" )
+
+#define local_save_flags(x)                                      \
+({                                                               \
+    BUILD_BUG_ON(sizeof(x) != sizeof(long));                     \
+    asm volatile ( "mrs %0, cpsr     @ local_save_flags\n"       \
+                  : "=r" (x) :: "memory", "cc" );                \
+})
+#define local_irq_save(x)                                        \
+({                                                               \
+    local_save_flags(x);                                         \
+    local_irq_disable();                                         \
+})
+#define local_irq_restore(x)                                     \
+({                                                               \
+    BUILD_BUG_ON(sizeof(x) != sizeof(long));                     \
+    asm volatile (                                               \
+            "msr     cpsr_c, %0      @ local_irq_restore\n"      \
+            :                                                    \
+            : "r" (flags)                                        \
+            : "memory", "cc");                                   \
+})
+
+static inline int local_irq_is_enabled(void)
+{
+    unsigned long flags;
+    local_save_flags(flags);
+    return !(flags & PSR_IRQ_MASK);
+}
+
+#define local_fiq_enable()  __asm__("cpsie f   @ __stf\n" : : : "memory", "cc")
+#define local_fiq_disable() __asm__("cpsid f   @ __clf\n" : : : "memory", "cc")
+
+#define local_abort_enable() __asm__("cpsie a  @ __sta\n" : : : "memory", "cc")
+#define local_abort_disable() __asm__("cpsid a @ __sta\n" : : : "memory", "cc")
+
+static inline int local_fiq_is_enabled(void)
+{
+    unsigned long flags;
+    local_save_flags(flags);
+    return !!(flags & PSR_FIQ_MASK);
+}
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/trace.h b/xen/include/asm-arm/trace.h
new file mode 100644
index 0000000..db84541
--- /dev/null
+++ b/xen/include/asm-arm/trace.h
@@ -0,0 +1,12 @@
+#ifndef __ASM_TRACE_H__
+#define __ASM_TRACE_H__
+
+#endif /* __ASM_TRACE_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/types.h b/xen/include/asm-arm/types.h
new file mode 100644
index 0000000..48864f9
--- /dev/null
+++ b/xen/include/asm-arm/types.h
@@ -0,0 +1,57 @@
+#ifndef __ARM_TYPES_H__
+#define __ARM_TYPES_H__
+
+#ifndef __ASSEMBLY__
+
+#include <xen/config.h>
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+typedef signed char s8;
+typedef unsigned char u8;
+
+typedef signed short s16;
+typedef unsigned short u16;
+
+typedef signed int s32;
+typedef unsigned int u32;
+
+typedef signed long long s64;
+typedef unsigned long long u64;
+typedef u64 paddr_t;
+#define INVALID_PADDR (~0ULL)
+#define PRIpaddr "016llx"
+
+typedef unsigned long size_t;
+
+typedef char bool_t;
+#define test_and_set_bool(b)   xchg(&(b), 1)
+#define test_and_clear_bool(b) xchg(&(b), 0)
+
+#endif /* __ASSEMBLY__ */
+
+#define BITS_PER_LONG 32
+#define BYTES_PER_LONG 4
+#define LONG_BYTEORDER 2
+
+#endif /* __ARM_TYPES_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/xenoprof.h b/xen/include/asm-arm/xenoprof.h
new file mode 100644
index 0000000..131ac13
--- /dev/null
+++ b/xen/include/asm-arm/xenoprof.h
@@ -0,0 +1,12 @@
+#ifndef __ASM_XENOPROF_H__
+#define __ASM_XENOPROF_H__
+
+#endif /* __ASM_XENOPROF_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h
new file mode 100644
index 0000000..4d1daa9
--- /dev/null
+++ b/xen/include/public/arch-arm.h
@@ -0,0 +1,125 @@
+/******************************************************************************
+ * arch-arm.h
+ *
+ * Guest OS interface to ARM Xen.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Copyright 2011 (C) Citrix Systems
+ */
+
+#ifndef __XEN_PUBLIC_ARCH_ARM_H__
+#define __XEN_PUBLIC_ARCH_ARM_H__
+
+#ifndef __ASSEMBLY__
+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
+    typedef struct { type *p; } __guest_handle_ ## name
+
+#define __DEFINE_XEN_GUEST_HANDLE(name, type) \
+    ___DEFINE_XEN_GUEST_HANDLE(name, type);   \
+    ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type)
+#define DEFINE_XEN_GUEST_HANDLE(name)   __DEFINE_XEN_GUEST_HANDLE(name, name)
+#define __XEN_GUEST_HANDLE(name)        __guest_handle_ ## name
+#define XEN_GUEST_HANDLE(name)          __XEN_GUEST_HANDLE(name)
+#define set_xen_guest_handle_raw(hnd, val)  do { (hnd).p = val; } while (0)
+#ifdef __XEN_TOOLS__
+#define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
+#endif
+#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)
+
+struct cpu_user_regs
+{
+    uint32_t r0;
+    uint32_t r1;
+    uint32_t r2;
+    uint32_t r3;
+    uint32_t r4;
+    uint32_t r5;
+    uint32_t r6;
+    uint32_t r7;
+    uint32_t r8;
+    uint32_t r9;
+    uint32_t r10;
+    union {
+	uint32_t r11;
+	uint32_t fp;
+    };
+    uint32_t r12;
+
+    uint32_t sp; /* r13 - SP: Valid for Hyp. frames only, o/w banked (see below) */
+    uint32_t lr; /* r14 - LR: Valid for Hyp. Same physical register as lr_usr. */
+
+    uint32_t pc; /* Return IP */
+    uint32_t cpsr; /* Return mode */
+    uint32_t pad0; /* Doubleword-align the kernel half of the frame */
+
+    /* Outer guest frame only from here on... */
+
+    uint32_t r8_fiq, r9_fiq, r10_fiq, r11_fiq, r12_fiq;
+
+    uint32_t sp_usr, sp_svc, sp_abt, sp_und, sp_irq, sp_fiq;
+    uint32_t lr_usr, lr_svc, lr_abt, lr_und, lr_irq, lr_fiq;
+
+    uint32_t spsr_svc, spsr_abt, spsr_und, spsr_irq, spsr_fiq;
+};
+typedef struct cpu_user_regs cpu_user_regs_t;
+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
+
+typedef uint64_t xen_pfn_t;
+#define PRI_xen_pfn PRIx64
+
+/* Maximum number of virtual CPUs in legacy multi-processor guests. */
+/* Only one. All other VCPUS must use VCPUOP_register_vcpu_info */
+#define XEN_LEGACY_MAX_VCPUS 1
+
+typedef uint32_t xen_ulong_t;
+
+struct vcpu_guest_context {
+    struct cpu_user_regs user_regs;         /* User-level CPU registers     */
+    union {
+	uint32_t reg[16];
+	struct {
+	    uint32_t __pad[12];
+	    uint32_t sp; /* r13 */
+	    uint32_t lr; /* r14 */
+	    uint32_t pc; /* r15 */
+	};
+    };
+};
+typedef struct vcpu_guest_context vcpu_guest_context_t;
+DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
+
+struct arch_vcpu_info { };
+typedef struct arch_vcpu_info arch_vcpu_info_t;
+
+struct arch_shared_info { };
+typedef struct arch_shared_info arch_shared_info_t;
+#endif
+
+#endif /*  __XEN_PUBLIC_ARCH_ARM_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
index fde9fa5..7196400 100644
--- a/xen/include/public/xen.h
+++ b/xen/include/public/xen.h
@@ -33,6 +33,8 @@
 #include "arch-x86/xen.h"
 #elif defined(__ia64__)
 #include "arch-ia64.h"
+#elif defined(__arm__)
+#include "arch-arm.h"
 #else
 #error "Unsupported architecture"
 #endif
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Dec 09 18:55:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Fri, 09 Dec 2011 18:55:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RZ5bg-0001GJ-MY; Fri, 09 Dec 2011 18:55:40 +0000
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>) id 1RZ5bf-0001BN-13
	for xen-devel@lists.xensource.com; Fri, 09 Dec 2011 18:55:39 +0000
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1323456879!6616386!14
X-Originating-IP: [62.200.22.115]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjIuMjAwLjIyLjExNSA9PiA4NDI2MQ==\n
X-StarScan-Version: 6.4.2; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21474 invoked from network); 9 Dec 2011 18:54:48 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2011 18:54:48 -0000
X-IronPort-AV: E=Sophos;i="4.71,327,1320624000"; 
   d="scan'208";a="9392205"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Dec 2011 18:54:48 +0000
Received: from norwich.cam.xci-test.com (10.80.248.129) by
	smtprelay.citrix.com (10.30.203.162) with Microsoft SMTP Server id
	8.3.213.0; Fri, 9 Dec 2011 18:54:48 +0000
Received: from mariner.cam.xci-test.com	([10.80.2.22]
	helo=mariner.uk.xensource.com ident=Debian-exim)	by
	norwich.cam.xci-test.com
	with esmtp (Exim 4.72)	(envelope-from <Ian.Jackson@eu.citrix.com>)	id
	1RZ5aq-0002eL-Ag; Fri, 09 Dec 2011 18:54:48 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RZ5aq-00040l-9p;
	Fri, 09 Dec 2011 18:54:48 +0000
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Fri, 9 Dec 2011 18:54:32 +0000
Message-ID: <1323456877-15315-14-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1323456877-15315-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1323456877-15315-1-git-send-email-ian.jackson@eu.citrix.com>
MIME-Version: 1.0
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 13/18] libxl: Use GC_INIT and GC_FREE everywhere
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Replace
    libxl__gc gc = LIBXL_INIT_GC(ctx);
    ...
    libxl__free_all(&gc);
with
    GC_INIT(ctx);
    ...
    GC_FREE;
throughout with a couple of perl runes.

We must then adjust uses of the resulting gc for pointerness, which is
mostly just replacing all occurrences of "&gc" with "gc".  Also a
couple of unusual uses of LIBXL_INIT_GC needed to be fixed up by hand.

Here are those runes:
 perl -i -pe 's/\Q    libxl__gc gc = LIBXL_INIT_GC(ctx);/    GC_INIT(ctx);/' tools/libxl/*.c
 perl -i -pe 's/\Q    libxl__free_all(&gc);/    GC_FREE;/' tools/libxl/*.c

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
---
 tools/libxl/libxl.c            |  590 ++++++++++++++++++++--------------------
 tools/libxl/libxl_bootloader.c |   14 +-
 tools/libxl/libxl_create.c     |   12 +-
 tools/libxl/libxl_dom.c        |   16 +-
 tools/libxl/libxl_pci.c        |   34 ++--
 tools/libxl/libxl_qmp.c        |   32 +-
 tools/libxl/libxl_utils.c      |   36 ++--
 7 files changed, 367 insertions(+), 367 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 5a29c29..79ea701 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -233,19 +233,19 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid,
 int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid,
                         const char *old_name, const char *new_name)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = libxl__domain_rename(&gc, domid, old_name, new_name, XBT_NULL);
-    libxl__free_all(&gc);
+    rc = libxl__domain_rename(gc, domid, old_name, new_name, XBT_NULL);
+    GC_FREE;
     return rc;
 }
 
 int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = 0;
 
-    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
+    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
         LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Called domain_resume on "
                 "non-cooperative hvm domain %u", domid);
         rc = ERROR_NI;
@@ -265,7 +265,7 @@ int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid)
         rc = ERROR_FAIL;
     }
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -278,7 +278,7 @@ out:
 int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
                           libxl_domain_create_info *info, const char *name_suffix, libxl_uuid new_uuid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     struct xs_permissions roperm[2];
     xs_transaction_t t;
     char *preserved_name;
@@ -288,27 +288,27 @@ int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
 
     int rc;
 
-    preserved_name = libxl__sprintf(&gc, "%s%s", info->name, name_suffix);
+    preserved_name = libxl__sprintf(gc, "%s%s", info->name, name_suffix);
     if (!preserved_name) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
-    uuid_string = libxl__uuid2string(&gc, new_uuid);
+    uuid_string = libxl__uuid2string(gc, new_uuid);
     if (!uuid_string) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
-    vm_path = libxl__sprintf(&gc, "/vm/%s", uuid_string);
+    vm_path = libxl__sprintf(gc, "/vm/%s", uuid_string);
     if (!vm_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
@@ -324,20 +324,20 @@ int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
     xs_mkdir(ctx->xsh, t, vm_path);
     xs_set_permissions(ctx->xsh, t, vm_path, roperm, ARRAY_SIZE(roperm));
 
-    xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
-    rc = libxl__domain_rename(&gc, domid, info->name, preserved_name, t);
+    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
+    rc = libxl__domain_rename(gc, domid, info->name, preserved_name, t);
     if (rc) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return rc;
     }
 
-    xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
+    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
 
     if (!xs_transaction_end(ctx->xsh, t, 0))
         if (errno == EAGAIN)
             goto retry_transaction;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -479,16 +479,16 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm)
 int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info,
                          uint32_t domid, int fd)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    libxl_domain_type type = libxl__domain_type(&gc, domid);
+    GC_INIT(ctx);
+    libxl_domain_type type = libxl__domain_type(gc, domid);
     int live = info != NULL && info->flags & XL_SUSPEND_LIVE;
     int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG;
     int rc = 0;
 
-    rc = libxl__domain_suspend_common(&gc, domid, fd, type, live, debug);
+    rc = libxl__domain_suspend_common(gc, domid, fd, type, live, debug);
     if (!rc && type == LIBXL_DOMAIN_TYPE_HVM)
-        rc = libxl__domain_save_device_model(&gc, domid, fd);
-    libxl__free_all(&gc);
+        rc = libxl__domain_save_device_model(gc, domid, fd);
+    GC_FREE;
     return rc;
 }
 
@@ -518,17 +518,17 @@ int libxl_domain_core_dump(libxl_ctx *ctx, uint32_t domid,
 
 int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *path;
     char *state;
     int ret, rc = 0;
 
-    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
-        path = libxl__sprintf(&gc, "/local/domain/0/device-model/%d/state", domid);
-        state = libxl__xs_read(&gc, XBT_NULL, path);
+    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
+        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+        state = libxl__xs_read(gc, XBT_NULL, path);
         if (state != NULL && !strcmp(state, "paused")) {
-            libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/0/device-model/%d/command", domid), "continue");
-            libxl__wait_for_device_model(&gc, domid, "running",
+            libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid), "continue");
+            libxl__wait_for_device_model(gc, domid, "running",
                                          NULL, NULL, NULL);
         }
     }
@@ -537,7 +537,7 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unpausing domain %d", domid);
         rc = ERROR_FAIL;
     }
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -551,42 +551,42 @@ static char *req_table[] = {
 
 int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *shutdown_path;
     char *dom_path;
 
     if (req > ARRAY_SIZE(req_table)) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_INVAL;
     }
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
-    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
+    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
         unsigned long pvdriver = 0;
         int ret;
         ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
         if (ret<0) {
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting HVM callback IRQ");
-            libxl__free_all(&gc);
+            GC_FREE;
             return ERROR_FAIL;
         }
         if (!pvdriver) {
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "HVM domain without PV drivers:"
                        " graceful shutdown not possible, use destroy");
-            libxl__free_all(&gc);
+            GC_FREE;
             return ERROR_FAIL;
         }
     }
 
-    shutdown_path = libxl__sprintf(&gc, "%s/control/shutdown", dom_path);
+    shutdown_path = libxl__sprintf(gc, "%s/control/shutdown", dom_path);
     xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req]));
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -608,7 +608,7 @@ int libxl_wait_for_domain_death(libxl_ctx *ctx, uint32_t domid, libxl_waiter *wa
 
 int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_device_disk *disks, int num_disks, libxl_waiter *waiter)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int i, rc = -1;
     uint32_t domid = libxl_get_stubdom_id(ctx, guest_domid);
 
@@ -617,7 +617,7 @@ int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_devic
 
     for (i = 0; i < num_disks; i++) {
         if (asprintf(&(waiter[i].path), "%s/device/vbd/%d/eject",
-                     libxl__xs_get_dompath(&gc, domid),
+                     libxl__xs_get_dompath(gc, domid),
                      libxl__device_disk_dev_number(disks[i].vdev,
                                                    NULL, NULL)) < 0)
             goto out;
@@ -627,7 +627,7 @@ int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_devic
     }
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -681,22 +681,22 @@ int libxl_event_get_domain_death_info(libxl_ctx *ctx, uint32_t domid, libxl_even
 
 int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *path;
     char *backend;
     char *value;
     char backend_type[BACKEND_STRING_SIZE+1];
 
-    value = libxl__xs_read(&gc, XBT_NULL, event->path);
+    value = libxl__xs_read(gc, XBT_NULL, event->path);
 
     if (!value || strcmp(value,  "eject")) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return 0;
     }
 
     path = strdup(event->path);
     path[strlen(path) - 6] = '\0';
-    backend = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", path));
+    backend = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", path));
 
     sscanf(backend,
             "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE) "[a-z]/%*d/%*d",
@@ -712,19 +712,19 @@ int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event
     disk->pdev_path = strdup("");
     disk->format = LIBXL_DISK_FORMAT_EMPTY;
     /* this value is returned to the user: do not free right away */
-    disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend), NULL);
+    disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/dev", backend), NULL);
     disk->removable = 1;
     disk->readwrite = 0;
     disk->is_cdrom = 1;
 
     free(path);
-    libxl__free_all(&gc);
+    GC_FREE;
     return 1;
 }
 
 int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_dominfo dominfo;
     char *dom_path;
     char *vm_path;
@@ -741,40 +741,40 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
         return rc;
     }
 
-    switch (libxl__domain_type(&gc, domid)) {
+    switch (libxl__domain_type(gc, domid)) {
     case LIBXL_DOMAIN_TYPE_HVM:
         dm_present = 1;
         break;
     case LIBXL_DOMAIN_TYPE_PV:
-        pid = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/%d/image/device-model-pid", domid));
+        pid = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/%d/image/device-model-pid", domid));
         dm_present = (pid != NULL);
         break;
     default:
         abort();
     }
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
         rc = ERROR_FAIL;
         goto out;
     }
 
-    if (libxl__device_pci_destroy_all(&gc, domid) < 0)
+    if (libxl__device_pci_destroy_all(gc, domid) < 0)
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "pci shutdown failed for domid %d", domid);
     rc = xc_domain_pause(ctx->xch, domid);
     if (rc < 0) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "xc_domain_pause failed for %d", domid);
     }
     if (dm_present) {
-        if (libxl__destroy_device_model(&gc, domid) < 0)
+        if (libxl__destroy_device_model(gc, domid) < 0)
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl__destroy_device_model failed for %d", domid);
 
-        libxl__qmp_cleanup(&gc, domid);
+        libxl__qmp_cleanup(gc, domid);
     }
-    if (libxl__devices_destroy(&gc, domid, force) < 0)
+    if (libxl__devices_destroy(gc, domid, force) < 0)
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_devices_dispose failed for %d", domid);
 
-    vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
+    vm_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path));
     if (vm_path)
         if (!xs_rm(ctx->xsh, XBT_NULL, vm_path))
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", vm_path);
@@ -782,9 +782,9 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
     if (!xs_rm(ctx->xsh, XBT_NULL, dom_path))
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", dom_path);
 
-    xs_rm(ctx->xsh, XBT_NULL, libxl__xs_libxl_path(&gc, domid));
+    xs_rm(ctx->xsh, XBT_NULL, libxl__xs_libxl_path(gc, domid));
 
-    libxl__userdata_destroyall(&gc, domid);
+    libxl__userdata_destroyall(gc, domid);
 
     rc = xc_domain_destroy(ctx->xch, domid);
     if (rc < 0) {
@@ -794,16 +794,16 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
     }
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_console_type type)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *p = libxl__sprintf(&gc, "%s/xenconsole", libxl_private_bindir_path());
-    char *domid_s = libxl__sprintf(&gc, "%d", domid);
-    char *cons_num_s = libxl__sprintf(&gc, "%d", cons_num);
+    GC_INIT(ctx);
+    char *p = libxl__sprintf(gc, "%s/xenconsole", libxl_private_bindir_path());
+    char *domid_s = libxl__sprintf(gc, "%d", domid);
+    char *cons_num_s = libxl__sprintf(gc, "%d", cons_num);
     char *cons_type_s;
 
     switch (type) {
@@ -820,20 +820,20 @@ int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_conso
     execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, (void *)NULL);
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return ERROR_FAIL;
 }
 
 int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm);
     int rc;
     if (stubdomid)
         rc = libxl_console_exec(ctx, stubdomid,
                                 STUBDOM_CONSOLE_SERIAL, LIBXL_CONSOLE_TYPE_PV);
     else {
-        switch (libxl__domain_type(&gc, domid_vm)) {
+        switch (libxl__domain_type(gc, domid_vm)) {
         case LIBXL_DOMAIN_TYPE_HVM:
             rc = libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSOLE_TYPE_SERIAL);
             break;
@@ -844,13 +844,13 @@ int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
             abort();
         }
     }
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     const char *vnc_port;
     const char *vnc_listen = NULL, *vnc_pass = NULL;
     int port = 0, autopass_fd = -1;
@@ -861,19 +861,19 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
         NULL,
     };
 
-    vnc_port = libxl__xs_read(&gc, XBT_NULL,
-                            libxl__sprintf(&gc,
+    vnc_port = libxl__xs_read(gc, XBT_NULL,
+                            libxl__sprintf(gc,
                             "/local/domain/%d/console/vnc-port", domid));
     if ( vnc_port )
         port = atoi(vnc_port) - 5900;
 
-    vnc_listen = libxl__xs_read(&gc, XBT_NULL,
-                                libxl__sprintf(&gc,
+    vnc_listen = libxl__xs_read(gc, XBT_NULL,
+                                libxl__sprintf(gc,
                             "/local/domain/%d/console/vnc-listen", domid));
 
     if ( autopass )
-        vnc_pass = libxl__xs_read(&gc, XBT_NULL,
-                                  libxl__sprintf(&gc,
+        vnc_pass = libxl__xs_read(gc, XBT_NULL,
+                                  libxl__sprintf(gc,
                             "/local/domain/%d/console/vnc-pass", domid));
 
     if ( NULL == vnc_listen )
@@ -882,7 +882,7 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
     if ( (vnc_bin = getenv("VNCVIEWER")) )
         args[0] = vnc_bin;
 
-    args[1] = libxl__sprintf(&gc, "%s:%d", vnc_listen, port);
+    args[1] = libxl__sprintf(gc, "%s:%d", vnc_listen, port);
 
     if ( vnc_pass ) {
         char tmpname[] = "/tmp/vncautopass.XXXXXX";
@@ -917,7 +917,7 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
     abort();
 
  x_fail:
-    libxl__free_all(&gc);
+    GC_FREE;
     return ERROR_FAIL;
 }
 
@@ -971,17 +971,17 @@ static int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
 
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     char *dev;
     libxl__device device;
     int major, minor, rc;
 
-    rc = libxl__device_disk_set_backend(&gc, disk);
+    rc = libxl__device_disk_set_backend(gc, disk);
     if (rc) goto out;
 
-    rc = libxl__device_disk_set_backend(&gc, disk);
+    rc = libxl__device_disk_set_backend(gc, disk);
     if (rc) goto out;
 
     front = flexarray_make(16, 1);
@@ -1002,7 +1002,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
         goto out_free;
     }
 
-    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
     if (rc != 0) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
                " virtual disk identifier %s", disk->vdev);
@@ -1015,7 +1015,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
     do_backend_phy:
             libxl__device_physdisk_major_minor(dev, &major, &minor);
             flexarray_append(back, "physical-device");
-            flexarray_append(back, libxl__sprintf(&gc, "%x:%x", major, minor));
+            flexarray_append(back, libxl__sprintf(gc, "%x:%x", major, minor));
 
             flexarray_append(back, "params");
             flexarray_append(back, dev);
@@ -1023,13 +1023,13 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
             assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD);
             break;
         case LIBXL_DISK_BACKEND_TAP:
-            dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format);
+            dev = libxl__blktap_devpath(gc, disk->pdev_path, disk->format);
             if (!dev) {
                 rc = ERROR_FAIL;
                 goto out_free;
             }
             flexarray_append(back, "tapdisk-params");
-            flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
+            flexarray_append(back, libxl__sprintf(gc, "%s:%s",
                 libxl__device_disk_string_of_format(disk->format),
                 disk->pdev_path));
 
@@ -1037,7 +1037,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
             goto do_backend_phy;
         case LIBXL_DISK_BACKEND_QDISK:
             flexarray_append(back, "params");
-            flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
+            flexarray_append(back, libxl__sprintf(gc, "%s:%s",
                           libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
             assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK);
             break;
@@ -1048,15 +1048,15 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
     }
 
     flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
     flexarray_append(back, "online");
     flexarray_append(back, "1");
     flexarray_append(back, "removable");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", (disk->removable) ? 1 : 0));
+    flexarray_append(back, libxl__sprintf(gc, "%d", (disk->removable) ? 1 : 0));
     flexarray_append(back, "bootable");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     flexarray_append(back, "dev");
     flexarray_append(back, disk->vdev);
     flexarray_append(back, "type");
@@ -1067,17 +1067,17 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis
     flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
 
     flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid));
     flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
     flexarray_append(front, "virtual-device");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", device.devid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", device.devid));
     flexarray_append(front, "device-type");
     flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk");
 
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
 
     rc = 0;
 
@@ -1085,39 +1085,39 @@ out_free:
     flexarray_free(back);
     flexarray_free(front);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid,
                              libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1169,27 +1169,27 @@ static void libxl__device_disk_from_xs_be(libxl__gc *gc,
 int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
                                int devid, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *path;
     int rc = ERROR_FAIL;
 
     libxl_device_disk_init(ctx, disk);
 
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     if (!dompath) {
         goto out;
     }
-    path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
+    path = libxl__xs_read(gc, XBT_NULL,
+                          libxl__sprintf(gc, "%s/device/vbd/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
 
-    libxl__device_disk_from_xs_be(&gc, path, disk);
+    libxl__device_disk_from_xs_be(gc, path, disk);
 
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1229,22 +1229,22 @@ static int libxl__append_disk_list_of_type(libxl__gc *gc,
 
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_device_disk *disks = NULL;
     int rc;
 
     *num = 0;
 
-    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
+    rc = libxl__append_disk_list_of_type(gc, domid, "vbd", &disks, num);
     if (rc) goto out_err;
 
-    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
+    rc = libxl__append_disk_list_of_type(gc, domid, "tap", &disks, num);
     if (rc) goto out_err;
 
-    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
+    rc = libxl__append_disk_list_of_type(gc, domid, "qdisk", &disks, num);
     if (rc) goto out_err;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return disks;
 
 out_err:
@@ -1260,35 +1260,35 @@ out_err:
 int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk, libxl_diskinfo *diskinfo)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *diskpath;
     char *val;
 
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
 
     /* tap devices entries in xenstore are written as vbd devices. */
-    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
+    diskpath = libxl__sprintf(gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
     diskinfo->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", diskpath), NULL);
+                                libxl__sprintf(gc, "%s/backend", diskpath), NULL);
     if (!diskinfo->backend) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend-id", diskpath));
     diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/state", diskpath));
     diskinfo->state = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/event-channel", diskpath));
     diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/ring-ref", diskpath));
     diskinfo->rref = val ? strtoul(val, NULL, 10) : -1;
     diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend));
+                                 libxl__sprintf(gc, "%s/frontend", diskinfo->backend), NULL);
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend-id", diskinfo->backend));
     diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -1332,12 +1332,12 @@ out:
 
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dev = NULL;
     char *ret = NULL;
     int rc;
 
-    rc = libxl__device_disk_set_backend(&gc, disk);
+    rc = libxl__device_disk_set_backend(gc, disk);
     if (rc) goto out;
 
     switch (disk->backend) {
@@ -1356,7 +1356,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
                 dev = disk->pdev_path;
                 break;
             case LIBXL_DISK_FORMAT_VHD:
-                dev = libxl__blktap_devpath(&gc, disk->pdev_path,
+                dev = libxl__blktap_devpath(gc, disk->pdev_path,
                                             disk->format);
                 break;
             case LIBXL_DISK_FORMAT_QCOW:
@@ -1387,7 +1387,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
  out:
     if (dev != NULL)
         ret = strdup(dev);
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -1449,7 +1449,7 @@ static int libxl__device_from_nic(libxl__gc *gc, uint32_t domid,
 
 int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     libxl__device device;
@@ -1468,59 +1468,59 @@ int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic)
     }
 
     if (nic->devid == -1) {
-        if (!(dompath = libxl__xs_get_dompath(&gc, domid))) {
+        if (!(dompath = libxl__xs_get_dompath(gc, domid))) {
             rc = ERROR_FAIL;
             goto out_free;
         }
-        if (!(l = libxl__xs_directory(&gc, XBT_NULL,
-                                     libxl__sprintf(&gc, "%s/device/vif", dompath), &nb))) {
+        if (!(l = libxl__xs_directory(gc, XBT_NULL,
+                                     libxl__sprintf(gc, "%s/device/vif", dompath), &nb))) {
             nic->devid = 0;
         } else {
             nic->devid = strtoul(l[nb - 1], NULL, 10) + 1;
         }
     }
 
-    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
     if ( rc != 0 ) goto out_free;
 
     flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
     flexarray_append(back, "online");
     flexarray_append(back, "1");
     flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     if (nic->script) {
         flexarray_append(back, "script");
         flexarray_append(back, nic->script[0]=='/' ? nic->script
-                         : libxl__sprintf(&gc, "%s/%s",
+                         : libxl__sprintf(gc, "%s/%s",
                                           libxl_xen_script_dir_path(),
                                           nic->script));
     }
     flexarray_append(back, "mac");
-    flexarray_append(back,libxl__sprintf(&gc,
+    flexarray_append(back,libxl__sprintf(gc,
                                     LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
     if (nic->ip) {
         flexarray_append(back, "ip");
-        flexarray_append(back, libxl__strdup(&gc, nic->ip));
+        flexarray_append(back, libxl__strdup(gc, nic->ip));
     }
 
     flexarray_append(back, "bridge");
-    flexarray_append(back, libxl__strdup(&gc, nic->bridge));
+    flexarray_append(back, libxl__strdup(gc, nic->bridge));
     flexarray_append(back, "handle");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", nic->devid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", nic->devid));
 
     flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->backend_domid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", nic->backend_domid));
     flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
     flexarray_append(front, "handle");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->devid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", nic->devid));
     flexarray_append(front, "mac");
-    flexarray_append(front, libxl__sprintf(&gc,
+    flexarray_append(front, libxl__sprintf(gc,
                                     LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
 
     /* FIXME: wait for plug */
     rc = 0;
@@ -1528,39 +1528,39 @@ out_free:
     flexarray_free(back);
     flexarray_free(front);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1608,26 +1608,26 @@ static void libxl__device_nic_from_xs_be(libxl__gc *gc,
 int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
                               int devid, libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *path;
     int rc = ERROR_FAIL;
 
     memset(nic, 0, sizeof (libxl_device_nic));
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     if (!dompath)
         goto out;
 
-    path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vif/%d/backend",
+    path = libxl__xs_read(gc, XBT_NULL,
+                          libxl__sprintf(gc, "%s/device/vif/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
 
-    libxl__device_nic_from_xs_be(&gc, path, nic);
+    libxl__device_nic_from_xs_be(gc, path, nic);
 
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1666,16 +1666,16 @@ static int libxl__append_nic_list_of_type(libxl__gc *gc,
 
 libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_device_nic *nics = NULL;
     int rc;
 
     *num = 0;
 
-    rc = libxl__append_nic_list_of_type(&gc, domid, "vif", &nics, num);
+    rc = libxl__append_nic_list_of_type(gc, domid, "vif", &nics, num);
     if (rc) goto out_err;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return nics;
 
 out_err:
@@ -1691,36 +1691,36 @@ out_err:
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *nicpath;
     char *val;
 
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     nicinfo->devid = nic->devid;
 
-    nicpath = libxl__sprintf(&gc, "%s/device/vif/%d", dompath, nicinfo->devid);
+    nicpath = libxl__sprintf(gc, "%s/device/vif/%d", dompath, nicinfo->devid);
     nicinfo->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", nicpath), NULL);
+                                libxl__sprintf(gc, "%s/backend", nicpath), NULL);
     if (!nicinfo->backend) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend-id", nicpath));
     nicinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/state", nicpath));
     nicinfo->state = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/event-channel", nicpath));
     nicinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/tx-ring-ref", nicpath));
     nicinfo->rref_tx = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/rx-ring-ref", nicpath));
     nicinfo->rref_rx = val ? strtoul(val, NULL, 10) : -1;
     nicinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", nicinfo->backend), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nicinfo->backend));
+                                 libxl__sprintf(gc, "%s/frontend", nicinfo->backend), NULL);
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend-id", nicinfo->backend));
     nicinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -1826,7 +1826,7 @@ static int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid,
 
 int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     libxl__device device;
@@ -1843,64 +1843,64 @@ int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
         goto out_free;
     }
 
-    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
     if (rc != 0) goto out_free;
 
     flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
     flexarray_append(back, "online");
     flexarray_append(back, "1");
     flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     flexarray_append(back, "domain");
-    flexarray_append(back, libxl__domid_to_name(&gc, domid));
+    flexarray_append(back, libxl__domid_to_name(gc, domid));
 
     flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", vkb->backend_domid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", vkb->backend_domid));
     flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
 
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
     rc = 0;
 out_free:
     flexarray_free(back);
     flexarray_free(front);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_vkb *vkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_vkb *vkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1936,7 +1936,7 @@ static int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid,
 
 int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     libxl__device device;
@@ -1953,20 +1953,20 @@ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
         goto out_free;
     }
 
-    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
     if (rc != 0) goto out_free;
 
-    flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid));
+    flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", domid));
     flexarray_append_pair(back, "online", "1");
-    flexarray_append_pair(back, "state", libxl__sprintf(&gc, "%d", 1));
-    flexarray_append_pair(back, "domain", libxl__domid_to_name(&gc, domid));
-    flexarray_append_pair(back, "vnc", libxl__sprintf(&gc, "%d", vfb->vnc));
+    flexarray_append_pair(back, "state", libxl__sprintf(gc, "%d", 1));
+    flexarray_append_pair(back, "domain", libxl__domid_to_name(gc, domid));
+    flexarray_append_pair(back, "vnc", libxl__sprintf(gc, "%d", vfb->vnc));
     flexarray_append_pair(back, "vnclisten", vfb->vnclisten);
     flexarray_append_pair(back, "vncpasswd", vfb->vncpasswd);
-    flexarray_append_pair(back, "vncdisplay", libxl__sprintf(&gc, "%d", vfb->vncdisplay));
-    flexarray_append_pair(back, "vncunused", libxl__sprintf(&gc, "%d", vfb->vncunused));
-    flexarray_append_pair(back, "sdl", libxl__sprintf(&gc, "%d", vfb->sdl));
-    flexarray_append_pair(back, "opengl", libxl__sprintf(&gc, "%d", vfb->opengl));
+    flexarray_append_pair(back, "vncdisplay", libxl__sprintf(gc, "%d", vfb->vncdisplay));
+    flexarray_append_pair(back, "vncunused", libxl__sprintf(gc, "%d", vfb->vncunused));
+    flexarray_append_pair(back, "sdl", libxl__sprintf(gc, "%d", vfb->sdl));
+    flexarray_append_pair(back, "opengl", libxl__sprintf(gc, "%d", vfb->opengl));
     if (vfb->xauthority) {
         flexarray_append_pair(back, "xauthority", vfb->xauthority);
     }
@@ -1974,50 +1974,50 @@ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
         flexarray_append_pair(back, "display", vfb->display);
     }
 
-    flexarray_append_pair(front, "backend-id", libxl__sprintf(&gc, "%d", vfb->backend_domid));
-    flexarray_append_pair(front, "state", libxl__sprintf(&gc, "%d", 1));
+    flexarray_append_pair(front, "backend-id", libxl__sprintf(gc, "%d", vfb->backend_domid));
+    flexarray_append_pair(front, "state", libxl__sprintf(gc, "%d", 1));
 
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
     rc = 0;
 out_free:
     flexarray_free(front);
     flexarray_free(back);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_vfb *vfb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_vfb *vfb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2025,13 +2025,13 @@ out:
 
 int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *mem, *endptr;
     uint32_t memorykb;
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     int rc = 1;
 
-    mem = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/memory/target", dompath));
+    mem = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/memory/target", dompath));
     if (!mem) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot get memory info from %s/memory/target\n", dompath);
         goto out;
@@ -2056,7 +2056,7 @@ int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
 
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2164,12 +2164,12 @@ retry:
 int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid,
         int32_t target_memkb, int relative, int enforce)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = 1, abort = 0;
     uint32_t memorykb = 0, videoram = 0;
     uint32_t current_target_memkb = 0, new_target_memkb = 0;
     char *memmax, *endptr, *videoram_s = NULL, *target = NULL;
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     xc_domaininfo_t info;
     libxl_dominfo ptr;
     char *uuid;
@@ -2178,11 +2178,11 @@ int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid,
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
 
-    target = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+    target = libxl__xs_read(gc, t, libxl__sprintf(gc,
                 "%s/memory/target", dompath));
     if (!target && !domid) {
         xs_transaction_end(ctx->xsh, t, 1);
-        rc = libxl__fill_dom0_memory_info(&gc, &current_target_memkb);
+        rc = libxl__fill_dom0_memory_info(gc, &current_target_memkb);
         if (rc < 0) {
             abort = 1;
             goto out;
@@ -2204,7 +2204,7 @@ retry_transaction:
             goto out;
         }
     }
-    memmax = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+    memmax = libxl__xs_read(gc, t, libxl__sprintf(gc,
                 "%s/memory/static-max", dompath));
     if (!memmax) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
@@ -2244,7 +2244,7 @@ retry_transaction:
         abort = 1;
         goto out;
     }
-    videoram_s = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+    videoram_s = libxl__xs_read(gc, t, libxl__sprintf(gc,
                 "%s/memory/videoram", dompath));
     videoram = videoram_s ? atoi(videoram_s) : 0;
 
@@ -2273,7 +2273,7 @@ retry_transaction:
         goto out;
     }
 
-    libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/memory/target",
+    libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/memory/target",
                 dompath), "%"PRIu32, new_target_memkb);
     rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info);
     if (rc != 1 || info.domain != domid) {
@@ -2281,8 +2281,8 @@ retry_transaction:
         goto out;
     }
     xcinfo2xlinfo(&info, &ptr);
-    uuid = libxl__uuid2string(&gc, ptr.uuid);
-    libxl__xs_write(&gc, t, libxl__sprintf(&gc, "/vm/%s/memory", uuid),
+    uuid = libxl__uuid2string(gc, ptr.uuid);
+    libxl__xs_write(gc, t, libxl__sprintf(gc, "/vm/%s/memory", uuid),
             "%"PRIu32, new_target_memkb / 1024);
 
 out:
@@ -2290,22 +2290,22 @@ out:
         if (errno == EAGAIN)
             goto retry_transaction;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = 1;
     char *target = NULL, *endptr = NULL;
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     uint32_t target_memkb;
 
-    target = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc,
+    target = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc,
                 "%s/memory/target", dompath));
     if (!target && !domid) {
-        rc = libxl__fill_dom0_memory_info(&gc, &target_memkb);
+        rc = libxl__fill_dom0_memory_info(gc, &target_memkb);
         if (rc < 0)
             goto out;
     } else if (!target) {
@@ -2326,14 +2326,14 @@ int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target
     rc = 0;
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
         libxl_device_model_info *dm_info, uint32_t *need_memkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = ERROR_INVAL;
     *need_memkb = b_info->target_memkb;
     switch (b_info->type) {
@@ -2352,7 +2352,7 @@ int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
         *need_memkb += (2 * 1024) - (*need_memkb % (2 * 1024));
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 
 }
@@ -2362,12 +2362,12 @@ int libxl_get_free_memory(libxl_ctx *ctx, uint32_t *memkb)
     int rc = 0;
     libxl_physinfo info;
     uint32_t freemem_slack;
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
 
     rc = libxl_get_physinfo(ctx, &info);
     if (rc < 0)
         goto out;
-    rc = libxl__get_free_memory_slack(&gc, &freemem_slack);
+    rc = libxl__get_free_memory_slack(gc, &freemem_slack);
     if (rc < 0)
         goto out;
 
@@ -2377,7 +2377,7 @@ int libxl_get_free_memory(libxl_ctx *ctx, uint32_t *memkb)
         *memkb = 0;
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2387,9 +2387,9 @@ int libxl_wait_for_free_memory(libxl_ctx *ctx, uint32_t domid, uint32_t
     int rc = 0;
     libxl_physinfo info;
     uint32_t freemem_slack;
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
 
-    rc = libxl__get_free_memory_slack(&gc, &freemem_slack);
+    rc = libxl__get_free_memory_slack(gc, &freemem_slack);
     if (rc < 0)
         goto out;
     while (wait_secs > 0) {
@@ -2406,7 +2406,7 @@ int libxl_wait_for_free_memory(libxl_ctx *ctx, uint32_t domid, uint32_t
     rc = ERROR_NOMEM;
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2632,7 +2632,7 @@ int libxl_set_vcpuaffinity(libxl_ctx *ctx, uint32_t domid, uint32_t vcpuid,
 
 int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_dominfo info;
     char *dompath;
     xs_transaction_t t;
@@ -2642,14 +2642,14 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap)
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
         goto out;
     }
-    if (!(dompath = libxl__xs_get_dompath(&gc, domid)))
+    if (!(dompath = libxl__xs_get_dompath(gc, domid)))
         goto out;
 
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
     for (i = 0; i <= info.vcpu_max_id; i++)
-        libxl__xs_write(&gc, t,
-                       libxl__sprintf(&gc, "%s/cpu/%u/availability", dompath, i),
+        libxl__xs_write(gc, t,
+                       libxl__sprintf(gc, "%s/cpu/%u/availability", dompath, i),
                        "%s", libxl_cpumap_test(cpumap, i) ? "online" : "offline");
     if (!xs_transaction_end(ctx->xsh, t, 0)) {
         if (errno == EAGAIN)
@@ -2657,7 +2657,7 @@ retry_transaction:
     } else
         rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2777,12 +2777,12 @@ int libxl_send_trigger(libxl_ctx *ctx, uint32_t domid, char *trigger_name, uint3
 
 int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    GC_INIT(ctx);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
 
-    libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/control/sysrq", dompath), "%c", sysrq);
+    libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "%s/control/sysrq", dompath), "%c", sysrq);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -2869,15 +2869,15 @@ void libxl_xen_console_read_finish(libxl_ctx *ctx,
 
 uint32_t libxl_vm_get_start_time(libxl_ctx *ctx, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    GC_INIT(ctx);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     char *vm_path, *start_time;
     uint32_t ret;
 
     vm_path = libxl__xs_read(
-        &gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dompath));
+        gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dompath));
     start_time = libxl__xs_read(
-        &gc, XBT_NULL, libxl__sprintf(&gc, "%s/start_time", vm_path));
+        gc, XBT_NULL, libxl__sprintf(gc, "%s/start_time", vm_path));
     if (start_time == NULL) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, -1,
                         "Can't get start time of domain '%d'", domid);
@@ -2885,7 +2885,7 @@ uint32_t libxl_vm_get_start_time(libxl_ctx *ctx, uint32_t domid)
     }else{
         ret = strtoul(start_time, NULL, 10);
     }
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -3038,15 +3038,15 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
                          libxl_cpumap cpumap, libxl_uuid *uuid,
                          uint32_t *poolid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
     int i;
     xs_transaction_t t;
     char *uuid_string;
 
-    uuid_string = libxl__uuid2string(&gc, *uuid);
+    uuid_string = libxl__uuid2string(gc, *uuid);
     if (!uuid_string) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
@@ -3054,7 +3054,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
     if (rc) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
            "Could not create cpupool");
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
@@ -3065,7 +3065,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
                 LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
                     "Error moving cpu to cpupool");
                 libxl_cpupool_destroy(ctx, *poolid);
-                libxl__free_all(&gc);
+                GC_FREE;
                 return ERROR_FAIL;
             }
         }
@@ -3073,16 +3073,16 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        xs_mkdir(ctx->xsh, t, libxl__sprintf(&gc, "/local/pool/%d", *poolid));
-        libxl__xs_write(&gc, t,
-                        libxl__sprintf(&gc, "/local/pool/%d/uuid", *poolid),
+        xs_mkdir(ctx->xsh, t, libxl__sprintf(gc, "/local/pool/%d", *poolid));
+        libxl__xs_write(gc, t,
+                        libxl__sprintf(gc, "/local/pool/%d/uuid", *poolid),
                         "%s", uuid_string);
-        libxl__xs_write(&gc, t,
-                        libxl__sprintf(&gc, "/local/pool/%d/name", *poolid),
+        libxl__xs_write(gc, t,
+                        libxl__sprintf(gc, "/local/pool/%d/name", *poolid),
                         "%s", name);
 
         if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) {
-            libxl__free_all(&gc);
+            GC_FREE;
             return 0;
         }
     }
@@ -3090,7 +3090,7 @@ int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
 
 int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc, i;
     xc_cpupoolinfo_t *info;
     xs_transaction_t t;
@@ -3098,7 +3098,7 @@ int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
 
     info = xc_cpupool_getinfo(ctx->xch, poolid);
     if (info == NULL) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
@@ -3132,7 +3132,7 @@ int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "/local/pool/%d", poolid));
+        xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "/local/pool/%d", poolid));
 
         if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN))
             break;
@@ -3144,21 +3144,21 @@ out1:
     libxl_cpumap_dispose(&cpumap);
 out:
     xc_cpupool_infofree(ctx->xch, info);
-    libxl__free_all(&gc);
+    GC_FREE;
 
     return rc;
 }
 
 int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     xs_transaction_t t;
     xc_cpupoolinfo_t *info;
     int rc;
 
     info = xc_cpupool_getinfo(ctx->xch, poolid);
     if (info == NULL) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
@@ -3171,8 +3171,8 @@ int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        libxl__xs_write(&gc, t,
-                        libxl__sprintf(&gc, "/local/pool/%d/name", poolid),
+        libxl__xs_write(gc, t,
+                        libxl__sprintf(gc, "/local/pool/%d/name", poolid),
                         "%s", name);
 
         if (xs_transaction_end(ctx->xsh, t, 0))
@@ -3187,7 +3187,7 @@ int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
 
 out:
     xc_cpupool_infofree(ctx->xch, info);
-    libxl__free_all(&gc);
+    GC_FREE;
 
     return rc;
 }
@@ -3294,16 +3294,16 @@ out:
 
 int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
     char *dom_path;
     char *vm_path;
     char *poolname;
     xs_transaction_t t;
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
@@ -3311,26 +3311,26 @@ int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid)
     if (rc) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
             "Error moving domain to cpupool");
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        poolname = libxl__cpupoolid_to_name(&gc, poolid);
-        vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
+        poolname = libxl__cpupoolid_to_name(gc, poolid);
+        vm_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path));
         if (!vm_path)
             break;
 
-        libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/pool_name", vm_path),
+        libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/pool_name", vm_path),
                         "%s", poolname);
 
         if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN))
             break;
     }
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c
index b8399a1..ce83b8e 100644
--- a/tools/libxl/libxl_bootloader.c
+++ b/tools/libxl/libxl_bootloader.c
@@ -328,7 +328,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
                          libxl_device_disk *disk,
                          uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int ret, rc = 0;
     char *fifo = NULL;
     char *diskpath = NULL;
@@ -388,7 +388,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
         goto out_close;
     }
 
-    args = make_bootloader_args(&gc, info, domid, fifo, diskpath);
+    args = make_bootloader_args(gc, info, domid, fifo, diskpath);
     if (args == NULL) {
         rc = ERROR_NOMEM;
         goto out_close;
@@ -411,8 +411,8 @@ int libxl_run_bootloader(libxl_ctx *ctx,
         goto out_close;
     }
 
-    dom_console_xs_path = libxl__sprintf(&gc, "%s/console/tty", libxl__xs_get_dompath(&gc, domid));
-    libxl__xs_write(&gc, XBT_NULL, dom_console_xs_path, "%s", dom_console_slave_tty_path);
+    dom_console_xs_path = libxl__sprintf(gc, "%s/console/tty", libxl__xs_get_dompath(gc, domid));
+    libxl__xs_write(gc, XBT_NULL, dom_console_xs_path, "%s", dom_console_slave_tty_path);
 
     pid = fork_exec_bootloader(&bootloader_fd, info->u.pv.bootloader, args);
     if (pid < 0) {
@@ -435,7 +435,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
 
     fcntl(fifo_fd, F_SETFL, O_NDELAY);
 
-    blout = bootloader_interact(&gc, xenconsoled_fd, bootloader_fd, fifo_fd);
+    blout = bootloader_interact(gc, xenconsoled_fd, bootloader_fd, fifo_fd);
     if (blout == NULL) {
         goto out_close;
     }
@@ -445,7 +445,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
         goto out_close;
     }
 
-    parse_bootloader_result(&gc, info, blout);
+    parse_bootloader_result(gc, info, blout);
 
     rc = 0;
 out_close:
@@ -472,7 +472,7 @@ out_close:
     free(args);
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index ccb56c7..69f10fe 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -670,20 +670,20 @@ error_out:
 int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config,
                             libxl_console_ready cb, void *priv, uint32_t *domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = do_domain_create(&gc, d_config, cb, priv, domid, -1);
-    libxl__free_all(&gc);
+    rc = do_domain_create(gc, d_config, cb, priv, domid, -1);
+    GC_FREE;
     return rc;
 }
 
 int libxl_domain_create_restore(libxl_ctx *ctx, libxl_domain_config *d_config,
                                 libxl_console_ready cb, void *priv, uint32_t *domid, int restore_fd)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = do_domain_create(&gc, d_config, cb, priv, domid, restore_fd);
-    libxl__free_all(&gc);
+    rc = do_domain_create(gc, d_config, cb, priv, domid, restore_fd);
+    GC_FREE;
     return rc;
 }
 
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index 96098de..b1ff967 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -730,7 +730,7 @@ int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
                               const char *userdata_userid,
                               const uint8_t *data, int datalen)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     const char *filename;
     const char *newfilename;
     int e, rc;
@@ -738,18 +738,18 @@ int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
     FILE *f = NULL;
     size_t rs;
 
-    filename = userdata_path(&gc, domid, userdata_userid, "d");
+    filename = userdata_path(gc, domid, userdata_userid, "d");
     if (!filename) {
         rc = ERROR_NOMEM;
         goto out;
     }
 
     if (!datalen) {
-        rc = userdata_delete(&gc, filename);
+        rc = userdata_delete(gc, filename);
         goto out;
     }
 
-    newfilename = userdata_path(&gc, domid, userdata_userid, "n");
+    newfilename = userdata_path(gc, domid, userdata_userid, "n");
     if (!newfilename) {
         rc = ERROR_NOMEM;
         goto out;
@@ -791,7 +791,7 @@ err:
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot write %s for %s",
                  newfilename, filename);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -799,13 +799,13 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid,
                                  const char *userdata_userid,
                                  uint8_t **data_r, int *datalen_r)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     const char *filename;
     int e, rc;
     int datalen = 0;
     void *data = 0;
 
-    filename = userdata_path(&gc, domid, userdata_userid, "d");
+    filename = userdata_path(gc, domid, userdata_userid, "d");
     if (!filename) {
         rc = ERROR_NOMEM;
         goto out;
@@ -827,7 +827,7 @@ int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid,
     if (datalen_r) *datalen_r = datalen;
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 63c3050..120c239 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -483,7 +483,7 @@ static int is_assigned(libxl_device_pci *assigned, int num_assigned,
 
 libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_device_pci *pcidevs = NULL, *new, *assigned;
     struct dirent *de;
     DIR *dir;
@@ -491,7 +491,7 @@ libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
 
     *num = 0;
 
-    rc = get_all_assigned_devices(&gc, &assigned, &num_assigned);
+    rc = get_all_assigned_devices(gc, &assigned, &num_assigned);
     if ( rc )
         goto out;
 
@@ -528,7 +528,7 @@ libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
 out_closedir:
     closedir(dir);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return pcidevs;
 }
 
@@ -782,10 +782,10 @@ static int libxl__device_pci_reset(libxl__gc *gc, unsigned int domain, unsigned
 
 int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = libxl__device_pci_add(&gc, domid, pcidev, 0);
-    libxl__free_all(&gc);
+    rc = libxl__device_pci_add(gc, domid, pcidev, 0);
+    GC_FREE;
     return rc;
 }
 
@@ -1057,24 +1057,24 @@ out:
 
 int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
 
-    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 0);
+    rc = libxl__device_pci_remove_common(gc, domid, pcidev, 0);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_pci *pcidev)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
 
-    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 1);
+    rc = libxl__device_pci_remove_common(gc, domid, pcidev, 1);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1115,15 +1115,15 @@ static void libxl__device_pci_from_xs_be(libxl__gc *gc,
 
 libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *be_path, *num_devs;
     int n, i;
     libxl_device_pci *pcidevs = NULL;
 
     *num = 0;
 
-    be_path = libxl__sprintf(&gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(&gc, 0), domid);
-    num_devs = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/num_devs", be_path));
+    be_path = libxl__sprintf(gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(gc, 0), domid);
+    num_devs = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/num_devs", be_path));
     if (!num_devs)
         goto out;
 
@@ -1131,11 +1131,11 @@ libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num
     pcidevs = calloc(n, sizeof(libxl_device_pci));
 
     for (i = 0; i < n; i++)
-        libxl__device_pci_from_xs_be(&gc, be_path, pcidevs + i, i);
+        libxl__device_pci_from_xs_be(gc, be_path, pcidevs + i, i);
 
     *num = n;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return pcidevs;
 }
 
diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index c7696d7..60af98c 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -94,7 +94,7 @@ static int store_serial_port_info(libxl__qmp_handler *qmp,
                                   const char *chardev,
                                   int port)
 {
-    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    GC_INIT(qmp->ctx);
     char *path = NULL;
     int ret = 0;
 
@@ -102,12 +102,12 @@ static int store_serial_port_info(libxl__qmp_handler *qmp,
         return 0;
     }
 
-    path = libxl__xs_get_dompath(&gc, qmp->domid);
-    path = libxl__sprintf(&gc, "%s/serial/%d/tty", path, port);
+    path = libxl__xs_get_dompath(gc, qmp->domid);
+    path = libxl__sprintf(gc, "%s/serial/%d/tty", path, port);
 
-    ret = libxl__xs_write(&gc, XBT_NULL, path, "%s", chardev + 4);
+    ret = libxl__xs_write(gc, XBT_NULL, path, "%s", chardev + 4);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -521,7 +521,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
 {
     int id = 0;
     int ret = 0;
-    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    GC_INIT(qmp->ctx);
     qmp_request_context context = { .rc = 0 };
 
     id = qmp_send(qmp, cmd, args, callback, opaque, &context);
@@ -531,7 +531,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
     qmp->wait_for_id = id;
 
     while (qmp->wait_for_id == id) {
-        if ((ret = qmp_next(&gc, qmp)) < 0) {
+        if ((ret = qmp_next(gc, qmp)) < 0) {
             break;
         }
     }
@@ -540,7 +540,7 @@ static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
         ret = context.rc;
     }
 
-    libxl__free_all(&gc);
+    GC_FREE;
 
     return ret;
 }
@@ -559,15 +559,15 @@ libxl__qmp_handler *libxl__qmp_initialize(libxl_ctx *ctx, uint32_t domid)
     int ret = 0;
     libxl__qmp_handler *qmp = NULL;
     char *qmp_socket;
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
 
     qmp = qmp_init_handler(ctx, domid);
 
-    qmp_socket = libxl__sprintf(&gc, "%s/qmp-libxl-%d",
+    qmp_socket = libxl__sprintf(gc, "%s/qmp-libxl-%d",
                                 libxl_run_dir_path(), domid);
     if ((ret = qmp_open(qmp, qmp_socket, QMP_SOCKET_CONNECT_TIMEOUT)) < 0) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Connection error");
-        libxl__free_all(&gc);
+        GC_FREE;
         qmp_free_handler(qmp);
         return NULL;
     }
@@ -576,12 +576,12 @@ libxl__qmp_handler *libxl__qmp_initialize(libxl_ctx *ctx, uint32_t domid)
 
     /* Wait for the response to qmp_capabilities */
     while (!qmp->connected) {
-        if ((ret = qmp_next(&gc, qmp)) < 0) {
+        if ((ret = qmp_next(gc, qmp)) < 0) {
             break;
         }
     }
 
-    libxl__free_all(&gc);
+    GC_FREE;
     if (!qmp->connected) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Failed to connect to QMP");
         libxl__qmp_close(qmp);
@@ -626,9 +626,9 @@ static int pci_add_callback(libxl__qmp_handler *qmp,
 {
     libxl_device_pci *pcidev = opaque;
     const libxl__json_object *bus = NULL;
-    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    GC_INIT(qmp->ctx);
     int i, j, rc = -1;
-    char *asked_id = libxl__sprintf(&gc, PCI_PT_QDEV_ID,
+    char *asked_id = libxl__sprintf(gc, PCI_PT_QDEV_ID,
                                     pcidev->bus, pcidev->dev, pcidev->func);
 
     for (i = 0; (bus = libxl__json_array_get(response, i)); i++) {
@@ -665,7 +665,7 @@ static int pci_add_callback(libxl__qmp_handler *qmp,
 
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index f1f2a6d..d36c737 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -186,29 +186,29 @@ char *libxl_schedid_to_name(libxl_ctx *ctx, int schedid)
 
 int libxl_get_stubdom_id(libxl_ctx *ctx, int guest_domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char * stubdom_id_s;
     int ret;
 
-    stubdom_id_s = libxl__xs_read(&gc, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/image/device-model-domid",
-                                               libxl__xs_get_dompath(&gc, guest_domid)));
+    stubdom_id_s = libxl__xs_read(gc, XBT_NULL,
+                                 libxl__sprintf(gc, "%s/image/device-model-domid",
+                                               libxl__xs_get_dompath(gc, guest_domid)));
     if (stubdom_id_s)
         ret = atoi(stubdom_id_s);
     else
         ret = 0;
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
 int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *target, *endptr;
     uint32_t value;
     int ret = 0;
 
-    target = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/target", libxl__xs_get_dompath(&gc, domid)));
+    target = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/target", libxl__xs_get_dompath(gc, domid)));
     if (!target)
         goto out;
     value = strtol(target, &endptr, 10);
@@ -218,7 +218,7 @@ int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid)
         *target_domid = value;
     ret = 1;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -240,27 +240,27 @@ static int logrename(libxl__gc *gc, const char *old, const char *new)
 
 int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     struct stat stat_buf;
     char *logfile, *logfile_new;
     int i, rc;
 
-    logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log", name);
+    logfile = libxl__sprintf(gc, "/var/log/xen/%s.log", name);
     if (stat(logfile, &stat_buf) == 0) {
         /* file exists, rotate */
-        logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log.10", name);
+        logfile = libxl__sprintf(gc, "/var/log/xen/%s.log.10", name);
         unlink(logfile);
         for (i = 9; i > 0; i--) {
-            logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i);
-            logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i + 1);
-            rc = logrename(&gc, logfile, logfile_new);
+            logfile = libxl__sprintf(gc, "/var/log/xen/%s.log.%d", name, i);
+            logfile_new = libxl__sprintf(gc, "/var/log/xen/%s.log.%d", name, i + 1);
+            rc = logrename(gc, logfile, logfile_new);
             if (rc)
                 goto out;
         }
-        logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log", name);
-        logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.1", name);
+        logfile = libxl__sprintf(gc, "/var/log/xen/%s.log", name);
+        logfile_new = libxl__sprintf(gc, "/var/log/xen/%s.log.1", name);
 
-        rc = logrename(&gc, logfile, logfile_new);
+        rc = logrename(gc, logfile, logfile_new);
         if (rc)
             goto out;
     } else {
@@ -272,7 +272,7 @@ int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name)
     *full_name = strdup(logfile);
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Dec 09 20:21:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Fri, 09 Dec 2011 20:21:23 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RZ6w3-0005bO-NW; Fri, 09 Dec 2011 20:20:47 +0000
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Neal.Taylor@ca.com>) id 1RZ6w0-0005bJ-Lm
	for xen-devel@lists.xensource.com; Fri, 09 Dec 2011 20:20:45 +0000
X-Env-Sender: Neal.Taylor@ca.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1323461956!56089715!1
X-Originating-IP: [74.125.149.211]
X-SpamReason: No, hits=0.9 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_50_60,HTML_ATTR_UNIQUE,HTML_MESSAGE
X-StarScan-Version: 6.4.2; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32395 invoked from network); 9 Dec 2011 20:19:19 -0000
Received: from na3sys009aog114.obsmtp.com (HELO na3sys009aog114.obsmtp.com)
	(74.125.149.211)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Dec 2011 20:19:19 -0000
Received: from USILMS191.ca.com ([141.202.246.45]) (using TLSv1) by
	na3sys009aob114.postini.com ([74.125.148.12]) with SMTP
	ID DSNKTuJtZV14JjFrCEb478Zzi6zSOjnnErqF@postini.com;
	Fri, 09 Dec 2011 12:19:51 PST
Received: from USILMS174.ca.com (141.202.6.24) by USILMS191.ca.com
	(141.202.246.45) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Fri, 9 Dec 2011 15:19:48 -0500
Received: from USILMS110A.ca.com ([169.254.1.109]) by usilms174.ca.com
	([141.202.6.24]) with mapi id 14.01.0289.001;
	Fri, 9 Dec 2011 15:19:48 -0500
From: "Taylor, Neal E" <Neal.Taylor@ca.com>
To: xen-devel <xen-devel@lists.xensource.com>
Thread-Topic: Buffers not reachable by PCI
Thread-Index: Acy2r+Ulg1PsfbmtTl6QVj0jZAx7mw==
Date: Fri, 9 Dec 2011 20:19:47 +0000
Message-ID: <3E243B26F475504B9BB0BCC9728B0DA629E16E01@USILMS110A.ca.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
x-originating-ip: [138.42.46.108]
Content-Type: multipart/mixed;
	boundary="_005_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_"
MIME-Version: 1.0
Cc: Konrad Rzeszutek Wilk <konrad@darnok.org>, "Kalev,
	Leonid" <Leonid.Kalev@ca.com>, "Dave, Tushar N" <tushar.n.dave@intel.com>
Subject: [Xen-devel] Buffers not reachable by PCI
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--_005_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_
Content-Type: multipart/alternative;
	boundary="_000_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_"

--_000_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

We're running 64-bit Xex 4.1.1 and 32-bit Linux 3.0.4 Dom0 (Linux 3.1 shows=
 the same symptom.)

Several PCI drivers are unable to use DMA. Most fallback to using PIO but i=
n two instances the network drivers (e1000 and pcinet32) abort. The same ke=
rnel running on the same hardware without Xen works fine.

Digging through the code, in swiotlb-xen.c I find "DMA_BIT_MASK(32)" (0x000=
00000ffffffff) compared to "xen_virt_to_bus(xen_io_tlb_end - 1)" which reso=
lves to 0x1,20fd,feff. Since the address is larger than the mask, DMA is de=
clared as unsupportable.

In talking with others I hear Linux handles this situation with bounce buff=
ers. Is there a config setting I've missed to enable that for Xen? (Config =
file attached)


Relevant slice of source callback list:
xen_swiotlb_dma_supported (drivers/xen/swiotlb-xen.c: line 591)
dma_supported             (arch/x86/kernel/pci-dma.c: line 199)
dma_set_mask              (arch/x86/kernel/pci-dma.c: line 59)
e1000_probe               (drivers/net/e1000/e1000_main.c: line 986)


Relevant patches:

https://lkml.org/lkml/2011/9/1/100, "[PATCH v2] xen: x86_32: do not enable =
iterrupts when returning from exception in interrupt context"

http://xen.1045712.n5.nabble.com/PATCH-mm-sync-vmalloc-address-space-page-t=
ables-in-alloc-vm-area-td4757995.html "[PATCH] mm: sync vmalloc address spa=
ce page tables in alloc_vm_area()" (this patch was reverted for 3.1 but thi=
s is 3.0.4) and

an additional 2048 NR_IRQS to support (as I understand it) all the virtual =
devices we might support with 50 guests.

Not so relevant patches in md, nbd and loop.

lspci:
00:00.0 Host bridge: Intel Corporation E7520 Memory Controller Hub (rev 09)
00:02.0 PCI bridge: Intel Corporation E7525/E7520/E7320 PCI Express Port A =
(rev 09)
00:04.0 PCI bridge: Intel Corporation E7525/E7520 PCI Express Port B (rev 0=
9)
00:05.0 PCI bridge: Intel Corporation E7520 PCI Express Port B1 (rev 09)
00:06.0 PCI bridge: Intel Corporation E7520 PCI Express Port C (rev 09)
00:1d.0 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI =
Controller #1 (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI =
Controller #2 (rev 02)
00:1d.2 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI =
Controller #3 (rev 02)
00:1d.7 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB2 EHCI=
 Controller (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev c2)
00:1f.0 ISA bridge: Intel Corporation 82801EB/ER (ICH5/ICH5R) LPC Interface=
 Bridge (rev 02)
00:1f.1 IDE interface: Intel Corporation 82801EB/ER (ICH5/ICH5R) IDE Contro=
ller (rev 02)
01:00.0 PCI bridge: Intel Corporation 80332 [Dobson] I/O processor (A-Segme=
nt Bridge) (rev 06)
01:00.2 PCI bridge: Intel Corporation 80332 [Dobson] I/O processor (B-Segme=
nt Bridge) (rev 06)
02:05.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fu=
sion-MPT Dual Ultra320 SCSI (rev 08)
05:00.0 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Bridge A (=
rev 09)
05:00.2 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Bridge B (=
rev 09)
06:07.0 Ethernet controller: Intel Corporation 82541GI Gigabit Ethernet Con=
troller (rev 05)
07:08.0 Ethernet controller: Intel Corporation 82541GI Gigabit Ethernet Con=
troller (rev 05)
09:05.0 Class ff00: Dell Remote Access Card 4 Daughter Card
09:05.1 Class ff00: Dell Remote Access Card 4 Daughter Card Virtual UART
09:05.2 Class ff00: Dell Remote Access Card 4 Daughter Card SMIC interface
09:06.0 IDE interface: Silicon Image, Inc. PCI0680 Ultra ATA-133 Host Contr=
oller (rev 02)
09:0d.0 VGA compatible controller: ATI Technologies Inc Radeon RV100 QY [Ra=
deon 7000/VE]

     1  00:00.0 Host bridge: Intel Corporation E7520 Memory Controller Hub =
(rev 09)
     2  00:02.0 PCI bridge: Intel Corporation E7525/E7520/E7320 PCI Express=
 Port A (rev 09)
     3  00:04.0 PCI bridge: Intel Corporation E7525/E7520 PCI Express Port =
B (rev 09)
     4  00:05.0 PCI bridge: Intel Corporation E7520 PCI Express Port B1 (re=
v 09)
     5  00:06.0 PCI bridge: Intel Corporation E7520 PCI Express Port C (rev=
 09)
     6  00:1d.0 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) U=
SB UHCI Controller #1 (rev 02)
     7  00:1d.1 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) U=
SB UHCI Controller #2 (rev 02)
     8  00:1d.2 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) U=
SB UHCI Controller #3 (rev 02)
     9  00:1d.7 USB Controller: Intel Corporation 82801EB/ER (ICH5/ICH5R) U=
SB2 EHCI Controller (rev 02)
    10  00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev c2)
    11  00:1f.0 ISA bridge: Intel Corporation 82801EB/ER (ICH5/ICH5R) LPC I=
nterface Bridge (rev 02)
    12  00:1f.1 IDE interface: Intel Corporation 82801EB/ER (ICH5/ICH5R) ID=
E Controller (rev 02)
    13  01:00.0 PCI bridge: Intel Corporation 80332 [Dobson] I/O processor =
(A-Segment Bridge) (rev 06)
    14  01:00.2 PCI bridge: Intel Corporation 80332 [Dobson] I/O processor =
(B-Segment Bridge) (rev 06)
    15  02:05.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 =
PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 08)
    16  05:00.0 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Br=
idge A (rev 09)
    17  05:00.2 PCI bridge: Intel Corporation 6700PXH PCI Express-to-PCI Br=
idge B (rev 09)
    18  06:07.0 Ethernet controller: Intel Corporation 82541GI Gigabit Ethe=
rnet Controller (rev 05)
    19  07:08.0 Ethernet controller: Intel Corporation 82541GI Gigabit Ethe=
rnet Controller (rev 05)
    20  09:05.0 Class ff00: Dell Remote Access Card 4 Daughter Card
    21  09:05.1 Class ff00: Dell Remote Access Card 4 Daughter Card Virtual=
 UART
    22  09:05.2 Class ff00: Dell Remote Access Card 4 Daughter Card SMIC in=
terface
    23  09:06.0 IDE interface: Silicon Image, Inc. PCI0680 Ultra ATA-133 Ho=
st Controller (rev 02)
    24  09:0d.0 VGA compatible controller: ATI Technologies Inc Radeon RV10=
0 QY [Radeon 7000/VE]

06:07.0 Ethernet controller: Intel Corporation 82541GI Gigabit Ethernet Con=
troller (rev 05)
        Subsystem: Dell PRO/1000 MT Network Connection
        Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV+ VGASnoop- ParErr-=
 Stepping- SERR+ FastB2B-
        Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=3Dmedium >TAbort- =
<TAbort- <MAbort- >SERR- <PERR-
        Interrupt: pin A routed to IRQ 64
        Region 0: Memory at dfae0000 (32-bit, non-prefetchable) [size=3D128=
K]
        Region 2: I/O ports at dcc0 [size=3D64]
        Capabilities: [dc] Power Management version 2
                Flags: PMEClk- DSI+ D1- D2- AuxCurrent=3D0mA PME(D0+,D1-,D2=
-,D3hot+,D3cold+)
                Status: D0 PME-Enable- DSel=3D0 DScale=3D1 PME-
        Capabilities: [e4] PCI-X non-bridge device
                Command: DPERE- ERO+ RBC=3D512 OST=3D1
                Status: Dev=3D00:00.0 64bit- 133MHz- SCD- USC- DC=3Dsimple =
DMMRBC=3D2048 DMOST=3D1 DMCRS=3D8 RSCEM- 266MHz- 533MHz-

log file attached.

--_000_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_
Content-Type: text/html; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html xmlns:v=3D"urn:schemas-microsoft-com:vml" xmlns:o=3D"urn:schemas-micr=
osoft-com:office:office" xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:x=3D"urn:schemas-microsoft-com:office:excel" xmlns:p=3D"urn:schemas-m=
icrosoft-com:office:powerpoint" xmlns:a=3D"urn:schemas-microsoft-com:office=
:access" xmlns:dt=3D"uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s=3D"=
uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs=3D"urn:schemas-microsof=
t-com:rowset" xmlns:z=3D"#RowsetSchema" xmlns:b=3D"urn:schemas-microsoft-co=
m:office:publisher" xmlns:ss=3D"urn:schemas-microsoft-com:office:spreadshee=
t" xmlns:c=3D"urn:schemas-microsoft-com:office:component:spreadsheet" xmlns=
:odc=3D"urn:schemas-microsoft-com:office:odc" xmlns:oa=3D"urn:schemas-micro=
soft-com:office:activation" xmlns:html=3D"http://www.w3.org/TR/REC-html40" =
xmlns:q=3D"http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc=3D"http://m=
icrosoft.com/officenet/conferencing" xmlns:D=3D"DAV:" xmlns:Repl=3D"http://=
schemas.microsoft.com/repl/" xmlns:mt=3D"http://schemas.microsoft.com/share=
point/soap/meetings/" xmlns:x2=3D"http://schemas.microsoft.com/office/excel=
/2003/xml" xmlns:ppda=3D"http://www.passport.com/NameSpace.xsd" xmlns:ois=
=3D"http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir=3D"http://=
schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds=3D"http://www.w3=
.org/2000/09/xmldsig#" xmlns:dsp=3D"http://schemas.microsoft.com/sharepoint=
/dsp" xmlns:udc=3D"http://schemas.microsoft.com/data/udc" xmlns:xsd=3D"http=
://www.w3.org/2001/XMLSchema" xmlns:sub=3D"http://schemas.microsoft.com/sha=
repoint/soap/2002/1/alerts/" xmlns:ec=3D"http://www.w3.org/2001/04/xmlenc#"=
 xmlns:sp=3D"http://schemas.microsoft.com/sharepoint/" xmlns:sps=3D"http://=
schemas.microsoft.com/sharepoint/soap/" xmlns:xsi=3D"http://www.w3.org/2001=
/XMLSchema-instance" xmlns:udcs=3D"http://schemas.microsoft.com/data/udc/so=
ap" xmlns:udcxf=3D"http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udc=
p2p=3D"http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf=3D"http:/=
/schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss=3D"http://sche=
mas.microsoft.com/office/2006/digsig-setup" xmlns:dssi=3D"http://schemas.mi=
crosoft.com/office/2006/digsig" xmlns:mdssi=3D"http://schemas.openxmlformat=
s.org/package/2006/digital-signature" xmlns:mver=3D"http://schemas.openxmlf=
ormats.org/markup-compatibility/2006" xmlns:m=3D"http://schemas.microsoft.c=
om/office/2004/12/omml" xmlns:mrels=3D"http://schemas.openxmlformats.org/pa=
ckage/2006/relationships" xmlns:spwp=3D"http://microsoft.com/sharepoint/web=
partpages" xmlns:ex12t=3D"http://schemas.microsoft.com/exchange/services/20=
06/types" xmlns:ex12m=3D"http://schemas.microsoft.com/exchange/services/200=
6/messages" xmlns:pptsl=3D"http://schemas.microsoft.com/sharepoint/soap/Sli=
deLibrary/" xmlns:spsl=3D"http://microsoft.com/webservices/SharePointPortal=
Server/PublishedLinksService" xmlns:Z=3D"urn:schemas-microsoft-com:" xmlns:=
st=3D"&#1;" xmlns=3D"http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dus-ascii"=
>
<meta name=3D"Generator" content=3D"Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
	{mso-style-priority:99;
	color:blue;
	text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
	{mso-style-priority:99;
	color:purple;
	text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
	{mso-style-priority:99;
	mso-style-link:"Plain Text Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:10.5pt;
	font-family:Consolas;}
span.EmailStyle17
	{mso-style-type:personal-compose;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
span.PlainTextChar
	{mso-style-name:"Plain Text Char";
	mso-style-priority:99;
	mso-style-link:"Plain Text";
	font-family:Consolas;}
.MsoChpDefault
	{mso-style-type:export-only;}
@page WordSection1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
	{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext=3D"edit" spidmax=3D"1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext=3D"edit">
<o:idmap v:ext=3D"edit" data=3D"1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=3D"EN-US" link=3D"blue" vlink=3D"purple">
<div class=3D"WordSection1">
<p class=3D"MsoNormal">We&#8217;re running 64-bit Xex 4.1.1 and 32-bit Linu=
x 3.0.4 Dom0 (Linux 3.1 shows the same symptom.)<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal">Several PCI drivers are unable to use DMA. Most fall=
back to using PIO but in two instances the network drivers (e1000 and pcine=
t32) abort. The same kernel running on the same hardware without Xen works =
fine.<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal">Digging through the code, in swiotlb-xen.c I find &#=
8220;DMA_BIT_MASK(32)&#8221; (0x00000000ffffffff) compared to &#8220;xen_vi=
rt_to_bus(xen_io_tlb_end - 1)&#8221; which resolves to 0x1,20fd,feff. Since=
 the address is larger than the mask, DMA is declared as unsupportable.<o:p=
></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal">In talking with others I hear Linux handles this sit=
uation with bounce buffers. Is there a config setting I&#8217;ve missed to =
enable that for Xen? (Config file attached)<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal">Relevant slice of source callback list:<o:p></o:p></=
p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Courier New&quot;">=
xen_swiotlb_dma_supported (drivers/xen/swiotlb-xen.c: line 591)<o:p></o:p><=
/span></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Courier New&quot;">=
dma_supported&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp; (arch/x86/kernel/pci-dma.c: line 199)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Courier New&quot;">=
dma_set_mask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;(arch/x86/kernel/pci-dma.c: line 59)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Courier New&quot;">=
e1000_probe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp; (drivers/net/e1000/e1000_main.c: line 986)<o:p></o:p><=
/span></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Courier New&quot;">=
<o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span style=3D"font-family:&quot;Courier New&quot;">=
<o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal">Relevant patches:<o:p></o:p></p>
<p class=3D"MsoPlainText"><a href=3D"https://lkml.org/lkml/2011/9/1/100">ht=
tps://lkml.org/lkml/2011/9/1/100</a>, &quot;[PATCH v2] xen: x86_32: do not =
enable iterrupts when returning from exception in interrupt context&quot;<o=
:p></o:p></p>
<p class=3D"MsoPlainText"><a href=3D"http://xen.1045712.n5.nabble.com/PATCH=
-mm-sync-vmalloc-address-space-page-tables-in-alloc-vm-area-td4757995.html"=
>http://xen.1045712.n5.nabble.com/PATCH-mm-sync-vmalloc-address-space-page-=
tables-in-alloc-vm-area-td4757995.html</a>
 &quot;[PATCH] mm: sync vmalloc address space page tables in alloc_vm_area(=
)&quot; (this patch was reverted for 3.1 but this is 3.0.4) and
<o:p></o:p></p>
<p class=3D"MsoPlainText">an additional 2048 NR_IRQS to support (as I under=
stand it) all the virtual devices we might support with 50 guests.<o:p></o:=
p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal">Not so relevant patches in md, nbd and loop.<o:p></o=
:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal">lspci:<o:p></o:p></p>
<p class=3D"MsoNormal">00:00.0 Host bridge: Intel Corporation E7520 Memory =
Controller Hub (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">00:02.0 PCI bridge: Intel Corporation E7525/E7520/E7=
320 PCI Express Port A (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">00:04.0 PCI bridge: Intel Corporation E7525/E7520 PC=
I Express Port B (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">00:05.0 PCI bridge: Intel Corporation E7520 PCI Expr=
ess Port B1 (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">00:06.0 PCI bridge: Intel Corporation E7520 PCI Expr=
ess Port C (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">00:1d.0 USB Controller: Intel Corporation 82801EB/ER=
 (ICH5/ICH5R) USB UHCI Controller #1 (rev 02)<o:p></o:p></p>
<p class=3D"MsoNormal">00:1d.1 USB Controller: Intel Corporation 82801EB/ER=
 (ICH5/ICH5R) USB UHCI Controller #2 (rev 02)<o:p></o:p></p>
<p class=3D"MsoNormal">00:1d.2 USB Controller: Intel Corporation 82801EB/ER=
 (ICH5/ICH5R) USB UHCI Controller #3 (rev 02)<o:p></o:p></p>
<p class=3D"MsoNormal">00:1d.7 USB Controller: Intel Corporation 82801EB/ER=
 (ICH5/ICH5R) USB2 EHCI Controller (rev 02)<o:p></o:p></p>
<p class=3D"MsoNormal">00:1e.0 PCI bridge: Intel Corporation 82801 PCI Brid=
ge (rev c2)<o:p></o:p></p>
<p class=3D"MsoNormal">00:1f.0 ISA bridge: Intel Corporation 82801EB/ER (IC=
H5/ICH5R) LPC Interface Bridge (rev 02)<o:p></o:p></p>
<p class=3D"MsoNormal">00:1f.1 IDE interface: Intel Corporation 82801EB/ER =
(ICH5/ICH5R) IDE Controller (rev 02)<o:p></o:p></p>
<p class=3D"MsoNormal">01:00.0 PCI bridge: Intel Corporation 80332 [Dobson]=
 I/O processor (A-Segment Bridge) (rev 06)<o:p></o:p></p>
<p class=3D"MsoNormal">01:00.2 PCI bridge: Intel Corporation 80332 [Dobson]=
 I/O processor (B-Segment Bridge) (rev 06)<o:p></o:p></p>
<p class=3D"MsoNormal">02:05.0 SCSI storage controller: LSI Logic / Symbios=
 Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 08)<o:p></o:p></p>
<p class=3D"MsoNormal">05:00.0 PCI bridge: Intel Corporation 6700PXH PCI Ex=
press-to-PCI Bridge A (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">05:00.2 PCI bridge: Intel Corporation 6700PXH PCI Ex=
press-to-PCI Bridge B (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">06:07.0 Ethernet controller: Intel Corporation 82541=
GI Gigabit Ethernet Controller (rev 05)<o:p></o:p></p>
<p class=3D"MsoNormal">07:08.0 Ethernet controller: Intel Corporation 82541=
GI Gigabit Ethernet Controller (rev 05)<o:p></o:p></p>
<p class=3D"MsoNormal">09:05.0 Class ff00: Dell Remote Access Card 4 Daught=
er Card<o:p></o:p></p>
<p class=3D"MsoNormal">09:05.1 Class ff00: Dell Remote Access Card 4 Daught=
er Card Virtual UART<o:p></o:p></p>
<p class=3D"MsoNormal">09:05.2 Class ff00: Dell Remote Access Card 4 Daught=
er Card SMIC interface<o:p></o:p></p>
<p class=3D"MsoNormal">09:06.0 IDE interface: Silicon Image, Inc. PCI0680 U=
ltra ATA-133 Host Controller (rev 02)<o:p></o:p></p>
<p class=3D"MsoNormal">09:0d.0 VGA compatible controller: ATI Technologies =
Inc Radeon RV100 QY [Radeon 7000/VE]<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; 00:00.0 Host bridge=
: Intel Corporation E7520 Memory Controller Hub (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp; 00:02.0 PCI bridge:=
 Intel Corporation E7525/E7520/E7320 PCI Express Port A (rev 09)<o:p></o:p>=
</p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp; 00:04.0 PCI bridge:=
 Intel Corporation E7525/E7520 PCI Express Port B (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp; 00:05.0 PCI bridge:=
 Intel Corporation E7520 PCI Express Port B1 (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp; 00:06.0 PCI bridge:=
 Intel Corporation E7520 PCI Express Port C (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp; 00:1d.0 USB Control=
ler: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1 (rev =
02)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp; 00:1d.1 USB Control=
ler: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2 (rev =
02)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp; 00:1d.2 USB Control=
ler: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3 (rev =
02)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp; 00:1d.7 USB Control=
ler: Intel Corporation 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller (rev 02=
)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 10&nbsp; 00:1e.0 PCI bridge: Inte=
l Corporation 82801 PCI Bridge (rev c2)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 11&nbsp; 00:1f.0 ISA bridge: Inte=
l Corporation 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge (rev 02)<o:p></o=
:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 12&nbsp; 00:1f.1 IDE interface: I=
ntel Corporation 82801EB/ER (ICH5/ICH5R) IDE Controller (rev 02)<o:p></o:p>=
</p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 13&nbsp; 01:00.0 PCI bridge: Inte=
l Corporation 80332 [Dobson] I/O processor (A-Segment Bridge) (rev 06)<o:p>=
</o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 14&nbsp; 01:00.2 PCI bridge: Inte=
l Corporation 80332 [Dobson] I/O processor (B-Segment Bridge) (rev 06)<o:p>=
</o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 15&nbsp; 02:05.0 SCSI storage con=
troller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 S=
CSI (rev 08)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 16 &nbsp;05:00.0 PCI bridge: Inte=
l Corporation 6700PXH PCI Express-to-PCI Bridge A (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 17&nbsp; 05:00.2 PCI bridge: Inte=
l Corporation 6700PXH PCI Express-to-PCI Bridge B (rev 09)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 18&nbsp; 06:07.0 Ethernet control=
ler: Intel Corporation 82541GI Gigabit Ethernet Controller (rev 05)<o:p></o=
:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 19&nbsp; 07:08.0 Ethernet control=
ler: Intel Corporation 82541GI Gigabit Ethernet Controller (rev 05)<o:p></o=
:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 20&nbsp; 09:05.0 Class ff00: Dell=
 Remote Access Card 4 Daughter Card<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 21&nbsp; 09:05.1 Class ff00: Dell=
 Remote Access Card 4 Daughter Card Virtual UART<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 22&nbsp; 09:05.2 Class ff00: Dell=
 Remote Access Card 4 Daughter Card SMIC interface<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 23&nbsp; 09:06.0 IDE interface: S=
ilicon Image, Inc. PCI0680 Ultra ATA-133 Host Controller (rev 02)<o:p></o:p=
></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp; 24&nbsp; 09:0d.0 VGA compatible c=
ontroller: ATI Technologies Inc Radeon RV100 QY [Radeon 7000/VE]<o:p></o:p>=
</p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal">06:07.0 Ethernet controller: Intel Corporation 82541=
GI Gigabit Ethernet Controller (rev 05)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Subsystem=
: Dell PRO/1000 MT Network Connection<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Control: =
I/O&#43; Mem&#43; BusMaster- SpecCycle- MemWINV&#43; VGASnoop- ParErr- Step=
ping- SERR&#43; FastB2B-<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status: C=
ap&#43; 66MHz&#43; UDF- FastB2B- ParErr- DEVSEL=3Dmedium &gt;TAbort- &lt;TA=
bort- &lt;MAbort- &gt;SERR- &lt;PERR-<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Interrupt=
: pin A routed to IRQ 64<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Region 0:=
 Memory at dfae0000 (32-bit, non-prefetchable) [size=3D128K]<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Region 2:=
 I/O ports at dcc0 [size=3D64]<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Capabilit=
ies: [dc] Power Management version 2<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flags: PMEClk- DSI&#43; D1- D2- AuxC=
urrent=3D0mA PME(D0&#43;,D1-,D2-,D3hot&#43;,D3cold&#43;)<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status: D0 PME-Enable- DSel=3D0 DSca=
le=3D1 PME-<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Capabilit=
ies: [e4] PCI-X non-bridge device<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Command: DPERE- ERO&#43; RBC=3D512 O=
ST=3D1<o:p></o:p></p>
<p class=3D"MsoNormal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status: Dev=3D00:00.0 64bit- 133MHz-=
 SCD- USC- DC=3Dsimple DMMRBC=3D2048 DMOST=3D1 DMCRS=3D8 RSCEM- 266MHz- 533=
MHz-<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal">log file attached.<o:p></o:p></p>
</div>
</body>
</html>

--_000_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_--

--_005_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_
Content-Type: application/octet-stream; name="config-xen0.i386"
Content-Description: config-xen0.i386
Content-Disposition: attachment; filename="config-xen0.i386"; size=59186;
	creation-date="Fri, 09 Dec 2011 19:18:26 GMT";
	modification-date="Fri, 09 Dec 2011 19:16:35 GMT"
Content-Transfer-Encoding: base64

IwojIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CiMgTGlu
dXgvaTM4NiAzLjAuNC0zMi54ZW4wIEtlcm5lbCBDb25maWd1cmF0aW9uCiMKIyBDT05GSUdfNjRC
SVQgaXMgbm90IHNldApDT05GSUdfWDg2XzMyPXkKIyBDT05GSUdfWDg2XzY0IGlzIG5vdCBzZXQK
Q09ORklHX1g4Nj15CkNPTkZJR19JTlNUUlVDVElPTl9ERUNPREVSPXkKQ09ORklHX09VVFBVVF9G
T1JNQVQ9ImVsZjMyLWkzODYiCkNPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC94ODYvY29uZmln
cy9pMzg2X2RlZmNvbmZpZyIKQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQpDT05GSUdfQ0xP
Q0tTT1VSQ0VfV0FUQ0hET0c9eQpDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CkNPTkZJR19H
RU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVD15CkNPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQpD
T05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JU
PXkKQ09ORklHX01NVT15CkNPTkZJR19aT05FX0RNQT15CiMgQ09ORklHX05FRURfRE1BX01BUF9T
VEFURSBpcyBub3Qgc2V0CkNPTkZJR19ORUVEX1NHX0RNQV9MRU5HVEg9eQpDT05GSUdfR0VORVJJ
Q19JU0FfRE1BPXkKQ09ORklHX0dFTkVSSUNfSU9NQVA9eQpDT05GSUdfR0VORVJJQ19CVUc9eQpD
T05GSUdfR0VORVJJQ19IV0VJR0hUPXkKQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKIyBD
T05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSyBpcyBub3Qgc2V0CkNPTkZJR19SV1NFTV9YQ0hH
QUREX0FMR09SSVRITT15CkNPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKQ09ORklHX0dF
TkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIyBDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMIGlz
IG5vdCBzZXQKQ09ORklHX0FSQ0hfSEFTX0NQVV9SRUxBWD15CkNPTkZJR19BUkNIX0hBU19ERUZB
VUxUX0lETEU9eQpDT05GSUdfQVJDSF9IQVNfQ0FDSEVfTElORV9TSVpFPXkKQ09ORklHX0hBVkVf
U0VUVVBfUEVSX0NQVV9BUkVBPXkKQ09ORklHX05FRURfUEVSX0NQVV9FTUJFRF9GSVJTVF9DSFVO
Sz15CkNPTkZJR19ORUVEX1BFUl9DUFVfUEFHRV9GSVJTVF9DSFVOSz15CiMgQ09ORklHX0hBVkVf
Q1BVTUFTS19PRl9DUFVfTUFQIGlzIG5vdCBzZXQKQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9T
U0lCTEU9eQpDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKIyBDT05GSUdfWk9ORV9ETUEz
MiBpcyBub3Qgc2V0CkNPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CiMgQ09ORklHX0FV
RElUX0FSQ0ggaXMgbm90IHNldApDT05GSUdfQVJDSF9TVVBQT1JUU19PUFRJTUlaRURfSU5MSU5J
Tkc9eQpDT05GSUdfQVJDSF9TVVBQT1JUU19ERUJVR19QQUdFQUxMT0M9eQpDT05GSUdfWDg2XzMy
X1NNUD15CkNPTkZJR19YODZfSFQ9eQpDT05GSUdfWDg2XzMyX0xBWllfR1M9eQpDT05GSUdfQVJD
SF9IV0VJR0hUX0NGTEFHUz0iLWZjYWxsLXNhdmVkLWVjeCAtZmNhbGwtc2F2ZWQtZWR4IgpDT05G
SUdfS1RJTUVfU0NBTEFSPXkKQ09ORklHX0FSQ0hfQ1BVX1BST0JFX1JFTEVBU0U9eQpDT05GSUdf
REVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgpDT05G
SUdfSEFWRV9JUlFfV09SSz15CkNPTkZJR19JUlFfV09SSz15CgojCiMgR2VuZXJhbCBzZXR1cAoj
CkNPTkZJR19FWFBFUklNRU5UQUw9eQpDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCkNPTkZJ
R19DUk9TU19DT01QSUxFPSIiCkNPTkZJR19MT0NBTFZFUlNJT049IiIKIyBDT05GSUdfTE9DQUxW
RVJTSU9OX0FVVE8gaXMgbm90IHNldApDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CkNPTkZJR19I
QVZFX0tFUk5FTF9CWklQMj15CkNPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKQ09ORklHX0hBVkVf
S0VSTkVMX1haPXkKQ09ORklHX0hBVkVfS0VSTkVMX0xaTz15CkNPTkZJR19LRVJORUxfR1pJUD15
CiMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CiMgQ09ORklHX0tFUk5FTF9MWk1BIGlz
IG5vdCBzZXQKIyBDT05GSUdfS0VSTkVMX1haIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VSTkVMX0xa
TyBpcyBub3Qgc2V0CkNPTkZJR19ERUZBVUxUX0hPU1ROQU1FPSIobm9uZSkiCkNPTkZJR19TV0FQ
PXkKQ09ORklHX1NZU1ZJUEM9eQpDT05GSUdfU1lTVklQQ19TWVNDVEw9eQojIENPTkZJR19QT1NJ
WF9NUVVFVUUgaXMgbm90IHNldAojIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQK
IyBDT05GSUdfRkhBTkRMRSBpcyBub3Qgc2V0CiMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0
CiMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfR0VORVJJQ19IQVJESVJRUz15
CgojCiMgSVJRIHN1YnN5c3RlbQojCkNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKQ09ORklHX0hB
VkVfU1BBUlNFX0lSUT15CkNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CkNPTkZJR19HRU5FUklD
X0lSUV9TSE9XPXkKQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlE9eQpDT05GSUdfSVJRX0ZPUkNF
RF9USFJFQURJTkc9eQojIENPTkZJR19TUEFSU0VfSVJRIGlzIG5vdCBzZXQKCiMKIyBSQ1UgU3Vi
c3lzdGVtCiMKQ09ORklHX1RSRUVfUkNVPXkKIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNl
dAojIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldApDT05GSUdfUkNVX0ZBTk9VVD0zMgojIENP
TkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKIyBDT05GSUdfUkNVX0ZBU1RfTk9fSFog
aXMgbm90IHNldAojIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0CiMgQ09ORklHX0lL
Q09ORklHIGlzIG5vdCBzZXQKQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKQ09ORklHX0hBVkVfVU5T
VEFCTEVfU0NIRURfQ0xPQ0s9eQojIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKQ09ORklHX05B
TUVTUEFDRVM9eQojIENPTkZJR19VVFNfTlMgaXMgbm90IHNldApDT05GSUdfSVBDX05TPXkKIyBD
T05GSUdfVVNFUl9OUyBpcyBub3Qgc2V0CiMgQ09ORklHX1BJRF9OUyBpcyBub3Qgc2V0CkNPTkZJ
R19ORVRfTlM9eQojIENPTkZJR19TQ0hFRF9BVVRPR1JPVVAgaXMgbm90IHNldApDT05GSUdfU1lT
RlNfREVQUkVDQVRFRD15CkNPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKIyBDT05GSUdfUkVM
QVkgaXMgbm90IHNldApDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQpDT05GSUdfSU5JVFJBTUZTX1NP
VVJDRT0iIgpDT05GSUdfUkRfR1pJUD15CkNPTkZJR19SRF9CWklQMj15CiMgQ09ORklHX1JEX0xa
TUEgaXMgbm90IHNldAojIENPTkZJR19SRF9YWiBpcyBub3Qgc2V0CiMgQ09ORklHX1JEX0xaTyBp
cyBub3Qgc2V0CiMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQ09ORklH
X1NZU0NUTD15CkNPTkZJR19BTk9OX0lOT0RFUz15CkNPTkZJR19FWFBFUlQ9eQpDT05GSUdfVUlE
MTY9eQpDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQpDT05GSUdfS0FMTFNZTVM9eQpDT05GSUdfSE9U
UExVRz15CkNPTkZJR19QUklOVEs9eQpDT05GSUdfQlVHPXkKQ09ORklHX0VMRl9DT1JFPXkKQ09O
RklHX1BDU1BLUl9QTEFURk9STT15CkNPTkZJR19CQVNFX0ZVTEw9eQpDT05GSUdfRlVURVg9eQpD
T05GSUdfRVBPTEw9eQpDT05GSUdfU0lHTkFMRkQ9eQpDT05GSUdfVElNRVJGRD15CkNPTkZJR19F
VkVOVEZEPXkKQ09ORklHX1NITUVNPXkKQ09ORklHX0FJTz15CiMgQ09ORklHX0VNQkVEREVEIGlz
IG5vdCBzZXQKQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9eQoKIwojIEtlcm5lbCBQZXJmb3JtYW5j
ZSBFdmVudHMgQW5kIENvdW50ZXJzCiMKQ09ORklHX1BFUkZfRVZFTlRTPXkKIyBDT05GSUdfUEVS
Rl9DT1VOVEVSUyBpcyBub3Qgc2V0CkNPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CkNPTkZJR19Q
Q0lfUVVJUktTPXkKIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CkNPTkZJR19TTEFCPXkK
IyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiMgQ09ORklHX1NMT0IgaXMgbm90IHNldAojIENPTkZJ
R19QUk9GSUxJTkcgaXMgbm90IHNldApDT05GSUdfSEFWRV9PUFJPRklMRT15CiMgQ09ORklHX0tQ
Uk9CRVMgaXMgbm90IHNldAojIENPTkZJR19KVU1QX0xBQkVMIGlzIG5vdCBzZXQKQ09ORklHX0hB
VkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1M9eQpDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9
eQpDT05GSUdfSEFWRV9LUFJPQkVTPXkKQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CkNPTkZJR19I
QVZFX09QVFBST0JFUz15CkNPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKQ09ORklHX0hBVkVf
RE1BX0FUVFJTPXkKQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKQ09ORklHX0hBVkVf
UkVHU19BTkRfU1RBQ0tfQUNDRVNTX0FQST15CkNPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQpD
T05GSUdfSEFWRV9IV19CUkVBS1BPSU5UPXkKQ09ORklHX0hBVkVfTUlYRURfQlJFQUtQT0lOVFNf
UkVHUz15CkNPTkZJR19IQVZFX1VTRVJfUkVUVVJOX05PVElGSUVSPXkKQ09ORklHX0hBVkVfUEVS
Rl9FVkVOVFNfTk1JPXkKQ09ORklHX0hBVkVfQVJDSF9KVU1QX0xBQkVMPXkKCiMKIyBHQ09WLWJh
c2VkIGtlcm5lbCBwcm9maWxpbmcKIwpDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15
CkNPTkZJR19TTEFCSU5GTz15CkNPTkZJR19SVF9NVVRFWEVTPXkKQ09ORklHX0JBU0VfU01BTEw9
MApDT05GSUdfTU9EVUxFUz15CiMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQK
Q09ORklHX01PRFVMRV9VTkxPQUQ9eQojIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5v
dCBzZXQKQ09ORklHX01PRFZFUlNJT05TPXkKIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxM
IGlzIG5vdCBzZXQKQ09ORklHX1NUT1BfTUFDSElORT15CkNPTkZJR19CTE9DSz15CkNPTkZJR19M
QkRBRj15CkNPTkZJR19CTEtfREVWX0JTRz15CiMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlz
IG5vdCBzZXQKCiMKIyBJTyBTY2hlZHVsZXJzCiMKQ09ORklHX0lPU0NIRURfTk9PUD15CkNPTkZJ
R19JT1NDSEVEX0RFQURMSU5FPXkKQ09ORklHX0lPU0NIRURfQ0ZRPXkKIyBDT05GSUdfREVGQVVM
VF9ERUFETElORSBpcyBub3Qgc2V0CkNPTkZJR19ERUZBVUxUX0NGUT15CiMgQ09ORklHX0RFRkFV
TFRfTk9PUCBpcyBub3Qgc2V0CkNPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKIyBDT05GSUdf
SU5MSU5FX1NQSU5fVFJZTE9DSyBpcyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9TUElOX1RSWUxP
Q0tfQkggaXMgbm90IHNldAojIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLIGlzIG5vdCBzZXQKIyBD
T05GSUdfSU5MSU5FX1NQSU5fTE9DS19CSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9TUElO
X0xPQ0tfSVJRIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlFTQVZFIGlz
IG5vdCBzZXQKQ09ORklHX0lOTElORV9TUElOX1VOTE9DSz15CiMgQ09ORklHX0lOTElORV9TUElO
X1VOTE9DS19CSCBpcyBub3Qgc2V0CkNPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRPXkKIyBD
T05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAojIENPTkZJR19J
TkxJTkVfUkVBRF9UUllMT0NLIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DSyBp
cyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfQkggaXMgbm90IHNldAojIENPTkZJ
R19JTkxJTkVfUkVBRF9MT0NLX0lSUSBpcyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9SRUFEX0xP
Q0tfSVJRU0FWRSBpcyBub3Qgc2V0CkNPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0s9eQojIENPTkZJ
R19JTkxJTkVfUkVBRF9VTkxPQ0tfQkggaXMgbm90IHNldApDT05GSUdfSU5MSU5FX1JFQURfVU5M
T0NLX0lSUT15CiMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBz
ZXQKIyBDT05GSUdfSU5MSU5FX1dSSVRFX1RSWUxPQ0sgaXMgbm90IHNldAojIENPTkZJR19JTkxJ
TkVfV1JJVEVfTE9DSyBpcyBub3Qgc2V0CiMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0JIIGlz
IG5vdCBzZXQKIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRIGlzIG5vdCBzZXQKIyBDT05G
SUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CkNPTkZJR19JTkxJTkVfV1JJ
VEVfVU5MT0NLPXkKIyBDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DS19CSCBpcyBub3Qgc2V0CkNP
TkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUT15CiMgQ09ORklHX0lOTElORV9XUklURV9VTkxP
Q0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CkNPTkZJR19NVVRFWF9TUElOX09OX09XTkVSPXkKQ09O
RklHX0ZSRUVaRVI9eQoKIwojIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcwojCkNPTkZJR19U
SUNLX09ORVNIT1Q9eQpDT05GSUdfTk9fSFo9eQojIENPTkZJR19ISUdIX1JFU19USU1FUlMgaXMg
bm90IHNldApDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CkNPTkZJR19TTVA9eQpD
T05GSUdfWDg2X01QUEFSU0U9eQojIENPTkZJR19YODZfQklHU01QIGlzIG5vdCBzZXQKQ09ORklH
X1g4Nl9FWFRFTkRFRF9QTEFURk9STT15CiMgQ09ORklHX1g4Nl9NUlNUIGlzIG5vdCBzZXQKIyBD
T05GSUdfWDg2X1JEQzMyMVggaXMgbm90IHNldAojIENPTkZJR19YODZfMzJfTk9OX1NUQU5EQVJE
IGlzIG5vdCBzZXQKIyBDT05GSUdfWDg2XzMyX0lSSVMgaXMgbm90IHNldApDT05GSUdfU0NIRURf
T01JVF9GUkFNRV9QT0lOVEVSPXkKQ09ORklHX1BBUkFWSVJUX0dVRVNUPXkKQ09ORklHX1hFTj15
CkNPTkZJR19YRU5fRE9NMD15CkNPTkZJR19YRU5fUFJJVklMRUdFRF9HVUVTVD15CkNPTkZJR19Y
RU5fUFZIVk09eQpDT05GSUdfWEVOX01BWF9ET01BSU5fTUVNT1JZPTEyOApDT05GSUdfWEVOX1NB
VkVfUkVTVE9SRT15CiMgQ09ORklHX1hFTl9ERUJVRyBpcyBub3Qgc2V0CiMgQ09ORklHX0tWTV9D
TE9DSyBpcyBub3Qgc2V0CiMgQ09ORklHX0tWTV9HVUVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX0xH
VUVTVF9HVUVTVCBpcyBub3Qgc2V0CkNPTkZJR19QQVJBVklSVD15CiMgQ09ORklHX1BBUkFWSVJU
X1NQSU5MT0NLUyBpcyBub3Qgc2V0CkNPTkZJR19QQVJBVklSVF9DTE9DSz15CkNPTkZJR19OT19C
T09UTUVNPXkKIyBDT05GSUdfTUVNVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX00zODYgaXMgbm90
IHNldAojIENPTkZJR19NNDg2IGlzIG5vdCBzZXQKIyBDT05GSUdfTTU4NiBpcyBub3Qgc2V0CiMg
Q09ORklHX001ODZUU0MgaXMgbm90IHNldAojIENPTkZJR19NNTg2TU1YIGlzIG5vdCBzZXQKIyBD
T05GSUdfTTY4NiBpcyBub3Qgc2V0CiMgQ09ORklHX01QRU5USVVNSUkgaXMgbm90IHNldAojIENP
TkZJR19NUEVOVElVTUlJSSBpcyBub3Qgc2V0CiMgQ09ORklHX01QRU5USVVNTSBpcyBub3Qgc2V0
CkNPTkZJR19NUEVOVElVTTQ9eQojIENPTkZJR19NSzYgaXMgbm90IHNldAojIENPTkZJR19NSzcg
aXMgbm90IHNldAojIENPTkZJR19NSzggaXMgbm90IHNldAojIENPTkZJR19NQ1JVU09FIGlzIG5v
dCBzZXQKIyBDT05GSUdfTUVGRklDRU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfTVdJTkNISVBDNiBp
cyBub3Qgc2V0CiMgQ09ORklHX01XSU5DSElQM0QgaXMgbm90IHNldAojIENPTkZJR19NRUxBTiBp
cyBub3Qgc2V0CiMgQ09ORklHX01HRU9ERUdYMSBpcyBub3Qgc2V0CiMgQ09ORklHX01HRU9ERV9M
WCBpcyBub3Qgc2V0CiMgQ09ORklHX01DWVJJWElJSSBpcyBub3Qgc2V0CiMgQ09ORklHX01WSUFD
M18yIGlzIG5vdCBzZXQKIyBDT05GSUdfTVZJQUM3IGlzIG5vdCBzZXQKIyBDT05GSUdfTUNPUkUy
IGlzIG5vdCBzZXQKIyBDT05GSUdfTUFUT00gaXMgbm90IHNldAojIENPTkZJR19YODZfR0VORVJJ
QyBpcyBub3Qgc2V0CkNPTkZJR19YODZfSU5URVJOT0RFX0NBQ0hFX1NISUZUPTcKQ09ORklHX1g4
Nl9DTVBYQ0hHPXkKQ09ORklHX0NNUFhDSEdfTE9DQUw9eQpDT05GSUdfWDg2X0wxX0NBQ0hFX1NI
SUZUPTcKQ09ORklHX1g4Nl9YQUREPXkKQ09ORklHX1g4Nl9XUF9XT1JLU19PSz15CkNPTkZJR19Y
ODZfSU5WTFBHPXkKQ09ORklHX1g4Nl9CU1dBUD15CkNPTkZJR19YODZfUE9QQURfT0s9eQpDT05G
SUdfWDg2X0lOVEVMX1VTRVJDT1BZPXkKQ09ORklHX1g4Nl9VU0VfUFBST19DSEVDS1NVTT15CkNP
TkZJR19YODZfVFNDPXkKQ09ORklHX1g4Nl9DTVBYQ0hHNjQ9eQpDT05GSUdfWDg2X0NNT1Y9eQpD
T05GSUdfWDg2X01JTklNVU1fQ1BVX0ZBTUlMWT01CkNPTkZJR19YODZfREVCVUdDVExNU1I9eQoj
IENPTkZJR19QUk9DRVNTT1JfU0VMRUNUIGlzIG5vdCBzZXQKQ09ORklHX0NQVV9TVVBfSU5URUw9
eQpDT05GSUdfQ1BVX1NVUF9DWVJJWF8zMj15CkNPTkZJR19DUFVfU1VQX0FNRD15CkNPTkZJR19D
UFVfU1VQX0NFTlRBVVI9eQpDT05GSUdfQ1BVX1NVUF9UUkFOU01FVEFfMzI9eQpDT05GSUdfQ1BV
X1NVUF9VTUNfMzI9eQojIENPTkZJR19IUEVUX1RJTUVSIGlzIG5vdCBzZXQKQ09ORklHX0RNST15
CkNPTkZJR19TV0lPVExCPXkKQ09ORklHX0lPTU1VX0hFTFBFUj15CiMgQ09ORklHX0lPTU1VX0FQ
SSBpcyBub3Qgc2V0CkNPTkZJR19OUl9DUFVTPTgKIyBDT05GSUdfU0NIRURfU01UIGlzIG5vdCBz
ZXQKQ09ORklHX1NDSEVEX01DPXkKIyBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORyBpcyBub3Qg
c2V0CkNPTkZJR19QUkVFTVBUX05PTkU9eQojIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBu
b3Qgc2V0CiMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldApDT05GSUdfWDg2X0xPQ0FMX0FQSUM9
eQpDT05GSUdfWDg2X0lPX0FQSUM9eQojIENPTkZJR19YODZfUkVST1VURV9GT1JfQlJPS0VOX0JP
T1RfSVJRUyBpcyBub3Qgc2V0CiMgQ09ORklHX1g4Nl9NQ0UgaXMgbm90IHNldApDT05GSUdfVk04
Nj15CiMgQ09ORklHX1RPU0hJQkEgaXMgbm90IHNldAojIENPTkZJR19JOEsgaXMgbm90IHNldAoj
IENPTkZJR19YODZfUkVCT09URklYVVBTIGlzIG5vdCBzZXQKQ09ORklHX01JQ1JPQ09ERT15CkNP
TkZJR19NSUNST0NPREVfSU5URUw9eQojIENPTkZJR19NSUNST0NPREVfQU1EIGlzIG5vdCBzZXQK
Q09ORklHX01JQ1JPQ09ERV9PTERfSU5URVJGQUNFPXkKIyBDT05GSUdfWDg2X01TUiBpcyBub3Qg
c2V0CkNPTkZJR19YODZfQ1BVSUQ9eQojIENPTkZJR19OT0hJR0hNRU0gaXMgbm90IHNldAojIENP
TkZJR19ISUdITUVNNEcgaXMgbm90IHNldApDT05GSUdfSElHSE1FTTY0Rz15CkNPTkZJR19WTVNQ
TElUXzNHPXkKIyBDT05GSUdfVk1TUExJVF8yRyBpcyBub3Qgc2V0CiMgQ09ORklHX1ZNU1BMSVRf
MUcgaXMgbm90IHNldApDT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMApDT05GSUdfSElHSE1F
TT15CkNPTkZJR19YODZfUEFFPXkKQ09ORklHX0FSQ0hfUEhZU19BRERSX1RfNjRCSVQ9eQpDT05G
SUdfQVJDSF9ETUFfQUREUl9UXzY0QklUPXkKQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQpD
T05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9N
T0RFTD15CkNPTkZJR19JTExFR0FMX1BPSU5URVJfVkFMVUU9MApDT05GSUdfU0VMRUNUX01FTU9S
WV9NT0RFTD15CkNPTkZJR19GTEFUTUVNX01BTlVBTD15CiMgQ09ORklHX1NQQVJTRU1FTV9NQU5V
QUwgaXMgbm90IHNldApDT05GSUdfRkxBVE1FTT15CkNPTkZJR19GTEFUX05PREVfTUVNX01BUD15
CkNPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKQ09ORklHX0hBVkVfTUVNQkxPQ0s9eQpDT05GSUdf
UEFHRUZMQUdTX0VYVEVOREVEPXkKQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKIyBDT05GSUdf
Q09NUEFDVElPTiBpcyBub3Qgc2V0CkNPTkZJR19QSFlTX0FERFJfVF82NEJJVD15CkNPTkZJR19a
T05FX0RNQV9GTEFHPTEKQ09ORklHX0JPVU5DRT15CkNPTkZJR19WSVJUX1RPX0JVUz15CkNPTkZJ
R19NTVVfTk9USUZJRVI9eQojIENPTkZJR19LU00gaXMgbm90IHNldApDT05GSUdfREVGQVVMVF9N
TUFQX01JTl9BRERSPTQwOTYKIyBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgaXMgbm90IHNl
dAojIENPTkZJR19DTEVBTkNBQ0hFIGlzIG5vdCBzZXQKIyBDT05GSUdfSElHSFBURSBpcyBub3Qg
c2V0CiMgQ09ORklHX1g4Nl9DSEVDS19CSU9TX0NPUlJVUFRJT04gaXMgbm90IHNldApDT05GSUdf
WDg2X1JFU0VSVkVfTE9XPTY0CiMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKQ09O
RklHX01UUlI9eQpDT05GSUdfTVRSUl9TQU5JVElaRVI9eQpDT05GSUdfTVRSUl9TQU5JVElaRVJf
RU5BQkxFX0RFRkFVTFQ9MApDT05GSUdfTVRSUl9TQU5JVElaRVJfU1BBUkVfUkVHX05SX0RFRkFV
TFQ9MQpDT05GSUdfWDg2X1BBVD15CkNPTkZJR19BUkNIX1VTRVNfUEdfVU5DQUNIRUQ9eQojIENP
TkZJR19FRkkgaXMgbm90IHNldApDT05GSUdfU0VDQ09NUD15CiMgQ09ORklHX0NDX1NUQUNLUFJP
VEVDVE9SIGlzIG5vdCBzZXQKQ09ORklHX0haXzEwMD15CiMgQ09ORklHX0haXzI1MCBpcyBub3Qg
c2V0CiMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNl
dApDT05GSUdfSFo9MTAwCiMgQ09ORklHX1NDSEVEX0hSVElDSyBpcyBub3Qgc2V0CiMgQ09ORklH
X0tFWEVDIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CkNPTkZJR19Q
SFlTSUNBTF9TVEFSVD0weDEwMDAwMDAKQ09ORklHX1JFTE9DQVRBQkxFPXkKQ09ORklHX1g4Nl9O
RUVEX1JFTE9DUz15CkNPTkZJR19QSFlTSUNBTF9BTElHTj0weDEwMDAwMDAKQ09ORklHX0hPVFBM
VUdfQ1BVPXkKQ09ORklHX0NPTVBBVF9WRFNPPXkKIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5v
dCBzZXQKQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKCiMKIyBQb3dlciBtYW5h
Z2VtZW50IGFuZCBBQ1BJIG9wdGlvbnMKIwojIENPTkZJR19TVVNQRU5EIGlzIG5vdCBzZXQKQ09O
RklHX0hJQkVSTkFURV9DQUxMQkFDS1M9eQojIENPTkZJR19ISUJFUk5BVElPTiBpcyBub3Qgc2V0
CkNPTkZJR19QTV9TTEVFUD15CkNPTkZJR19QTV9TTEVFUF9TTVA9eQojIENPTkZJR19QTV9SVU5U
SU1FIGlzIG5vdCBzZXQKQ09ORklHX1BNPXkKIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldApD
T05GSUdfQUNQST15CiMgQ09ORklHX0FDUElfUFJPQ0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfQUNQ
SV9QUk9DRlNfUE9XRVIgaXMgbm90IHNldAojIENPTkZJR19BQ1BJX0VDX0RFQlVHRlMgaXMgbm90
IHNldApDT05GSUdfQUNQSV9QUk9DX0VWRU5UPXkKIyBDT05GSUdfQUNQSV9BQyBpcyBub3Qgc2V0
CiMgQ09ORklHX0FDUElfQkFUVEVSWSBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJX0JVVFRPTj1tCkNP
TkZJR19BQ1BJX0ZBTj1tCiMgQ09ORklHX0FDUElfRE9DSyBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJ
X1BST0NFU1NPUj15CiMgQ09ORklHX0FDUElfSVBNSSBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJX0hP
VFBMVUdfQ1BVPXkKIyBDT05GSUdfQUNQSV9QUk9DRVNTT1JfQUdHUkVHQVRPUiBpcyBub3Qgc2V0
CkNPTkZJR19BQ1BJX1RIRVJNQUw9bQojIENPTkZJR19BQ1BJX0NVU1RPTV9EU0RUIGlzIG5vdCBz
ZXQKQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAojIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5v
dCBzZXQKIyBDT05GSUdfQUNQSV9QQ0lfU0xPVCBpcyBub3Qgc2V0CkNPTkZJR19YODZfUE1fVElN
RVI9eQpDT05GSUdfQUNQSV9DT05UQUlORVI9eQojIENPTkZJR19BQ1BJX1NCUyBpcyBub3Qgc2V0
CiMgQ09ORklHX0FDUElfSEVEIGlzIG5vdCBzZXQKIyBDT05GSUdfQUNQSV9BUEVJIGlzIG5vdCBz
ZXQKIyBDT05GSUdfU0ZJIGlzIG5vdCBzZXQKIyBDT05GSUdfQVBNIGlzIG5vdCBzZXQKCiMKIyBD
UFUgRnJlcXVlbmN5IHNjYWxpbmcKIwojIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CkNPTkZJ
R19DUFVfSURMRT15CkNPTkZJR19DUFVfSURMRV9HT1ZfTEFEREVSPXkKQ09ORklHX0NQVV9JRExF
X0dPVl9NRU5VPXkKIyBDT05GSUdfSU5URUxfSURMRSBpcyBub3Qgc2V0CgojCiMgQnVzIG9wdGlv
bnMgKFBDSSBldGMuKQojCkNPTkZJR19QQ0k9eQojIENPTkZJR19QQ0lfR09CSU9TIGlzIG5vdCBz
ZXQKIyBDT05GSUdfUENJX0dPTU1DT05GSUcgaXMgbm90IHNldAojIENPTkZJR19QQ0lfR09ESVJF
Q1QgaXMgbm90IHNldApDT05GSUdfUENJX0dPQU5ZPXkKQ09ORklHX1BDSV9CSU9TPXkKQ09ORklH
X1BDSV9ESVJFQ1Q9eQpDT05GSUdfUENJX01NQ09ORklHPXkKQ09ORklHX1BDSV9YRU49eQpDT05G
SUdfUENJX0RPTUFJTlM9eQojIENPTkZJR19QQ0lfQ05CMjBMRV9RVUlSSyBpcyBub3Qgc2V0CiMg
Q09ORklHX0RNQVIgaXMgbm90IHNldApDT05GSUdfUENJRVBPUlRCVVM9eQojIENPTkZJR19IT1RQ
TFVHX1BDSV9QQ0lFIGlzIG5vdCBzZXQKQ09ORklHX1BDSUVBRVI9eQojIENPTkZJR19QQ0lFX0VD
UkMgaXMgbm90IHNldAojIENPTkZJR19QQ0lFQUVSX0lOSkVDVCBpcyBub3Qgc2V0CkNPTkZJR19Q
Q0lFQVNQTT15CiMgQ09ORklHX1BDSUVBU1BNX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX0FSQ0hf
U1VQUE9SVFNfTVNJPXkKQ09ORklHX1BDSV9NU0k9eQojIENPTkZJR19QQ0lfU1RVQiBpcyBub3Qg
c2V0CiMgQ09ORklHX1hFTl9QQ0lERVZfRlJPTlRFTkQgaXMgbm90IHNldApDT05GSUdfSFRfSVJR
PXkKIyBDT05GSUdfUENJX0lPViBpcyBub3Qgc2V0CkNPTkZJR19QQ0lfSU9BUElDPXkKQ09ORklH
X1BDSV9MQUJFTD15CkNPTkZJR19JU0FfRE1BX0FQST15CiMgQ09ORklHX0lTQSBpcyBub3Qgc2V0
CiMgQ09ORklHX01DQSBpcyBub3Qgc2V0CiMgQ09ORklHX1NDeDIwMCBpcyBub3Qgc2V0CkNPTkZJ
R19BTURfTkI9eQojIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldApDT05GSUdfSE9UUExVR19QQ0k9
bQpDT05GSUdfSE9UUExVR19QQ0lfRkFLRT1tCiMgQ09ORklHX0hPVFBMVUdfUENJX0NPTVBBUSBp
cyBub3Qgc2V0CiMgQ09ORklHX0hPVFBMVUdfUENJX0lCTSBpcyBub3Qgc2V0CkNPTkZJR19IT1RQ
TFVHX1BDSV9BQ1BJPW0KQ09ORklHX0hPVFBMVUdfUENJX0FDUElfSUJNPW0KQ09ORklHX0hPVFBM
VUdfUENJX0NQQ0k9eQojIENPTkZJR19IT1RQTFVHX1BDSV9DUENJX1pUNTU1MCBpcyBub3Qgc2V0
CiMgQ09ORklHX0hPVFBMVUdfUENJX0NQQ0lfR0VORVJJQyBpcyBub3Qgc2V0CiMgQ09ORklHX0hP
VFBMVUdfUENJX1NIUEMgaXMgbm90IHNldAojIENPTkZJR19SQVBJRElPIGlzIG5vdCBzZXQKCiMK
IyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cyAvIEVtdWxhdGlvbnMKIwpDT05GSUdfQklORk1UX0VM
Rj15CkNPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUz15CkNPTkZJR19IQVZFX0FP
VVQ9eQojIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CiMgQ09ORklHX0JJTkZNVF9NSVND
IGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfQVRPTUlDX0lPTUFQPXkKQ09ORklHX0hBVkVfVEVYVF9Q
T0tFX1NNUD15CkNPTkZJR19ORVQ9eQoKIwojIE5ldHdvcmtpbmcgb3B0aW9ucwojCkNPTkZJR19Q
QUNLRVQ9eQpDT05GSUdfVU5JWD15CkNPTkZJR19YRlJNPXkKIyBDT05GSUdfWEZSTV9VU0VSIGlz
IG5vdCBzZXQKIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKIyBDT05GSUdfWEZS
TV9NSUdSQVRFIGlzIG5vdCBzZXQKIyBDT05GSUdfWEZSTV9TVEFUSVNUSUNTIGlzIG5vdCBzZXQK
Q09ORklHX1hGUk1fSVBDT01QPW0KQ09ORklHX05FVF9LRVk9bQojIENPTkZJR19ORVRfS0VZX01J
R1JBVEUgaXMgbm90IHNldApDT05GSUdfSU5FVD15CiMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBu
b3Qgc2V0CiMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CkNPTkZJR19JUF9S
T1VURV9DTEFTU0lEPXkKQ09ORklHX0lQX1BOUD15CkNPTkZJR19JUF9QTlBfREhDUD15CiMgQ09O
RklHX0lQX1BOUF9CT09UUCBpcyBub3Qgc2V0CiMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBz
ZXQKIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAojIENPTkZJR19ORVRfSVBHUkVfREVNVVgg
aXMgbm90IHNldAojIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKQ09ORklHX1NZTl9DT09LSUVTPXkK
Q09ORklHX0lORVRfQUg9bQpDT05GSUdfSU5FVF9FU1A9bQpDT05GSUdfSU5FVF9JUENPTVA9bQpD
T05GSUdfSU5FVF9YRlJNX1RVTk5FTD1tCkNPTkZJR19JTkVUX1RVTk5FTD1tCkNPTkZJR19JTkVU
X1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQpDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPW0KQ09O
RklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQpDT05GSUdfSU5FVF9MUk89bQpDT05GSUdfSU5FVF9E
SUFHPW0KQ09ORklHX0lORVRfVENQX0RJQUc9bQojIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBp
cyBub3Qgc2V0CkNPTkZJR19UQ1BfQ09OR19DVUJJQz15CkNPTkZJR19ERUZBVUxUX1RDUF9DT05H
PSJjdWJpYyIKIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CkNPTkZJR19JUFY2PW0KQ09O
RklHX0lQVjZfUFJJVkFDWT15CiMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldAoj
IENPTkZJR19JUFY2X09QVElNSVNUSUNfREFEIGlzIG5vdCBzZXQKQ09ORklHX0lORVQ2X0FIPW0K
Q09ORklHX0lORVQ2X0VTUD1tCkNPTkZJR19JTkVUNl9JUENPTVA9bQojIENPTkZJR19JUFY2X01J
UDYgaXMgbm90IHNldApDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUw9bQpDT05GSUdfSU5FVDZfVFVO
TkVMPW0KQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQpDT05GSUdfSU5FVDZfWEZS
TV9NT0RFX1RVTk5FTD1tCkNPTkZJR19JTkVUNl9YRlJNX01PREVfQkVFVD1tCiMgQ09ORklHX0lO
RVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTiBpcyBub3Qgc2V0CkNPTkZJR19JUFY2X1NJ
VD1tCiMgQ09ORklHX0lQVjZfU0lUXzZSRCBpcyBub3Qgc2V0CkNPTkZJR19JUFY2X05ESVNDX05P
REVUWVBFPXkKQ09ORklHX0lQVjZfVFVOTkVMPW0KIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJM
RVMgaXMgbm90IHNldAojIENPTkZJR19JUFY2X01ST1VURSBpcyBub3Qgc2V0CiMgQ09ORklHX05F
VFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiMgQ09ORklHX05FVFdPUktfUEhZX1RJTUVTVEFNUElO
RyBpcyBub3Qgc2V0CkNPTkZJR19ORVRGSUxURVI9eQojIENPTkZJR19ORVRGSUxURVJfREVCVUcg
aXMgbm90IHNldApDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VEPXkKQ09ORklHX0JSSURHRV9ORVRG
SUxURVI9eQoKIwojIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KIwpDT05GSUdfTkVURklM
VEVSX05FVExJTks9bQpDT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUU9bQpDT05GSUdfTkVU
RklMVEVSX05FVExJTktfTE9HPW0KIyBDT05GSUdfTkZfQ09OTlRSQUNLIGlzIG5vdCBzZXQKIyBD
T05GSUdfTkVURklMVEVSX1RQUk9YWSBpcyBub3Qgc2V0CkNPTkZJR19ORVRGSUxURVJfWFRBQkxF
Uz1tCgojCiMgWHRhYmxlcyBjb21iaW5lZCBtb2R1bGVzCiMKQ09ORklHX05FVEZJTFRFUl9YVF9N
QVJLPW0KCiMKIyBYdGFibGVzIHRhcmdldHMKIwojIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VU
X0NIRUNLU1VNIGlzIG5vdCBzZXQKQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlk9
bQojIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1AgaXMgbm90IHNldApDT05GSUdfTkVU
RklMVEVSX1hUX1RBUkdFVF9ITD1tCiMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfSURMRVRJ
TUVSIGlzIG5vdCBzZXQKQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCiMgQ09ORklH
X05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0cgaXMgbm90IHNldApDT05GSUdfTkVURklMVEVSX1hU
X1RBUkdFVF9ORlFVRVVFPW0KIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9SQVRFRVNUIGlz
IG5vdCBzZXQKIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9URUUgaXMgbm90IHNldAojIENP
TkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RSQUNFIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVURklM
VEVSX1hUX1RBUkdFVF9UQ1BNU1MgaXMgbm90IHNldAojIENPTkZJR19ORVRGSUxURVJfWFRfVEFS
R0VUX1RDUE9QVFNUUklQIGlzIG5vdCBzZXQKCiMKIyBYdGFibGVzIG1hdGNoZXMKIwojIENPTkZJ
R19ORVRGSUxURVJfWFRfTUFUQ0hfQUREUlRZUEUgaXMgbm90IHNldApDT05GSUdfTkVURklMVEVS
X1hUX01BVENIX0NPTU1FTlQ9bQojIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ1BVIGlzIG5v
dCBzZXQKQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQPW0KIyBDT05GSUdfTkVURklMVEVS
X1hUX01BVENIX0RFVkdST1VQIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENI
X0RTQ1AgaXMgbm90IHNldApDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCiMgQ09ORklH
X05FVEZJTFRFUl9YVF9NQVRDSF9IQVNITElNSVQgaXMgbm90IHNldApDT05GSUdfTkVURklMVEVS
X1hUX01BVENIX0hMPW0KIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0UgaXMgbm90
IHNldApDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSD1tCkNPTkZJR19ORVRGSUxURVJf
WFRfTUFUQ0hfTElNSVQ9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz1tCkNPTkZJR19O
RVRGSUxURVJfWFRfTUFUQ0hfTUFSSz1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQ
T1JUPW0KIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX09TRiBpcyBub3Qgc2V0CiMgQ09ORklH
X05FVEZJTFRFUl9YVF9NQVRDSF9PV05FUiBpcyBub3Qgc2V0CkNPTkZJR19ORVRGSUxURVJfWFRf
TUFUQ0hfUE9MSUNZPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9QSFlTREVWPW0KQ09ORklH
X05FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9R
VU9UQT1tCiMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SQVRFRVNUIGlzIG5vdCBzZXQKQ09O
RklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCiMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRD
SF9SRUNFTlQgaXMgbm90IHNldApDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFA9bQpDT05G
SUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQz1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFU
Q0hfU1RSSU5HPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1M9bQojIENPTkZJR19O
RVRGSUxURVJfWFRfTUFUQ0hfVElNRSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVEZJTFRFUl9YVF9N
QVRDSF9VMzIgaXMgbm90IHNldAojIENPTkZJR19JUF9TRVQgaXMgbm90IHNldAojIENPTkZJR19J
UF9WUyBpcyBub3Qgc2V0CgojCiMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCiMKIyBDT05G
SUdfTkZfREVGUkFHX0lQVjQgaXMgbm90IHNldAojIENPTkZJR19JUF9ORl9RVUVVRSBpcyBub3Qg
c2V0CkNPTkZJR19JUF9ORl9JUFRBQkxFUz1tCkNPTkZJR19JUF9ORl9NQVRDSF9BSD1tCkNPTkZJ
R19JUF9ORl9NQVRDSF9FQ049bQpDT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KQ09ORklHX0lQX05G
X0ZJTFRFUj1tCkNPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KQ09ORklHX0lQX05GX1RBUkdF
VF9MT0c9bQpDT05GSUdfSVBfTkZfVEFSR0VUX1VMT0c9bQpDT05GSUdfSVBfTkZfTUFOR0xFPW0K
Q09ORklHX0lQX05GX1RBUkdFVF9FQ049bQpDT05GSUdfSVBfTkZfVEFSR0VUX1RUTD1tCkNPTkZJ
R19JUF9ORl9SQVc9bQpDT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KQ09ORklHX0lQX05GX0FSUEZJ
TFRFUj1tCkNPTkZJR19JUF9ORl9BUlBfTUFOR0xFPW0KCiMKIyBJUHY2OiBOZXRmaWx0ZXIgQ29u
ZmlndXJhdGlvbgojCiMgQ09ORklHX05GX0RFRlJBR19JUFY2IGlzIG5vdCBzZXQKIyBDT05GSUdf
SVA2X05GX1FVRVVFIGlzIG5vdCBzZXQKIyBDT05GSUdfSVA2X05GX0lQVEFCTEVTIGlzIG5vdCBz
ZXQKQ09ORklHX0JSSURHRV9ORl9FQlRBQkxFUz1tCkNPTkZJR19CUklER0VfRUJUX0JST1VURT1t
CkNPTkZJR19CUklER0VfRUJUX1RfRklMVEVSPW0KQ09ORklHX0JSSURHRV9FQlRfVF9OQVQ9bQpD
T05GSUdfQlJJREdFX0VCVF84MDJfMz1tCkNPTkZJR19CUklER0VfRUJUX0FNT05HPW0KQ09ORklH
X0JSSURHRV9FQlRfQVJQPW0KQ09ORklHX0JSSURHRV9FQlRfSVA9bQojIENPTkZJR19CUklER0Vf
RUJUX0lQNiBpcyBub3Qgc2V0CkNPTkZJR19CUklER0VfRUJUX0xJTUlUPW0KQ09ORklHX0JSSURH
RV9FQlRfTUFSSz1tCkNPTkZJR19CUklER0VfRUJUX1BLVFRZUEU9bQpDT05GSUdfQlJJREdFX0VC
VF9TVFA9bQpDT05GSUdfQlJJREdFX0VCVF9WTEFOPW0KQ09ORklHX0JSSURHRV9FQlRfQVJQUkVQ
TFk9bQpDT05GSUdfQlJJREdFX0VCVF9ETkFUPW0KQ09ORklHX0JSSURHRV9FQlRfTUFSS19UPW0K
Q09ORklHX0JSSURHRV9FQlRfUkVESVJFQ1Q9bQpDT05GSUdfQlJJREdFX0VCVF9TTkFUPW0KQ09O
RklHX0JSSURHRV9FQlRfTE9HPW0KQ09ORklHX0JSSURHRV9FQlRfVUxPRz1tCiMgQ09ORklHX0JS
SURHRV9FQlRfTkZMT0cgaXMgbm90IHNldAojIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKQ09O
RklHX0lQX1NDVFA9bQojIENPTkZJR19TQ1RQX0RCR19NU0cgaXMgbm90IHNldAojIENPTkZJR19T
Q1RQX0RCR19PQkpDTlQgaXMgbm90IHNldAojIENPTkZJR19TQ1RQX0hNQUNfTk9ORSBpcyBub3Qg
c2V0CiMgQ09ORklHX1NDVFBfSE1BQ19TSEExIGlzIG5vdCBzZXQKQ09ORklHX1NDVFBfSE1BQ19N
RDU9eQojIENPTkZJR19SRFMgaXMgbm90IHNldAojIENPTkZJR19USVBDIGlzIG5vdCBzZXQKIyBD
T05GSUdfQVRNIGlzIG5vdCBzZXQKIyBDT05GSUdfTDJUUCBpcyBub3Qgc2V0CkNPTkZJR19TVFA9
bQpDT05GSUdfQlJJREdFPW0KQ09ORklHX0JSSURHRV9JR01QX1NOT09QSU5HPXkKIyBDT05GSUdf
TkVUX0RTQSBpcyBub3Qgc2V0CkNPTkZJR19WTEFOXzgwMjFRPW0KIyBDT05GSUdfVkxBTl84MDIx
UV9HVlJQIGlzIG5vdCBzZXQKIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKQ09ORklHX0xMQz15
CiMgQ09ORklHX0xMQzIgaXMgbm90IHNldAojIENPTkZJR19JUFggaXMgbm90IHNldAojIENPTkZJ
R19BVEFMSyBpcyBub3Qgc2V0CiMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CiMgQ09ORklHX0xBUEIg
aXMgbm90IHNldAojIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAojIENPTkZJR19XQU5fUk9VVEVS
IGlzIG5vdCBzZXQKIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKIyBDT05GSUdfSUVFRTgwMjE1
NCBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CiMgQ09ORklHX0RDQiBp
cyBub3Qgc2V0CiMgQ09ORklHX0JBVE1BTl9BRFYgaXMgbm90IHNldApDT05GSUdfUlBTPXkKQ09O
RklHX1JGU19BQ0NFTD15CkNPTkZJR19YUFM9eQoKIwojIE5ldHdvcmsgdGVzdGluZwojCiMgQ09O
RklHX05FVF9QS1RHRU4gaXMgbm90IHNldAojIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiMg
Q09ORklHX0NBTiBpcyBub3Qgc2V0CiMgQ09ORklHX0lSREEgaXMgbm90IHNldAojIENPTkZJR19C
VCBpcyBub3Qgc2V0CiMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKIyBDT05GSUdfV0lSRUxF
U1MgaXMgbm90IHNldAojIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CiMgQ09ORklHX1JGS0lMTCBp
cyBub3Qgc2V0CiMgQ09ORklHX05FVF85UCBpcyBub3Qgc2V0CiMgQ09ORklHX0NBSUYgaXMgbm90
IHNldAojIENPTkZJR19DRVBIX0xJQiBpcyBub3Qgc2V0CgojCiMgRGV2aWNlIERyaXZlcnMKIwoK
IwojIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKIwpDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIi
CiMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKQ09ORklHX1NUQU5EQUxPTkU9eQpDT05GSUdf
UFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CkNPTkZJR19GV19MT0FERVI9eQojIENPTkZJR19GSVJN
V0FSRV9JTl9LRVJORUwgaXMgbm90IHNldApDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKQ09ORklH
X1NZU19IWVBFUlZJU09SPXkKIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKIyBDT05GSUdf
TVREIGlzIG5vdCBzZXQKQ09ORklHX1BBUlBPUlQ9bQpDT05GSUdfUEFSUE9SVF9QQz1tCkNPTkZJ
R19QQVJQT1JUX1NFUklBTD1tCiMgQ09ORklHX1BBUlBPUlRfUENfRklGTyBpcyBub3Qgc2V0CiMg
Q09ORklHX1BBUlBPUlRfUENfU1VQRVJJTyBpcyBub3Qgc2V0CiMgQ09ORklHX1BBUlBPUlRfR1ND
IGlzIG5vdCBzZXQKIyBDT05GSUdfUEFSUE9SVF9BWDg4Nzk2IGlzIG5vdCBzZXQKQ09ORklHX1BB
UlBPUlRfMTI4ND15CkNPTkZJR19QTlA9eQpDT05GSUdfUE5QX0RFQlVHX01FU1NBR0VTPXkKCiMK
IyBQcm90b2NvbHMKIwpDT05GSUdfUE5QQUNQST15CkNPTkZJR19CTEtfREVWPXkKQ09ORklHX0JM
S19ERVZfRkQ9bQojIENPTkZJR19QQVJJREUgaXMgbm90IHNldApDT05GSUdfQkxLX0NQUV9EQT1t
CkNPTkZJR19CTEtfQ1BRX0NJU1NfREE9bQpDT05GSUdfQ0lTU19TQ1NJX1RBUEU9eQpDT05GSUdf
QkxLX0RFVl9EQUM5NjA9bQpDT05GSUdfQkxLX0RFVl9VTUVNPW0KIyBDT05GSUdfQkxLX0RFVl9D
T1dfQ09NTU9OIGlzIG5vdCBzZXQKQ09ORklHX0JMS19ERVZfTE9PUD1tCkNPTkZJR19CTEtfREVW
X0NSWVBUT0xPT1A9bQoKIwojIERSQkQgZGlzYWJsZWQgYmVjYXVzZSBQUk9DX0ZTLCBJTkVUIG9y
IENPTk5FQ1RPUiBub3Qgc2VsZWN0ZWQKIwpDT05GSUdfQkxLX0RFVl9OQkQ9bQpDT05GSUdfQkxL
X0RFVl9TWDg9bQpDT05GSUdfQkxLX0RFVl9VQj1tCiMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5v
dCBzZXQKQ09ORklHX0NEUk9NX1BLVENEVkQ9bQpDT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJT
PTgKIyBDT05GSUdfQ0RST01fUEtUQ0RWRF9XQ0FDSEUgaXMgbm90IHNldApDT05GSUdfQVRBX09W
RVJfRVRIPW0KIyBDT05GSUdfWEVOX0JMS0RFVl9GUk9OVEVORCBpcyBub3Qgc2V0CkNPTkZJR19Y
RU5fQkxLREVWX0JBQ0tFTkQ9eQojIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIyBDT05G
SUdfQkxLX0RFVl9SQkQgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xJUzNMVjAyRCBpcyBu
b3Qgc2V0CiMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CkNPTkZJR19IQVZFX0lERT15
CiMgQ09ORklHX0lERSBpcyBub3Qgc2V0CgojCiMgU0NTSSBkZXZpY2Ugc3VwcG9ydAojCkNPTkZJ
R19TQ1NJX01PRD1tCkNPTkZJR19SQUlEX0FUVFJTPW0KQ09ORklHX1NDU0k9bQpDT05GSUdfU0NT
SV9ETUE9eQojIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CkNPTkZJR19TQ1NJX05FVExJTks9
eQpDT05GSUdfU0NTSV9QUk9DX0ZTPXkKCiMKIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFw
ZSwgQ0QtUk9NKQojCkNPTkZJR19CTEtfREVWX1NEPW0KQ09ORklHX0NIUl9ERVZfU1Q9bQpDT05G
SUdfQ0hSX0RFVl9PU1NUPW0KQ09ORklHX0JMS19ERVZfU1I9bQpDT05GSUdfQkxLX0RFVl9TUl9W
RU5ET1I9eQpDT05GSUdfQ0hSX0RFVl9TRz1tCkNPTkZJR19DSFJfREVWX1NDSD1tCkNPTkZJR19T
Q1NJX01VTFRJX0xVTj15CkNPTkZJR19TQ1NJX0NPTlNUQU5UUz15CkNPTkZJR19TQ1NJX0xPR0dJ
Tkc9eQojIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldApDT05GSUdfU0NTSV9XQUlU
X1NDQU49bQoKIwojIFNDU0kgVHJhbnNwb3J0cwojCkNPTkZJR19TQ1NJX1NQSV9BVFRSUz1tCkNP
TkZJR19TQ1NJX0ZDX0FUVFJTPW0KQ09ORklHX1NDU0lfSVNDU0lfQVRUUlM9bQpDT05GSUdfU0NT
SV9TQVNfQVRUUlM9bQpDT05GSUdfU0NTSV9TQVNfTElCU0FTPW0KIyBDT05GSUdfU0NTSV9TQVNf
QVRBIGlzIG5vdCBzZXQKQ09ORklHX1NDU0lfU0FTX0hPU1RfU01QPXkKQ09ORklHX1NDU0lfU1JQ
X0FUVFJTPW0KQ09ORklHX1NDU0lfTE9XTEVWRUw9eQpDT05GSUdfSVNDU0lfVENQPW0KIyBDT05G
SUdfSVNDU0lfQk9PVF9TWVNGUyBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfQ1hHQjNfSVNDU0kg
aXMgbm90IHNldAojIENPTkZJR19TQ1NJX0NYR0I0X0lTQ1NJIGlzIG5vdCBzZXQKIyBDT05GSUdf
U0NTSV9CTlgyX0lTQ1NJIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9CTlgyWF9GQ09FIGlzIG5v
dCBzZXQKIyBDT05GSUdfQkUySVNDU0kgaXMgbm90IHNldApDT05GSUdfQkxLX0RFVl8zV19YWFhY
X1JBSUQ9bQojIENPTkZJR19TQ1NJX0hQU0EgaXMgbm90IHNldApDT05GSUdfU0NTSV8zV185WFhY
PW0KIyBDT05GSUdfU0NTSV8zV19TQVMgaXMgbm90IHNldApDT05GSUdfU0NTSV9BQ0FSRD1tCkNP
TkZJR19TQ1NJX0FBQ1JBSUQ9bQpDT05GSUdfU0NTSV9BSUM3WFhYPW0KQ09ORklHX0FJQzdYWFhf
Q01EU19QRVJfREVWSUNFPTMyCkNPTkZJR19BSUM3WFhYX1JFU0VUX0RFTEFZX01TPTE1MDAwCiMg
Q09ORklHX0FJQzdYWFhfREVCVUdfRU5BQkxFIGlzIG5vdCBzZXQKQ09ORklHX0FJQzdYWFhfREVC
VUdfTUFTSz0wCkNPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQ9eQpDT05GSUdfU0NTSV9B
SUM3WFhYX09MRD1tCkNPTkZJR19TQ1NJX0FJQzc5WFg9bQpDT05GSUdfQUlDNzlYWF9DTURTX1BF
Ul9ERVZJQ0U9MzIKQ09ORklHX0FJQzc5WFhfUkVTRVRfREVMQVlfTVM9MTUwMDAKIyBDT05GSUdf
QUlDNzlYWF9ERUJVR19FTkFCTEUgaXMgbm90IHNldApDT05GSUdfQUlDNzlYWF9ERUJVR19NQVNL
PTAKQ09ORklHX0FJQzc5WFhfUkVHX1BSRVRUWV9QUklOVD15CkNPTkZJR19TQ1NJX0FJQzk0WFg9
bQojIENPTkZJR19BSUM5NFhYX0RFQlVHIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9NVlNBUyBp
cyBub3Qgc2V0CkNPTkZJR19TQ1NJX0RQVF9JMk89bQpDT05GSUdfU0NTSV9BRFZBTlNZUz1tCkNP
TkZJR19TQ1NJX0FSQ01TUj1tCiMgQ09ORklHX1NDU0lfQVJDTVNSX0FFUiBpcyBub3Qgc2V0CkNP
TkZJR19NRUdBUkFJRF9ORVdHRU49eQpDT05GSUdfTUVHQVJBSURfTU09bQpDT05GSUdfTUVHQVJB
SURfTUFJTEJPWD1tCkNPTkZJR19NRUdBUkFJRF9MRUdBQ1k9bQpDT05GSUdfTUVHQVJBSURfU0FT
PW0KQ09ORklHX1NDU0lfTVBUMlNBUz1tCkNPTkZJR19TQ1NJX01QVDJTQVNfTUFYX1NHRT0xMjgK
IyBDT05GSUdfU0NTSV9NUFQyU0FTX0xPR0dJTkcgaXMgbm90IHNldApDT05GSUdfU0NTSV9IUFRJ
T1A9bQpDT05GSUdfU0NTSV9CVVNMT0dJQz1tCiMgQ09ORklHX1NDU0lfRkxBU0hQT0lOVCBpcyBu
b3Qgc2V0CiMgQ09ORklHX1ZNV0FSRV9QVlNDU0kgaXMgbm90IHNldAojIENPTkZJR19MSUJGQyBp
cyBub3Qgc2V0CiMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAojIENPTkZJR19GQ09FIGlzIG5v
dCBzZXQKIyBDT05GSUdfRkNPRV9GTklDIGlzIG5vdCBzZXQKQ09ORklHX1NDU0lfRE1YMzE5MUQ9
bQpDT05GSUdfU0NTSV9FQVRBPW0KIyBDT05GSUdfU0NTSV9FQVRBX1RBR0dFRF9RVUVVRSBpcyBu
b3Qgc2V0CiMgQ09ORklHX1NDU0lfRUFUQV9MSU5LRURfQ09NTUFORFMgaXMgbm90IHNldApDT05G
SUdfU0NTSV9FQVRBX01BWF9UQUdTPTE2CkNPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU49bQpDT05G
SUdfU0NTSV9HRFRIPW0KIyBDT05GSUdfU0NTSV9JU0NJIGlzIG5vdCBzZXQKQ09ORklHX1NDU0lf
SVBTPW0KQ09ORklHX1NDU0lfSU5JVElPPW0KQ09ORklHX1NDU0lfSU5JQTEwMD1tCkNPTkZJR19T
Q1NJX1BQQT1tCkNPTkZJR19TQ1NJX0lNTT1tCiMgQ09ORklHX1NDU0lfSVpJUF9FUFAxNiBpcyBu
b3Qgc2V0CiMgQ09ORklHX1NDU0lfSVpJUF9TTE9XX0NUUiBpcyBub3Qgc2V0CkNPTkZJR19TQ1NJ
X1NURVg9bQpDT05GSUdfU0NTSV9TWU01M0M4WFhfMj1tCkNPTkZJR19TQ1NJX1NZTTUzQzhYWF9E
TUFfQUREUkVTU0lOR19NT0RFPTEKQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUz0x
NgpDT05GSUdfU0NTSV9TWU01M0M4WFhfTUFYX1RBR1M9NjQKQ09ORklHX1NDU0lfU1lNNTNDOFhY
X01NSU89eQpDT05GSUdfU0NTSV9JUFI9bQojIENPTkZJR19TQ1NJX0lQUl9UUkFDRSBpcyBub3Qg
c2V0CiMgQ09ORklHX1NDU0lfSVBSX0RVTVAgaXMgbm90IHNldApDT05GSUdfU0NTSV9RTE9HSUNf
MTI4MD1tCkNPTkZJR19TQ1NJX1FMQV9GQz1tCkNPTkZJR19TQ1NJX1FMQV9JU0NTST1tCkNPTkZJ
R19TQ1NJX0xQRkM9bQpDT05GSUdfU0NTSV9EQzM5NXg9bQpDT05GSUdfU0NTSV9EQzM5MFQ9bQpD
T05GSUdfU0NTSV9OU1AzMj1tCiMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAojIENPTkZJ
R19TQ1NJX1BNQ1JBSUQgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX1BNODAwMSBpcyBub3Qgc2V0
CiMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9CRkFfRkMgaXMgbm90
IHNldApDT05GSUdfU0NTSV9ESD1tCiMgQ09ORklHX1NDU0lfREhfUkRBQyBpcyBub3Qgc2V0CiMg
Q09ORklHX1NDU0lfREhfSFBfU1cgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0RIX0VNQyBpcyBu
b3Qgc2V0CiMgQ09ORklHX1NDU0lfREhfQUxVQSBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfT1NE
X0lOSVRJQVRPUiBpcyBub3Qgc2V0CkNPTkZJR19BVEE9bQojIENPTkZJR19BVEFfTk9OU1RBTkRB
UkQgaXMgbm90IHNldApDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQpDT05GSUdfQVRBX0FDUEk9
eQpDT05GSUdfU0FUQV9QTVA9eQoKIwojIENvbnRyb2xsZXJzIHdpdGggbm9uLVNGRiBuYXRpdmUg
aW50ZXJmYWNlCiMKQ09ORklHX1NBVEFfQUhDST1tCkNPTkZJR19TQVRBX0FIQ0lfUExBVEZPUk09
bQpDT05GSUdfU0FUQV9JTklDMTYyWD1tCkNPTkZJR19TQVRBX0FDQVJEX0FIQ0k9bQpDT05GSUdf
U0FUQV9TSUwyND1tCkNPTkZJR19BVEFfU0ZGPXkKCiMKIyBTRkYgY29udHJvbGxlcnMgd2l0aCBj
dXN0b20gRE1BIGludGVyZmFjZQojCkNPTkZJR19QRENfQURNQT1tCkNPTkZJR19TQVRBX1FTVE9S
PW0KQ09ORklHX1NBVEFfU1g0PW0KQ09ORklHX0FUQV9CTURNQT15CgojCiMgU0FUQSBTRkYgY29u
dHJvbGxlcnMgd2l0aCBCTURNQQojCkNPTkZJR19BVEFfUElJWD1tCkNPTkZJR19TQVRBX01WPW0K
Q09ORklHX1NBVEFfTlY9bQpDT05GSUdfU0FUQV9QUk9NSVNFPW0KQ09ORklHX1NBVEFfU0lMPW0K
Q09ORklHX1NBVEFfU0lTPW0KQ09ORklHX1NBVEFfU1ZXPW0KQ09ORklHX1NBVEFfVUxJPW0KQ09O
RklHX1NBVEFfVklBPW0KQ09ORklHX1NBVEFfVklURVNTRT1tCgojCiMgUEFUQSBTRkYgY29udHJv
bGxlcnMgd2l0aCBCTURNQQojCkNPTkZJR19QQVRBX0FMST1tCkNPTkZJR19QQVRBX0FNRD1tCkNP
TkZJR19QQVRBX0FSQVNBTl9DRj1tCkNPTkZJR19QQVRBX0FSVE9QPW0KQ09ORklHX1BBVEFfQVRJ
SVhQPW0KQ09ORklHX1BBVEFfQVRQODY3WD1tCkNPTkZJR19QQVRBX0NNRDY0WD1tCkNPTkZJR19Q
QVRBX0NTNTUyMD1tCkNPTkZJR19QQVRBX0NTNTUzMD1tCkNPTkZJR19QQVRBX0NTNTUzNT1tCkNP
TkZJR19QQVRBX0NTNTUzNj1tCkNPTkZJR19QQVRBX0NZUFJFU1M9bQpDT05GSUdfUEFUQV9FRkFS
PW0KQ09ORklHX1BBVEFfSFBUMzY2PW0KQ09ORklHX1BBVEFfSFBUMzdYPW0KQ09ORklHX1BBVEFf
SFBUM1gyTj1tCkNPTkZJR19QQVRBX0hQVDNYMz1tCkNPTkZJR19QQVRBX0hQVDNYM19ETUE9eQpD
T05GSUdfUEFUQV9JVDgyMTM9bQpDT05GSUdfUEFUQV9JVDgyMVg9bQpDT05GSUdfUEFUQV9KTUlD
Uk9OPW0KQ09ORklHX1BBVEFfTUFSVkVMTD1tCkNPTkZJR19QQVRBX05FVENFTEw9bQpDT05GSUdf
UEFUQV9OSU5KQTMyPW0KQ09ORklHX1BBVEFfTlM4NzQxNT1tCkNPTkZJR19QQVRBX09MRFBJSVg9
bQpDT05GSUdfUEFUQV9PUFRJRE1BPW0KQ09ORklHX1BBVEFfUERDMjAyN1g9bQpDT05GSUdfUEFU
QV9QRENfT0xEPW0KQ09ORklHX1BBVEFfUkFESVNZUz1tCkNPTkZJR19QQVRBX1JEQz1tCkNPTkZJ
R19QQVRBX1NDMTIwMD1tCkNPTkZJR19QQVRBX1NDSD1tCkNPTkZJR19QQVRBX1NFUlZFUldPUktT
PW0KQ09ORklHX1BBVEFfU0lMNjgwPW0KQ09ORklHX1BBVEFfU0lTPW0KQ09ORklHX1BBVEFfVE9T
SElCQT1tCkNPTkZJR19QQVRBX1RSSUZMRVg9bQpDT05GSUdfUEFUQV9WSUE9bQpDT05GSUdfUEFU
QV9XSU5CT05EPW0KCiMKIyBQSU8tb25seSBTRkYgY29udHJvbGxlcnMKIwpDT05GSUdfUEFUQV9D
TUQ2NDBfUENJPW0KQ09ORklHX1BBVEFfTVBJSVg9bQpDT05GSUdfUEFUQV9OUzg3NDEwPW0KQ09O
RklHX1BBVEFfT1BUST1tCiMgQ09ORklHX1BBVEFfUExBVEZPUk0gaXMgbm90IHNldApDT05GSUdf
UEFUQV9SWjEwMDA9bQoKIwojIEdlbmVyaWMgZmFsbGJhY2sgLyBsZWdhY3kgZHJpdmVycwojCkNP
TkZJR19QQVRBX0FDUEk9bQpDT05GSUdfQVRBX0dFTkVSSUM9bQojIENPTkZJR19QQVRBX0xFR0FD
WSBpcyBub3Qgc2V0CkNPTkZJR19NRD15CkNPTkZJR19CTEtfREVWX01EPXkKQ09ORklHX01EX0FV
VE9ERVRFQ1Q9eQpDT05GSUdfTURfTElORUFSPW0KQ09ORklHX01EX1JBSUQwPW0KQ09ORklHX01E
X1JBSUQxPW0KQ09ORklHX01EX1JBSUQxMD1tCkNPTkZJR19NRF9SQUlENDU2PW0KIyBDT05GSUdf
TVVMVElDT1JFX1JBSUQ0NTYgaXMgbm90IHNldApDT05GSUdfTURfTVVMVElQQVRIPW0KIyBDT05G
SUdfTURfRkFVTFRZIGlzIG5vdCBzZXQKQ09ORklHX0JMS19ERVZfRE09bQojIENPTkZJR19ETV9E
RUJVRyBpcyBub3Qgc2V0CkNPTkZJR19ETV9DUllQVD1tCkNPTkZJR19ETV9TTkFQU0hPVD1tCkNP
TkZJR19ETV9NSVJST1I9bQojIENPTkZJR19ETV9SQUlEIGlzIG5vdCBzZXQKIyBDT05GSUdfRE1f
TE9HX1VTRVJTUEFDRSBpcyBub3Qgc2V0CkNPTkZJR19ETV9aRVJPPW0KQ09ORklHX0RNX01VTFRJ
UEFUSD1tCiMgQ09ORklHX0RNX01VTFRJUEFUSF9RTCBpcyBub3Qgc2V0CiMgQ09ORklHX0RNX01V
TFRJUEFUSF9TVCBpcyBub3Qgc2V0CiMgQ09ORklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKIyBDT05G
SUdfRE1fVUVWRU5UIGlzIG5vdCBzZXQKIyBDT05GSUdfRE1fRkxBS0VZIGlzIG5vdCBzZXQKIyBD
T05GSUdfVEFSR0VUX0NPUkUgaXMgbm90IHNldApDT05GSUdfRlVTSU9OPXkKQ09ORklHX0ZVU0lP
Tl9TUEk9bQpDT05GSUdfRlVTSU9OX0ZDPW0KQ09ORklHX0ZVU0lPTl9TQVM9bQpDT05GSUdfRlVT
SU9OX01BWF9TR0U9MTI4CkNPTkZJR19GVVNJT05fQ1RMPW0KIyBDT05GSUdfRlVTSU9OX0xBTiBp
cyBub3Qgc2V0CiMgQ09ORklHX0ZVU0lPTl9MT0dHSU5HIGlzIG5vdCBzZXQKCiMKIyBJRUVFIDEz
OTQgKEZpcmVXaXJlKSBzdXBwb3J0CiMKIyBDT05GSUdfRklSRVdJUkUgaXMgbm90IHNldAojIENP
TkZJR19GSVJFV0lSRV9OT1NZIGlzIG5vdCBzZXQKQ09ORklHX0kyTz1tCkNPTkZJR19JMk9fTENU
X05PVElGWV9PTl9DSEFOR0VTPXkKQ09ORklHX0kyT19FWFRfQURBUFRFQz15CkNPTkZJR19JMk9f
RVhUX0FEQVBURUNfRE1BNjQ9eQpDT05GSUdfSTJPX0NPTkZJRz1tCkNPTkZJR19JMk9fQ09ORklH
X09MRF9JT0NUTD15CkNPTkZJR19JMk9fQlVTPW0KQ09ORklHX0kyT19CTE9DSz1tCkNPTkZJR19J
Mk9fU0NTST1tCkNPTkZJR19JMk9fUFJPQz1tCiMgQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTIGlz
IG5vdCBzZXQKQ09ORklHX05FVERFVklDRVM9eQpDT05GSUdfRFVNTVk9bQpDT05GSUdfQk9ORElO
Rz1tCiMgQ09ORklHX01BQ1ZMQU4gaXMgbm90IHNldApDT05GSUdfRVFVQUxJWkVSPW0KQ09ORklH
X1RVTj1tCkNPTkZJR19WRVRIPW0KQ09ORklHX05FVF9TQjEwMDA9bQojIENPTkZJR19BUkNORVQg
aXMgbm90IHNldApDT05GSUdfTUlJPXkKQ09ORklHX1BIWUxJQj1tCgojCiMgTUlJIFBIWSBkZXZp
Y2UgZHJpdmVycwojCkNPTkZJR19NQVJWRUxMX1BIWT1tCkNPTkZJR19EQVZJQ09NX1BIWT1tCkNP
TkZJR19RU0VNSV9QSFk9bQpDT05GSUdfTFhUX1BIWT1tCkNPTkZJR19DSUNBREFfUEhZPW0KQ09O
RklHX1ZJVEVTU0VfUEhZPW0KQ09ORklHX1NNU0NfUEhZPW0KIyBDT05GSUdfQlJPQURDT01fUEhZ
IGlzIG5vdCBzZXQKIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CiMgQ09ORklHX1JFQUxU
RUtfUEhZIGlzIG5vdCBzZXQKIyBDT05GSUdfTkFUSU9OQUxfUEhZIGlzIG5vdCBzZXQKIyBDT05G
SUdfU1RFMTBYUCBpcyBub3Qgc2V0CiMgQ09ORklHX0xTSV9FVDEwMTFDX1BIWSBpcyBub3Qgc2V0
CiMgQ09ORklHX01JQ1JFTF9QSFkgaXMgbm90IHNldAojIENPTkZJR19NRElPX0JJVEJBTkcgaXMg
bm90IHNldApDT05GSUdfTkVUX0VUSEVSTkVUPXkKQ09ORklHX0hBUFBZTUVBTD1tCkNPTkZJR19T
VU5HRU09bQpDT05GSUdfQ0FTU0lOST1tCkNPTkZJR19ORVRfVkVORE9SXzNDT009eQpDT05GSUdf
Vk9SVEVYPW0KQ09ORklHX1RZUEhPT049bQojIENPTkZJR19FVEhPQyBpcyBub3Qgc2V0CiMgQ09O
RklHX0RORVQgaXMgbm90IHNldApDT05GSUdfTkVUX1RVTElQPXkKQ09ORklHX0RFMjEwNFg9bQpD
T05GSUdfREUyMTA0WF9EU0w9MApDT05GSUdfVFVMSVA9bQojIENPTkZJR19UVUxJUF9NV0kgaXMg
bm90IHNldApDT05GSUdfVFVMSVBfTU1JTz15CiMgQ09ORklHX1RVTElQX05BUEkgaXMgbm90IHNl
dApDT05GSUdfREU0WDU9bQpDT05GSUdfV0lOQk9ORF84NDA9bQpDT05GSUdfRE05MTAyPW0KQ09O
RklHX1VMSTUyNlg9bQpDT05GSUdfSFAxMDA9bQojIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBp
cyBub3Qgc2V0CiMgQ09ORklHX0lCTV9ORVdfRU1BQ19SR01JSSBpcyBub3Qgc2V0CiMgQ09ORklH
X0lCTV9ORVdfRU1BQ19UQUggaXMgbm90IHNldAojIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQg
aXMgbm90IHNldAojIENPTkZJR19JQk1fTkVXX0VNQUNfTk9fRkxPV19DVFJMIGlzIG5vdCBzZXQK
IyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DTFJfSUNJTlRTVEFUIGlzIG5vdCBzZXQKIyBDT05G
SUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKQ09ORklHX05FVF9QQ0k9
eQpDT05GSUdfUENORVQzMj1tCkNPTkZJR19BTUQ4MTExX0VUSD1tCkNPTkZJR19BREFQVEVDX1NU
QVJGSVJFPW0KIyBDT05GSUdfS1NaODg0WF9QQ0kgaXMgbm90IHNldApDT05GSUdfQjQ0PW0KQ09O
RklHX0I0NF9QQ0lfQVVUT1NFTEVDVD15CkNPTkZJR19CNDRfUENJQ09SRV9BVVRPU0VMRUNUPXkK
Q09ORklHX0I0NF9QQ0k9eQpDT05GSUdfRk9SQ0VERVRIPW0KQ09ORklHX0UxMDA9bQpDT05GSUdf
RkVBTE5YPW0KQ09ORklHX05BVFNFTUk9bQpDT05GSUdfTkUyS19QQ0k9bQpDT05GSUdfODEzOUNQ
PW0KQ09ORklHXzgxMzlUT089bQpDT05GSUdfODEzOVRPT19QSU89eQojIENPTkZJR184MTM5VE9P
X1RVTkVfVFdJU1RFUiBpcyBub3Qgc2V0CkNPTkZJR184MTM5VE9PXzgxMjk9eQojIENPTkZJR184
MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CiMgQ09ORklHX1I2MDQwIGlzIG5vdCBzZXQKQ09O
RklHX1NJUzkwMD1tCkNPTkZJR19FUElDMTAwPW0KIyBDT05GSUdfU01TQzk0MjAgaXMgbm90IHNl
dApDT05GSUdfU1VOREFOQ0U9bQpDT05GSUdfU1VOREFOQ0VfTU1JTz15CkNPTkZJR19UTEFOPW0K
IyBDT05GSUdfS1M4ODQyIGlzIG5vdCBzZXQKIyBDT05GSUdfS1M4ODUxX01MTCBpcyBub3Qgc2V0
CkNPTkZJR19WSUFfUkhJTkU9bQpDT05GSUdfVklBX1JISU5FX01NSU89eQojIENPTkZJR19TQzky
MDMxIGlzIG5vdCBzZXQKQ09ORklHX05FVF9QT0NLRVQ9eQpDT05GSUdfQVRQPW0KQ09ORklHX0RF
NjAwPW0KQ09ORklHX0RFNjIwPW0KIyBDT05GSUdfQVRMMiBpcyBub3Qgc2V0CkNPTkZJR19ORVRE
RVZfMTAwMD15CkNPTkZJR19BQ0VOSUM9bQojIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JIGlz
IG5vdCBzZXQKQ09ORklHX0RMMks9bQpDT05GSUdfRTEwMDA9bQpDT05GSUdfRTEwMDBFPW0KQ09O
RklHX0lQMTAwMD1tCkNPTkZJR19JR0I9bQpDT05GSUdfSUdCX0RDQT15CkNPTkZJR19JR0JWRj1t
CkNPTkZJR19OUzgzODIwPW0KQ09ORklHX0hBTUFDSEk9bQpDT05GSUdfWUVMTE9XRklOPW0KQ09O
RklHX1I4MTY5PW0KQ09ORklHX1NJUzE5MD1tCkNPTkZJR19TS0dFPW0KQ09ORklHX1NLWTI9bQpD
T05GSUdfVklBX1ZFTE9DSVRZPW0KQ09ORklHX1RJR09OMz1tCkNPTkZJR19CTlgyPW0KIyBDT05G
SUdfQ05JQyBpcyBub3Qgc2V0CkNPTkZJR19RTEEzWFhYPW0KQ09ORklHX0FUTDE9bQpDT05GSUdf
QVRMMUU9bQpDT05GSUdfQVRMMUM9bQpDT05GSUdfSk1FPW0KQ09ORklHX1NUTU1BQ19FVEg9bQoj
IENPTkZJR19TVE1NQUNfREEgaXMgbm90IHNldAojIENPTkZJR19TVE1NQUNfRFVBTF9NQUMgaXMg
bm90IHNldApDT05GSUdfUENIX0dCRT15CkNPTkZJR19ORVRERVZfMTAwMDA9eQpDT05GSUdfTURJ
Tz1tCkNPTkZJR19DSEVMU0lPX1QxPW0KIyBDT05GSUdfQ0hFTFNJT19UMV8xRyBpcyBub3Qgc2V0
CkNPTkZJR19DSEVMU0lPX1QzPW0KQ09ORklHX0NIRUxTSU9fVDQ9bQpDT05GSUdfQ0hFTFNJT19U
NFZGPW0KQ09ORklHX0VOSUM9bQpDT05GSUdfSVhHQkU9bQpDT05GSUdfSVhHQkVfRENBPXkKQ09O
RklHX0lYR0JFVkY9bQpDT05GSUdfSVhHQj1tCkNPTkZJR19TMklPPW0KQ09ORklHX1ZYR0U9bQoj
IENPTkZJR19WWEdFX0RFQlVHX1RSQUNFX0FMTCBpcyBub3Qgc2V0CkNPTkZJR19NWVJJMTBHRT1t
CkNPTkZJR19NWVJJMTBHRV9EQ0E9eQpDT05GSUdfTkVUWEVOX05JQz1tCkNPTkZJR19OSVU9bQpD
T05GSUdfTUxYNF9FTj1tCkNPTkZJR19NTFg0X0NPUkU9bQpDT05GSUdfTUxYNF9ERUJVRz15CkNP
TkZJR19URUhVVEk9bQpDT05GSUdfQk5YMlg9bQpDT05GSUdfUUxDTklDPW0KQ09ORklHX1FMR0U9
bQpDT05GSUdfQk5BPW0KQ09ORklHX1NGQz1tCkNPTkZJR19CRTJORVQ9bQpDT05GSUdfVFI9eQpD
T05GSUdfSUJNT0w9bQpDT05GSUdfSUJNTFM9bQpDT05GSUdfM0MzNTk9bQojIENPTkZJR19UTVMz
ODBUUiBpcyBub3Qgc2V0CiMgQ09ORklHX1dMQU4gaXMgbm90IHNldAoKIwojIEVuYWJsZSBXaU1B
WCAoTmV0d29ya2luZyBvcHRpb25zKSB0byBzZWUgdGhlIFdpTUFYIGRyaXZlcnMKIwoKIwojIFVT
QiBOZXR3b3JrIEFkYXB0ZXJzCiMKIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAojIENPTkZJ
R19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAoj
IENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90
IHNldAojIENPTkZJR19VU0JfSVBIRVRIIGlzIG5vdCBzZXQKIyBDT05GSUdfV0FOIGlzIG5vdCBz
ZXQKCiMKIyBDQUlGIHRyYW5zcG9ydCBkcml2ZXJzCiMKIyBDT05GSUdfWEVOX05FVERFVl9GUk9O
VEVORCBpcyBub3Qgc2V0CkNPTkZJR19YRU5fTkVUREVWX0JBQ0tFTkQ9eQojIENPTkZJR19GRERJ
IGlzIG5vdCBzZXQKIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAojIENPTkZJR19QTElQIGlzIG5v
dCBzZXQKQ09ORklHX1BQUD1tCkNPTkZJR19QUFBfTVVMVElMSU5LPXkKQ09ORklHX1BQUF9GSUxU
RVI9eQpDT05GSUdfUFBQX0FTWU5DPW0KQ09ORklHX1BQUF9TWU5DX1RUWT1tCkNPTkZJR19QUFBf
REVGTEFURT1tCkNPTkZJR19QUFBfQlNEQ09NUD1tCiMgQ09ORklHX1BQUF9NUFBFIGlzIG5vdCBz
ZXQKQ09ORklHX1BQUE9FPW0KQ09ORklHX1NMSVA9bQpDT05GSUdfU0xJUF9DT01QUkVTU0VEPXkK
Q09ORklHX1NMSEM9bQpDT05GSUdfU0xJUF9TTUFSVD15CiMgQ09ORklHX1NMSVBfTU9ERV9TTElQ
NiBpcyBub3Qgc2V0CkNPTkZJR19ORVRfRkM9eQpDT05GSUdfTkVUQ09OU09MRT1tCkNPTkZJR19O
RVRQT0xMPXkKQ09ORklHX05FVFBPTExfVFJBUD15CkNPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVS
PXkKIyBDT05GSUdfVk1YTkVUMyBpcyBub3Qgc2V0CiMgQ09ORklHX0lTRE4gaXMgbm90IHNldAoj
IENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CgojCiMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKIwpDT05G
SUdfSU5QVVQ9eQojIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKQ09ORklHX0lO
UFVUX1BPTExERVY9bQpDT05GSUdfSU5QVVRfU1BBUlNFS01BUD1tCgojCiMgVXNlcmxhbmQgaW50
ZXJmYWNlcwojCkNPTkZJR19JTlBVVF9NT1VTRURFVj15CkNPTkZJR19JTlBVVF9NT1VTRURFVl9Q
U0FVWD15CkNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CkNPTkZJR19JTlBVVF9N
T1VTRURFVl9TQ1JFRU5fWT03NjgKIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKIyBD
T05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qg
c2V0CgojCiMgSW5wdXQgRGV2aWNlIERyaXZlcnMKIwpDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQoj
IENPTkZJR19LRVlCT0FSRF9BRFA1NTg4IGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfQURQ
NTU4OSBpcyBub3Qgc2V0CkNPTkZJR19LRVlCT0FSRF9BVEtCRD15CiMgQ09ORklHX0tFWUJPQVJE
X1FUMTA3MCBpcyBub3Qgc2V0CiMgQ09ORklHX0tFWUJPQVJEX1FUMjE2MCBpcyBub3Qgc2V0CiMg
Q09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfVENBNjQx
NiBpcyBub3Qgc2V0CiMgQ09ORklHX0tFWUJPQVJEX0xNODMyMyBpcyBub3Qgc2V0CiMgQ09ORklH
X0tFWUJPQVJEX01BWDczNTkgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9NQ1MgaXMgbm90
IHNldAojIENPTkZJR19LRVlCT0FSRF9NUFIxMjEgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FS
RF9ORVdUT04gaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMgaXMgbm90IHNl
dAojIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CiMgQ09ORklHX0tFWUJPQVJE
X1NVTktCRCBpcyBub3Qgc2V0CiMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKIyBD
T05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBu
b3Qgc2V0CiMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOUFVUX1RP
VUNIU0NSRUVOIGlzIG5vdCBzZXQKQ09ORklHX0lOUFVUX01JU0M9eQojIENPTkZJR19JTlBVVF9B
RDcxNFggaXMgbm90IHNldApDT05GSUdfSU5QVVRfUENTUEtSPW0KIyBDT05GSUdfSU5QVVRfQVBB
TkVMIGlzIG5vdCBzZXQKQ09ORklHX0lOUFVUX1dJU1RST05fQlROUz1tCiMgQ09ORklHX0lOUFVU
X0FUTEFTX0JUTlMgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9BVElfUkVNT1RFIGlzIG5vdCBz
ZXQKIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URTIgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9L
RVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CiMgQ09ORklHX0lOUFVUX1BPV0VSTUFURSBpcyBub3Qg
c2V0CiMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAojIENPTkZJR19JTlBVVF9DTTEw
OSBpcyBub3Qgc2V0CkNPTkZJR19JTlBVVF9VSU5QVVQ9bQojIENPTkZJR19JTlBVVF9QQ0Y4NTc0
IGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfQURYTDM0WCBpcyBub3Qgc2V0CiMgQ09ORklHX0lO
UFVUX0NNQTMwMDAgaXMgbm90IHNldAoKIwojIEhhcmR3YXJlIEkvTyBwb3J0cwojCkNPTkZJR19T
RVJJTz15CkNPTkZJR19TRVJJT19JODA0Mj15CkNPTkZJR19TRVJJT19TRVJQT1JUPXkKIyBDT05G
SUdfU0VSSU9fQ1Q4MkM3MTAgaXMgbm90IHNldAojIENPTkZJR19TRVJJT19QQVJLQkQgaXMgbm90
IHNldAojIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldApDT05GSUdfU0VSSU9fTElCUFMy
PXkKQ09ORklHX1NFUklPX1JBVz1tCiMgQ09ORklHX1NFUklPX0FMVEVSQV9QUzIgaXMgbm90IHNl
dAojIENPTkZJR19TRVJJT19QUzJNVUxUIGlzIG5vdCBzZXQKIyBDT05GSUdfR0FNRVBPUlQgaXMg
bm90IHNldAoKIwojIENoYXJhY3RlciBkZXZpY2VzCiMKQ09ORklHX1ZUPXkKQ09ORklHX0NPTlNP
TEVfVFJBTlNMQVRJT05TPXkKQ09ORklHX1ZUX0NPTlNPTEU9eQpDT05GSUdfSFdfQ09OU09MRT15
CkNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9eQpDT05GSUdfVU5JWDk4X1BUWVM9eQojIENP
TkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTIGlzIG5vdCBzZXQKIyBDT05GSUdfTEVHQUNZ
X1BUWVMgaXMgbm90IHNldApDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEPXkKIyBDT05GSUdfUk9D
S0VUUE9SVCBpcyBub3Qgc2V0CkNPTkZJR19DWUNMQURFUz1tCiMgQ09ORklHX0NZWl9JTlRSIGlz
IG5vdCBzZXQKIyBDT05GSUdfTU9YQV9JTlRFTExJTyBpcyBub3Qgc2V0CiMgQ09ORklHX01PWEFf
U01BUlRJTyBpcyBub3Qgc2V0CkNPTkZJR19TWU5DTElOSz1tCkNPTkZJR19TWU5DTElOS01QPW0K
Q09ORklHX1NZTkNMSU5LX0dUPW0KIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKIyBDT05GSUdf
SVNJIGlzIG5vdCBzZXQKQ09ORklHX05fSERMQz1tCiMgQ09ORklHX05fR1NNIGlzIG5vdCBzZXQK
IyBDT05GSUdfVFJBQ0VfU0lOSyBpcyBub3Qgc2V0CkNPTkZJR19ERVZLTUVNPXkKQ09ORklHX1NU
QUxEUlY9eQoKIwojIFNlcmlhbCBkcml2ZXJzCiMKQ09ORklHX1NFUklBTF84MjUwPXkKQ09ORklH
X1NFUklBTF84MjUwX0NPTlNPTEU9eQpDT05GSUdfRklYX0VBUkxZQ09OX01FTT15CkNPTkZJR19T
RVJJQUxfODI1MF9QQ0k9eQpDT05GSUdfU0VSSUFMXzgyNTBfUE5QPXkKQ09ORklHX1NFUklBTF84
MjUwX05SX1VBUlRTPTQKQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NApDT05GSUdf
U0VSSUFMXzgyNTBfRVhURU5ERUQ9eQojIENPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTIGlz
IG5vdCBzZXQKQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CkNPTkZJR19TRVJJQUxfODI1
MF9ERVRFQ1RfSVJRPXkKQ09ORklHX1NFUklBTF84MjUwX1JTQT15CgojCiMgTm9uLTgyNTAgc2Vy
aWFsIHBvcnQgc3VwcG9ydAojCiMgQ09ORklHX1NFUklBTF9NRkRfSFNVIGlzIG5vdCBzZXQKQ09O
RklHX1NFUklBTF9DT1JFPXkKQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQpDT05GSUdfU0VS
SUFMX0pTTT1tCiMgQ09ORklHX1NFUklBTF9USU1CRVJEQUxFIGlzIG5vdCBzZXQKIyBDT05GSUdf
U0VSSUFMX0FMVEVSQV9KVEFHVUFSVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklBTF9BTFRFUkFf
VUFSVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklBTF9QQ0hfVUFSVCBpcyBub3Qgc2V0CiMgQ09O
RklHX1NFUklBTF9YSUxJTlhfUFNfVUFSVCBpcyBub3Qgc2V0CiMgQ09ORklHX1RUWV9QUklOVEsg
aXMgbm90IHNldAojIENPTkZJR19QUklOVEVSIGlzIG5vdCBzZXQKIyBDT05GSUdfUFBERVYgaXMg
bm90IHNldApDT05GSUdfSFZDX0RSSVZFUj15CkNPTkZJR19IVkNfSVJRPXkKQ09ORklHX0hWQ19Y
RU49eQpDT05GSUdfSVBNSV9IQU5ETEVSPW0KQ09ORklHX0lQTUlfUEFOSUNfRVZFTlQ9eQojIENP
TkZJR19JUE1JX1BBTklDX1NUUklORyBpcyBub3Qgc2V0CkNPTkZJR19JUE1JX0RFVklDRV9JTlRF
UkZBQ0U9bQpDT05GSUdfSVBNSV9TST1tCkNPTkZJR19JUE1JX1dBVENIRE9HPW0KQ09ORklHX0lQ
TUlfUE9XRVJPRkY9bQpDT05GSUdfSFdfUkFORE9NPXkKIyBDT05GSUdfSFdfUkFORE9NX1RJTUVS
SU9NRU0gaXMgbm90IHNldApDT05GSUdfSFdfUkFORE9NX0lOVEVMPXkKQ09ORklHX0hXX1JBTkRP
TV9BTUQ9eQpDT05GSUdfSFdfUkFORE9NX0dFT0RFPXkKQ09ORklHX0hXX1JBTkRPTV9WSUE9eQpD
T05GSUdfTlZSQU09bQpDT05GSUdfUlRDPXkKIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAojIENP
TkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CkNPTkZJR19TT05ZUEk9bQojIENPTkZJR19NV0FWRSBp
cyBub3Qgc2V0CkNPTkZJR19QQzg3MzZ4X0dQSU89bQpDT05GSUdfTlNDX0dQSU89bQpDT05GSUdf
UkFXX0RSSVZFUj1tCkNPTkZJR19NQVhfUkFXX0RFVlM9MjU2CiMgQ09ORklHX0hQRVQgaXMgbm90
IHNldAojIENPTkZJR19IQU5HQ0hFQ0tfVElNRVIgaXMgbm90IHNldAojIENPTkZJR19UQ0dfVFBN
IGlzIG5vdCBzZXQKIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldApDT05GSUdfREVWUE9SVD15
CiMgQ09ORklHX1JBTU9PUFMgaXMgbm90IHNldApDT05GSUdfSTJDPW0KQ09ORklHX0kyQ19CT0FS
RElORk89eQpDT05GSUdfSTJDX0NPTVBBVD15CkNPTkZJR19JMkNfQ0hBUkRFVj1tCiMgQ09ORklH
X0kyQ19NVVggaXMgbm90IHNldApDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKQ09ORklHX0kyQ19T
TUJVUz1tCkNPTkZJR19JMkNfQUxHT0JJVD1tCgojCiMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0
CiMKCiMKIyBQQyBTTUJ1cyBob3N0IGNvbnRyb2xsZXIgZHJpdmVycwojCkNPTkZJR19JMkNfQUxJ
MTUzNT1tCkNPTkZJR19JMkNfQUxJMTU2Mz1tCkNPTkZJR19JMkNfQUxJMTVYMz1tCkNPTkZJR19J
MkNfQU1ENzU2PW0KQ09ORklHX0kyQ19BTUQ3NTZfUzQ4ODI9bQpDT05GSUdfSTJDX0FNRDgxMTE9
bQpDT05GSUdfSTJDX0k4MDE9bQojIENPTkZJR19JMkNfSVNDSCBpcyBub3Qgc2V0CkNPTkZJR19J
MkNfUElJWDQ9bQpDT05GSUdfSTJDX05GT1JDRTI9bQojIENPTkZJR19JMkNfTkZPUkNFMl9TNDk4
NSBpcyBub3Qgc2V0CkNPTkZJR19JMkNfU0lTNTU5NT1tCkNPTkZJR19JMkNfU0lTNjMwPW0KQ09O
RklHX0kyQ19TSVM5Nlg9bQpDT05GSUdfSTJDX1ZJQT1tCkNPTkZJR19JMkNfVklBUFJPPW0KCiMK
IyBBQ1BJIGRyaXZlcnMKIwojIENPTkZJR19JMkNfU0NNSSBpcyBub3Qgc2V0CgojCiMgSTJDIHN5
c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCiMKIyBD
T05GSUdfSTJDX0lOVEVMX01JRCBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90
IHNldAojIENPTkZJR19JMkNfUENBX1BMQVRGT1JNIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1BY
QV9QQ0kgaXMgbm90IHNldAojIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKIyBDT05GSUdf
STJDX1hJTElOWCBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19FRzIwVCBpcyBub3Qgc2V0CgojCiMg
RXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycwojCiMgQ09ORklHX0kyQ19ESU9MQU5f
VTJDIGlzIG5vdCBzZXQKQ09ORklHX0kyQ19QQVJQT1JUPW0KQ09ORklHX0kyQ19QQVJQT1JUX0xJ
R0hUPW0KIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1RJTllf
VVNCIGlzIG5vdCBzZXQKCiMKIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKIwpDT05GSUdf
STJDX1NUVUI9bQpDT05GSUdfU0N4MjAwX0FDQj1tCiMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlz
IG5vdCBzZXQKIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAojIENPTkZJR19JMkNf
REVCVUdfQlVTIGlzIG5vdCBzZXQKIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKCiMKIyBQUFMgc3Vw
cG9ydAojCiMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CgojCiMgUFBTIGdlbmVyYXRvcnMgc3VwcG9y
dAojCgojCiMgUFRQIGNsb2NrIHN1cHBvcnQKIwoKIwojIEVuYWJsZSBEZXZpY2UgRHJpdmVycyAt
PiBQUFMgdG8gc2VlIHRoZSBQVFAgY2xvY2sgb3B0aW9ucy4KIwpDT05GSUdfQVJDSF9XQU5UX09Q
VElPTkFMX0dQSU9MSUI9eQojIENPTkZJR19HUElPTElCIGlzIG5vdCBzZXQKIyBDT05GSUdfVzEg
aXMgbm90IHNldApDT05GSUdfUE9XRVJfU1VQUExZPW0KIyBDT05GSUdfUE9XRVJfU1VQUExZX0RF
QlVHIGlzIG5vdCBzZXQKIyBDT05GSUdfUERBX1BPV0VSIGlzIG5vdCBzZXQKIyBDT05GSUdfVEVT
VF9QT1dFUiBpcyBub3Qgc2V0CiMgQ09ORklHX0JBVFRFUllfRFMyNzgwIGlzIG5vdCBzZXQKIyBD
T05GSUdfQkFUVEVSWV9EUzI3ODIgaXMgbm90IHNldAojIENPTkZJR19CQVRURVJZX0JRMjBaNzUg
aXMgbm90IHNldAojIENPTkZJR19CQVRURVJZX0JRMjd4MDAgaXMgbm90IHNldAojIENPTkZJR19C
QVRURVJZX01BWDE3MDQwIGlzIG5vdCBzZXQKIyBDT05GSUdfQkFUVEVSWV9NQVgxNzA0MiBpcyBu
b3Qgc2V0CiMgQ09ORklHX0NIQVJHRVJfTUFYODkwMyBpcyBub3Qgc2V0CkNPTkZJR19IV01PTj1t
CkNPTkZJR19IV01PTl9WSUQ9bQojIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQK
CiMKIyBOYXRpdmUgZHJpdmVycwojCkNPTkZJR19TRU5TT1JTX0FCSVRVR1VSVT1tCkNPTkZJR19T
RU5TT1JTX0FCSVRVR1VSVTM9bQpDT05GSUdfU0VOU09SU19BRDc0MTQ9bQpDT05GSUdfU0VOU09S
U19BRDc0MTg9bQpDT05GSUdfU0VOU09SU19BRE0xMDIxPW0KQ09ORklHX1NFTlNPUlNfQURNMTAy
NT1tCkNPTkZJR19TRU5TT1JTX0FETTEwMjY9bQpDT05GSUdfU0VOU09SU19BRE0xMDI5PW0KQ09O
RklHX1NFTlNPUlNfQURNMTAzMT1tCkNPTkZJR19TRU5TT1JTX0FETTkyNDA9bQpDT05GSUdfU0VO
U09SU19BRFQ3NDExPW0KQ09ORklHX1NFTlNPUlNfQURUNzQ2Mj1tCkNPTkZJR19TRU5TT1JTX0FE
VDc0NzA9bQpDT05GSUdfU0VOU09SU19BRFQ3NDc1PW0KQ09ORklHX1NFTlNPUlNfQVNDNzYyMT1t
CkNPTkZJR19TRU5TT1JTX0s4VEVNUD1tCkNPTkZJR19TRU5TT1JTX0sxMFRFTVA9bQpDT05GSUdf
U0VOU09SU19GQU0xNUhfUE9XRVI9bQpDT05GSUdfU0VOU09SU19BU0IxMDA9bQpDT05GSUdfU0VO
U09SU19BVFhQMT1tCkNPTkZJR19TRU5TT1JTX0RTNjIwPW0KQ09ORklHX1NFTlNPUlNfRFMxNjIx
PW0KQ09ORklHX1NFTlNPUlNfSTVLX0FNQj1tCkNPTkZJR19TRU5TT1JTX0Y3MTgwNUY9bQpDT05G
SUdfU0VOU09SU19GNzE4ODJGRz1tCkNPTkZJR19TRU5TT1JTX0Y3NTM3NVM9bQpDT05GSUdfU0VO
U09SU19GU0NITUQ9bQpDT05GSUdfU0VOU09SU19HNzYwQT1tCkNPTkZJR19TRU5TT1JTX0dMNTE4
U009bQpDT05GSUdfU0VOU09SU19HTDUyMFNNPW0KQ09ORklHX1NFTlNPUlNfQ09SRVRFTVA9bQpD
T05GSUdfU0VOU09SU19JQk1BRU09bQpDT05GSUdfU0VOU09SU19JQk1QRVg9bQpDT05GSUdfU0VO
U09SU19JVDg3PW0KQ09ORklHX1NFTlNPUlNfSkM0Mj1tCkNPTkZJR19TRU5TT1JTX0xJTkVBR0U9
bQpDT05GSUdfU0VOU09SU19MTTYzPW0KQ09ORklHX1NFTlNPUlNfTE03Mz1tCkNPTkZJR19TRU5T
T1JTX0xNNzU9bQpDT05GSUdfU0VOU09SU19MTTc3PW0KQ09ORklHX1NFTlNPUlNfTE03OD1tCkNP
TkZJR19TRU5TT1JTX0xNODA9bQpDT05GSUdfU0VOU09SU19MTTgzPW0KQ09ORklHX1NFTlNPUlNf
TE04NT1tCkNPTkZJR19TRU5TT1JTX0xNODc9bQpDT05GSUdfU0VOU09SU19MTTkwPW0KQ09ORklH
X1NFTlNPUlNfTE05Mj1tCkNPTkZJR19TRU5TT1JTX0xNOTM9bQpDT05GSUdfU0VOU09SU19MVEM0
MTUxPW0KQ09ORklHX1NFTlNPUlNfTFRDNDIxNT1tCkNPTkZJR19TRU5TT1JTX0xUQzQyNDU9bQpD
T05GSUdfU0VOU09SU19MVEM0MjYxPW0KQ09ORklHX1NFTlNPUlNfTE05NTI0MT1tCkNPTkZJR19T
RU5TT1JTX01BWDE2MDY1PW0KQ09ORklHX1NFTlNPUlNfTUFYMTYxOT1tCkNPTkZJR19TRU5TT1JT
X01BWDY2Mzk9bQpDT05GSUdfU0VOU09SU19NQVg2NjQyPW0KQ09ORklHX1NFTlNPUlNfTUFYNjY1
MD1tCkNPTkZJR19TRU5TT1JTX1BDODczNjA9bQpDT05GSUdfU0VOU09SU19QQzg3NDI3PW0KQ09O
RklHX1NFTlNPUlNfUENGODU5MT1tCkNPTkZJR19QTUJVUz1tCkNPTkZJR19TRU5TT1JTX1BNQlVT
PW0KQ09ORklHX1NFTlNPUlNfQURNMTI3NT1tCkNPTkZJR19TRU5TT1JTX01BWDE2MDY0PW0KQ09O
RklHX1NFTlNPUlNfTUFYMzQ0NDA9bQpDT05GSUdfU0VOU09SU19NQVg4Njg4PW0KQ09ORklHX1NF
TlNPUlNfVUNEOTAwMD1tCkNPTkZJR19TRU5TT1JTX1VDRDkyMDA9bQpDT05GSUdfU0VOU09SU19T
SFQyMT1tCkNPTkZJR19TRU5TT1JTX1NJUzU1OTU9bQpDT05GSUdfU0VOU09SU19TTU02NjU9bQpD
T05GSUdfU0VOU09SU19ETUUxNzM3PW0KQ09ORklHX1NFTlNPUlNfRU1DMTQwMz1tCkNPTkZJR19T
RU5TT1JTX0VNQzIxMDM9bQpDT05GSUdfU0VOU09SU19FTUM2VzIwMT1tCkNPTkZJR19TRU5TT1JT
X1NNU0M0N00xPW0KQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5Mj1tCkNPTkZJR19TRU5TT1JTX1NN
U0M0N0IzOTc9bQpDT05GSUdfU0VOU09SU19TQ0g1NjI3PW0KQ09ORklHX1NFTlNPUlNfQURTMTAx
NT1tCkNPTkZJR19TRU5TT1JTX0FEUzc4Mjg9bQpDT05GSUdfU0VOU09SU19BTUM2ODIxPW0KQ09O
RklHX1NFTlNPUlNfVEhNQzUwPW0KQ09ORklHX1NFTlNPUlNfVE1QMTAyPW0KQ09ORklHX1NFTlNP
UlNfVE1QNDAxPW0KQ09ORklHX1NFTlNPUlNfVE1QNDIxPW0KQ09ORklHX1NFTlNPUlNfVklBX0NQ
VVRFTVA9bQpDT05GSUdfU0VOU09SU19WSUE2ODZBPW0KQ09ORklHX1NFTlNPUlNfVlQxMjExPW0K
Q09ORklHX1NFTlNPUlNfVlQ4MjMxPW0KQ09ORklHX1NFTlNPUlNfVzgzNzgxRD1tCkNPTkZJR19T
RU5TT1JTX1c4Mzc5MUQ9bQpDT05GSUdfU0VOU09SU19XODM3OTJEPW0KQ09ORklHX1NFTlNPUlNf
VzgzNzkzPW0KQ09ORklHX1NFTlNPUlNfVzgzNzk1PW0KQ09ORklHX1NFTlNPUlNfVzgzNzk1X0ZB
TkNUUkw9eQpDT05GSUdfU0VOU09SU19XODNMNzg1VFM9bQpDT05GSUdfU0VOU09SU19XODNMNzg2
Tkc9bQpDT05GSUdfU0VOU09SU19XODM2MjdIRj1tCkNPTkZJR19TRU5TT1JTX1c4MzYyN0VIRj1t
CkNPTkZJR19TRU5TT1JTX0FQUExFU01DPW0KCiMKIyBBQ1BJIGRyaXZlcnMKIwpDT05GSUdfU0VO
U09SU19BQ1BJX1BPV0VSPW0KQ09ORklHX1NFTlNPUlNfQVRLMDExMD1tCkNPTkZJR19USEVSTUFM
PXkKQ09ORklHX1dBVENIRE9HPXkKQ09ORklHX1dBVENIRE9HX05PV0FZT1VUPXkKCiMKIyBXYXRj
aGRvZyBEZXZpY2UgRHJpdmVycwojCkNPTkZJR19TT0ZUX1dBVENIRE9HPW0KQ09ORklHX0FDUVVJ
UkVfV0RUPW0KQ09ORklHX0FEVkFOVEVDSF9XRFQ9bQpDT05GSUdfQUxJTTE1MzVfV0RUPW0KQ09O
RklHX0FMSU03MTAxX1dEVD1tCkNPTkZJR19GNzE4MDhFX1dEVD1tCkNPTkZJR19TUDUxMDBfVENP
PW0KQ09ORklHX1NDNTIwX1dEVD1tCkNPTkZJR19TQkNfRklUUEMyX1dBVENIRE9HPW0KQ09ORklH
X0VVUk9URUNIX1dEVD1tCkNPTkZJR19JQjcwMF9XRFQ9bQpDT05GSUdfSUJNQVNSPW0KQ09ORklH
X1dBRkVSX1dEVD1tCkNPTkZJR19JNjMwMEVTQl9XRFQ9bQpDT05GSUdfSVRDT19XRFQ9bQpDT05G
SUdfSVRDT19WRU5ET1JfU1VQUE9SVD15CkNPTkZJR19JVDg3MTJGX1dEVD1tCkNPTkZJR19JVDg3
X1dEVD1tCkNPTkZJR19IUF9XQVRDSERPRz1tCkNPTkZJR19IUFdEVF9OTUlfREVDT0RJTkc9eQpD
T05GSUdfU0MxMjAwX1dEVD1tCkNPTkZJR19QQzg3NDEzX1dEVD1tCkNPTkZJR19OVl9UQ089bQpD
T05GSUdfNjBYWF9XRFQ9bQpDT05GSUdfU0JDODM2MF9XRFQ9bQpDT05GSUdfU0JDNzI0MF9XRFQ9
bQpDT05GSUdfQ1BVNV9XRFQ9bQpDT05GSUdfU01TQ19TQ0gzMTFYX1dEVD1tCkNPTkZJR19TTVND
MzdCNzg3X1dEVD1tCkNPTkZJR19XODM2MjdIRl9XRFQ9bQpDT05GSUdfVzgzNjk3SEZfV0RUPW0K
Q09ORklHX1c4MzY5N1VHX1dEVD1tCkNPTkZJR19XODM4NzdGX1dEVD1tCkNPTkZJR19XODM5NzdG
X1dEVD1tCkNPTkZJR19NQUNIWl9XRFQ9bQpDT05GSUdfU0JDX0VQWF9DM19XQVRDSERPRz1tCiMg
Q09ORklHX1hFTl9XRFQgaXMgbm90IHNldAoKIwojIFBDSS1iYXNlZCBXYXRjaGRvZyBDYXJkcwoj
CkNPTkZJR19QQ0lQQ1dBVENIRE9HPW0KQ09ORklHX1dEVFBDST1tCgojCiMgVVNCLWJhc2VkIFdh
dGNoZG9nIENhcmRzCiMKQ09ORklHX1VTQlBDV0FUQ0hET0c9bQpDT05GSUdfU1NCX1BPU1NJQkxF
PXkKCiMKIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKIwpDT05GSUdfU1NCPW0KQ09ORklHX1NT
Ql9TUFJPTT15CkNPTkZJR19TU0JfUENJSE9TVF9QT1NTSUJMRT15CkNPTkZJR19TU0JfUENJSE9T
VD15CiMgQ09ORklHX1NTQl9CNDNfUENJX0JSSURHRSBpcyBub3Qgc2V0CiMgQ09ORklHX1NTQl9T
SUxFTlQgaXMgbm90IHNldAojIENPTkZJR19TU0JfREVCVUcgaXMgbm90IHNldApDT05GSUdfU1NC
X0RSSVZFUl9QQ0lDT1JFX1BPU1NJQkxFPXkKQ09ORklHX1NTQl9EUklWRVJfUENJQ09SRT15CkNP
TkZJR19CQ01BX1BPU1NJQkxFPXkKCiMKIyBCcm9hZGNvbSBzcGVjaWZpYyBBTUJBCiMKIyBDT05G
SUdfQkNNQSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9TVVBQT1JUIGlzIG5vdCBzZXQKIyBDT05G
SUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0
CgojCiMgR3JhcGhpY3Mgc3VwcG9ydAojCiMgQ09ORklHX0FHUCBpcyBub3Qgc2V0CkNPTkZJR19W
R0FfQVJCPXkKQ09ORklHX1ZHQV9BUkJfTUFYX0dQVVM9MTYKIyBDT05GSUdfVkdBX1NXSVRDSEVS
T08gaXMgbm90IHNldAojIENPTkZJR19EUk0gaXMgbm90IHNldAojIENPTkZJR19TVFVCX1BPVUxT
Qk8gaXMgbm90IHNldAojIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CiMgQ09ORklHX1ZJREVP
X09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKIyBDT05GSUdfRkIgaXMgbm90IHNldAojIENPTkZJ
R19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAoKIwojIERpc3BsYXkgZGV2aWNlIHN1
cHBvcnQKIwojIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAoKIwojIENvbnNvbGUg
ZGlzcGxheSBkcml2ZXIgc3VwcG9ydAojCkNPTkZJR19WR0FfQ09OU09MRT15CiMgQ09ORklHX1ZH
QUNPTl9TT0ZUX1NDUk9MTEJBQ0sgaXMgbm90IHNldApDT05GSUdfRFVNTVlfQ09OU09MRT15CiMg
Q09ORklHX1NPVU5EIGlzIG5vdCBzZXQKQ09ORklHX0hJRF9TVVBQT1JUPXkKQ09ORklHX0hJRD15
CiMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CgojCiMgVVNCIElucHV0IERldmljZXMKIwpDT05G
SUdfVVNCX0hJRD15CiMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAojIENPTkZJR19VU0JfSElE
REVWIGlzIG5vdCBzZXQKCiMKIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiMKQ09ORklHX0hJRF9BNFRF
Q0g9eQojIENPTkZJR19ISURfQUNSVVggaXMgbm90IHNldApDT05GSUdfSElEX0FQUExFPXkKQ09O
RklHX0hJRF9CRUxLSU49eQpDT05GSUdfSElEX0NIRVJSWT15CkNPTkZJR19ISURfQ0hJQ09OWT15
CkNPTkZJR19ISURfQ1lQUkVTUz15CiMgQ09ORklHX0hJRF9EUkFHT05SSVNFIGlzIG5vdCBzZXQK
IyBDT05GSUdfSElEX0VNU19GRiBpcyBub3Qgc2V0CkNPTkZJR19ISURfRVpLRVk9eQojIENPTkZJ
R19ISURfS0VZVE9VQ0ggaXMgbm90IHNldApDT05GSUdfSElEX0tZRT15CiMgQ09ORklHX0hJRF9V
Q0xPR0lDIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1dBTFRPUCBpcyBub3Qgc2V0CiMgQ09ORklH
X0hJRF9HWVJBVElPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9UV0lOSEFOIGlzIG5vdCBzZXQK
Q09ORklHX0hJRF9LRU5TSU5HVE9OPXkKIyBDT05GSUdfSElEX0xDUE9XRVIgaXMgbm90IHNldApD
T05GSUdfSElEX0xPR0lURUNIPXkKIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldAojIENP
TkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CiMgQ09ORklHX0xPR0lHOTQwX0ZGIGlz
IG5vdCBzZXQKIyBDT05GSUdfTE9HSVdJSV9GRiBpcyBub3Qgc2V0CkNPTkZJR19ISURfTUlDUk9T
T0ZUPXkKQ09ORklHX0hJRF9NT05URVJFWT15CiMgQ09ORklHX0hJRF9NVUxUSVRPVUNIIGlzIG5v
dCBzZXQKIyBDT05GSUdfSElEX05UUklHIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX09SVEVLIGlz
IG5vdCBzZXQKIyBDT05GSUdfSElEX1BBTlRIRVJMT1JEIGlzIG5vdCBzZXQKIyBDT05GSUdfSElE
X1BFVEFMWU5YIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1BJQ09MQ0QgaXMgbm90IHNldAojIENP
TkZJR19ISURfUVVBTlRBIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1JPQ0NBVCBpcyBub3Qgc2V0
CiMgQ09ORklHX0hJRF9ST0NDQVRfQVJWTyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9ST0NDQVRf
S09ORSBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9ST0NDQVRfS09ORVBMVVMgaXMgbm90IHNldAoj
IENPTkZJR19ISURfUk9DQ0FUX0tPVkFQTFVTIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1JPQ0NB
VF9QWVJBIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1NBTVNVTkcgaXMgbm90IHNldAojIENPTkZJ
R19ISURfU09OWSBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9TVU5QTFVTIGlzIG5vdCBzZXQKIyBD
T05GSUdfSElEX0dSRUVOQVNJQSBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9TTUFSVEpPWVBMVVMg
aXMgbm90IHNldAojIENPTkZJR19ISURfVE9QU0VFRCBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9U
SFJVU1RNQVNURVIgaXMgbm90IHNldAojIENPTkZJR19ISURfWkVST1BMVVMgaXMgbm90IHNldAoj
IENPTkZJR19ISURfWllEQUNST04gaXMgbm90IHNldApDT05GSUdfVVNCX1NVUFBPUlQ9eQpDT05G
SUdfVVNCX0FSQ0hfSEFTX0hDRD15CkNPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CkNPTkZJR19V
U0JfQVJDSF9IQVNfRUhDST15CkNPTkZJR19VU0I9eQojIENPTkZJR19VU0JfREVCVUcgaXMgbm90
IHNldAojIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAoKIwojIE1p
c2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKIwojIENPTkZJR19VU0JfREVWSUNFRlMgaXMgbm90IHNl
dAojIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0RZTkFN
SUNfTUlOT1JTIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX09UR19XSElURUxJU1QgaXMgbm90IHNl
dAojIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAojIENPTkZJR19VU0Jf
TU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1dVU0IgaXMgbm90IHNldAojIENPTkZJR19VU0Jf
V1VTQl9DQkFGIGlzIG5vdCBzZXQKCiMKIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKIwoj
IENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9YSENJX0hDRCBp
cyBub3Qgc2V0CkNPTkZJR19VU0JfRUhDSV9IQ0Q9bQpDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJf
VFQ9eQpDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQ9eQojIENPTkZJR19VU0JfT1hVMjEwSFBf
SENEIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9JU1AxMTZYX0hDRD1tCiMgQ09ORklHX1VTQl9JU1Ax
NzYwX0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9JU1AxMzYyX0hDRCBpcyBub3Qgc2V0CkNP
TkZJR19VU0JfT0hDSV9IQ0Q9bQojIENPTkZJR19VU0JfT0hDSV9IQ0RfU1NCIGlzIG5vdCBzZXQK
IyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTl9ERVNDIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC
X09IQ0lfQklHX0VORElBTl9NTUlPIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9PSENJX0xJVFRMRV9F
TkRJQU49eQpDT05GSUdfVVNCX1VIQ0lfSENEPW0KQ09ORklHX1VTQl9TTDgxMV9IQ0Q9bQojIENP
TkZJR19VU0JfU0w4MTFfSENEX0lTTyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9SOEE2NjU5N19I
Q0QgaXMgbm90IHNldAojIENPTkZJR19VU0JfV0hDSV9IQ0QgaXMgbm90IHNldAojIENPTkZJR19V
U0JfSFdBX0hDRCBpcyBub3Qgc2V0CgojCiMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCiMKIyBD
T05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQK
IyBDT05GSUdfVVNCX1dETSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9UTUMgaXMgbm90IHNldAoK
IwojIE5PVEU6IFVTQl9TVE9SQUdFIGRlcGVuZHMgb24gU0NTSSBidXQgQkxLX0RFVl9TRCBtYXkK
IwoKIwojIGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZv
CiMKQ09ORklHX1VTQl9TVE9SQUdFPW0KIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90
IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9SRUFMVEVLIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC
X1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00g
aXMgbm90IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9JU0QyMDAgaXMgbm90IHNldAojIENPTkZJ
R19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFIw
OSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CiMgQ09O
RklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JBR0Vf
QUxBVURBIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JBR0VfT05FVE9VQ0ggaXMgbm90IHNl
dAojIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9S
QUdFX0NZUFJFU1NfQVRBQ0IgaXMgbm90IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9FTkVfVUI2
MjUwIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1VBUyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9M
SUJVU1VBTCBpcyBub3Qgc2V0CgojCiMgVVNCIEltYWdpbmcgZGV2aWNlcwojCiMgQ09ORklHX1VT
Ql9NREM4MDAgaXMgbm90IHNldAojIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAoKIwoj
IFVTQiBwb3J0IGRyaXZlcnMKIwojIENPTkZJR19VU0JfVVNTNzIwIGlzIG5vdCBzZXQKIyBDT05G
SUdfVVNCX1NFUklBTCBpcyBub3Qgc2V0CgojCiMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycwoj
CiMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qg
c2V0CiMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAojIENPTkZJR19VU0JfU0VWU0VHIGlz
IG5vdCBzZXQKIyBDT05GSUdfVVNCX1JJTzUwMCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9MRUdP
VE9XRVIgaXMgbm90IHNldAojIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC
X0xFRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CiMg
Q09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90
IHNldAojIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0FQUExF
RElTUExBWSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAojIENP
TkZJR19VU0JfTEQgaXMgbm90IHNldAojIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90
IHNldAojIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1RFU1Qg
aXMgbm90IHNldAojIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAojIENPTkZJR19VU0Jf
WVVSRVggaXMgbm90IHNldAojIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKCiMKIyBPVEcg
YW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUKIwojIENPTkZJR19OT1BfVVNCX1hDRUlWIGlzIG5v
dCBzZXQKIyBDT05GSUdfVVdCIGlzIG5vdCBzZXQKIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKIyBD
T05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldApDT05GSUdfTkVXX0xFRFM9eQpDT05GSUdfTEVEU19D
TEFTUz15CgojCiMgTEVEIGRyaXZlcnMKIwojIENPTkZJR19MRURTX0xNMzUzMCBpcyBub3Qgc2V0
CiMgQ09ORklHX0xFRFNfQUxJWDIgaXMgbm90IHNldAojIENPTkZJR19MRURTX1BDQTk1MzIgaXMg
bm90IHNldAojIENPTkZJR19MRURTX0xQMzk0NCBpcyBub3Qgc2V0CiMgQ09ORklHX0xFRFNfTFA1
NTIxIGlzIG5vdCBzZXQKIyBDT05GSUdfTEVEU19MUDU1MjMgaXMgbm90IHNldAojIENPTkZJR19M
RURTX0NMRVZPX01BSUwgaXMgbm90IHNldAojIENPTkZJR19MRURTX1BDQTk1NVggaXMgbm90IHNl
dAojIENPTkZJR19MRURTX0JEMjgwMiBpcyBub3Qgc2V0CiMgQ09ORklHX0xFRFNfSU5URUxfU1M0
MjAwIGlzIG5vdCBzZXQKIyBDT05GSUdfTEVEU19UUklHR0VSUyBpcyBub3Qgc2V0CgojCiMgTEVE
IFRyaWdnZXJzCiMKIyBDT05GSUdfTkZDX0RFVklDRVMgaXMgbm90IHNldAojIENPTkZJR19BQ0NF
U1NJQklMSVRZIGlzIG5vdCBzZXQKQ09ORklHX0lORklOSUJBTkQ9bQojIENPTkZJR19JTkZJTklC
QU5EX1VTRVJfTUFEIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5GSU5JQkFORF9VU0VSX0FDQ0VTUyBp
cyBub3Qgc2V0CkNPTkZJR19JTkZJTklCQU5EX0FERFJfVFJBTlM9eQpDT05GSUdfSU5GSU5JQkFO
RF9NVEhDQT1tCkNPTkZJR19JTkZJTklCQU5EX01USENBX0RFQlVHPXkKIyBDT05GSUdfSU5GSU5J
QkFORF9BTVNPMTEwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0lORklOSUJBTkRfQ1hHQjMgaXMgbm90
IHNldAojIENPTkZJR19JTkZJTklCQU5EX0NYR0I0IGlzIG5vdCBzZXQKIyBDT05GSUdfTUxYNF9J
TkZJTklCQU5EIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5GSU5JQkFORF9ORVMgaXMgbm90IHNldApD
T05GSUdfSU5GSU5JQkFORF9JUE9JQj1tCiMgQ09ORklHX0lORklOSUJBTkRfSVBPSUJfQ00gaXMg
bm90IHNldApDT05GSUdfSU5GSU5JQkFORF9JUE9JQl9ERUJVRz15CiMgQ09ORklHX0lORklOSUJB
TkRfSVBPSUJfREVCVUdfREFUQSBpcyBub3Qgc2V0CkNPTkZJR19JTkZJTklCQU5EX1NSUD1tCkNP
TkZJR19JTkZJTklCQU5EX0lTRVI9bQojIENPTkZJR19FREFDIGlzIG5vdCBzZXQKIyBDT05GSUdf
UlRDX0NMQVNTIGlzIG5vdCBzZXQKQ09ORklHX0RNQURFVklDRVM9eQojIENPTkZJR19ETUFERVZJ
Q0VTX0RFQlVHIGlzIG5vdCBzZXQKCiMKIyBETUEgRGV2aWNlcwojCkNPTkZJR19JTlRFTF9NSURf
RE1BQz1tCkNPTkZJR19JTlRFTF9JT0FURE1BPW0KQ09ORklHX1RJTUJfRE1BPW0KQ09ORklHX1BD
SF9ETUE9bQpDT05GSUdfRE1BX0VOR0lORT15CgojCiMgRE1BIENsaWVudHMKIwpDT05GSUdfTkVU
X0RNQT15CkNPTkZJR19BU1lOQ19UWF9ETUE9eQpDT05GSUdfRE1BVEVTVD1tCkNPTkZJR19EQ0E9
bQojIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQK
CiMKIyBYZW4gZHJpdmVyIHN1cHBvcnQKIwpDT05GSUdfWEVOX0JBTExPT049eQpDT05GSUdfWEVO
X1NDUlVCX1BBR0VTPXkKQ09ORklHX1hFTl9ERVZfRVZUQ0hOPXkKQ09ORklHX1hFTl9CQUNLRU5E
PXkKQ09ORklHX1hFTkZTPW0KQ09ORklHX1hFTl9DT01QQVRfWEVORlM9eQpDT05GSUdfWEVOX1NZ
U19IWVBFUlZJU09SPXkKQ09ORklHX1hFTl9HTlRERVY9bQpDT05GSUdfWEVOX0dSQU5UX0RFVl9B
TExPQz1tCkNPTkZJR19YRU5fUExBVEZPUk1fUENJPW0KQ09ORklHX1NXSU9UTEJfWEVOPXkKIyBD
T05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiMgQ09ORklHX1g4Nl9QTEFURk9STV9ERVZJQ0VTIGlz
IG5vdCBzZXQKQ09ORklHX0NMS1NSQ19JODI1Mz15CgojCiMgRmlybXdhcmUgRHJpdmVycwojCiMg
Q09ORklHX0VERCBpcyBub3Qgc2V0CkNPTkZJR19GSVJNV0FSRV9NRU1NQVA9eQojIENPTkZJR19E
RUxMX1JCVSBpcyBub3Qgc2V0CiMgQ09ORklHX0RDREJBUyBpcyBub3Qgc2V0CkNPTkZJR19ETUlJ
RD15CiMgQ09ORklHX0RNSV9TWVNGUyBpcyBub3Qgc2V0CiMgQ09ORklHX0lTQ1NJX0lCRlRfRklO
RCBpcyBub3Qgc2V0CiMgQ09ORklHX1NJR01BIGlzIG5vdCBzZXQKIyBDT05GSUdfR09PR0xFX0ZJ
Uk1XQVJFIGlzIG5vdCBzZXQKCiMKIyBGaWxlIHN5c3RlbXMKIwpDT05GSUdfRVhUMl9GUz1tCiMg
Q09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAojIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBu
b3Qgc2V0CkNPTkZJR19FWFQzX0ZTPW0KQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRD15
CiMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldApDT05GSUdfRVhUNF9GUz1tCiMgQ09O
RklHX0VYVDRfRlNfWEFUVFIgaXMgbm90IHNldAojIENPTkZJR19FWFQ0X0RFQlVHIGlzIG5vdCBz
ZXQKQ09ORklHX0pCRD1tCkNPTkZJR19KQkQyPW0KIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90
IHNldAojIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAojIENPTkZJR19YRlNfRlMgaXMgbm90IHNl
dAojIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNl
dAojIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldApDT05GSUdfRlNfUE9TSVhfQUNMPXkKQ09O
RklHX0VYUE9SVEZTPW0KQ09ORklHX0ZJTEVfTE9DS0lORz15CkNPTkZJR19GU05PVElGWT15CkNP
TkZJR19ETk9USUZZPXkKQ09ORklHX0lOT1RJRllfVVNFUj15CiMgQ09ORklHX0ZBTk9USUZZIGlz
IG5vdCBzZXQKIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAojIENPTkZJR19RVU9UQUNUTCBpcyBu
b3Qgc2V0CkNPTkZJR19BVVRPRlM0X0ZTPXkKQ09ORklHX0ZVU0VfRlM9bQpDT05GSUdfQ1VTRT1t
CgojCiMgQ2FjaGVzCiMKIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CgojCiMgQ0QtUk9NL0RW
RCBGaWxlc3lzdGVtcwojCkNPTkZJR19JU085NjYwX0ZTPW0KQ09ORklHX0pPTElFVD15CkNPTkZJ
R19aSVNPRlM9eQpDT05GSUdfVURGX0ZTPW0KQ09ORklHX1VERl9OTFM9eQoKIwojIERPUy9GQVQv
TlQgRmlsZXN5c3RlbXMKIwojIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX1ZG
QVRfRlMgaXMgbm90IHNldAojIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKCiMKIyBQc2V1ZG8g
ZmlsZXN5c3RlbXMKIwpDT05GSUdfUFJPQ19GUz15CkNPTkZJR19QUk9DX0tDT1JFPXkKQ09ORklH
X1BST0NfU1lTQ1RMPXkKQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKQ09ORklHX1NZU0ZTPXkK
Q09ORklHX1RNUEZTPXkKIyBDT05GSUdfVE1QRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKIyBDT05G
SUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAojIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAoj
IENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAojIENPTkZJR19DT05GSUdGU19GUyBpcyBu
b3Qgc2V0CkNPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKIyBDT05GSUdfQURGU19GUyBpcyBub3Qg
c2V0CiMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAojIENPTkZJR19IRlNfRlMgaXMgbm90IHNl
dAojIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfQkVGU19GUyBpcyBub3Qg
c2V0CiMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0
CiMgQ09ORklHX0xPR0ZTIGlzIG5vdCBzZXQKQ09ORklHX0NSQU1GUz1tCiMgQ09ORklHX1NRVUFT
SEZTIGlzIG5vdCBzZXQKIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX01JTklY
X0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0hQRlNf
RlMgaXMgbm90IHNldAojIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAojIENPTkZJR19ST01G
U19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX1BTVE9SRSBpcyBub3Qgc2V0CiMgQ09ORklHX1NZU1Zf
RlMgaXMgbm90IHNldAojIENPTkZJR19VRlNfRlMgaXMgbm90IHNldApDT05GSUdfTkVUV09SS19G
SUxFU1lTVEVNUz15CkNPTkZJR19ORlNfRlM9bQpDT05GSUdfTkZTX1YzPXkKIyBDT05GSUdfTkZT
X1YzX0FDTCBpcyBub3Qgc2V0CiMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CkNPTkZJR19ORlNE
PW0KQ09ORklHX05GU0RfREVQUkVDQVRFRD15CkNPTkZJR19ORlNEX1YyX0FDTD15CkNPTkZJR19O
RlNEX1YzPXkKQ09ORklHX05GU0RfVjNfQUNMPXkKQ09ORklHX05GU0RfVjQ9eQpDT05GSUdfTE9D
S0Q9bQpDT05GSUdfTE9DS0RfVjQ9eQpDT05GSUdfTkZTX0FDTF9TVVBQT1JUPW0KQ09ORklHX05G
U19DT01NT049eQpDT05GSUdfU1VOUlBDPW0KQ09ORklHX1NVTlJQQ19HU1M9bQpDT05GSUdfU1VO
UlBDX1hQUlRfUkRNQT1tCiMgQ09ORklHX0NFUEhfRlMgaXMgbm90IHNldApDT05GSUdfQ0lGUz1t
CiMgQ09ORklHX0NJRlNfU1RBVFMgaXMgbm90IHNldAojIENPTkZJR19DSUZTX1dFQUtfUFdfSEFT
SCBpcyBub3Qgc2V0CkNPTkZJR19DSUZTX1hBVFRSPXkKQ09ORklHX0NJRlNfUE9TSVg9eQojIENP
TkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CiMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiMg
Q09ORklHX0NPREFfRlMgaXMgbm90IHNldAojIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAoKIwoj
IFBhcnRpdGlvbiBUeXBlcwojCiMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0
CkNPTkZJR19NU0RPU19QQVJUSVRJT049eQpDT05GSUdfTkxTPXkKQ09ORklHX05MU19ERUZBVUxU
PSJpc284ODU5LTEiCkNPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKIyBDT05GSUdfTkxTX0NPREVQ
QUdFXzczNyBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAoj
IENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdF
Xzg1MiBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAojIENP
TkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2
MCBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAojIENPTkZJ
R19OTFNfQ09ERVBBR0VfODYyIGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBp
cyBub3Qgc2V0CiMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAojIENPTkZJR19O
TFNfQ09ERVBBR0VfODY1IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBu
b3Qgc2V0CiMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAojIENPTkZJR19OTFNf
Q09ERVBBR0VfOTM2IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qg
c2V0CiMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09E
RVBBR0VfOTQ5IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0
CiMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0Vf
MTI1MCBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKIyBD
T05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKQ09ORklHX05MU19JU084ODU5XzE9eQojIENPTkZJ
R19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qg
c2V0CiMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAojIENPTkZJR19OTFNfSVNPODg1
OV81IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0CiMgQ09ORklH
X05MU19JU084ODU5XzcgaXMgbm90IHNldAojIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBz
ZXQKIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAojIENPTkZJR19OTFNfSVNPODg1
OV8xNCBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKIyBDT05G
SUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldApD
T05GSUdfTkxTX1VURjg9eQoKIwojIEtlcm5lbCBoYWNraW5nCiMKQ09ORklHX1RSQUNFX0lSUUZM
QUdTX1NVUFBPUlQ9eQpDT05GSUdfUFJJTlRLX1RJTUU9eQpDT05GSUdfREVGQVVMVF9NRVNTQUdF
X0xPR0xFVkVMPTQKQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQpDT05GSUdfRU5BQkxF
X01VU1RfQ0hFQ0s9eQpDT05GSUdfRlJBTUVfV0FSTj0xMDI0CkNPTkZJR19NQUdJQ19TWVNSUT15
CiMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIyBDT05GSUdfVU5VU0VEX1NZTUJP
TFMgaXMgbm90IHNldAojIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0hFQURF
UlNfQ0hFQ0sgaXMgbm90IHNldAojIENPTkZJR19ERUJVR19TRUNUSU9OX01JU01BVENIIGlzIG5v
dCBzZXQKIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKIyBDT05GSUdfSEFSRExPQ0tV
UF9ERVRFQ1RPUiBpcyBub3Qgc2V0CiMgQ09ORklHX1NQQVJTRV9SQ1VfUE9JTlRFUiBpcyBub3Qg
c2V0CkNPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkK
Q09ORklHX0FSQ0hfV0FOVF9GUkFNRV9QT0lOVEVSUz15CkNPTkZJR19GUkFNRV9QT0lOVEVSPXkK
Q09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD02MAojIENPTkZJR19TWVNDVExfU1lTQ0FMTF9D
SEVDSyBpcyBub3Qgc2V0CkNPTkZJR19VU0VSX1NUQUNLVFJBQ0VfU1VQUE9SVD15CkNPTkZJR19I
QVZFX0ZVTkNUSU9OX1RSQUNFUj15CkNPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15
CkNPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1Q9eQpDT05GSUdfSEFWRV9GVU5DVElP
Tl9UUkFDRV9NQ09VTlRfVEVTVD15CkNPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKQ09ORklH
X0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQpDT05GSUdfSEFWRV9TWVNDQUxMX1RSQUNFUE9J
TlRTPXkKQ09ORklHX0hBVkVfQ19SRUNPUkRNQ09VTlQ9eQpDT05GSUdfVFJBQ0lOR19TVVBQT1JU
PXkKIyBDT05GSUdfRlRSQUNFIGlzIG5vdCBzZXQKIyBDT05GSUdfUFJPVklERV9PSENJMTM5NF9E
TUFfSU5JVCBpcyBub3Qgc2V0CiMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAojIENP
TkZJR19BVE9NSUM2NF9TRUxGVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX0FTWU5DX1JBSUQ2X1RF
U1QgaXMgbm90IHNldAojIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfQVJD
SF9LR0RCPXkKQ09ORklHX0hBVkVfQVJDSF9LTUVNQ0hFQ0s9eQojIENPTkZJR19URVNUX0tTVFJU
T1ggaXMgbm90IHNldAojIENPTkZJR19TVFJJQ1RfREVWTUVNIGlzIG5vdCBzZXQKQ09ORklHX1g4
Nl9WRVJCT1NFX0JPT1RVUD15CkNPTkZJR19FQVJMWV9QUklOVEs9eQojIENPTkZJR19FQVJMWV9Q
UklOVEtfREJHUCBpcyBub3Qgc2V0CiMgQ09ORklHX0RFQlVHX1NFVF9NT0RVTEVfUk9OWCBpcyBu
b3Qgc2V0CkNPTkZJR19ET1VCTEVGQVVMVD15CiMgQ09ORklHX0lPTU1VX1NUUkVTUyBpcyBub3Qg
c2V0CkNPTkZJR19IQVZFX01NSU9UUkFDRV9TVVBQT1JUPXkKQ09ORklHX0lPX0RFTEFZX1RZUEVf
MFg4MD0wCkNPTkZJR19JT19ERUxBWV9UWVBFXzBYRUQ9MQpDT05GSUdfSU9fREVMQVlfVFlQRV9V
REVMQVk9MgpDT05GSUdfSU9fREVMQVlfVFlQRV9OT05FPTMKQ09ORklHX0lPX0RFTEFZXzBYODA9
eQojIENPTkZJR19JT19ERUxBWV8wWEVEIGlzIG5vdCBzZXQKIyBDT05GSUdfSU9fREVMQVlfVURF
TEFZIGlzIG5vdCBzZXQKIyBDT05GSUdfSU9fREVMQVlfTk9ORSBpcyBub3Qgc2V0CkNPTkZJR19E
RUZBVUxUX0lPX0RFTEFZX1RZUEU9MAojIENPTkZJR19PUFRJTUlaRV9JTkxJTklORyBpcyBub3Qg
c2V0CgojCiMgU2VjdXJpdHkgb3B0aW9ucwojCiMgQ09ORklHX0tFWVMgaXMgbm90IHNldAojIENP
TkZJR19TRUNVUklUWV9ETUVTR19SRVNUUklDVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFQ1VSSVRZ
IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CkNPTkZJR19ERUZBVUxU
X1NFQ1VSSVRZX0RBQz15CkNPTkZJR19ERUZBVUxUX1NFQ1VSSVRZPSIiCkNPTkZJR19YT1JfQkxP
Q0tTPW0KQ09ORklHX0FTWU5DX0NPUkU9bQpDT05GSUdfQVNZTkNfTUVNQ1BZPW0KQ09ORklHX0FT
WU5DX1hPUj1tCkNPTkZJR19BU1lOQ19QUT1tCkNPTkZJR19BU1lOQ19SQUlENl9SRUNPVj1tCkNP
TkZJR19BU1lOQ19UWF9ESVNBQkxFX1BRX1ZBTF9ETUE9eQpDT05GSUdfQVNZTkNfVFhfRElTQUJM
RV9YT1JfVkFMX0RNQT15CkNPTkZJR19DUllQVE89eQoKIwojIENyeXB0byBjb3JlIG9yIGhlbHBl
cgojCkNPTkZJR19DUllQVE9fQUxHQVBJPXkKQ09ORklHX0NSWVBUT19BTEdBUEkyPXkKQ09ORklH
X0NSWVBUT19BRUFEPW0KQ09ORklHX0NSWVBUT19BRUFEMj15CkNPTkZJR19DUllQVE9fQkxLQ0lQ
SEVSPW0KQ09ORklHX0NSWVBUT19CTEtDSVBIRVIyPXkKQ09ORklHX0NSWVBUT19IQVNIPXkKQ09O
RklHX0NSWVBUT19IQVNIMj15CkNPTkZJR19DUllQVE9fUk5HPW0KQ09ORklHX0NSWVBUT19STkcy
PXkKQ09ORklHX0NSWVBUT19QQ09NUDI9eQpDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQpDT05GSUdf
Q1JZUFRPX01BTkFHRVIyPXkKQ09ORklHX0NSWVBUT19NQU5BR0VSX0RJU0FCTEVfVEVTVFM9eQoj
IENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fTlVMTCBp
cyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19QQ1JZUFQgaXMgbm90IHNldApDT05GSUdfQ1JZUFRP
X1dPUktRVUVVRT15CiMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldApDT05GSUdfQ1JZ
UFRPX0FVVEhFTkM9bQojIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CgojCiMgQXV0aGVu
dGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBEYXRhCiMKIyBDT05GSUdfQ1JZUFRP
X0NDTSBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19HQ00gaXMgbm90IHNldAojIENPTkZJR19D
UllQVE9fU0VRSVYgaXMgbm90IHNldAoKIwojIEJsb2NrIG1vZGVzCiMKQ09ORklHX0NSWVBUT19D
QkM9bQojIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0NUUyBp
cyBub3Qgc2V0CkNPTkZJR19DUllQVE9fRUNCPW0KIyBDT05GSUdfQ1JZUFRPX0xSVyBpcyBub3Qg
c2V0CiMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1hUUyBp
cyBub3Qgc2V0CgojCiMgSGFzaCBtb2RlcwojCkNPTkZJR19DUllQVE9fSE1BQz15CiMgQ09ORklH
X0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1ZNQUMgaXMgbm90IHNldAoK
IwojIERpZ2VzdAojCkNPTkZJR19DUllQVE9fQ1JDMzJDPXkKIyBDT05GSUdfQ1JZUFRPX0NSQzMy
Q19JTlRFTCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19HSEFTSCBpcyBub3Qgc2V0CkNPTkZJ
R19DUllQVE9fTUQ0PW0KQ09ORklHX0NSWVBUT19NRDU9eQojIENPTkZJR19DUllQVE9fTUlDSEFF
TF9NSUMgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKIyBDT05G
SUdfQ1JZUFRPX1JNRDE2MCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19STUQyNTYgaXMgbm90
IHNldAojIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKQ09ORklHX0NSWVBUT19TSEEx
PW0KIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19TSEE1
MTIgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKIyBDT05GSUdf
Q1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKCiMKIyBDaXBoZXJzCiMKQ09ORklHX0NSWVBUT19BRVM9
bQojIENPTkZJR19DUllQVE9fQUVTXzU4NiBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19BRVNf
TklfSU5URUwgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKQ09O
RklHX0NSWVBUT19BUkM0PW0KIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKIyBD
T05GSUdfQ1JZUFRPX0NBTUVMTElBIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlz
IG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0NBU1Q2IGlzIG5vdCBzZXQKQ09ORklHX0NSWVBUT19E
RVM9bQojIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0tI
QVpBRCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19TQUxTQTIwIGlzIG5vdCBzZXQKIyBDT05G
SUdfQ1JZUFRPX1NBTFNBMjBfNTg2IGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1NFRUQgaXMg
bm90IHNldAojIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBU
T19URUEgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CiMgQ09O
RklHX0NSWVBUT19UV09GSVNIXzU4NiBpcyBub3Qgc2V0CgojCiMgQ29tcHJlc3Npb24KIwpDT05G
SUdfQ1JZUFRPX0RFRkxBVEU9bQojIENPTkZJR19DUllQVE9fWkxJQiBpcyBub3Qgc2V0CiMgQ09O
RklHX0NSWVBUT19MWk8gaXMgbm90IHNldAoKIwojIFJhbmRvbSBOdW1iZXIgR2VuZXJhdGlvbgoj
CkNPTkZJR19DUllQVE9fQU5TSV9DUFJORz1tCiMgQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNI
IGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSIGlzIG5vdCBzZXQK
Q09ORklHX0NSWVBUT19IVz15CiMgQ09ORklHX0NSWVBUT19ERVZfUEFETE9DSyBpcyBub3Qgc2V0
CiMgQ09ORklHX0NSWVBUT19ERVZfR0VPREUgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fREVW
X0hJRk5fNzk1WCBpcyBub3Qgc2V0CkNPTkZJR19IQVZFX0tWTT15CiMgQ09ORklHX1ZJUlRVQUxJ
WkFUSU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CgojCiMg
TGlicmFyeSByb3V0aW5lcwojCkNPTkZJR19SQUlENl9QUT1tCkNPTkZJR19CSVRSRVZFUlNFPXkK
Q09ORklHX0dFTkVSSUNfRklORF9GSVJTVF9CSVQ9eQpDT05GSUdfQ1JDX0NDSVRUPW0KQ09ORklH
X0NSQzE2PW0KIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CkNPTkZJR19DUkNfSVRVX1Q9
bQpDT05GSUdfQ1JDMzI9eQojIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKQ09ORklHX0xJQkNSQzMy
Qz15CkNPTkZJR19aTElCX0lORkxBVEU9eQpDT05GSUdfWkxJQl9ERUZMQVRFPW0KQ09ORklHX1ha
X0RFQz15CkNPTkZJR19YWl9ERUNfWDg2PXkKQ09ORklHX1haX0RFQ19QT1dFUlBDPXkKQ09ORklH
X1haX0RFQ19JQTY0PXkKQ09ORklHX1haX0RFQ19BUk09eQpDT05GSUdfWFpfREVDX0FSTVRIVU1C
PXkKQ09ORklHX1haX0RFQ19TUEFSQz15CkNPTkZJR19YWl9ERUNfQkNKPXkKIyBDT05GSUdfWFpf
REVDX1RFU1QgaXMgbm90IHNldApDT05GSUdfREVDT01QUkVTU19HWklQPXkKQ09ORklHX0RFQ09N
UFJFU1NfQlpJUDI9eQpDT05GSUdfVEVYVFNFQVJDSD15CkNPTkZJR19URVhUU0VBUkNIX0tNUD1t
CkNPTkZJR19URVhUU0VBUkNIX0JNPW0KQ09ORklHX1RFWFRTRUFSQ0hfRlNNPW0KQ09ORklHX0hB
U19JT01FTT15CkNPTkZJR19IQVNfSU9QT1JUPXkKQ09ORklHX0hBU19ETUE9eQpDT05GSUdfQ0hF
Q0tfU0lHTkFUVVJFPXkKQ09ORklHX0NQVV9STUFQPXkKQ09ORklHX05MQVRUUj15CiMgQ09ORklH
X0FWRVJBR0UgaXMgbm90IHNldAo=

--_005_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_
Content-Type: application/octet-stream; name="messages"
Content-Description: messages
Content-Disposition: attachment; filename="messages"; size=45246;
	creation-date="Fri, 09 Dec 2011 20:00:35 GMT";
	modification-date="Fri, 09 Dec 2011 19:59:15 GMT"
Content-Transfer-Encoding: base64

RGVjICAxIDA0OjAyOjAxIEdyaWRvc19Ob2RlIHN5c2xvZ2QgMS40LjE6IHJlc3RhcnQuCkRlYyAg
MSAwNDowMjowMSBHcmlkb3NfTm9kZSBsb2dyb3RhdGU6IEFMRVJUIGV4aXRlZCBhYm5vcm1hbGx5
IHdpdGggWzFdCkRlYyAgMSAxNTo0NDowNSBHcmlkb3NfTm9kZSBzaHV0ZG93blsyMjkyNV06IHNo
dXR0aW5nIGRvd24gZm9yIHN5c3RlbSByZWJvb3QKRGVjICAxIDE1OjQ0OjA1IEdyaWRvc19Ob2Rl
IGluaXQ6IFN3aXRjaGluZyB0byBydW5sZXZlbDogNgpEZWMgIDEgMTU6NDQ6MDYgR3JpZG9zX05v
ZGUgc21hcnRkWzIwNjJdOiBzbWFydGQgcmVjZWl2ZWQgc2lnbmFsIDE1OiBUZXJtaW5hdGVkIApE
ZWMgIDEgMTU6NDQ6MDYgR3JpZG9zX05vZGUgc21hcnRkWzIwNjJdOiBzbWFydGQgaXMgZXhpdGlu
ZyAoZXhpdCBzdGF0dXMgMCkgCkRlYyAgMSAxNTo0NDowNyBHcmlkb3NfTm9kZSBrZXJuZWw6IEtl
cm5lbCBsb2dnaW5nIChwcm9jKSBzdG9wcGVkLgpEZWMgIDEgMTU6NDQ6MDcgR3JpZG9zX05vZGUg
a2VybmVsOiBLZXJuZWwgbG9nIGRhZW1vbiB0ZXJtaW5hdGluZy4KRGVjICAxIDE1OjQ0OjA4IEdy
aWRvc19Ob2RlIGV4aXRpbmcgb24gc2lnbmFsIDE1CkRlYyAgMSAxNTo1NToxNyBHcmlkb3NfTm9k
ZSBzeXNsb2dkIDEuNC4xOiByZXN0YXJ0LgpEZWMgIDEgMTU6NTU6MTcgR3JpZG9zX05vZGUga2Vy
bmVsOiBrbG9nZCAxLjQuMSwgbG9nIHNvdXJjZSA9IC9wcm9jL2ttc2cgc3RhcnRlZC4KRGVjICAx
IDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gUmVzZXJ2aW5nIHZp
cnR1YWwgYWRkcmVzcyBzcGFjZSBhYm92ZSAweGZmODAwMDAwCkRlYyAgMSAxNTo1NToxNyBHcmlk
b3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIExpbnV4IHZlcnNpb24gMy4wLjQtMzMueGVu
MCAocm9vdEBudC1kZXYtQ2VudDU1LTMyKSAoZ2NjIHZlcnNpb24gNC4xLjIgMjAwODA3MDQgKFJl
ZCBIYXQgNC4xLjItNDgpKSAjMSBTTVAgTW9uIE5vdiAyMSAxODo0Njo1MCBFU1QgMjAxMQpEZWMg
IDEgMTU6NTU6MTcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSByZWxlYXNlZCAw
IHBhZ2VzIG9mIHVudXNlZCBtZW1vcnkKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICAwLjAwMDAwMF0gU2V0IDI2MjMwNCBwYWdlKHMpIHRvIDEtMSBtYXBwaW5nLgpEZWMg
IDEgMTU6NTU6MTcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBCSU9TLXByb3Zp
ZGVkIHBoeXNpY2FsIFJBTSBtYXA6CkRlYyAgMSAxNTo1NToxNyBHcmlkb3NfTm9kZSBrZXJuZWw6
IFsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDAwMGEwMDAw
ICh1c2FibGUpCkRlYyAgMSAxNTo1NToxNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAw
MDBdICBYZW46IDAwMDAwMDAwMDAwYTAwMDAgLSAwMDAwMDAwMDAwMTAwMDAwIChyZXNlcnZlZCkK
RGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gIFhlbjog
MDAwMDAwMDAwMDEwMDAwMCAtIDAwMDAwMDAwMjAwMDAwMDAgKHVzYWJsZSkKRGVjICAxIDE1OjU1
OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDAyMDAw
MDAwMCAtIDAwMDAwMDAwYmZmYzAwMDAgKHVudXNhYmxlKQpEZWMgIDEgMTU6NTU6MTcgR3JpZG9z
X05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAwMDAwMGJmZmMwMDAwIC0gMDAw
MDAwMDBiZmZjZmMwMCAoQUNQSSBkYXRhKQpEZWMgIDEgMTU6NTU6MTcgR3JpZG9zX05vZGUga2Vy
bmVsOiBbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAwMDAwMGJmZmNmYzAwIC0gMDAwMDAwMDBiZmZm
ZjAwMCAocmVzZXJ2ZWQpCkRlYyAgMSAxNTo1NToxNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAg
MC4wMDAwMDBdICBYZW46IDAwMDAwMDAwZTAwMDAwMDAgLSAwMDAwMDAwMGZlYzkwMDAwIChyZXNl
cnZlZCkKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0g
IFhlbjogMDAwMDAwMDBmZWQwMDAwMCAtIDAwMDAwMDAwZmVkMDA0MDAgKHJlc2VydmVkKQpEZWMg
IDEgMTU6NTU6MTcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAw
MDAwMGZlZTAwMDAwIC0gMDAwMDAwMDBmZWUxMDAwMCAocmVzZXJ2ZWQpCkRlYyAgMSAxNTo1NTox
NyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwZmZiMDAw
MDAgLSAwMDAwMDAwMTAwMDAwMDAwIChyZXNlcnZlZCkKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19O
b2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDEwMDAwMDAwMCAtIDAwMDAw
MDAxZGZmYzAwMDAgKHVzYWJsZSkKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDog
WyAgICAwLjAwMDAwMF0gTlggKEV4ZWN1dGUgRGlzYWJsZSkgcHJvdGVjdGlvbjogYWN0aXZlCkRl
YyAgMSAxNTo1NToxNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIERNSSAyLjMg
cHJlc2VudC4KRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAw
MF0gbGFzdF9wZm4gPSAweDFkZmZjMCBtYXhfYXJjaF9wZm4gPSAweDEwMDAwMDAKRGVjICAxIDE1
OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gZm91bmQgU01QIE1QLXRh
YmxlIGF0IFtjMDBmZTcxMF0gZmU3MTAKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICAwLjAwMDAwMF0gaW5pdF9tZW1vcnlfbWFwcGluZzogMDAwMDAwMDAwMDAwMDAwMC0w
MDAwMDAwMDM3M2ZlMDAwCkRlYyAgMSAxNTo1NToxNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAg
MC4wMDAwMDBdIFJBTURJU0s6IDAxNjY3MDAwIC0gMDFhMWUwMDAKRGVjICAxIDE1OjU1OjE3IEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQUNQSTogUlNEUCAwMDBmZDViMCAwMDAx
NCAodjAwIERFTEwgICkKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAw
LjAwMDAwMF0gQUNQSTogUlNEVCAwMDBmZDVjNCAwMDAzOCAodjAxIERFTEwgICBQRSBCS0MgICAw
MDAwMDAwMSBNU0ZUIDAxMDAwMDBBKQpEZWMgIDEgMTU6NTU6MTcgR3JpZG9zX05vZGUga2VybmVs
OiBbICAgIDAuMDAwMDAwXSBBQ1BJOiBGQUNQIDAwMGZkNjIwIDAwMDc0ICh2MDEgREVMTCAgIFBF
IEJLQyAgIDAwMDAwMDAxIE1TRlQgMDEwMDAwMEEpCkRlYyAgMSAxNTo1NToxNyBHcmlkb3NfTm9k
ZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEFDUEk6IERTRFQgYmZmYzAwMDAgMDNDQ0QgKHYwMSBE
RUxMICAgUEUgQktDICAgMDAwMDAwMDEgTVNGVCAwMTAwMDAwRSkKRGVjICAxIDE1OjU1OjE3IEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUyBiZmZjZmMwMCAwMDA0
MApEZWMgIDEgMTU6NTU6MTcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBBQ1BJ
OiBBUElDIDAwMGZkNjk0IDAwMEQ0ICh2MDEgREVMTCAgIFBFIEJLQyAgIDAwMDAwMDAxIE1TRlQg
MDEwMDAwMEEpCkRlYyAgMSAxNTo1NToxNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAw
MDBdIEFDUEk6IFNQQ1IgMDAwZmQ3NzQgMDAwNTAgKHYwMSBERUxMICAgUEUgQktDICAgMDAwMDAw
MDEgTVNGVCAwMTAwMDAwQSkKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAg
ICAwLjAwMDAwMF0gQUNQSTogSFBFVCAwMDBmZDdjNCAwMDAzOCAodjAxIERFTEwgICBQRSBCS0Mg
ICAwMDAwMDAwMSBNU0ZUIDAxMDAwMDBBKQpEZWMgIDEgMTU6NTU6MTcgR3JpZG9zX05vZGUga2Vy
bmVsOiBbICAgIDAuMDAwMDAwXSBBQ1BJOiBNQ0ZHIDAwMGZkN2ZjIDAwMDNDICh2MDEgREVMTCAg
IFBFIEJLQyAgIDAwMDAwMDAxIE1TRlQgMDEwMDAwMEEpCkRlYyAgMSAxNTo1NToxNyBHcmlkb3Nf
Tm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIDY3OTVNQiBISUdITUVNIGF2YWlsYWJsZS4KRGVj
ICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gODgzTUIgTE9X
TUVNIGF2YWlsYWJsZS4KRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAw
LjAwMDAwMF0gICBtYXBwZWQgbG93IHJhbTogMCAtIDM3M2ZlMDAwCkRlYyAgMSAxNTo1NToxNyBH
cmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdICAgbG93IHJhbTogMCAtIDM3M2ZlMDAw
CkRlYyAgMSAxNTo1NToxNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIFpvbmUg
UEZOIHJhbmdlczoKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAw
MDAwMF0gICBETUEgICAgICAweDAwMDAwMDEwIC0+IDB4MDAwMDEwMDAKRGVjICAxIDE1OjU1OjE3
IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gICBOb3JtYWwgICAweDAwMDAxMDAw
IC0+IDB4MDAwMzczZmUKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAw
LjAwMDAwMF0gICBIaWdoTWVtICAweDAwMDM3M2ZlIC0+IDB4MDAxZGZmYzAKRGVjICAxIDE1OjU1
OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gTW92YWJsZSB6b25lIHN0YXJ0
IFBGTiBmb3IgZWFjaCBub2RlCkRlYyAgMSAxNTo1NToxNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgMC4wMDAwMDBdIGVhcmx5X25vZGVfbWFwWzNdIGFjdGl2ZSBQRk4gcmFuZ2VzCkRlYyAgMSAx
NTo1NToxNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdICAgICAwOiAweDAwMDAw
MDEwIC0+IDB4MDAwMDAwYTAKRGVjICAxIDE1OjU1OjE3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAg
ICAwLjAwMDAwMF0gICAgIDA6IDB4MDAwMDAxMDAgLT4gMHgwMDAyMDAwMApEZWMgIDEgMTU6NTU6
MTcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSAgICAgMDogMHgwMDEwMDAwMCAt
PiAweDAwMWRmZmMwCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4w
MDAwMDBdIFVzaW5nIEFQSUMgZHJpdmVyIGRlZmF1bHQKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19O
b2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQUNQSTogUE0tVGltZXIgSU8gUG9ydDogMHg4MDgK
RGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQUNQSTog
TEFQSUMgKGFjcGlfaWRbMHgwMV0gbGFwaWNfaWRbMHgwMF0gZW5hYmxlZCkKRGVjICAxIDE1OjU1
OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQklPUyBidWc6IEFQSUMgdmVy
c2lvbiBpcyAwIGZvciBDUFUgMC8weDAsIGZpeGluZyB1cCB0byAweDEwCkRlYyAgMSAxNTo1NTox
OCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lk
WzB4MDJdIGxhcGljX2lkWzB4MDZdIGVuYWJsZWQpCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9k
ZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDNdIGxhcGlj
X2lkWzB4MDFdIGVuYWJsZWQpCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDRdIGxhcGljX2lkWzB4MDddIGVu
YWJsZWQpCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBd
IEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDVdIGxhcGljX2lkWzB4MDJdIGRpc2FibGVkKQpEZWMg
IDEgMTU6NTU6MTggR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJ
QyAoYWNwaV9pZFsweDA2XSBsYXBpY19pZFsweDA0XSBkaXNhYmxlZCkKRGVjICAxIDE1OjU1OjE4
IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRb
MHgwN10gbGFwaWNfaWRbMHgwM10gZGlzYWJsZWQpCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9k
ZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDhdIGxhcGlj
X2lkWzB4MDVdIGRpc2FibGVkKQpEZWMgIDEgMTU6NTU6MTggR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgwMV0gaGlnaCBlZGdlIGxp
bnRbMHgxXSkKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAw
MF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MDJdIGhpZ2ggZWRnZSBsaW50WzB4MV0pCkRl
YyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEFDUEk6IExB
UElDX05NSSAoYWNwaV9pZFsweDAzXSBoaWdoIGVkZ2UgbGludFsweDFdKQpEZWMgIDEgMTU6NTU6
MTggR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFj
cGlfaWRbMHgwNF0gaGlnaCBlZGdlIGxpbnRbMHgxXSkKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19O
b2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MDVd
IGhpZ2ggZWRnZSBsaW50WzB4MV0pCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6
IFsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAoYWNwaV9pZFsweDA2XSBoaWdoIGVkZ2Ug
bGludFsweDFdKQpEZWMgIDEgMTU6NTU6MTggR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAw
MDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgwN10gaGlnaCBlZGdlIGxpbnRbMHgxXSkK
RGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQUNQSTog
TEFQSUNfTk1JIChhY3BpX2lkWzB4MDhdIGhpZ2ggZWRnZSBsaW50WzB4MV0pCkRlYyAgMSAxNTo1
NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEFDUEk6IElPQVBJQyAoaWRb
MHgwOF0gYWRkcmVzc1sweGZlYzAwMDAwXSBnc2lfYmFzZVswXSkKRGVjICAxIDE1OjU1OjE4IEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gSU9BUElDWzBdOiBhcGljX2lkIDgsIHZl
cnNpb24gMjU1LCBhZGRyZXNzIDB4ZmVjMDAwMDAsIEdTSSAwLTI1NQpEZWMgIDEgMTU6NTU6MTgg
R3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBBQ1BJOiBJT0FQSUMgKGlkWzB4MDld
IGFkZHJlc3NbMHhmZWM4MDAwMF0gZ3NpX2Jhc2VbMzJdKQpEZWMgIDEgMTU6NTU6MTggR3JpZG9z
X05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBJT0FQSUNbMV06IGFwaWNfaWQgOSwgdmVyc2lv
biAyNTUsIGFkZHJlc3MgMHhmZWM4MDAwMCwgR1NJIDMyLTI4NwpEZWMgIDEgMTU6NTU6MTggR3Jp
ZG9zX05vZGUgYWlzZXhlYzogW01BSU4gXSBBSVMgRXhlY3V0aXZlIFNlcnZpY2UgUkVMRUFTRSAn
c3VicmV2IDExNTIgdmVyc2lvbiAwLjgwJyAKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtl
cm5lbDogWyAgICAwLjAwMDAwMF0gQUNQSTogSU9BUElDIChpZFsweDBhXSBhZGRyZXNzWzB4ZmVj
ODMwMDBdIGdzaV9iYXNlWzY0XSkKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGFpc2V4ZWM6
IFtNQUlOIF0gQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5j
IGFuZCBjb250cmlidXRvcnMuIApEZWMgIDEgMTU6NTU6MTggR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuMDAwMDAwXSBJT0FQSUNbMl06IGFwaWNfaWQgMTAsIHZlcnNpb24gMjU1LCBhZGRyZXNz
IDB4ZmVjODMwMDAsIEdTSSA2NC0zMTkKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGFpc2V4
ZWM6IFtNQUlOIF0gQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4gCkRlYyAgMSAxNTo1
NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEFDUEk6IElOVF9TUkNfT1ZS
IChidXMgMCBidXNfaXJxIDAgZ2xvYmFsX2lycSAyIGRmbCBkZmwpCkRlYyAgMSAxNTo1NToxOCBH
cmlkb3NfTm9kZSBhaXNleGVjOiBbTUFJTiBdIEFJUyBFeGVjdXRpdmUgU2VydmljZTogc3RhcnRl
ZCBhbmQgcmVhZHkgdG8gcHJvdmlkZSBzZXJ2aWNlLiAKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19O
b2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19p
cnEgOSBnbG9iYWxfaXJxIDkgaGlnaCBsZXZlbCkKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2Rl
IGFpc2V4ZWM6IFtNQUlOIF0gcGFyc2UgZXJyb3IgaW4gY29uZmlnOiBObyBtdWx0aWNhc3QgcG9y
dCBzcGVjaWZpZWQgCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBhaXNleGVjOiBbTUFJTiBd
IEFJUyBFeGVjdXRpdmUgZXhpdGluZyAocmVhc29uOiBjb3VsZCBub3QgcmVhZCB0aGUgbWFpbiBj
b25maWd1cmF0aW9uIGZpbGUpLiAKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDog
WyAgICAwLjAwMDAwMF0gVXNpbmcgQUNQSSAoTUFEVCkgZm9yIFNNUCBjb25maWd1cmF0aW9uIGlu
Zm9ybWF0aW9uCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAw
MDBdIFNNUDogQWxsb3dpbmcgOCBDUFVzLCA0IGhvdHBsdWcgQ1BVcwpEZWMgIDEgMTU6NTU6MTgg
R3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBBbGxvY2F0aW5nIFBDSSByZXNvdXJj
ZXMgc3RhcnRpbmcgYXQgYmZmZmYwMDAgKGdhcDogYmZmZmYwMDA6MjAwMDEwMDApCkRlYyAgMSAx
NTo1NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEJvb3RpbmcgcGFyYXZp
cnR1YWxpemVkIGtlcm5lbCBvbiBYZW4KRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICAwLjAwMDAwMF0gWGVuIHZlcnNpb246IDQuMS4xIChwcmVzZXJ2ZS1BRCkKRGVjICAx
IDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gc2V0dXBfcGVyY3B1
OiBOUl9DUFVTOjggbnJfY3B1bWFza19iaXRzOjggbnJfY3B1X2lkczo4IG5yX25vZGVfaWRzOjEK
RGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gUEVSQ1BV
OiBFbWJlZGRlZCAxMiBwYWdlcy9jcHUgQGRjMzhkMDAwIHMyNjYyNCByMCBkMjI1MjggdTQ5MTUy
CkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEJ1aWx0
IDEgem9uZWxpc3RzIGluIFpvbmUgb3JkZXIsIG1vYmlsaXR5IGdyb3VwaW5nIG9uLiAgVG90YWwg
cGFnZXM6IDEwMzMwNDAKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAw
LjAwMDAwMF0gS2VybmVsIGNvbW1hbmQgbGluZTogbm91c2Igcm9vdD1MQUJFTD0vbW50L2FwbGJv
b3QxIHNlbGludXg9MCAgbWF4X2xvb3A9MjU2IGlvbW11PW9mZgpEZWMgIDEgMTU6NTU6MTggR3Jp
ZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBQSUQgaGFzaCB0YWJsZSBlbnRyaWVzOiAy
MDQ4IChvcmRlcjogMSwgODE5MiBieXRlcykKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtl
cm5lbDogWyAgICAwLjAwMDAwMF0gRGVudHJ5IGNhY2hlIGhhc2ggdGFibGUgZW50cmllczogNjU1
MzYgKG9yZGVyOiA2LCAyNjIxNDQgYnl0ZXMpCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBr
ZXJuZWw6IFsgICAgMC4wMDAwMDBdIElub2RlLWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogMzI3
NjggKG9yZGVyOiA1LCAxMzEwNzIgYnl0ZXMpCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBr
ZXJuZWw6IFsgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBDUFUjMApEZWMgIDEgMTU6NTU6MTgg
R3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBQbGFjaW5nIDY0TUIgc29mdHdhcmUg
SU8gVExCIGJldHdlZW4gZDgzMmNmMDAgLSBkYzMyY2YwMApEZWMgIDEgMTU6NTU6MTggR3JpZG9z
X05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBzb2Z0d2FyZSBJTyBUTEIgYXQgcGh5cyAweDE4
MzJjZjAwIC0gMHgxYzMyY2YwMApEZWMgIDEgMTU6NTU6MTggR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuMDAwMDAwXSBJbml0aWFsaXppbmcgSGlnaE1lbSBmb3Igbm9kZSAwICgwMDAzNzNmZTow
MDFkZmZjMCkKRGVjICAxIDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAw
MF0gTWVtb3J5OiAzODUzOTZrLzc4NjQwNjRrIGF2YWlsYWJsZSAoMjM4M2sga2VybmVsIGNvZGUs
IDEzODQ0NGsgcmVzZXJ2ZWQsIDk2MmsgZGF0YSwgMzg0ayBpbml0LCAwayBoaWdobWVtKQpEZWMg
IDEgMTU6NTU6MTggR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSB2aXJ0dWFsIGtl
cm5lbCBtZW1vcnkgbGF5b3V0OgpEZWMgIDEgMTU6NTU6MTggR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuMDAwMDAwXSAgICAgZml4bWFwICA6IDB4ZmY3MTYwMDAgLSAweGZmN2ZmMDAwICAgKCA5
MzIga0IpCkRlYyAgMSAxNTo1NToxOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBd
ICAgICBwa21hcCAgIDogMHhmZjQwMDAwMCAtIDB4ZmY2MDAwMDAgICAoMjA0OCBrQikKRGVjICAx
IDE1OjU1OjE4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gICAgIHZtYWxsb2Mg
OiAweGY3YmZlMDAwIC0gMHhmZjNmZTAwMCAgICggMTIwIE1CKQpEZWMgIDEgMTU6NTU6MTkgR3Jp
ZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSAgICAgbG93bWVtICA6IDB4YzAwMDAwMDAg
LSAweGY3M2ZlMDAwICAgKCA4ODMgTUIpCkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJu
ZWw6IFsgICAgMC4wMDAwMDBdICAgICAgIC5pbml0IDogMHhjMTM0NTAwMCAtIDB4YzEzYTUwMDAg
ICAoIDM4NCBrQikKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAw
MDAwMF0gICAgICAgLmRhdGEgOiAweGMxMjUzZGE1IC0gMHhjMTM0NDkwMCAgICggOTYyIGtCKQpE
ZWMgIDEgMTU6NTU6MTkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSAgICAgICAu
dGV4dCA6IDB4YzEwMDAwMDAgLSAweGMxMjUzZGE1ICAgKDIzODMga0IpCkRlYyAgMSAxNTo1NTox
OSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMDAwMDBdIEhpZXJhcmNoaWNhbCBSQ1UgaW1w
bGVtZW50YXRpb24uCkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4w
MDAwMDBdIE5SX0lSUVM6NTEyCkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgMC4wMDAwMDBdIHhlbjogc2NpIG92ZXJyaWRlOiBnbG9iYWxfaXJxPTkgdHJpZ2dlcj0wIHBv
bGFyaXR5PTAKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAw
MF0geGVuOiBhY3BpIHNjaSA5CkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgMC4wMDAwMDBdIHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmluZyBpcnEgOSBmb3IgZ3NpIDkK
RGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0gQ29uc29s
ZTogY29sb3VyIFZHQSsgODB4MjUKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDog
WyAgICAwLjAwMDAwMF0gY29uc29sZSBbdHR5MF0gZW5hYmxlZApEZWMgIDEgMTU6NTU6MTkgR3Jp
ZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDAwMDAwXSBpbnN0YWxsaW5nIFhlbiB0aW1lciBmb3Ig
Q1BVIDAKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAwMDAwMF0g
RGV0ZWN0ZWQgMjk5Mi44MzYgTUh6IHByb2Nlc3Nvci4KRGVjICAxIDE1OjU1OjE5IEdyaWRvc19O
b2RlIGtlcm5lbDogWyAgICAwLjAxMDAwMF0gQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcCAoc2tpcHBl
ZCksIHZhbHVlIGNhbGN1bGF0ZWQgdXNpbmcgdGltZXIgZnJlcXVlbmN5Li4gNTk4NS42NyBCb2dv
TUlQUyAobHBqPTI5OTI4MzYwKQpEZWMgIDEgMTU6NTU6MTkgR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuMDEwMDAwXSBwaWRfbWF4OiBkZWZhdWx0OiAzMjc2OCBtaW5pbXVtOiAzMDEKRGVjICAx
IDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAxMDAwMF0gLS0tLS0tLS0tLS0t
WyBjdXQgaGVyZSBdLS0tLS0tLS0tLS0tCkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJu
ZWw6IFsgICAgMC4wMTAwMDBdIFdBUk5JTkc6IGF0IGFyY2gveDg2L3hlbi9tbXUuYzo0OTIgeGVu
X21ha2VfcHRlX2RlYnVnKzB4MTQ1LzB4MTg4KCkKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2Rl
IGtlcm5lbDogWyAgICAwLjAxMDAwMF0gSGFyZHdhcmUgbmFtZTogUG93ZXJFZGdlIDE4NTAKRGVj
ICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAxMDAwMF0gMHgxN2MyYzAw
MCBpcyBtaXNzaW5nIFZNX0lPIChhbmQgd2Fzbid0IGZpeGVkKSEKRGVjICAxIDE1OjU1OjE5IEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAxMDAwMF0gTW9kdWxlcyBsaW5rZWQgaW46CkRlYyAg
MSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdIFBpZDogMCwgY29t
bTogc3dhcHBlciBOb3QgdGFpbnRlZCAzLjAuNC0zMy54ZW4wICMxCkRlYyAgMSAxNTo1NToxOSBH
cmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdIENhbGwgVHJhY2U6CkRlYyAgMSAxNTo1
NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdICBbPGMxMDA1NGU4Pl0gPyB4
ZW5fbWFrZV9wdGVfZGVidWcrMHgxNDUvMHgxODgKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2Rl
IGtlcm5lbDogWyAgICAwLjAxMDAwMF0gIFs8YzEwMzQwMzA+XSB3YXJuX3Nsb3dwYXRoX2NvbW1v
bisweDc2LzB4OGIKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAx
MDAwMF0gIFs8YzEwMDU0ZTg+XSA/IHhlbl9tYWtlX3B0ZV9kZWJ1ZysweDE0NS8weDE4OApEZWMg
IDEgMTU6NTU6MTkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDEwMDAwXSAgWzxjMTAzNDBj
MT5dIHdhcm5fc2xvd3BhdGhfZm10KzB4MmUvMHgzMApEZWMgIDEgMTU6NTU6MTkgR3JpZG9zX05v
ZGUga2VybmVsOiBbICAgIDAuMDEwMDAwXSAgWzxjMTAwNTRlOD5dIHhlbl9tYWtlX3B0ZV9kZWJ1
ZysweDE0NS8weDE4OApEZWMgIDEgMTU6NTU6MTkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAu
MDEwMDAwXSAgWzxjMTAwMzY2ZT5dIF9fcmF3X2NhbGxlZV9zYXZlX3hlbl9tYWtlX3B0ZV9kZWJ1
ZysweDYvMHg4CkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAw
MDBdICBbPGMxMDIzMmQxPl0gPyBfX2NoYW5nZV9wYWdlX2F0dHJfc2V0X2NscisweDlmNC8weGMy
ZQpEZWMgIDEgMTU6NTU6MTkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDEwMDAwXSAgWzxj
MTAwNTk3Zj5dID8geGVuX2ZvcmNlX2V2dGNobl9jYWxsYmFjaysweGYvMHgxNApEZWMgIDEgMTU6
NTU6MTkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDEwMDAwXSAgWzxjMTAwNTk3Zj5dID8g
eGVuX2ZvcmNlX2V2dGNobl9jYWxsYmFjaysweGYvMHgxNApEZWMgIDEgMTU6NTU6MTkgR3JpZG9z
X05vZGUga2VybmVsOiBbICAgIDAuMDEwMDAwXSAgWzxjMTAwNjBhMD5dID8gY2hlY2tfZXZlbnRz
KzB4OC8weGMKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAxMDAw
MF0gIFs8YzEwMDYwOTc+XSA/IHhlbl9yZXN0b3JlX2ZsX2RpcmVjdF9yZWxvYysweDQvMHg0CkRl
YyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdICBbPGMxMDA0
MzRjPl0gPyB4ZW5fZmx1c2hfdGxiKzB4NWYvMHg2YwpEZWMgIDEgMTU6NTU6MTkgR3JpZG9zX05v
ZGUga2VybmVsOiBbICAgIDAuMDEwMDAwXSAgWzxjMTAyMzViNz5dID8ga2VybmVsX21hcF9wYWdl
cysweGFjLzB4MTA0CkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4w
MTAwMDBdICBbPGMxMDcxNDhkPl0gPyBnZXRfcGFnZV9mcm9tX2ZyZWVsaXN0KzB4MjU1LzB4Mzlj
CkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdICBbPGMx
MDkyODJhPl0gPyBjaGVja19wb2lzb25fb2JqKzB4MjIvMHgxYWQKRGVjICAxIDE1OjU1OjE5IEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAxMDAwMF0gIFs8YzEwNzE3OWU+XSA/IF9fYWxsb2Nf
cGFnZXNfbm9kZW1hc2srMHhkOS8weDU2MQpEZWMgIDEgMTU6NTU6MTkgR3JpZG9zX05vZGUga2Vy
bmVsOiBbICAgIDAuMDEwMDAwXSAgWzxjMTA5MmI5ZD5dID8gcG9pc29uX29iaisweDMyLzB4M2YK
RGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAxMDAwMF0gIFs8YzEw
OTI1NDM+XSA/IGRiZ19yZWR6b25lMSsweDExLzB4MWQKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19O
b2RlIGtlcm5lbDogWyAgICAwLjAxMDAwMF0gIFs8YzEwMjM1Zjc+XSBrZXJuZWxfbWFwX3BhZ2Vz
KzB4ZWMvMHgxMDQKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAx
MDAwMF0gIFs8YzEwOTNmYTM+XSBjYWNoZV9hbGxvY19yZWZpbGwrMHg2Y2QvMHg2ZDIKRGVjICAx
IDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAxMDAwMF0gIFs8YzEwOTQyYzg+
XSBrbWVtX2NhY2hlX2FsbG9jKzB4YzMvMHhjNwpEZWMgIDEgMTU6NTU6MTkgR3JpZG9zX05vZGUg
a2VybmVsOiBbICAgIDAuMDEwMDAwXSAgWzxjMTM1YjRiNT5dID8gcGlkbWFwX2luaXQrMHg3My8w
eGFkCkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdICBb
PGMxMzViNGI1Pl0gcGlkbWFwX2luaXQrMHg3My8weGFkCkRlYyAgMSAxNTo1NToxOSBHcmlkb3Nf
Tm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdICBbPGMxMzQ1ODFlPl0gc3RhcnRfa2VybmVsKzB4
MjJmLzB4MzExCkRlYyAgMSAxNTo1NToxOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAw
MDBdICBbPGMxMzQ1MjE3Pl0gPyBwYXJzZV9lYXJseV9vcHRpb25zKzB4MjUvMHgyNQpEZWMgIDEg
MTU6NTU6MTkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDEwMDAwXSAgWzxjMTM0NTA4OT5d
IGkzODZfc3RhcnRfa2VybmVsKzB4NzgvMHhiZgpEZWMgIDEgMTU6NTU6MTkgR3JpZG9zX05vZGUg
a2VybmVsOiBbICAgIDAuMDEwMDAwXSAgWzxjMTM0N2I4MD5dIHhlbl9zdGFydF9rZXJuZWwrMHgz
ZTgvMHg0ZGQKRGVjICAxIDE1OjU1OjE5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAxMDAw
MF0gLS0tWyBlbmQgdHJhY2UgNGVhYTJhODZhOGUyZGEyMiBdLS0tCkRlYyAgMSAxNTo1NToyMCBH
cmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdIE1vdW50LWNhY2hlIGhhc2ggdGFibGUg
ZW50cmllczogNTEyCkRlYyAgMSAxNTo1NToyMCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4w
MTAwMDBdIENQVTogUGh5c2ljYWwgUHJvY2Vzc29yIElEOiAwCkRlYyAgMSAxNTo1NToyMCBHcmlk
b3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdIENQVTogUHJvY2Vzc29yIENvcmUgSUQ6IDAK
RGVjICAxIDE1OjU1OjIwIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAxMDAwMF0gQUNQSTog
Q29yZSByZXZpc2lvbiAyMDExMDQxMwpEZWMgIDEgMTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVs
OiBbICAgIDAuMDI0NzUzXSBQZXJmb3JtYW5jZSBFdmVudHM6IHVuc3VwcG9ydGVkIE5ldGJ1cnN0
IENQVSBtb2RlbCA0IG5vIFBNVSBkcml2ZXIsIHNvZnR3YXJlIGV2ZW50cyBvbmx5LgpEZWMgIDEg
MTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDI4MTMzXSBpbnN0YWxsaW5nIFhl
biB0aW1lciBmb3IgQ1BVIDEKRGVjICAxIDE1OjU1OjIwIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAg
ICAwLjAxMDAwMF0gSW5pdGlhbGl6aW5nIENQVSMxCkRlYyAgMSAxNTo1NToyMCBHcmlkb3NfTm9k
ZSBrZXJuZWw6IFsgICAgMC4wMzA1MjhdIGluc3RhbGxpbmcgWGVuIHRpbWVyIGZvciBDUFUgMgpE
ZWMgIDEgMTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDEwMDAwXSBJbml0aWFs
aXppbmcgQ1BVIzIKRGVjICAxIDE1OjU1OjIwIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjAz
Mjk1OF0gaW5zdGFsbGluZyBYZW4gdGltZXIgZm9yIENQVSAzCkRlYyAgMSAxNTo1NToyMCBHcmlk
b3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wMTAwMDBdIEluaXRpYWxpemluZyBDUFUjMwpEZWMgIDEg
MTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDMzMjgxXSBCcm91Z2h0IHVwIDQg
Q1BVcwpEZWMgIDEgMTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDM5NTU5XSBH
cmFudCB0YWJsZSBpbml0aWFsaXplZApEZWMgIDEgMTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVs
OiBbICAgIDAuMDQwMDEzXSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDE2CkRlYyAg
MSAxNTo1NToyMCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4wNDE0NDNdIEFDUEk6IGJ1cyB0
eXBlIHBjaSByZWdpc3RlcmVkCkRlYyAgMSAxNTo1NToyMCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgMC4wNDE5NDhdIFBDSTogTU1DT05GSUcgZm9yIGRvbWFpbiAwMDAwIFtidXMgMDAtZmZdIGF0
IFttZW0gMHhlMDAwMDAwMC0weGVmZmZmZmZmXSAoYmFzZSAweGUwMDAwMDAwKQpEZWMgIDEgMTU6
NTU6MjAgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDQyMDYwXSBQQ0k6IEludGVsIENvcnBv
cmF0aW9uIEU3NTIwIE1lbW9yeSBDb250cm9sbGVyIEh1YiB3aXRoIE1NQ09ORklHIHN1cHBvcnQK
RGVjICAxIDE1OjU1OjIwIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjA0MjE4NV0gUENJOiBN
TUNPTkZJRyBhdCBbbWVtIDB4ZTAwMDAwMDAtMHhlZmZmZmZmZl0gcmVzZXJ2ZWQgaW4gRTgyMApE
ZWMgIDEgMTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDQyMjc4XSBQQ0k6IFVz
aW5nIE1NQ09ORklHIGZvciBleHRlbmRlZCBjb25maWcgc3BhY2UKRGVjICAxIDE1OjU1OjIwIEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjA0MjM3MF0gUENJOiBVc2luZyBjb25maWd1cmF0aW9u
IHR5cGUgMSBmb3IgYmFzZSBhY2Nlc3MKRGVjICAxIDE1OjU1OjIwIEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICAwLjA0OTI3Nl0gYmlvOiBjcmVhdGUgc2xhYiA8YmlvLTA+IGF0IDAKRGVjICAxIDE1
OjU1OjIwIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjA3ODczMl0gQUNQSTogSW50ZXJwcmV0
ZXIgZW5hYmxlZApEZWMgIDEgMTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMDc4
ODI0XSBBQ1BJOiAoc3VwcG9ydHMgUzAgUzUpCkRlYyAgMSAxNTo1NToyMCBHcmlkb3NfTm9kZSBr
ZXJuZWw6IFsgICAgMC4wNzkxMDBdIEFDUEk6IFVzaW5nIElPQVBJQyBmb3IgaW50ZXJydXB0IHJv
dXRpbmcKRGVjICAxIDE1OjU1OjIwIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjEwNTA3NV0g
UENJOiBJZ25vcmluZyBob3N0IGJyaWRnZSB3aW5kb3dzIGZyb20gQUNQSTsgaWYgbmVjZXNzYXJ5
LCB1c2UgInBjaT11c2VfY3JzIiBhbmQgcmVwb3J0IGEgYnVnCkRlYyAgMSAxNTo1NToyMCBHcmlk
b3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xMDY4NDFdIEFDUEk6IFBDSSBSb290IEJyaWRnZSBbUENJ
MF0gKGRvbWFpbiAwMDAwIFtidXMgMDAtZmZdKQpEZWMgIDEgMTU6NTU6MjAgR3JpZG9zX05vZGUg
a2VybmVsOiBbICAgIDAuMTE0NDA1XSBwY2kgMDAwMDowMTowMC4wOiBkaXNhYmxpbmcgQVNQTSBv
biBwcmUtMS4xIFBDSWUgZGV2aWNlLiAgWW91IGNhbiBlbmFibGUgaXQgd2l0aCAncGNpZV9hc3Bt
PWZvcmNlJwpEZWMgIDEgMTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTE0NTQ4
XSBwY2kgMDAwMDowMDowMi4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDEtMDNdCkRlYyAgMSAxNTo1
NToyMCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xMTUzMTBdIHBjaSAwMDAwOjAxOjAwLjA6
IFBDSSBicmlkZ2UgdG8gW2J1cyAwMi0wMl0KRGVjICAxIDE1OjU1OjIwIEdyaWRvc19Ob2RlIGtl
cm5lbDogWyAgICAwLjExNTcwOF0gcGNpIDAwMDA6MDE6MDAuMjogUENJIGJyaWRnZSB0byBbYnVz
IDAzLTAzXQpEZWMgIDEgMTU6NTU6MjAgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTE2MDI3
XSBwY2kgMDAwMDowMDowNC4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDQtMDRdCkRlYyAgMSAxNTo1
NToyMCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xMTY0MzNdIHBjaSAwMDAwOjA1OjAwLjA6
IFBYSCBxdWlyayBkZXRlY3RlZDsgU0hQQyBkZXZpY2UgTVNJIGRpc2FibGVkCkRlYyAgMSAxNTo1
NToyMCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xMTY4ODldIHBjaSAwMDAwOjA1OjAwLjI6
IFBYSCBxdWlyayBkZXRlY3RlZDsgU0hQQyBkZXZpY2UgTVNJIGRpc2FibGVkCkRlYyAgMSAxNTo1
NToyMCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xMTcyMzddIHBjaSAwMDAwOjA1OjAwLjA6
IGRpc2FibGluZyBBU1BNIG9uIHByZS0xLjEgUENJZSBkZXZpY2UuICBZb3UgY2FuIGVuYWJsZSBp
dCB3aXRoICdwY2llX2FzcG09Zm9yY2UnCkRlYyAgMSAxNTo1NToyMCBHcmlkb3NfTm9kZSBrZXJu
ZWw6IFsgICAgMC4xMTczNzhdIHBjaSAwMDAwOjAwOjA1LjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAw
NS0wN10KRGVjICAxIDE1OjU1OjIwIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjExODEzM10g
cGNpIDAwMDA6MDU6MDAuMDogUENJIGJyaWRnZSB0byBbYnVzIDA2LTA2XQpEZWMgIDEgMTU6NTU6
MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTE4OTAxXSBwY2kgMDAwMDowNTowMC4yOiBQ
Q0kgYnJpZGdlIHRvIFtidXMgMDctMDddCkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJu
ZWw6IFsgICAgMC4xMTkyMjBdIHBjaSAwMDAwOjAwOjA2LjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAw
OC0wOF0KRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjEyMTEyOF0g
cGNpIDAwMDA6MDA6MWUuMDogUENJIGJyaWRnZSB0byBbYnVzIDA5LTA5XSAoc3VidHJhY3RpdmUg
ZGVjb2RlKQpEZWMgIDEgMTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTI3Nzc0
XSAgcGNpMDAwMDowMDogUmVxdWVzdGluZyBBQ1BJIF9PU0MgY29udHJvbCAoMHgxZCkKRGVjICAx
IDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjEyOTY4OV0gIHBjaTAwMDA6MDA6
IEFDUEkgX09TQyByZXF1ZXN0IGZhaWxlZCAoQUVfTk9UX0ZPVU5EKSwgcmV0dXJuZWQgY29udHJv
bCBtYXNrOiAweDFkCkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4x
Mjk3OTldIEFDUEkgX09TQyBjb250cm9sIGZvciBQQ0llIG5vdCBncmFudGVkLCBkaXNhYmxpbmcg
QVNQTQpEZWMgIDEgMTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTQ0ODIyXSBB
Q1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xOS0FdIChJUlFzIDMgNCA1IDYgNyAxMCAqMTEgMTIp
CkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xNDU5MTZdIEFDUEk6
IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5LQl0gKElSUXMgKjMgNCA1IDYgNyAxMCAxMSAxMikKRGVj
ICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjE0NzAwNV0gQUNQSTogUENJ
IEludGVycnVwdCBMaW5rIFtMTktDXSAoSVJRcyAzIDQgNSA2ICo3IDEwIDExIDEyKQpEZWMgIDEg
MTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTQ4MDk1XSBBQ1BJOiBQQ0kgSW50
ZXJydXB0IExpbmsgW0xOS0RdIChJUlFzIDMgNCA1IDYgNyAqMTAgMTEgMTIpCkRlYyAgMSAxNTo1
NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xNDkxOThdIEFDUEk6IFBDSSBJbnRlcnJ1
cHQgTGluayBbTE5LRV0gKElSUXMgMyA0IDUgNiA3IDEwICoxMSAxMikKRGVjICAxIDE1OjU1OjIx
IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjE1MDI0Nl0gQUNQSTogUENJIEludGVycnVwdCBM
aW5rIFtMTktGXSAoSVJRcyAzIDQgNSA2IDcgKjEwIDExIDEyKQpEZWMgIDEgMTU6NTU6MjEgR3Jp
ZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTUxMzMwXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsg
W0xOS0ddIChJUlFzIDMgNCA1IDYgNyAxMCAxMSAxMikgKjAsIGRpc2FibGVkLgpEZWMgIDEgMTU6
NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTUyNTg2XSBBQ1BJOiBQQ0kgSW50ZXJy
dXB0IExpbmsgW0xOS0hdIChJUlFzIDMgNCAqNSA2IDcgMTAgMTEgMTIpCkRlYyAgMSAxNTo1NToy
MSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xNTM2MDZdIHhlbi9iYWxsb29uOiBJbml0aWFs
aXNpbmcgYmFsbG9vbiBkcml2ZXIuCkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6
IFsgICAgMC4xNTM3MDFdIGxhc3RfcGZuID0gMHgxZGZmYzAgbWF4X2FyY2hfcGZuID0gMHgxMDAw
MDAwCkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xNzM0NTBdIHhl
bi1iYWxsb29uOiBJbml0aWFsaXNpbmcgYmFsbG9vbiBkcml2ZXIuCkRlYyAgMSAxNTo1NToyMSBH
cmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xNzQwMzVdIHZnYWFyYjogZGV2aWNlIGFkZGVkOiBQ
Q0k6MDAwMDowOTowZC4wLGRlY29kZXM9aW8rbWVtLG93bnM9aW8rbWVtLGxvY2tzPW5vbmUKRGVj
ICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjE3NDE0OV0gdmdhYXJiOiBs
b2FkZWQKRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjE3NDIzN10g
dmdhYXJiOiBicmlkZ2UgY29udHJvbCBwb3NzaWJsZSAwMDAwOjA5OjBkLjAKRGVjICAxIDE1OjU1
OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjE3NDMzMF0gdXNiY29yZTogVVNCIHN1cHBv
cnQgZGlzYWJsZWQKRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjE3
NTEwMV0gUENJOiBVc2luZyBBQ1BJIGZvciBJUlEgcm91dGluZwpEZWMgIDEgMTU6NTU6MjEgR3Jp
ZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTgwODY5XSBTd2l0Y2hpbmcgdG8gY2xvY2tzb3VyY2Ug
eGVuCkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xODA5NzBdIHBu
cDogUG5QIEFDUEkgaW5pdApEZWMgIDEgMTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAg
IDAuMTgwOTcwXSBBQ1BJOiBidXMgdHlwZSBwbnAgcmVnaXN0ZXJlZApEZWMgIDEgMTU6NTU6MjEg
R3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTgzNTU0XSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1
cm5pbmcgaXJxIDEzIGZvciBnc2kgMTMKRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICAwLjE4NDI0MF0geGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSA4IGZvciBn
c2kgOApEZWMgIDEgMTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTg1Njc2XSB4
ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJxIDYgZm9yIGdzaSA2CkRlYyAgMSAxNTo1NToy
MSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xODcxMDZdIHhlbl9tYXBfcGlycV9nc2k6IHJl
dHVybmluZyBpcnEgMSBmb3IgZ3NpIDEKRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICAwLjE4OTEyMV0geGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSAxMiBmb3Ig
Z3NpIDEyCkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xOTAxOTRd
IHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmluZyBpcnEgNCBmb3IgZ3NpIDQKRGVjICAxIDE1OjU1
OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjE5Mjk3Ml0gc3lzdGVtIDAwOjA5OiBbaW8g
IDB4MDgwMC0weDA4N2ZdIGhhcyBiZWVuIHJlc2VydmVkCkRlYyAgMSAxNTo1NToyMSBHcmlkb3Nf
Tm9kZSBrZXJuZWw6IFsgICAgMC4xOTI5NzRdIHN5c3RlbSAwMDowOTogW2lvICAweDA4ODAtMHgw
OGJmXSBoYXMgYmVlbiByZXNlcnZlZApEZWMgIDEgMTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVs
OiBbICAgIDAuMTkyOTc0XSBzeXN0ZW0gMDA6MDk6IFtpbyAgMHgwOGMwLTB4MDhkZl0gaGFzIGJl
ZW4gcmVzZXJ2ZWQKRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjE5
Mjk3NF0gc3lzdGVtIDAwOjA5OiBbaW8gIDB4MDhlMC0weDA4ZTNdIGhhcyBiZWVuIHJlc2VydmVk
CkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xOTI5NzRdIHN5c3Rl
bSAwMDowOTogW2lvICAweDBjMDAtMHgwYzBmXSBoYXMgYmVlbiByZXNlcnZlZApEZWMgIDEgMTU6
NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMTkyOTc0XSBzeXN0ZW0gMDA6MDk6IFtp
byAgMHgwYzEwLTB4MGMxZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKRGVjICAxIDE1OjU1OjIxIEdyaWRv
c19Ob2RlIGtlcm5lbDogWyAgICAwLjE5Mjk3NF0gc3lzdGVtIDAwOjA5OiBbaW8gIDB4MGNhMC0w
eDBjYTddIGhhcyBiZWVuIHJlc2VydmVkCkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJu
ZWw6IFsgICAgMC4xOTI5NzRdIHN5c3RlbSAwMDowOTogW2lvICAweDBjYTktMHgwY2FiXSBoYXMg
YmVlbiByZXNlcnZlZApEZWMgIDEgMTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAu
MTkyOTc0XSBzeXN0ZW0gMDA6MDk6IFtpbyAgMHgwY2FkLTB4MGNhZl0gaGFzIGJlZW4gcmVzZXJ2
ZWQKRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjE5Mjk3NF0gc3lz
dGVtIDAwOjA5OiBbaW8gIDB4MGMyMC0weDBjM2ZdIGhhcyBiZWVuIHJlc2VydmVkCkRlYyAgMSAx
NTo1NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xOTI5NzRdIHN5c3RlbSAwMDowYjog
W21lbSAweGUwMDAwMDAwLTB4ZWZmZmZmZmZdIGhhcyBiZWVuIHJlc2VydmVkCkRlYyAgMSAxNTo1
NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4xOTI5NzRdIHBucDogUG5QIEFDUEk6IGZv
dW5kIDEzIGRldmljZXMKRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAw
LjE5Mjk3NF0gQUNQSTogQUNQSSBidXMgdHlwZSBwbnAgdW5yZWdpc3RlcmVkCkRlYyAgMSAxNTo1
NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMTY5MzJdIFBNLVRpbWVyIGZhaWxlZCBj
b25zaXN0ZW5jeSBjaGVjayAgKDB4MHhmZmZmZmYpIC0gYWJvcnRpbmcuCkRlYyAgMSAxNTo1NToy
MSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMTcwODNdIHBjaSAwMDAwOjA5OjA2LjA6IGFk
ZHJlc3Mgc3BhY2UgY29sbGlzaW9uOiBbbWVtIDB4ZGY2MDAwMDAtMHhkZjY3ZmZmZiBwcmVmXSBj
b25mbGljdHMgd2l0aCAwMDAwOjA5OjA1LjAgW21lbSAweGRmNjAwMDAwLTB4ZGY2MGZmZmYgcHJl
Zl0KRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIxNzQwMl0gcGNp
IDAwMDA6MDA6MWYuMTogQkFSIDU6IGFzc2lnbmVkIFttZW0gMHhiZmZmZjAwMC0weGJmZmZmM2Zm
XQpEZWMgIDEgMTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjE3NTA3XSBwY2kg
MDAwMDowMDoxZi4xOiBCQVIgNTogc2V0IHRvIFttZW0gMHhiZmZmZjAwMC0weGJmZmZmM2ZmXSAo
UENJIGFkZHJlc3MgWzB4YmZmZmYwMDAtMHhiZmZmZjNmZl0pCkRlYyAgMSAxNTo1NToyMSBHcmlk
b3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMTc2MjNdIHBjaSAwMDAwOjAxOjAwLjA6IFBDSSBicmlk
Z2UgdG8gW2J1cyAwMi0wMl0KRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAg
ICAwLjIxNzcyMF0gcGNpIDAwMDA6MDE6MDAuMDogICBicmlkZ2Ugd2luZG93IFtpbyAgMHhlMDAw
LTB4ZWZmZl0KRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIxNzgy
NV0gcGNpIDAwMDA6MDE6MDAuMDogICBicmlkZ2Ugd2luZG93IFttZW0gMHhkZmQwMDAwMC0weGRm
ZWZmZmZmXQpEZWMgIDEgMTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjE3OTI3
XSBwY2kgMDAwMDowMTowMC4wOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGQ4MDAwMDAwLTB4ZDhm
ZmZmZmYgNjRiaXQgcHJlZl0KRGVjICAxIDE1OjU1OjIxIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAg
ICAwLjIxODA1Ml0gcGNpIDAwMDA6MDE6MDAuMjogUENJIGJyaWRnZSB0byBbYnVzIDAzLTAzXQpE
ZWMgIDEgMTU6NTU6MjEgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjE4MTQ0XSBwY2kgMDAw
MDowMTowMC4yOiAgIGJyaWRnZSB3aW5kb3cgW2lvICBkaXNhYmxlZF0KRGVjICAxIDE1OjU1OjIx
IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIxODI0N10gcGNpIDAwMDA6MDE6MDAuMjogICBi
cmlkZ2Ugd2luZG93IFttZW0gZGlzYWJsZWRdCkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBr
ZXJuZWw6IFsgICAgMC4yMTgzNDddIHBjaSAwMDAwOjAxOjAwLjI6ICAgYnJpZGdlIHdpbmRvdyBb
bWVtIHByZWYgZGlzYWJsZWRdCkRlYyAgMSAxNTo1NToyMSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgMC4yMTg0NTRdIHBjaSAwMDAwOjAwOjAyLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwMS0wM10K
RGVjICAxIDE1OjU1OjIyIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIxODU1MV0gcGNpIDAw
MDA6MDA6MDIuMDogICBicmlkZ2Ugd2luZG93IFtpbyAgMHhlMDAwLTB4ZWZmZl0KRGVjICAxIDE1
OjU1OjIyIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIxODY1NV0gcGNpIDAwMDA6MDA6MDIu
MDogICBicmlkZ2Ugd2luZG93IFttZW0gMHhkZmMwMDAwMC0weGRmZWZmZmZmXQpEZWMgIDEgMTU6
NTU6MjIgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjE4NzU3XSBwY2kgMDAwMDowMDowMi4w
OiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGQ4MDAwMDAwLTB4ZDhmZmZmZmYgNjRiaXQgcHJlZl0K
RGVjICAxIDE1OjU1OjIyIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIxODg4MV0gcGNpIDAw
MDA6MDA6MDQuMDogUENJIGJyaWRnZSB0byBbYnVzIDA0LTA0XQpEZWMgIDEgMTU6NTU6MjIgR3Jp
ZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjE4OTczXSBwY2kgMDAwMDowMDowNC4wOiAgIGJyaWRn
ZSB3aW5kb3cgW2lvICBkaXNhYmxlZF0KRGVjICAxIDE1OjU1OjIyIEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICAwLjIxOTA3Nl0gcGNpIDAwMDA6MDA6MDQuMDogICBicmlkZ2Ugd2luZG93IFttZW0g
ZGlzYWJsZWRdCkRlYyAgMSAxNTo1NToyMiBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMTkx
NzVdIHBjaSAwMDAwOjAwOjA0LjA6ICAgYnJpZGdlIHdpbmRvdyBbbWVtIHByZWYgZGlzYWJsZWRd
CkRlYyAgMSAxNTo1NToyMiBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMTkyODNdIHBjaSAw
MDAwOjA1OjAwLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwNi0wNl0KRGVjICAxIDE1OjU1OjIyIEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIxOTM4MF0gcGNpIDAwMDA6MDU6MDAuMDogICBicmlk
Z2Ugd2luZG93IFtpbyAgMHhkMDAwLTB4ZGZmZl0KRGVjICAxIDE1OjU1OjIyIEdyaWRvc19Ob2Rl
IGtlcm5lbDogWyAgICAwLjIxOTQ4NF0gcGNpIDAwMDA6MDU6MDAuMDogICBicmlkZ2Ugd2luZG93
IFttZW0gMHhkZmEwMDAwMC0weGRmYmZmZmZmXQpEZWMgIDEgMTU6NTU6MjIgR3JpZG9zX05vZGUg
a2VybmVsOiBbICAgIDAuMjE5NTg1XSBwY2kgMDAwMDowNTowMC4wOiAgIGJyaWRnZSB3aW5kb3cg
W21lbSBwcmVmIGRpc2FibGVkXQpEZWMgIDEgMTU6NTU6MjIgR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuMjE5NjkzXSBwY2kgMDAwMDowNTowMC4yOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDctMDdd
CkRlYyAgMSAxNTo1NToyMiBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMTk3ODldIHBjaSAw
MDAwOjA1OjAwLjI6ICAgYnJpZGdlIHdpbmRvdyBbaW8gIDB4YzAwMC0weGNmZmZdCkRlYyAgMSAx
NTo1NToyMiBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMTk4OTRdIHBjaSAwMDAwOjA1OjAw
LjI6ICAgYnJpZGdlIHdpbmRvdyBbbWVtIDB4ZGY4MDAwMDAtMHhkZjlmZmZmZl0KRGVjICAxIDE1
OjU1OjIyIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIxOTk5NV0gcGNpIDAwMDA6MDU6MDAu
MjogICBicmlkZ2Ugd2luZG93IFttZW0gcHJlZiBkaXNhYmxlZF0KRGVjICAxIDE1OjU1OjIyIEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIyMDAzMV0gcGNpIDAwMDA6MDA6MDUuMDogUENJIGJy
aWRnZSB0byBbYnVzIDA1LTA3XQpEZWMgIDEgMTU6NTU6MjIgR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuMjIwMDMxXSBwY2kgMDAwMDowMDowNS4wOiAgIGJyaWRnZSB3aW5kb3cgW2lvICAweGMw
MDAtMHhkZmZmXQpEZWMgIDEgMTU6NTU6MjIgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjIw
MDMxXSBwY2kgMDAwMDowMDowNS4wOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGRmNzAwMDAwLTB4
ZGZiZmZmZmZdCkRlYyAgMSAxNTo1NToyMiBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMjAw
MzFdIHBjaSAwMDAwOjAwOjA1LjA6ICAgYnJpZGdlIHdpbmRvdyBbbWVtIHByZWYgZGlzYWJsZWRd
CkRlYyAgMSAxNTo1NToyMiBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMjAwMzFdIHBjaSAw
MDAwOjAwOjA2LjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwOC0wOF0KRGVjICAxIDE1OjU1OjIyIEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIyMDAzMV0gcGNpIDAwMDA6MDA6MDYuMDogICBicmlk
Z2Ugd2luZG93IFtpbyAgZGlzYWJsZWRdCkRlYyAgMSAxNTo1NToyMiBHcmlkb3NfTm9kZSBrZXJu
ZWw6IFsgICAgMC4yMjAwMzFdIHBjaSAwMDAwOjAwOjA2LjA6ICAgYnJpZGdlIHdpbmRvdyBbbWVt
IGRpc2FibGVkXQpEZWMgIDEgMTU6NTU6MjIgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjIw
MDMxXSBwY2kgMDAwMDowMDowNi4wOiAgIGJyaWRnZSB3aW5kb3cgW21lbSBwcmVmIGRpc2FibGVk
XQpEZWMgIDEgMTU6NTU6MjIgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjIwMDMxXSBwY2kg
MDAwMDowOTowNi4wOiBCQVIgNjogYXNzaWduZWQgW21lbSAweGQwMDAwMDAwLTB4ZDAwN2ZmZmYg
cHJlZl0KRGVjICAxIDE1OjU1OjIyIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIyMDAzMV0g
cGNpIDAwMDA6MDk6MGQuMDogQkFSIDY6IGFzc2lnbmVkIFttZW0gMHhkMDA4MDAwMC0weGQwMDlm
ZmZmIHByZWZdCkRlYyAgMSAxNTo1NToyMiBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMjAw
MzFdIHBjaSAwMDAwOjAwOjFlLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwOS0wOV0KRGVjICAxIDE1
OjU1OjIyIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIyMDAzMV0gcGNpIDAwMDA6MDA6MWUu
MDogICBicmlkZ2Ugd2luZG93IFtpbyAgMHhiMDAwLTB4YmZmZl0KRGVjICAxIDE1OjU1OjIyIEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIyMDAzMV0gcGNpIDAwMDA6MDA6MWUuMDogICBicmlk
Z2Ugd2luZG93IFttZW0gMHhkZjUwMDAwMC0weGRmNmZmZmZmXQpEZWMgIDEgMTU6NTU6MjIgR3Jp
ZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjIwMDMxXSBwY2kgMDAwMDowMDoxZS4wOiAgIGJyaWRn
ZSB3aW5kb3cgW21lbSAweGM4MDAwMDAwLTB4ZDdmZmZmZmYgcHJlZl0KRGVjICAxIDE1OjU1OjIy
IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIyMTYxOV0gcGNpIDAwMDA6MDA6MDIuMDogUENJ
IElOVCBBIC0+IEdTSSAxNiAobGV2ZWwsIGxvdykgLT4gSVJRIDE2CkRlYyAgMSAxNTo1NToyMiBH
cmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMjE4MDJdIHhlbl9tYXBfcGlycV9nc2k6IHJldHVy
bmluZyBpcnEgMTYgZm9yIGdzaSAxNgpEZWMgIDEgMTU6NTU6MjIgR3JpZG9zX05vZGUga2VybmVs
OiBbICAgIDAuMjIxOTAxXSBBbHJlYWR5IHNldHVwIHRoZSBHU0kgOjE2CkRlYyAgMSAxNTo1NToy
MiBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMjE5OTJdIHBjaSAwMDAwOjAwOjA0LjA6IFBD
SSBJTlQgQSAtPiBHU0kgMTYgKGxldmVsLCBsb3cpIC0+IElSUSAxNgpEZWMgIDEgMTU6NTU6MjIg
R3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjIyMTI0XSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1
cm5pbmcgaXJxIDE2IGZvciBnc2kgMTYKRGVjICAxIDE1OjU1OjIyIEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICAwLjIyMjIyMl0gQWxyZWFkeSBzZXR1cCB0aGUgR1NJIDoxNgpEZWMgIDEgMTU6NTU6
MjIgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjIyMzEzXSBwY2kgMDAwMDowMDowNS4wOiBQ
Q0kgSU5UIEEgLT4gR1NJIDE2IChsZXZlbCwgbG93KSAtPiBJUlEgMTYKRGVjICAxIDE1OjU1OjIy
IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIyMjQ5Nl0geGVuX21hcF9waXJxX2dzaTogcmV0
dXJuaW5nIGlycSAxNiBmb3IgZ3NpIDE2CkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJu
ZWw6IFsgICAgMC4yMjI1OTVdIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6MTYKRGVjICAxIDE1OjU1
OjIzIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIyMjY4Nl0gcGNpIDAwMDA6MDA6MDYuMDog
UENJIElOVCBBIC0+IEdTSSAxNiAobGV2ZWwsIGxvdykgLT4gSVJRIDE2CkRlYyAgMSAxNTo1NToy
MyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMjM0OTJdIE5FVDogUmVnaXN0ZXJlZCBwcm90
b2NvbCBmYW1pbHkgMgpEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAu
MjIzODU3XSBJUCByb3V0ZSBjYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6IDQwOTYgKG9yZGVyOiAy
LCAxNjM4NCBieXRlcykKRGVjICAxIDE1OjU1OjIzIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAw
LjIyNTI1MV0gVENQIGVzdGFibGlzaGVkIGhhc2ggdGFibGUgZW50cmllczogMTYzODQgKG9yZGVy
OiA1LCAxMzEwNzIgYnl0ZXMpCkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgMC4yMjU0NzFdIFRDUCBiaW5kIGhhc2ggdGFibGUgZW50cmllczogMTYzODQgKG9yZGVyOiA1
LCAxMzEwNzIgYnl0ZXMpCkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAg
MC4yMjU2MzddIFRDUDogSGFzaCB0YWJsZXMgY29uZmlndXJlZCAoZXN0YWJsaXNoZWQgMTYzODQg
YmluZCAxNjM4NCkKRGVjICAxIDE1OjU1OjIzIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjIy
NTczMV0gVENQIHJlbm8gcmVnaXN0ZXJlZApEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2Vy
bmVsOiBbICAgIDAuMjI1ODI3XSBVRFAgaGFzaCB0YWJsZSBlbnRyaWVzOiAyNTYgKG9yZGVyOiAx
LCA4MTkyIGJ5dGVzKQpEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAu
MjI1OTI5XSBVRFAtTGl0ZSBoYXNoIHRhYmxlIGVudHJpZXM6IDI1NiAob3JkZXI6IDEsIDgxOTIg
Ynl0ZXMpCkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yMjY2MjRd
IE5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMQpEZWMgIDEgMTU6NTU6MjMgR3JpZG9z
X05vZGUga2VybmVsOiBbICAgIDAuMjI3NzMxXSBVbnBhY2tpbmcgaW5pdHJhbWZzLi4uCkRlYyAg
MSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yNDUxNTZdIGRlYnVnOiB1bm1h
cHBpbmcgaW5pdCBtZW1vcnkgYzE2NjcwMDAuLmMxYTFlMDAwCkRlYyAgMSAxNTo1NToyMyBHcmlk
b3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yNDkwNTRdIG1pY3JvY29kZTogQ1BVMCBzaWc9MHhmNDMs
IHBmPTB4MSwgcmV2aXNpb249MHg1CkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6
IFsgICAgMC4yNDkxODRdIG1pY3JvY29kZTogQ1BVMSBzaWc9MHhmNDMsIHBmPTB4MSwgcmV2aXNp
b249MHg1CkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yNDkyOTld
IG1pY3JvY29kZTogQ1BVMiBzaWc9MHhmNDMsIHBmPTB4MSwgcmV2aXNpb249MHg1CkRlYyAgMSAx
NTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yNDk0MThdIG1pY3JvY29kZTogQ1BV
MyBzaWc9MHhmNDMsIHBmPTB4MSwgcmV2aXNpb249MHg1CkRlYyAgMSAxNTo1NToyMyBHcmlkb3Nf
Tm9kZSBrZXJuZWw6IFsgICAgMC4yNDk2NzBdIG1pY3JvY29kZTogTWljcm9jb2RlIFVwZGF0ZSBE
cml2ZXI6IHYyLjAwIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+LCBQZXRlciBPcnViYQpE
ZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuMjU0NjY3XSBtc2dtbmkg
aGFzIGJlZW4gc2V0IHRvIDc1MgpEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuMjU2MDM5XSBCbG9jayBsYXllciBTQ1NJIGdlbmVyaWMgKGJzZykgZHJpdmVyIHZlcnNp
b24gMC40IGxvYWRlZCAobWFqb3IgMjU0KQpEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2Vy
bmVsOiBbICAgIDAuMjU2MTUxXSBpbyBzY2hlZHVsZXIgbm9vcCByZWdpc3RlcmVkCkRlYyAgMSAx
NTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC4yNTYyNDJdIGlvIHNjaGVkdWxlciBk
ZWFkbGluZSByZWdpc3RlcmVkCkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgMC4yNTY1MDhdIGlvIHNjaGVkdWxlciBjZnEgcmVnaXN0ZXJlZCAoZGVmYXVsdCkKRGVjICAx
IDE1OjU1OjIzIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjI2OTk5Nl0gRXZlbnQtY2hhbm5l
bCBkZXZpY2UgaW5zdGFsbGVkLgpEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuMjcxNjE2XSBTZXJpYWw6IDgyNTAvMTY1NTAgZHJpdmVyLCA0IHBvcnRzLCBJUlEgc2hh
cmluZyBlbmFibGVkCkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC41
NzAyNTddIHNlcmlhbDgyNTA6IHR0eVMwIGF0IEkvTyAweDNmOCAoaXJxID0gNCkgaXMgYSAxNjU1
MEEKRGVjICAxIDE1OjU1OjIzIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjczMDA1OV0gMDA6
MDg6IHR0eVMwIGF0IEkvTyAweDNmOCAoaXJxID0gNCkgaXMgYSAxNjU1MEEKRGVjICAxIDE1OjU1
OjIzIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjc5MDMyNl0gc2VyaWFsIDAwMDA6MDk6MDUu
MTogUENJIElOVCBCIC0+IEdTSSAyMSAobGV2ZWwsIGxvdykgLT4gSVJRIDIxCkRlYyAgMSAxNTo1
NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC44MDAwNjBdIDAwMDA6MDk6MDUuMTogdHR5
UzEgYXQgSS9PIDB4YmM4MCAoaXJxID0gMjEpIGlzIGEgMTY1NTBBCkRlYyAgMSAxNTo1NToyMyBH
cmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC44NDA0MTBdIFJlYWwgVGltZSBDbG9jayBEcml2ZXIg
djEuMTJiCkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMC44NDA2NDZd
IGludGVsX3JuZzogRldIIG5vdCBkZXRlY3RlZApEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUg
a2VybmVsOiBbICAgIDAuODQ1OTE1XSBpODA0MjogUE5QOiBQUy8yIENvbnRyb2xsZXIgW1BOUDAz
MDM6S0JELFBOUDBmMTM6TU9VXSBhdCAweDYwLDB4NjQgaXJxIDEsMTIKRGVjICAxIDE1OjU1OjIz
IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjg0ODgzMl0gc2VyaW86IGk4MDQyIEtCRCBwb3J0
IGF0IDB4NjAsMHg2NCBpcnEgMQpEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDAuODQ4OTM2XSBzZXJpbzogaTgwNDIgQVVYIHBvcnQgYXQgMHg2MCwweDY0IGlycSAxMgpE
ZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuODQ5NDExXSBtb3VzZWRl
djogUFMvMiBtb3VzZSBkZXZpY2UgY29tbW9uIGZvciBhbGwgbWljZQpEZWMgIDEgMTU6NTU6MjMg
R3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuODUwMDA5XSBjcHVpZGxlOiB1c2luZyBnb3Zlcm5v
ciBsYWRkZXIKRGVjICAxIDE1OjU1OjIzIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAwLjg1MTc4
MV0gVENQIGN1YmljIHJlZ2lzdGVyZWQKRGVjICAxIDE1OjU1OjIzIEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICAwLjg1MTg3M10gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAxNwpEZWMg
IDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuODUxOTk0XSBVc2luZyBJUEkg
Tm8tU2hvcnRjdXQgbW9kZQpEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBbICAg
IDAuODU0MjAwXSBkZWJ1ZzogdW5tYXBwaW5nIGluaXQgbWVtb3J5IGMxMzQ1MDAwLi5jMTNhNTAw
MApEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDAuODcwMTYwXSBuYXNo
LWhvdHBsdWcgKDM5KTogL3Byb2MvMzkvb29tX2FkaiBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNl
IC9wcm9jLzM5L29vbV9zY29yZV9hZGogaW5zdGVhZC4KRGVjICAxIDE1OjU1OjIzIEdyaWRvc19O
b2RlIGtlcm5lbDogWyAgICAwLjkxMzgxMF0gaW5wdXQ6IEFUIFRyYW5zbGF0ZWQgU2V0IDIga2V5
Ym9hcmQgYXMgL2RldmljZXMvcGxhdGZvcm0vaTgwNDIvc2VyaW8wL2lucHV0L2lucHV0MApEZWMg
IDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDEuMTUxNjU1XSBTQ1NJIHN1YnN5
c3RlbSBpbml0aWFsaXplZApEZWMgIDEgMTU6NTU6MjMgR3JpZG9zX05vZGUga2VybmVsOiBbICAg
IDEuMTY2Njk5XSBGdXNpb24gTVBUIGJhc2UgZHJpdmVyIDMuMDQuMTkKRGVjICAxIDE1OjU1OjIz
IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAxLjE2Njc5M10gQ29weXJpZ2h0IChjKSAxOTk5LTIw
MDggTFNJIENvcnBvcmF0aW9uCkRlYyAgMSAxNTo1NToyMyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgMS4xNzQzNjhdIEZ1c2lvbiBNUFQgU1BJIEhvc3QgZHJpdmVyIDMuMDQuMTkKRGVjICAxIDE1
OjU1OjIzIEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICAxLjE3NDU2NV0gbXB0c3BpIDAwMDA6MDI6
MDUuMDogUENJIElOVCBBIC0+IEdTSSAzNCAobGV2ZWwsIGxvdykgLT4gSVJRIDM0CkRlYyAgMSAx
NTo1NToyNCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMS4xNzgyNDhdIG1wdGJhc2U6IGlvYzA6
IEluaXRpYXRpbmcgYnJpbmd1cApEZWMgIDEgMTU6NTU6MjQgR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDEuODEyODQ2XSBpbnB1dDogSW1FeFBTLzIgR2VuZXJpYyBFeHBsb3JlciBNb3VzZSBhcyAv
ZGV2aWNlcy9wbGF0Zm9ybS9pODA0Mi9zZXJpbzEvaW5wdXQvaW5wdXQxCkRlYyAgMSAxNTo1NToy
NCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgMi40MjAwODhdIGlvYzA6IExTSTUzQzEwMzAgQzA6
IENhcGFiaWxpdGllcz17SW5pdGlhdG9yLFRhcmdldH0KRGVjICAxIDE1OjU1OjI0IEdyaWRvc19O
b2RlIGtlcm5lbDogWyAgICA0LjEwOTExMF0gc2NzaTAgOiBpb2MwOiBMU0k1M0MxMDMwIEMwLCBG
d1Jldj0wMTAzMjMwMGgsIFBvcnRzPTEsIE1heFE9MjU1LCBJUlE9MzQKRGVjICAxIDE1OjU1OjI0
IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICA0LjkwOTQyOV0gc2NzaSAwOjA6MDowOiBEaXJlY3Qt
QWNjZXNzICAgICBNQVhUT1IgICBBVExBUzEwSzRfNzNTQ0EgIERGTTAgUFE6IDAgQU5TSTogMwpE
ZWMgIDEgMTU6NTU6MjQgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDQuOTA5NTc1XSBzY3NpIHRh
cmdldDA6MDowOiBCZWdpbm5pbmcgRG9tYWluIFZhbGlkYXRpb24KRGVjICAxIDE1OjU1OjI0IEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICA0LjkyMzk4Ml0gc2NzaSB0YXJnZXQwOjA6MDogRW5kaW5n
IERvbWFpbiBWYWxpZGF0aW9uCkRlYyAgMSAxNTo1NToyNCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgNC45MjQyMjRdIHNjc2kgdGFyZ2V0MDowOjA6IEZBU1QtMTYwIFdJREUgU0NTSSAzMjAuMCBN
Qi9zIERUIElVIFJUSSAoNi4yNSBucywgb2Zmc2V0IDEyNykKRGVjICAxIDE1OjU1OjI0IEdyaWRv
c19Ob2RlIGtlcm5lbDogWyAgICA0LjkyNjQ0N10gc2QgMDowOjA6MDogW3NkYV0gMTQzMzc0NjUw
IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoNzMuNCBHQi82OC4zIEdpQikKRGVjICAxIDE1OjU1
OjI0IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICA0LjkyODQ3OF0gc2QgMDowOjA6MDogW3NkYV0g
V3JpdGUgUHJvdGVjdCBpcyBvZmYKRGVjICAxIDE1OjU1OjI0IEdyaWRvc19Ob2RlIGtlcm5lbDog
WyAgICA0LjkyOTc2N10gc2NzaSAwOjA6MTowOiBEaXJlY3QtQWNjZXNzICAgICBNQVhUT1IgICBB
VExBUzEwSzVfNzNTQ0EgIEpUMDAgUFE6IDAgQU5TSTogMwpEZWMgIDEgMTU6NTU6MjQgR3JpZG9z
X05vZGUga2VybmVsOiBbICAgIDQuOTI5OTgxXSBzY3NpIHRhcmdldDA6MDoxOiBCZWdpbm5pbmcg
RG9tYWluIFZhbGlkYXRpb24KRGVjICAxIDE1OjU1OjI0IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAg
ICA0LjkzMTM5NV0gc2QgMDowOjA6MDogW3NkYV0gV3JpdGUgY2FjaGU6IGRpc2FibGVkLCByZWFk
IGNhY2hlOiBlbmFibGVkLCBzdXBwb3J0cyBEUE8gYW5kIEZVQQpEZWMgIDEgMTU6NTU6MjQgR3Jp
ZG9zX05vZGUga2VybmVsOiBbICAgIDQuOTQ2OTcwXSBzY3NpIHRhcmdldDA6MDoxOiBFbmRpbmcg
RG9tYWluIFZhbGlkYXRpb24KRGVjICAxIDE1OjU1OjI0IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAg
ICA0Ljk0NzIxNF0gc2NzaSB0YXJnZXQwOjA6MTogRkFTVC0xNjAgV0lERSBTQ1NJIDMyMC4wIE1C
L3MgRFQgSVUgUlRJICg2LjI1IG5zLCBvZmZzZXQgMTI3KQpEZWMgIDEgMTU6NTU6MjQgR3JpZG9z
X05vZGUga2VybmVsOiBbICAgIDQuOTQ5MTAyXSBzZCAwOjA6MTowOiBbc2RiXSAxNDMzNzQ2NTAg
NTEyLWJ5dGUgbG9naWNhbCBibG9ja3M6ICg3My40IEdCLzY4LjMgR2lCKQpEZWMgIDEgMTU6NTU6
MjUgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDUuMjA1NDYxXSBzZCAwOjA6MTowOiBbc2RiXSBX
cml0ZSBQcm90ZWN0IGlzIG9mZgpEZWMgIDEgMTU6NTU6MjUgR3JpZG9zX05vZGUga2VybmVsOiBb
ICAgIDUuMjA1NzE3XSAgc2RhOiBzZGExIHNkYTIgc2RhMyBzZGE0IDwgc2RhNSA+CkRlYyAgMSAx
NTo1NToyNiBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgNS40NjIyNzNdIHNkIDA6MDoxOjA6IFtz
ZGJdIFdyaXRlIGNhY2hlOiBkaXNhYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgc3VwcG9ydHMg
RFBPIGFuZCBGVUEKRGVjICAxIDE1OjU1OjI3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICA1Ljcy
MTc4MV0gc2QgMDowOjA6MDogW3NkYV0gQXR0YWNoZWQgU0NTSSBkaXNrCkRlYyAgMSAxNTo1NToy
OCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgNS45NzgzMDNdICBzZGI6IHNkYjEKRGVjICAxIDE1
OjU1OjI4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICA1Ljk4ODYyMF0gc2NzaSAwOjA6NjowOiBQ
cm9jZXNzb3IgICAgICAgICBQRS9QViAgICAxeDIgU0NTSSBCUCAgICAgIDEuMCAgUFE6IDAgQU5T
STogMgpEZWMgIDEgMTU6NTU6MjggR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDUuOTg4NzcxXSBz
Y3NpIHRhcmdldDA6MDo2OiBCZWdpbm5pbmcgRG9tYWluIFZhbGlkYXRpb24KRGVjICAxIDE1OjU1
OjI4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICA1Ljk5MzkxMV0gc2QgMDowOjE6MDogW3NkYl0g
QXR0YWNoZWQgU0NTSSBkaXNrCkRlYyAgMSAxNTo1NToyOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAgNi4wMDk3MzJdIHNjc2kgdGFyZ2V0MDowOjY6IEVuZGluZyBEb21haW4gVmFsaWRhdGlvbgpE
ZWMgIDEgMTU6NTU6MjggR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDYuMDA5OTc4XSBzY3NpIHRh
cmdldDA6MDo2OiBhc3luY2hyb25vdXMKRGVjICAxIDE1OjU1OjI5IEdyaWRvc19Ob2RlIHNtYXJ0
ZFsxOTk3XTogc21hcnRkIHZlcnNpb24gNS4zOCBbaTY4Ni1yZWRoYXQtbGludXgtZ251XSBDb3B5
cmlnaHQgKEMpIDIwMDItOCBCcnVjZSBBbGxlbiAKRGVjICAxIDE1OjU1OjI5IEdyaWRvc19Ob2Rl
IHNtYXJ0ZFsxOTk3XTogSG9tZSBwYWdlIGlzIGh0dHA6Ly9zbWFydG1vbnRvb2xzLnNvdXJjZWZv
cmdlLm5ldC8gIApEZWMgIDEgMTU6NTU6MjkgR3JpZG9zX05vZGUgc21hcnRkWzE5OTddOiBPcGVu
ZWQgY29uZmlndXJhdGlvbiBmaWxlIC9ldGMvc21hcnRkLmNvbmYgCkRlYyAgMSAxNTo1NToyOSBH
cmlkb3NfTm9kZSBzbWFydGRbMTk5N106IENvbmZpZ3VyYXRpb24gZmlsZSAvZXRjL3NtYXJ0ZC5j
b25mIHBhcnNlZC4gCkRlYyAgMSAxNTo1NToyOSBHcmlkb3NfTm9kZSBzbWFydGRbMTk5N106IERl
dmljZTogL2Rldi9zZGEsIG9wZW5lZCAKRGVjICAxIDE1OjU1OjI5IEdyaWRvc19Ob2RlIHNtYXJ0
ZFsxOTk3XTogRGV2aWNlOiAvZGV2L3NkYSwgaXMgU01BUlQgY2FwYWJsZS4gQWRkaW5nIHRvICJt
b25pdG9yIiBsaXN0LiAKRGVjICAxIDE1OjU1OjI5IEdyaWRvc19Ob2RlIHNtYXJ0ZFsxOTk3XTog
RGV2aWNlOiAvZGV2L3NkYiwgb3BlbmVkIApEZWMgIDEgMTU6NTU6MjkgR3JpZG9zX05vZGUgc21h
cnRkWzE5OTddOiBEZXZpY2U6IC9kZXYvc2RiLCBpcyBTTUFSVCBjYXBhYmxlLiBBZGRpbmcgdG8g
Im1vbml0b3IiIGxpc3QuIApEZWMgIDEgMTU6NTU6MjkgR3JpZG9zX05vZGUgc21hcnRkWzE5OTdd
OiBNb25pdG9yaW5nIDAgQVRBIGFuZCAyIFNDU0kgZGV2aWNlcyAKRGVjICAxIDE1OjU1OjMwIEdy
aWRvc19Ob2RlIHNtYXJ0ZFsxOTk5XTogc21hcnRkIGhhcyBmb3JrKCllZCBpbnRvIGJhY2tncm91
bmQgbW9kZS4gTmV3IFBJRD0xOTk5LiAKRGVjICAxIDE1OjU1OjM3IEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgICA4LjA4ODI5N10gRnVzaW9uIE1QVCBTQVMgSG9zdCBkcml2ZXIgMy4wNC4xOQpEZWMg
IDEgMTU6NTU6MzcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDguMTA0NDA4XSBhdGFfcGlpeCAw
MDAwOjAwOjFmLjE6IGVuYWJsaW5nIGRldmljZSAoMDAwNSAtPiAwMDA3KQpEZWMgIDEgMTU6NTU6
MzcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDguMTA0NTE0XSBhdGFfcGlpeCAwMDAwOjAwOjFm
LjE6IGNhbid0IGRlcml2ZSByb3V0aW5nIGZvciBQQ0kgSU5UIEEKRGVjICAxIDE1OjU1OjM3IEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgICA4LjEwNTM0OV0gYXRhX3BpaXggMDAwMDowMDoxZi4xOiBC
TURNQTogZmFpbGVkIHRvIHNldCBkbWEgbWFzaywgZmFsbGluZyBiYWNrIHRvIFBJTwpEZWMgIDEg
MTU6NTU6MzcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgIDguMTA3MTgxXSBzY3NpMSA6IGF0YV9w
aWl4CkRlYyAgMSAxNTo1NTozNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgOC4xMDc3NDZdIHNj
c2kyIDogYXRhX3BpaXgKRGVjICAxIDE1OjU1OjM3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICA4
LjEwODA3N10gYXRhMTogUEFUQSBtYXggUElPNCBjbWQgMHgxZjAgY3RsIDB4M2Y2IGJtZG1hIDB4
ZmMwMCBpcnEgMTQKRGVjICAxIDE1OjU1OjM3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICA4LjEw
ODE3M10gYXRhMjogUEFUQSBtYXggUElPNCBjbWQgMHgxNzAgY3RsIDB4Mzc2IGJtZG1hIDB4ZmMw
OCBpcnEgMTUKRGVjICAxIDE1OjU1OjM3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgICA4LjI4MDQ0
OF0gYXRhMS4wMDogQVRBUEk6IFBISUxJUFMgRFZELVJPTSBTRFIwODksIFREMzYsIG1heCBVRE1B
LzMzCkRlYyAgMSAxNTo1NTozNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAgOC4zMDAzMjZdIGF0
YTEuMDA6IGNvbmZpZ3VyZWQgZm9yIFBJTzQKRGVjICAxIDE1OjU1OjM3IEdyaWRvc19Ob2RlIGtl
cm5lbDogWyAgICA4LjMwMjA0OF0gc2NzaSAxOjA6MDowOiBDRC1ST00gICAgICAgICAgICBQSElM
SVBTICBEVkQtUk9NIFNEUjA4OSAgIFREMzYgUFE6IDAgQU5TSTogNQpEZWMgIDEgMTU6NTU6Mzcg
R3JpZG9zX05vZGUga2VybmVsOiBbICAgMTkuNTQ4NjUzXSBFWFQzLWZzOiBiYXJyaWVycyBub3Qg
ZW5hYmxlZApEZWMgIDEgMTU6NTU6MzcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMTkuNTY3NTI2
XSBram91cm5hbGQgc3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgNSBzZWNvbmRzCkRlYyAgMSAx
NTo1NTozNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAxOS41Njc2NTddIEVYVDMtZnMgKHNkYTMp
OiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZQpEZWMgIDEgMTU6NTU6
MzcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjIuMTIxMDQwXSBpbnB1dDogUEMgU3BlYWtlciBh
cyAvZGV2aWNlcy9wbGF0Zm9ybS9wY3Nwa3IvaW5wdXQvaW5wdXQyCkRlYyAgMSAxNTo1NTozNyBH
cmlkb3NfTm9kZSBrZXJuZWw6IFsgICAyMi4yMDA1ODhdIHBhdGFfYWNwaSAwMDAwOjA5OjA2LjA6
IFBDSSBJTlQgQSAtPiBHU0kgMjMgKGxldmVsLCBsb3cpIC0+IElSUSAyMwpEZWMgIDEgMTU6NTU6
MzcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjIuMjAwODUxXSBwYXRhX2FjcGkgMDAwMDowOTow
Ni4wOiBCTURNQTogZmFpbGVkIHRvIHNldCBkbWEgbWFzaywgZmFsbGluZyBiYWNrIHRvIFBJTwpE
ZWMgIDEgMTU6NTU6MzcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjIuMjAxMDA0XSBwYXRhX2Fj
cGkgMDAwMDowOTowNi4wOiBQQ0kgSU5UIEEgZGlzYWJsZWQKRGVjICAxIDE1OjU1OjM3IEdyaWRv
c19Ob2RlIGtlcm5lbDogWyAgIDIyLjIxNzIwOV0gaVRDT192ZW5kb3Jfc3VwcG9ydDogdmVuZG9y
LXN1cHBvcnQ9MApEZWMgIDEgMTU6NTU6MzcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjIuMjI0
NjA2XSBpVENPX3dkdDogSW50ZWwgVENPIFdhdGNoRG9nIFRpbWVyIERyaXZlciB2MS4wNgpEZWMg
IDEgMTU6NTU6MzcgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjIuMjI1MDEyXSBpVENPX3dkdDog
Rm91bmQgYSBJQ0g1IG9yIElDSDVSIFRDTyBkZXZpY2UgKFZlcnNpb249MSwgVENPQkFTRT0weDA4
NjApCkRlYyAgMSAxNTo1NTozNyBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAyMi4yMjUyODBdIGlU
Q09fd2R0OiBpbml0aWFsaXplZC4gaGVhcnRiZWF0PTMwIHNlYyAobm93YXlvdXQ9MSkKRGVjICAx
IDE1OjU1OjM3IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDIyLjI0NjUyMV0geGVuX21hcF9waXJx
X2dzaTogcmV0dXJuaW5nIGlycSAyMyBmb3IgZ3NpIDIzCkRlYyAgMSAxNTo1NTozOCBHcmlkb3Nf
Tm9kZSBrZXJuZWw6IFsgICAyMi4yNDY1NDVdIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6MjMKRGVj
ICAxIDE1OjU1OjM4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDIyLjI0NjU1Nl0gcGF0YV9zaWw2
ODAgMDAwMDowOTowNi4wOiBQQ0kgSU5UIEEgLT4gR1NJIDIzIChsZXZlbCwgbG93KSAtPiBJUlEg
MjMKRGVjICAxIDE1OjU1OjM4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDIyLjI0NjY1Ml0gc2ls
NjgwOiAxMzNNSHogY2xvY2suCkRlYyAgMSAxNTo1NTozOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAyMi4yNDY4NDddIHBhdGFfc2lsNjgwIDAwMDA6MDk6MDYuMDogQk1ETUE6IGZhaWxlZCB0byBz
ZXQgZG1hIG1hc2ssIGZhbGxpbmcgYmFjayB0byBQSU8KRGVjICAxIDE1OjU1OjM4IEdyaWRvc19O
b2RlIGtlcm5lbDogWyAgIDIyLjI2NTQ4M10gc2NzaTMgOiBwYXRhX3NpbDY4MApEZWMgIDEgMTU6
NTU6MzggR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjIuMjc2ODQ0XSBzY3NpNCA6IHBhdGFfc2ls
NjgwCkRlYyAgMSAxNTo1NTozOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAyMi4yNzcyMzBdIGF0
YTM6IFBBVEEgbWF4IFBJTzQgY21kIDB4YmNmMCBjdGwgMHhiY2U0IGJtZG1hIDB4YmM3MCBpcnEg
MjMKRGVjICAxIDE1OjU1OjM4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDIyLjI3NzI0M10gYXRh
NDogUEFUQSBtYXggUElPNCBjbWQgMHhiY2Q4IGN0bCAweGJjZDAgYm1kbWEgMHhiYzc4IGlycSAy
MwpEZWMgIDEgMTU6NTU6MzggR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjIuNDcxNTYxXSBhdGEz
LjAwOiBBVEFQSTogVklSVFVBTEZMT1BQWSBEUklWRSAgICAgICAgICAgICAgIEZsb3BweSwgLCBt
YXggUElPMwpEZWMgIDEgMTU6NTU6MzggR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjIuNDcxNTc5
XSBhdGEzLjAxOiBBVEFQSTogVklSVFVBTENEUk9NIERSSVZFLCAsIG1heCBQSU8zCkRlYyAgMSAx
NTo1NTozOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAyMi41MDIwMjhdIGF0YTMuMDA6IGNvbmZp
Z3VyZWQgZm9yIFBJTzMKRGVjICAxIDE1OjU1OjM4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDIy
LjUyMDQ3NV0gYXRhMy4wMTogY29uZmlndXJlZCBmb3IgUElPMwpEZWMgIDEgMTU6NTU6MzggR3Jp
ZG9zX05vZGUga2VybmVsOiBbICAgMjIuNTU0NDY4XSBzY3NpIDM6MDowOjA6IERpcmVjdC1BY2Nl
c3MgICAgIERFTEwgICAgICAgVlNGICAgICAgICAgICAgMDEyMyBQUTogMCBBTlNJOiA1CkRlYyAg
MSAxNTo1NTozOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAyMi41NjQ1NzVdIHNjc2kgMzowOjE6
MDogQ0QtUk9NICAgICAgICAgICAgREVMTCAgICAgICBWQ0QgICAgICAgICAgICAwMTMzIFBROiAw
IEFOU0k6IDUKRGVjICAxIDE1OjU1OjM4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDIyLjYwNDY4
NV0gc2QgMzowOjA6MDogW3NkY10gQXR0YWNoZWQgU0NTSSByZW1vdmFibGUgZGlzawpEZWMgIDEg
MTU6NTU6MzggR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjIuNjc1NzU2XSBGREMgMCBpcyBhIE5h
dGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzMwNgpEZWMgIDEgMTU6NTU6MzggR3JpZG9zX05vZGUg
a2VybmVsOiBbICAgMjIuODU0MDMyXSBpbnB1dDogUG93ZXIgQnV0dG9uIGFzIC9kZXZpY2VzL0xO
WFNZU1RNOjAwL0xOWFBXUkJOOjAwL2lucHV0L2lucHV0MwpEZWMgIDEgMTU6NTU6MzggR3JpZG9z
X05vZGUga2VybmVsOiBbICAgMjIuODU0MDUzXSBBQ1BJOiBQb3dlciBCdXR0b24gW1BXUkZdCkRl
YyAgMSAxNTo1NTozOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAyMy4yODk0OTldIGUxMDAwOiBJ
bnRlbChSKSBQUk8vMTAwMCBOZXR3b3JrIERyaXZlciAtIHZlcnNpb24gNy4zLjIxLWs4LU5BUEkK
RGVjICAxIDE1OjU1OjM4IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDIzLjI4OTUxM10gZTEwMDA6
IENvcHlyaWdodCAoYykgMTk5OS0yMDA2IEludGVsIENvcnBvcmF0aW9uLgpEZWMgIDEgMTU6NTU6
MzggR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjMuMjg5Njc5XSBlMTAwMCAwMDAwOjA2OjA3LjA6
IFBDSSBJTlQgQSAtPiBHU0kgNjQgKGxldmVsLCBsb3cpIC0+IElSUSA2NApEZWMgIDEgMTU6NTU6
MzggR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjMuMjkwMjY1XSBlMTAwMDogTm8gdXNhYmxlIERN
QSBjb25maWcsIGFib3J0aW5nCkRlYyAgMSAxNTo1NTozOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAyMy4yOTA3MDFdIGUxMDAwIDAwMDA6MDY6MDcuMDogUENJIElOVCBBIGRpc2FibGVkCkRlYyAg
MSAxNTo1NTozOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAyMy4yOTA3MjddIGUxMDAwOiBwcm9i
ZSBvZiAwMDAwOjA2OjA3LjAgZmFpbGVkIHdpdGggZXJyb3IgLTUKRGVjICAxIDE1OjU1OjM4IEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgIDIzLjI5MDgxMl0gZTEwMDAgMDAwMDowNzowOC4wOiBQQ0kg
SU5UIEEgLT4gR1NJIDY1IChsZXZlbCwgbG93KSAtPiBJUlEgNjUKRGVjICAxIDE1OjU1OjM4IEdy
aWRvc19Ob2RlIGtlcm5lbDogWyAgIDIzLjI5MTI4NF0gZTEwMDA6IE5vIHVzYWJsZSBETUEgY29u
ZmlnLCBhYm9ydGluZwpEZWMgIDEgMTU6NTU6MzggR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjMu
MjkxNzE2XSBlMTAwMCAwMDAwOjA3OjA4LjA6IFBDSSBJTlQgQSBkaXNhYmxlZApEZWMgIDEgMTU6
NTU6MzggR3JpZG9zX05vZGUga2VybmVsOiBbICAgMjMuMjkxNzM0XSBlMTAwMDogcHJvYmUgb2Yg
MDAwMDowNzowOC4wIGZhaWxlZCB3aXRoIGVycm9yIC01CkRlYyAgMSAxNTo1NTozOCBHcmlkb3Nf
Tm9kZSBrZXJuZWw6IFsgICAzMy4wNDQ3NjJdIHNyMDogc2NzaTMtbW1jIGRyaXZlOiAyNHgvMjR4
IGNkL3J3IHhhL2Zvcm0yIGNkZGEgdHJheQpEZWMgIDEgMTU6NTU6MzggR3JpZG9zX05vZGUga2Vy
bmVsOiBbICAgMzMuMDQ0Nzg3XSBjZHJvbTogVW5pZm9ybSBDRC1ST00gZHJpdmVyIFJldmlzaW9u
OiAzLjIwCkRlYyAgMSAxNTo1NTozOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAzMy4wODQ5ODhd
IHNyMTogc2NzaS0xIGRyaXZlCkRlYyAgMSAxNTo1NTozOCBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAzMy4zNjE0NjNdIHNkIDA6MDowOjA6IEF0dGFjaGVkIHNjc2kgZ2VuZXJpYyBzZzAgdHlwZSAw
CkRlYyAgMSAxNTo1NTozOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAzMy4zNjE2ODZdIHNkIDA6
MDoxOjA6IEF0dGFjaGVkIHNjc2kgZ2VuZXJpYyBzZzEgdHlwZSAwCkRlYyAgMSAxNTo1NTozOSBH
cmlkb3NfTm9kZSBrZXJuZWw6IFsgICAzMy4zNjE5MDddIHNjc2kgMDowOjY6MDogQXR0YWNoZWQg
c2NzaSBnZW5lcmljIHNnMiB0eXBlIDMKRGVjICAxIDE1OjU1OjM5IEdyaWRvc19Ob2RlIGtlcm5l
bDogWyAgIDMzLjM2MjE0MV0gc3IgMTowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMyB0
eXBlIDUKRGVjICAxIDE1OjU1OjM5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDMzLjM2MjM3NV0g
c2QgMzowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnNCB0eXBlIDAKRGVjICAxIDE1OjU1
OjM5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDMzLjM2MjYwMF0gc3IgMzowOjE6MDogQXR0YWNo
ZWQgc2NzaSBnZW5lcmljIHNnNSB0eXBlIDUKRGVjICAxIDE1OjU1OjM5IEdyaWRvc19Ob2RlIGtl
cm5lbDogWyAgIDM0LjI2MTY3OV0gTm9uLXZvbGF0aWxlIG1lbW9yeSBkcml2ZXIgdjEuMwpEZWMg
IDEgMTU6NTU6MzkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMzQuNjYzMzYzXSBtZDogQXV0b2Rl
dGVjdGluZyBSQUlEIGFycmF5cy4KRGVjICAxIDE1OjU1OjM5IEdyaWRvc19Ob2RlIGtlcm5lbDog
WyAgIDM0LjY2MzM3MV0gbWQ6IFNjYW5uZWQgMCBhbmQgYWRkZWQgMCBkZXZpY2VzLgpEZWMgIDEg
MTU6NTU6MzkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMzQuNjYzMzc4XSBtZDogYXV0b3J1biAu
Li4KRGVjICAxIDE1OjU1OjM5IEdyaWRvc19Ob2RlIGtlcm5lbDogWyAgIDM0LjY2MzM4M10gbWQ6
IC4uLiBhdXRvcnVuIERPTkUuCkRlYyAgMSAxNTo1NTozOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAzNC43NjEzMDJdIGRldmljZS1tYXBwZXI6IGlvY3RsOiA0LjIwLjAtaW9jdGwgKDIwMTEtMDIt
MDIpIGluaXRpYWxpc2VkOiBkbS1kZXZlbEByZWRoYXQuY29tCkRlYyAgMSAxNTo1NTozOSBHcmlk
b3NfTm9kZSBrZXJuZWw6IFsgICAzNC44MjYyNjZdIGRldmljZS1tYXBwZXI6IG11bHRpcGF0aDog
dmVyc2lvbiAxLjMuMCBsb2FkZWQKRGVjICAxIDE1OjU1OjM5IEdyaWRvc19Ob2RlIGtlcm5lbDog
WyAgIDM1LjEyODU3NF0gbG9vcDogbW9kdWxlIGxvYWRlZApEZWMgIDEgMTU6NTU6MzkgR3JpZG9z
X05vZGUga2VybmVsOiBbICAgMzUuOTI4MjA0XSBFWFQzLWZzIChzZGEzKTogdXNpbmcgaW50ZXJu
YWwgam91cm5hbApEZWMgIDEgMTU6NTU6MzkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMzYuMDAx
OTE3XSBFWFQzLWZzOiBiYXJyaWVycyBub3QgZW5hYmxlZApEZWMgIDEgMTU6NTU6MzkgR3JpZG9z
X05vZGUga2VybmVsOiBbICAgMzYuMDAyMzU3XSBram91cm5hbGQgc3RhcnRpbmcuICBDb21taXQg
aW50ZXJ2YWwgNSBzZWNvbmRzCkRlYyAgMSAxNTo1NTozOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsg
ICAzNi4wMDg2ODNdIEVYVDMtZnMgKHNkYTIpOiB1c2luZyBpbnRlcm5hbCBqb3VybmFsCkRlYyAg
MSAxNTo1NTozOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAzNi4wMDg2OTJdIEVYVDMtZnMgKHNk
YTIpOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZQpEZWMgIDEgMTU6
NTU6MzkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMzYuMDI0Mjg3XSBFWFQzLWZzOiBiYXJyaWVy
cyBub3QgZW5hYmxlZApEZWMgIDEgMTU6NTU6MzkgR3JpZG9zX05vZGUga2VybmVsOiBbICAgMzYu
MDI0NjkxXSBram91cm5hbGQgc3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgNSBzZWNvbmRzCkRl
YyAgMSAxNTo1NTozOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAzNi4wMzA2MzddIEVYVDMtZnMg
KGRtLTApOiB1c2luZyBpbnRlcm5hbCBqb3VybmFsCkRlYyAgMSAxNTo1NTozOSBHcmlkb3NfTm9k
ZSBrZXJuZWw6IFsgICAzNi4wMzA2NDZdIEVYVDMtZnMgKGRtLTApOiBtb3VudGVkIGZpbGVzeXN0
ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZQpEZWMgIDEgMTU6NTU6MzkgR3JpZG9zX05vZGUga2Vy
bmVsOiBbICAgMzYuOTQ0MzgzXSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDEwCkRl
YyAgMSAxNTo1NTozOSBHcmlkb3NfTm9kZSBrZXJuZWw6IFsgICAzNy4wOTI1OTVdIGlwX3RhYmxl
czogKEMpIDIwMDAtMjAwNiBOZXRmaWx0ZXIgQ29yZSBUZWFtCkRlYyAgMSAxNTo1NTozOSBHcmlk
b3NfTm9kZSBrZXJuZWw6IFsgICA0Mi43OTA0NzddIHdhcm5pbmc6IGBkYnVzLWRhZW1vbicgdXNl
cyAzMi1iaXQgY2FwYWJpbGl0aWVzIChsZWdhY3kgc3VwcG9ydCBpbiB1c2UpCkRlYyAgMSAxNTo1
NTo1OSBHcmlkb3NfTm9kZSBhcHBsb2dpYzogVXNlciByb290IGhhcyBsb2dnZWQgaW50byBhbiBB
cHBMb2dpYyByZXN0cmljdGVkIGFyZWEuCkRlYyAgMSAxNTo1Nzo1MiBHcmlkb3NfTm9kZSBzaHV0
ZG93blsyNTQ4XTogc2h1dHRpbmcgZG93biBmb3Igc3lzdGVtIHJlYm9vdApEZWMgIDEgMTU6NTc6
NTIgR3JpZG9zX05vZGUgaW5pdDogU3dpdGNoaW5nIHRvIHJ1bmxldmVsOiA2CkRlYyAgMSAxNTo1
Nzo1MyBHcmlkb3NfTm9kZSBzbWFydGRbMTk5OV06IHNtYXJ0ZCByZWNlaXZlZCBzaWduYWwgMTU6
IFRlcm1pbmF0ZWQgCkRlYyAgMSAxNTo1Nzo1MyBHcmlkb3NfTm9kZSBzbWFydGRbMTk5OV06IHNt
YXJ0ZCBpcyBleGl0aW5nIChleGl0IHN0YXR1cyAwKSAKRGVjICAxIDE1OjU3OjU0IEdyaWRvc19O
b2RlIGtlcm5lbDogS2VybmVsIGxvZ2dpbmcgKHByb2MpIHN0b3BwZWQuCkRlYyAgMSAxNTo1Nzo1
NCBHcmlkb3NfTm9kZSBrZXJuZWw6IEtlcm5lbCBsb2cgZGFlbW9uIHRlcm1pbmF0aW5nLgpEZWMg
IDEgMTU6NTc6NTYgR3JpZG9zX05vZGUgZXhpdGluZyBvbiBzaWduYWwgMTUK

--_005_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--_005_3E243B26F475504B9BB0BCC9728B0DA629E16E01USILMS110Acacom_--


From xen-changelog-bounces@lists.xensource.com Sat Dec 10 10:24:53 2011
Return-path: <xen-changelog-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Sat, 10 Dec 2011 10:24:53 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-changelog-bounces@lists.xensource.com>)
	id 1RZK6v-0004Pq-3t; Sat, 10 Dec 2011 10:24:53 +0000
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1RZK6t-0004Iu-CF
	for xen-changelog@lists.xensource.com; Sat, 10 Dec 2011 10:24:52 +0000
X-Env-Sender: xen@xenbits.xen.org
X-Msg-Ref: server-4.tower-216.messagelabs.com!1323512636!6899531!1
X-Originating-IP: [50.57.168.107]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Version: 6.4.2; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15055 invoked from network); 10 Dec 2011 10:23:57 -0000
Received: from mail.xen.org (HELO mail.xen.org) (50.57.168.107)
	by server-4.tower-216.messagelabs.com with AES256-SHA encrypted SMTP;
	10 Dec 2011 10:23:57 -0000
Received: from xenbits.xen.org ([50.57.170.242])
	by mail.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1RZJvC-0003sr-UM
	for xen-changelog@lists.xensource.com; Sat, 10 Dec 2011 10:12:46 +0000
Received: from xen by xenbits.xen.org with local (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1RZJJC-0001NQ-Px
	for xen-changelog@lists.xensource.com; Sat, 10 Dec 2011 09:33:30 +0000
Message-Id: <E1RZJJC-0001NQ-Px@xenbits.xen.org>
Date: Sat, 10 Dec 2011 09:33:30 +0000
From: Xen patchbot-unstable <patchbot@xen.org>
To: xen-changelog@lists.xensource.com
Subject: [Xen-changelog] [xen-unstable] merge
X-BeenThere: xen-changelog@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: xen-devel@lists.xensource.com
List-Id: BK change log <xen-changelog.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-changelog>, 
	<mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-changelog@lists.xensource.com>
List-Help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>,
	<mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-changelog-bounces@lists.xensource.com
Errors-To: xen-changelog-bounces@lists.xensource.com

# HG changeset patch
# User Tim Deegan <tim@xen.org>
# Date 1322760252 0
# Node ID f30a33c5b5bd1e2b0bdffa3a649490157e451a4e
# Parent  f25a004a6de8efc15d95408f3e92081393360acb
# Parent  3e5683b6b37f9010772dac4a92166b1666485ddd
merge
---


diff -r f25a004a6de8 -r f30a33c5b5bd Config.mk
--- a/Config.mk	Thu Dec 01 17:21:24 2011 +0000
+++ b/Config.mk	Thu Dec 01 17:24:12 2011 +0000
@@ -232,7 +232,7 @@
 OCAML_TOOLS        ?= y
 CONFIG_MINITERM    ?= n
 CONFIG_LOMOUNT     ?= n
-CONFIG_SYSTEM_LIBAIO ?= n
+CONFIG_SYSTEM_LIBAIO ?= y
 
 ifeq ($(OCAML_TOOLS),y)
 OCAML_TOOLS := $(shell ocamlopt -v > /dev/null 2>&1 && echo "y" || echo "n")
diff -r f25a004a6de8 -r f30a33c5b5bd docs/gen-html-index
--- a/docs/gen-html-index	Thu Dec 01 17:21:24 2011 +0000
+++ b/docs/gen-html-index	Thu Dec 01 17:24:12 2011 +0000
@@ -10,7 +10,6 @@
 use Getopt::Long;
 use IO::File;
 use File::Basename;
-use List::MoreUtils qw/ uniq /;
 
 Getopt::Long::Configure('bundling');
 
@@ -99,6 +98,12 @@
     }
 }
 
+sub uniq (@) {
+    my %h;
+    foreach (@_) { $h{$_} = 1; }
+    return keys %h;
+}
+    
 for (@docs) { s,^\Q$outdir\E/,, }
 
 @docs = grep { -e "$outdir/$_" && (make_linktext($_) ne "NO-INDEX") } @docs;
diff -r f25a004a6de8 -r f30a33c5b5bd docs/man/xl.pod.1
--- a/docs/man/xl.pod.1	Thu Dec 01 17:21:24 2011 +0000
+++ b/docs/man/xl.pod.1	Thu Dec 01 17:24:12 2011 +0000
@@ -32,19 +32,51 @@
 
 =head1 NOTES
 
+=over 4
+
+=item start the script B</etc/init.d/xencommons> at boot time
+
 Most B<xl> operations rely upon B<xenstored> and B<xenconsoled>: make
 sure you start the script B</etc/init.d/xencommons> at boot time to
 initialize all the daemons needed by B<xl>.
 
+=item setup a B<xenbr0> bridge in dom0
+
 In the most common network configuration, you need to setup a bridge in dom0
 named B<xenbr0> in order to have a working network in the guest domains.
 Please refer to the documentation of your Linux distribution to know how to
 setup the bridge.
 
+=item B<autoballoon>
+
+If you specify the amount of memory dom0 has, passing B<dom0_mem> to
+Xen, it is highly reccomended to disable B<autoballoon>. Edit
+B</etc/xen/xl.conf> and set it to 0.
+
+=item run xl as B<root>
+
 Most B<xl> commands require root privileges to run due to the
 communications channels used to talk to the hypervisor.  Running as
 non root will return an error.
 
+=back
+
+=head1 GLOBAL OPTIONS
+
+Some global options are always available:
+
+=over 4
+
+=item B<-v>
+
+Verbose.
+
+=item B<-N>
+
+Dry run: do not actually execute the command.
+
+=back
+
 =head1 DOMAIN SUBCOMMANDS
 
 The following subcommands manipulate domains directly.  As stated
@@ -52,13 +84,19 @@
 
 =over 4
 
-=item B<create> [I<OPTIONS>] I<configfile>
+=item B<button-press> I<domain-id> I<button>
 
-The create subcommand requires a config file: see L<xl.cfg(5)> for
-full details of that file format and possible options.
+Indicate an ACPI button press to the domain. I<button> is may be 'power' or
+'sleep'. This command is only available for HVM domains.
 
-I<configfile> can either be an absolute path to a file, or a relative
-path to a file located in /etc/xen.
+=item B<create> [I<configfile>] [I<OPTIONS>]
+
+The create subcommand takes a config file as first argument: see
+L<xl.cfg> for full details of that file format and possible options.
+If I<configfile> is missing B<XL> creates the domain starting from the
+default value for every option.
+
+I<configfile> has to be an absolute path to a file.
 
 Create will return B<as soon> as the domain is started.  This B<does
 not> mean the guest OS in the domain has actually booted, or is
@@ -76,11 +114,6 @@
 
 Use the given configuration file.
 
-=item B<-n>, B<--dryrun>
-
-Dry run - prints the resulting configuration in SXP but does not create
-the domain.
-
 =item B<-p>
 
 Leave the domain paused after it is created.
@@ -88,7 +121,15 @@
 =item B<-c>
 
 Attach console to the domain as soon as it has started.  This is
-useful for determining issues with crashing domains.
+useful for determining issues with crashing domains and just as a
+general convenience since you often want to watch the
+domain boot.
+
+=item B<key=value>
+
+It is possible to pass I<key=value> pairs on the command line to provide
+options as if they were written in the configuration file; these override
+whatever is in the I<configfile>.
 
 =back
 
@@ -105,7 +146,7 @@
 
 =back
 
-=item B<console> I<domain-id>
+=item B<console> [I<OPTIONS>] I<domain-id>
 
 Attach to domain I<domain-id>'s console.  If you've set up your domains to
 have a traditional log in console this will look much like a normal
@@ -113,17 +154,20 @@
 
 Use the key combination Ctrl+] to detach the domain console.
 
-=item B<vncviewer> [I<OPTIONS>] I<domain-id>
-
-Attach to domain's VNC server, forking a vncviewer process.
-
 B<OPTIONS>
 
 =over 4
 
-=item I<--autopass>
+=item I<-t [pv|serial]>
 
-Pass VNC password to vncviewer via stdin.
+Connect to a PV console or connect to an emulated serial console.
+PV consoles are the only consoles available for PV domains while HVM
+domains can have both. If this option is not specified it defaults to
+emulated serial for HVM guests and PV console for PV guests.
+
+=item I<-n NUM>
+
+Connect to console number I<NUM>. Console numbers start from 0.
 
 =back
 
@@ -153,6 +197,10 @@
 be written to a distribution specific directory for dump files.  Such
 as: /var/lib/xen/dump or /var/xen/dump.
 
+=item B<getenforce>
+
+Returns the current enforcing mode of the Flask Xen security module.
+
 =item B<help> [I<--long>]
 
 Displays the short help message (i.e. common commands).
@@ -226,7 +274,8 @@
 
 =item B<s - shutdown>
 
-FIXME: Why would you ever see this state?
+The guest OS has shut down (SCHEDOP_shutdown has been called) but the
+domain is not dying yet.
 
 =item B<c - crashed>
 
@@ -239,8 +288,6 @@
 The domain is in process of dying, but hasn't completely shutdown or
 crashed.
 
-FIXME: Is this right?
-
 =back
 
 B<NOTES>
@@ -256,6 +303,10 @@
 
 =back
 
+=item B<loadpolicy> I<policyfile>
+
+Loads a new policy int the Flask Xen security module.
+
 =item B<mem-max> I<domain-id> I<mem>
 
 Specify the maximum amount of memory the domain is able to use, appending 't'
@@ -297,7 +348,7 @@
 =item B<-e>
 
 On the new host, do not wait in the background (on <host>) for the death of the
-domain.
+domain. See the corresponding option of the I<create> subcommand.
 
 =item B<-C> I<config>
 
@@ -317,6 +368,7 @@
 command run from the console.  The command returns as soon as it has
 executed the reboot action, which may be significantly before the
 domain actually reboots.
+It requires PV drivers installed in your guest OS.
 
 The behavior of what happens to a domain when it reboots is set by the
 B<on_reboot> parameter of the domain configuration file when the
@@ -337,6 +389,7 @@
 =item B<-e>
 
 Do not wait in the background for the death of the domain on the new host.
+See the corresponding option of the I<create> subcommand.
 
 =item B<-d>
 
@@ -344,6 +397,10 @@
 
 =back
 
+=item B<setenforce> I<1|0|Enforcing|Permissive>
+
+Sets the current enforcing mode of the Flask Xen security module
+
 =item B<save> [I<OPTIONS>] I<domain-id> I<CheckpointFile> [I<ConfigFile>]
 
 Saves a running domain to a state file so that it can be restored
@@ -353,7 +410,6 @@
 Passing a config file argument allows the user to manually select the VM config
 file used to create the domain.
 
-
 =over 4
 
 =item B<-c>
@@ -370,6 +426,7 @@
 succeed, and may take a variable length of time depending on what
 services must be shutdown in the domain.  The command returns
 immediately after signally the domain unless that B<-w> flag is used.
+For HVM domains it requires PV drivers to be installed in your guest OS.
 
 The behavior of what happens to a domain when it reboots is set by the
 B<on_shutdown> parameter of the domain configuration file when the
@@ -387,9 +444,17 @@
 
 =item B<sysrq> I<domain-id> I<letter>
 
-Send a I<Magic System Request> signal to the domain.  For more
-information on available magic sys req operations, see sysrq.txt in
-your Linux Kernel sources.
+Send a <Magic System Request> to the domain, each type of request is
+represented by a different letter.
+It can be used to send SysRq requests to Linux guests, see sysrq.txt in
+your Linux Kernel sources for more information.
+It requires PV drivers to be installed in your guest OS.
+
+=item B<trigger> I<domain-id> I<nmi|reset|init|power|sleep> [I<VCPU>]
+
+Send a trigger to a domain, where the trigger can be: nmi, reset, init, power
+or sleep.  Optionally a specific vcpu number can be passed as an argument.
+This command is only available for HVM domains.
 
 =item B<unpause> I<domain-id>
 
@@ -410,10 +475,6 @@
 configured VCPU count is an error.  Trying to set VCPUs to < 1 will be
 quietly ignored.
 
-Because this operation requires cooperation from the domain operating
-system, there is no guarantee that it will succeed.  This command will
-not work with a full virt domain.
-
 =item B<vcpu-list> [I<domain-id>]
 
 Lists VCPU information for a specific domain.  If no domain is
@@ -430,27 +491,19 @@
 this, by ensuring certain VCPUs can only run on certain physical
 CPUs.
 
-=item B<button-press> I<domain-id> I<button>
+=item B<vncviewer> [I<OPTIONS>] I<domain-id>
 
-Indicate an ACPI button press to the domain. I<button> is may be 'power' or
-'sleep'.
+Attach to domain's VNC server, forking a vncviewer process.
 
-=item B<trigger> I<domain-id> I<nmi|reset|init|power|sleep> [I<VCPU>]
+B<OPTIONS>
 
-Send a trigger to a domain, where the trigger can be: nmi, reset, init, power
-or sleep.  Optionally a specific vcpu number can be passed as an argument.
+=over 4
 
-=item B<getenforce>
+=item I<--autopass>
 
-Returns the current enforcing mode of the Flask Xen security module.
+Pass VNC password to vncviewer via stdin.
 
-=item B<setenforce> I<1|0|Enforcing|Permissive>
-
-Sets the current enforcing mode of the Flask Xen security module
-
-=item B<loadpolicy> I<policyfile>
-
-Loads a new policy int the Flask Xen security module.
+=back
 
 =back
 
@@ -460,7 +513,8 @@
 
 =item B<debug-keys> I<keys>
 
-Send debug I<keys> to Xen.
+Send debug I<keys> to Xen. It is the same as pressing the Xen
+"conswitch" (Ctrl-A by default) three times and then pressing "keys".
 
 =item B<dmesg> [B<-c>]
 
@@ -483,39 +537,41 @@
 
 Print information about the Xen host in I<name : value> format.  When
 reporting a Xen bug, please provide this information as part of the
-bug report.
+bug report. See I<http://wiki.xen.org/xenwiki/ReportingBugs> on how to
+report Xen bugs.
 
-Sample output looks as follows (lines wrapped manually to make the man
-page more readable):
+Sample output looks as follows:
 
- host                   : talon
- release                : 2.6.12.6-xen0
- version                : #1 Mon Nov 14 14:26:26 EST 2005
- machine                : i686
- nr_cpus                : 2
+ host                   : scarlett
+ release                : 3.1.0-rc4+
+ version                : #1001 SMP Wed Oct 19 11:09:54 UTC 2011
+ machine                : x86_64
+ nr_cpus                : 4
  nr_nodes               : 1
- cores_per_socket       : 1
+ cores_per_socket       : 4
  threads_per_core       : 1
- cpu_mhz                : 696
- hw_caps                : 0383fbff:00000000:00000000:00000040
- total_memory           : 767
- free_memory            : 37
- xen_major              : 3
- xen_minor              : 0
- xen_extra              : -devel
- xen_caps               : xen-3.0-x86_32
+ cpu_mhz                : 2266
+ hw_caps                : bfebfbff:28100800:00000000:00003b40:009ce3bd:00000000:00000001:00000000
+ virt_caps              : hvm hvm_directio
+ total_memory           : 6141
+ free_memory            : 4274
+ free_cpus              : 0
+ xen_major              : 4
+ xen_minor              : 2
+ xen_extra              : -unstable
+ xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64 
  xen_scheduler          : credit
  xen_pagesize           : 4096
- platform_params        : virt_start=0xfc000000
- xen_changeset          : Mon Nov 14 18:13:38 2005 +0100 
-                          7793:090e44133d40
- cc_compiler            : gcc version 3.4.3 (Mandrakelinux 
-                          10.2 3.4.3-7mdk)
- cc_compile_by          : sdague
- cc_compile_domain      : (none)
- cc_compile_date        : Mon Nov 14 14:16:48 EST 2005
+ platform_params        : virt_start=0xffff800000000000
+ xen_changeset          : Wed Nov 02 17:09:09 2011 +0000 24066:54a5e994a241
+ xen_commandline        : com1=115200,8n1 guest_loglvl=all dom0_mem=750M console=com1 
+ cc_compiler            : gcc version 4.4.5 (Debian 4.4.5-8) 
+ cc_compile_by          : sstabellini
+ cc_compile_domain      : uk.xensource.com
+ cc_compile_date        : Tue Nov  8 12:03:05 UTC 2011
  xend_config_format     : 4
 
+
 B<FIELDS>
 
 Not all fields will be explained here, but some of the less obvious
@@ -527,7 +583,8 @@
 
 A vector showing what hardware capabilities are supported by your
 processor.  This is equivalent to, though more cryptic, the flags
-field in /proc/cpuinfo on a normal Linux machine.
+field in /proc/cpuinfo on a normal Linux machine: they both derive from
+the feature bits returned by the cpuid command on x86 platforms.
 
 =item B<free_memory>
 
@@ -568,6 +625,9 @@
 =item B<pci-list-assignable-devices>
 
 List all the assignable PCI devices.
+These are devices in the system which are configured to be
+available for passthrough and are bound to a suitable PCI
+backend driver in domain 0 rather than a real driver.
 
 =back
 
@@ -635,10 +695,6 @@
 
 Use the given configuration file.
 
-=item B<-n>, B<--dryrun>
-
-Dry run - prints the resulting configuration.
-
 =back
 
 =item B<cpupool-list> [I<-c|--cpus>] [I<cpu-pool>]
@@ -676,8 +732,8 @@
 =head1 VIRTUAL DEVICE COMMANDS
 
 Most virtual devices can be added and removed while guests are
-running.  The effect to the guest OS is much the same as any hotplug
-event.
+running, assuming that the necessary support exists in the guest.  The
+effect to the guest OS is much the same as any hotplug event.
 
 =head2 BLOCK DEVICES
 
@@ -699,7 +755,8 @@
 =item I<disc-spec-component>
 
 A disc specification in the same format used for the B<disk> variable in
-the domain config file. See F<xl-disk-configuration>.
+the domain config file. See
+L<http://xenbits.xen.org/docs/unstable/misc/xl-disk-configuration.txt>.
 
 =back
 
@@ -754,8 +811,9 @@
 
 Creates a new network device in the domain specified by I<domain-id>.
 I<network-device> describes the device to attach, using the same format as the
-B<vif> string in the domain config file. See L<xl.cfg(5)> for the
-description.
+B<vif> string in the domain config file. See L<xl.cfg> and
+L<http://xenbits.xen.org/docs/unstable/misc/xl-network-configuration.html>
+for more informations.
 
 =item B<network-detach> I<domain-id> I<devid|mac>
 
@@ -793,17 +851,100 @@
 
 =back
 
+=head2 TMEM
+
+=over 4
+
+=item B<tmem-list> I[<-l>] I<domain-id>
+
+List tmem pools. If I<-l> is specified, also list tmem stats.
+
+=item B<tmem-freeze> I<domain-id>
+
+Freeze tmem pools.
+
+=item B<tmem-destroy> I<domain-id>
+
+Destroy tmem pools.
+
+=item B<tmem-thaw> I<domain-id>
+
+Thaw tmem pools.
+
+=item B<tmem-set> I<domain-id> [I<OPTIONS>]
+
+Change tmem settings.
+
+B<OPTIONS>
+
+=over 4
+
+=item B<-w> I<WEIGHT>
+
+Weight (int)
+
+=item B<-c> I<CAP>
+
+Cap (int)
+
+=item B<-p> I<COMPRESS>
+
+Compress (int)
+
+=back
+
+=item B<tmem-shared-auth> I<domain-id> [I<OPTIONS>]
+
+De/authenticate shared tmem pool.
+
+B<OPTIONS>
+
+=over 4
+
+=item B<-u> I<UUID>
+
+Specify uuid (abcdef01-2345-6789-1234-567890abcdef)
+
+=item B<-a> I<AUTH>
+
+0=auth,1=deauth
+
+=back
+
+=item B<tmem-freeable>
+
+Get information about how much freeable memory (MB) is in-use by tmem.
+
+=back
+
+=head1 TO BE DOCUMENTED
+
+We need better documentation for:
+
+=over 4
+
+=item B<tmem>
+
+Trascendent Memory.
+
+=item B<Flask>
+
+Xen Flask security module.
+
+=back
+
 =head1 SEE ALSO
 
-L<xl.cfg(5)>, L<xlcpupool.cfg(5)>, B<xentop(1)>
+The following man pages:
 
-=head1 AUTHOR
+L<xl.cfg>(5), L<xlcpupool.cfg>(5), B<xentop>(1)
 
-  Stefano Stabellini <stefano.stabellini@eu.citrix.com>
-  Vincent Hanquez <vincent.hanquez@eu.citrix.com>
-  Ian Jackson <ian.jackson@eu.citrix.com>
-  Ian Campbell <Ian.Campbell@citrix.com>
+And the following documents on the xen.org website:
+
+L<http://xenbits.xen.org/docs/unstable/misc/xl-network-configuration.html>
+L<http://xenbits.xen.org/docs/unstable/misc/xl-disk-configuration.txt>
 
 =head1 BUGS
 
-Send bugs to xen-devel@lists.xensource.com.
+Send bugs to xen-devel@lists.xensource.com, see
+http://wiki.xen.org/xenwiki/ReportingBugs on how to send bug reports.
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/Makefile
--- a/tools/libxc/Makefile	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/Makefile	Thu Dec 01 17:24:12 2011 +0000
@@ -42,7 +42,7 @@
 GUEST_SRCS-y :=
 GUEST_SRCS-y += xg_private.c xc_suspend.c
 GUEST_SRCS-$(CONFIG_MIGRATE) += xc_domain_restore.c xc_domain_save.c
-GUEST_SRCS-$(CONFIG_MIGRATE) += xc_offline_page.c
+GUEST_SRCS-$(CONFIG_MIGRATE) += xc_offline_page.c xc_compression.c
 GUEST_SRCS-$(CONFIG_HVM) += xc_hvm_build.c
 
 vpath %.c ../../xen/common/libelf
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xc_compression.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_compression.c	Thu Dec 01 17:24:12 2011 +0000
@@ -0,0 +1,552 @@
+/******************************************************************************
+ * xc_compression.c
+ *
+ * Checkpoint Compression using Page Delta Algorithm.
+ * - A LRU cache of recently dirtied guest pages is maintained.
+ * - For each dirty guest page in the checkpoint, if a previous version of the
+ * page exists in the cache, XOR both pages and send the non-zero sections
+ * to the receiver. The cache is then updated with the newer copy of guest page.
+ * - The receiver will XOR the non-zero sections against its copy of the guest
+ * page, thereby bringing the guest page up-to-date with the sender side.
+ *
+ * Copyright (c) 2011 Shriram Rajagopalan (rshriram@cs.ubc.ca).
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <inttypes.h>
+#include <errno.h>
+#include "xc_private.h"
+#include "xenctrl.h"
+#include "xg_save_restore.h"
+#include "xg_private.h"
+#include "xc_dom.h"
+
+/* Page Cache for Delta Compression*/
+#define DELTA_CACHE_SIZE (XC_PAGE_SIZE * 8192)
+
+/* Internal page buffer to hold dirty pages of a checkpoint,
+ * to be compressed after the domain is resumed for execution.
+ */
+#define PAGE_BUFFER_SIZE (XC_PAGE_SIZE * 8192)
+
+struct cache_page
+{
+    char *page;
+    xen_pfn_t pfn;
+    struct cache_page *next;
+    struct cache_page *prev;
+};
+
+struct compression_ctx
+{
+    /* compression buffer - holds compressed data */
+    char *compbuf;
+    unsigned long compbuf_size;
+    unsigned long compbuf_pos;
+
+    /* Page buffer to hold pages to be compressed */
+    char *inputbuf;
+    /* pfns of pages to be compressed */
+    xen_pfn_t *sendbuf_pfns;
+    unsigned int pfns_len;
+    unsigned int pfns_index;
+
+    /* Compression Cache (LRU) */
+    char *cache_base;
+    struct cache_page **pfn2cache;
+    struct cache_page *cache;
+    struct cache_page *page_list_head;
+    struct cache_page *page_list_tail;
+    unsigned long dom_pfnlist_size;
+};
+
+#define RUNFLAG 0
+#define SKIPFLAG ((char)128)
+#define FLAGMASK SKIPFLAG
+#define LENMASK ((char)127)
+
+/*
+ * see xg_save_restore.h for details on the compressed stream format.
+ * delta size = 4 bytes.
+ * run header = 1 byte (1 bit for runtype, 7bits for run length).
+ *  i.e maximum size of a run = 127 * 4 = 508 bytes.
+ * Worst case compression: Entire page has changed.
+ * In the worst case, the size of the compressed page is
+ *  8 runs of 508 bytes + 1 run of 32 bytes + 9 run headers 
+ *  = 4105 bytes.
+ * We could detect this worst case and send the entire page with a
+ * FULL_PAGE marker, reducing the total size to 4097 bytes. The cost
+ * of this size reduction is an additional memcpy, on top of two previous
+ * memcpy (to the compressed stream and the cache page in the for loop).
+ *
+ * We might as well sacrifice an extra 8 bytes instead of a memcpy.
+ */
+#define WORST_COMP_PAGE_SIZE (XC_PAGE_SIZE + 9)
+
+/*
+ * A zero length skip indicates full page.
+ */
+#define EMPTY_PAGE 0
+#define FULL_PAGE SKIPFLAG
+#define FULL_PAGE_SIZE (XC_PAGE_SIZE + 1)
+#define MAX_DELTAS (XC_PAGE_SIZE/sizeof(uint32_t))
+
+/*
+ * Add a pagetable page or a new page (uncached)
+ * if srcpage is a pagetable page, cache_page is null.
+ * if srcpage is a page that was not previously in the cache,
+ *  cache_page points to a free page slot in the cache where
+ *  this new page can be copied to.
+ */
+static int add_full_page(comp_ctx *ctx, char *srcpage, char *cache_page)
+{
+    char *dest = (ctx->compbuf + ctx->compbuf_pos);
+
+    if ( (ctx->compbuf_pos + FULL_PAGE_SIZE) > ctx->compbuf_size)
+        return -1;
+
+    if (cache_page)
+        memcpy(cache_page, srcpage, XC_PAGE_SIZE);
+    dest[0] = FULL_PAGE;
+    memcpy(&dest[1], srcpage, XC_PAGE_SIZE);
+    ctx->compbuf_pos += FULL_PAGE_SIZE;
+
+    return FULL_PAGE_SIZE;
+}
+
+static int compress_page(comp_ctx *ctx, char *srcpage, char *cache_page)
+{
+    char *dest = (ctx->compbuf + ctx->compbuf_pos);
+    uint32_t *new, *old;
+
+    int off, runptr = 0;
+    int wascopying = 0, copying = 0, bytes_skipped = 0;
+    int complen = 0, pageoff = 0, runbytes = 0;
+
+    char runlen = 0;
+
+    if ( (ctx->compbuf_pos + WORST_COMP_PAGE_SIZE) > ctx->compbuf_size)
+        return -1;
+
+    /*
+     * There are no alignment issues here since srcpage is
+     * domU's page passed from xc_domain_save and cache_page is
+     * a ptr to cache page (cache is page aligned).
+     */
+    new = (uint32_t*)srcpage;
+    old = (uint32_t*)cache_page;
+
+    for (off = 0; off <= MAX_DELTAS; off++)
+    {
+        /*
+         * At (off == MAX_DELTAS), we are processing the last run
+         * in the page. Since there is no XORing, make wascopying != copying
+         * to satisfy the if-block below.
+         */
+        copying = ((off < MAX_DELTAS) ? (old[off] != new[off]) : !wascopying);
+
+        if (runlen)
+        {
+            /* switching between run types or current run is full */
+            if ( (wascopying != copying) || (runlen == LENMASK) )
+            {
+                runbytes = runlen * sizeof(uint32_t);
+                runlen |= (wascopying ? RUNFLAG : SKIPFLAG);
+                dest[complen++] = runlen;
+
+                if (wascopying) /* RUNFLAG */
+                {
+                    pageoff = runptr * sizeof(uint32_t);
+                    memcpy(dest + complen, srcpage + pageoff, runbytes);
+                    memcpy(cache_page + pageoff, srcpage + pageoff, runbytes);
+                    complen += runbytes;
+                }
+                else /* SKIPFLAG */
+                {
+                    bytes_skipped += runbytes;
+                }
+
+                runlen = 0;
+                runptr = off;
+            }
+        }
+        runlen++;
+        wascopying = copying;
+    }
+
+    /*
+     * Check for empty page.
+     */
+    if (bytes_skipped == XC_PAGE_SIZE)
+    {
+        complen = 1;
+        dest[0] = EMPTY_PAGE;
+    }
+    ctx->compbuf_pos += complen;
+
+    return complen;
+}
+
+static
+char *get_cache_page(comp_ctx *ctx, xen_pfn_t pfn,
+                     int *israw)
+{
+    struct cache_page *item = NULL;
+
+    item = ctx->pfn2cache[pfn];
+
+    if (!item)
+    {
+        *israw = 1;
+
+        /* If the list is full, evict a page from the tail end. */
+        item = ctx->page_list_tail;
+        if (item->pfn != INVALID_P2M_ENTRY)
+            ctx->pfn2cache[item->pfn] = NULL;
+
+        item->pfn = pfn;
+        ctx->pfn2cache[pfn] = item;
+    }
+        
+    /* 	if requested item is in cache move to head of list */
+    if (item != ctx->page_list_head)
+    {
+        if (item == ctx->page_list_tail)
+        {
+            /* item at tail of list. */
+            ctx->page_list_tail = item->prev;
+            (ctx->page_list_tail)->next = NULL;
+        }
+        else
+        {
+            /* item in middle of list */
+            item->prev->next = item->next;
+            item->next->prev = item->prev;
+        }
+
+        item->prev = NULL;
+        item->next = ctx->page_list_head;
+        (ctx->page_list_head)->prev = item;
+        ctx->page_list_head = item;
+    }
+
+    return (ctx->page_list_head)->page;
+}
+
+/* Remove pagetable pages from cache and move to tail, as free pages */
+static
+void invalidate_cache_page(comp_ctx *ctx, xen_pfn_t pfn)
+{
+    struct cache_page *item = NULL;
+
+    item = ctx->pfn2cache[pfn];
+    if (item)
+    {
+        if (item != ctx->page_list_tail)
+        {
+            /* item at head of list */
+            if (item == ctx->page_list_head)
+            {
+                ctx->page_list_head = (ctx->page_list_head)->next;
+                (ctx->page_list_head)->prev = NULL;
+            }
+            else /* item in middle of list */
+            {            
+                item->prev->next = item->next;
+                item->next->prev = item->prev;
+            }
+
+            item->next = NULL;
+            item->prev = ctx->page_list_tail;
+            (ctx->page_list_tail)->next = item;
+            ctx->page_list_tail = item;
+        }
+        ctx->pfn2cache[pfn] = NULL;
+        (ctx->page_list_tail)->pfn = INVALID_P2M_ENTRY;
+    }
+}
+
+int xc_compression_add_page(xc_interface *xch, comp_ctx *ctx,
+                            char *page, xen_pfn_t pfn, int israw)
+{
+    if (pfn > ctx->dom_pfnlist_size)
+    {
+        ERROR("Invalid pfn passed into "
+              "xc_compression_add_page %" PRIpfn "\n", pfn);
+        return -2;
+    }
+
+    /* pagetable page */
+    if (israw)
+        invalidate_cache_page(ctx, pfn);
+    ctx->sendbuf_pfns[ctx->pfns_len] = israw ? INVALID_P2M_ENTRY : pfn;
+    memcpy(ctx->inputbuf + ctx->pfns_len * XC_PAGE_SIZE, page, XC_PAGE_SIZE);
+    ctx->pfns_len++;
+
+    /* check if we have run out of space. If so,
+     * we need to synchronously compress the pages and flush them out
+     */
+    if (ctx->pfns_len == NRPAGES(PAGE_BUFFER_SIZE))
+        return -1;
+    return 0;
+}
+
+int xc_compression_compress_pages(xc_interface *xch, comp_ctx *ctx,
+                                  char *compbuf, unsigned long compbuf_size,
+                                  unsigned long *compbuf_len)
+{
+    char *cache_copy = NULL, *current_page = NULL;
+    int israw, rc = 1;
+
+    if (!ctx->pfns_len || (ctx->pfns_index == ctx->pfns_len)) {
+        ctx->pfns_len = ctx->pfns_index = 0;
+        return 0;
+    }
+
+    ctx->compbuf_pos = 0;
+    ctx->compbuf = compbuf;
+    ctx->compbuf_size = compbuf_size;
+
+    for (; ctx->pfns_index < ctx->pfns_len; ctx->pfns_index++)
+    {
+        israw = 0;
+        cache_copy = NULL;
+        current_page = ctx->inputbuf + ctx->pfns_index * XC_PAGE_SIZE;
+
+        if (ctx->sendbuf_pfns[ctx->pfns_index] == INVALID_P2M_ENTRY)
+            israw = 1;
+        else
+            cache_copy = get_cache_page(ctx,
+                                        ctx->sendbuf_pfns[ctx->pfns_index],
+                                        &israw);
+
+        if (israw)
+            rc = (add_full_page(ctx, current_page, cache_copy) >= 0);
+        else
+            rc = (compress_page(ctx, current_page, cache_copy) >= 0);
+
+        if ( !rc )
+        {
+            /* Out of space in outbuf! flush and come back */
+            rc = -1;
+            break;
+        }
+    }
+    if (compbuf_len)
+        *compbuf_len = ctx->compbuf_pos;
+
+    return rc;
+}
+
+inline
+void xc_compression_reset_pagebuf(xc_interface *xch, comp_ctx *ctx)
+{
+    ctx->pfns_index = ctx->pfns_len = 0;
+}
+
+int xc_compression_uncompress_page(xc_interface *xch, char *compbuf,
+                                   unsigned long compbuf_size,
+                                   unsigned long *compbuf_pos, char *destpage)
+{
+    unsigned long pos;
+    unsigned int len = 0, pagepos = 0;
+    char flag;
+
+    pos = *compbuf_pos;
+    if (pos >= compbuf_size)
+    {
+        ERROR("Out of bounds exception in compression buffer (a):"
+              "read ptr:%lu, bufsize = %lu\n",
+              *compbuf_pos, compbuf_size);
+        return -1;
+    }
+
+    switch (compbuf[pos])
+    {
+    case EMPTY_PAGE:
+        pos++;
+        break;
+
+    case FULL_PAGE:
+        {
+            /* Check if the input buffer has 4KB of data */
+            if ((pos + FULL_PAGE_SIZE) > compbuf_size)
+            {
+                ERROR("Out of bounds exception in compression buffer (b):"
+                      "read ptr = %lu, bufsize = %lu\n",
+                      *compbuf_pos, compbuf_size);
+                return -1;
+            }
+            memcpy(destpage, &compbuf[pos + 1], XC_PAGE_SIZE);
+            pos += FULL_PAGE_SIZE;
+        }
+        break;
+
+    default: /* Normal page with one or more runs */
+        {
+            do
+            {
+                flag = compbuf[pos] & FLAGMASK;
+                len = (compbuf[pos] & LENMASK) * sizeof(uint32_t);
+                /* Sanity Check: Zero-length runs are allowed only for
+                 * FULL_PAGE and EMPTY_PAGE.
+                 */
+                if (!len)
+                {
+                    ERROR("Zero length run encountered for normal page: "
+                          "buffer (d):read ptr = %lu, flag = %u, "
+                          "bufsize = %lu, pagepos = %u\n",
+                          pos, (unsigned int)flag, compbuf_size, pagepos);
+                    return -1;
+                }
+
+                pos++;
+                if (flag == RUNFLAG)
+                {
+                    /* Check if the input buffer has len bytes of data
+                     * and whether it would fit in the destination page.
+                     */
+                    if (((pos + len) > compbuf_size)
+                        || ((pagepos + len) > XC_PAGE_SIZE))
+                    {
+                        ERROR("Out of bounds exception in compression "
+                              "buffer (c):read ptr = %lu, runlen = %u, "
+                              "bufsize = %lu, pagepos = %u\n",
+                              pos, len, compbuf_size, pagepos);
+                        return -1;
+                    }
+                    memcpy(&destpage[pagepos], &compbuf[pos], len);
+                    pos += len;
+                }
+                pagepos += len;
+            } while ((pagepos < XC_PAGE_SIZE) && (pos < compbuf_size));
+
+            /* Make sure we have copied/skipped 4KB worth of data */
+            if (pagepos != XC_PAGE_SIZE)
+            {
+                ERROR("Invalid data in compression buffer:"
+                      "read ptr = %lu, bufsize = %lu, pagepos = %u\n",
+                      pos, compbuf_size, pagepos);
+                return -1;
+            }
+        }
+    }
+    *compbuf_pos = pos;
+    return 0;
+}
+
+void xc_compression_free_context(xc_interface *xch, comp_ctx *ctx)
+{
+    if (!ctx) return;
+
+    if (ctx->inputbuf)
+        free(ctx->inputbuf);
+    if (ctx->sendbuf_pfns)
+        free(ctx->sendbuf_pfns);
+    if (ctx->cache_base)
+        free(ctx->cache_base);
+    if (ctx->pfn2cache)
+        free(ctx->pfn2cache);
+    if (ctx->cache)
+        free(ctx->cache);
+    free(ctx);
+}
+
+comp_ctx *xc_compression_create_context(xc_interface *xch,
+                                        unsigned long p2m_size)
+{
+    unsigned long i;
+    comp_ctx *ctx = NULL;
+    unsigned long num_cache_pages = DELTA_CACHE_SIZE/XC_PAGE_SIZE;
+
+    ctx = (comp_ctx *)malloc(sizeof(comp_ctx));
+    if (!ctx)
+    {
+        ERROR("Failed to allocate compression_ctx\n");
+        goto error;
+    }
+    memset(ctx, 0, sizeof(comp_ctx));
+
+    ctx->inputbuf = xc_memalign(xch, XC_PAGE_SIZE, PAGE_BUFFER_SIZE);
+    if (!ctx->inputbuf)
+    {
+        ERROR("Failed to allocate page buffer\n");
+        goto error;
+    }
+
+    ctx->cache_base = xc_memalign(xch, XC_PAGE_SIZE, DELTA_CACHE_SIZE);
+    if (!ctx->cache_base)
+    {
+        ERROR("Failed to allocate delta cache\n");
+        goto error;
+    }
+
+    ctx->sendbuf_pfns = malloc(NRPAGES(PAGE_BUFFER_SIZE) *
+                               sizeof(xen_pfn_t));
+    if (!ctx->sendbuf_pfns)
+    {
+        ERROR("Could not alloc sendbuf_pfns\n");
+        goto error;
+    }
+    memset(ctx->sendbuf_pfns, -1,
+           NRPAGES(PAGE_BUFFER_SIZE) * sizeof(xen_pfn_t));
+
+    ctx->pfn2cache = calloc(p2m_size, sizeof(struct cache_page *));
+    if (!ctx->pfn2cache)
+    {
+        ERROR("Could not alloc pfn2cache map\n");
+        goto error;
+    }
+
+    ctx->cache = malloc(num_cache_pages * sizeof(struct cache_page));
+    if (!ctx->cache)
+    {
+        ERROR("Could not alloc compression cache\n");
+        goto error;
+    }
+
+    for (i = 0; i < num_cache_pages; i++)
+    {
+        ctx->cache[i].pfn = INVALID_P2M_ENTRY;
+        ctx->cache[i].page = ctx->cache_base + i * XC_PAGE_SIZE;
+        ctx->cache[i].prev = (i == 0) ? NULL : &(ctx->cache[i - 1]);
+        ctx->cache[i].next = ((i+1) == num_cache_pages)? NULL :
+            &(ctx->cache[i + 1]);
+    }
+    ctx->page_list_head = &(ctx->cache[0]);
+    ctx->page_list_tail = &(ctx->cache[num_cache_pages -1]);
+    ctx->dom_pfnlist_size = p2m_size;
+
+    return ctx;
+error:
+    xc_compression_free_context(xch, ctx);
+    return NULL;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xc_domain_restore.c	Thu Dec 01 17:24:12 2011 +0000
@@ -43,6 +43,7 @@
     xen_pfn_t *p2m_batch; /* A table of P2M mappings in the current region.  */
     int completed; /* Set when a consistent image is available */
     int last_checkpoint; /* Set when we should commit to the current checkpoint when it completes. */
+    int compressing; /* Set when sender signals that pages would be sent compressed (for Remus) */
     struct domain_info_context dinfo;
 };
 
@@ -663,6 +664,10 @@
     /* pages is of length nr_physpages, pfn_types is of length nr_pages */
     unsigned int nr_physpages, nr_pages;
 
+    /* checkpoint compression state */
+    int compressing;
+    unsigned long compbuf_pos, compbuf_size;
+
     /* Types of the pfns in the current region */
     unsigned long* pfn_types;
 
@@ -701,6 +706,7 @@
 {
     int count, countpages, oldcount, i;
     void* ptmp;
+    unsigned long compbuf_size;
 
     if ( RDEXACT(fd, &count, sizeof(count)) )
     {
@@ -820,6 +826,40 @@
         }
         return pagebuf_get_one(xch, ctx, buf, fd, dom);
 
+    case XC_SAVE_ID_ENABLE_COMPRESSION:
+        /* We cannot set compression flag directly in pagebuf structure,
+         * since this pagebuf still has uncompressed pages that are yet to
+         * be applied. We enable the compression field in pagebuf structure
+         * after receiving the first tailbuf.
+         */
+        ctx->compressing = 1;
+        // DPRINTF("compression flag received");
+        return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
+    case XC_SAVE_ID_COMPRESSED_DATA:
+
+        /* read the length of compressed chunk coming in */
+        if ( RDEXACT(fd, &compbuf_size, sizeof(unsigned long)) )
+        {
+            PERROR("Error when reading compbuf_size");
+            return -1;
+        }
+        if (!compbuf_size) return 1;
+
+        buf->compbuf_size += compbuf_size;
+        if (!(ptmp = realloc(buf->pages, buf->compbuf_size))) {
+            ERROR("Could not (re)allocate compression buffer");
+            return -1;
+        }
+        buf->pages = ptmp;
+
+        if ( RDEXACT(fd, buf->pages + (buf->compbuf_size - compbuf_size),
+                     compbuf_size) ) {
+            PERROR("Error when reading compression buffer");
+            return -1;
+        }
+        return compbuf_size;
+
     default:
         if ( (count > MAX_BATCH_SIZE) || (count < 0) ) {
             ERROR("Max batch size exceeded (%d). Giving up.", count);
@@ -857,6 +897,13 @@
     if (!countpages)
         return count;
 
+    /* If Remus Checkpoint Compression is turned on, we will only be
+     * receiving the pfn lists now. The compressed pages will come in later,
+     * following a <XC_SAVE_ID_COMPRESSED_DATA, compressedChunkSize> tuple.
+     */
+    if (buf->compressing)
+        return pagebuf_get_one(xch, ctx, buf, fd, dom);
+
     oldcount = buf->nr_physpages;
     buf->nr_physpages += countpages;
     if (!buf->pages) {
@@ -885,6 +932,7 @@
     int rc;
 
     buf->nr_physpages = buf->nr_pages = 0;
+    buf->compbuf_pos = buf->compbuf_size = 0;
 
     do {
         rc = pagebuf_get_one(xch, ctx, buf, fd, dom);
@@ -1102,7 +1150,21 @@
         /* In verify mode, we use a copy; otherwise we work in place */
         page = pagebuf->verify ? (void *)buf : (region_base + i*PAGE_SIZE);
 
-        memcpy(page, pagebuf->pages + (curpage + curbatch) * PAGE_SIZE, PAGE_SIZE);
+        /* Remus - page decompression */
+        if (pagebuf->compressing)
+        {
+            if (xc_compression_uncompress_page(xch, pagebuf->pages,
+                                               pagebuf->compbuf_size,
+                                               &pagebuf->compbuf_pos,
+                                               (char *)page))
+            {
+                ERROR("Failed to uncompress page (pfn=%lx)\n", pfn);
+                goto err_mapped;
+            }
+        }
+        else
+            memcpy(page, pagebuf->pages + (curpage + curbatch) * PAGE_SIZE,
+                   PAGE_SIZE);
 
         pagetype &= XEN_DOMCTL_PFINFO_LTABTYPE_MASK;
 
@@ -1364,6 +1426,7 @@
 
         if ( !ctx->completed ) {
             pagebuf.nr_physpages = pagebuf.nr_pages = 0;
+            pagebuf.compbuf_pos = pagebuf.compbuf_size = 0;
             if ( pagebuf_get_one(xch, ctx, &pagebuf, io_fd, dom) < 0 ) {
                 PERROR("Error when reading batch");
                 goto out;
@@ -1406,6 +1469,7 @@
         }
 
         pagebuf.nr_physpages = pagebuf.nr_pages = 0;
+        pagebuf.compbuf_pos = pagebuf.compbuf_size = 0;
 
         n += j; /* crude stats */
 
@@ -1449,6 +1513,13 @@
          */
         if ( !ctx->last_checkpoint )
             fcntl(io_fd, F_SETFL, orig_io_fd_flags | O_NONBLOCK);
+
+        /*
+         * If sender had sent enable compression flag, switch to compressed
+         * checkpoints mode once the first checkpoint is received.
+         */
+        if (ctx->compressing)
+            pagebuf.compressing = 1;
     }
 
     if (pagebuf.viridian != 0)
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xc_domain_save.c	Thu Dec 01 17:24:12 2011 +0000
@@ -218,6 +218,56 @@
         return noncached_write(xch, ob, fd, buf, len);
 }
 
+static int write_compressed(xc_interface *xch, comp_ctx *compress_ctx,
+                            int dobuf, struct outbuf* ob, int fd)
+{
+    int rc = 0;
+    int header = sizeof(int) + sizeof(unsigned long);
+    int marker = XC_SAVE_ID_COMPRESSED_DATA;
+    unsigned long compbuf_len = 0;
+
+    do
+    {
+        /* check for available space (atleast 8k) */
+        if ((ob->pos + header + XC_PAGE_SIZE * 2) > ob->size)
+        {
+            if (outbuf_flush(xch, ob, fd) < 0)
+            {
+                ERROR("Error when flushing outbuf intermediate");
+                return -1;
+            }
+        }
+
+        rc = xc_compression_compress_pages(xch, compress_ctx,
+                                           ob->buf + ob->pos + header,
+                                           ob->size - ob->pos - header,
+                                           &compbuf_len);
+        if (!rc)
+            return 0;
+
+        if (outbuf_hardwrite(xch, ob, fd, &marker, sizeof(marker)) < 0)
+        {
+            PERROR("Error when writing marker (errno %d)", errno);
+            return -1;
+        }
+
+        if (outbuf_hardwrite(xch, ob, fd, &compbuf_len, sizeof(compbuf_len)) < 0)
+        {
+            PERROR("Error when writing compbuf_len (errno %d)", errno);
+            return -1;
+        }
+
+        ob->pos += (size_t) compbuf_len;
+        if (!dobuf && outbuf_flush(xch, ob, fd) < 0)
+        {
+            ERROR("Error when writing compressed chunk");
+            return -1;
+        }
+    } while (rc != 0);
+
+    return 0;
+}
+
 struct time_stats {
     struct timeval wall;
     long long d0_cpu, d1_cpu;
@@ -815,11 +865,35 @@
 
     unsigned long mfn;
 
-    struct outbuf ob;
+    /* Without checkpoint compression, the dirty pages, pfn arrays
+     * and tailbuf (vcpu ctx, shared info page, etc.)  are written
+     * directly to outbuf. All of this is done while the domain is
+     * suspended.
+     *
+     * When checkpoint compression is enabled, the dirty pages are
+     * buffered, compressed "after" the domain is resumed and then
+     * written to outbuf. Since tailbuf data are collected while a
+     * domain is suspended, they cannot be directly written to the
+     * outbuf as there is no dirty page data preceeding tailbuf.
+     *
+     * So,two output buffers are maintained. Tailbuf data goes into
+     * ob_tailbuf. The dirty pages are compressed after resuming the
+     * domain and written to ob_pagebuf. ob_tailbuf is then appended
+     * to ob_pagebuf and finally flushed out.
+     */
+    struct outbuf ob_pagebuf, ob_tailbuf, *ob = NULL;
     struct save_ctx _ctx;
     struct save_ctx *ctx = &_ctx;
     struct domain_info_context *dinfo = &ctx->dinfo;
 
+    /* Compression context */
+    comp_ctx *compress_ctx= NULL;
+    /* Even if XCFLAGS_CHECKPOINT_COMPRESS is set, we enable compression only
+     * after sending XC_SAVE_ID_ENABLE_COMPRESSION and the tailbuf for
+     * first time.
+     */
+    int compressing = 0;
+
     int completed = 0;
 
     if ( hvm && !callbacks->switch_qemu_logdirty )
@@ -829,7 +903,7 @@
         return 1;
     }
 
-    outbuf_init(xch, &ob, OUTBUF_SIZE);
+    outbuf_init(xch, &ob_pagebuf, OUTBUF_SIZE);
 
     memset(ctx, 0, sizeof(*ctx));
 
@@ -917,6 +991,16 @@
         }
     }
 
+    if ( flags & XCFLAGS_CHECKPOINT_COMPRESS )
+    {
+        if (!(compress_ctx = xc_compression_create_context(xch, dinfo->p2m_size)))
+        {
+            ERROR("Failed to create compression context");
+            goto out;
+        }
+        outbuf_init(xch, &ob_tailbuf, OUTBUF_SIZE/4);
+    }
+
     last_iter = !live;
 
     /* pretend we sent all the pages last iteration */
@@ -1025,9 +1109,11 @@
     }
 
   copypages:
-#define wrexact(fd, buf, len) write_buffer(xch, last_iter, &ob, (fd), (buf), (len))
-#define wruncached(fd, live, buf, len) write_uncached(xch, last_iter, &ob, (fd), (buf), (len))
+#define wrexact(fd, buf, len) write_buffer(xch, last_iter, ob, (fd), (buf), (len))
+#define wruncached(fd, live, buf, len) write_uncached(xch, last_iter, ob, (fd), (buf), (len))
+#define wrcompressed(fd) write_compressed(xch, compress_ctx, last_iter, ob, (fd))
 
+    ob = &ob_pagebuf; /* Holds pfn_types, pages/compressed pages */
     /* Now write out each data page, canonicalising page tables as we go... */
     for ( ; ; )
     {
@@ -1270,7 +1356,7 @@
                 {
                     /* If the page is not a normal data page, write out any
                        run of pages we may have previously acumulated */
-                    if ( run )
+                    if ( !compressing && run )
                     {
                         if ( wruncached(io_fd, live,
                                        (char*)region_base+(PAGE_SIZE*(j-run)), 
@@ -1305,7 +1391,41 @@
                         goto out;
                     }
 
-                    if ( wruncached(io_fd, live, page, PAGE_SIZE) != PAGE_SIZE )
+                    if (compressing)
+                    {
+                        int c_err;
+                        /* Mark pagetable page to be sent uncompressed */
+                        c_err = xc_compression_add_page(xch, compress_ctx, page,
+                                                        pfn, 1 /* raw page */);
+                        if (c_err == -2) /* OOB PFN */
+                        {
+                            ERROR("Could not add pagetable page "
+                                  "(pfn:%" PRIpfn "to page buffer\n", pfn);
+                            goto out;
+                        }
+
+                        if (c_err == -1)
+                        {
+                            /*
+                             * We are out of buffer space to hold dirty
+                             * pages. Compress and flush the current buffer
+                             * to make space. This is a corner case, that
+                             * slows down checkpointing as the compression
+                             * happens while domain is suspended. Happens
+                             * seldom and if you find this occuring
+                             * frequently, increase the PAGE_BUFFER_SIZE
+                             * in xc_compression.c.
+                             */
+                            if (wrcompressed(io_fd) < 0)
+                            {
+                                ERROR("Error when writing compressed"
+                                      " data (4b)\n");
+                                goto out;
+                            }
+                        }
+                    }
+                    else if ( wruncached(io_fd, live, page,
+                                         PAGE_SIZE) != PAGE_SIZE )
                     {
                         PERROR("Error when writing to state file (4b)"
                               " (errno %d)", errno);
@@ -1315,7 +1435,34 @@
                 else
                 {
                     /* We have a normal page: accumulate it for writing. */
-                    run++;
+                    if (compressing)
+                    {
+                        int c_err;
+                        /* For checkpoint compression, accumulate the page in the
+                         * page buffer, to be compressed later.
+                         */
+                        c_err = xc_compression_add_page(xch, compress_ctx, spage,
+                                                        pfn, 0 /* not raw page */);
+
+                        if (c_err == -2) /* OOB PFN */
+                        {
+                            ERROR("Could not add page "
+                                  "(pfn:%" PRIpfn "to page buffer\n", pfn);
+                            goto out;
+                        }
+
+                        if (c_err == -1)
+                        {
+                            if (wrcompressed(io_fd) < 0)
+                            {
+                                ERROR("Error when writing compressed"
+                                      " data (4c)\n");
+                                goto out;
+                            }
+                        }
+                    }
+                    else
+                        run++;
                 }
             } /* end of the write out for this batch */
 
@@ -1423,6 +1570,15 @@
 
     DPRINTF("All memory is saved\n");
 
+    /* After last_iter, buffer the rest of pagebuf & tailbuf data into a
+     * separate output buffer and flush it after the compressed page chunks.
+     */
+    if (compressing)
+    {
+        ob = &ob_tailbuf;
+        ob->pos = 0;
+    }
+
     {
         struct {
             int id;
@@ -1534,6 +1690,25 @@
         }
     }
 
+    /* Enable compression logic on both sides by sending this
+     * one time marker.
+     * NOTE: We could have simplified this procedure by sending
+     * the enable/disable compression flag before the beginning of
+     * the main for loop. But this would break compatibility for
+     * live migration code, with older versions of xen. So we have
+     * to enable it after the last_iter, when the XC_SAVE_ID_*
+     * elements are sent.
+     */
+    if (!compressing && (flags & XCFLAGS_CHECKPOINT_COMPRESS))
+    {
+        i = XC_SAVE_ID_ENABLE_COMPRESSION;
+        if ( wrexact(io_fd, &i, sizeof(int)) )
+        {
+            PERROR("Error when writing enable_compression marker");
+            goto out;
+        }
+    }
+
     /* Zero terminate */
     i = 0;
     if ( wrexact(io_fd, &i, sizeof(int)) )
@@ -1778,14 +1953,38 @@
     if ( !rc && callbacks->postcopy )
         callbacks->postcopy(callbacks->data);
 
+    /* guest has been resumed. Now we can compress data
+     * at our own pace.
+     */
+    if (!rc && compressing)
+    {
+        ob = &ob_pagebuf;
+        if (wrcompressed(io_fd) < 0)
+        {
+            ERROR("Error when writing compressed data, after postcopy\n");
+            rc = 1;
+            goto out;
+        }
+        /* Append the tailbuf data to the main outbuf */
+        if ( wrexact(io_fd, ob_tailbuf.buf, ob_tailbuf.pos) )
+        {
+            rc = 1;
+            PERROR("Error when copying tailbuf into outbuf");
+            goto out;
+        }
+    }
+
     /* Flush last write and discard cache for file. */
-    if ( outbuf_flush(xch, &ob, io_fd) < 0 ) {
+    if ( outbuf_flush(xch, ob, io_fd) < 0 ) {
         PERROR("Error when flushing output buffer");
         rc = 1;
     }
 
     discard_file_cache(xch, io_fd, 1 /* flush */);
 
+    /* Enable compression now, finally */
+    compressing = (flags & XCFLAGS_CHECKPOINT_COMPRESS);
+
     /* checkpoint_cb can spend arbitrarily long in between rounds */
     if (!rc && callbacks->checkpoint &&
         callbacks->checkpoint(callbacks->data) > 0)
@@ -1827,6 +2026,9 @@
             DPRINTF("Warning - couldn't disable qemu log-dirty mode");
     }
 
+    if (compress_ctx)
+        xc_compression_free_context(xch, compress_ctx);
+
     if ( live_shinfo )
         munmap(live_shinfo, PAGE_SIZE);
 
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xc_linux.c
--- a/tools/libxc/xc_linux.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xc_linux.c	Thu Dec 01 17:24:12 2011 +0000
@@ -55,6 +55,18 @@
     errno = saved_errno;
 }
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
+{
+    int ret;
+    void *ptr;
+
+    ret = posix_memalign(&ptr, alignment, size);
+    if (ret != 0 || !ptr)
+        return NULL;
+
+    return ptr;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xc_linux_osdep.c
--- a/tools/libxc/xc_linux_osdep.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xc_linux_osdep.c	Thu Dec 01 17:24:12 2011 +0000
@@ -91,10 +91,9 @@
 {
     size_t size = npages * XC_PAGE_SIZE;
     void *p;
-    int ret;
 
-    ret = posix_memalign(&p, XC_PAGE_SIZE, size);
-    if (ret != 0 || !p)
+    p = xc_memalign(xch, XC_PAGE_SIZE, size);
+    if (!p)
         return NULL;
 
     if ( mlock(p, size) < 0 )
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xc_minios.c
--- a/tools/libxc/xc_minios.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xc_minios.c	Thu Dec 01 17:24:12 2011 +0000
@@ -73,7 +73,7 @@
 
 static void *minios_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
 {
-    return memalign(PAGE_SIZE, npages * PAGE_SIZE);
+    return xc_memalign(xch, PAGE_SIZE, npages * PAGE_SIZE);
 }
 
 static void minios_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)
@@ -437,6 +437,11 @@
         fsync(fd);
 }
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
+{
+    return memalign(alignment, size);
+}
+
 static xc_osdep_handle minios_gnttab_open(xc_gnttab *xcg)
 {
     int fd = alloc_fd(FTYPE_GNTMAP);
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xc_netbsd.c
--- a/tools/libxc/xc_netbsd.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xc_netbsd.c	Thu Dec 01 17:24:12 2011 +0000
@@ -71,8 +71,9 @@
 static void *netbsd_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
 {
     size_t size = npages * XC_PAGE_SIZE;
-    void *p = valloc(size);
+    void *p;
 
+    p = xc_memalign(xch, XC_PAGE_SIZE, size);
     if (!p)
         return NULL;
 
@@ -378,6 +379,11 @@
     errno = saved_errno;
 }
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
+{
+    return valloc(size);
+}
+
 static struct xc_osdep_ops *netbsd_osdep_init(xc_interface *xch, enum xc_osdep_type type)
 {
     switch ( type )
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xc_solaris.c
--- a/tools/libxc/xc_solaris.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xc_solaris.c	Thu Dec 01 17:24:12 2011 +0000
@@ -70,7 +70,7 @@
 
 static void *solaris_privcmd_alloc_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, int npages)
 {
-    return memalign(XC_PAGE_SIZE, npages * XC_PAGE_SIZE);
+    return xc_memalign(xch, XC_PAGE_SIZE, npages * XC_PAGE_SIZE);
 }
 
 static void solaris_privcmd_free_hypercall_buffer(xc_interface *xch, xc_osdep_handle h, void *ptr, int npages)
@@ -314,6 +314,11 @@
     // TODO: Implement for Solaris!
 }
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
+{
+    return memalign(alignment, size);
+}
+
 static struct xc_osdep_ops *solaris_osdep_init(xc_interface *xch, enum xc_osdep_type type)
 {
     switch ( type )
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xenctrl.h	Thu Dec 01 17:24:12 2011 +0000
@@ -1156,6 +1156,8 @@
                       uint64_t *time,
                       xc_hypercall_buffer_t *data);
 
+void *xc_memalign(xc_interface *xch, size_t alignment, size_t size);
+
 /**
  * Memory maps a range within one domain to a local address range.  Mappings
  * should be unmapped with munmap and should follow the same rules as mmap
@@ -1935,4 +1937,64 @@
                         int verbose);
 /* Useful for callers who also use libelf. */
 
+/**
+ * Checkpoint Compression
+ */
+typedef struct compression_ctx comp_ctx;
+comp_ctx *xc_compression_create_context(xc_interface *xch,
+					unsigned long p2m_size);
+void xc_compression_free_context(xc_interface *xch, comp_ctx *ctx);
+
+/**
+ * Add a page to compression page buffer, to be compressed later.
+ *
+ * returns 0 if the page was successfully added to the page buffer
+ *
+ * returns -1 if there is no space in buffer. In this case, the
+ *  application should call xc_compression_compress_pages to compress
+ *  the buffer (or atleast part of it), thereby freeing some space in
+ *  the page buffer.
+ *
+ * returns -2 if the pfn is out of bounds, where the bound is p2m_size
+ *  parameter passed during xc_compression_create_context.
+ */
+int xc_compression_add_page(xc_interface *xch, comp_ctx *ctx, char *page,
+			    unsigned long pfn, int israw);
+
+/**
+ * Delta compress pages in the compression buffer and inserts the
+ * compressed data into the supplied compression buffer compbuf, whose
+ * size is compbuf_size.
+ * After compression, the pages are copied to the internal LRU cache.
+ *
+ * This function compresses as many pages as possible into the
+ * supplied compression buffer. It maintains an internal iterator to
+ * keep track of pages in the input buffer that are yet to be compressed.
+ *
+ * returns -1 if the compression buffer has run out of space.  
+ * returns 1 on success.
+ * returns 0 if no more pages are left to be compressed.
+ *  When the return value is non-zero, compbuf_len indicates the actual
+ *  amount of data present in compbuf (<=compbuf_size).
+ */
+int xc_compression_compress_pages(xc_interface *xch, comp_ctx *ctx,
+				  char *compbuf, unsigned long compbuf_size,
+				  unsigned long *compbuf_len);
+
+/**
+ * Resets the internal page buffer that holds dirty pages before compression.
+ * Also resets the iterators.
+ */
+void xc_compression_reset_pagebuf(xc_interface *xch, comp_ctx *ctx);
+
+/**
+ * Caller must supply the compression buffer (compbuf),
+ * its size (compbuf_size) and a reference to index variable (compbuf_pos)
+ * that is used internally. Each call pulls out one page from the compressed
+ * chunk and copies it to dest.
+ */
+int xc_compression_uncompress_page(xc_interface *xch, char *compbuf,
+				   unsigned long compbuf_size,
+				   unsigned long *compbuf_pos, char *dest);
+
 #endif /* XENCTRL_H */
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xenguest.h	Thu Dec 01 17:24:12 2011 +0000
@@ -27,6 +27,7 @@
 #define XCFLAGS_DEBUG     2
 #define XCFLAGS_HVM       4
 #define XCFLAGS_STDVGA    8
+#define XCFLAGS_CHECKPOINT_COMPRESS    16
 #define X86_64_B_SIZE   64 
 #define X86_32_B_SIZE   32
 
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxc/xg_save_restore.h
--- a/tools/libxc/xg_save_restore.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxc/xg_save_restore.h	Thu Dec 01 17:24:12 2011 +0000
@@ -67,7 +67,7 @@
  *
  *   consists of p2m_size bytes comprising an array of xen_pfn_t sized entries.
  *
- * BODY PHASE
+ * BODY PHASE - Format A (for live migration or Remus without compression)
  * ----------
  *
  * A series of chunks with a common header:
@@ -87,6 +87,122 @@
  *
  * If chunk type is 0 then body phase is complete.
  *
+ *
+ * BODY PHASE - Format B (for Remus with compression)
+ * ----------
+ *
+ * A series of chunks with a common header:
+ *   int              : chunk type
+ *
+ * If the chunk type is +ve then chunk contains array of PFNs corresponding
+ * to guest memory and type contains the number of PFNs in the batch:
+ *
+ *     unsigned long[]  : PFN array, length == number of pages in batch
+ *                        Each entry consists of XEN_DOMCTL_PFINFO_*
+ *                        in bits 31-28 and the PFN number in bits 27-0.
+ *
+ * If the chunk type is -ve then chunk consists of one of a number of
+ * metadata types.  See definitions of XC_SAVE_ID_* below.
+ *
+ * If the chunk type is -ve and equals XC_SAVE_ID_COMPRESSED_DATA, then the
+ * chunk consists of compressed page data, in the following format:
+ *
+ *     unsigned long        : Size of the compressed chunk to follow
+ *     compressed data :      variable length data of size indicated above.
+ *                            This chunk consists of compressed page data.
+ *                            The number of pages in one chunk depends on
+ *                            the amount of space available in the sender's
+ *                            output buffer.
+ *
+ * Format of compressed data:
+ *   compressed_data = <deltas>*
+ *   delta           = <marker, run*>
+ *   marker          = (RUNFLAG|SKIPFLAG) bitwise-or RUNLEN [1 byte marker]
+ *   RUNFLAG         = 0
+ *   SKIPFLAG        = 1 << 7
+ *   RUNLEN          = 7-bit unsigned value indicating number of WORDS in the run
+ *   run             = string of bytes of length sizeof(WORD) * RUNLEN
+ *
+ *    If marker contains RUNFLAG, then RUNLEN * sizeof(WORD) bytes of data following
+ *   the marker is copied into the target page at the appropriate offset indicated by
+ *   the offset_ptr
+ *    If marker contains SKIPFLAG, then the offset_ptr is advanced
+ *   by RUNLEN * sizeof(WORD).
+ *
+ * If chunk type is 0 then body phase is complete.
+ *
+ * There can be one or more chunks with type XC_SAVE_ID_COMPRESSED_DATA,
+ * containing compressed pages. The compressed chunks are collated to form
+ * one single compressed chunk for the entire iteration. The number of pages
+ * present in this final compressed chunk will be equal to the total number
+ * of valid PFNs specified by the +ve chunks.
+ *
+ * At the sender side, compressed pages are inserted into the output stream
+ * in the same order as they would have been if compression logic was absent.
+ *
+ * Until last iteration, the BODY is sent in Format A, to maintain live
+ * migration compatibility with receivers of older Xen versions.
+ * At the last iteration, if Remus compression was enabled, the sender sends
+ * a trigger, XC_SAVE_ID_ENABLE_COMPRESSION to tell the receiver to parse the
+ * BODY in Format B from the next iteration onwards.
+ *
+ * An example sequence of chunks received in Format B:
+ *     +16                              +ve chunk
+ *     unsigned long[16]                PFN array
+ *     +100                             +ve chunk
+ *     unsigned long[100]               PFN array
+ *     +50                              +ve chunk
+ *     unsigned long[50]                PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA       TAG
+ *       N                              Length of compressed data
+ *       N bytes of DATA                Decompresses to 166 pages
+ *
+ *     XC_SAVE_ID_*                     other xc save chunks
+ *     0                                END BODY TAG
+ *
+ * Corner case with checkpoint compression:
+ *     At sender side, after pausing the domain, dirty pages are usually
+ *   copied out to a temporary buffer. After the domain is resumed,
+ *   compression is done and the compressed chunk(s) are sent, followed by
+ *   other XC_SAVE_ID_* chunks.
+ *     If the temporary buffer gets full while scanning for dirty pages,
+ *   the sender stops buffering of dirty pages, compresses the temporary
+ *   buffer and sends the compressed data with XC_SAVE_ID_COMPRESSED_DATA.
+ *   The sender then resumes the buffering of dirty pages and continues
+ *   scanning for the dirty pages.
+ *     For e.g., assume that the temporary buffer can hold 4096 pages and
+ *   there are 5000 dirty pages. The following is the sequence of chunks
+ *   that the receiver will see:
+ *
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *     +1024                       +ve chunk
+ *     unsigned long[1024]         PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA  TAG
+ *      N                          Length of compressed data
+ *      N bytes of DATA            Decompresses to 4096 pages
+ *
+ *     +4                          +ve chunk
+ *     unsigned long[4]            PFN array
+ *
+ *     XC_SAVE_ID_COMPRESSED_DATA  TAG
+ *      M                          Length of compressed data
+ *      M bytes of DATA            Decompresses to 4 pages
+ *
+ *     XC_SAVE_ID_*                other xc save chunks
+ *     0                           END BODY TAG
+ *
+ *     In other words, XC_SAVE_ID_COMPRESSED_DATA can be interleaved with
+ *   +ve chunks arbitrarily. But at the receiver end, the following condition
+ *   always holds true until the end of BODY PHASE:
+ *    num(PFN entries +ve chunks) >= num(pages received in compressed form)
+ *
  * TAIL PHASE
  * ----------
  *
@@ -135,6 +251,8 @@
 #define XC_SAVE_ID_LAST_CHECKPOINT    -9 /* Commit to restoring after completion of current iteration. */
 #define XC_SAVE_ID_HVM_ACPI_IOPORTS_LOCATION -10
 #define XC_SAVE_ID_HVM_VIRIDIAN       -11
+#define XC_SAVE_ID_COMPRESSED_DATA    -12 /* Marker to indicate arrival of compressed data */
+#define XC_SAVE_ID_ENABLE_COMPRESSION -13 /* Marker to enable compression logic at receiver side */
 
 /*
 ** We process save/restore/migrate in batches of pages; the below
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxl/libxl.c	Thu Dec 01 17:24:12 2011 +0000
@@ -3330,6 +3330,19 @@
     return 0;
 }
 
+int libxl_fd_set_cloexec(int fd)
+{
+    int flags = 0;
+
+    if ((flags = fcntl(fd, F_GETFD)) == -1) {
+        flags = 0;
+    }
+    if ((flags & FD_CLOEXEC)) {
+        return 0;
+    }
+    return fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
+}
+
 /*
  * Local variables:
  * mode: C
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxl/libxl.h	Thu Dec 01 17:24:12 2011 +0000
@@ -635,6 +635,9 @@
 const char *libxl_run_dir_path(void);
 const char *libxl_xenpaging_dir_path(void);
 
+/* misc */
+int libxl_fd_set_cloexec(int fd);
+
 #endif /* LIBXL_H */
 
 /*
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxl/libxl_internal.c	Thu Dec 01 17:24:12 2011 +0000
@@ -306,19 +306,6 @@
     return 0;
 }
 
-int libxl__fd_set_cloexec(int fd)
-{
-    int flags = 0;
-
-    if ((flags = fcntl(fd, F_GETFD)) == -1) {
-        flags = 0;
-    }
-    if ((flags & FD_CLOEXEC)) {
-        return 0;
-    }
-    return fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
-}
-
 libxl_device_model_version libxl__device_model_version_running(libxl__gc *gc,
                                                                uint32_t domid)
 {
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxl/libxl_internal.h	Thu Dec 01 17:24:12 2011 +0000
@@ -503,7 +503,6 @@
 
 _hidden int libxl__file_reference_map(libxl_file_reference *f);
 _hidden int libxl__file_reference_unmap(libxl_file_reference *f);
-_hidden int libxl__fd_set_cloexec(int fd);
 
 _hidden int libxl__e820_alloc(libxl__gc *gc, uint32_t domid, libxl_domain_config *d_config);
 
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxl/libxl_qmp.c
--- a/tools/libxl/libxl_qmp.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxl/libxl_qmp.c	Thu Dec 01 17:24:12 2011 +0000
@@ -324,7 +324,7 @@
     if (fcntl(qmp->qmp_fd, F_SETFL, flags | O_NONBLOCK) == -1) {
         return -1;
     }
-    libxl__fd_set_cloexec(qmp->qmp_fd);
+    libxl_fd_set_cloexec(qmp->qmp_fd);
 
     memset(&qmp->addr, 0, sizeof (&qmp->addr));
     qmp->addr.sun_family = AF_UNIX;
diff -r f25a004a6de8 -r f30a33c5b5bd tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/libxl/xl_cmdimpl.c	Thu Dec 01 17:24:12 2011 +0000
@@ -1459,8 +1459,12 @@
         union { uint32_t u32; char b[4]; } u32buf;
         uint32_t badflags;
 
-        restore_fd = migrate_fd >= 0 ? migrate_fd :
-            open(restore_file, O_RDONLY);
+        if (migrate_fd >= 0) {
+            restore_fd = migrate_fd;
+        } else {
+            restore_fd = open(restore_file, O_RDONLY);
+            libxl_fd_set_cloexec(restore_fd);
+        }
 
         CHK_ERRNO( libxl_read_exactly(ctx, restore_fd, &hdr,
                    sizeof(hdr), restore_file, "header") );
diff -r f25a004a6de8 -r f30a33c5b5bd tools/python/xen/lowlevel/checkpoint/checkpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Thu Dec 01 17:24:12 2011 +0000
@@ -104,13 +104,14 @@
   PyObject* postcopy_cb = NULL;
   PyObject* checkpoint_cb = NULL;
   unsigned int interval = 0;
+  unsigned int flags = 0;
 
   int fd;
   struct save_callbacks callbacks;
   int rc;
 
-  if (!PyArg_ParseTuple(args, "O|OOOI", &iofile, &suspend_cb, &postcopy_cb,
-                       &checkpoint_cb, &interval))
+  if (!PyArg_ParseTuple(args, "O|OOOII", &iofile, &suspend_cb, &postcopy_cb,
+			&checkpoint_cb, &interval, &flags))
     return NULL;
 
   self->interval = interval;
@@ -160,7 +161,7 @@
   callbacks.data = self;
 
   self->threadstate = PyEval_SaveThread();
-  rc = checkpoint_start(&self->cps, fd, &callbacks);
+  rc = checkpoint_start(&self->cps, fd, &callbacks, flags);
   PyEval_RestoreThread(self->threadstate);
 
   if (rc < 0) {
diff -r f25a004a6de8 -r f30a33c5b5bd tools/python/xen/lowlevel/checkpoint/checkpoint.h
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Thu Dec 01 17:24:12 2011 +0000
@@ -40,13 +40,15 @@
     timer_t timer;
 } checkpoint_state;
 
+#define CHECKPOINT_FLAGS_COMPRESSION 1
 char* checkpoint_error(checkpoint_state* s);
 
 void checkpoint_init(checkpoint_state* s);
 int checkpoint_open(checkpoint_state* s, unsigned int domid);
 void checkpoint_close(checkpoint_state* s);
 int checkpoint_start(checkpoint_state* s, int fd,
-                    struct save_callbacks* callbacks);
+		     struct save_callbacks* callbacks,
+		     unsigned int remus_flags);
 int checkpoint_suspend(checkpoint_state* s);
 int checkpoint_resume(checkpoint_state* s);
 int checkpoint_postflush(checkpoint_state* s);
diff -r f25a004a6de8 -r f30a33c5b5bd tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Thu Dec 01 17:24:12 2011 +0000
@@ -170,7 +170,8 @@
 }
 
 int checkpoint_start(checkpoint_state* s, int fd,
-                    struct save_callbacks* callbacks)
+		     struct save_callbacks* callbacks,
+		     unsigned int remus_flags)
 {
     int hvm, rc;
     int flags = XCFLAGS_LIVE;
@@ -188,6 +189,8 @@
        if (switch_qemu_logdirty(s, 1))
            return -1;
     }
+    if (remus_flags & CHECKPOINT_FLAGS_COMPRESSION)
+      flags |= XCFLAGS_CHECKPOINT_COMPRESS;
 
     callbacks->switch_qemu_logdirty = noop_switch_logdirty;
 
diff -r f25a004a6de8 -r f30a33c5b5bd tools/python/xen/remus/save.py
--- a/tools/python/xen/remus/save.py	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/python/xen/remus/save.py	Thu Dec 01 17:24:12 2011 +0000
@@ -133,7 +133,7 @@
 
 class Saver(object):
     def __init__(self, domid, fd, suspendcb=None, resumecb=None,
-                 checkpointcb=None, interval=0):
+                 checkpointcb=None, interval=0, flags=0):
         """Create a Saver object for taking guest checkpoints.
         domid:        name, number or UUID of a running domain
         fd:           a stream to which checkpoint data will be written.
@@ -141,12 +141,14 @@
         resumecb:     callback invoked before guest resumes
         checkpointcb: callback invoked when a checkpoint is complete. Return
                       True to take another checkpoint, or False to stop.
+        flags:        Remus flags to be passed to xc_domain_save
         """
         self.fd = fd
         self.suspendcb = suspendcb
         self.resumecb = resumecb
         self.checkpointcb = checkpointcb
         self.interval = interval
+        self.flags = flags
 
         self.vm = vm.VM(domid)
 
@@ -164,7 +166,8 @@
             try:
                 self.checkpointer.open(self.vm.domid)
                 self.checkpointer.start(self.fd, self.suspendcb, self.resumecb,
-                                        self.checkpointcb, self.interval)
+                                        self.checkpointcb, self.interval,
+                                        self.flags)
             except xen.lowlevel.checkpoint.error, e:
                 raise CheckpointError(e)
         finally:
diff -r f25a004a6de8 -r f30a33c5b5bd tools/remus/remus
--- a/tools/remus/remus	Thu Dec 01 17:21:24 2011 +0000
+++ b/tools/remus/remus	Thu Dec 01 17:24:12 2011 +0000
@@ -16,6 +16,9 @@
 class CfgException(Exception): pass
 
 class Cfg(object):
+
+    REMUS_FLAGS_COMPRESSION = 1
+
     def __init__(self):
         # must be set
         self.domid = 0
@@ -25,6 +28,7 @@
         self.port = XendOptions.instance().get_xend_relocation_port()
         self.interval = 200
         self.netbuffer = True
+        self.flags = self.REMUS_FLAGS_COMPRESSION
         self.timer = False
 
         parser = optparse.OptionParser()
@@ -38,6 +42,8 @@
                           help='replicate to /dev/null (no disk checkpoints, only memory & net buffering)')
         parser.add_option('', '--no-net', dest='nonet', action='store_true',
                           help='run without net buffering (benchmark option)')
+        parser.add_option('', '--no-compression', dest='nocompress', action='store_true',
+                          help='run without checkpoint compression')
         parser.add_option('', '--timer', dest='timer', action='store_true',
                           help='force pause at checkpoint interval (experimental)')
         self.parser = parser
@@ -56,6 +62,8 @@
             self.nullremus = True
         if opts.nonet:
             self.netbuffer = False
+        if opts.nocompress:
+            self.flags &= ~self.REMUS_FLAGS_COMPRESSION
         if opts.timer:
             self.timer = True
 
@@ -190,7 +198,7 @@
     rc = 0
 
     checkpointer = save.Saver(cfg.domid, fd, postsuspend, preresume, commit,
-                              interval)
+                              interval, cfg.flags)
 
     try:
         checkpointer.start()
diff -r f25a004a6de8 -r f30a33c5b5bd xen/arch/x86/Makefile
--- a/xen/arch/x86/Makefile	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/arch/x86/Makefile	Thu Dec 01 17:24:12 2011 +0000
@@ -30,9 +30,10 @@
 obj-y += msi.o
 obj-y += ioport_emulate.o
 obj-y += irq.o
-obj-y += microcode.o
 obj-y += microcode_amd.o
 obj-y += microcode_intel.o
+# This must come after the vendor specific files.
+obj-y += microcode.o
 obj-y += mm.o
 obj-y += mpparse.o
 obj-y += nmi.o
diff -r f25a004a6de8 -r f30a33c5b5bd xen/arch/x86/efi/boot.c
--- a/xen/arch/x86/efi/boot.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/arch/x86/efi/boot.c	Thu Dec 01 17:24:12 2011 +0000
@@ -49,6 +49,7 @@
 static struct file __initdata cfg;
 static struct file __initdata kernel;
 static struct file __initdata ramdisk;
+static struct file __initdata ucode;
 static struct file __initdata xsm;
 
 static multiboot_info_t __initdata mbi = {
@@ -174,6 +175,8 @@
         efi_bs->FreePages(kernel.addr, PFN_UP(kernel.size));
     if ( ramdisk.addr )
         efi_bs->FreePages(ramdisk.addr, PFN_UP(ramdisk.size));
+    if ( ucode.addr )
+        efi_bs->FreePages(ucode.addr, PFN_UP(ucode.size));
     if ( xsm.addr )
         efi_bs->FreePages(xsm.addr, PFN_UP(xsm.size));
 
@@ -806,6 +809,17 @@
         efi_bs->FreePool(name.w);
     }
 
+    name.s = get_value(&cfg, section.s, "ucode");
+    if ( !name.s )
+        name.s = get_value(&cfg, "global", "ucode");
+    if ( name.s )
+    {
+        microcode_set_module(mbi.mods_count);
+        split_value(name.s);
+        read_file(dir_handle, s2w(&name), &ucode);
+        efi_bs->FreePool(name.w);
+    }
+
     name.s = get_value(&cfg, section.s, "xsm");
     if ( name.s )
     {
diff -r f25a004a6de8 -r f30a33c5b5bd xen/arch/x86/microcode.c
--- a/xen/arch/x86/microcode.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/arch/x86/microcode.c	Thu Dec 01 17:24:12 2011 +0000
@@ -22,20 +22,56 @@
  */
 
 #include <xen/config.h>
+#include <xen/cpu.h>
 #include <xen/lib.h>
 #include <xen/kernel.h>
 #include <xen/init.h>
+#include <xen/notifier.h>
 #include <xen/sched.h>
 #include <xen/smp.h>
+#include <xen/softirq.h>
 #include <xen/spinlock.h>
+#include <xen/tasklet.h>
 #include <xen/guest_access.h>
 
-#include <asm/current.h>
 #include <asm/msr.h>
-#include <asm/uaccess.h>
 #include <asm/processor.h>
+#include <asm/setup.h>
 #include <asm/microcode.h>
 
+static module_t __initdata ucode_mod;
+static void *(*__initdata ucode_mod_map)(const module_t *);
+static unsigned int __initdata ucode_mod_idx;
+static bool_t __initdata ucode_mod_forced;
+static cpumask_t __initdata init_mask;
+
+void __init microcode_set_module(unsigned int idx)
+{
+    ucode_mod_idx = idx;
+    ucode_mod_forced = 1;
+}
+
+static void __init parse_ucode(char *s)
+{
+    if ( !ucode_mod_forced )
+        ucode_mod_idx = simple_strtoul(s, NULL, 0);
+}
+custom_param("ucode", parse_ucode);
+
+void __init microcode_grab_module(
+    unsigned long *module_map,
+    const multiboot_info_t *mbi,
+    void *(*map)(const module_t *))
+{
+    module_t *mod = (module_t *)__va(mbi->mods_addr);
+
+    if ( !ucode_mod_idx || ucode_mod_idx >= mbi->mods_count ||
+         !__test_and_clear_bit(ucode_mod_idx, module_map) )
+        return;
+    ucode_mod = mod[ucode_mod_idx];
+    ucode_mod_map = map;
+}
+
 const struct microcode_ops *microcode_ops;
 
 static DEFINE_SPINLOCK(microcode_mutex);
@@ -69,30 +105,50 @@
     int err;
     struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
     struct cpu_signature nsig;
+    unsigned int cpu2;
 
-    if ( !uci->mc.mc_valid )
-        return -EIO;
+    spin_lock(&microcode_mutex);
 
-    /*
-     * Let's verify that the 'cached' ucode does belong
-     * to this cpu (a bit of paranoia):
-     */
-    err = microcode_ops->collect_cpu_info(cpu, &nsig);
+    err = microcode_ops->collect_cpu_info(cpu, &uci->cpu_sig);
     if ( err )
     {
-        microcode_fini_cpu(cpu);
+        __microcode_fini_cpu(cpu);
+        spin_unlock(&microcode_mutex);
         return err;
     }
 
-    if ( microcode_ops->microcode_resume_match(cpu, &nsig) )
+    if ( uci->mc.mc_valid )
     {
-        return microcode_ops->apply_microcode(cpu);
+        err = microcode_ops->microcode_resume_match(cpu, uci->mc.mc_valid);
+        if ( err >= 0 )
+        {
+            if ( err )
+                err = microcode_ops->apply_microcode(cpu);
+            spin_unlock(&microcode_mutex);
+            return err;
+        }
     }
-    else
+
+    nsig = uci->cpu_sig;
+    __microcode_fini_cpu(cpu);
+    uci->cpu_sig = nsig;
+
+    err = -EIO;
+    for_each_online_cpu ( cpu2 )
     {
-        microcode_fini_cpu(cpu);
-        return -EIO;
+        uci = &per_cpu(ucode_cpu_info, cpu2);
+        if ( uci->mc.mc_valid &&
+             microcode_ops->microcode_resume_match(cpu, uci->mc.mc_valid) > 0 )
+        {
+            err = microcode_ops->apply_microcode(cpu);
+            break;
+        }
     }
+
+    __microcode_fini_cpu(cpu);
+    spin_unlock(&microcode_mutex);
+
+    return err;
 }
 
 static int microcode_update_cpu(const void *buf, size_t size)
@@ -162,3 +218,78 @@
 
     return continue_hypercall_on_cpu(info->cpu, do_microcode_update, info);
 }
+
+static void __init _do_microcode_update(unsigned long data)
+{
+    microcode_update_cpu((void *)data, ucode_mod.mod_end);
+    cpumask_set_cpu(smp_processor_id(), &init_mask);
+}
+
+static int __init microcode_init(void)
+{
+    void *data;
+    static struct tasklet __initdata tasklet;
+    unsigned int cpu;
+
+    if ( !microcode_ops || !ucode_mod.mod_end )
+        return 0;
+
+    data = ucode_mod_map(&ucode_mod);
+    if ( !data )
+        return -ENOMEM;
+
+    softirq_tasklet_init(&tasklet, _do_microcode_update, (unsigned long)data);
+
+    for_each_online_cpu ( cpu )
+    {
+        tasklet_schedule_on_cpu(&tasklet, cpu);
+        do {
+            process_pending_softirqs();
+        } while ( !cpumask_test_cpu(cpu, &init_mask) );
+    }
+
+    ucode_mod_map(NULL);
+
+    return 0;
+}
+__initcall(microcode_init);
+
+static int microcode_percpu_callback(
+    struct notifier_block *nfb, unsigned long action, void *hcpu)
+{
+    unsigned int cpu = (unsigned long)hcpu;
+
+    switch ( action )
+    {
+    case CPU_DEAD:
+        microcode_fini_cpu(cpu);
+        break;
+    }
+
+    return NOTIFY_DONE;
+}
+
+static struct notifier_block microcode_percpu_nfb = {
+    .notifier_call = microcode_percpu_callback,
+};
+
+static int __init microcode_presmp_init(void)
+{
+    if ( microcode_ops )
+    {
+        if ( ucode_mod.mod_end )
+        {
+            void *data = ucode_mod_map(&ucode_mod);
+
+            if ( data )
+                microcode_update_cpu(data, ucode_mod.mod_end);
+
+            ucode_mod_map(NULL);
+        }
+
+        register_cpu_notifier(&microcode_percpu_nfb);
+    }
+
+    return 0;
+}
+presmp_initcall(microcode_presmp_init);
diff -r f25a004a6de8 -r f30a33c5b5bd xen/arch/x86/microcode_amd.c
--- a/xen/arch/x86/microcode_amd.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/arch/x86/microcode_amd.c	Thu Dec 01 17:24:12 2011 +0000
@@ -23,27 +23,53 @@
 #include <xen/spinlock.h>
 
 #include <asm/msr.h>
-#include <asm/uaccess.h>
 #include <asm/processor.h>
 #include <asm/microcode.h>
 
 #define pr_debug(x...) ((void)0)
 
+struct equiv_cpu_entry {
+    uint32_t installed_cpu;
+    uint32_t fixed_errata_mask;
+    uint32_t fixed_errata_compare;
+    uint16_t equiv_cpu;
+    uint16_t reserved;
+} __attribute__((packed));
+
+struct microcode_header_amd {
+    uint32_t data_code;
+    uint32_t patch_id;
+    uint8_t  mc_patch_data_id[2];
+    uint8_t  mc_patch_data_len;
+    uint8_t  init_flag;
+    uint32_t mc_patch_data_checksum;
+    uint32_t nb_dev_id;
+    uint32_t sb_dev_id;
+    uint16_t processor_rev_id;
+    uint8_t  nb_rev_id;
+    uint8_t  sb_rev_id;
+    uint8_t  bios_api_rev;
+    uint8_t  reserved1[3];
+    uint32_t match_reg[8];
+} __attribute__((packed));
+
 #define UCODE_MAGIC                0x00414d44
 #define UCODE_EQUIV_CPU_TABLE_TYPE 0x00000000
 #define UCODE_UCODE_TYPE           0x00000001
 
 #define UCODE_MAX_SIZE          (2048)
-#define DEFAULT_UCODE_DATASIZE  (896)
 #define MC_HEADER_SIZE          (sizeof(struct microcode_header_amd))
-#define DEFAULT_UCODE_TOTALSIZE (DEFAULT_UCODE_DATASIZE + MC_HEADER_SIZE)
-#define DWSIZE                  (sizeof(uint32_t))
+
+struct microcode_amd {
+    struct microcode_header_amd hdr;
+    unsigned int mpb[(UCODE_MAX_SIZE - MC_HEADER_SIZE) / 4];
+    unsigned int equiv_cpu_table_size;
+    struct equiv_cpu_entry equiv_cpu_table[];
+};
 
 /* serialize access to the physical write */
 static DEFINE_SPINLOCK(microcode_update_lock);
 
-struct equiv_cpu_entry *equiv_cpu_table;
-
 static int collect_cpu_info(int cpu, struct cpu_signature *csig)
 {
     struct cpuinfo_x86 *c = &cpu_data[cpu];
@@ -65,10 +91,11 @@
     return 0;
 }
 
-static int microcode_fits(void *mc, int cpu)
+static int microcode_fits(const struct microcode_amd *mc_amd, int cpu)
 {
     struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
-    struct microcode_header_amd *mc_header = mc;
+    const struct microcode_header_amd *mc_header = &mc_amd->hdr;
+    const struct equiv_cpu_entry *equiv_cpu_table = mc_amd->equiv_cpu_table;
     unsigned int current_cpu_id;
     unsigned int equiv_cpu_id = 0x0;
     unsigned int i;
@@ -99,7 +126,7 @@
     }
 
     if ( mc_header->patch_id <= uci->cpu_sig.rev )
-        return -EINVAL;
+        return 0;
 
     printk(KERN_DEBUG "microcode: CPU%d found a matching microcode "
            "update with version 0x%x (current=0x%x)\n",
@@ -186,17 +213,15 @@
     return 0;
 }
 
-static int install_equiv_cpu_table(const void *buf, uint32_t size,
-                                   unsigned long *offset)
+static int install_equiv_cpu_table(
+    struct microcode_amd *mc_amd,
+    const uint32_t *buf_pos,
+    unsigned long *offset)
 {
-    const uint32_t *buf_pos = buf;
-    unsigned long off;
-
-    off = *offset;
-    *offset = 0;
+    uint32_t size = buf_pos[2];
 
     /* No more data */
-    if ( off >= size )
+    if ( size + 12 >= *offset )
         return -EINVAL;
 
     if ( buf_pos[1] != UCODE_EQUIV_CPU_TABLE_TYPE )
@@ -213,15 +238,8 @@
         return -EINVAL;
     }
 
-    equiv_cpu_table = xmalloc_bytes(size);
-    if ( equiv_cpu_table == NULL )
-    {
-        printk(KERN_ERR "microcode: error, can't allocate "
-               "memory for equiv CPU table\n");
-        return -ENOMEM;
-    }
-
-    memcpy(equiv_cpu_table, (const void *)&buf_pos[3], size);
+    memcpy(mc_amd->equiv_cpu_table, &buf_pos[3], size);
+    mc_amd->equiv_cpu_table_size = size;
 
     *offset = size + 12;	/* add header length */
 
@@ -231,11 +249,11 @@
 static int cpu_request_microcode(int cpu, const void *buf, size_t size)
 {
     const uint32_t *buf_pos;
-    unsigned long offset = 0;
+    struct microcode_amd *mc_amd, *mc_old;
+    unsigned long offset = size;
     int error = 0;
     int ret;
     struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
-    void *mc;
 
     /* We should bind the task to the CPU */
     BUG_ON(cpu != raw_smp_processor_id());
@@ -249,59 +267,85 @@
         return -EINVAL;
     }
 
-    error = install_equiv_cpu_table(buf, (uint32_t)(buf_pos[2]), &offset);
+    mc_amd = xmalloc_bytes(sizeof(*mc_amd) + buf_pos[2]);
+    if ( !mc_amd )
+    {
+        printk(KERN_ERR "microcode: error! "
+               "Can not allocate memory for microcode patch\n");
+        return -ENOMEM;
+    }
+
+    error = install_equiv_cpu_table(mc_amd, buf, &offset);
     if ( error )
     {
+        xfree(mc_amd);
         printk(KERN_ERR "microcode: installing equivalent cpu table failed\n");
         return -EINVAL;
     }
 
-    mc = xmalloc_bytes(UCODE_MAX_SIZE);
-    if ( mc == NULL )
-    {
-        printk(KERN_ERR "microcode: error! "
-               "Can not allocate memory for microcode patch\n");
-        error = -ENOMEM;
-        goto out;
-    }
-
+    mc_old = uci->mc.mc_amd;
     /* implicitely validates uci->mc.mc_valid */
-    uci->mc.mc_amd = mc;
+    uci->mc.mc_amd = mc_amd;
 
     /*
      * It's possible the data file has multiple matching ucode,
      * lets keep searching till the latest version
      */
-    while ( (ret = get_next_ucode_from_buffer_amd(mc, buf, size, &offset)) == 0)
+    while ( (ret = get_next_ucode_from_buffer_amd(&mc_amd->hdr, buf, size,
+                                                  &offset)) == 0 )
     {
-        error = microcode_fits(mc, cpu);
+        error = microcode_fits(mc_amd, cpu);
         if (error <= 0)
             continue;
 
         error = apply_microcode(cpu);
         if (error == 0)
+        {
+            error = 1;
             break;
+        }
     }
 
+    if ( ret < 0 )
+        error = ret;
+
     /* On success keep the microcode patch for
      * re-apply on resume.
      */
-    if (error) {
-        xfree(mc);
-        mc = NULL;
+    if (error == 1)
+    {
+        xfree(mc_old);
+        return 0;
     }
-    uci->mc.mc_amd = mc;
-
-out:
-    xfree(equiv_cpu_table);
-    equiv_cpu_table = NULL;
+    xfree(mc_amd);
+    uci->mc.mc_amd = mc_old;
 
     return error;
 }
 
-static int microcode_resume_match(int cpu, struct cpu_signature *nsig)
+static int microcode_resume_match(int cpu, const void *mc)
 {
-    return 0;
+    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
+    struct microcode_amd *mc_amd = uci->mc.mc_amd;
+    const struct microcode_amd *src = mc;
+    int res = microcode_fits(src, cpu);
+
+    if ( res <= 0 )
+        return res;
+
+    if ( src != mc_amd )
+    {
+        xfree(mc_amd);
+        mc_amd = xmalloc_bytes(sizeof(*src) + src->equiv_cpu_table_size);
+        uci->mc.mc_amd = mc_amd;
+        if ( !mc_amd )
+            return -ENOMEM;
+        memcpy(mc_amd, src, UCODE_MAX_SIZE);
+        memcpy(mc_amd->equiv_cpu_table, src->equiv_cpu_table,
+               src->equiv_cpu_table_size);
+    }
+
+    return 1;
 }
 
 static const struct microcode_ops microcode_amd_ops = {
@@ -317,4 +361,4 @@
         microcode_ops = &microcode_amd_ops;
     return 0;
 }
-__initcall(microcode_init_amd);
+presmp_initcall(microcode_init_amd);
diff -r f25a004a6de8 -r f30a33c5b5bd xen/arch/x86/microcode_intel.c
--- a/xen/arch/x86/microcode_intel.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/arch/x86/microcode_intel.c	Thu Dec 01 17:24:12 2011 +0000
@@ -30,12 +30,43 @@
 #include <xen/spinlock.h>
 
 #include <asm/msr.h>
-#include <asm/uaccess.h>
 #include <asm/processor.h>
 #include <asm/microcode.h>
 
 #define pr_debug(x...) ((void)0)
 
+struct microcode_header_intel {
+    unsigned int hdrver;
+    unsigned int rev;
+    unsigned int date;
+    unsigned int sig;
+    unsigned int cksum;
+    unsigned int ldrver;
+    unsigned int pf;
+    unsigned int datasize;
+    unsigned int totalsize;
+    unsigned int reserved[3];
+};
+
+struct microcode_intel {
+    struct microcode_header_intel hdr;
+    unsigned int bits[0];
+};
+
+/* microcode format is extended from prescott processors */
+struct extended_signature {
+    unsigned int sig;
+    unsigned int pf;
+    unsigned int cksum;
+};
+
+struct extended_sigtable {
+    unsigned int count;
+    unsigned int cksum;
+    unsigned int reserved[3];
+    struct extended_signature sigs[0];
+};
+
 #define DEFAULT_UCODE_DATASIZE  (2000)
 #define MC_HEADER_SIZE          (sizeof(struct microcode_header_intel))
 #define DEFAULT_UCODE_TOTALSIZE (DEFAULT_UCODE_DATASIZE + MC_HEADER_SIZE)
@@ -98,7 +129,8 @@
 }
 
 static inline int microcode_update_match(
-    int cpu_num, struct microcode_header_intel *mc_header, int sig, int pf)
+    int cpu_num, const struct microcode_header_intel *mc_header,
+    int sig, int pf)
 {
     struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu_num);
 
@@ -200,11 +232,11 @@
  * return 1 - found update
  * return < 0 - error
  */
-static int get_matching_microcode(void *mc, int cpu)
+static int get_matching_microcode(const void *mc, int cpu)
 {
     struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
-    struct microcode_header_intel *mc_header = mc;
-    struct extended_sigtable *ext_header;
+    const struct microcode_header_intel *mc_header = mc;
+    const struct extended_sigtable *ext_header;
     unsigned long total_size = get_totalsize(mc_header);
     int ext_sigcount, i;
     struct extended_signature *ext_sig;
@@ -229,6 +261,8 @@
     }
     return 0;
  find:
+    if ( uci->mc.mc_intel && uci->mc.mc_intel->hdr.rev >= mc_header->rev )
+        return 0;
     pr_debug("microcode: CPU%d found a matching microcode update with"
              " version 0x%x (current=0x%x)\n",
              cpu, mc_header->rev, uci->cpu_sig.rev);
@@ -239,10 +273,8 @@
         return -ENOMEM;
     }
 
-    /* free previous update file */
+    memcpy(new_mc, mc, total_size);
     xfree(uci->mc.mc_intel);
-
-    memcpy(new_mc, mc, total_size);
     uci->mc.mc_intel = new_mc;
     return 1;
 }
@@ -361,12 +393,9 @@
     return error;
 }
 
-static int microcode_resume_match(int cpu, struct cpu_signature *nsig)
+static int microcode_resume_match(int cpu, const void *mc)
 {
-    struct ucode_cpu_info *uci = &per_cpu(ucode_cpu_info, cpu);
-
-    return (sigmatch(nsig->sig, uci->cpu_sig.sig, nsig->pf, uci->cpu_sig.pf) &&
-            (uci->cpu_sig.rev > nsig->rev));
+    return get_matching_microcode(mc, cpu);
 }
 
 static const struct microcode_ops microcode_intel_ops = {
@@ -382,4 +411,4 @@
         microcode_ops = &microcode_intel_ops;
     return 0;
 }
-__initcall(microcode_init_intel);
+presmp_initcall(microcode_init_intel);
diff -r f25a004a6de8 -r f30a33c5b5bd xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/arch/x86/setup.c	Thu Dec 01 17:24:12 2011 +0000
@@ -550,10 +550,10 @@
 {
     char *memmap_type = NULL;
     char *cmdline, *kextra, *loader;
-    unsigned int initrdidx = 1;
+    unsigned int initrdidx;
     multiboot_info_t *mbi = __va(mbi_p);
     module_t *mod = (module_t *)__va(mbi->mods_addr);
-    unsigned long nr_pages, modules_headroom;
+    unsigned long nr_pages, modules_headroom, *module_map;
     int i, j, e820_warn = 0, bytes = 0;
     bool_t acpi_boot_table_init_done = 0;
     struct ns16550_defaults ns16550 = {
@@ -1229,7 +1229,13 @@
 
     init_IRQ();
 
-    xsm_init(&initrdidx, mbi, bootstrap_map);
+    module_map = xmalloc_array(unsigned long, BITS_TO_LONGS(mbi->mods_count));
+    bitmap_fill(module_map, mbi->mods_count);
+    __clear_bit(0, module_map); /* Dom0 kernel is always first */
+
+    xsm_init(module_map, mbi, bootstrap_map);
+
+    microcode_grab_module(module_map, mbi, bootstrap_map);
 
     timer_init();
 
@@ -1356,6 +1362,12 @@
     if ( xen_cpuidle )
         xen_processor_pmbits |= XEN_PROCESSOR_PM_CX;
 
+    initrdidx = find_first_bit(module_map, mbi->mods_count);
+    if ( bitmap_weight(module_map, mbi->mods_count) > 1 )
+        printk(XENLOG_WARNING
+               "Multiple initrd candidates, picking module #%u\n",
+               initrdidx);
+
     /*
      * We're going to setup domain0 using the module(s) that we stashed safely
      * above our heap. The second module, if present, is an initrd ramdisk.
diff -r f25a004a6de8 -r f30a33c5b5bd xen/include/asm-x86/microcode.h
--- a/xen/include/asm-x86/microcode.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/include/asm-x86/microcode.h	Thu Dec 01 17:24:12 2011 +0000
@@ -7,74 +7,12 @@
 struct ucode_cpu_info;
 
 struct microcode_ops {
-    int (*microcode_resume_match)(int cpu, struct cpu_signature *nsig);
+    int (*microcode_resume_match)(int cpu, const void *mc);
     int (*cpu_request_microcode)(int cpu, const void *buf, size_t size);
     int (*collect_cpu_info)(int cpu, struct cpu_signature *csig);
     int (*apply_microcode)(int cpu);
 };
 
-struct microcode_header_intel {
-    unsigned int hdrver;
-    unsigned int rev;
-    unsigned int date;
-    unsigned int sig;
-    unsigned int cksum;
-    unsigned int ldrver;
-    unsigned int pf;
-    unsigned int datasize;
-    unsigned int totalsize;
-    unsigned int reserved[3];
-};
-
-struct microcode_intel {
-    struct microcode_header_intel hdr;
-    unsigned int bits[0];
-};
-
-/* microcode format is extended from prescott processors */
-struct extended_signature {
-    unsigned int sig;
-    unsigned int pf;
-    unsigned int cksum;
-};
-
-struct extended_sigtable {
-    unsigned int count;
-    unsigned int cksum;
-    unsigned int reserved[3];
-    struct extended_signature sigs[0];
-};
-
-struct equiv_cpu_entry {
-    uint32_t installed_cpu;
-    uint32_t fixed_errata_mask;
-    uint32_t fixed_errata_compare;
-    uint16_t equiv_cpu;
-    uint16_t reserved;
-} __attribute__((packed));
-
-struct microcode_header_amd {
-    uint32_t data_code;
-    uint32_t patch_id;
-    uint8_t  mc_patch_data_id[2];
-    uint8_t  mc_patch_data_len;
-    uint8_t  init_flag;
-    uint32_t mc_patch_data_checksum;
-    uint32_t nb_dev_id;
-    uint32_t sb_dev_id;
-    uint16_t processor_rev_id;
-    uint8_t  nb_rev_id;
-    uint8_t  sb_rev_id;
-    uint8_t  bios_api_rev;
-    uint8_t  reserved1[3];
-    uint32_t match_reg[8];
-} __attribute__((packed));
-
-struct microcode_amd {
-    struct microcode_header_amd hdr;
-    unsigned int mpb[0];
-};
-
 struct cpu_signature {
     unsigned int sig;
     unsigned int pf;
diff -r f25a004a6de8 -r f30a33c5b5bd xen/include/asm-x86/processor.h
--- a/xen/include/asm-x86/processor.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/include/asm-x86/processor.h	Thu Dec 01 17:24:12 2011 +0000
@@ -599,6 +599,7 @@
 int rdmsr_hypervisor_regs(uint32_t idx, uint64_t *val);
 int wrmsr_hypervisor_regs(uint32_t idx, uint64_t val);
 
+void microcode_set_module(unsigned int);
 int microcode_update(XEN_GUEST_HANDLE(const_void), unsigned long len);
 int microcode_resume_cpu(int cpu);
 
diff -r f25a004a6de8 -r f30a33c5b5bd xen/include/asm-x86/setup.h
--- a/xen/include/asm-x86/setup.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/include/asm-x86/setup.h	Thu Dec 01 17:24:12 2011 +0000
@@ -44,4 +44,7 @@
 int xen_in_range(unsigned long mfn);
 void arch_get_xen_caps(xen_capabilities_info_t *info);
 
+void microcode_grab_module(
+    unsigned long *, const multiboot_info_t *, void *(*)(const module_t *));
+
 #endif
diff -r f25a004a6de8 -r f30a33c5b5bd xen/include/xsm/xsm.h
--- a/xen/include/xsm/xsm.h	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/include/xsm/xsm.h	Thu Dec 01 17:24:12 2011 +0000
@@ -454,14 +454,15 @@
 }
 
 #ifdef XSM_ENABLE
-extern int xsm_init(unsigned int *initrdidx, const multiboot_info_t *mbi,
+extern int xsm_init(unsigned long *module_map, const multiboot_info_t *mbi,
                     void *(*bootstrap_map)(const module_t *));
-extern int xsm_policy_init(unsigned int *initrdidx, const multiboot_info_t *mbi,
+extern int xsm_policy_init(unsigned long *module_map,
+                           const multiboot_info_t *mbi,
                            void *(*bootstrap_map)(const module_t *));
 extern int register_xsm(struct xsm_operations *ops);
 extern int unregister_xsm(struct xsm_operations *ops);
 #else
-static inline int xsm_init (unsigned int *initrdidx,
+static inline int xsm_init (unsigned long *module_map,
                             const multiboot_info_t *mbi,
                             void *(*bootstrap_map)(const module_t *))
 {
diff -r f25a004a6de8 -r f30a33c5b5bd xen/xsm/xsm_core.c
--- a/xen/xsm/xsm_core.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/xsm/xsm_core.c	Thu Dec 01 17:24:12 2011 +0000
@@ -43,7 +43,7 @@
     }
 }
 
-int __init xsm_init(unsigned int *initrdidx, const multiboot_info_t *mbi,
+int __init xsm_init(unsigned long *module_map, const multiboot_info_t *mbi,
                     void *(*bootstrap_map)(const module_t *))
 {
     int ret = 0;
@@ -52,7 +52,7 @@
 
     if ( XSM_MAGIC )
     {
-        ret = xsm_policy_init(initrdidx, mbi, bootstrap_map);
+        ret = xsm_policy_init(module_map, mbi, bootstrap_map);
         if ( ret )
         {
             bootstrap_map(NULL);
diff -r f25a004a6de8 -r f30a33c5b5bd xen/xsm/xsm_policy.c
--- a/xen/xsm/xsm_policy.c	Thu Dec 01 17:21:24 2011 +0000
+++ b/xen/xsm/xsm_policy.c	Thu Dec 01 17:24:12 2011 +0000
@@ -20,11 +20,12 @@
 
 #include <xsm/xsm.h>
 #include <xen/multiboot.h>
+#include <asm/bitops.h>
 
 char *__initdata policy_buffer = NULL;
 u32 __initdata policy_size = 0;
 
-int xsm_policy_init(unsigned int *initrdidx, const multiboot_info_t *mbi,
+int xsm_policy_init(unsigned long *module_map, const multiboot_info_t *mbi,
                     void *(*bootstrap_map)(const module_t *))
 {
     int i;
@@ -35,10 +36,13 @@
 
     /*
      * Try all modules and see whichever could be the binary policy.
-     * Adjust the initrdidx if module[1] is the binary policy.
+     * Adjust module_map for the module that is the binary policy.
      */
     for ( i = mbi->mods_count-1; i >= 1; i-- )
     {
+        if ( !test_bit(i, module_map) )
+            continue;
+
         _policy_start = bootstrap_map(mod + i);
         _policy_len   = mod[i].mod_end;
 
@@ -50,8 +54,7 @@
             printk("Policy len  0x%lx, start at %p.\n",
                    _policy_len,_policy_start);
 
-            if ( i == 1 )
-                *initrdidx = (mbi->mods_count > 2) ? 2 : 0;
+            __clear_bit(i, module_map);
             break;
 
         }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog

From xen-devel-bounces@lists.xensource.com Mon Dec 12 16:10:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Mon, 12 Dec 2011 16:10:26 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1Ra8SG-0003St-O4; Mon, 12 Dec 2011 16:10:16 +0000
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <JBeulich@suse.com>) id 1Ra8SE-0003S1-HH
	for xen-devel@lists.xensource.com; Mon, 12 Dec 2011 16:10:15 +0000
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1323706156!7886778!1
X-Originating-IP: [130.57.49.28]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25105 invoked from network); 12 Dec 2011 16:09:16 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Dec 2011 16:09:16 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 12 Dec 2011 16:09:16 +0000
Message-Id: <4EE635710200007800067060@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Mon, 12 Dec 2011 16:10:09 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part96B93371.0__="
Subject: [Xen-devel] [PATCH 2/4] ACPI: update table interface headers
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part96B93371.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

... to what is being used on Linux 3.1 (and 3.2-rc).

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/acpi/numa.c
+++ b/xen/drivers/acpi/numa.c
@@ -78,9 +78,11 @@ void __init acpi_table_print_srat_entry(
 			if (srat_rev < 2)
 				proximity_domain &=3D 0xff;
 			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-					  "SRAT Memory (0x%016"PRIx64" =
length 0x%016"PRIx64" type 0x%x) in proximity domain %d %s%s\n",
+					  "SRAT Memory (%#016"PRIx64
+					  " length %#016"PRIx64")"
+					  " in proximity domain %d =
%s%s\n",
 					  p->base_address, p->length,
-					  p->memory_type, proximity_domain,=

+					  proximity_domain,
 					  p->flags & ACPI_SRAT_MEM_ENABLED
 					  ? "enabled" : "disabled",
 					  p->flags & ACPI_SRAT_MEM_HOT_PLUG=
GABLE
--- a/xen/include/acpi/actbl.h
+++ b/xen/include/acpi/actbl.h
@@ -5,7 +5,7 @@
  *************************************************************************=
****/
=20
 /*
- * Copyright (C) 2000 - 2007, R. Byron Moore
+ * Copyright (C) 2000 - 2011, Intel Corp.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,9 +44,23 @@
 #ifndef __ACTBL_H__
 #define __ACTBL_H__
=20
+/*************************************************************************=
******
+ *
+ * Fundamental ACPI tables
+ *
+ * This file contains definitions for the ACPI tables that are directly =
consumed
+ * by ACPICA. All other tables are consumed by the OS-dependent ACPI-relat=
ed
+ * device drivers and other OS support code.
+ *
+ * The RSDP and FACS do not use the common ACPI table header. All other =
ACPI
+ * tables use the header.
+ *
+ *************************************************************************=
*****/
+
 /*
- * Values for description table header signatures. Useful because they =
make
- * it more difficult to inadvertently type in the wrong signature.
+ * Values for description table header signatures for tables defined in =
this
+ * file. Useful because they make it more difficult to inadvertently type =
in
+ * the wrong signature.
  */
 #define ACPI_SIG_DSDT           "DSDT"	/* Differentiated System Descriptio=
n Table */
 #define ACPI_SIG_FADT           "FACP"	/* Fixed ACPI Description Table */
@@ -65,11 +79,6 @@
 #pragma pack(1)
=20
 /*
- * These are the ACPI tables that are directly consumed by the subsystem.
- *
- * The RSDP and FACS do not use the common ACPI table header. All other =
ACPI
- * tables use the header.
- *
  * Note about bitfields: The u8 type is used for bitfields in ACPI =
tables.
  * This is the only type that is even remotely portable. Anything else is =
not
  * portable, so do not use any other bitfield types.
@@ -77,9 +86,8 @@
=20
 /*************************************************************************=
******
  *
- * ACPI Table Header. This common header is used by all tables except the
- * RSDP and FACS. The define is used for direct inclusion of header into
- * other ACPI tables
+ * Master ACPI Table Header. This common header is used by all ACPI =
tables
+ * except the RSDP and FACS.
  *
  *************************************************************************=
*****/
=20
@@ -95,13 +103,16 @@ struct acpi_table_header {
 	u32 asl_compiler_revision;	/* ASL compiler version */
 };
=20
-/*
+/*************************************************************************=
******
+ *
  * GAS - Generic Address Structure (ACPI 2.0+)
  *
  * Note: Since this structure is used in the ACPI tables, it is byte =
aligned.
- * If misalignment is not supported, access to the Address field must be
- * performed with care.
- */
+ * If misaliged access is not supported by the hardware, accesses to the
+ * 64-bit Address field must be performed with care.
+ *
+ *************************************************************************=
*****/
+
 struct acpi_generic_address {
 	u8 space_id;		/* Address space where struct or register =
exists */
 	u8 bit_width;		/* Size in bits of given register */
@@ -113,6 +124,7 @@ struct acpi_generic_address {
 /*************************************************************************=
******
  *
  * RSDP - Root System Description Pointer (Signature is "RSD PTR ")
+ *        Version 2
  *
  *************************************************************************=
*****/
=20
@@ -133,6 +145,7 @@ struct acpi_table_rsdp {
 /*************************************************************************=
******
  *
  * RSDT/XSDT - Root System Description Tables
+ *             Version 1 (both)
  *
  *************************************************************************=
*****/
=20
@@ -161,21 +174,29 @@ struct acpi_table_facs {
 	u32 flags;
 	u64 xfirmware_waking_vector;	/* 64-bit version of the Firmware =
Waking Vector (ACPI 2.0+) */
 	u8 version;		/* Version of this table (ACPI 2.0+) */
-	u8 reserved[31];	/* Reserved, must be zero */
+	u8 reserved[3];		/* Reserved, must be zero */
+	u32 ospm_flags;		/* Flags to be set by OSPM (ACPI 4.0) */
+	u8 reserved1[24];	/* Reserved, must be zero */
 };
=20
-/* Flag macros */
+/* Masks for global_lock flag field above */
+
+#define ACPI_GLOCK_PENDING          (1)	/* 00: Pending global lock =
ownership */
+#define ACPI_GLOCK_OWNED            (1<<1)	/* 01: Global lock is =
owned */
=20
-#define ACPI_FACS_S4_BIOS_PRESENT (1)	/* 00: S4BIOS support is present =
*/
+/* Masks for Flags field above  */
=20
-/* Global lock flags */
+#define ACPI_FACS_S4_BIOS_PRESENT   (1)	/* 00: S4BIOS support is =
present */
+#define ACPI_FACS_64BIT_WAKE        (1<<1)	/* 01: 64-bit wake vector =
supported (ACPI 4.0) */
=20
-#define ACPI_GLOCK_PENDING      0x01	/* 00: Pending global lock =
ownership */
-#define ACPI_GLOCK_OWNED        0x02	/* 01: Global lock is owned */
+/* Masks for ospm_flags field above */
+
+#define ACPI_FACS_64BIT_ENVIRONMENT (1)	/* 00: 64-bit wake =
environment is required (ACPI 4.0) */
=20
 /*************************************************************************=
******
  *
  * FADT - Fixed ACPI Description Table (Signature "FACP")
+ *        Version 4
  *
  *************************************************************************=
*****/
=20
@@ -214,11 +235,11 @@ struct acpi_table_fadt {
 	u16 flush_size;		/* Processor's memory cache line width, in =
bytes */
 	u16 flush_stride;	/* Number of flush strides that need to be =
read */
 	u8 duty_offset;		/* Processor duty cycle index in processor'=
s P_CNT reg */
-	u8 duty_width;		/* Processor duty cycle value bit width in =
P_CNT register. */
+	u8 duty_width;		/* Processor duty cycle value bit width in =
P_CNT register */
 	u8 day_alarm;		/* Index to day-of-month alarm in RTC CMOS =
RAM */
 	u8 month_alarm;		/* Index to month-of-year alarm in RTC =
CMOS RAM */
 	u8 century;		/* Index to century in RTC CMOS RAM */
-	u16 boot_flags;		/* IA-PC Boot Architecture Flags. See =
Table 5-10 for description */
+	u16 boot_flags;		/* IA-PC Boot Architecture Flags (see =
below for individual flags) */
 	u8 reserved;		/* Reserved, must be zero */
 	u32 flags;		/* Miscellaneous flag bits (see below for =
individual flags) */
 	struct acpi_generic_address reset_register;	/* 64-bit address =
of the Reset register */
@@ -236,32 +257,41 @@ struct acpi_table_fadt {
 	struct acpi_generic_address xgpe1_block;	/* 64-bit Extended =
General Purpose Event 1 Reg Blk address */
 };
=20
-/* FADT flags */
+/* Masks for FADT Boot Architecture Flags (boot_flags) */
=20
-#define ACPI_FADT_WBINVD            (1)	/* 00: The wbinvd =
instruction works properly */
-#define ACPI_FADT_WBINVD_FLUSH      (1<<1)	/* 01: The wbinvd flushes =
but does not invalidate */
-#define ACPI_FADT_C1_SUPPORTED      (1<<2)	/* 02: All processors =
support C1 state */
-#define ACPI_FADT_C2_MP_SUPPORTED   (1<<3)	/* 03: C2 state works on =
MP system */
-#define ACPI_FADT_POWER_BUTTON      (1<<4)	/* 04: Power button is =
handled as a generic feature */
-#define ACPI_FADT_SLEEP_BUTTON      (1<<5)	/* 05: Sleep button is =
handled as a generic feature, or  not present */
-#define ACPI_FADT_FIXED_RTC         (1<<6)	/* 06: RTC wakeup stat not =
in fixed register space */
-#define ACPI_FADT_S4_RTC_WAKE       (1<<7)	/* 07: RTC wakeup stat not =
possible from S4 */
-#define ACPI_FADT_32BIT_TIMER       (1<<8)	/* 08: tmr_val is 32 bits =
0=3D24-bits */
-#define ACPI_FADT_DOCKING_SUPPORTED (1<<9)	/* 09: Docking supported =
*/
-#define ACPI_FADT_RESET_REGISTER    (1<<10)	/* 10: System reset via =
the FADT RESET_REG supported */
-#define ACPI_FADT_SEALED_CASE       (1<<11)	/* 11: No internal =
expansion capabilities and case is sealed */
-#define ACPI_FADT_HEADLESS          (1<<12)	/* 12: No local video =
capabilities or local input devices */
-#define ACPI_FADT_SLEEP_TYPE        (1<<13)	/* 13: Must execute native =
instruction after writing  SLP_TYPx register */
-#define ACPI_FADT_PCI_EXPRESS_WAKE  (1<<14)	/* 14: System supports =
PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */
-#define ACPI_FADT_PLATFORM_CLOCK    (1<<15)	/* 15: OSPM should use =
platform-provided timer (ACPI 3.0) */
-#define ACPI_FADT_S4_RTC_VALID      (1<<16)	/* 16: Contents of RTC_STS =
valid after S4 wake (ACPI 3.0) */
-#define ACPI_FADT_REMOTE_POWER_ON   (1<<17)	/* 17: System is compatible=
 with remote power on (ACPI 3.0) */
-#define ACPI_FADT_APIC_CLUSTER      (1<<18)	/* 18: All local APICs =
must use cluster model (ACPI 3.0) */
-#define ACPI_FADT_APIC_PHYSICAL     (1<<19)	/* 19: All local x_aPICs =
must use physical dest mode (ACPI 3.0) */
+#define ACPI_FADT_LEGACY_DEVICES    (1)  	/* 00: [V2] System has LPC =
or ISA bus devices */
+#define ACPI_FADT_8042              (1<<1)	/* 01: [V3] System has an =
8042 controller on port 60/64 */
+#define ACPI_FADT_NO_VGA            (1<<2)	/* 02: [V4] It is not safe =
to probe for VGA hardware */
+#define ACPI_FADT_NO_MSI            (1<<3)	/* 03: [V4] Message =
Signaled Interrupts (MSI) must not be enabled */
+#define ACPI_FADT_NO_ASPM           (1<<4)	/* 04: [V4] PCIe ASPM =
control must not be enabled */
+
+#define FADT2_REVISION_ID               3
+
+/* Masks for FADT flags */
+
+#define ACPI_FADT_WBINVD            (1)	/* 00: [V1] The wbinvd =
instruction works properly */
+#define ACPI_FADT_WBINVD_FLUSH      (1<<1)	/* 01: [V1] wbinvd flushes =
but does not invalidate caches */
+#define ACPI_FADT_C1_SUPPORTED      (1<<2)	/* 02: [V1] All processors =
support C1 state */
+#define ACPI_FADT_C2_MP_SUPPORTED   (1<<3)	/* 03: [V1] C2 state works =
on MP system */
+#define ACPI_FADT_POWER_BUTTON      (1<<4)	/* 04: [V1] Power button =
is handled as a control method device */
+#define ACPI_FADT_SLEEP_BUTTON      (1<<5)	/* 05: [V1] Sleep button =
is handled as a control method device */
+#define ACPI_FADT_FIXED_RTC         (1<<6)	/* 06: [V1] RTC wakeup =
status not in fixed register space */
+#define ACPI_FADT_S4_RTC_WAKE       (1<<7)	/* 07: [V1] RTC alarm can =
wake system from S4 */
+#define ACPI_FADT_32BIT_TIMER       (1<<8)	/* 08: [V1] ACPI timer =
width is 32-bit (0=3D24-bit) */
+#define ACPI_FADT_DOCKING_SUPPORTED (1<<9)	/* 09: [V1] Docking =
supported */
+#define ACPI_FADT_RESET_REGISTER    (1<<10)	/* 10: [V2] System reset =
via the FADT RESET_REG supported */
+#define ACPI_FADT_SEALED_CASE       (1<<11)	/* 11: [V3] No internal =
expansion capabilities and case is sealed */
+#define ACPI_FADT_HEADLESS          (1<<12)	/* 12: [V3] No local video =
capabilities or local input devices */
+#define ACPI_FADT_SLEEP_TYPE        (1<<13)	/* 13: [V3] Must execute =
native instruction after writing  SLP_TYPx register */
+#define ACPI_FADT_PCI_EXPRESS_WAKE  (1<<14)	/* 14: [V4] System =
supports PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */
+#define ACPI_FADT_PLATFORM_CLOCK    (1<<15)	/* 15: [V4] OSPM should =
use platform-provided timer (ACPI 3.0) */
+#define ACPI_FADT_S4_RTC_VALID      (1<<16)	/* 16: [V4] Contents of =
RTC_STS valid after S4 wake (ACPI 3.0) */
+#define ACPI_FADT_REMOTE_POWER_ON   (1<<17)	/* 17: [V4] System is =
compatible with remote power on (ACPI 3.0) */
+#define ACPI_FADT_APIC_CLUSTER      (1<<18)	/* 18: [V4] All local =
APICs must use cluster model (ACPI 3.0) */
+#define ACPI_FADT_APIC_PHYSICAL     (1<<19)	/* 19: [V4] All local =
x_aPICs must use physical dest mode (ACPI 3.0) */
+
+/* Values for preferred_profile (Preferred Power Management Profiles) */
=20
-/*
- * FADT Prefered Power Management Profiles
- */
 enum acpi_prefered_pm_profiles {
 	PM_UNSPECIFIED =3D 0,
 	PM_DESKTOP =3D 1,
@@ -272,15 +302,6 @@ enum acpi_prefered_pm_profiles {
 	PM_APPLIANCE_PC =3D 6
 };
=20
-/* FADT Boot Arch Flags */
-
-#define BAF_LEGACY_DEVICES              0x0001
-#define BAF_8042_KEYBOARD_CONTROLLER    0x0002
-#define BAF_MSI_NOT_SUPPORTED           0x0008
-
-#define FADT2_REVISION_ID               3
-#define FADT2_MINUS_REVISION_ID         2
-
 /* Reset to default packing */
=20
 #pragma pack()
@@ -292,5 +313,22 @@ enum acpi_prefered_pm_profiles {
  */
=20
 #include <acpi/actbl1.h>
+#include <acpi/actbl2.h>
+
+/*
+ * Sizes of the various flavors of FADT. We need to look closely
+ * at the FADT length because the version number essentially tells
+ * us nothing because of many BIOS bugs where the version does not
+ * match the expected length. In other words, the length of the
+ * FADT is the bottom line as to what the version really is.
+ *
+ * For reference, the values below are as follows:
+ *     FADT V1  size: 0x74
+ *     FADT V2  size: 0x84
+ *     FADT V3+ size: 0xF4
+ */
+#define ACPI_FADT_V1_SIZE       (u32) (ACPI_FADT_OFFSET (flags) + 4)
+#define ACPI_FADT_V2_SIZE       (u32) (ACPI_FADT_OFFSET (reserved4[0]) + =
3)
+#define ACPI_FADT_V3_SIZE       (u32) (sizeof (struct acpi_table_fadt))
=20
 #endif				/* __ACTBL_H__ */
--- a/xen/include/acpi/actbl1.h
+++ b/xen/include/acpi/actbl1.h
@@ -5,7 +5,7 @@
  *************************************************************************=
****/
=20
 /*
- * Copyright (C) 2000 - 2007, R. Byron Moore
+ * Copyright (C) 2000 - 2011, Intel Corp.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -46,34 +46,31 @@
=20
 /*************************************************************************=
******
  *
- * Additional ACPI Tables
+ * Additional ACPI Tables (1)
  *
  * These tables are not consumed directly by the ACPICA subsystem, but =
are
  * included here to support device drivers and the AML disassembler.
  *
+ * The tables in this file are fully defined within the ACPI specification=
.
+ *
  *************************************************************************=
*****/
=20
 /*
- * Values for description table header signatures. Useful because they =
make
- * it more difficult to inadvertently type in the wrong signature.
+ * Values for description table header signatures for tables defined in =
this
+ * file. Useful because they make it more difficult to inadvertently type =
in
+ * the wrong signature.
  */
-#define ACPI_SIG_ASF            "ASF!"	/* Alert Standard Format table */
-#define ACPI_SIG_BOOT           "BOOT"	/* Simple Boot Flag Table */
+#define ACPI_SIG_BERT           "BERT"	/* Boot Error Record Table */
 #define ACPI_SIG_CPEP           "CPEP"	/* Corrected Platform Error =
Polling table */
-#define ACPI_SIG_ERST           "ERST"  /* Error Record Serialization =
Table */
-#define ACPI_SIG_DBGP           "DBGP"	/* Debug Port table */
-#define ACPI_SIG_DMAR           "DMAR"	/* DMA Remapping table */
 #define ACPI_SIG_ECDT           "ECDT"	/* Embedded Controller Boot =
Resources Table */
-#define ACPI_SIG_HPET           "HPET"	/* High Precision Event Timer =
table */
+#define ACPI_SIG_EINJ           "EINJ"	/* Error Injection table */
+#define ACPI_SIG_ERST           "ERST"	/* Error Record Serialization =
Table */
+#define ACPI_SIG_HEST           "HEST"	/* Hardware Error Source Table */
 #define ACPI_SIG_MADT           "APIC"	/* Multiple APIC Description Table =
*/
-#define ACPI_SIG_MCFG           "MCFG"	/* PCI Memory Mapped Configuration =
table */
+#define ACPI_SIG_MSCT           "MSCT"	/* Maximum System Characteristics =
Table */
 #define ACPI_SIG_SBST           "SBST"	/* Smart Battery Specification =
Table */
 #define ACPI_SIG_SLIT           "SLIT"	/* System Locality Distance =
Information Table */
-#define ACPI_SIG_SPCR           "SPCR"	/* Serial Port Console Redirection =
table */
-#define ACPI_SIG_SPMI           "SPMI"	/* Server Platform Management =
Interface table */
 #define ACPI_SIG_SRAT           "SRAT"	/* System Resource Affinity Table =
*/
-#define ACPI_SIG_TCPA           "TCPA"	/* Trusted Computing Platform =
Alliance table */
-#define ACPI_SIG_WDRT           "WDRT"	/* Watchdog Resource Table */
=20
 /*
  * All tables must be byte-packed to match the ACPI specification, since
@@ -87,7 +84,13 @@
  * portable, so do not use any other bitfield types.
  */
=20
-/* Common Sub-table header (used in MADT, SRAT, etc.) */
+/*************************************************************************=
******
+ *
+ * Common subtable headers
+ *
+ *************************************************************************=
*****/
+
+/* Generic subtable header (used in MADT, SRAT, etc.) */
=20
 struct acpi_subtable_header {
 	u8 type;
@@ -108,128 +111,54 @@ struct acpi_whea_header {
=20
 /*************************************************************************=
******
  *
- * ASF - Alert Standard Format table (Signature "ASF!")
- *
- * Conforms to the Alert Standard Format Specification V2.0, 23 April =
2003
+ * BERT - Boot Error Record Table (ACPI 4.0)
+ *        Version 1
  *
  *************************************************************************=
*****/
=20
-struct acpi_table_asf {
+struct acpi_table_bert {
 	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u32 region_length;	/* Length of the boot error region */
+	u64 address;		/* Physical address of the error region */
 };
=20
-/* ASF subtable header */
-
-struct acpi_asf_header {
-	u8 type;
-	u8 reserved;
-	u16 length;
-};
-
-/* Values for Type field above */
+/* Boot Error Region (not a subtable, pointed to by Address field above) =
*/
=20
-enum acpi_asf_type {
-	ACPI_ASF_TYPE_INFO =3D 0,
-	ACPI_ASF_TYPE_ALERT =3D 1,
-	ACPI_ASF_TYPE_CONTROL =3D 2,
-	ACPI_ASF_TYPE_BOOT =3D 3,
-	ACPI_ASF_TYPE_ADDRESS =3D 4,
-	ACPI_ASF_TYPE_RESERVED =3D 5
+struct acpi_bert_region {
+	u32 block_status;	/* Type of error information */
+	u32 raw_data_offset;	/* Offset to raw error data */
+	u32 raw_data_length;	/* Length of raw error data */
+	u32 data_length;	/* Length of generic error data */
+	u32 error_severity;	/* Severity code */
 };
=20
-/*
- * ASF subtables
- */
+/* Values for block_status flags above */
=20
-/* 0: ASF Information */
+#define ACPI_BERT_UNCORRECTABLE             (1)
+#define ACPI_BERT_CORRECTABLE               (1<<1)
+#define ACPI_BERT_MULTIPLE_UNCORRECTABLE    (1<<2)
+#define ACPI_BERT_MULTIPLE_CORRECTABLE      (1<<3)
+#define ACPI_BERT_ERROR_ENTRY_COUNT         (0xFF<<4)	/* 8 bits, error =
count */
=20
-struct acpi_asf_info {
-	struct acpi_asf_header header;
-	u8 min_reset_value;
-	u8 min_poll_interval;
-	u16 system_id;
-	u32 mfg_id;
-	u8 flags;
-	u8 reserved2[3];
-};
-
-/* 1: ASF Alerts */
+/* Values for error_severity above */
=20
-struct acpi_asf_alert {
-	struct acpi_asf_header header;
-	u8 assert_mask;
-	u8 deassert_mask;
-	u8 alerts;
-	u8 data_length;
-};
-
-struct acpi_asf_alert_data {
-	u8 address;
-	u8 command;
-	u8 mask;
-	u8 value;
-	u8 sensor_type;
-	u8 type;
-	u8 offset;
-	u8 source_type;
-	u8 severity;
-	u8 sensor_number;
-	u8 entity;
-	u8 instance;
+enum acpi_bert_error_severity {
+	ACPI_BERT_ERROR_CORRECTABLE =3D 0,
+	ACPI_BERT_ERROR_FATAL =3D 1,
+	ACPI_BERT_ERROR_CORRECTED =3D 2,
+	ACPI_BERT_ERROR_NONE =3D 3,
+	ACPI_BERT_ERROR_RESERVED =3D 4	/* 4 and greater are reserved */
 };
=20
-/* 2: ASF Remote Control */
-
-struct acpi_asf_remote {
-	struct acpi_asf_header header;
-	u8 controls;
-	u8 data_length;
-	u16 reserved2;
-};
-
-struct acpi_asf_control_data {
-	u8 function;
-	u8 address;
-	u8 command;
-	u8 value;
-};
-
-/* 3: ASF RMCP Boot Options */
-
-struct acpi_asf_rmcp {
-	struct acpi_asf_header header;
-	u8 capabilities[7];
-	u8 completion_code;
-	u32 enterprise_id;
-	u8 command;
-	u16 parameter;
-	u16 boot_options;
-	u16 oem_parameters;
-};
-
-/* 4: ASF Address */
-
-struct acpi_asf_address {
-	struct acpi_asf_header header;
-	u8 eprom_address;
-	u8 devices;
-};
-
-/*************************************************************************=
******
- *
- * BOOT - Simple Boot Flag Table
- *
- *************************************************************************=
*****/
-
-struct acpi_table_boot {
-	struct acpi_table_header header;	/* Common ACPI table =
header */
-	u8 cmos_index;		/* Index in CMOS RAM for the boot register =
*/
-	u8 reserved[3];
-};
+/*
+ * Note: The generic error data that follows the error_severity field =
above
+ * uses the struct acpi_hest_generic_data defined under the HEST table =
below
+ */
=20
 /*************************************************************************=
******
  *
- * CPEP - Corrected Platform Error Polling table
+ * CPEP - Corrected Platform Error Polling table (ACPI 4.0)
+ *        Version 1
  *
  *************************************************************************=
*****/
=20
@@ -241,8 +170,7 @@ struct acpi_table_cpep {
 /* Subtable */
=20
 struct acpi_cpep_polling {
-	u8 type;
-	u8 length;
+	struct acpi_subtable_header header;
 	u8 id;			/* Processor ID */
 	u8 eid;			/* Processor EID */
 	u32 interval;		/* Polling interval (msec) */
@@ -250,116 +178,103 @@ struct acpi_cpep_polling {
=20
 /*************************************************************************=
******
  *
- * DBGP - Debug Port table
+ * ECDT - Embedded Controller Boot Resources Table
+ *        Version 1
  *
  *************************************************************************=
*****/
=20
-struct acpi_table_dbgp {
+struct acpi_table_ecdt {
 	struct acpi_table_header header;	/* Common ACPI table =
header */
-	u8 type;		/* 0=3Dfull 16550, 1=3Dsubset of 16550 */
-	u8 reserved[3];
-	struct acpi_generic_address debug_port;
+	struct acpi_generic_address control;	/* Address of EC command/st=
atus register */
+	struct acpi_generic_address data;	/* Address of EC data =
register */
+	u32 uid;		/* Unique ID - must be same as the EC _UID =
method */
+	u8 gpe;			/* The GPE for the EC */
+	u8 id[1];		/* Full namepath of the EC in the ACPI =
namespace */
 };
=20
 /*************************************************************************=
******
  *
- * DMAR - DMA Remapping table
+ * EINJ - Error Injection Table (ACPI 4.0)
+ *        Version 1
  *
  *************************************************************************=
*****/
=20
-struct acpi_table_dmar {
+struct acpi_table_einj {
 	struct acpi_table_header header;	/* Common ACPI table =
header */
-	u8 width;		/* Host Address Width */
+	u32 header_length;
 	u8 flags;
-	u8 reserved[10];
-};
-
-/* DMAR subtable header */
-
-struct acpi_dmar_header {
-	u16 type;
-	u16 length;
-};
-
-/* Values for subtable type in struct acpi_dmar_header */
-
-enum acpi_dmar_type {
-	ACPI_DMAR_TYPE_HARDWARE_UNIT =3D 0,
-	ACPI_DMAR_TYPE_RESERVED_MEMORY =3D 1,
-	ACPI_DMAR_TYPE_ATSR =3D 2,
-	ACPI_DMAR_TYPE_RESERVED =3D 3	/* 3 and greater are reserved */
-};
-
-struct acpi_dmar_device_scope {
-	u8 entry_type;
-	u8 length;
-	u16 reserved;
-	u8 enumeration_id;
-	u8 bus;
+	u8 reserved[3];
+	u32 entries;
 };
=20
-/* Values for entry_type in struct acpi_dmar_device_scope */
+/* EINJ Injection Instruction Entries (actions) */
=20
-enum acpi_dmar_scope_type {
-	ACPI_DMAR_SCOPE_TYPE_NOT_USED =3D 0,
-	ACPI_DMAR_SCOPE_TYPE_ENDPOINT =3D 1,
-	ACPI_DMAR_SCOPE_TYPE_BRIDGE =3D 2,
-	ACPI_DMAR_SCOPE_TYPE_IOAPIC =3D 3,
-	ACPI_DMAR_SCOPE_TYPE_HPET =3D 4,
-	ACPI_DMAR_SCOPE_TYPE_RESERVED =3D 5	/* 5 and greater are =
reserved */
+struct acpi_einj_entry {
+	struct acpi_whea_header whea_header;	/* Common header for WHEA =
tables */
 };
=20
-struct acpi_dmar_pci_path {
-	u8 dev;
-	u8 fn;
-};
+/* Masks for Flags field above */
=20
-/*
- * DMAR Sub-tables, correspond to Type in struct acpi_dmar_header
- */
+#define ACPI_EINJ_PRESERVE          (1)
=20
-/* 0: Hardware Unit Definition */
+/* Values for Action field above */
=20
-struct acpi_dmar_hardware_unit {
-	struct acpi_dmar_header header;
-	u8 flags;
-	u8 reserved;
-	u16 segment;
-	u64 address;		/* Register Base Address */
+enum acpi_einj_actions {
+	ACPI_EINJ_BEGIN_OPERATION =3D 0,
+	ACPI_EINJ_GET_TRIGGER_TABLE =3D 1,
+	ACPI_EINJ_SET_ERROR_TYPE =3D 2,
+	ACPI_EINJ_GET_ERROR_TYPE =3D 3,
+	ACPI_EINJ_END_OPERATION =3D 4,
+	ACPI_EINJ_EXECUTE_OPERATION =3D 5,
+	ACPI_EINJ_CHECK_BUSY_STATUS =3D 6,
+	ACPI_EINJ_GET_COMMAND_STATUS =3D 7,
+	ACPI_EINJ_ACTION_RESERVED =3D 8,	/* 8 and greater are =
reserved */
+	ACPI_EINJ_TRIGGER_ERROR =3D 0xFF	/* Except for this value =
*/
 };
=20
-/* Flags */
-
-#define ACPI_DMAR_INCLUDE_ALL       (1)
-
-/* 1: Reserved Memory Defininition */
+/* Values for Instruction field above */
=20
-struct acpi_dmar_reserved_memory {
-	struct acpi_dmar_header header;
-	u16 reserved;
-	u16 segment;
-	u64 base_address;		/* 4_k aligned base address */
-	u64 end_address;	/* 4_k aligned limit address */
+enum acpi_einj_instructions {
+	ACPI_EINJ_READ_REGISTER =3D 0,
+	ACPI_EINJ_READ_REGISTER_VALUE =3D 1,
+	ACPI_EINJ_WRITE_REGISTER =3D 2,
+	ACPI_EINJ_WRITE_REGISTER_VALUE =3D 3,
+	ACPI_EINJ_NOOP =3D 4,
+	ACPI_EINJ_INSTRUCTION_RESERVED =3D 5	/* 5 and greater are =
reserved */
+};
+
+/* EINJ Trigger Error Action Table */
+
+struct acpi_einj_trigger {
+	u32 header_size;
+	u32 revision;
+	u32 table_size;
+	u32 entry_count;
 };
=20
-/* Flags */
+/* Command status return values */
=20
-#define ACPI_DMAR_ALLOW_ALL         (1)
-
-/*************************************************************************=
******
- *
- * ECDT - Embedded Controller Boot Resources Table
- *
- *************************************************************************=
*****/
-
-struct acpi_table_ecdt {
-	struct acpi_table_header header;	/* Common ACPI table =
header */
-	struct acpi_generic_address control;	/* Address of EC command/st=
atus register */
-	struct acpi_generic_address data;	/* Address of EC data =
register */
-	u32 uid;		/* Unique ID - must be same as the EC _UID =
method */
-	u8 gpe;			/* The GPE for the EC */
-	u8 id[1];		/* Full namepath of the EC in the ACPI =
namespace */
-};
+enum acpi_einj_command_status {
+	ACPI_EINJ_SUCCESS =3D 0,
+	ACPI_EINJ_FAILURE =3D 1,
+	ACPI_EINJ_INVALID_ACCESS =3D 2,
+	ACPI_EINJ_STATUS_RESERVED =3D 3	/* 3 and greater are reserved */
+};
+
+/* Error types returned from ACPI_EINJ_GET_ERROR_TYPE (bitfield) */
+
+#define ACPI_EINJ_PROCESSOR_CORRECTABLE     (1)
+#define ACPI_EINJ_PROCESSOR_UNCORRECTABLE   (1<<1)
+#define ACPI_EINJ_PROCESSOR_FATAL           (1<<2)
+#define ACPI_EINJ_MEMORY_CORRECTABLE        (1<<3)
+#define ACPI_EINJ_MEMORY_UNCORRECTABLE      (1<<4)
+#define ACPI_EINJ_MEMORY_FATAL              (1<<5)
+#define ACPI_EINJ_PCIX_CORRECTABLE          (1<<6)
+#define ACPI_EINJ_PCIX_UNCORRECTABLE        (1<<7)
+#define ACPI_EINJ_PCIX_FATAL                (1<<8)
+#define ACPI_EINJ_PLATFORM_CORRECTABLE      (1<<9)
+#define ACPI_EINJ_PLATFORM_UNCORRECTABLE    (1<<10)
+#define ACPI_EINJ_PLATFORM_FATAL            (1<<11)
=20
 /*************************************************************************=
******
  *
@@ -453,30 +368,237 @@ struct acpi_erst_info {
=20
 /*************************************************************************=
******
  *
- * HPET - High Precision Event Timer table
+ * HEST - Hardware Error Source Table (ACPI 4.0)
+ *        Version 1
  *
  *************************************************************************=
*****/
=20
-struct acpi_table_hpet {
+struct acpi_table_hest {
 	struct acpi_table_header header;	/* Common ACPI table =
header */
-	u32 id;			/* Hardware ID of event timer block */
-	struct acpi_generic_address address;	/* Address of event timer =
block */
-	u8 sequence;		/* HPET sequence number */
-	u16 minimum_tick;	/* Main counter min tick, periodic mode */
+	u32 error_source_count;
+};
+
+/* HEST subtable header */
+
+struct acpi_hest_header {
+	u16 type;
+	u16 source_id;
+};
+
+/* Values for Type field above for subtables */
+
+enum acpi_hest_types {
+	ACPI_HEST_TYPE_IA32_CHECK =3D 0,
+	ACPI_HEST_TYPE_IA32_CORRECTED_CHECK =3D 1,
+	ACPI_HEST_TYPE_IA32_NMI =3D 2,
+	ACPI_HEST_TYPE_NOT_USED3 =3D 3,
+	ACPI_HEST_TYPE_NOT_USED4 =3D 4,
+	ACPI_HEST_TYPE_NOT_USED5 =3D 5,
+	ACPI_HEST_TYPE_AER_ROOT_PORT =3D 6,
+	ACPI_HEST_TYPE_AER_ENDPOINT =3D 7,
+	ACPI_HEST_TYPE_AER_BRIDGE =3D 8,
+	ACPI_HEST_TYPE_GENERIC_ERROR =3D 9,
+	ACPI_HEST_TYPE_RESERVED =3D 10	/* 10 and greater are reserved */
+};
+
+/*
+ * HEST substructures contained in subtables
+ */
+
+/*
+ * IA32 Error Bank(s) - Follows the struct acpi_hest_ia_machine_check and
+ * struct acpi_hest_ia_corrected structures.
+ */
+struct acpi_hest_ia_error_bank {
+	u8 bank_number;
+	u8 clear_status_on_init;
+	u8 status_format;
+	u8 reserved;
+	u32 control_register;
+	u64 control_data;
+	u32 status_register;
+	u32 address_register;
+	u32 misc_register;
+};
+
+/* Common HEST sub-structure for PCI/AER structures below (6,7,8) */
+
+struct acpi_hest_aer_common {
+	u16 reserved1;
 	u8 flags;
+	u8 enabled;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	u32 bus;
+	u16 device;
+	u16 function;
+	u16 device_control;
+	u16 reserved2;
+	u32 uncorrectable_mask;
+	u32 uncorrectable_severity;
+	u32 correctable_mask;
+	u32 advanced_capabilities;
 };
=20
-/*! Flags */
+/* Masks for HEST Flags fields */
+
+#define ACPI_HEST_FIRMWARE_FIRST        (1)
+#define ACPI_HEST_GLOBAL                (1<<1)
=20
-#define ACPI_HPET_PAGE_PROTECT      (1)	/* 00: No page protection =
*/
-#define ACPI_HPET_PAGE_PROTECT_4    (1<<1)	/* 01: 4KB page protected =
*/
-#define ACPI_HPET_PAGE_PROTECT_64   (1<<2)	/* 02: 64KB page protected =
*/
+/* Hardware Error Notification */
=20
-/*! [End] no source code translation !*/
+struct acpi_hest_notify {
+	u8 type;
+	u8 length;
+	u16 config_write_enable;
+	u32 poll_interval;
+	u32 vector;
+	u32 polling_threshold_value;
+	u32 polling_threshold_window;
+	u32 error_threshold_value;
+	u32 error_threshold_window;
+};
+
+/* Values for Notify Type field above */
+
+enum acpi_hest_notify_types {
+	ACPI_HEST_NOTIFY_POLLED =3D 0,
+	ACPI_HEST_NOTIFY_EXTERNAL =3D 1,
+	ACPI_HEST_NOTIFY_LOCAL =3D 2,
+	ACPI_HEST_NOTIFY_SCI =3D 3,
+	ACPI_HEST_NOTIFY_NMI =3D 4,
+	ACPI_HEST_NOTIFY_RESERVED =3D 5	/* 5 and greater are reserved */
+};
+
+/* Values for config_write_enable bitfield above */
+
+#define ACPI_HEST_TYPE                  (1)
+#define ACPI_HEST_POLL_INTERVAL         (1<<1)
+#define ACPI_HEST_POLL_THRESHOLD_VALUE  (1<<2)
+#define ACPI_HEST_POLL_THRESHOLD_WINDOW (1<<3)
+#define ACPI_HEST_ERR_THRESHOLD_VALUE   (1<<4)
+#define ACPI_HEST_ERR_THRESHOLD_WINDOW  (1<<5)
+
+/*
+ * HEST subtables
+ */
+
+/* 0: IA32 Machine Check Exception */
+
+struct acpi_hest_ia_machine_check {
+	struct acpi_hest_header header;
+	u16 reserved1;
+	u8 flags;
+	u8 enabled;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	u64 global_capability_data;
+	u64 global_control_data;
+	u8 num_hardware_banks;
+	u8 reserved3[7];
+};
+
+/* 1: IA32 Corrected Machine Check */
+
+struct acpi_hest_ia_corrected {
+	struct acpi_hest_header header;
+	u16 reserved1;
+	u8 flags;
+	u8 enabled;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	struct acpi_hest_notify notify;
+	u8 num_hardware_banks;
+	u8 reserved2[3];
+};
+
+/* 2: IA32 Non-Maskable Interrupt */
+
+struct acpi_hest_ia_nmi {
+	struct acpi_hest_header header;
+	u32 reserved;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	u32 max_raw_data_length;
+};
+
+/* 3,4,5: Not used */
+
+/* 6: PCI Express Root Port AER */
+
+struct acpi_hest_aer_root {
+	struct acpi_hest_header header;
+	struct acpi_hest_aer_common aer;
+	u32 root_error_command;
+};
+
+/* 7: PCI Express AER (AER Endpoint) */
+
+struct acpi_hest_aer {
+	struct acpi_hest_header header;
+	struct acpi_hest_aer_common aer;
+};
+
+/* 8: PCI Express/PCI-X Bridge AER */
+
+struct acpi_hest_aer_bridge {
+	struct acpi_hest_header header;
+	struct acpi_hest_aer_common aer;
+	u32 uncorrectable_mask2;
+	u32 uncorrectable_severity2;
+	u32 advanced_capabilities2;
+};
+
+/* 9: Generic Hardware Error Source */
+
+struct acpi_hest_generic {
+	struct acpi_hest_header header;
+	u16 related_source_id;
+	u8 reserved;
+	u8 enabled;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	u32 max_raw_data_length;
+	struct acpi_generic_address error_status_address;
+	struct acpi_hest_notify notify;
+	u32 error_block_length;
+};
+
+/* Generic Error Status block */
+
+struct acpi_hest_generic_status {
+	u32 block_status;
+	u32 raw_data_offset;
+	u32 raw_data_length;
+	u32 data_length;
+	u32 error_severity;
+};
+
+/* Values for block_status flags above */
+
+#define ACPI_HEST_UNCORRECTABLE             (1)
+#define ACPI_HEST_CORRECTABLE               (1<<1)
+#define ACPI_HEST_MULTIPLE_UNCORRECTABLE    (1<<2)
+#define ACPI_HEST_MULTIPLE_CORRECTABLE      (1<<3)
+#define ACPI_HEST_ERROR_ENTRY_COUNT         (0xFF<<4)	/* 8 bits, error =
count */
+
+/* Generic Error Data entry */
+
+struct acpi_hest_generic_data {
+	u8 section_type[16];
+	u32 error_severity;
+	u16 revision;
+	u8 validation_bits;
+	u8 flags;
+	u32 error_data_length;
+	u8 fru_id[16];
+	u8 fru_text[20];
+};
=20
 /*************************************************************************=
******
  *
  * MADT - Multiple APIC Description Table
+ *        Version 3
  *
  *************************************************************************=
*****/
=20
@@ -486,7 +608,7 @@ struct acpi_table_madt {
 	u32 flags;
 };
=20
-/* Flags */
+/* Masks for Flags field above */
=20
 #define ACPI_MADT_PCAT_COMPAT       (1)	/* 00:    System also has =
dual 8259s */
=20
@@ -495,7 +617,7 @@ struct acpi_table_madt {
 #define ACPI_MADT_DUAL_PIC          0
 #define ACPI_MADT_MULTIPLE_APIC     1
=20
-/* Values for subtable type in struct acpi_subtable_header */
+/* Values for MADT subtable type in struct acpi_subtable_header */
=20
 enum acpi_madt_type {
 	ACPI_MADT_TYPE_LOCAL_APIC =3D 0,
@@ -606,7 +728,7 @@ struct acpi_madt_interrupt_source {
 	u32 flags;		/* Interrupt Source Flags */
 };
=20
-/* Flags field above */
+/* Masks for Flags field above */
=20
 #define ACPI_MADT_CPEI_OVERRIDE     (1)
=20
@@ -615,9 +737,9 @@ struct acpi_madt_interrupt_source {
 struct acpi_madt_local_x2apic {
 	struct acpi_subtable_header header;
 	u16 reserved;		/* Reserved - must be zero */
-	u32 local_apic_id;	/* Processor X2_APIC ID  */
+	u32 local_apic_id;	/* Processor x2APIC ID  */
 	u32 lapic_flags;
-	u32 uid;		/* Extended X2_APIC processor ID */
+	u32 uid;		/* ACPI processor UID */
 };
=20
 /* 10: Local X2APIC NMI (ACPI 4.0) */
@@ -625,7 +747,7 @@ struct acpi_madt_local_x2apic {
 struct acpi_madt_local_x2apic_nmi {
 	struct acpi_subtable_header header;
 	u16 inti_flags;
-	u32 uid;		/* Processor X2_APIC ID */
+	u32 uid;		/* ACPI processor UID */
 	u8 lint;		/* LINTn to which NMI is connected */
 	u8 reserved[3];
 };
@@ -657,28 +779,34 @@ struct acpi_madt_local_x2apic_nmi {
=20
 /*************************************************************************=
******
  *
- * MCFG - PCI Memory Mapped Configuration table and sub-table
+ * MSCT - Maximum System Characteristics Table (ACPI 4.0)
+ *        Version 1
  *
  *************************************************************************=
*****/
=20
-struct acpi_table_mcfg {
+struct acpi_table_msct {
 	struct acpi_table_header header;	/* Common ACPI table =
header */
-	u8 reserved[8];
+	u32 proximity_offset;	/* Location of proximity info struct(s) */
+	u32 max_proximity_domains;	/* Max number of proximity domains =
*/
+	u32 max_clock_domains;	/* Max number of clock domains */
+	u64 max_address;	/* Max physical address in system */
 };
=20
-/* Subtable */
+/* Subtable - Maximum Proximity Domain Information. Version 1 */
=20
-struct acpi_mcfg_allocation {
-	u64 address;		/* Base address, processor-relative */
-	u16 pci_segment;	/* PCI segment group number */
-	u8 start_bus_number;	/* Starting PCI Bus number */
-	u8 end_bus_number;	/* Final PCI Bus number */
-	u32 reserved;
+struct acpi_msct_proximity {
+	u8 revision;
+	u8 length;
+	u32 range_start;	/* Start of domain range */
+	u32 range_end;		/* End of domain range */
+	u32 processor_capacity;
+	u64 memory_capacity;	/* In bytes */
 };
=20
 /*************************************************************************=
******
  *
  * SBST - Smart Battery Specification Table
+ *        Version 1
  *
  *************************************************************************=
*****/
=20
@@ -692,6 +820,7 @@ struct acpi_table_sbst {
 /*************************************************************************=
******
  *
  * SLIT - System Locality Distance Information Table
+ *        Version 1
  *
  *************************************************************************=
*****/
=20
@@ -703,60 +832,8 @@ struct acpi_table_slit {
=20
 /*************************************************************************=
******
  *
- * SPCR - Serial Port Console Redirection table
- *
- *************************************************************************=
*****/
-
-struct acpi_table_spcr {
-	struct acpi_table_header header;	/* Common ACPI table =
header */
-	u8 interface_type;	/* 0=3Dfull 16550, 1=3Dsubset of 16550 */
-	u8 reserved[3];
-	struct acpi_generic_address serial_port;
-	u8 interrupt_type;
-	u8 pc_interrupt;
-	u32 interrupt;
-	u8 baud_rate;
-	u8 parity;
-	u8 stop_bits;
-	u8 flow_control;
-	u8 terminal_type;
-	u8 reserved1;
-	u16 pci_device_id;
-	u16 pci_vendor_id;
-	u8 pci_bus;
-	u8 pci_device;
-	u8 pci_function;
-	u32 pci_flags;
-	u8 pci_segment;
-	u32 reserved2;
-};
-
-/*************************************************************************=
******
- *
- * SPMI - Server Platform Management Interface table
- *
- *************************************************************************=
*****/
-
-struct acpi_table_spmi {
-	struct acpi_table_header header;	/* Common ACPI table =
header */
-	u8 reserved;
-	u8 interface_type;
-	u16 spec_revision;	/* Version of IPMI */
-	u8 interrupt_type;
-	u8 gpe_number;		/* GPE assigned */
-	u8 reserved1;
-	u8 pci_device_flag;
-	u32 interrupt;
-	struct acpi_generic_address ipmi_register;
-	u8 pci_segment;
-	u8 pci_bus;
-	u8 pci_device;
-	u8 pci_function;
-};
-
-/*************************************************************************=
******
- *
  * SRAT - System Resource Affinity Table
+ *        Version 3
  *
  *************************************************************************=
*****/
=20
@@ -775,7 +852,9 @@ enum acpi_srat_type {
 	ACPI_SRAT_TYPE_RESERVED =3D 3	/* 3 and greater are reserved */
 };
=20
-/* SRAT sub-tables */
+/*
+ * SRAT Sub-tables, correspond to Type in struct acpi_subtable_header
+ */
=20
 /* 0: Processor Local APIC/SAPIC Affinity */
=20
@@ -789,6 +868,10 @@ struct acpi_srat_cpu_affinity {
 	u32 reserved;		/* Reserved, must be zero */
 };
=20
+/* Flags */
+
+#define ACPI_SRAT_CPU_USE_AFFINITY  (1)	/* 00: Use affinity =
structure */
+
 /* 1: Memory Affinity */
=20
 struct acpi_srat_mem_affinity {
@@ -797,9 +880,9 @@ struct acpi_srat_mem_affinity {
 	u16 reserved;		/* Reserved, must be zero */
 	u64 base_address;
 	u64 length;
-	u32 memory_type;	/* See acpi_address_range_id */
+	u32 reserved1;
 	u32 flags;
-	u64 reserved1;		/* Reserved, must be zero */
+	u64 reserved2;		/* Reserved, must be zero */
 };
=20
 /* Flags */
@@ -824,44 +907,6 @@ struct acpi_srat_x2apic_cpu_affinity {
=20
 #define ACPI_SRAT_CPU_ENABLED       (1)	/* 00: Use affinity =
structure */
=20
-/*************************************************************************=
******
- *
- * TCPA - Trusted Computing Platform Alliance table
- *
- *************************************************************************=
*****/
-
-struct acpi_table_tcpa {
-	struct acpi_table_header header;	/* Common ACPI table =
header */
-	u16 reserved;
-	u32 max_log_length;	/* Maximum length for the event log area =
*/
-	u64 log_address;	/* Address of the event log area */
-};
-
-/*************************************************************************=
******
- *
- * WDRT - Watchdog Resource Table
- *
- *************************************************************************=
*****/
-
-struct acpi_table_wdrt {
-	struct acpi_table_header header;	/* Common ACPI table =
header */
-	u32 header_length;	/* Watchdog Header Length */
-	u8 pci_segment;		/* PCI Segment number */
-	u8 pci_bus;		/* PCI Bus number */
-	u8 pci_device;		/* PCI Device number */
-	u8 pci_function;	/* PCI Function number */
-	u32 timer_period;	/* Period of one timer count (msec) */
-	u32 max_count;		/* Maximum counter value supported */
-	u32 min_count;		/* Minimum counter value */
-	u8 flags;
-	u8 reserved[3];
-	u32 entries;		/* Number of watchdog entries that follow =
*/
-};
-
-/* Flags */
-
-#define ACPI_WDRT_TIMER_ENABLED     (1)	/* 00: Timer enabled */
-
 /* Reset to default packing */
=20
 #pragma pack()
--- /dev/null
+++ a/xen/include/acpi/actbl2.h
@@ -0,0 +1,1050 @@
+/*************************************************************************=
*****
+ *
+ * Name: actbl2.h - ACPI Table Definitions (tables not in ACPI spec)
+ *
+ *************************************************************************=
****/
+
+/*
+ * Copyright (C) 2000 - 2011, Intel Corp.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a =
disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for =
further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the =
names
+ *    of any contributors may be used to endorse or promote products =
derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENT=
IAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE =
GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ */
+
+#ifndef __ACTBL2_H__
+#define __ACTBL2_H__
+
+/*************************************************************************=
******
+ *
+ * Additional ACPI Tables (2)
+ *
+ * These tables are not consumed directly by the ACPICA subsystem, but =
are
+ * included here to support device drivers and the AML disassembler.
+ *
+ * The tables in this file are defined by third-party specifications, and =
are
+ * not defined directly by the ACPI specification itself.
+ *
+ *************************************************************************=
*****/
+
+/*
+ * Values for description table header signatures for tables defined in =
this
+ * file. Useful because they make it more difficult to inadvertently type =
in
+ * the wrong signature.
+ */
+#define ACPI_SIG_ASF            "ASF!"	/* Alert Standard Format table */
+#define ACPI_SIG_BOOT           "BOOT"	/* Simple Boot Flag Table */
+#define ACPI_SIG_DBGP           "DBGP"	/* Debug Port table */
+#define ACPI_SIG_DMAR           "DMAR"	/* DMA Remapping table */
+#define ACPI_SIG_HPET           "HPET"	/* High Precision Event Timer =
table */
+#define ACPI_SIG_IBFT           "IBFT"	/* i_sCSI Boot Firmware Table */
+#define ACPI_SIG_IVRS           "IVRS"	/* I/O Virtualization Reporting =
Structure */
+#define ACPI_SIG_MCFG           "MCFG"	/* PCI Memory Mapped Configuration =
table */
+#define ACPI_SIG_MCHI           "MCHI"	/* Management Controller Host =
Interface table */
+#define ACPI_SIG_SLIC           "SLIC"	/* Software Licensing Description =
Table */
+#define ACPI_SIG_SPCR           "SPCR"	/* Serial Port Console Redirection =
table */
+#define ACPI_SIG_SPMI           "SPMI"	/* Server Platform Management =
Interface table */
+#define ACPI_SIG_TCPA           "TCPA"	/* Trusted Computing Platform =
Alliance table */
+#define ACPI_SIG_UEFI           "UEFI"	/* Uefi Boot Optimization Table */
+#define ACPI_SIG_WAET           "WAET"	/* Windows ACPI Emulated devices =
Table */
+#define ACPI_SIG_WDAT           "WDAT"	/* Watchdog Action Table */
+#define ACPI_SIG_WDDT           "WDDT"	/* Watchdog Timer Description =
Table */
+#define ACPI_SIG_WDRT           "WDRT"	/* Watchdog Resource Table */
+
+#ifdef ACPI_UNDEFINED_TABLES
+/*
+ * These tables have been seen in the field, but no definition has been =
found
+ */
+#define ACPI_SIG_ATKG           "ATKG"
+#define ACPI_SIG_GSCI           "GSCI"	/* GMCH SCI table */
+#define ACPI_SIG_IEIT           "IEIT"
+#endif
+
+/*
+ * All tables must be byte-packed to match the ACPI specification, since
+ * the tables are provided by the system BIOS.
+ */
+#pragma pack(1)
+
+/*
+ * Note about bitfields: The u8 type is used for bitfields in ACPI =
tables.
+ * This is the only type that is even remotely portable. Anything else is =
not
+ * portable, so do not use any other bitfield types.
+ */
+
+/*************************************************************************=
******
+ *
+ * ASF - Alert Standard Format table (Signature "ASF!")
+ *       Revision 0x10
+ *
+ * Conforms to the Alert Standard Format Specification V2.0, 23 April =
2003
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_asf {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+};
+
+/* ASF subtable header */
+
+struct acpi_asf_header {
+	u8 type;
+	u8 reserved;
+	u16 length;
+};
+
+/* Values for Type field above */
+
+enum acpi_asf_type {
+	ACPI_ASF_TYPE_INFO =3D 0,
+	ACPI_ASF_TYPE_ALERT =3D 1,
+	ACPI_ASF_TYPE_CONTROL =3D 2,
+	ACPI_ASF_TYPE_BOOT =3D 3,
+	ACPI_ASF_TYPE_ADDRESS =3D 4,
+	ACPI_ASF_TYPE_RESERVED =3D 5
+};
+
+/*
+ * ASF subtables
+ */
+
+/* 0: ASF Information */
+
+struct acpi_asf_info {
+	struct acpi_asf_header header;
+	u8 min_reset_value;
+	u8 min_poll_interval;
+	u16 system_id;
+	u32 mfg_id;
+	u8 flags;
+	u8 reserved2[3];
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_ASF_SMBUS_PROTOCOLS    (1)
+
+/* 1: ASF Alerts */
+
+struct acpi_asf_alert {
+	struct acpi_asf_header header;
+	u8 assert_mask;
+	u8 deassert_mask;
+	u8 alerts;
+	u8 data_length;
+};
+
+struct acpi_asf_alert_data {
+	u8 address;
+	u8 command;
+	u8 mask;
+	u8 value;
+	u8 sensor_type;
+	u8 type;
+	u8 offset;
+	u8 source_type;
+	u8 severity;
+	u8 sensor_number;
+	u8 entity;
+	u8 instance;
+};
+
+/* 2: ASF Remote Control */
+
+struct acpi_asf_remote {
+	struct acpi_asf_header header;
+	u8 controls;
+	u8 data_length;
+	u16 reserved2;
+};
+
+struct acpi_asf_control_data {
+	u8 function;
+	u8 address;
+	u8 command;
+	u8 value;
+};
+
+/* 3: ASF RMCP Boot Options */
+
+struct acpi_asf_rmcp {
+	struct acpi_asf_header header;
+	u8 capabilities[7];
+	u8 completion_code;
+	u32 enterprise_id;
+	u8 command;
+	u16 parameter;
+	u16 boot_options;
+	u16 oem_parameters;
+};
+
+/* 4: ASF Address */
+
+struct acpi_asf_address {
+	struct acpi_asf_header header;
+	u8 eprom_address;
+	u8 devices;
+};
+
+/*************************************************************************=
******
+ *
+ * BOOT - Simple Boot Flag Table
+ *        Version 1
+ *
+ * Conforms to the "Simple Boot Flag Specification", Version 2.1
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_boot {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u8 cmos_index;		/* Index in CMOS RAM for the boot register =
*/
+	u8 reserved[3];
+};
+
+/*************************************************************************=
******
+ *
+ * DBGP - Debug Port table
+ *        Version 1
+ *
+ * Conforms to the "Debug Port Specification", Version 1.00, 2/9/2000
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_dbgp {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u8 type;		/* 0=3Dfull 16550, 1=3Dsubset of 16550 */
+	u8 reserved[3];
+	struct acpi_generic_address debug_port;
+};
+
+/*************************************************************************=
******
+ *
+ * DMAR - DMA Remapping table
+ *        Version 1
+ *
+ * Conforms to "Intel Virtualization Technology for Directed I/O",
+ * Version 1.2, Sept. 2008
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_dmar {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u8 width;		/* Host Address Width */
+	u8 flags;
+	u8 reserved[10];
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_DMAR_INTR_REMAP        (1)
+#define ACPI_DMAR_X2APIC_OPT_OUT    (1<<1)
+
+/* DMAR subtable header */
+
+struct acpi_dmar_header {
+	u16 type;
+	u16 length;
+};
+
+/* Values for subtable type in struct acpi_dmar_header */
+
+enum acpi_dmar_type {
+	ACPI_DMAR_TYPE_HARDWARE_UNIT =3D 0,
+	ACPI_DMAR_TYPE_RESERVED_MEMORY =3D 1,
+	ACPI_DMAR_TYPE_ATSR =3D 2,
+	ACPI_DMAR_HARDWARE_AFFINITY =3D 3,
+	ACPI_DMAR_TYPE_RESERVED =3D 4	/* 4 and greater are reserved */
+};
+
+/* DMAR Device Scope structure */
+
+struct acpi_dmar_device_scope {
+	u8 entry_type;
+	u8 length;
+	u16 reserved;
+	u8 enumeration_id;
+	u8 bus;
+};
+
+/* Values for entry_type in struct acpi_dmar_device_scope */
+
+enum acpi_dmar_scope_type {
+	ACPI_DMAR_SCOPE_TYPE_NOT_USED =3D 0,
+	ACPI_DMAR_SCOPE_TYPE_ENDPOINT =3D 1,
+	ACPI_DMAR_SCOPE_TYPE_BRIDGE =3D 2,
+	ACPI_DMAR_SCOPE_TYPE_IOAPIC =3D 3,
+	ACPI_DMAR_SCOPE_TYPE_HPET =3D 4,
+	ACPI_DMAR_SCOPE_TYPE_RESERVED =3D 5	/* 5 and greater are =
reserved */
+};
+
+struct acpi_dmar_pci_path {
+	u8 dev;
+	u8 fn;
+};
+
+/*
+ * DMAR Sub-tables, correspond to Type in struct acpi_dmar_header
+ */
+
+/* 0: Hardware Unit Definition */
+
+struct acpi_dmar_hardware_unit {
+	struct acpi_dmar_header header;
+	u8 flags;
+	u8 reserved;
+	u16 segment;
+	u64 address;		/* Register Base Address */
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_DMAR_INCLUDE_ALL       (1)
+
+/* 1: Reserved Memory Defininition */
+
+struct acpi_dmar_reserved_memory {
+	struct acpi_dmar_header header;
+	u16 reserved;
+	u16 segment;
+	u64 base_address;	/* 4_k aligned base address */
+	u64 end_address;	/* 4_k aligned limit address */
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_DMAR_ALLOW_ALL         (1)
+
+/* 2: Root Port ATS Capability Reporting Structure */
+
+struct acpi_dmar_atsr {
+	struct acpi_dmar_header header;
+	u8 flags;
+	u8 reserved;
+	u16 segment;
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_DMAR_ALL_PORTS         (1)
+
+/* 3: Remapping Hardware Static Affinity Structure */
+
+struct acpi_dmar_rhsa {
+	struct acpi_dmar_header header;
+	u32 reserved;
+	u64 base_address;
+	u32 proximity_domain;
+};
+
+/*************************************************************************=
******
+ *
+ * HPET - High Precision Event Timer table
+ *        Version 1
+ *
+ * Conforms to "IA-PC HPET (High Precision Event Timers) Specification",
+ * Version 1.0a, October 2004
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_hpet {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u32 id;			/* Hardware ID of event timer block */
+	struct acpi_generic_address address;	/* Address of event timer =
block */
+	u8 sequence;		/* HPET sequence number */
+	u16 minimum_tick;	/* Main counter min tick, periodic mode */
+	u8 flags;
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_HPET_PAGE_PROTECT_MASK (3)
+
+/* Values for Page Protect flags */
+
+enum acpi_hpet_page_protect {
+	ACPI_HPET_NO_PAGE_PROTECT =3D 0,
+	ACPI_HPET_PAGE_PROTECT4 =3D 1,
+	ACPI_HPET_PAGE_PROTECT64 =3D 2
+};
+
+/*************************************************************************=
******
+ *
+ * IBFT - Boot Firmware Table
+ *        Version 1
+ *
+ * Conforms to "iSCSI Boot Firmware Table (iBFT) as Defined in ACPI 3.0b
+ * Specification", Version 1.01, March 1, 2007
+ *
+ * Note: It appears that this table is not intended to appear in the =
RSDT/XSDT.
+ * Therefore, it is not currently supported by the disassembler.
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_ibft {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u8 reserved[12];
+};
+
+/* IBFT common subtable header */
+
+struct acpi_ibft_header {
+	u8 type;
+	u8 version;
+	u16 length;
+	u8 index;
+	u8 flags;
+};
+
+/* Values for Type field above */
+
+enum acpi_ibft_type {
+	ACPI_IBFT_TYPE_NOT_USED =3D 0,
+	ACPI_IBFT_TYPE_CONTROL =3D 1,
+	ACPI_IBFT_TYPE_INITIATOR =3D 2,
+	ACPI_IBFT_TYPE_NIC =3D 3,
+	ACPI_IBFT_TYPE_TARGET =3D 4,
+	ACPI_IBFT_TYPE_EXTENSIONS =3D 5,
+	ACPI_IBFT_TYPE_RESERVED =3D 6	/* 6 and greater are reserved */
+};
+
+/* IBFT subtables */
+
+struct acpi_ibft_control {
+	struct acpi_ibft_header header;
+	u16 extensions;
+	u16 initiator_offset;
+	u16 nic0_offset;
+	u16 target0_offset;
+	u16 nic1_offset;
+	u16 target1_offset;
+};
+
+struct acpi_ibft_initiator {
+	struct acpi_ibft_header header;
+	u8 sns_server[16];
+	u8 slp_server[16];
+	u8 primary_server[16];
+	u8 secondary_server[16];
+	u16 name_length;
+	u16 name_offset;
+};
+
+struct acpi_ibft_nic {
+	struct acpi_ibft_header header;
+	u8 ip_address[16];
+	u8 subnet_mask_prefix;
+	u8 origin;
+	u8 gateway[16];
+	u8 primary_dns[16];
+	u8 secondary_dns[16];
+	u8 dhcp[16];
+	u16 vlan;
+	u8 mac_address[6];
+	u16 pci_address;
+	u16 name_length;
+	u16 name_offset;
+};
+
+struct acpi_ibft_target {
+	struct acpi_ibft_header header;
+	u8 target_ip_address[16];
+	u16 target_ip_socket;
+	u8 target_boot_lun[8];
+	u8 chap_type;
+	u8 nic_association;
+	u16 target_name_length;
+	u16 target_name_offset;
+	u16 chap_name_length;
+	u16 chap_name_offset;
+	u16 chap_secret_length;
+	u16 chap_secret_offset;
+	u16 reverse_chap_name_length;
+	u16 reverse_chap_name_offset;
+	u16 reverse_chap_secret_length;
+	u16 reverse_chap_secret_offset;
+};
+
+/*************************************************************************=
******
+ *
+ * IVRS - I/O Virtualization Reporting Structure
+ *        Version 1
+ *
+ * Conforms to "AMD I/O Virtualization Technology (IOMMU) Specification",
+ * Revision 1.26, February 2009.
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_ivrs {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u32 info;		/* Common virtualization info */
+	u64 reserved;
+};
+
+/* Values for Info field above */
+
+#define ACPI_IVRS_PHYSICAL_SIZE     0x00007F00	/* 7 bits, physical =
address size */
+#define ACPI_IVRS_VIRTUAL_SIZE      0x003F8000	/* 7 bits, virtual address =
size */
+#define ACPI_IVRS_ATS_RESERVED      0x00400000	/* ATS address translation =
range reserved */
+
+/* IVRS subtable header */
+
+struct acpi_ivrs_header {
+	u8 type;		/* Subtable type */
+	u8 flags;
+	u16 length;		/* Subtable length */
+	u16 device_id;		/* ID of IOMMU */
+};
+
+/* Values for subtable Type above */
+
+enum acpi_ivrs_type {
+	ACPI_IVRS_TYPE_HARDWARE =3D 0x10,
+	ACPI_IVRS_TYPE_MEMORY_ALL /* _MEMORY1 */ =3D 0x20,
+	ACPI_IVRS_TYPE_MEMORY_ONE /* _MEMORY2 */ =3D 0x21,
+	ACPI_IVRS_TYPE_MEMORY_RANGE /* _MEMORY3 */ =3D 0x22,
+	ACPI_IVRS_TYPE_MEMORY_IOMMU =3D 0x23
+};
+
+/* Masks for Flags field above for IVHD subtable */
+
+#define ACPI_IVHD_TT_ENABLE         (1)
+#define ACPI_IVHD_PASS_PW           (1<<1)
+#define ACPI_IVHD_RES_PASS_PW       (1<<2)
+#define ACPI_IVHD_ISOC              (1<<3)
+#define ACPI_IVHD_IOTLB             (1<<4)
+
+/* Masks for Flags field above for IVMD subtable */
+
+#define ACPI_IVMD_UNITY             (1)
+#define ACPI_IVMD_READ              (1<<1)
+#define ACPI_IVMD_WRITE             (1<<2)
+#define ACPI_IVMD_EXCLUSION_RANGE   (1<<3)
+
+/*
+ * IVRS subtables, correspond to Type in struct acpi_ivrs_header
+ */
+
+/* 0x10: I/O Virtualization Hardware Definition Block (IVHD) */
+
+struct acpi_ivrs_hardware {
+	struct acpi_ivrs_header header;
+	u16 capability_offset;	/* Offset for IOMMU control fields */
+	u64 base_address;	/* IOMMU control registers */
+	u16 pci_segment_group;
+	u16 info;		/* MSI number and unit ID */
+	u32 reserved;
+};
+
+/* Masks for Info field above */
+
+#define ACPI_IVHD_MSI_NUMBER_MASK   0x001F	/* 5 bits, MSI message =
number */
+#define ACPI_IVHD_UNIT_ID_MASK      0x1F00	/* 5 bits, unit_iD */
+
+/*
+ * Device Entries for IVHD subtable, appear after struct acpi_ivrs_hardwar=
e structure.
+ * Upper two bits of the Type field are the (encoded) length of the =
structure.
+ * Currently, only 4 and 8 byte entries are defined. 16 and 32 byte =
entries
+ * are reserved for future use but not defined.
+ */
+struct acpi_ivrs_de_header {
+	u8 type;
+	u16 id;
+	u8 data_setting;
+};
+
+/* Length of device entry is in the top two bits of Type field above */
+
+#define ACPI_IVHD_ENTRY_LENGTH      0xC0
+
+/* Values for device entry Type field above */
+
+enum acpi_ivrs_device_entry_type {
+	/* 4-byte device entries, all use struct acpi_ivrs_device4 */
+
+	ACPI_IVRS_TYPE_PAD4 =3D 0,
+	ACPI_IVRS_TYPE_ALL =3D 1,
+	ACPI_IVRS_TYPE_SELECT =3D 2,
+	ACPI_IVRS_TYPE_START =3D 3,
+	ACPI_IVRS_TYPE_END =3D 4,
+
+	/* 8-byte device entries */
+
+	ACPI_IVRS_TYPE_PAD8 =3D 64,
+	ACPI_IVRS_TYPE_NOT_USED =3D 65,
+	ACPI_IVRS_TYPE_ALIAS_SELECT =3D 66,	/* Uses struct acpi_ivrs_de=
vice8a */
+	ACPI_IVRS_TYPE_ALIAS_START =3D 67,	/* Uses struct acpi_ivrs_de=
vice8a */
+	ACPI_IVRS_TYPE_EXT_SELECT =3D 70,	/* Uses struct acpi_ivrs_de=
vice8b */
+	ACPI_IVRS_TYPE_EXT_START =3D 71,	/* Uses struct acpi_ivrs_de=
vice8b */
+	ACPI_IVRS_TYPE_SPECIAL =3D 72	/* Uses struct acpi_ivrs_device8c =
*/
+};
+
+/* Values for Data field above */
+
+#define ACPI_IVHD_INIT_PASS         (1)
+#define ACPI_IVHD_EINT_PASS         (1<<1)
+#define ACPI_IVHD_NMI_PASS          (1<<2)
+#define ACPI_IVHD_SYSTEM_MGMT       (3<<4)
+#define ACPI_IVHD_LINT0_PASS        (1<<6)
+#define ACPI_IVHD_LINT1_PASS        (1<<7)
+
+/* Types 0-4: 4-byte device entry */
+
+struct acpi_ivrs_device4 {
+	struct acpi_ivrs_de_header header;
+};
+
+/* Types 66-67: 8-byte device entry */
+
+struct acpi_ivrs_device8a {
+	struct acpi_ivrs_de_header header;
+	u8 reserved1;
+	u16 used_id;
+	u8 reserved2;
+};
+
+/* Types 70-71: 8-byte device entry */
+
+struct acpi_ivrs_device8b {
+	struct acpi_ivrs_de_header header;
+	u32 extended_data;
+};
+
+/* Values for extended_data above */
+
+#define ACPI_IVHD_ATS_DISABLED      (1<<31)
+
+/* Type 72: 8-byte device entry */
+
+struct acpi_ivrs_device8c {
+	struct acpi_ivrs_de_header header;
+	u8 handle;
+	u16 used_id;
+	u8 variety;
+};
+
+/* Values for Variety field above */
+
+#define ACPI_IVHD_IOAPIC            1
+#define ACPI_IVHD_HPET              2
+
+/* 0x20, 0x21, 0x22: I/O Virtualization Memory Definition Block (IVMD) */
+
+struct acpi_ivrs_memory {
+	struct acpi_ivrs_header header;
+	u16 aux_data;
+	u64 reserved;
+	u64 start_address;
+	u64 memory_length;
+};
+
+/*************************************************************************=
******
+ *
+ * MCFG - PCI Memory Mapped Configuration table and sub-table
+ *        Version 1
+ *
+ * Conforms to "PCI Firmware Specification", Revision 3.0, June 20, 2005
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_mcfg {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u8 reserved[8];
+};
+
+/* Subtable */
+
+struct acpi_mcfg_allocation {
+	u64 address;		/* Base address, processor-relative */
+	u16 pci_segment;	/* PCI segment group number */
+	u8 start_bus_number;	/* Starting PCI Bus number */
+	u8 end_bus_number;	/* Final PCI Bus number */
+	u32 reserved;
+};
+
+/*************************************************************************=
******
+ *
+ * MCHI - Management Controller Host Interface Table
+ *        Version 1
+ *
+ * Conforms to "Management Component Transport Protocol (MCTP) Host
+ * Interface Specification", Revision 1.0.0a, October 13, 2009
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_mchi {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u8 interface_type;
+	u8 protocol;
+	u64 protocol_data;
+	u8 interrupt_type;
+	u8 gpe;
+	u8 pci_device_flag;
+	u32 global_interrupt;
+	struct acpi_generic_address control_register;
+	u8 pci_segment;
+	u8 pci_bus;
+	u8 pci_device;
+	u8 pci_function;
+};
+
+/*************************************************************************=
******
+ *
+ * SLIC - Software Licensing Description Table
+ *        Version 1
+ *
+ * Conforms to "OEM Activation 2.0 for Windows Vista Operating Systems",
+ * Copyright 2006
+ *
+ *************************************************************************=
*****/
+
+/* Basic SLIC table is only the common ACPI header */
+
+struct acpi_table_slic {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+};
+
+/* Common SLIC subtable header */
+
+struct acpi_slic_header {
+	u32 type;
+	u32 length;
+};
+
+/* Values for Type field above */
+
+enum acpi_slic_type {
+	ACPI_SLIC_TYPE_PUBLIC_KEY =3D 0,
+	ACPI_SLIC_TYPE_WINDOWS_MARKER =3D 1,
+	ACPI_SLIC_TYPE_RESERVED =3D 2	/* 2 and greater are reserved */
+};
+
+/*
+ * SLIC Sub-tables, correspond to Type in struct acpi_slic_header
+ */
+
+/* 0: Public Key Structure */
+
+struct acpi_slic_key {
+	struct acpi_slic_header header;
+	u8 key_type;
+	u8 version;
+	u16 reserved;
+	u32 algorithm;
+	char magic[4];
+	u32 bit_length;
+	u32 exponent;
+	u8 modulus[128];
+};
+
+/* 1: Windows Marker Structure */
+
+struct acpi_slic_marker {
+	struct acpi_slic_header header;
+	u32 version;
+	char oem_id[ACPI_OEM_ID_SIZE];	/* ASCII OEM identification */
+	char oem_table_id[ACPI_OEM_TABLE_ID_SIZE];	/* ASCII OEM table =
identification */
+	char windows_flag[8];
+	u32 slic_version;
+	u8 reserved[16];
+	u8 signature[128];
+};
+
+/*************************************************************************=
******
+ *
+ * SPCR - Serial Port Console Redirection table
+ *        Version 1
+ *
+ * Conforms to "Serial Port Console Redirection Table",
+ * Version 1.00, January 11, 2002
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_spcr {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u8 interface_type;	/* 0=3Dfull 16550, 1=3Dsubset of 16550 */
+	u8 reserved[3];
+	struct acpi_generic_address serial_port;
+	u8 interrupt_type;
+	u8 pc_interrupt;
+	u32 interrupt;
+	u8 baud_rate;
+	u8 parity;
+	u8 stop_bits;
+	u8 flow_control;
+	u8 terminal_type;
+	u8 reserved1;
+	u16 pci_device_id;
+	u16 pci_vendor_id;
+	u8 pci_bus;
+	u8 pci_device;
+	u8 pci_function;
+	u32 pci_flags;
+	u8 pci_segment;
+	u32 reserved2;
+};
+
+/* Masks for pci_flags field above */
+
+#define ACPI_SPCR_DO_NOT_DISABLE    (1)
+
+/*************************************************************************=
******
+ *
+ * SPMI - Server Platform Management Interface table
+ *        Version 5
+ *
+ * Conforms to "Intelligent Platform Management Interface Specification
+ * Second Generation v2.0", Document Revision 1.0, February 12, 2004 with
+ * June 12, 2009 markup.
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_spmi {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u8 interface_type;
+	u8 reserved;		/* Must be 1 */
+	u16 spec_revision;	/* Version of IPMI */
+	u8 interrupt_type;
+	u8 gpe_number;		/* GPE assigned */
+	u8 reserved1;
+	u8 pci_device_flag;
+	u32 interrupt;
+	struct acpi_generic_address ipmi_register;
+	u8 pci_segment;
+	u8 pci_bus;
+	u8 pci_device;
+	u8 pci_function;
+	u8 reserved2;
+};
+
+/* Values for interface_type above */
+
+enum acpi_spmi_interface_types {
+	ACPI_SPMI_NOT_USED =3D 0,
+	ACPI_SPMI_KEYBOARD =3D 1,
+	ACPI_SPMI_SMI =3D 2,
+	ACPI_SPMI_BLOCK_TRANSFER =3D 3,
+	ACPI_SPMI_SMBUS =3D 4,
+	ACPI_SPMI_RESERVED =3D 5	/* 5 and above are reserved */
+};
+
+/*************************************************************************=
******
+ *
+ * TCPA - Trusted Computing Platform Alliance table
+ *        Version 1
+ *
+ * Conforms to "TCG PC Specific Implementation Specification",
+ * Version 1.1, August 18, 2003
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_tcpa {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u16 reserved;
+	u32 max_log_length;	/* Maximum length for the event log area =
*/
+	u64 log_address;	/* Address of the event log area */
+};
+
+/*************************************************************************=
******
+ *
+ * UEFI - UEFI Boot optimization Table
+ *        Version 1
+ *
+ * Conforms to "Unified Extensible Firmware Interface Specification",
+ * Version 2.3, May 8, 2009
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_uefi {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u8 identifier[16];	/* UUID identifier */
+	u16 data_offset;	/* Offset of remaining data in table */
+};
+
+/*************************************************************************=
******
+ *
+ * WAET - Windows ACPI Emulated devices Table
+ *        Version 1
+ *
+ * Conforms to "Windows ACPI Emulated Devices Table", version 1.0, April =
6, 2009
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_waet {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u32 flags;
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_WAET_RTC_NO_ACK        (1)	/* RTC requires no int =
acknowledge */
+#define ACPI_WAET_TIMER_ONE_READ    (1<<1)	/* PM timer requires only =
one read */
+
+/*************************************************************************=
******
+ *
+ * WDAT - Watchdog Action Table
+ *        Version 1
+ *
+ * Conforms to "Hardware Watchdog Timers Design Specification",
+ * Copyright 2006 Microsoft Corporation.
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_wdat {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u32 header_length;	/* Watchdog Header Length */
+	u16 pci_segment;	/* PCI Segment number */
+	u8 pci_bus;		/* PCI Bus number */
+	u8 pci_device;		/* PCI Device number */
+	u8 pci_function;	/* PCI Function number */
+	u8 reserved[3];
+	u32 timer_period;	/* Period of one timer count (msec) */
+	u32 max_count;		/* Maximum counter value supported */
+	u32 min_count;		/* Minimum counter value */
+	u8 flags;
+	u8 reserved2[3];
+	u32 entries;		/* Number of watchdog entries that follow =
*/
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_WDAT_ENABLED           (1)
+#define ACPI_WDAT_STOPPED           0x80
+
+/* WDAT Instruction Entries (actions) */
+
+struct acpi_wdat_entry {
+	u8 action;
+	u8 instruction;
+	u16 reserved;
+	struct acpi_generic_address register_region;
+	u32 value;		/* Value used with Read/Write register */
+	u32 mask;		/* Bitmask required for this register =
instruction */
+};
+
+/* Values for Action field above */
+
+enum acpi_wdat_actions {
+	ACPI_WDAT_RESET =3D 1,
+	ACPI_WDAT_GET_CURRENT_COUNTDOWN =3D 4,
+	ACPI_WDAT_GET_COUNTDOWN =3D 5,
+	ACPI_WDAT_SET_COUNTDOWN =3D 6,
+	ACPI_WDAT_GET_RUNNING_STATE =3D 8,
+	ACPI_WDAT_SET_RUNNING_STATE =3D 9,
+	ACPI_WDAT_GET_STOPPED_STATE =3D 10,
+	ACPI_WDAT_SET_STOPPED_STATE =3D 11,
+	ACPI_WDAT_GET_REBOOT =3D 16,
+	ACPI_WDAT_SET_REBOOT =3D 17,
+	ACPI_WDAT_GET_SHUTDOWN =3D 18,
+	ACPI_WDAT_SET_SHUTDOWN =3D 19,
+	ACPI_WDAT_GET_STATUS =3D 32,
+	ACPI_WDAT_SET_STATUS =3D 33,
+	ACPI_WDAT_ACTION_RESERVED =3D 34	/* 34 and greater are =
reserved */
+};
+
+/* Values for Instruction field above */
+
+enum acpi_wdat_instructions {
+	ACPI_WDAT_READ_VALUE =3D 0,
+	ACPI_WDAT_READ_COUNTDOWN =3D 1,
+	ACPI_WDAT_WRITE_VALUE =3D 2,
+	ACPI_WDAT_WRITE_COUNTDOWN =3D 3,
+	ACPI_WDAT_INSTRUCTION_RESERVED =3D 4,	/* 4 and greater are =
reserved */
+	ACPI_WDAT_PRESERVE_REGISTER =3D 0x80	/* Except for this value =
*/
+};
+
+/*************************************************************************=
******
+ *
+ * WDDT - Watchdog Descriptor Table
+ *        Version 1
+ *
+ * Conforms to "Using the Intel ICH Family Watchdog Timer (WDT)",
+ * Version 001, September 2002
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_wddt {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	u16 spec_version;
+	u16 table_version;
+	u16 pci_vendor_id;
+	struct acpi_generic_address address;
+	u16 max_count;		/* Maximum counter value supported */
+	u16 min_count;		/* Minimum counter value supported */
+	u16 period;
+	u16 status;
+	u16 capability;
+};
+
+/* Flags for Status field above */
+
+#define ACPI_WDDT_AVAILABLE     (1)
+#define ACPI_WDDT_ACTIVE        (1<<1)
+#define ACPI_WDDT_TCO_OS_OWNED  (1<<2)
+#define ACPI_WDDT_USER_RESET    (1<<11)
+#define ACPI_WDDT_WDT_RESET     (1<<12)
+#define ACPI_WDDT_POWER_FAIL    (1<<13)
+#define ACPI_WDDT_UNKNOWN_RESET (1<<14)
+
+/* Flags for Capability field above */
+
+#define ACPI_WDDT_AUTO_RESET    (1)
+#define ACPI_WDDT_ALERT_SUPPORT (1<<1)
+
+/*************************************************************************=
******
+ *
+ * WDRT - Watchdog Resource Table
+ *        Version 1
+ *
+ * Conforms to "Watchdog Timer Hardware Requirements for Windows Server =
2003",
+ * Version 1.01, August 28, 2006
+ *
+ *************************************************************************=
*****/
+
+struct acpi_table_wdrt {
+	struct acpi_table_header header;	/* Common ACPI table =
header */
+	struct acpi_generic_address control_register;
+	struct acpi_generic_address count_register;
+	u16 pci_device_id;
+	u16 pci_vendor_id;
+	u8 pci_bus;		/* PCI Bus number */
+	u8 pci_device;		/* PCI Device number */
+	u8 pci_function;	/* PCI Function number */
+	u8 pci_segment;		/* PCI Segment number */
+	u16 max_count;		/* Maximum counter value supported */
+	u8 units;
+};
+
+/* Reset to default packing */
+
+#pragma pack()
+
+#endif				/* __ACTBL2_H__ */



--=__Part96B93371.0__=
Content-Type: text/plain; name="acpi-update-structs.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="acpi-update-structs.patch"

ACPI: update table interface headers=0A=0A... to what is being used on =
Linux 3.1 (and 3.2-rc).=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=
=0A=0A--- a/xen/drivers/acpi/numa.c=0A+++ b/xen/drivers/acpi/numa.c=0A@@ =
-78,9 +78,11 @@ void __init acpi_table_print_srat_entry(=0A 			=
if (srat_rev < 2)=0A 				proximity_domain &=3D =
0xff;=0A 			ACPI_DEBUG_PRINT((ACPI_DB_INFO,=0A-		=
			  "SRAT Memory (0x%016"PRIx64" length 0x%016"PRIx64=
" type 0x%x) in proximity domain %d %s%s\n",=0A+				=
	  "SRAT Memory (%#016"PRIx64=0A+					=
  " length %#016"PRIx64")"=0A+					  " in =
proximity domain %d %s%s\n",=0A 					  =
p->base_address, p->length,=0A-					  =
p->memory_type, proximity_domain,=0A+					  =
proximity_domain,=0A 					  p->flags & =
ACPI_SRAT_MEM_ENABLED=0A 					  ? =
"enabled" : "disabled",=0A 					  p->flags =
& ACPI_SRAT_MEM_HOT_PLUGGABLE=0A--- a/xen/include/acpi/actbl.h=0A+++ =
b/xen/include/acpi/actbl.h=0A@@ -5,7 +5,7 @@=0A  **************************=
***************************************************/=0A =0A /*=0A- * =
Copyright (C) 2000 - 2007, R. Byron Moore=0A+ * Copyright (C) 2000 - 2011, =
Intel Corp.=0A  * All rights reserved.=0A  *=0A  * Redistribution and use =
in source and binary forms, with or without=0A@@ -44,9 +44,23 @@=0A =
#ifndef __ACTBL_H__=0A #define __ACTBL_H__=0A =0A+/************************=
*******************************************************=0A+ *=0A+ * =
Fundamental ACPI tables=0A+ *=0A+ * This file contains definitions for the =
ACPI tables that are directly consumed=0A+ * by ACPICA. All other tables =
are consumed by the OS-dependent ACPI-related=0A+ * device drivers and =
other OS support code.=0A+ *=0A+ * The RSDP and FACS do not use the common =
ACPI table header. All other ACPI=0A+ * tables use the header.=0A+ *=0A+ =
***************************************************************************=
***/=0A+=0A /*=0A- * Values for description table header signatures. =
Useful because they make=0A- * it more difficult to inadvertently type in =
the wrong signature.=0A+ * Values for description table header signatures =
for tables defined in this=0A+ * file. Useful because they make it more =
difficult to inadvertently type in=0A+ * the wrong signature.=0A  */=0A =
#define ACPI_SIG_DSDT           "DSDT"	/* Differentiated System Descriptio=
n Table */=0A #define ACPI_SIG_FADT           "FACP"	/* Fixed ACPI =
Description Table */=0A@@ -65,11 +79,6 @@=0A #pragma pack(1)=0A =0A /*=0A- =
* These are the ACPI tables that are directly consumed by the subsystem.=0A=
- *=0A- * The RSDP and FACS do not use the common ACPI table header. All =
other ACPI=0A- * tables use the header.=0A- *=0A  * Note about bitfields: =
The u8 type is used for bitfields in ACPI tables.=0A  * This is the only =
type that is even remotely portable. Anything else is not=0A  * portable, =
so do not use any other bitfield types.=0A@@ -77,9 +86,8 @@=0A =0A =
/**************************************************************************=
*****=0A  *=0A- * ACPI Table Header. This common header is used by all =
tables except the=0A- * RSDP and FACS. The define is used for direct =
inclusion of header into=0A- * other ACPI tables=0A+ * Master ACPI Table =
Header. This common header is used by all ACPI tables=0A+ * except the =
RSDP and FACS.=0A  *=0A  **************************************************=
****************************/=0A =0A@@ -95,13 +103,16 @@ struct acpi_table_=
header {=0A 	u32 asl_compiler_revision;	/* ASL compiler version =
*/=0A };=0A =0A-/*=0A+/****************************************************=
***************************=0A+ *=0A  * GAS - Generic Address Structure =
(ACPI 2.0+)=0A  *=0A  * Note: Since this structure is used in the ACPI =
tables, it is byte aligned.=0A- * If misalignment is not supported, access =
to the Address field must be=0A- * performed with care.=0A- */=0A+ * If =
misaliged access is not supported by the hardware, accesses to the=0A+ * =
64-bit Address field must be performed with care.=0A+ *=0A+ ***************=
***************************************************************/=0A+=0A =
struct acpi_generic_address {=0A 	u8 space_id;		/* Address =
space where struct or register exists */=0A 	u8 bit_width;		/* =
Size in bits of given register */=0A@@ -113,6 +124,7 @@ struct acpi_generic=
_address {=0A /************************************************************=
*******************=0A  *=0A  * RSDP - Root System Description Pointer =
(Signature is "RSD PTR ")=0A+ *        Version 2=0A  *=0A  ****************=
**************************************************************/=0A =0A@@ =
-133,6 +145,7 @@ struct acpi_table_rsdp {=0A /*****************************=
**************************************************=0A  *=0A  * RSDT/XSDT - =
Root System Description Tables=0A+ *             Version 1 (both)=0A  *=0A =
 **************************************************************************=
****/=0A =0A@@ -161,21 +174,29 @@ struct acpi_table_facs {=0A 	u32 =
flags;=0A 	u64 xfirmware_waking_vector;	/* 64-bit version of the =
Firmware Waking Vector (ACPI 2.0+) */=0A 	u8 version;		/* =
Version of this table (ACPI 2.0+) */=0A-	u8 reserved[31];	/* =
Reserved, must be zero */=0A+	u8 reserved[3];		/* Reserved, must =
be zero */=0A+	u32 ospm_flags;		/* Flags to be set by OSPM (ACPI =
4.0) */=0A+	u8 reserved1[24];	/* Reserved, must be zero */=0A =
};=0A =0A-/* Flag macros */=0A+/* Masks for global_lock flag field above =
*/=0A+=0A+#define ACPI_GLOCK_PENDING          (1)	/* 00: Pending =
global lock ownership */=0A+#define ACPI_GLOCK_OWNED            (1<<1)	/* =
01: Global lock is owned */=0A =0A-#define ACPI_FACS_S4_BIOS_PRESENT (1)	=
/* 00: S4BIOS support is present */=0A+/* Masks for Flags field above  =
*/=0A =0A-/* Global lock flags */=0A+#define ACPI_FACS_S4_BIOS_PRESENT   =
(1)	/* 00: S4BIOS support is present */=0A+#define ACPI_FACS_64BIT_WAKE=
        (1<<1)	/* 01: 64-bit wake vector supported (ACPI 4.0) */=0A =
=0A-#define ACPI_GLOCK_PENDING      0x01	/* 00: Pending global lock =
ownership */=0A-#define ACPI_GLOCK_OWNED        0x02	/* 01: Global lock =
is owned */=0A+/* Masks for ospm_flags field above */=0A+=0A+#define =
ACPI_FACS_64BIT_ENVIRONMENT (1)	/* 00: 64-bit wake environment is required =
(ACPI 4.0) */=0A =0A /*****************************************************=
**************************=0A  *=0A  * FADT - Fixed ACPI Description Table =
(Signature "FACP")=0A+ *        Version 4=0A  *=0A  ***********************=
*******************************************************/=0A =0A@@ -214,11 =
+235,11 @@ struct acpi_table_fadt {=0A 	u16 flush_size;		/* =
Processor's memory cache line width, in bytes */=0A 	u16 flush_stride;	=
/* Number of flush strides that need to be read */=0A 	u8 duty_offset;		=
/* Processor duty cycle index in processor's P_CNT reg */=0A-	u8 =
duty_width;		/* Processor duty cycle value bit width in P_CNT =
register. */=0A+	u8 duty_width;		/* Processor duty cycle =
value bit width in P_CNT register */=0A 	u8 day_alarm;		/* =
Index to day-of-month alarm in RTC CMOS RAM */=0A 	u8 month_alarm;		=
/* Index to month-of-year alarm in RTC CMOS RAM */=0A 	u8 century;		=
/* Index to century in RTC CMOS RAM */=0A-	u16 boot_flags;		/* =
IA-PC Boot Architecture Flags. See Table 5-10 for description */=0A+	=
u16 boot_flags;		/* IA-PC Boot Architecture Flags (see below for =
individual flags) */=0A 	u8 reserved;		/* Reserved, must =
be zero */=0A 	u32 flags;		/* Miscellaneous flag bits (see =
below for individual flags) */=0A 	struct acpi_generic_address =
reset_register;	/* 64-bit address of the Reset register */=0A@@ -236,32 =
+257,41 @@ struct acpi_table_fadt {=0A 	struct acpi_generic_address =
xgpe1_block;	/* 64-bit Extended General Purpose Event 1 Reg Blk address =
*/=0A };=0A =0A-/* FADT flags */=0A+/* Masks for FADT Boot Architecture =
Flags (boot_flags) */=0A =0A-#define ACPI_FADT_WBINVD            (1)	/* =
00: The wbinvd instruction works properly */=0A-#define ACPI_FADT_WBINVD_FL=
USH      (1<<1)	/* 01: The wbinvd flushes but does not invalidate =
*/=0A-#define ACPI_FADT_C1_SUPPORTED      (1<<2)	/* 02: All =
processors support C1 state */=0A-#define ACPI_FADT_C2_MP_SUPPORTED   =
(1<<3)	/* 03: C2 state works on MP system */=0A-#define ACPI_FADT_POWER_BU=
TTON      (1<<4)	/* 04: Power button is handled as a generic =
feature */=0A-#define ACPI_FADT_SLEEP_BUTTON      (1<<5)	/* 05: =
Sleep button is handled as a generic feature, or  not present */=0A-#define=
 ACPI_FADT_FIXED_RTC         (1<<6)	/* 06: RTC wakeup stat not in =
fixed register space */=0A-#define ACPI_FADT_S4_RTC_WAKE       (1<<7)	/* =
07: RTC wakeup stat not possible from S4 */=0A-#define ACPI_FADT_32BIT_TIME=
R       (1<<8)	/* 08: tmr_val is 32 bits 0=3D24-bits */=0A-#define =
ACPI_FADT_DOCKING_SUPPORTED (1<<9)	/* 09: Docking supported */=0A-#def=
ine ACPI_FADT_RESET_REGISTER    (1<<10)	/* 10: System reset via the FADT =
RESET_REG supported */=0A-#define ACPI_FADT_SEALED_CASE       (1<<11)	/* =
11: No internal expansion capabilities and case is sealed */=0A-#define =
ACPI_FADT_HEADLESS          (1<<12)	/* 12: No local video capabilities =
or local input devices */=0A-#define ACPI_FADT_SLEEP_TYPE        (1<<13)	=
/* 13: Must execute native instruction after writing  SLP_TYPx register =
*/=0A-#define ACPI_FADT_PCI_EXPRESS_WAKE  (1<<14)	/* 14: System =
supports PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */=0A-#define ACPI_FADT_PLATF=
ORM_CLOCK    (1<<15)	/* 15: OSPM should use platform-provided timer =
(ACPI 3.0) */=0A-#define ACPI_FADT_S4_RTC_VALID      (1<<16)	/* 16: =
Contents of RTC_STS valid after S4 wake (ACPI 3.0) */=0A-#define ACPI_FADT_=
REMOTE_POWER_ON   (1<<17)	/* 17: System is compatible with remote =
power on (ACPI 3.0) */=0A-#define ACPI_FADT_APIC_CLUSTER      (1<<18)	/* =
18: All local APICs must use cluster model (ACPI 3.0) */=0A-#define =
ACPI_FADT_APIC_PHYSICAL     (1<<19)	/* 19: All local x_aPICs must use =
physical dest mode (ACPI 3.0) */=0A+#define ACPI_FADT_LEGACY_DEVICES    =
(1)  	/* 00: [V2] System has LPC or ISA bus devices */=0A+#define =
ACPI_FADT_8042              (1<<1)	/* 01: [V3] System has an 8042 =
controller on port 60/64 */=0A+#define ACPI_FADT_NO_VGA            (1<<2)	=
/* 02: [V4] It is not safe to probe for VGA hardware */=0A+#define =
ACPI_FADT_NO_MSI            (1<<3)	/* 03: [V4] Message Signaled =
Interrupts (MSI) must not be enabled */=0A+#define ACPI_FADT_NO_ASPM       =
    (1<<4)	/* 04: [V4] PCIe ASPM control must not be enabled =
*/=0A+=0A+#define FADT2_REVISION_ID               3=0A+=0A+/* Masks for =
FADT flags */=0A+=0A+#define ACPI_FADT_WBINVD            (1)	/* 00: =
[V1] The wbinvd instruction works properly */=0A+#define ACPI_FADT_WBINVD_F=
LUSH      (1<<1)	/* 01: [V1] wbinvd flushes but does not invalidate =
caches */=0A+#define ACPI_FADT_C1_SUPPORTED      (1<<2)	/* 02: [V1] All =
processors support C1 state */=0A+#define ACPI_FADT_C2_MP_SUPPORTED   =
(1<<3)	/* 03: [V1] C2 state works on MP system */=0A+#define ACPI_FADT_POW=
ER_BUTTON      (1<<4)	/* 04: [V1] Power button is handled as a control =
method device */=0A+#define ACPI_FADT_SLEEP_BUTTON      (1<<5)	/* 05: =
[V1] Sleep button is handled as a control method device */=0A+#define =
ACPI_FADT_FIXED_RTC         (1<<6)	/* 06: [V1] RTC wakeup status not =
in fixed register space */=0A+#define ACPI_FADT_S4_RTC_WAKE       (1<<7)	=
/* 07: [V1] RTC alarm can wake system from S4 */=0A+#define ACPI_FADT_32BIT=
_TIMER       (1<<8)	/* 08: [V1] ACPI timer width is 32-bit (0=3D24-bit)=
 */=0A+#define ACPI_FADT_DOCKING_SUPPORTED (1<<9)	/* 09: [V1] =
Docking supported */=0A+#define ACPI_FADT_RESET_REGISTER    (1<<10)	/* =
10: [V2] System reset via the FADT RESET_REG supported */=0A+#define =
ACPI_FADT_SEALED_CASE       (1<<11)	/* 11: [V3] No internal expansion =
capabilities and case is sealed */=0A+#define ACPI_FADT_HEADLESS          =
(1<<12)	/* 12: [V3] No local video capabilities or local input devices =
*/=0A+#define ACPI_FADT_SLEEP_TYPE        (1<<13)	/* 13: [V3] Must =
execute native instruction after writing  SLP_TYPx register */=0A+#define =
ACPI_FADT_PCI_EXPRESS_WAKE  (1<<14)	/* 14: [V4] System supports =
PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */=0A+#define ACPI_FADT_PLATFORM_CLOCK=
    (1<<15)	/* 15: [V4] OSPM should use platform-provided timer (ACPI =
3.0) */=0A+#define ACPI_FADT_S4_RTC_VALID      (1<<16)	/* 16: [V4] =
Contents of RTC_STS valid after S4 wake (ACPI 3.0) */=0A+#define ACPI_FADT_=
REMOTE_POWER_ON   (1<<17)	/* 17: [V4] System is compatible with =
remote power on (ACPI 3.0) */=0A+#define ACPI_FADT_APIC_CLUSTER      =
(1<<18)	/* 18: [V4] All local APICs must use cluster model (ACPI 3.0) =
*/=0A+#define ACPI_FADT_APIC_PHYSICAL     (1<<19)	/* 19: [V4] All =
local x_aPICs must use physical dest mode (ACPI 3.0) */=0A+=0A+/* Values =
for preferred_profile (Preferred Power Management Profiles) */=0A =
=0A-/*=0A- * FADT Prefered Power Management Profiles=0A- */=0A enum =
acpi_prefered_pm_profiles {=0A 	PM_UNSPECIFIED =3D 0,=0A 	PM_DESKTOP =
=3D 1,=0A@@ -272,15 +302,6 @@ enum acpi_prefered_pm_profiles {=0A 	=
PM_APPLIANCE_PC =3D 6=0A };=0A =0A-/* FADT Boot Arch Flags */=0A-=0A-#defin=
e BAF_LEGACY_DEVICES              0x0001=0A-#define BAF_8042_KEYBOARD_CONTR=
OLLER    0x0002=0A-#define BAF_MSI_NOT_SUPPORTED           0x0008=0A-=0A-#d=
efine FADT2_REVISION_ID               3=0A-#define FADT2_MINUS_REVISION_ID =
        2=0A-=0A /* Reset to default packing */=0A =0A #pragma pack()=0A@@ =
-292,5 +313,22 @@ enum acpi_prefered_pm_profiles {=0A  */=0A =0A #include =
<acpi/actbl1.h>=0A+#include <acpi/actbl2.h>=0A+=0A+/*=0A+ * Sizes of the =
various flavors of FADT. We need to look closely=0A+ * at the FADT length =
because the version number essentially tells=0A+ * us nothing because of =
many BIOS bugs where the version does not=0A+ * match the expected length. =
In other words, the length of the=0A+ * FADT is the bottom line as to what =
the version really is.=0A+ *=0A+ * For reference, the values below are as =
follows:=0A+ *     FADT V1  size: 0x74=0A+ *     FADT V2  size: 0x84=0A+ * =
    FADT V3+ size: 0xF4=0A+ */=0A+#define ACPI_FADT_V1_SIZE       (u32) =
(ACPI_FADT_OFFSET (flags) + 4)=0A+#define ACPI_FADT_V2_SIZE       (u32) =
(ACPI_FADT_OFFSET (reserved4[0]) + 3)=0A+#define ACPI_FADT_V3_SIZE       =
(u32) (sizeof (struct acpi_table_fadt))=0A =0A #endif				=
/* __ACTBL_H__ */=0A--- a/xen/include/acpi/actbl1.h=0A+++ b/xen/include/acp=
i/actbl1.h=0A@@ -5,7 +5,7 @@=0A  ******************************************=
***********************************/=0A =0A /*=0A- * Copyright (C) 2000 - =
2007, R. Byron Moore=0A+ * Copyright (C) 2000 - 2011, Intel Corp.=0A  * =
All rights reserved.=0A  *=0A  * Redistribution and use in source and =
binary forms, with or without=0A@@ -46,34 +46,31 @@=0A =0A /***************=
****************************************************************=0A  *=0A- =
* Additional ACPI Tables=0A+ * Additional ACPI Tables (1)=0A  *=0A  * =
These tables are not consumed directly by the ACPICA subsystem, but are=0A =
 * included here to support device drivers and the AML disassembler.=0A  =
*=0A+ * The tables in this file are fully defined within the ACPI =
specification.=0A+ *=0A  **************************************************=
****************************/=0A =0A /*=0A- * Values for description table =
header signatures. Useful because they make=0A- * it more difficult to =
inadvertently type in the wrong signature.=0A+ * Values for description =
table header signatures for tables defined in this=0A+ * file. Useful =
because they make it more difficult to inadvertently type in=0A+ * the =
wrong signature.=0A  */=0A-#define ACPI_SIG_ASF            "ASF!"	/* =
Alert Standard Format table */=0A-#define ACPI_SIG_BOOT           "BOOT"	=
/* Simple Boot Flag Table */=0A+#define ACPI_SIG_BERT           "BERT"	/* =
Boot Error Record Table */=0A #define ACPI_SIG_CPEP           "CPEP"	/* =
Corrected Platform Error Polling table */=0A-#define ACPI_SIG_ERST         =
  "ERST"  /* Error Record Serialization Table */=0A-#define ACPI_SIG_DBGP  =
         "DBGP"	/* Debug Port table */=0A-#define ACPI_SIG_DMAR           =
"DMAR"	/* DMA Remapping table */=0A #define ACPI_SIG_ECDT           =
"ECDT"	/* Embedded Controller Boot Resources Table */=0A-#define =
ACPI_SIG_HPET           "HPET"	/* High Precision Event Timer table =
*/=0A+#define ACPI_SIG_EINJ           "EINJ"	/* Error Injection table =
*/=0A+#define ACPI_SIG_ERST           "ERST"	/* Error Record Serializati=
on Table */=0A+#define ACPI_SIG_HEST           "HEST"	/* Hardware Error =
Source Table */=0A #define ACPI_SIG_MADT           "APIC"	/* =
Multiple APIC Description Table */=0A-#define ACPI_SIG_MCFG           =
"MCFG"	/* PCI Memory Mapped Configuration table */=0A+#define ACPI_SIG_MSC=
T           "MSCT"	/* Maximum System Characteristics Table */=0A =
#define ACPI_SIG_SBST           "SBST"	/* Smart Battery Specification =
Table */=0A #define ACPI_SIG_SLIT           "SLIT"	/* System Locality =
Distance Information Table */=0A-#define ACPI_SIG_SPCR           "SPCR"	/* =
Serial Port Console Redirection table */=0A-#define ACPI_SIG_SPMI          =
 "SPMI"	/* Server Platform Management Interface table */=0A #define =
ACPI_SIG_SRAT           "SRAT"	/* System Resource Affinity Table =
*/=0A-#define ACPI_SIG_TCPA           "TCPA"	/* Trusted Computing =
Platform Alliance table */=0A-#define ACPI_SIG_WDRT           "WDRT"	/* =
Watchdog Resource Table */=0A =0A /*=0A  * All tables must be byte-packed =
to match the ACPI specification, since=0A@@ -87,7 +84,13 @@=0A  * =
portable, so do not use any other bitfield types.=0A  */=0A =0A-/* Common =
Sub-table header (used in MADT, SRAT, etc.) */=0A+/************************=
*******************************************************=0A+ *=0A+ * Common =
subtable headers=0A+ *=0A+ ************************************************=
******************************/=0A+=0A+/* Generic subtable header (used in =
MADT, SRAT, etc.) */=0A =0A struct acpi_subtable_header {=0A 	u8 =
type;=0A@@ -108,128 +111,54 @@ struct acpi_whea_header {=0A =0A /**********=
*********************************************************************=0A  =
*=0A- * ASF - Alert Standard Format table (Signature "ASF!")=0A- *=0A- * =
Conforms to the Alert Standard Format Specification V2.0, 23 April =
2003=0A+ * BERT - Boot Error Record Table (ACPI 4.0)=0A+ *        Version =
1=0A  *=0A  ***************************************************************=
***************/=0A =0A-struct acpi_table_asf {=0A+struct acpi_table_bert =
{=0A 	struct acpi_table_header header;	/* Common ACPI table =
header */=0A+	u32 region_length;	/* Length of the boot error region =
*/=0A+	u64 address;		/* Physical address of the error region =
*/=0A };=0A =0A-/* ASF subtable header */=0A-=0A-struct acpi_asf_header =
{=0A-	u8 type;=0A-	u8 reserved;=0A-	u16 length;=0A-};=0A-=0A-/*=
 Values for Type field above */=0A+/* Boot Error Region (not a subtable, =
pointed to by Address field above) */=0A =0A-enum acpi_asf_type {=0A-	=
ACPI_ASF_TYPE_INFO =3D 0,=0A-	ACPI_ASF_TYPE_ALERT =3D 1,=0A-	ACPI_ASF_TY=
PE_CONTROL =3D 2,=0A-	ACPI_ASF_TYPE_BOOT =3D 3,=0A-	ACPI_ASF_TYPE_ADDRE=
SS =3D 4,=0A-	ACPI_ASF_TYPE_RESERVED =3D 5=0A+struct acpi_bert_region =
{=0A+	u32 block_status;	/* Type of error information */=0A+	=
u32 raw_data_offset;	/* Offset to raw error data */=0A+	u32 =
raw_data_length;	/* Length of raw error data */=0A+	u32 =
data_length;	/* Length of generic error data */=0A+	u32 error_severity;=
	/* Severity code */=0A };=0A =0A-/*=0A- * ASF subtables=0A- =
*/=0A+/* Values for block_status flags above */=0A =0A-/* 0: ASF Informatio=
n */=0A+#define ACPI_BERT_UNCORRECTABLE             (1)=0A+#define =
ACPI_BERT_CORRECTABLE               (1<<1)=0A+#define ACPI_BERT_MULTIPLE_UN=
CORRECTABLE    (1<<2)=0A+#define ACPI_BERT_MULTIPLE_CORRECTABLE      =
(1<<3)=0A+#define ACPI_BERT_ERROR_ENTRY_COUNT         (0xFF<<4)	/* 8 bits, =
error count */=0A =0A-struct acpi_asf_info {=0A-	struct acpi_asf_hea=
der header;=0A-	u8 min_reset_value;=0A-	u8 min_poll_interval;=0A-	=
u16 system_id;=0A-	u32 mfg_id;=0A-	u8 flags;=0A-	u8 reserved2[3];=0A=
-};=0A-=0A-/* 1: ASF Alerts */=0A+/* Values for error_severity above */=0A =
=0A-struct acpi_asf_alert {=0A-	struct acpi_asf_header header;=0A-	u8 =
assert_mask;=0A-	u8 deassert_mask;=0A-	u8 alerts;=0A-	u8 =
data_length;=0A-};=0A-=0A-struct acpi_asf_alert_data {=0A-	u8 =
address;=0A-	u8 command;=0A-	u8 mask;=0A-	u8 value;=0A-	u8 =
sensor_type;=0A-	u8 type;=0A-	u8 offset;=0A-	u8 source_type;=0A-=
	u8 severity;=0A-	u8 sensor_number;=0A-	u8 entity;=0A-	u8 =
instance;=0A+enum acpi_bert_error_severity {=0A+	ACPI_BERT_ERROR_COR=
RECTABLE =3D 0,=0A+	ACPI_BERT_ERROR_FATAL =3D 1,=0A+	ACPI_BERT_E=
RROR_CORRECTED =3D 2,=0A+	ACPI_BERT_ERROR_NONE =3D 3,=0A+	ACPI_BERT_E=
RROR_RESERVED =3D 4	/* 4 and greater are reserved */=0A };=0A =0A-/* =
2: ASF Remote Control */=0A-=0A-struct acpi_asf_remote {=0A-	struct =
acpi_asf_header header;=0A-	u8 controls;=0A-	u8 data_length;=0A-=
	u16 reserved2;=0A-};=0A-=0A-struct acpi_asf_control_data {=0A-	u8 =
function;=0A-	u8 address;=0A-	u8 command;=0A-	u8 value;=0A-};=0A-=0A-/* =
3: ASF RMCP Boot Options */=0A-=0A-struct acpi_asf_rmcp {=0A-	struct =
acpi_asf_header header;=0A-	u8 capabilities[7];=0A-	u8 completion_code;=
=0A-	u32 enterprise_id;=0A-	u8 command;=0A-	u16 parameter;=0A-	=
u16 boot_options;=0A-	u16 oem_parameters;=0A-};=0A-=0A-/* 4: ASF Address =
*/=0A-=0A-struct acpi_asf_address {=0A-	struct acpi_asf_header header;=0A-	=
u8 eprom_address;=0A-	u8 devices;=0A-};=0A-=0A-/*************************=
******************************************************=0A- *=0A- * BOOT - =
Simple Boot Flag Table=0A- *=0A- ******************************************=
************************************/=0A-=0A-struct acpi_table_boot {=0A-	=
struct acpi_table_header header;	/* Common ACPI table header */=0A-	=
u8 cmos_index;		/* Index in CMOS RAM for the boot register */=0A-	=
u8 reserved[3];=0A-};=0A+/*=0A+ * Note: The generic error data that =
follows the error_severity field above=0A+ * uses the struct acpi_hest_gene=
ric_data defined under the HEST table below=0A+ */=0A =0A /****************=
***************************************************************=0A  *=0A- =
* CPEP - Corrected Platform Error Polling table=0A+ * CPEP - Corrected =
Platform Error Polling table (ACPI 4.0)=0A+ *        Version 1=0A  *=0A  =
***************************************************************************=
***/=0A =0A@@ -241,8 +170,7 @@ struct acpi_table_cpep {=0A /* Subtable =
*/=0A =0A struct acpi_cpep_polling {=0A-	u8 type;=0A-	u8 =
length;=0A+	struct acpi_subtable_header header;=0A 	u8 id;			=
/* Processor ID */=0A 	u8 eid;			/* Processor EID */=0A 	=
u32 interval;		/* Polling interval (msec) */=0A@@ -250,116 =
+178,103 @@ struct acpi_cpep_polling {=0A =0A /****************************=
***************************************************=0A  *=0A- * DBGP - =
Debug Port table=0A+ * ECDT - Embedded Controller Boot Resources Table=0A+ =
*        Version 1=0A  *=0A  **********************************************=
********************************/=0A =0A-struct acpi_table_dbgp {=0A+struct=
 acpi_table_ecdt {=0A 	struct acpi_table_header header;	/* Common =
ACPI table header */=0A-	u8 type;		/* 0=3Dfull 16550, =
1=3Dsubset of 16550 */=0A-	u8 reserved[3];=0A-	struct acpi_generic=
_address debug_port;=0A+	struct acpi_generic_address control;	/* =
Address of EC command/status register */=0A+	struct acpi_generic_address=
 data;	/* Address of EC data register */=0A+	u32 uid;		/* =
Unique ID - must be same as the EC _UID method */=0A+	u8 gpe;			=
/* The GPE for the EC */=0A+	u8 id[1];		/* Full namepath =
of the EC in the ACPI namespace */=0A };=0A =0A /**************************=
*****************************************************=0A  *=0A- * DMAR - =
DMA Remapping table=0A+ * EINJ - Error Injection Table (ACPI 4.0)=0A+ *    =
    Version 1=0A  *=0A  ***************************************************=
***************************/=0A =0A-struct acpi_table_dmar {=0A+struct =
acpi_table_einj {=0A 	struct acpi_table_header header;	/* Common =
ACPI table header */=0A-	u8 width;		/* Host Address =
Width */=0A+	u32 header_length;=0A 	u8 flags;=0A-	u8 reserved[10];=0A=
-};=0A-=0A-/* DMAR subtable header */=0A-=0A-struct acpi_dmar_header {=0A-	=
u16 type;=0A-	u16 length;=0A-};=0A-=0A-/* Values for subtable type in =
struct acpi_dmar_header */=0A-=0A-enum acpi_dmar_type {=0A-	ACPI_DMAR_T=
YPE_HARDWARE_UNIT =3D 0,=0A-	ACPI_DMAR_TYPE_RESERVED_MEMORY =3D 1,=0A-	=
ACPI_DMAR_TYPE_ATSR =3D 2,=0A-	ACPI_DMAR_TYPE_RESERVED =3D 3	/* 3 and =
greater are reserved */=0A-};=0A-=0A-struct acpi_dmar_device_scope {=0A-	=
u8 entry_type;=0A-	u8 length;=0A-	u16 reserved;=0A-	u8 =
enumeration_id;=0A-	u8 bus;=0A+	u8 reserved[3];=0A+	u32 =
entries;=0A };=0A =0A-/* Values for entry_type in struct acpi_dmar_device_s=
cope */=0A+/* EINJ Injection Instruction Entries (actions) */=0A =0A-enum =
acpi_dmar_scope_type {=0A-	ACPI_DMAR_SCOPE_TYPE_NOT_USED =3D 0,=0A-	=
ACPI_DMAR_SCOPE_TYPE_ENDPOINT =3D 1,=0A-	ACPI_DMAR_SCOPE_TYPE_BRIDGE=
 =3D 2,=0A-	ACPI_DMAR_SCOPE_TYPE_IOAPIC =3D 3,=0A-	ACPI_DMAR_SCOPE_TYP=
E_HPET =3D 4,=0A-	ACPI_DMAR_SCOPE_TYPE_RESERVED =3D 5	/* 5 and =
greater are reserved */=0A+struct acpi_einj_entry {=0A+	struct acpi_whea_he=
ader whea_header;	/* Common header for WHEA tables */=0A };=0A =
=0A-struct acpi_dmar_pci_path {=0A-	u8 dev;=0A-	u8 fn;=0A-};=0A+/* =
Masks for Flags field above */=0A =0A-/*=0A- * DMAR Sub-tables, correspond =
to Type in struct acpi_dmar_header=0A- */=0A+#define ACPI_EINJ_PRESERVE    =
      (1)=0A =0A-/* 0: Hardware Unit Definition */=0A+/* Values for Action =
field above */=0A =0A-struct acpi_dmar_hardware_unit {=0A-	struct =
acpi_dmar_header header;=0A-	u8 flags;=0A-	u8 reserved;=0A-	=
u16 segment;=0A-	u64 address;		/* Register Base Address =
*/=0A+enum acpi_einj_actions {=0A+	ACPI_EINJ_BEGIN_OPERATION =3D =
0,=0A+	ACPI_EINJ_GET_TRIGGER_TABLE =3D 1,=0A+	ACPI_EINJ_SET_ERROR_TYPE =
=3D 2,=0A+	ACPI_EINJ_GET_ERROR_TYPE =3D 3,=0A+	ACPI_EINJ_END_OPERA=
TION =3D 4,=0A+	ACPI_EINJ_EXECUTE_OPERATION =3D 5,=0A+	ACPI_EINJ_CHECK_BUS=
Y_STATUS =3D 6,=0A+	ACPI_EINJ_GET_COMMAND_STATUS =3D 7,=0A+	ACPI_EINJ_A=
CTION_RESERVED =3D 8,	/* 8 and greater are reserved */=0A+	ACPI_EINJ_T=
RIGGER_ERROR =3D 0xFF	/* Except for this value */=0A };=0A =0A-/* Flags =
*/=0A-=0A-#define ACPI_DMAR_INCLUDE_ALL       (1)=0A-=0A-/* 1: Reserved =
Memory Defininition */=0A+/* Values for Instruction field above */=0A =
=0A-struct acpi_dmar_reserved_memory {=0A-	struct acpi_dmar_header =
header;=0A-	u16 reserved;=0A-	u16 segment;=0A-	u64 =
base_address;		/* 4_k aligned base address */=0A-	u64 =
end_address;	/* 4_k aligned limit address */=0A+enum acpi_einj_instructi=
ons {=0A+	ACPI_EINJ_READ_REGISTER =3D 0,=0A+	ACPI_EINJ_READ_REGI=
STER_VALUE =3D 1,=0A+	ACPI_EINJ_WRITE_REGISTER =3D 2,=0A+	ACPI_EINJ_W=
RITE_REGISTER_VALUE =3D 3,=0A+	ACPI_EINJ_NOOP =3D 4,=0A+	ACPI_EINJ_I=
NSTRUCTION_RESERVED =3D 5	/* 5 and greater are reserved */=0A+};=0A+=
=0A+/* EINJ Trigger Error Action Table */=0A+=0A+struct acpi_einj_trigger =
{=0A+	u32 header_size;=0A+	u32 revision;=0A+	u32 table_size;=0A+=
	u32 entry_count;=0A };=0A =0A-/* Flags */=0A+/* Command status =
return values */=0A =0A-#define ACPI_DMAR_ALLOW_ALL         (1)=0A-=0A-/***=
***************************************************************************=
*=0A- *=0A- * ECDT - Embedded Controller Boot Resources Table=0A- *=0A- =
***************************************************************************=
***/=0A-=0A-struct acpi_table_ecdt {=0A-	struct acpi_table_header =
header;	/* Common ACPI table header */=0A-	struct acpi_generic_address=
 control;	/* Address of EC command/status register */=0A-	struct =
acpi_generic_address data;	/* Address of EC data register */=0A-	=
u32 uid;		/* Unique ID - must be same as the EC _UID method =
*/=0A-	u8 gpe;			/* The GPE for the EC */=0A-	u8 id[1];	=
	/* Full namepath of the EC in the ACPI namespace */=0A-};=0A+enum =
acpi_einj_command_status {=0A+	ACPI_EINJ_SUCCESS =3D 0,=0A+	ACPI_EINJ_F=
AILURE =3D 1,=0A+	ACPI_EINJ_INVALID_ACCESS =3D 2,=0A+	ACPI_EINJ_S=
TATUS_RESERVED =3D 3	/* 3 and greater are reserved */=0A+};=0A+=0A+/* =
Error types returned from ACPI_EINJ_GET_ERROR_TYPE (bitfield) */=0A+=0A+#de=
fine ACPI_EINJ_PROCESSOR_CORRECTABLE     (1)=0A+#define ACPI_EINJ_PROCESSOR=
_UNCORRECTABLE   (1<<1)=0A+#define ACPI_EINJ_PROCESSOR_FATAL           =
(1<<2)=0A+#define ACPI_EINJ_MEMORY_CORRECTABLE        (1<<3)=0A+#define =
ACPI_EINJ_MEMORY_UNCORRECTABLE      (1<<4)=0A+#define ACPI_EINJ_MEMORY_FATA=
L              (1<<5)=0A+#define ACPI_EINJ_PCIX_CORRECTABLE          =
(1<<6)=0A+#define ACPI_EINJ_PCIX_UNCORRECTABLE        (1<<7)=0A+#define =
ACPI_EINJ_PCIX_FATAL                (1<<8)=0A+#define ACPI_EINJ_PLATFORM_CO=
RRECTABLE      (1<<9)=0A+#define ACPI_EINJ_PLATFORM_UNCORRECTABLE    =
(1<<10)=0A+#define ACPI_EINJ_PLATFORM_FATAL            (1<<11)=0A =0A =
/**************************************************************************=
*****=0A  *=0A@@ -453,30 +368,237 @@ struct acpi_erst_info {=0A =0A =
/**************************************************************************=
*****=0A  *=0A- * HPET - High Precision Event Timer table=0A+ * HEST - =
Hardware Error Source Table (ACPI 4.0)=0A+ *        Version 1=0A  *=0A  =
***************************************************************************=
***/=0A =0A-struct acpi_table_hpet {=0A+struct acpi_table_hest {=0A 	=
struct acpi_table_header header;	/* Common ACPI table header */=0A-	=
u32 id;			/* Hardware ID of event timer block */=0A-	=
struct acpi_generic_address address;	/* Address of event timer block =
*/=0A-	u8 sequence;		/* HPET sequence number */=0A-	u16 =
minimum_tick;	/* Main counter min tick, periodic mode */=0A+	u32 =
error_source_count;=0A+};=0A+=0A+/* HEST subtable header */=0A+=0A+struct =
acpi_hest_header {=0A+	u16 type;=0A+	u16 source_id;=0A+};=0A+=0A+/* =
Values for Type field above for subtables */=0A+=0A+enum acpi_hest_types =
{=0A+	ACPI_HEST_TYPE_IA32_CHECK =3D 0,=0A+	ACPI_HEST_TYPE_IA32_CORRECT=
ED_CHECK =3D 1,=0A+	ACPI_HEST_TYPE_IA32_NMI =3D 2,=0A+	ACPI_HEST_T=
YPE_NOT_USED3 =3D 3,=0A+	ACPI_HEST_TYPE_NOT_USED4 =3D 4,=0A+	=
ACPI_HEST_TYPE_NOT_USED5 =3D 5,=0A+	ACPI_HEST_TYPE_AER_ROOT_PORT =3D =
6,=0A+	ACPI_HEST_TYPE_AER_ENDPOINT =3D 7,=0A+	ACPI_HEST_TYPE_AER_BRIDGE =
=3D 8,=0A+	ACPI_HEST_TYPE_GENERIC_ERROR =3D 9,=0A+	ACPI_HEST_TYPE_RESE=
RVED =3D 10	/* 10 and greater are reserved */=0A+};=0A+=0A+/*=0A+ * =
HEST substructures contained in subtables=0A+ */=0A+=0A+/*=0A+ * IA32 =
Error Bank(s) - Follows the struct acpi_hest_ia_machine_check and=0A+ * =
struct acpi_hest_ia_corrected structures.=0A+ */=0A+struct acpi_hest_ia_err=
or_bank {=0A+	u8 bank_number;=0A+	u8 clear_status_on_init;=0A+	u8 =
status_format;=0A+	u8 reserved;=0A+	u32 control_register;=0A+	=
u64 control_data;=0A+	u32 status_register;=0A+	u32 address_registe=
r;=0A+	u32 misc_register;=0A+};=0A+=0A+/* Common HEST sub-structure for =
PCI/AER structures below (6,7,8) */=0A+=0A+struct acpi_hest_aer_common =
{=0A+	u16 reserved1;=0A 	u8 flags;=0A+	u8 enabled;=0A+	u32 =
records_to_preallocate;=0A+	u32 max_sections_per_record;=0A+	=
u32 bus;=0A+	u16 device;=0A+	u16 function;=0A+	u16 device_control;=
=0A+	u16 reserved2;=0A+	u32 uncorrectable_mask;=0A+	u32 =
uncorrectable_severity;=0A+	u32 correctable_mask;=0A+	u32 =
advanced_capabilities;=0A };=0A =0A-/*! Flags */=0A+/* Masks for HEST =
Flags fields */=0A+=0A+#define ACPI_HEST_FIRMWARE_FIRST        (1)=0A+#defi=
ne ACPI_HEST_GLOBAL                (1<<1)=0A =0A-#define ACPI_HPET_PAGE_PRO=
TECT      (1)	/* 00: No page protection */=0A-#define ACPI_HPET_PAGE_PROT=
ECT_4    (1<<1)	/* 01: 4KB page protected */=0A-#define ACPI_HPET_PAGE_PROT=
ECT_64   (1<<2)	/* 02: 64KB page protected */=0A+/* Hardware Error =
Notification */=0A =0A-/*! [End] no source code translation !*/=0A+struct =
acpi_hest_notify {=0A+	u8 type;=0A+	u8 length;=0A+	u16 config_write_en=
able;=0A+	u32 poll_interval;=0A+	u32 vector;=0A+	u32 polling_thresho=
ld_value;=0A+	u32 polling_threshold_window;=0A+	u32 error_threshold=
_value;=0A+	u32 error_threshold_window;=0A+};=0A+=0A+/* Values for =
Notify Type field above */=0A+=0A+enum acpi_hest_notify_types {=0A+	=
ACPI_HEST_NOTIFY_POLLED =3D 0,=0A+	ACPI_HEST_NOTIFY_EXTERNAL =3D =
1,=0A+	ACPI_HEST_NOTIFY_LOCAL =3D 2,=0A+	ACPI_HEST_NOTIFY_SCI =3D =
3,=0A+	ACPI_HEST_NOTIFY_NMI =3D 4,=0A+	ACPI_HEST_NOTIFY_RESERVED =3D 5	/* =
5 and greater are reserved */=0A+};=0A+=0A+/* Values for config_write_enabl=
e bitfield above */=0A+=0A+#define ACPI_HEST_TYPE                  =
(1)=0A+#define ACPI_HEST_POLL_INTERVAL         (1<<1)=0A+#define ACPI_HEST_=
POLL_THRESHOLD_VALUE  (1<<2)=0A+#define ACPI_HEST_POLL_THRESHOLD_WINDOW =
(1<<3)=0A+#define ACPI_HEST_ERR_THRESHOLD_VALUE   (1<<4)=0A+#define =
ACPI_HEST_ERR_THRESHOLD_WINDOW  (1<<5)=0A+=0A+/*=0A+ * HEST subtables=0A+ =
*/=0A+=0A+/* 0: IA32 Machine Check Exception */=0A+=0A+struct acpi_hest_ia_=
machine_check {=0A+	struct acpi_hest_header header;=0A+	u16 =
reserved1;=0A+	u8 flags;=0A+	u8 enabled;=0A+	u32 records_to_preallocate;=
=0A+	u32 max_sections_per_record;=0A+	u64 global_capability_data;=
=0A+	u64 global_control_data;=0A+	u8 num_hardware_banks;=0A+	u8 =
reserved3[7];=0A+};=0A+=0A+/* 1: IA32 Corrected Machine Check */=0A+=0A+str=
uct acpi_hest_ia_corrected {=0A+	struct acpi_hest_header header;=0A+=
	u16 reserved1;=0A+	u8 flags;=0A+	u8 enabled;=0A+	u32 =
records_to_preallocate;=0A+	u32 max_sections_per_record;=0A+	=
struct acpi_hest_notify notify;=0A+	u8 num_hardware_banks;=0A+	u8 =
reserved2[3];=0A+};=0A+=0A+/* 2: IA32 Non-Maskable Interrupt */=0A+=0A+stru=
ct acpi_hest_ia_nmi {=0A+	struct acpi_hest_header header;=0A+	=
u32 reserved;=0A+	u32 records_to_preallocate;=0A+	u32 max_sections_pe=
r_record;=0A+	u32 max_raw_data_length;=0A+};=0A+=0A+/* 3,4,5: Not used =
*/=0A+=0A+/* 6: PCI Express Root Port AER */=0A+=0A+struct acpi_hest_aer_ro=
ot {=0A+	struct acpi_hest_header header;=0A+	struct acpi_hest_ae=
r_common aer;=0A+	u32 root_error_command;=0A+};=0A+=0A+/* 7: PCI =
Express AER (AER Endpoint) */=0A+=0A+struct acpi_hest_aer {=0A+	struct =
acpi_hest_header header;=0A+	struct acpi_hest_aer_common aer;=0A+};=0A+=
=0A+/* 8: PCI Express/PCI-X Bridge AER */=0A+=0A+struct acpi_hest_aer_bridg=
e {=0A+	struct acpi_hest_header header;=0A+	struct acpi_hest_aer_common=
 aer;=0A+	u32 uncorrectable_mask2;=0A+	u32 uncorrectable_severity2=
;=0A+	u32 advanced_capabilities2;=0A+};=0A+=0A+/* 9: Generic Hardware =
Error Source */=0A+=0A+struct acpi_hest_generic {=0A+	struct acpi_hest_he=
ader header;=0A+	u16 related_source_id;=0A+	u8 reserved;=0A+	=
u8 enabled;=0A+	u32 records_to_preallocate;=0A+	u32 max_sections_per_record=
;=0A+	u32 max_raw_data_length;=0A+	struct acpi_generic_address =
error_status_address;=0A+	struct acpi_hest_notify notify;=0A+	=
u32 error_block_length;=0A+};=0A+=0A+/* Generic Error Status block =
*/=0A+=0A+struct acpi_hest_generic_status {=0A+	u32 block_status;=0A+	=
u32 raw_data_offset;=0A+	u32 raw_data_length;=0A+	u32 =
data_length;=0A+	u32 error_severity;=0A+};=0A+=0A+/* Values for =
block_status flags above */=0A+=0A+#define ACPI_HEST_UNCORRECTABLE         =
    (1)=0A+#define ACPI_HEST_CORRECTABLE               (1<<1)=0A+#define =
ACPI_HEST_MULTIPLE_UNCORRECTABLE    (1<<2)=0A+#define ACPI_HEST_MULTIPLE_CO=
RRECTABLE      (1<<3)=0A+#define ACPI_HEST_ERROR_ENTRY_COUNT         =
(0xFF<<4)	/* 8 bits, error count */=0A+=0A+/* Generic Error Data =
entry */=0A+=0A+struct acpi_hest_generic_data {=0A+	u8 section_type[16]=
;=0A+	u32 error_severity;=0A+	u16 revision;=0A+	u8 validation_bits;=
=0A+	u8 flags;=0A+	u32 error_data_length;=0A+	u8 fru_id[16];=0A+	=
u8 fru_text[20];=0A+};=0A =0A /********************************************=
***********************************=0A  *=0A  * MADT - Multiple APIC =
Description Table=0A+ *        Version 3=0A  *=0A  ************************=
******************************************************/=0A =0A@@ -486,7 =
+608,7 @@ struct acpi_table_madt {=0A 	u32 flags;=0A };=0A =0A-/* Flags =
*/=0A+/* Masks for Flags field above */=0A =0A #define ACPI_MADT_PCAT_COMPA=
T       (1)	/* 00:    System also has dual 8259s */=0A =0A@@ -495,7 =
+617,7 @@ struct acpi_table_madt {=0A #define ACPI_MADT_DUAL_PIC          =
0=0A #define ACPI_MADT_MULTIPLE_APIC     1=0A =0A-/* Values for subtable =
type in struct acpi_subtable_header */=0A+/* Values for MADT subtable type =
in struct acpi_subtable_header */=0A =0A enum acpi_madt_type {=0A 	=
ACPI_MADT_TYPE_LOCAL_APIC =3D 0,=0A@@ -606,7 +728,7 @@ struct acpi_madt_int=
errupt_source {=0A 	u32 flags;		/* Interrupt Source Flags =
*/=0A };=0A =0A-/* Flags field above */=0A+/* Masks for Flags field above =
*/=0A =0A #define ACPI_MADT_CPEI_OVERRIDE     (1)=0A =0A@@ -615,9 +737,9 =
@@ struct acpi_madt_interrupt_source {=0A struct acpi_madt_local_x2apic =
{=0A 	struct acpi_subtable_header header;=0A 	u16 reserved;		/* =
Reserved - must be zero */=0A-	u32 local_apic_id;	/* Processor =
X2_APIC ID  */=0A+	u32 local_apic_id;	/* Processor x2APIC ID  =
*/=0A 	u32 lapic_flags;=0A-	u32 uid;		/* Extended =
X2_APIC processor ID */=0A+	u32 uid;		/* ACPI processor =
UID */=0A };=0A =0A /* 10: Local X2APIC NMI (ACPI 4.0) */=0A@@ -625,7 =
+747,7 @@ struct acpi_madt_local_x2apic {=0A struct acpi_madt_local_x2apic_=
nmi {=0A 	struct acpi_subtable_header header;=0A 	u16 inti_flags;=0A-=
	u32 uid;		/* Processor X2_APIC ID */=0A+	u32 uid;	=
	/* ACPI processor UID */=0A 	u8 lint;		/* LINTn =
to which NMI is connected */=0A 	u8 reserved[3];=0A };=0A@@ -657,28 =
+779,34 @@ struct acpi_madt_local_x2apic_nmi {=0A =0A /********************=
***********************************************************=0A  *=0A- * =
MCFG - PCI Memory Mapped Configuration table and sub-table=0A+ * MSCT - =
Maximum System Characteristics Table (ACPI 4.0)=0A+ *        Version 1=0A  =
*=0A  *********************************************************************=
*********/=0A =0A-struct acpi_table_mcfg {=0A+struct acpi_table_msct {=0A 	=
struct acpi_table_header header;	/* Common ACPI table header */=0A-	=
u8 reserved[8];=0A+	u32 proximity_offset;	/* Location of proximity =
info struct(s) */=0A+	u32 max_proximity_domains;	/* Max number of =
proximity domains */=0A+	u32 max_clock_domains;	/* Max number of =
clock domains */=0A+	u64 max_address;	/* Max physical address in =
system */=0A };=0A =0A-/* Subtable */=0A+/* Subtable - Maximum Proximity =
Domain Information. Version 1 */=0A =0A-struct acpi_mcfg_allocation {=0A-	=
u64 address;		/* Base address, processor-relative */=0A-	=
u16 pci_segment;	/* PCI segment group number */=0A-	u8 =
start_bus_number;	/* Starting PCI Bus number */=0A-	u8 =
end_bus_number;	/* Final PCI Bus number */=0A-	u32 reserved;=0A+struct =
acpi_msct_proximity {=0A+	u8 revision;=0A+	u8 length;=0A+	=
u32 range_start;	/* Start of domain range */=0A+	u32 range_end;		=
/* End of domain range */=0A+	u32 processor_capacity;=0A+	u64 =
memory_capacity;	/* In bytes */=0A };=0A =0A /**********************=
*********************************************************=0A  *=0A  * SBST =
- Smart Battery Specification Table=0A+ *        Version 1=0A  *=0A  =
***************************************************************************=
***/=0A =0A@@ -692,6 +820,7 @@ struct acpi_table_sbst {=0A /***************=
****************************************************************=0A  *=0A  =
* SLIT - System Locality Distance Information Table=0A+ *        Version =
1=0A  *=0A  ***************************************************************=
***************/=0A =0A@@ -703,60 +832,8 @@ struct acpi_table_slit {=0A =
=0A /**********************************************************************=
*********=0A  *=0A- * SPCR - Serial Port Console Redirection table=0A- =
*=0A- *********************************************************************=
*********/=0A-=0A-struct acpi_table_spcr {=0A-	struct acpi_table_header =
header;	/* Common ACPI table header */=0A-	u8 interface_type;	/* =
0=3Dfull 16550, 1=3Dsubset of 16550 */=0A-	u8 reserved[3];=0A-	=
struct acpi_generic_address serial_port;=0A-	u8 interrupt_type;=0A-	u8 =
pc_interrupt;=0A-	u32 interrupt;=0A-	u8 baud_rate;=0A-	u8 =
parity;=0A-	u8 stop_bits;=0A-	u8 flow_control;=0A-	u8 =
terminal_type;=0A-	u8 reserved1;=0A-	u16 pci_device_id;=0A-	=
u16 pci_vendor_id;=0A-	u8 pci_bus;=0A-	u8 pci_device;=0A-	u8 =
pci_function;=0A-	u32 pci_flags;=0A-	u8 pci_segment;=0A-	=
u32 reserved2;=0A-};=0A-=0A-/**********************************************=
*********************************=0A- *=0A- * SPMI - Server Platform =
Management Interface table=0A- *=0A- **************************************=
****************************************/=0A-=0A-struct acpi_table_spmi =
{=0A-	struct acpi_table_header header;	/* Common ACPI table =
header */=0A-	u8 reserved;=0A-	u8 interface_type;=0A-	u16 =
spec_revision;	/* Version of IPMI */=0A-	u8 interrupt_type;=0A-	u8 =
gpe_number;		/* GPE assigned */=0A-	u8 reserved1;=0A-	u8 =
pci_device_flag;=0A-	u32 interrupt;=0A-	struct acpi_generic_address=
 ipmi_register;=0A-	u8 pci_segment;=0A-	u8 pci_bus;=0A-	u8 =
pci_device;=0A-	u8 pci_function;=0A-};=0A-=0A-/****************************=
***************************************************=0A- *=0A  * SRAT - =
System Resource Affinity Table=0A+ *        Version 3=0A  *=0A  ***********=
*******************************************************************/=0A =
=0A@@ -775,7 +852,9 @@ enum acpi_srat_type {=0A 	ACPI_SRAT_TYPE_RESE=
RVED =3D 3	/* 3 and greater are reserved */=0A };=0A =0A-/* SRAT =
sub-tables */=0A+/*=0A+ * SRAT Sub-tables, correspond to Type in struct =
acpi_subtable_header=0A+ */=0A =0A /* 0: Processor Local APIC/SAPIC =
Affinity */=0A =0A@@ -789,6 +868,10 @@ struct acpi_srat_cpu_affinity {=0A 	=
u32 reserved;		/* Reserved, must be zero */=0A };=0A =0A+/* Flags =
*/=0A+=0A+#define ACPI_SRAT_CPU_USE_AFFINITY  (1)	/* 00: Use =
affinity structure */=0A+=0A /* 1: Memory Affinity */=0A =0A struct =
acpi_srat_mem_affinity {=0A@@ -797,9 +880,9 @@ struct acpi_srat_mem_affinit=
y {=0A 	u16 reserved;		/* Reserved, must be zero */=0A 	=
u64 base_address;=0A 	u64 length;=0A-	u32 memory_type;	/* See =
acpi_address_range_id */=0A+	u32 reserved1;=0A 	u32 flags;=0A-	=
u64 reserved1;		/* Reserved, must be zero */=0A+	u64 =
reserved2;		/* Reserved, must be zero */=0A };=0A =0A /* Flags =
*/=0A@@ -824,44 +907,6 @@ struct acpi_srat_x2apic_cpu_affinity {=0A =0A =
#define ACPI_SRAT_CPU_ENABLED       (1)	/* 00: Use affinity structure =
*/=0A =0A-/****************************************************************=
***************=0A- *=0A- * TCPA - Trusted Computing Platform Alliance =
table=0A- *=0A- ***********************************************************=
*******************/=0A-=0A-struct acpi_table_tcpa {=0A-	struct =
acpi_table_header header;	/* Common ACPI table header */=0A-	=
u16 reserved;=0A-	u32 max_log_length;	/* Maximum length for the =
event log area */=0A-	u64 log_address;	/* Address of the event =
log area */=0A-};=0A-=0A-/*************************************************=
******************************=0A- *=0A- * WDRT - Watchdog Resource =
Table=0A- *=0A- ***********************************************************=
*******************/=0A-=0A-struct acpi_table_wdrt {=0A-	struct =
acpi_table_header header;	/* Common ACPI table header */=0A-	=
u32 header_length;	/* Watchdog Header Length */=0A-	u8 =
pci_segment;		/* PCI Segment number */=0A-	u8 pci_bus;		=
/* PCI Bus number */=0A-	u8 pci_device;		/* PCI Device =
number */=0A-	u8 pci_function;	/* PCI Function number */=0A-	=
u32 timer_period;	/* Period of one timer count (msec) */=0A-	=
u32 max_count;		/* Maximum counter value supported */=0A-	=
u32 min_count;		/* Minimum counter value */=0A-	u8 flags;=0A-	u8 =
reserved[3];=0A-	u32 entries;		/* Number of watchdog =
entries that follow */=0A-};=0A-=0A-/* Flags */=0A-=0A-#define ACPI_WDRT_TI=
MER_ENABLED     (1)	/* 00: Timer enabled */=0A-=0A /* Reset to default =
packing */=0A =0A #pragma pack()=0A--- /dev/null=0A+++ a/xen/include/acpi/a=
ctbl2.h=0A@@ -0,0 +1,1050 @@=0A+/******************************************=
************************************=0A+ *=0A+ * Name: actbl2.h - ACPI =
Table Definitions (tables not in ACPI spec)=0A+ *=0A+ *********************=
********************************************************/=0A+=0A+/*=0A+ * =
Copyright (C) 2000 - 2011, Intel Corp.=0A+ * All rights reserved.=0A+ =
*=0A+ * Redistribution and use in source and binary forms, with or =
without=0A+ * modification, are permitted provided that the following =
conditions=0A+ * are met:=0A+ * 1. Redistributions of source code must =
retain the above copyright=0A+ *    notice, this list of conditions, and =
the following disclaimer,=0A+ *    without modification.=0A+ * 2. =
Redistributions in binary form must reproduce at minimum a disclaimer=0A+ =
*    substantially similar to the "NO WARRANTY" disclaimer below=0A+ *    =
("Disclaimer") and any redistribution must be conditioned upon=0A+ *    =
including a substantially similar Disclaimer requirement for further=0A+ * =
   binary redistribution.=0A+ * 3. Neither the names of the above-listed =
copyright holders nor the names=0A+ *    of any contributors may be used =
to endorse or promote products derived=0A+ *    from this software without =
specific prior written permission.=0A+ *=0A+ * Alternatively, this =
software may be distributed under the terms of the=0A+ * GNU General =
Public License ("GPL") version 2 as published by the Free=0A+ * Software =
Foundation.=0A+ *=0A+ * NO WARRANTY=0A+ * THIS SOFTWARE IS PROVIDED BY THE =
COPYRIGHT HOLDERS AND CONTRIBUTORS=0A+ * "AS IS" AND ANY EXPRESS OR =
IMPLIED WARRANTIES, INCLUDING, BUT NOT=0A+ * LIMITED TO, THE IMPLIED =
WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR=0A+ * A PARTICULAR PURPOSE =
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT=0A+ * HOLDERS OR CONTRIBUTO=
RS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL=0A+ * DAMAGES =
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS=0A+ * OR =
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)=0A+ * =
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,=0A+ * =
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING=0A+ =
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE=0A+ * =
POSSIBILITY OF SUCH DAMAGES.=0A+ */=0A+=0A+#ifndef __ACTBL2_H__=0A+#define =
__ACTBL2_H__=0A+=0A+/******************************************************=
*************************=0A+ *=0A+ * Additional ACPI Tables (2)=0A+ *=0A+ =
* These tables are not consumed directly by the ACPICA subsystem, but =
are=0A+ * included here to support device drivers and the AML disassembler.=
=0A+ *=0A+ * The tables in this file are defined by third-party specificati=
ons, and are=0A+ * not defined directly by the ACPI specification =
itself.=0A+ *=0A+ *********************************************************=
*********************/=0A+=0A+/*=0A+ * Values for description table header =
signatures for tables defined in this=0A+ * file. Useful because they make =
it more difficult to inadvertently type in=0A+ * the wrong signature.=0A+ =
*/=0A+#define ACPI_SIG_ASF            "ASF!"	/* Alert Standard Format =
table */=0A+#define ACPI_SIG_BOOT           "BOOT"	/* Simple Boot =
Flag Table */=0A+#define ACPI_SIG_DBGP           "DBGP"	/* Debug Port =
table */=0A+#define ACPI_SIG_DMAR           "DMAR"	/* DMA Remapping =
table */=0A+#define ACPI_SIG_HPET           "HPET"	/* High Precision =
Event Timer table */=0A+#define ACPI_SIG_IBFT           "IBFT"	/* i_sCSI =
Boot Firmware Table */=0A+#define ACPI_SIG_IVRS           "IVRS"	/* =
I/O Virtualization Reporting Structure */=0A+#define ACPI_SIG_MCFG         =
  "MCFG"	/* PCI Memory Mapped Configuration table */=0A+#define =
ACPI_SIG_MCHI           "MCHI"	/* Management Controller Host Interface =
table */=0A+#define ACPI_SIG_SLIC           "SLIC"	/* Software =
Licensing Description Table */=0A+#define ACPI_SIG_SPCR           "SPCR"	=
/* Serial Port Console Redirection table */=0A+#define ACPI_SIG_SPMI       =
    "SPMI"	/* Server Platform Management Interface table */=0A+#define=
 ACPI_SIG_TCPA           "TCPA"	/* Trusted Computing Platform Alliance =
table */=0A+#define ACPI_SIG_UEFI           "UEFI"	/* Uefi Boot =
Optimization Table */=0A+#define ACPI_SIG_WAET           "WAET"	/* Windows =
ACPI Emulated devices Table */=0A+#define ACPI_SIG_WDAT           "WDAT"	=
/* Watchdog Action Table */=0A+#define ACPI_SIG_WDDT           "WDDT"	/* =
Watchdog Timer Description Table */=0A+#define ACPI_SIG_WDRT           =
"WDRT"	/* Watchdog Resource Table */=0A+=0A+#ifdef ACPI_UNDEFINED_TABLES=
=0A+/*=0A+ * These tables have been seen in the field, but no definition =
has been found=0A+ */=0A+#define ACPI_SIG_ATKG           "ATKG"=0A+#define =
ACPI_SIG_GSCI           "GSCI"	/* GMCH SCI table */=0A+#define ACPI_SIG_IE=
IT           "IEIT"=0A+#endif=0A+=0A+/*=0A+ * All tables must be byte-packe=
d to match the ACPI specification, since=0A+ * the tables are provided by =
the system BIOS.=0A+ */=0A+#pragma pack(1)=0A+=0A+/*=0A+ * Note about =
bitfields: The u8 type is used for bitfields in ACPI tables.=0A+ * This is =
the only type that is even remotely portable. Anything else is not=0A+ * =
portable, so do not use any other bitfield types.=0A+ */=0A+=0A+/**********=
*********************************************************************=0A+ =
*=0A+ * ASF - Alert Standard Format table (Signature "ASF!")=0A+ *       =
Revision 0x10=0A+ *=0A+ * Conforms to the Alert Standard Format Specificati=
on V2.0, 23 April 2003=0A+ *=0A+ ******************************************=
************************************/=0A+=0A+struct acpi_table_asf {=0A+	=
struct acpi_table_header header;	/* Common ACPI table header =
*/=0A+};=0A+=0A+/* ASF subtable header */=0A+=0A+struct acpi_asf_header =
{=0A+	u8 type;=0A+	u8 reserved;=0A+	u16 length;=0A+};=0A+=0A+/*=
 Values for Type field above */=0A+=0A+enum acpi_asf_type {=0A+	ACPI_ASF_TY=
PE_INFO =3D 0,=0A+	ACPI_ASF_TYPE_ALERT =3D 1,=0A+	ACPI_ASF_TYPE_CONTR=
OL =3D 2,=0A+	ACPI_ASF_TYPE_BOOT =3D 3,=0A+	ACPI_ASF_TYPE_ADDRESS =3D =
4,=0A+	ACPI_ASF_TYPE_RESERVED =3D 5=0A+};=0A+=0A+/*=0A+ * ASF subtables=0A=
+ */=0A+=0A+/* 0: ASF Information */=0A+=0A+struct acpi_asf_info {=0A+	=
struct acpi_asf_header header;=0A+	u8 min_reset_value;=0A+	u8 =
min_poll_interval;=0A+	u16 system_id;=0A+	u32 mfg_id;=0A+	u8 =
flags;=0A+	u8 reserved2[3];=0A+};=0A+=0A+/* Masks for Flags field =
above */=0A+=0A+#define ACPI_ASF_SMBUS_PROTOCOLS    (1)=0A+=0A+/* 1: ASF =
Alerts */=0A+=0A+struct acpi_asf_alert {=0A+	struct acpi_asf_header =
header;=0A+	u8 assert_mask;=0A+	u8 deassert_mask;=0A+	u8 =
alerts;=0A+	u8 data_length;=0A+};=0A+=0A+struct acpi_asf_alert_data =
{=0A+	u8 address;=0A+	u8 command;=0A+	u8 mask;=0A+	u8 value;=0A+	u8 =
sensor_type;=0A+	u8 type;=0A+	u8 offset;=0A+	u8 source_type;=0A+=
	u8 severity;=0A+	u8 sensor_number;=0A+	u8 entity;=0A+	u8 =
instance;=0A+};=0A+=0A+/* 2: ASF Remote Control */=0A+=0A+struct acpi_asf_r=
emote {=0A+	struct acpi_asf_header header;=0A+	u8 controls;=0A+	=
u8 data_length;=0A+	u16 reserved2;=0A+};=0A+=0A+struct acpi_asf_control=
_data {=0A+	u8 function;=0A+	u8 address;=0A+	u8 command;=0A+	u8 =
value;=0A+};=0A+=0A+/* 3: ASF RMCP Boot Options */=0A+=0A+struct acpi_asf_r=
mcp {=0A+	struct acpi_asf_header header;=0A+	u8 capabilities[7];=
=0A+	u8 completion_code;=0A+	u32 enterprise_id;=0A+	u8 command;=0A+	=
u16 parameter;=0A+	u16 boot_options;=0A+	u16 oem_parameters;=0A+};=
=0A+=0A+/* 4: ASF Address */=0A+=0A+struct acpi_asf_address {=0A+	=
struct acpi_asf_header header;=0A+	u8 eprom_address;=0A+	u8 =
devices;=0A+};=0A+=0A+/****************************************************=
***************************=0A+ *=0A+ * BOOT - Simple Boot Flag Table=0A+ =
*        Version 1=0A+ *=0A+ * Conforms to the "Simple Boot Flag Specificat=
ion", Version 2.1=0A+ *=0A+ ***********************************************=
*******************************/=0A+=0A+struct acpi_table_boot {=0A+	=
struct acpi_table_header header;	/* Common ACPI table header */=0A+	=
u8 cmos_index;		/* Index in CMOS RAM for the boot register */=0A+	=
u8 reserved[3];=0A+};=0A+=0A+/*********************************************=
**********************************=0A+ *=0A+ * DBGP - Debug Port table=0A+ =
*        Version 1=0A+ *=0A+ * Conforms to the "Debug Port Specification", =
Version 1.00, 2/9/2000=0A+ *=0A+ ******************************************=
************************************/=0A+=0A+struct acpi_table_dbgp {=0A+	=
struct acpi_table_header header;	/* Common ACPI table header */=0A+	=
u8 type;		/* 0=3Dfull 16550, 1=3Dsubset of 16550 */=0A+	u8 =
reserved[3];=0A+	struct acpi_generic_address debug_port;=0A+};=0A+=
=0A+/**********************************************************************=
*********=0A+ *=0A+ * DMAR - DMA Remapping table=0A+ *        Version =
1=0A+ *=0A+ * Conforms to "Intel Virtualization Technology for Directed =
I/O",=0A+ * Version 1.2, Sept. 2008=0A+ *=0A+ *****************************=
*************************************************/=0A+=0A+struct acpi_table=
_dmar {=0A+	struct acpi_table_header header;	/* Common ACPI =
table header */=0A+	u8 width;		/* Host Address Width =
*/=0A+	u8 flags;=0A+	u8 reserved[10];=0A+};=0A+=0A+/* Masks for Flags =
field above */=0A+=0A+#define ACPI_DMAR_INTR_REMAP        (1)=0A+#define =
ACPI_DMAR_X2APIC_OPT_OUT    (1<<1)=0A+=0A+/* DMAR subtable header =
*/=0A+=0A+struct acpi_dmar_header {=0A+	u16 type;=0A+	u16 length;=0A+};=
=0A+=0A+/* Values for subtable type in struct acpi_dmar_header */=0A+=0A+en=
um acpi_dmar_type {=0A+	ACPI_DMAR_TYPE_HARDWARE_UNIT =3D 0,=0A+	ACPI_DMAR_T=
YPE_RESERVED_MEMORY =3D 1,=0A+	ACPI_DMAR_TYPE_ATSR =3D 2,=0A+	ACPI_DMAR_H=
ARDWARE_AFFINITY =3D 3,=0A+	ACPI_DMAR_TYPE_RESERVED =3D 4	/* 4 and =
greater are reserved */=0A+};=0A+=0A+/* DMAR Device Scope structure =
*/=0A+=0A+struct acpi_dmar_device_scope {=0A+	u8 entry_type;=0A+	u8 =
length;=0A+	u16 reserved;=0A+	u8 enumeration_id;=0A+	u8 =
bus;=0A+};=0A+=0A+/* Values for entry_type in struct acpi_dmar_device_scope=
 */=0A+=0A+enum acpi_dmar_scope_type {=0A+	ACPI_DMAR_SCOPE_TYPE_NOT_US=
ED =3D 0,=0A+	ACPI_DMAR_SCOPE_TYPE_ENDPOINT =3D 1,=0A+	ACPI_DMAR_S=
COPE_TYPE_BRIDGE =3D 2,=0A+	ACPI_DMAR_SCOPE_TYPE_IOAPIC =3D 3,=0A+	=
ACPI_DMAR_SCOPE_TYPE_HPET =3D 4,=0A+	ACPI_DMAR_SCOPE_TYPE_RESERVED =3D =
5	/* 5 and greater are reserved */=0A+};=0A+=0A+struct acpi_dmar_pci_=
path {=0A+	u8 dev;=0A+	u8 fn;=0A+};=0A+=0A+/*=0A+ * DMAR =
Sub-tables, correspond to Type in struct acpi_dmar_header=0A+ */=0A+=0A+/* =
0: Hardware Unit Definition */=0A+=0A+struct acpi_dmar_hardware_unit {=0A+	=
struct acpi_dmar_header header;=0A+	u8 flags;=0A+	u8 reserved;=0A+	=
u16 segment;=0A+	u64 address;		/* Register Base Address =
*/=0A+};=0A+=0A+/* Masks for Flags field above */=0A+=0A+#define ACPI_DMAR_=
INCLUDE_ALL       (1)=0A+=0A+/* 1: Reserved Memory Defininition */=0A+=0A+s=
truct acpi_dmar_reserved_memory {=0A+	struct acpi_dmar_header header;=0A+=
	u16 reserved;=0A+	u16 segment;=0A+	u64 base_address;	=
/* 4_k aligned base address */=0A+	u64 end_address;	/* 4_k =
aligned limit address */=0A+};=0A+=0A+/* Masks for Flags field above =
*/=0A+=0A+#define ACPI_DMAR_ALLOW_ALL         (1)=0A+=0A+/* 2: Root Port =
ATS Capability Reporting Structure */=0A+=0A+struct acpi_dmar_atsr {=0A+	=
struct acpi_dmar_header header;=0A+	u8 flags;=0A+	u8 reserved;=0A+	=
u16 segment;=0A+};=0A+=0A+/* Masks for Flags field above */=0A+=0A+#define =
ACPI_DMAR_ALL_PORTS         (1)=0A+=0A+/* 3: Remapping Hardware Static =
Affinity Structure */=0A+=0A+struct acpi_dmar_rhsa {=0A+	struct =
acpi_dmar_header header;=0A+	u32 reserved;=0A+	u64 base_address;=
=0A+	u32 proximity_domain;=0A+};=0A+=0A+/*******************************=
************************************************=0A+ *=0A+ * HPET - High =
Precision Event Timer table=0A+ *        Version 1=0A+ *=0A+ * Conforms to =
"IA-PC HPET (High Precision Event Timers) Specification",=0A+ * Version =
1.0a, October 2004=0A+ *=0A+ **********************************************=
********************************/=0A+=0A+struct acpi_table_hpet {=0A+	=
struct acpi_table_header header;	/* Common ACPI table header */=0A+	=
u32 id;			/* Hardware ID of event timer block */=0A+	=
struct acpi_generic_address address;	/* Address of event timer block =
*/=0A+	u8 sequence;		/* HPET sequence number */=0A+	u16 =
minimum_tick;	/* Main counter min tick, periodic mode */=0A+	u8 =
flags;=0A+};=0A+=0A+/* Masks for Flags field above */=0A+=0A+#define =
ACPI_HPET_PAGE_PROTECT_MASK (3)=0A+=0A+/* Values for Page Protect flags =
*/=0A+=0A+enum acpi_hpet_page_protect {=0A+	ACPI_HPET_NO_PAGE_PROTECT =
=3D 0,=0A+	ACPI_HPET_PAGE_PROTECT4 =3D 1,=0A+	ACPI_HPET_PAGE_PROT=
ECT64 =3D 2=0A+};=0A+=0A+/*************************************************=
******************************=0A+ *=0A+ * IBFT - Boot Firmware Table=0A+ =
*        Version 1=0A+ *=0A+ * Conforms to "iSCSI Boot Firmware Table =
(iBFT) as Defined in ACPI 3.0b=0A+ * Specification", Version 1.01, March =
1, 2007=0A+ *=0A+ * Note: It appears that this table is not intended to =
appear in the RSDT/XSDT.=0A+ * Therefore, it is not currently supported by =
the disassembler.=0A+ *=0A+ ***********************************************=
*******************************/=0A+=0A+struct acpi_table_ibft {=0A+	=
struct acpi_table_header header;	/* Common ACPI table header */=0A+	=
u8 reserved[12];=0A+};=0A+=0A+/* IBFT common subtable header */=0A+=0A+stru=
ct acpi_ibft_header {=0A+	u8 type;=0A+	u8 version;=0A+	u16 =
length;=0A+	u8 index;=0A+	u8 flags;=0A+};=0A+=0A+/* Values for Type =
field above */=0A+=0A+enum acpi_ibft_type {=0A+	ACPI_IBFT_TYPE_NOT_USED =
=3D 0,=0A+	ACPI_IBFT_TYPE_CONTROL =3D 1,=0A+	ACPI_IBFT_TYPE_INIT=
IATOR =3D 2,=0A+	ACPI_IBFT_TYPE_NIC =3D 3,=0A+	ACPI_IBFT_TYPE_TARG=
ET =3D 4,=0A+	ACPI_IBFT_TYPE_EXTENSIONS =3D 5,=0A+	ACPI_IBFT_TYPE_RESE=
RVED =3D 6	/* 6 and greater are reserved */=0A+};=0A+=0A+/* IBFT =
subtables */=0A+=0A+struct acpi_ibft_control {=0A+	struct acpi_ibft_he=
ader header;=0A+	u16 extensions;=0A+	u16 initiator_offset;=0A+	=
u16 nic0_offset;=0A+	u16 target0_offset;=0A+	u16 nic1_offset;=0A+	=
u16 target1_offset;=0A+};=0A+=0A+struct acpi_ibft_initiator {=0A+	=
struct acpi_ibft_header header;=0A+	u8 sns_server[16];=0A+	u8 =
slp_server[16];=0A+	u8 primary_server[16];=0A+	u8 secondary_server=
[16];=0A+	u16 name_length;=0A+	u16 name_offset;=0A+};=0A+=0A+struc=
t acpi_ibft_nic {=0A+	struct acpi_ibft_header header;=0A+	u8 =
ip_address[16];=0A+	u8 subnet_mask_prefix;=0A+	u8 origin;=0A+	u8 =
gateway[16];=0A+	u8 primary_dns[16];=0A+	u8 secondary_dns[16];=0A+	=
u8 dhcp[16];=0A+	u16 vlan;=0A+	u8 mac_address[6];=0A+	u16 =
pci_address;=0A+	u16 name_length;=0A+	u16 name_offset;=0A+};=0A+=
=0A+struct acpi_ibft_target {=0A+	struct acpi_ibft_header header;=0A+=
	u8 target_ip_address[16];=0A+	u16 target_ip_socket;=0A+	u8 =
target_boot_lun[8];=0A+	u8 chap_type;=0A+	u8 nic_association;=0A+	=
u16 target_name_length;=0A+	u16 target_name_offset;=0A+	u16 =
chap_name_length;=0A+	u16 chap_name_offset;=0A+	u16 chap_secret_len=
gth;=0A+	u16 chap_secret_offset;=0A+	u16 reverse_chap_name_lengt=
h;=0A+	u16 reverse_chap_name_offset;=0A+	u16 reverse_chap_secret_len=
gth;=0A+	u16 reverse_chap_secret_offset;=0A+};=0A+=0A+/*************=
******************************************************************=0A+ =
*=0A+ * IVRS - I/O Virtualization Reporting Structure=0A+ *        Version =
1=0A+ *=0A+ * Conforms to "AMD I/O Virtualization Technology (IOMMU) =
Specification",=0A+ * Revision 1.26, February 2009.=0A+ *=0A+ *************=
*****************************************************************/=0A+=0A+s=
truct acpi_table_ivrs {=0A+	struct acpi_table_header header;	/* =
Common ACPI table header */=0A+	u32 info;		/* Common =
virtualization info */=0A+	u64 reserved;=0A+};=0A+=0A+/* Values for =
Info field above */=0A+=0A+#define ACPI_IVRS_PHYSICAL_SIZE     0x00007F00	=
/* 7 bits, physical address size */=0A+#define ACPI_IVRS_VIRTUAL_SIZE      =
0x003F8000	/* 7 bits, virtual address size */=0A+#define ACPI_IVRS_ATS=
_RESERVED      0x00400000	/* ATS address translation range reserved =
*/=0A+=0A+/* IVRS subtable header */=0A+=0A+struct acpi_ivrs_header {=0A+	=
u8 type;		/* Subtable type */=0A+	u8 flags;=0A+	u16 =
length;		/* Subtable length */=0A+	u16 device_id;		/* =
ID of IOMMU */=0A+};=0A+=0A+/* Values for subtable Type above */=0A+=0A+enu=
m acpi_ivrs_type {=0A+	ACPI_IVRS_TYPE_HARDWARE =3D 0x10,=0A+	ACPI_IVRS_T=
YPE_MEMORY_ALL /* _MEMORY1 */ =3D 0x20,=0A+	ACPI_IVRS_TYPE_MEMORY_ONE =
/* _MEMORY2 */ =3D 0x21,=0A+	ACPI_IVRS_TYPE_MEMORY_RANGE /* _MEMORY3 */ =
=3D 0x22,=0A+	ACPI_IVRS_TYPE_MEMORY_IOMMU =3D 0x23=0A+};=0A+=0A+/* Masks =
for Flags field above for IVHD subtable */=0A+=0A+#define ACPI_IVHD_TT_ENAB=
LE         (1)=0A+#define ACPI_IVHD_PASS_PW           (1<<1)=0A+#define =
ACPI_IVHD_RES_PASS_PW       (1<<2)=0A+#define ACPI_IVHD_ISOC              =
(1<<3)=0A+#define ACPI_IVHD_IOTLB             (1<<4)=0A+=0A+/* Masks for =
Flags field above for IVMD subtable */=0A+=0A+#define ACPI_IVMD_UNITY      =
       (1)=0A+#define ACPI_IVMD_READ              (1<<1)=0A+#define =
ACPI_IVMD_WRITE             (1<<2)=0A+#define ACPI_IVMD_EXCLUSION_RANGE   =
(1<<3)=0A+=0A+/*=0A+ * IVRS subtables, correspond to Type in struct =
acpi_ivrs_header=0A+ */=0A+=0A+/* 0x10: I/O Virtualization Hardware =
Definition Block (IVHD) */=0A+=0A+struct acpi_ivrs_hardware {=0A+	=
struct acpi_ivrs_header header;=0A+	u16 capability_offset;	/* Offset =
for IOMMU control fields */=0A+	u64 base_address;	/* IOMMU control =
registers */=0A+	u16 pci_segment_group;=0A+	u16 info;		=
/* MSI number and unit ID */=0A+	u32 reserved;=0A+};=0A+=0A+/* =
Masks for Info field above */=0A+=0A+#define ACPI_IVHD_MSI_NUMBER_MASK   =
0x001F	/* 5 bits, MSI message number */=0A+#define ACPI_IVHD_UNIT_ID_MASK =
     0x1F00	/* 5 bits, unit_iD */=0A+=0A+/*=0A+ * Device Entries for =
IVHD subtable, appear after struct acpi_ivrs_hardware structure.=0A+ * =
Upper two bits of the Type field are the (encoded) length of the structure.=
=0A+ * Currently, only 4 and 8 byte entries are defined. 16 and 32 byte =
entries=0A+ * are reserved for future use but not defined.=0A+ */=0A+struct=
 acpi_ivrs_de_header {=0A+	u8 type;=0A+	u16 id;=0A+	u8 =
data_setting;=0A+};=0A+=0A+/* Length of device entry is in the top two =
bits of Type field above */=0A+=0A+#define ACPI_IVHD_ENTRY_LENGTH      =
0xC0=0A+=0A+/* Values for device entry Type field above */=0A+=0A+enum =
acpi_ivrs_device_entry_type {=0A+	/* 4-byte device entries, all use =
struct acpi_ivrs_device4 */=0A+=0A+	ACPI_IVRS_TYPE_PAD4 =3D 0,=0A+	=
ACPI_IVRS_TYPE_ALL =3D 1,=0A+	ACPI_IVRS_TYPE_SELECT =3D 2,=0A+	=
ACPI_IVRS_TYPE_START =3D 3,=0A+	ACPI_IVRS_TYPE_END =3D 4,=0A+=0A+	/* =
8-byte device entries */=0A+=0A+	ACPI_IVRS_TYPE_PAD8 =3D 64,=0A+	=
ACPI_IVRS_TYPE_NOT_USED =3D 65,=0A+	ACPI_IVRS_TYPE_ALIAS_SELECT =3D =
66,	/* Uses struct acpi_ivrs_device8a */=0A+	ACPI_IVRS_TYPE_ALIA=
S_START =3D 67,	/* Uses struct acpi_ivrs_device8a */=0A+	ACPI_IVRS_T=
YPE_EXT_SELECT =3D 70,	/* Uses struct acpi_ivrs_device8b */=0A+	=
ACPI_IVRS_TYPE_EXT_START =3D 71,	/* Uses struct acpi_ivrs_device8b =
*/=0A+	ACPI_IVRS_TYPE_SPECIAL =3D 72	/* Uses struct acpi_ivrs_device8c =
*/=0A+};=0A+=0A+/* Values for Data field above */=0A+=0A+#define ACPI_IVHD_=
INIT_PASS         (1)=0A+#define ACPI_IVHD_EINT_PASS         (1<<1)=0A+#def=
ine ACPI_IVHD_NMI_PASS          (1<<2)=0A+#define ACPI_IVHD_SYSTEM_MGMT    =
   (3<<4)=0A+#define ACPI_IVHD_LINT0_PASS        (1<<6)=0A+#define =
ACPI_IVHD_LINT1_PASS        (1<<7)=0A+=0A+/* Types 0-4: 4-byte device =
entry */=0A+=0A+struct acpi_ivrs_device4 {=0A+	struct acpi_ivrs_de_header =
header;=0A+};=0A+=0A+/* Types 66-67: 8-byte device entry */=0A+=0A+struct =
acpi_ivrs_device8a {=0A+	struct acpi_ivrs_de_header header;=0A+	u8 =
reserved1;=0A+	u16 used_id;=0A+	u8 reserved2;=0A+};=0A+=0A+/* =
Types 70-71: 8-byte device entry */=0A+=0A+struct acpi_ivrs_device8b {=0A+	=
struct acpi_ivrs_de_header header;=0A+	u32 extended_data;=0A+};=0A+=0A+/* =
Values for extended_data above */=0A+=0A+#define ACPI_IVHD_ATS_DISABLED    =
  (1<<31)=0A+=0A+/* Type 72: 8-byte device entry */=0A+=0A+struct =
acpi_ivrs_device8c {=0A+	struct acpi_ivrs_de_header header;=0A+	u8 =
handle;=0A+	u16 used_id;=0A+	u8 variety;=0A+};=0A+=0A+/* Values =
for Variety field above */=0A+=0A+#define ACPI_IVHD_IOAPIC            =
1=0A+#define ACPI_IVHD_HPET              2=0A+=0A+/* 0x20, 0x21, 0x22: I/O =
Virtualization Memory Definition Block (IVMD) */=0A+=0A+struct acpi_ivrs_me=
mory {=0A+	struct acpi_ivrs_header header;=0A+	u16 aux_data;=0A+	=
u64 reserved;=0A+	u64 start_address;=0A+	u64 memory_length;=0A+};=0A=
+=0A+/*********************************************************************=
**********=0A+ *=0A+ * MCFG - PCI Memory Mapped Configuration table and =
sub-table=0A+ *        Version 1=0A+ *=0A+ * Conforms to "PCI Firmware =
Specification", Revision 3.0, June 20, 2005=0A+ *=0A+ *********************=
*********************************************************/=0A+=0A+struct =
acpi_table_mcfg {=0A+	struct acpi_table_header header;	/* Common =
ACPI table header */=0A+	u8 reserved[8];=0A+};=0A+=0A+/* Subtable =
*/=0A+=0A+struct acpi_mcfg_allocation {=0A+	u64 address;		/* =
Base address, processor-relative */=0A+	u16 pci_segment;	/* PCI =
segment group number */=0A+	u8 start_bus_number;	/* Starting PCI =
Bus number */=0A+	u8 end_bus_number;	/* Final PCI Bus number =
*/=0A+	u32 reserved;=0A+};=0A+=0A+/***************************************=
****************************************=0A+ *=0A+ * MCHI - Management =
Controller Host Interface Table=0A+ *        Version 1=0A+ *=0A+ * =
Conforms to "Management Component Transport Protocol (MCTP) Host=0A+ * =
Interface Specification", Revision 1.0.0a, October 13, 2009=0A+ *=0A+ =
***************************************************************************=
***/=0A+=0A+struct acpi_table_mchi {=0A+	struct acpi_table_header =
header;	/* Common ACPI table header */=0A+	u8 interface_type;=0A+	u8 =
protocol;=0A+	u64 protocol_data;=0A+	u8 interrupt_type;=0A+	u8 =
gpe;=0A+	u8 pci_device_flag;=0A+	u32 global_interrupt;=0A+	=
struct acpi_generic_address control_register;=0A+	u8 pci_segment;=0A+=
	u8 pci_bus;=0A+	u8 pci_device;=0A+	u8 pci_function;=0A+};=0A+=
=0A+/**********************************************************************=
*********=0A+ *=0A+ * SLIC - Software Licensing Description Table=0A+ *    =
    Version 1=0A+ *=0A+ * Conforms to "OEM Activation 2.0 for Windows =
Vista Operating Systems",=0A+ * Copyright 2006=0A+ *=0A+ ******************=
************************************************************/=0A+=0A+/* =
Basic SLIC table is only the common ACPI header */=0A+=0A+struct acpi_table=
_slic {=0A+	struct acpi_table_header header;	/* Common ACPI =
table header */=0A+};=0A+=0A+/* Common SLIC subtable header */=0A+=0A+struc=
t acpi_slic_header {=0A+	u32 type;=0A+	u32 length;=0A+};=0A+=0A+/*=
 Values for Type field above */=0A+=0A+enum acpi_slic_type {=0A+	=
ACPI_SLIC_TYPE_PUBLIC_KEY =3D 0,=0A+	ACPI_SLIC_TYPE_WINDOWS_MARKER =3D =
1,=0A+	ACPI_SLIC_TYPE_RESERVED =3D 2	/* 2 and greater are reserved =
*/=0A+};=0A+=0A+/*=0A+ * SLIC Sub-tables, correspond to Type in struct =
acpi_slic_header=0A+ */=0A+=0A+/* 0: Public Key Structure */=0A+=0A+struct =
acpi_slic_key {=0A+	struct acpi_slic_header header;=0A+	u8 =
key_type;=0A+	u8 version;=0A+	u16 reserved;=0A+	u32 algorithm;=0A+	=
char magic[4];=0A+	u32 bit_length;=0A+	u32 exponent;=0A+	u8 =
modulus[128];=0A+};=0A+=0A+/* 1: Windows Marker Structure */=0A+=0A+struct =
acpi_slic_marker {=0A+	struct acpi_slic_header header;=0A+	u32 =
version;=0A+	char oem_id[ACPI_OEM_ID_SIZE];	/* ASCII OEM identification=
 */=0A+	char oem_table_id[ACPI_OEM_TABLE_ID_SIZE];	/* ASCII OEM table =
identification */=0A+	char windows_flag[8];=0A+	u32 slic_version;=
=0A+	u8 reserved[16];=0A+	u8 signature[128];=0A+};=0A+=0A+/**********=
*********************************************************************=0A+ =
*=0A+ * SPCR - Serial Port Console Redirection table=0A+ *        Version =
1=0A+ *=0A+ * Conforms to "Serial Port Console Redirection Table",=0A+ * =
Version 1.00, January 11, 2002=0A+ *=0A+ **********************************=
********************************************/=0A+=0A+struct acpi_table_spcr=
 {=0A+	struct acpi_table_header header;	/* Common ACPI table =
header */=0A+	u8 interface_type;	/* 0=3Dfull 16550, 1=3Dsubset of =
16550 */=0A+	u8 reserved[3];=0A+	struct acpi_generic_address =
serial_port;=0A+	u8 interrupt_type;=0A+	u8 pc_interrupt;=0A+	=
u32 interrupt;=0A+	u8 baud_rate;=0A+	u8 parity;=0A+	u8 =
stop_bits;=0A+	u8 flow_control;=0A+	u8 terminal_type;=0A+	u8 =
reserved1;=0A+	u16 pci_device_id;=0A+	u16 pci_vendor_id;=0A+	u8 =
pci_bus;=0A+	u8 pci_device;=0A+	u8 pci_function;=0A+	u32 =
pci_flags;=0A+	u8 pci_segment;=0A+	u32 reserved2;=0A+};=0A+=0A+/* =
Masks for pci_flags field above */=0A+=0A+#define ACPI_SPCR_DO_NOT_DISABLE =
   (1)=0A+=0A+/************************************************************=
*******************=0A+ *=0A+ * SPMI - Server Platform Management =
Interface table=0A+ *        Version 5=0A+ *=0A+ * Conforms to "Intelligent=
 Platform Management Interface Specification=0A+ * Second Generation =
v2.0", Document Revision 1.0, February 12, 2004 with=0A+ * June 12, 2009 =
markup.=0A+ *=0A+ *********************************************************=
*********************/=0A+=0A+struct acpi_table_spmi {=0A+	struct =
acpi_table_header header;	/* Common ACPI table header */=0A+	u8 =
interface_type;=0A+	u8 reserved;		/* Must be 1 */=0A+	=
u16 spec_revision;	/* Version of IPMI */=0A+	u8 interrupt_type;=
=0A+	u8 gpe_number;		/* GPE assigned */=0A+	u8 reserved1;=0A+	=
u8 pci_device_flag;=0A+	u32 interrupt;=0A+	struct acpi_generic_address=
 ipmi_register;=0A+	u8 pci_segment;=0A+	u8 pci_bus;=0A+	u8 =
pci_device;=0A+	u8 pci_function;=0A+	u8 reserved2;=0A+};=0A+=0A+/* =
Values for interface_type above */=0A+=0A+enum acpi_spmi_interface_types =
{=0A+	ACPI_SPMI_NOT_USED =3D 0,=0A+	ACPI_SPMI_KEYBOARD =3D 1,=0A+	=
ACPI_SPMI_SMI =3D 2,=0A+	ACPI_SPMI_BLOCK_TRANSFER =3D 3,=0A+	=
ACPI_SPMI_SMBUS =3D 4,=0A+	ACPI_SPMI_RESERVED =3D 5	/* 5 and =
above are reserved */=0A+};=0A+=0A+/***************************************=
****************************************=0A+ *=0A+ * TCPA - Trusted =
Computing Platform Alliance table=0A+ *        Version 1=0A+ *=0A+ * =
Conforms to "TCG PC Specific Implementation Specification",=0A+ * Version =
1.1, August 18, 2003=0A+ *=0A+ ********************************************=
**********************************/=0A+=0A+struct acpi_table_tcpa {=0A+	=
struct acpi_table_header header;	/* Common ACPI table header */=0A+	=
u16 reserved;=0A+	u32 max_log_length;	/* Maximum length for the =
event log area */=0A+	u64 log_address;	/* Address of the event =
log area */=0A+};=0A+=0A+/*************************************************=
******************************=0A+ *=0A+ * UEFI - UEFI Boot optimization =
Table=0A+ *        Version 1=0A+ *=0A+ * Conforms to "Unified Extensible =
Firmware Interface Specification",=0A+ * Version 2.3, May 8, 2009=0A+ =
*=0A+ *********************************************************************=
*********/=0A+=0A+struct acpi_table_uefi {=0A+	struct acpi_table_header =
header;	/* Common ACPI table header */=0A+	u8 identifier[16];	/* =
UUID identifier */=0A+	u16 data_offset;	/* Offset of remaining =
data in table */=0A+};=0A+=0A+/********************************************=
***********************************=0A+ *=0A+ * WAET - Windows ACPI =
Emulated devices Table=0A+ *        Version 1=0A+ *=0A+ * Conforms to =
"Windows ACPI Emulated Devices Table", version 1.0, April 6, 2009=0A+ =
*=0A+ *********************************************************************=
*********/=0A+=0A+struct acpi_table_waet {=0A+	struct acpi_table_header =
header;	/* Common ACPI table header */=0A+	u32 flags;=0A+};=0A+=0A+/* =
Masks for Flags field above */=0A+=0A+#define ACPI_WAET_RTC_NO_ACK        =
(1)	/* RTC requires no int acknowledge */=0A+#define ACPI_WAET_TIMER_ON=
E_READ    (1<<1)	/* PM timer requires only one read */=0A+=0A+/*****=
**************************************************************************=
=0A+ *=0A+ * WDAT - Watchdog Action Table=0A+ *        Version 1=0A+ *=0A+ =
* Conforms to "Hardware Watchdog Timers Design Specification",=0A+ * =
Copyright 2006 Microsoft Corporation.=0A+ *=0A+ ***************************=
***************************************************/=0A+=0A+struct =
acpi_table_wdat {=0A+	struct acpi_table_header header;	/* Common =
ACPI table header */=0A+	u32 header_length;	/* Watchdog Header =
Length */=0A+	u16 pci_segment;	/* PCI Segment number */=0A+	u8 =
pci_bus;		/* PCI Bus number */=0A+	u8 pci_device;		=
/* PCI Device number */=0A+	u8 pci_function;	/* PCI Function =
number */=0A+	u8 reserved[3];=0A+	u32 timer_period;	/* Period =
of one timer count (msec) */=0A+	u32 max_count;		/* Maximum =
counter value supported */=0A+	u32 min_count;		/* Minimum counter =
value */=0A+	u8 flags;=0A+	u8 reserved2[3];=0A+	u32 entries;		=
/* Number of watchdog entries that follow */=0A+};=0A+=0A+/* Masks for =
Flags field above */=0A+=0A+#define ACPI_WDAT_ENABLED           (1)=0A+#def=
ine ACPI_WDAT_STOPPED           0x80=0A+=0A+/* WDAT Instruction Entries =
(actions) */=0A+=0A+struct acpi_wdat_entry {=0A+	u8 action;=0A+	u8 =
instruction;=0A+	u16 reserved;=0A+	struct acpi_generic_address=
 register_region;=0A+	u32 value;		/* Value used with =
Read/Write register */=0A+	u32 mask;		/* Bitmask =
required for this register instruction */=0A+};=0A+=0A+/* Values for =
Action field above */=0A+=0A+enum acpi_wdat_actions {=0A+	ACPI_WDAT_R=
ESET =3D 1,=0A+	ACPI_WDAT_GET_CURRENT_COUNTDOWN =3D 4,=0A+	ACPI_WDAT_G=
ET_COUNTDOWN =3D 5,=0A+	ACPI_WDAT_SET_COUNTDOWN =3D 6,=0A+	ACPI_WDAT_G=
ET_RUNNING_STATE =3D 8,=0A+	ACPI_WDAT_SET_RUNNING_STATE =3D 9,=0A+	=
ACPI_WDAT_GET_STOPPED_STATE =3D 10,=0A+	ACPI_WDAT_SET_STOPPED_STATE =3D =
11,=0A+	ACPI_WDAT_GET_REBOOT =3D 16,=0A+	ACPI_WDAT_SET_REBOOT =3D =
17,=0A+	ACPI_WDAT_GET_SHUTDOWN =3D 18,=0A+	ACPI_WDAT_SET_SHUTDOWN =3D =
19,=0A+	ACPI_WDAT_GET_STATUS =3D 32,=0A+	ACPI_WDAT_SET_STATUS =3D =
33,=0A+	ACPI_WDAT_ACTION_RESERVED =3D 34	/* 34 and greater are =
reserved */=0A+};=0A+=0A+/* Values for Instruction field above */=0A+=0A+en=
um acpi_wdat_instructions {=0A+	ACPI_WDAT_READ_VALUE =3D 0,=0A+	ACPI_WDAT_R=
EAD_COUNTDOWN =3D 1,=0A+	ACPI_WDAT_WRITE_VALUE =3D 2,=0A+	=
ACPI_WDAT_WRITE_COUNTDOWN =3D 3,=0A+	ACPI_WDAT_INSTRUCTION_RESERVED =3D =
4,	/* 4 and greater are reserved */=0A+	ACPI_WDAT_PRESERVE_REGISTER=
 =3D 0x80	/* Except for this value */=0A+};=0A+=0A+/*****************=
**************************************************************=0A+ *=0A+ * =
WDDT - Watchdog Descriptor Table=0A+ *        Version 1=0A+ *=0A+ * =
Conforms to "Using the Intel ICH Family Watchdog Timer (WDT)",=0A+ * =
Version 001, September 2002=0A+ *=0A+ *************************************=
*****************************************/=0A+=0A+struct acpi_table_wddt =
{=0A+	struct acpi_table_header header;	/* Common ACPI table =
header */=0A+	u16 spec_version;=0A+	u16 table_version;=0A+	u16 =
pci_vendor_id;=0A+	struct acpi_generic_address address;=0A+	=
u16 max_count;		/* Maximum counter value supported */=0A+	=
u16 min_count;		/* Minimum counter value supported */=0A+	=
u16 period;=0A+	u16 status;=0A+	u16 capability;=0A+};=0A+=0A+/* Flags for =
Status field above */=0A+=0A+#define ACPI_WDDT_AVAILABLE     (1)=0A+#define=
 ACPI_WDDT_ACTIVE        (1<<1)=0A+#define ACPI_WDDT_TCO_OS_OWNED  =
(1<<2)=0A+#define ACPI_WDDT_USER_RESET    (1<<11)=0A+#define ACPI_WDDT_WDT_=
RESET     (1<<12)=0A+#define ACPI_WDDT_POWER_FAIL    (1<<13)=0A+#define =
ACPI_WDDT_UNKNOWN_RESET (1<<14)=0A+=0A+/* Flags for Capability field above =
*/=0A+=0A+#define ACPI_WDDT_AUTO_RESET    (1)=0A+#define ACPI_WDDT_ALERT_SU=
PPORT (1<<1)=0A+=0A+/******************************************************=
*************************=0A+ *=0A+ * WDRT - Watchdog Resource Table=0A+ * =
       Version 1=0A+ *=0A+ * Conforms to "Watchdog Timer Hardware =
Requirements for Windows Server 2003",=0A+ * Version 1.01, August 28, =
2006=0A+ *=0A+ ************************************************************=
******************/=0A+=0A+struct acpi_table_wdrt {=0A+	struct acpi_table_h=
eader header;	/* Common ACPI table header */=0A+	struct acpi_generic=
_address control_register;=0A+	struct acpi_generic_address count_register;=
=0A+	u16 pci_device_id;=0A+	u16 pci_vendor_id;=0A+	u8 pci_bus;		=
/* PCI Bus number */=0A+	u8 pci_device;		/* PCI Device =
number */=0A+	u8 pci_function;	/* PCI Function number */=0A+	u8 =
pci_segment;		/* PCI Segment number */=0A+	u16 max_count;		=
/* Maximum counter value supported */=0A+	u8 units;=0A+};=0A+=0A+/* =
Reset to default packing */=0A+=0A+#pragma pack()=0A+=0A+#endif			=
	/* __ACTBL2_H__ */=0A
--=__Part96B93371.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part96B93371.0__=--


From xen-devel-bounces@lists.xensource.com Mon Dec 12 17:01:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Mon, 12 Dec 2011 17:01:22 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1Ra9FP-0005KD-QE; Mon, 12 Dec 2011 17:01:03 +0000
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <JBeulich@suse.com>) id 1Ra9FO-0005K5-EX
	for xen-devel@lists.xensource.com; Mon, 12 Dec 2011 17:01:03 +0000
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1323709203!1664651!1
X-Originating-IP: [130.57.49.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10935 invoked from network); 12 Dec 2011 17:00:03 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Dec 2011 17:00:03 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 12 Dec 2011 17:00:03 +0000
Message-Id: <4EE6415A02000078000670E1@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Mon, 12 Dec 2011 17:00:58 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__PartA9860C5A.1__="
Cc: Wei Wang2 <wei.wang2@amd.com>
Subject: [Xen-devel] [PATCH 4/4] ACPI: eliminate duplicate IVRS definitions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__PartA9860C5A.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Use their proper counterparts in include/acpi/actbl*.h instead.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/passthrough/amd/iommu_acpi.c
+++ b/xen/drivers/passthrough/amd/iommu_acpi.c
@@ -20,10 +20,38 @@
=20
 #include <xen/config.h>
 #include <xen/errno.h>
+#include <xen/acpi.h>
 #include <asm/apicdef.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
-#include <asm/hvm/svm/amd-iommu-acpi.h>
+
+/* Some helper structures, particularly to deal with ranges. */
+
+struct acpi_ivhd_device_range {
+   struct acpi_ivrs_device4 start;
+   struct acpi_ivrs_device4 end;
+};
+
+struct acpi_ivhd_device_alias_range {
+   struct acpi_ivrs_device8a alias;
+   struct acpi_ivrs_device4 end;
+};
+
+struct acpi_ivhd_device_extended_range {
+   struct acpi_ivrs_device8b extended;
+   struct acpi_ivrs_device4 end;
+};
+
+union acpi_ivhd_device {
+   struct acpi_ivrs_de_header header;
+   struct acpi_ivrs_device4 select;
+   struct acpi_ivhd_device_range range;
+   struct acpi_ivrs_device8a alias;
+   struct acpi_ivhd_device_alias_range alias_range;
+   struct acpi_ivrs_device8b extended;
+   struct acpi_ivhd_device_extended_range extended_range;
+   struct acpi_ivrs_device8c special;
+};
=20
 static unsigned short __initdata last_bdf;
=20
@@ -242,12 +270,12 @@ static int __init register_exclusion_ran
 }
=20
 static int __init parse_ivmd_device_select(
-    struct acpi_ivmd_block_header *ivmd_block,
+    const struct acpi_ivrs_memory *ivmd_block,
     unsigned long base, unsigned long limit, u8 iw, u8 ir)
 {
     u16 bdf;
=20
-    bdf =3D ivmd_block->header.dev_id;
+    bdf =3D ivmd_block->header.device_id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVMD Error: Invalid Dev_Id 0x%x\n", bdf);
@@ -258,13 +286,13 @@ static int __init parse_ivmd_device_sele
 }
=20
 static int __init parse_ivmd_device_range(
-    struct acpi_ivmd_block_header *ivmd_block,
+    const struct acpi_ivrs_memory *ivmd_block,
     unsigned long base, unsigned long limit, u8 iw, u8 ir)
 {
     u16 first_bdf, last_bdf, bdf;
     int error;
=20
-    first_bdf =3D ivmd_block->header.dev_id;
+    first_bdf =3D ivmd_block->header.device_id;
     if ( first_bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVMD Error: "
@@ -272,7 +300,7 @@ static int __init parse_ivmd_device_rang
         return -ENODEV;
     }
=20
-    last_bdf =3D ivmd_block->last_dev_id;
+    last_bdf =3D ivmd_block->aux_data;
     if ( (last_bdf >=3D ivrs_bdf_entries) || (last_bdf <=3D first_bdf) )
     {
         AMD_IOMMU_DEBUG("IVMD Error: "
@@ -288,18 +316,18 @@ static int __init parse_ivmd_device_rang
 }
=20
 static int __init parse_ivmd_device_iommu(
-    struct acpi_ivmd_block_header *ivmd_block,
+    const struct acpi_ivrs_memory *ivmd_block,
     unsigned long base, unsigned long limit, u8 iw, u8 ir)
 {
     struct amd_iommu *iommu;
=20
     /* find target IOMMU */
-    iommu =3D find_iommu_from_bdf_cap(ivmd_block->header.dev_id,
-                                    ivmd_block->cap_offset);
+    iommu =3D find_iommu_from_bdf_cap(ivmd_block->header.device_id,
+                                    ivmd_block->aux_data);
     if ( !iommu )
     {
         AMD_IOMMU_DEBUG("IVMD Error: No IOMMU for Dev_Id 0x%x  Cap =
0x%x\n",
-                        ivmd_block->header.dev_id, ivmd_block->cap_offset)=
;
+                        ivmd_block->header.device_id, ivmd_block->aux_data=
);
         return -ENODEV;
     }
=20
@@ -307,20 +335,19 @@ static int __init parse_ivmd_device_iomm
         iommu, base, limit, iw, ir);
 }
=20
-static int __init parse_ivmd_block(struct acpi_ivmd_block_header =
*ivmd_block)
+static int __init parse_ivmd_block(const struct acpi_ivrs_memory =
*ivmd_block)
 {
     unsigned long start_addr, mem_length, base, limit;
     u8 iw, ir;
=20
-    if ( ivmd_block->header.length <
-         sizeof(struct acpi_ivmd_block_header) )
+    if ( ivmd_block->header.length < sizeof(*ivmd_block) )
     {
         AMD_IOMMU_DEBUG("IVMD Error: Invalid Block Length!\n");
         return -ENODEV;
     }
=20
-    start_addr =3D (unsigned long)ivmd_block->start_addr;
-    mem_length =3D (unsigned long)ivmd_block->mem_length;
+    start_addr =3D (unsigned long)ivmd_block->start_address;
+    mem_length =3D (unsigned long)ivmd_block->memory_length;
     base =3D start_addr & PAGE_MASK;
     limit =3D (start_addr + mem_length - 1) & PAGE_MASK;
=20
@@ -328,20 +355,14 @@ static int __init parse_ivmd_block(struc
     AMD_IOMMU_DEBUG(" Start_Addr_Phys 0x%lx\n", start_addr);
     AMD_IOMMU_DEBUG(" Mem_Length 0x%lx\n", mem_length);
=20
-    if ( get_field_from_byte(ivmd_block->header.flags,
-                             AMD_IOMMU_ACPI_EXCLUSION_RANGE_MASK,
-                             AMD_IOMMU_ACPI_EXCLUSION_RANGE_SHIFT) )
+    if ( ivmd_block->header.flags & ACPI_IVMD_EXCLUSION_RANGE )
         iw =3D ir =3D IOMMU_CONTROL_ENABLED;
-    else if ( get_field_from_byte(ivmd_block->header.flags,
-                                  AMD_IOMMU_ACPI_UNITY_MAPPING_MASK,
-                                  AMD_IOMMU_ACPI_UNITY_MAPPING_SHIFT) )
-    {
-        iw =3D get_field_from_byte(ivmd_block->header.flags,
-                                 AMD_IOMMU_ACPI_IW_PERMISSION_MASK,
-                                 AMD_IOMMU_ACPI_IW_PERMISSION_SHIFT);
-        ir =3D get_field_from_byte(ivmd_block->header.flags,
-                                 AMD_IOMMU_ACPI_IR_PERMISSION_MASK,
-                                 AMD_IOMMU_ACPI_IR_PERMISSION_SHIFT);
+    else if ( ivmd_block->header.flags & ACPI_IVMD_UNITY )
+    {
+        iw =3D ivmd_block->header.flags & ACPI_IVMD_READ ?
+            IOMMU_CONTROL_ENABLED : IOMMU_CONTROL_DISABLED;
+        ir =3D ivmd_block->header.flags & ACPI_IVMD_WRITE ?
+            IOMMU_CONTROL_ENABLED : IOMMU_CONTROL_DISABLED;
     }
     else
     {
@@ -351,19 +372,19 @@ static int __init parse_ivmd_block(struc
=20
     switch( ivmd_block->header.type )
     {
-    case AMD_IOMMU_ACPI_IVMD_ALL_TYPE:
+    case ACPI_IVRS_TYPE_MEMORY_ALL:
         return register_exclusion_range_for_all_devices(
             base, limit, iw, ir);
=20
-    case AMD_IOMMU_ACPI_IVMD_ONE_TYPE:
+    case ACPI_IVRS_TYPE_MEMORY_ONE:
         return parse_ivmd_device_select(ivmd_block,
                                         base, limit, iw, ir);
=20
-    case AMD_IOMMU_ACPI_IVMD_RANGE_TYPE:
+    case ACPI_IVRS_TYPE_MEMORY_RANGE:
         return parse_ivmd_device_range(ivmd_block,
                                        base, limit, iw, ir);
=20
-    case AMD_IOMMU_ACPI_IVMD_IOMMU_TYPE:
+    case ACPI_IVRS_TYPE_MEMORY_IOMMU:
         return parse_ivmd_device_iommu(ivmd_block,
                                        base, limit, iw, ir);
=20
@@ -386,45 +407,44 @@ static u16 __init parse_ivhd_device_padd
 }
=20
 static u16 __init parse_ivhd_device_select(
-    union acpi_ivhd_device *ivhd_device, struct amd_iommu *iommu)
+    const struct acpi_ivrs_device4 *select, struct amd_iommu *iommu)
 {
     u16 bdf;
=20
-    bdf =3D ivhd_device->header.dev_id;
+    bdf =3D select->header.id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", =
bdf);
         return 0;
     }
=20
-    add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, iommu);
+    add_ivrs_mapping_entry(bdf, bdf, select->header.data_setting, iommu);
=20
-    return sizeof(struct acpi_ivhd_device_header);
+    return sizeof(*select);
 }
=20
 static u16 __init parse_ivhd_device_range(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivhd_device_range *range,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, first_bdf, last_bdf, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_range);
+    dev_length =3D sizeof(*range);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    if ( ivhd_device->range.trailer.type !=3D
-         AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )
+    if ( range->end.header.type !=3D ACPI_IVRS_TYPE_END )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
                         "Invalid Range: End_Type 0x%x\n",
-                        ivhd_device->range.trailer.type);
+                        range->end.header.type);
         return 0;
     }
=20
-    first_bdf =3D ivhd_device->header.dev_id;
+    first_bdf =3D range->start.header.id;
     if ( first_bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -432,7 +452,7 @@ static u16 __init parse_ivhd_device_rang
         return 0;
     }
=20
-    last_bdf =3D ivhd_device->range.trailer.dev_id;
+    last_bdf =3D range->end.header.id;
     if ( (last_bdf >=3D ivrs_bdf_entries) || (last_bdf <=3D first_bdf) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -443,32 +463,33 @@ static u16 __init parse_ivhd_device_rang
     AMD_IOMMU_DEBUG(" Dev_Id Range: 0x%x -> 0x%x\n", first_bdf, last_bdf);=

=20
     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ )
-        add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, =
iommu);
+        add_ivrs_mapping_entry(bdf, bdf, range->start.header.data_setting,=

+                               iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_alias(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivrs_device8a *alias,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, alias_id, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_alias);
+    dev_length =3D sizeof(*alias);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    bdf =3D ivhd_device->header.dev_id;
+    bdf =3D alias->header.id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", =
bdf);
         return 0;
     }
=20
-    alias_id =3D ivhd_device->alias.dev_id;
+    alias_id =3D alias->used_id;
     if ( alias_id >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Alias Dev_Id 0x%x\n", =
alias_id);
@@ -477,35 +498,34 @@ static u16 __init parse_ivhd_device_alia
=20
     AMD_IOMMU_DEBUG(" Dev_Id Alias: 0x%x\n", alias_id);
=20
-    add_ivrs_mapping_entry(bdf, alias_id, ivhd_device->header.flags, =
iommu);
+    add_ivrs_mapping_entry(bdf, alias_id, alias->header.data_setting, =
iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_alias_range(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivhd_device_alias_range *range,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
=20
     u16 dev_length, first_bdf, last_bdf, alias_id, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_alias_range);
+    dev_length =3D sizeof(*range);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    if ( ivhd_device->alias_range.trailer.type !=3D
-         AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )
+    if ( range->end.header.type !=3D ACPI_IVRS_TYPE_END )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
                         "Invalid Range: End_Type 0x%x\n",
-                        ivhd_device->alias_range.trailer.type);
+                        range->end.header.type);
         return 0;
     }
=20
-    first_bdf =3D ivhd_device->header.dev_id;
+    first_bdf =3D range->alias.header.id;
     if ( first_bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -513,7 +533,7 @@ static u16 __init parse_ivhd_device_alia
         return 0;
     }
=20
-    last_bdf =3D ivhd_device->alias_range.trailer.dev_id;
+    last_bdf =3D range->end.header.id;
     if ( last_bdf >=3D ivrs_bdf_entries || last_bdf <=3D first_bdf )
     {
         AMD_IOMMU_DEBUG(
@@ -521,7 +541,7 @@ static u16 __init parse_ivhd_device_alia
         return 0;
     }
=20
-    alias_id =3D ivhd_device->alias_range.alias.dev_id;
+    alias_id =3D range->alias.used_id;
     if ( alias_id >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Alias Dev_Id 0x%x\n", =
alias_id);
@@ -532,59 +552,59 @@ static u16 __init parse_ivhd_device_alia
     AMD_IOMMU_DEBUG(" Dev_Id Alias: 0x%x\n", alias_id);
=20
     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ )
-        add_ivrs_mapping_entry(bdf, alias_id, ivhd_device->header.flags, =
iommu);
+        add_ivrs_mapping_entry(bdf, alias_id, range->alias.header.data_set=
ting,
+                               iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_extended(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivrs_device8b *ext,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_extended);
+    dev_length =3D sizeof(*ext);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    bdf =3D ivhd_device->header.dev_id;
+    bdf =3D ext->header.id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", =
bdf);
         return 0;
     }
=20
-    add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, iommu);
+    add_ivrs_mapping_entry(bdf, bdf, ext->header.data_setting, iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_extended_range(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivhd_device_extended_range *range,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, first_bdf, last_bdf, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_extended_range);
+    dev_length =3D sizeof(*range);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    if ( ivhd_device->extended_range.trailer.type !=3D
-         AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )
+    if ( range->end.header.type !=3D ACPI_IVRS_TYPE_END )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
                         "Invalid Range: End_Type 0x%x\n",
-                        ivhd_device->extended_range.trailer.type);
+                        range->end.header.type);
         return 0;
     }
=20
-    first_bdf =3D ivhd_device->header.dev_id;
+    first_bdf =3D range->extended.header.id;
     if ( first_bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -592,7 +612,7 @@ static u16 __init parse_ivhd_device_exte
         return 0;
     }
=20
-    last_bdf =3D ivhd_device->extended_range.trailer.dev_id;
+    last_bdf =3D range->end.header.id;
     if ( (last_bdf >=3D ivrs_bdf_entries) || (last_bdf <=3D first_bdf) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -604,116 +624,116 @@ static u16 __init parse_ivhd_device_exte
                     first_bdf, last_bdf);
=20
     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ )
-        add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, =
iommu);
+        add_ivrs_mapping_entry(bdf, bdf, range->extended.header.data_setti=
ng,
+                               iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_special(
-    union acpi_ivhd_device *ivhd_device, u16 seg,
+    const struct acpi_ivrs_device8c *special, u16 seg,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_special);
+    dev_length =3D sizeof(*special);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    bdf =3D ivhd_device->special.dev_id;
+    bdf =3D special->used_id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", =
bdf);
         return 0;
     }
=20
-    add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, iommu);
+    add_ivrs_mapping_entry(bdf, bdf, special->header.data_setting, =
iommu);
     /* set device id of ioapic */
-    ioapic_sbdf[ivhd_device->special.handle].bdf =3D bdf;
-    ioapic_sbdf[ivhd_device->special.handle].seg =3D seg;
+    ioapic_sbdf[special->handle].bdf =3D bdf;
+    ioapic_sbdf[special->handle].seg =3D seg;
     return dev_length;
 }
=20
-static int __init parse_ivhd_block(struct acpi_ivhd_block_header =
*ivhd_block)
+static int __init parse_ivhd_block(const struct acpi_ivrs_hardware =
*ivhd_block)
 {
-    union acpi_ivhd_device *ivhd_device;
+    const union acpi_ivhd_device *ivhd_device;
     u16 block_length, dev_length;
     struct amd_iommu *iommu;
=20
-    if ( ivhd_block->header.length <
-         sizeof(struct acpi_ivhd_block_header) )
+    if ( ivhd_block->header.length < sizeof(*ivhd_block) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Block Length!\n");
         return -ENODEV;
     }
=20
-    iommu =3D find_iommu_from_bdf_cap(ivhd_block->header.dev_id,
-                                    ivhd_block->cap_offset);
+    iommu =3D find_iommu_from_bdf_cap(ivhd_block->header.device_id,
+                                    ivhd_block->capability_offset);
     if ( !iommu )
     {
         AMD_IOMMU_DEBUG("IVHD Error: No IOMMU for Dev_Id 0x%x  Cap =
0x%x\n",
-                        ivhd_block->header.dev_id, ivhd_block->cap_offset)=
;
+                        ivhd_block->header.device_id,
+                        ivhd_block->capability_offset);
         return -ENODEV;
     }
=20
     /* parse Device Entries */
-    block_length =3D sizeof(struct acpi_ivhd_block_header);
+    block_length =3D sizeof(*ivhd_block);
     while ( ivhd_block->header.length >=3D
-            (block_length + sizeof(struct acpi_ivhd_device_header)) )
+            (block_length + sizeof(struct acpi_ivrs_de_header)) )
     {
-        ivhd_device =3D (union acpi_ivhd_device *)
-            ((u8 *)ivhd_block + block_length);
+        ivhd_device =3D (const void *)((const u8 *)ivhd_block + block_leng=
th);
=20
         AMD_IOMMU_DEBUG( "IVHD Device Entry:\n");
         AMD_IOMMU_DEBUG( " Type 0x%x\n", ivhd_device->header.type);
-        AMD_IOMMU_DEBUG( " Dev_Id 0x%x\n", ivhd_device->header.dev_id);
-        AMD_IOMMU_DEBUG( " Flags 0x%x\n", ivhd_device->header.flags);
+        AMD_IOMMU_DEBUG( " Dev_Id 0x%x\n", ivhd_device->header.id);
+        AMD_IOMMU_DEBUG( " Flags 0x%x\n", ivhd_device->header.data_setting=
);
=20
         switch ( ivhd_device->header.type )
         {
-        case AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD:
+        case ACPI_IVRS_TYPE_PAD4:
             dev_length =3D parse_ivhd_device_padding(
                 sizeof(u32),
                 ivhd_block->header.length, block_length);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD:
+        case ACPI_IVRS_TYPE_PAD8:
             dev_length =3D parse_ivhd_device_padding(
                 sizeof(u64),
                 ivhd_block->header.length, block_length);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_SELECT:
-            dev_length =3D parse_ivhd_device_select(ivhd_device, iommu);
+        case ACPI_IVRS_TYPE_SELECT:
+            dev_length =3D parse_ivhd_device_select(&ivhd_device->select, =
iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_RANGE_START:
+        case ACPI_IVRS_TYPE_START:
             dev_length =3D parse_ivhd_device_range(
-                ivhd_device,
+                &ivhd_device->range,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT:
+        case ACPI_IVRS_TYPE_ALIAS_SELECT:
             dev_length =3D parse_ivhd_device_alias(
-                ivhd_device,
+                &ivhd_device->alias,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE:
+        case ACPI_IVRS_TYPE_ALIAS_START:
             dev_length =3D parse_ivhd_device_alias_range(
-                ivhd_device,
+                &ivhd_device->alias_range,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_SELECT:
+        case ACPI_IVRS_TYPE_EXT_SELECT:
             dev_length =3D parse_ivhd_device_extended(
-                ivhd_device,
+                &ivhd_device->extended,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE:
+        case ACPI_IVRS_TYPE_EXT_START:
             dev_length =3D parse_ivhd_device_extended_range(
-                ivhd_device,
+                &ivhd_device->extended_range,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL:
+        case ACPI_IVRS_TYPE_SPECIAL:
             dev_length =3D parse_ivhd_device_special(
-                ivhd_device, ivhd_block->pci_segment,
+                &ivhd_device->special, ivhd_block->pci_segment_group,
                 ivhd_block->header.length, block_length, iommu);
             break;
         default:
@@ -730,22 +750,24 @@ static int __init parse_ivhd_block(struc
     return 0;
 }
=20
-static int __init parse_ivrs_block(struct acpi_ivrs_block_header =
*ivrs_block)
+static int __init parse_ivrs_block(const struct acpi_ivrs_header =
*ivrs_block)
 {
-    struct acpi_ivhd_block_header *ivhd_block;
-    struct acpi_ivmd_block_header *ivmd_block;
+    const struct acpi_ivrs_hardware *ivhd_block;
+    const struct acpi_ivrs_memory *ivmd_block;
=20
     switch ( ivrs_block->type )
     {
-    case AMD_IOMMU_ACPI_IVHD_TYPE:
-        ivhd_block =3D (struct acpi_ivhd_block_header *)ivrs_block;
+    case ACPI_IVRS_TYPE_HARDWARE:
+        ivhd_block =3D container_of(ivrs_block, const struct acpi_ivrs_har=
dware,
+                                  header);
         return parse_ivhd_block(ivhd_block);
=20
-    case AMD_IOMMU_ACPI_IVMD_ALL_TYPE:
-    case AMD_IOMMU_ACPI_IVMD_ONE_TYPE:
-    case AMD_IOMMU_ACPI_IVMD_RANGE_TYPE:
-    case AMD_IOMMU_ACPI_IVMD_IOMMU_TYPE:
-        ivmd_block =3D (struct acpi_ivmd_block_header *)ivrs_block;
+    case ACPI_IVRS_TYPE_MEMORY_ALL:
+    case ACPI_IVRS_TYPE_MEMORY_ONE:
+    case ACPI_IVRS_TYPE_MEMORY_RANGE:
+    case ACPI_IVRS_TYPE_MEMORY_IOMMU:
+        ivmd_block =3D container_of(ivrs_block, const struct acpi_ivrs_mem=
ory,
+                                  header);
         return parse_ivmd_block(ivmd_block);
=20
     default:
@@ -792,12 +814,11 @@ static void __init dump_acpi_table_heade
=20
 }
=20
-static int __init parse_ivrs_table(struct acpi_table_header *_table)
+static int __init parse_ivrs_table(struct acpi_table_header *table)
 {
-    struct acpi_ivrs_block_header *ivrs_block;
+    const struct acpi_ivrs_header *ivrs_block;
     unsigned long length;
     int error =3D 0;
-    struct acpi_table_header *table =3D (struct acpi_table_header =
*)_table;
=20
     BUG_ON(!table);
=20
@@ -805,17 +826,16 @@ static int __init parse_ivrs_table(struc
         dump_acpi_table_header(table);
=20
     /* parse IVRS blocks */
-    length =3D sizeof(struct acpi_ivrs_table_header);
+    length =3D sizeof(struct acpi_table_ivrs);
     while ( (error =3D=3D 0) && (table->length > (length + sizeof(*ivrs_bl=
ock))) )
     {
-        ivrs_block =3D (struct acpi_ivrs_block_header *)
-            ((u8 *)table + length);
+        ivrs_block =3D (struct acpi_ivrs_header *)((u8 *)table + length);
=20
         AMD_IOMMU_DEBUG("IVRS Block:\n");
         AMD_IOMMU_DEBUG(" Type 0x%x\n", ivrs_block->type);
         AMD_IOMMU_DEBUG(" Flags 0x%x\n", ivrs_block->flags);
         AMD_IOMMU_DEBUG(" Length 0x%x\n", ivrs_block->length);
-        AMD_IOMMU_DEBUG(" Dev_Id 0x%x\n", ivrs_block->dev_id);
+        AMD_IOMMU_DEBUG(" Dev_Id 0x%x\n", ivrs_block->device_id);
=20
         if ( table->length < (length + ivrs_block->length) )
         {
@@ -833,12 +853,11 @@ static int __init parse_ivrs_table(struc
     return error;
 }
=20
-static int __init detect_iommu_acpi(struct acpi_table_header *_table)
+static int __init detect_iommu_acpi(struct acpi_table_header *table)
 {
-    struct acpi_ivrs_block_header *ivrs_block;
-    struct acpi_table_header *table =3D (struct acpi_table_header =
*)_table;
+    const struct acpi_ivrs_header *ivrs_block;
     unsigned long i;
-    unsigned long length =3D sizeof(struct acpi_ivrs_table_header);
+    unsigned long length =3D sizeof(struct acpi_table_ivrs);
     u8 checksum, *raw_table;
=20
     /* validate checksum: sum of entire table =3D=3D 0 */
@@ -854,12 +873,14 @@ static int __init detect_iommu_acpi(stru
=20
     while ( table->length > (length + sizeof(*ivrs_block)) )
     {
-        ivrs_block =3D (struct acpi_ivrs_block_header *) ((u8 *)table + =
length);
+        ivrs_block =3D (struct acpi_ivrs_header *)((u8 *)table + length);
         if ( table->length < (length + ivrs_block->length) )
             return -ENODEV;
-        if ( ivrs_block->type =3D=3D AMD_IOMMU_ACPI_IVHD_TYPE )
-            if ( amd_iommu_detect_one_acpi((void*)ivrs_block) !=3D 0 )
-                return -ENODEV;
+        if ( ivrs_block->type =3D=3D ACPI_IVRS_TYPE_HARDWARE &&
+             amd_iommu_detect_one_acpi(
+                 container_of(ivrs_block, const struct acpi_ivrs_hardware,=

+                              header)) !=3D 0 )
+            return -ENODEV;
         length +=3D ivrs_block->length;
     }
     return 0;
@@ -870,63 +891,59 @@ static int __init detect_iommu_acpi(stru
        last_bdf =3D (x); \
    } while(0);
=20
-static int __init get_last_bdf_ivhd(void *ivhd)
+static int __init get_last_bdf_ivhd(
+    const struct acpi_ivrs_hardware *ivhd_block)
 {
-    union acpi_ivhd_device *ivhd_device;
+    const union acpi_ivhd_device *ivhd_device;
     u16 block_length, dev_length;
-    struct acpi_ivhd_block_header *ivhd_block;
-
-    ivhd_block =3D (struct acpi_ivhd_block_header *)ivhd;
=20
-    if ( ivhd_block->header.length <
-         sizeof(struct acpi_ivhd_block_header) )
+    if ( ivhd_block->header.length < sizeof(*ivhd_block) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Block Length!\n");
         return -ENODEV;
     }
=20
-    block_length =3D sizeof(struct acpi_ivhd_block_header);
+    block_length =3D sizeof(*ivhd_block);
     while ( ivhd_block->header.length >=3D
-            (block_length + sizeof(struct acpi_ivhd_device_header)) )
+            (block_length + sizeof(struct acpi_ivrs_de_header)) )
     {
-        ivhd_device =3D (union acpi_ivhd_device *)
-            ((u8 *)ivhd_block + block_length);
+        ivhd_device =3D (const void *)((u8 *)ivhd_block + block_length);
=20
         switch ( ivhd_device->header.type )
         {
-        case AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD:
+        case ACPI_IVRS_TYPE_PAD4:
             dev_length =3D sizeof(u32);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD:
+        case ACPI_IVRS_TYPE_PAD8:
             dev_length =3D sizeof(u64);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_SELECT:
-            UPDATE_LAST_BDF(ivhd_device->header.dev_id);
-            dev_length =3D sizeof(struct acpi_ivhd_device_header);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT:
-            UPDATE_LAST_BDF(ivhd_device->header.dev_id);
-            dev_length =3D sizeof(struct acpi_ivhd_device_alias);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_SELECT:
-            UPDATE_LAST_BDF(ivhd_device->header.dev_id);
-            dev_length =3D sizeof(struct acpi_ivhd_device_extended);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_RANGE_START:
-            UPDATE_LAST_BDF(ivhd_device->range.trailer.dev_id);
-            dev_length =3D sizeof(struct acpi_ivhd_device_range);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE:
-            UPDATE_LAST_BDF(ivhd_device->alias_range.trailer.dev_id)
-            dev_length =3D sizeof(struct acpi_ivhd_device_alias_range);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE:
-            UPDATE_LAST_BDF(ivhd_device->extended_range.trailer.dev_id)
-            dev_length =3D sizeof(struct acpi_ivhd_device_extended_range);=

-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL:
-            UPDATE_LAST_BDF(ivhd_device->special.dev_id)
-            dev_length =3D sizeof(struct acpi_ivhd_device_special);
+        case ACPI_IVRS_TYPE_SELECT:
+            UPDATE_LAST_BDF(ivhd_device->select.header.id);
+            dev_length =3D sizeof(ivhd_device->header);
+            break;
+        case ACPI_IVRS_TYPE_ALIAS_SELECT:
+            UPDATE_LAST_BDF(ivhd_device->alias.header.id);
+            dev_length =3D sizeof(ivhd_device->alias);
+            break;
+        case ACPI_IVRS_TYPE_EXT_SELECT:
+            UPDATE_LAST_BDF(ivhd_device->extended.header.id);
+            dev_length =3D sizeof(ivhd_device->extended);
+            break;
+        case ACPI_IVRS_TYPE_START:
+            UPDATE_LAST_BDF(ivhd_device->range.end.header.id);
+            dev_length =3D sizeof(ivhd_device->range);
+            break;
+        case ACPI_IVRS_TYPE_ALIAS_START:
+            UPDATE_LAST_BDF(ivhd_device->alias_range.end.header.id)
+            dev_length =3D sizeof(ivhd_device->alias_range);
+            break;
+        case ACPI_IVRS_TYPE_EXT_START:
+            UPDATE_LAST_BDF(ivhd_device->extended_range.end.header.id)
+            dev_length =3D sizeof(ivhd_device->extended_range);
+            break;
+        case ACPI_IVRS_TYPE_SPECIAL:
+            UPDATE_LAST_BDF(ivhd_device->special.used_id)
+            dev_length =3D sizeof(ivhd_device->special);
             break;
         default:
             AMD_IOMMU_DEBUG("IVHD Error: Invalid Device Type!\n");
@@ -942,20 +959,21 @@ static int __init get_last_bdf_ivhd(void
     return 0;
 }
=20
-static int __init get_last_bdf_acpi(struct acpi_table_header *_table)
+static int __init get_last_bdf_acpi(struct acpi_table_header *table)
 {
-    struct acpi_ivrs_block_header *ivrs_block;
-    struct acpi_table_header *table =3D (struct acpi_table_header =
*)_table;
-    unsigned long length =3D sizeof(struct acpi_ivrs_table_header);
+    const struct acpi_ivrs_header *ivrs_block;
+    unsigned long length =3D sizeof(struct acpi_table_ivrs);
=20
     while ( table->length > (length + sizeof(*ivrs_block)) )
     {
-        ivrs_block =3D (struct acpi_ivrs_block_header *) ((u8 *)table + =
length);
+        ivrs_block =3D (struct acpi_ivrs_header *)((u8 *)table + length);
         if ( table->length < (length + ivrs_block->length) )
             return -ENODEV;
-        if ( ivrs_block->type =3D=3D AMD_IOMMU_ACPI_IVHD_TYPE )
-            if ( get_last_bdf_ivhd((void*)ivrs_block) !=3D 0 )
-                return -ENODEV;
+        if ( ivrs_block->type =3D=3D ACPI_IVRS_TYPE_HARDWARE &&
+             get_last_bdf_ivhd(
+                 container_of(ivrs_block, const struct acpi_ivrs_hardware,=

+                              header)) !=3D 0 )
+            return -ENODEV;
         length +=3D ivrs_block->length;
     }
    return 0;
@@ -963,16 +981,16 @@ static int __init get_last_bdf_acpi(stru
=20
 int __init amd_iommu_detect_acpi(void)
 {
-    return acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, detect_iommu_acpi);
+    return acpi_table_parse(ACPI_SIG_IVRS, detect_iommu_acpi);
 }
=20
 int __init amd_iommu_get_ivrs_dev_entries(void)
 {
-    acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, get_last_bdf_acpi);
+    acpi_table_parse(ACPI_SIG_IVRS, get_last_bdf_acpi);
     return last_bdf + 1;
 }
=20
 int __init amd_iommu_update_ivrs_mapping_acpi(void)
 {
-    return acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, parse_ivrs_table);
+    return acpi_table_parse(ACPI_SIG_IVRS, parse_ivrs_table);
 }
--- a/xen/drivers/passthrough/amd/iommu_detect.c
+++ b/xen/drivers/passthrough/amd/iommu_detect.c
@@ -20,12 +20,12 @@
=20
 #include <xen/config.h>
 #include <xen/errno.h>
+#include <xen/acpi.h>
 #include <xen/iommu.h>
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
-#include <asm/hvm/svm/amd-iommu-acpi.h>
=20
 static int __init get_iommu_msi_capabilities(
     u16 seg, u8 bus, u8 dev, u8 func, struct amd_iommu *iommu)
@@ -103,23 +103,21 @@ void __init get_iommu_features(struct am
     }
 }
=20
-int __init amd_iommu_detect_one_acpi(void *ivhd)
+int __init amd_iommu_detect_one_acpi(
+    const struct acpi_ivrs_hardware *ivhd_block)
 {
     struct amd_iommu *iommu;
     u8 bus, dev, func;
-    struct acpi_ivhd_block_header *ivhd_block;
     int rt =3D 0;
=20
-    ivhd_block =3D (struct acpi_ivhd_block_header *)ivhd;
-
-    if ( ivhd_block->header.length < sizeof(struct acpi_ivhd_block_header)=
 )
+    if ( ivhd_block->header.length < sizeof(*ivhd_block) )
     {
         AMD_IOMMU_DEBUG("Invalid IVHD Block Length!\n");
         return -ENODEV;
     }
=20
-    if ( !ivhd_block->header.dev_id ||
-        !ivhd_block->cap_offset || !ivhd_block->mmio_base)
+    if ( !ivhd_block->header.device_id ||
+        !ivhd_block->capability_offset || !ivhd_block->base_address)
     {
         AMD_IOMMU_DEBUG("Invalid IVHD Block!\n");
         return -ENODEV;
@@ -134,10 +132,10 @@ int __init amd_iommu_detect_one_acpi(voi
=20
     spin_lock_init(&iommu->lock);
=20
-    iommu->seg =3D ivhd_block->pci_segment;
-    iommu->bdf =3D ivhd_block->header.dev_id;
-    iommu->cap_offset =3D ivhd_block->cap_offset;
-    iommu->mmio_base_phys =3D ivhd_block->mmio_base;
+    iommu->seg =3D ivhd_block->pci_segment_group;
+    iommu->bdf =3D ivhd_block->header.device_id;
+    iommu->cap_offset =3D ivhd_block->capability_offset;
+    iommu->mmio_base_phys =3D ivhd_block->base_address;
=20
     /* override IOMMU HT flags */
     iommu->ht_flags =3D ivhd_block->header.flags;
--- a/xen/drivers/passthrough/amd/iommu_init.c
+++ b/xen/drivers/passthrough/amd/iommu_init.c
@@ -20,6 +20,7 @@
=20
 #include <xen/config.h>
 #include <xen/errno.h>
+#include <xen/acpi.h>
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/irq.h>
@@ -28,7 +29,6 @@
 #include <asm/hvm/svm/amd-iommu-proto.h>
 #include <asm-x86/fixmap.h>
 #include <mach_apic.h>
-#include <asm/hvm/svm/amd-iommu-acpi.h>
=20
 static int __initdata nr_amd_iommus;
=20
@@ -37,9 +37,8 @@ static struct radix_tree_root ivrs_maps;
 struct list_head amd_iommu_head;
 struct table_struct device_table;
=20
-static int iommu_has_ht_flag(struct amd_iommu *iommu, uint8_t bit)
+static int iommu_has_ht_flag(struct amd_iommu *iommu, u8 mask)
 {
-    u8 mask =3D 1U << bit;
     return iommu->ht_flags & mask;
 }
=20
@@ -80,19 +79,19 @@ static void set_iommu_ht_flags(struct am
=20
     /* Setup HT flags */
     if ( iommu_has_cap(iommu, PCI_CAP_HT_TUNNEL_SHIFT) )
-        iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT) ?
+        iommu_has_ht_flag(iommu, ACPI_IVHD_TT_ENABLE) ?
             iommu_set_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIF=
T) :
             iommu_clear_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SH=
IFT);
=20
-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_RES_PASS_PW_SHIFT) ?
+    iommu_has_ht_flag(iommu, ACPI_IVHD_RES_PASS_PW) ?
         iommu_set_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT):=

         iommu_clear_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT=
);
=20
-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_ISOC_SHIFT) ?
+    iommu_has_ht_flag(iommu, ACPI_IVHD_ISOC) ?
         iommu_set_bit(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT):
         iommu_clear_bit(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT);
=20
-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_PASS_PW_SHIFT) ?
+    iommu_has_ht_flag(iommu, ACPI_IVHD_PASS_PW) ?
         iommu_set_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT):
         iommu_clear_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT);
=20
--- a/xen/drivers/passthrough/amd/iommu_map.c
+++ b/xen/drivers/passthrough/amd/iommu_map.c
@@ -18,12 +18,13 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 =
USA
  */
=20
+#include <xen/config.h>
+#include <xen/acpi.h>
 #include <xen/sched.h>
 #include <asm/p2m.h>
 #include <xen/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
-#include <asm/hvm/svm/amd-iommu-acpi.h>
 #include "../ats.h"
 #include <xen/pci.h>
=20
@@ -215,8 +216,7 @@ void __init iommu_dte_add_device_entry(u
     dte[7] =3D dte[6] =3D dte[4] =3D dte[2] =3D dte[1] =3D dte[0] =3D 0;
=20
     flags =3D ivrs_dev->device_flags;
-    sys_mgt =3D get_field_from_byte(flags, AMD_IOMMU_ACPI_SYS_MGT_MASK,
-                                  AMD_IOMMU_ACPI_SYS_MGT_SHIFT);
+    sys_mgt =3D get_field_from_byte(flags, ACPI_IVHD_SYSTEM_MGMT);
     dev_ex =3D ivrs_dev->dte_allow_exclusion;
=20
     flags &=3D mask;
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-acpi.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2007 Advanced Micro Devices, Inc.
- * Author: Leo Duran <leo.duran@amd.com>
- * Author: Wei Wang <wei.wang2@amd.com> - adapted to xen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 =
USA
- */
-
-#ifndef _ASM_X86_64_AMD_IOMMU_ACPI_H
-#define _ASM_X86_64_AMD_IOMMU_ACPI_H
-
-#include <xen/acpi.h>
-
-/* I/O Virtualization Reporting Structure */
-#define AMD_IOMMU_ACPI_IVRS_SIG            "IVRS"
-#define AMD_IOMMU_ACPI_IVHD_TYPE       0x10
-#define AMD_IOMMU_ACPI_IVMD_ALL_TYPE       0x20
-#define AMD_IOMMU_ACPI_IVMD_ONE_TYPE       0x21
-#define AMD_IOMMU_ACPI_IVMD_RANGE_TYPE     0x22
-#define AMD_IOMMU_ACPI_IVMD_IOMMU_TYPE     0x23
-
-/* 4-byte Device Entries */
-#define AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD        0
-#define AMD_IOMMU_ACPI_IVHD_DEV_SELECT     2
-#define AMD_IOMMU_ACPI_IVHD_DEV_RANGE_START    3
-#define AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END  4
-
-/* 8-byte Device Entries */
-#define AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD        64
-#define AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT   66
-#define AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE    67
-#define AMD_IOMMU_ACPI_IVHD_DEV_EXT_SELECT 70
-#define AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE  71
-#define AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL    72
-
-/* IVHD IOMMU Flags */
-#define AMD_IOMMU_ACPI_COHERENT_MASK       0x20
-#define AMD_IOMMU_ACPI_COHERENT_SHIFT      5
-#define AMD_IOMMU_ACPI_IOTLB_SUP_MASK      0x10
-#define AMD_IOMMU_ACPI_IOTLB_SUP_SHIFT     4
-#define AMD_IOMMU_ACPI_ISOC_MASK       0x08
-#define AMD_IOMMU_ACPI_ISOC_SHIFT      3
-#define AMD_IOMMU_ACPI_RES_PASS_PW_MASK        0x04
-#define AMD_IOMMU_ACPI_RES_PASS_PW_SHIFT   2
-#define AMD_IOMMU_ACPI_PASS_PW_MASK        0x02
-#define AMD_IOMMU_ACPI_PASS_PW_SHIFT       1
-#define AMD_IOMMU_ACPI_HT_TUN_ENB_MASK     0x01
-#define AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT        0
-
-/* IVHD Device Flags */
-#define AMD_IOMMU_ACPI_LINT1_PASS_MASK     0x80
-#define AMD_IOMMU_ACPI_LINT1_PASS_SHIFT        7
-#define AMD_IOMMU_ACPI_LINT0_PASS_MASK     0x40
-#define AMD_IOMMU_ACPI_LINT0_PASS_SHIFT        6
-#define AMD_IOMMU_ACPI_SYS_MGT_MASK        0x30
-#define AMD_IOMMU_ACPI_SYS_MGT_SHIFT       4
-#define AMD_IOMMU_ACPI_NMI_PASS_MASK       0x04
-#define AMD_IOMMU_ACPI_NMI_PASS_SHIFT      2
-#define AMD_IOMMU_ACPI_EINT_PASS_MASK      0x02
-#define AMD_IOMMU_ACPI_EINT_PASS_SHIFT     1
-#define AMD_IOMMU_ACPI_INIT_PASS_MASK      0x01
-#define AMD_IOMMU_ACPI_INIT_PASS_SHIFT     0
-
-/* IVHD Device Extended Flags */
-#define AMD_IOMMU_ACPI_ATS_DISABLED_MASK   0x80000000
-#define AMD_IOMMU_ACPI_ATS_DISABLED_SHIFT  31
-
-/* IVMD Device Flags */
-#define AMD_IOMMU_ACPI_EXCLUSION_RANGE_MASK    0x08
-#define AMD_IOMMU_ACPI_EXCLUSION_RANGE_SHIFT   3
-#define AMD_IOMMU_ACPI_IW_PERMISSION_MASK  0x04
-#define AMD_IOMMU_ACPI_IW_PERMISSION_SHIFT 2
-#define AMD_IOMMU_ACPI_IR_PERMISSION_MASK  0x02
-#define AMD_IOMMU_ACPI_IR_PERMISSION_SHIFT 1
-#define AMD_IOMMU_ACPI_UNITY_MAPPING_MASK  0x01
-#define AMD_IOMMU_ACPI_UNITY_MAPPING_SHIFT 0
-
-#define ACPI_OEM_ID_SIZE                6
-#define ACPI_OEM_TABLE_ID_SIZE          8
-
-#pragma pack(1)
-struct acpi_ivrs_table_header {
-   struct acpi_table_header acpi_header;
-   u32 io_info;
-   u8  reserved[8];
-};
-
-struct acpi_ivrs_block_header {
-   u8  type;
-   u8  flags;
-   u16 length;
-   u16 dev_id;
-};
-
-struct acpi_ivhd_block_header {
-   struct acpi_ivrs_block_header header;
-   u16 cap_offset;
-   u64 mmio_base;
-   u16 pci_segment;
-   u16 iommu_info;
-   u8 reserved[4];
-};
-
-struct acpi_ivhd_device_header {
-   u8  type;
-   u16 dev_id;
-   u8  flags;
-};
-
-struct acpi_ivhd_device_trailer {
-   u8  type;
-   u16 dev_id;
-   u8  reserved;
-};
-
-struct acpi_ivhd_device_range {
-   struct acpi_ivhd_device_header header;
-   struct acpi_ivhd_device_trailer trailer;
-};
-
-struct acpi_ivhd_device_alias {
-   struct acpi_ivhd_device_header header;
-   u8  reserved1;
-   u16 dev_id;
-   u8  reserved2;
-};
-
-struct acpi_ivhd_device_alias_range {
-   struct acpi_ivhd_device_alias alias;
-   struct acpi_ivhd_device_trailer trailer;
-};
-
-struct acpi_ivhd_device_extended {
-   struct acpi_ivhd_device_header header;
-   u32 ext_flags;
-};
-
-struct acpi_ivhd_device_extended_range {
-   struct acpi_ivhd_device_extended extended;
-   struct acpi_ivhd_device_trailer trailer;
-};
-
-struct acpi_ivhd_device_special {
-   struct acpi_ivhd_device_header header;
-   u8  handle;
-   u16 dev_id;
-   u8  variety;
-};
-
-union acpi_ivhd_device {
-   struct acpi_ivhd_device_header header;
-   struct acpi_ivhd_device_range range;
-   struct acpi_ivhd_device_alias alias;
-   struct acpi_ivhd_device_alias_range alias_range;
-   struct acpi_ivhd_device_extended extended;
-   struct acpi_ivhd_device_extended_range extended_range;
-   struct acpi_ivhd_device_special special;
-};
-
-struct acpi_ivmd_block_header {
-   struct acpi_ivrs_block_header header;
-   union {
-       u16 last_dev_id;
-       u16 cap_offset;
-       u16 reserved1;
-   };
-   u64 reserved2;
-   u64 start_addr;
-   u64 mem_length;
-};
-#pragma pack()
-
-#endif /* _ASM_X86_64_AMD_IOMMU_ACPI_H */
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
@@ -26,6 +26,8 @@
 #include <asm/apicdef.h>
 #include <xen/domain_page.h>
=20
+struct acpi_ivrs_hardware;
+
 #define for_each_amd_iommu(amd_iommu) \
     list_for_each_entry(amd_iommu, \
         &amd_iommu_head, list)
@@ -41,7 +43,7 @@
=20
 /* amd-iommu-detect functions */
 int amd_iommu_get_ivrs_dev_entries(void);
-int amd_iommu_detect_one_acpi(void *ivhd);
+int amd_iommu_detect_one_acpi(const struct acpi_ivrs_hardware *);
 int amd_iommu_detect_acpi(void);
 void get_iommu_features(struct amd_iommu *iommu);
=20
@@ -121,11 +123,9 @@ static inline u32 set_field_in_reg_u32(u
     return reg_value;
 }
=20
-static inline u8 get_field_from_byte(u8 value, u8 mask, u8 shift)
+static inline u8 get_field_from_byte(u8 value, u8 mask)
 {
-    u8 field;
-    field =3D (value & mask) >> shift;
-    return field;
+    return (value & mask) / (mask & -mask);
 }
=20
 static inline unsigned long region_to_pages(unsigned long addr, unsigned =
long size)



--=__PartA9860C5A.1__=
Content-Type: text/plain; name="acpi-duplicate-ivrs-structs.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="acpi-duplicate-ivrs-structs.patch"

ACPI: eliminate duplicate IVRS definitions=0A=0AUse their proper counterpar=
ts in include/acpi/actbl*.h instead.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/drivers/passthrough/amd/iommu_acpi.c=0A+=
++ b/xen/drivers/passthrough/amd/iommu_acpi.c=0A@@ -20,10 +20,38 @@=0A =0A =
#include <xen/config.h>=0A #include <xen/errno.h>=0A+#include <xen/acpi.h>=
=0A #include <asm/apicdef.h>=0A #include <asm/amd-iommu.h>=0A #include =
<asm/hvm/svm/amd-iommu-proto.h>=0A-#include <asm/hvm/svm/amd-iommu-acpi.h>=
=0A+=0A+/* Some helper structures, particularly to deal with ranges. =
*/=0A+=0A+struct acpi_ivhd_device_range {=0A+   struct acpi_ivrs_device4 =
start;=0A+   struct acpi_ivrs_device4 end;=0A+};=0A+=0A+struct acpi_ivhd_de=
vice_alias_range {=0A+   struct acpi_ivrs_device8a alias;=0A+   struct =
acpi_ivrs_device4 end;=0A+};=0A+=0A+struct acpi_ivhd_device_extended_range =
{=0A+   struct acpi_ivrs_device8b extended;=0A+   struct acpi_ivrs_device4 =
end;=0A+};=0A+=0A+union acpi_ivhd_device {=0A+   struct acpi_ivrs_de_header=
 header;=0A+   struct acpi_ivrs_device4 select;=0A+   struct acpi_ivhd_devi=
ce_range range;=0A+   struct acpi_ivrs_device8a alias;=0A+   struct =
acpi_ivhd_device_alias_range alias_range;=0A+   struct acpi_ivrs_device8b =
extended;=0A+   struct acpi_ivhd_device_extended_range extended_range;=0A+ =
  struct acpi_ivrs_device8c special;=0A+};=0A =0A static unsigned short =
__initdata last_bdf;=0A =0A@@ -242,12 +270,12 @@ static int __init =
register_exclusion_ran=0A }=0A =0A static int __init parse_ivmd_device_sele=
ct(=0A-    struct acpi_ivmd_block_header *ivmd_block,=0A+    const struct =
acpi_ivrs_memory *ivmd_block,=0A     unsigned long base, unsigned long =
limit, u8 iw, u8 ir)=0A {=0A     u16 bdf;=0A =0A-    bdf =3D ivmd_block->he=
ader.dev_id;=0A+    bdf =3D ivmd_block->header.device_id;=0A     if ( bdf =
>=3D ivrs_bdf_entries )=0A     {=0A         AMD_IOMMU_DEBUG("IVMD Error: =
Invalid Dev_Id 0x%x\n", bdf);=0A@@ -258,13 +286,13 @@ static int __init =
parse_ivmd_device_sele=0A }=0A =0A static int __init parse_ivmd_device_rang=
e(=0A-    struct acpi_ivmd_block_header *ivmd_block,=0A+    const struct =
acpi_ivrs_memory *ivmd_block,=0A     unsigned long base, unsigned long =
limit, u8 iw, u8 ir)=0A {=0A     u16 first_bdf, last_bdf, bdf;=0A     int =
error;=0A =0A-    first_bdf =3D ivmd_block->header.dev_id;=0A+    =
first_bdf =3D ivmd_block->header.device_id;=0A     if ( first_bdf >=3D =
ivrs_bdf_entries )=0A     {=0A         AMD_IOMMU_DEBUG("IVMD Error: "=0A@@ =
-272,7 +300,7 @@ static int __init parse_ivmd_device_rang=0A         =
return -ENODEV;=0A     }=0A =0A-    last_bdf =3D ivmd_block->last_dev_id;=
=0A+    last_bdf =3D ivmd_block->aux_data;=0A     if ( (last_bdf >=3D =
ivrs_bdf_entries) || (last_bdf <=3D first_bdf) )=0A     {=0A         =
AMD_IOMMU_DEBUG("IVMD Error: "=0A@@ -288,18 +316,18 @@ static int __init =
parse_ivmd_device_rang=0A }=0A =0A static int __init parse_ivmd_device_iomm=
u(=0A-    struct acpi_ivmd_block_header *ivmd_block,=0A+    const struct =
acpi_ivrs_memory *ivmd_block,=0A     unsigned long base, unsigned long =
limit, u8 iw, u8 ir)=0A {=0A     struct amd_iommu *iommu;=0A =0A     /* =
find target IOMMU */=0A-    iommu =3D find_iommu_from_bdf_cap(ivmd_block->h=
eader.dev_id,=0A-                                    ivmd_block->cap_offset=
);=0A+    iommu =3D find_iommu_from_bdf_cap(ivmd_block->header.device_id,=
=0A+                                    ivmd_block->aux_data);=0A     if ( =
!iommu )=0A     {=0A         AMD_IOMMU_DEBUG("IVMD Error: No IOMMU for =
Dev_Id 0x%x  Cap 0x%x\n",=0A-                        ivmd_block->header.dev=
_id, ivmd_block->cap_offset);=0A+                        ivmd_block->header=
.device_id, ivmd_block->aux_data);=0A         return -ENODEV;=0A     }=0A =
=0A@@ -307,20 +335,19 @@ static int __init parse_ivmd_device_iomm=0A       =
  iommu, base, limit, iw, ir);=0A }=0A =0A-static int __init parse_ivmd_blo=
ck(struct acpi_ivmd_block_header *ivmd_block)=0A+static int __init =
parse_ivmd_block(const struct acpi_ivrs_memory *ivmd_block)=0A {=0A     =
unsigned long start_addr, mem_length, base, limit;=0A     u8 iw, ir;=0A =
=0A-    if ( ivmd_block->header.length <=0A-         sizeof(struct =
acpi_ivmd_block_header) )=0A+    if ( ivmd_block->header.length < =
sizeof(*ivmd_block) )=0A     {=0A         AMD_IOMMU_DEBUG("IVMD Error: =
Invalid Block Length!\n");=0A         return -ENODEV;=0A     }=0A =0A-    =
start_addr =3D (unsigned long)ivmd_block->start_addr;=0A-    mem_length =
=3D (unsigned long)ivmd_block->mem_length;=0A+    start_addr =3D (unsigned =
long)ivmd_block->start_address;=0A+    mem_length =3D (unsigned long)ivmd_b=
lock->memory_length;=0A     base =3D start_addr & PAGE_MASK;=0A     limit =
=3D (start_addr + mem_length - 1) & PAGE_MASK;=0A =0A@@ -328,20 +355,14 @@ =
static int __init parse_ivmd_block(struc=0A     AMD_IOMMU_DEBUG(" =
Start_Addr_Phys 0x%lx\n", start_addr);=0A     AMD_IOMMU_DEBUG(" Mem_Length =
0x%lx\n", mem_length);=0A =0A-    if ( get_field_from_byte(ivmd_block->head=
er.flags,=0A-                             AMD_IOMMU_ACPI_EXCLUSION_RANGE_MA=
SK,=0A-                             AMD_IOMMU_ACPI_EXCLUSION_RANGE_SHIFT) =
)=0A+    if ( ivmd_block->header.flags & ACPI_IVMD_EXCLUSION_RANGE )=0A    =
     iw =3D ir =3D IOMMU_CONTROL_ENABLED;=0A-    else if ( get_field_from_b=
yte(ivmd_block->header.flags,=0A-                                  =
AMD_IOMMU_ACPI_UNITY_MAPPING_MASK,=0A-                                  =
AMD_IOMMU_ACPI_UNITY_MAPPING_SHIFT) )=0A-    {=0A-        iw =3D get_field_=
from_byte(ivmd_block->header.flags,=0A-                                 =
AMD_IOMMU_ACPI_IW_PERMISSION_MASK,=0A-                                 =
AMD_IOMMU_ACPI_IW_PERMISSION_SHIFT);=0A-        ir =3D get_field_from_byte(=
ivmd_block->header.flags,=0A-                                 AMD_IOMMU_ACP=
I_IR_PERMISSION_MASK,=0A-                                 AMD_IOMMU_ACPI_IR=
_PERMISSION_SHIFT);=0A+    else if ( ivmd_block->header.flags & ACPI_IVMD_U=
NITY )=0A+    {=0A+        iw =3D ivmd_block->header.flags & ACPI_IVMD_READ=
 ?=0A+            IOMMU_CONTROL_ENABLED : IOMMU_CONTROL_DISABLED;=0A+      =
  ir =3D ivmd_block->header.flags & ACPI_IVMD_WRITE ?=0A+            =
IOMMU_CONTROL_ENABLED : IOMMU_CONTROL_DISABLED;=0A     }=0A     else=0A    =
 {=0A@@ -351,19 +372,19 @@ static int __init parse_ivmd_block(struc=0A =0A =
    switch( ivmd_block->header.type )=0A     {=0A-    case AMD_IOMMU_ACPI_I=
VMD_ALL_TYPE:=0A+    case ACPI_IVRS_TYPE_MEMORY_ALL:=0A         return =
register_exclusion_range_for_all_devices(=0A             base, limit, iw, =
ir);=0A =0A-    case AMD_IOMMU_ACPI_IVMD_ONE_TYPE:=0A+    case ACPI_IVRS_TY=
PE_MEMORY_ONE:=0A         return parse_ivmd_device_select(ivmd_block,=0A   =
                                      base, limit, iw, ir);=0A =0A-    =
case AMD_IOMMU_ACPI_IVMD_RANGE_TYPE:=0A+    case ACPI_IVRS_TYPE_MEMORY_RANG=
E:=0A         return parse_ivmd_device_range(ivmd_block,=0A                =
                        base, limit, iw, ir);=0A =0A-    case AMD_IOMMU_ACP=
I_IVMD_IOMMU_TYPE:=0A+    case ACPI_IVRS_TYPE_MEMORY_IOMMU:=0A         =
return parse_ivmd_device_iommu(ivmd_block,=0A                              =
          base, limit, iw, ir);=0A =0A@@ -386,45 +407,44 @@ static u16 =
__init parse_ivhd_device_padd=0A }=0A =0A static u16 __init parse_ivhd_devi=
ce_select(=0A-    union acpi_ivhd_device *ivhd_device, struct amd_iommu =
*iommu)=0A+    const struct acpi_ivrs_device4 *select, struct amd_iommu =
*iommu)=0A {=0A     u16 bdf;=0A =0A-    bdf =3D ivhd_device->header.dev_id;=
=0A+    bdf =3D select->header.id;=0A     if ( bdf >=3D ivrs_bdf_entries =
)=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry =
Dev_Id 0x%x\n", bdf);=0A         return 0;=0A     }=0A =0A-    add_ivrs_map=
ping_entry(bdf, bdf, ivhd_device->header.flags, iommu);=0A+    add_ivrs_map=
ping_entry(bdf, bdf, select->header.data_setting, iommu);=0A =0A-    =
return sizeof(struct acpi_ivhd_device_header);=0A+    return sizeof(*select=
);=0A }=0A =0A static u16 __init parse_ivhd_device_range(=0A-    union =
acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivhd_device_range =
*range,=0A     u16 header_length, u16 block_length, struct amd_iommu =
*iommu)=0A {=0A     u16 dev_length, first_bdf, last_bdf, bdf;=0A =0A-    =
dev_length =3D sizeof(struct acpi_ivhd_device_range);=0A+    dev_length =
=3D sizeof(*range);=0A     if ( header_length < (block_length + dev_length)=
 )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry =
Length!\n");=0A         return 0;=0A     }=0A =0A-    if ( ivhd_device->ran=
ge.trailer.type !=3D=0A-         AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )=0A+   =
 if ( range->end.header.type !=3D ACPI_IVRS_TYPE_END )=0A     {=0A         =
AMD_IOMMU_DEBUG("IVHD Error: "=0A                         "Invalid Range: =
End_Type 0x%x\n",=0A-                        ivhd_device->range.trailer.typ=
e);=0A+                        range->end.header.type);=0A         return =
0;=0A     }=0A =0A-    first_bdf =3D ivhd_device->header.dev_id;=0A+    =
first_bdf =3D range->start.header.id;=0A     if ( first_bdf >=3D ivrs_bdf_e=
ntries )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: "=0A@@ -432,7 =
+452,7 @@ static u16 __init parse_ivhd_device_rang=0A         return 0;=0A =
    }=0A =0A-    last_bdf =3D ivhd_device->range.trailer.dev_id;=0A+    =
last_bdf =3D range->end.header.id;=0A     if ( (last_bdf >=3D ivrs_bdf_entr=
ies) || (last_bdf <=3D first_bdf) )=0A     {=0A         AMD_IOMMU_DEBUG("IV=
HD Error: "=0A@@ -443,32 +463,33 @@ static u16 __init parse_ivhd_device_ran=
g=0A     AMD_IOMMU_DEBUG(" Dev_Id Range: 0x%x -> 0x%x\n", first_bdf, =
last_bdf);=0A =0A     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ =
)=0A-        add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, =
iommu);=0A+        add_ivrs_mapping_entry(bdf, bdf, range->start.header.dat=
a_setting,=0A+                               iommu);=0A =0A     return =
dev_length;=0A }=0A =0A static u16 __init parse_ivhd_device_alias(=0A-    =
union acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivrs_device8a=
 *alias,=0A     u16 header_length, u16 block_length, struct amd_iommu =
*iommu)=0A {=0A     u16 dev_length, alias_id, bdf;=0A =0A-    dev_length =
=3D sizeof(struct acpi_ivhd_device_alias);=0A+    dev_length =3D sizeof(*al=
ias);=0A     if ( header_length < (block_length + dev_length) )=0A     =
{=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");=
=0A         return 0;=0A     }=0A =0A-    bdf =3D ivhd_device->header.dev_i=
d;=0A+    bdf =3D alias->header.id;=0A     if ( bdf >=3D ivrs_bdf_entries =
)=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry =
Dev_Id 0x%x\n", bdf);=0A         return 0;=0A     }=0A =0A-    alias_id =
=3D ivhd_device->alias.dev_id;=0A+    alias_id =3D alias->used_id;=0A     =
if ( alias_id >=3D ivrs_bdf_entries )=0A     {=0A         AMD_IOMMU_DEBUG("=
IVHD Error: Invalid Alias Dev_Id 0x%x\n", alias_id);=0A@@ -477,35 +498,34 =
@@ static u16 __init parse_ivhd_device_alia=0A =0A     AMD_IOMMU_DEBUG(" =
Dev_Id Alias: 0x%x\n", alias_id);=0A =0A-    add_ivrs_mapping_entry(bdf, =
alias_id, ivhd_device->header.flags, iommu);=0A+    add_ivrs_mapping_entry(=
bdf, alias_id, alias->header.data_setting, iommu);=0A =0A     return =
dev_length;=0A }=0A =0A static u16 __init parse_ivhd_device_alias_range(=0A=
-    union acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivhd_dev=
ice_alias_range *range,=0A     u16 header_length, u16 block_length, struct =
amd_iommu *iommu)=0A {=0A =0A     u16 dev_length, first_bdf, last_bdf, =
alias_id, bdf;=0A =0A-    dev_length =3D sizeof(struct acpi_ivhd_device_ali=
as_range);=0A+    dev_length =3D sizeof(*range);=0A     if ( header_length =
< (block_length + dev_length) )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD =
Error: Invalid Device_Entry Length!\n");=0A         return 0;=0A     }=0A =
=0A-    if ( ivhd_device->alias_range.trailer.type !=3D=0A-         =
AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )=0A+    if ( range->end.header.type =
!=3D ACPI_IVRS_TYPE_END )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: =
"=0A                         "Invalid Range: End_Type 0x%x\n",=0A-         =
               ivhd_device->alias_range.trailer.type);=0A+                 =
       range->end.header.type);=0A         return 0;=0A     }=0A =0A-    =
first_bdf =3D ivhd_device->header.dev_id;=0A+    first_bdf =3D range->alias=
.header.id;=0A     if ( first_bdf >=3D ivrs_bdf_entries )=0A     {=0A      =
   AMD_IOMMU_DEBUG("IVHD Error: "=0A@@ -513,7 +533,7 @@ static u16 __init =
parse_ivhd_device_alia=0A         return 0;=0A     }=0A =0A-    last_bdf =
=3D ivhd_device->alias_range.trailer.dev_id;=0A+    last_bdf =3D range->end=
.header.id;=0A     if ( last_bdf >=3D ivrs_bdf_entries || last_bdf <=3D =
first_bdf )=0A     {=0A         AMD_IOMMU_DEBUG(=0A@@ -521,7 +541,7 @@ =
static u16 __init parse_ivhd_device_alia=0A         return 0;=0A     }=0A =
=0A-    alias_id =3D ivhd_device->alias_range.alias.dev_id;=0A+    =
alias_id =3D range->alias.used_id;=0A     if ( alias_id >=3D ivrs_bdf_entri=
es )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Alias Dev_Id =
0x%x\n", alias_id);=0A@@ -532,59 +552,59 @@ static u16 __init parse_ivhd_de=
vice_alia=0A     AMD_IOMMU_DEBUG(" Dev_Id Alias: 0x%x\n", alias_id);=0A =
=0A     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ )=0A-        =
add_ivrs_mapping_entry(bdf, alias_id, ivhd_device->header.flags, iommu);=0A=
+        add_ivrs_mapping_entry(bdf, alias_id, range->alias.header.data_set=
ting,=0A+                               iommu);=0A =0A     return =
dev_length;=0A }=0A =0A static u16 __init parse_ivhd_device_extended(=0A-  =
  union acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivrs_device=
8b *ext,=0A     u16 header_length, u16 block_length, struct amd_iommu =
*iommu)=0A {=0A     u16 dev_length, bdf;=0A =0A-    dev_length =3D =
sizeof(struct acpi_ivhd_device_extended);=0A+    dev_length =3D sizeof(*ext=
);=0A     if ( header_length < (block_length + dev_length) )=0A     {=0A   =
      AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");=0A    =
     return 0;=0A     }=0A =0A-    bdf =3D ivhd_device->header.dev_id;=0A+ =
   bdf =3D ext->header.id;=0A     if ( bdf >=3D ivrs_bdf_entries )=0A     =
{=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id =
0x%x\n", bdf);=0A         return 0;=0A     }=0A =0A-    add_ivrs_mapping_en=
try(bdf, bdf, ivhd_device->header.flags, iommu);=0A+    add_ivrs_mapping_en=
try(bdf, bdf, ext->header.data_setting, iommu);=0A =0A     return =
dev_length;=0A }=0A =0A static u16 __init parse_ivhd_device_extended_range(=
=0A-    union acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivhd_=
device_extended_range *range,=0A     u16 header_length, u16 block_length, =
struct amd_iommu *iommu)=0A {=0A     u16 dev_length, first_bdf, last_bdf, =
bdf;=0A =0A-    dev_length =3D sizeof(struct acpi_ivhd_device_extended_rang=
e);=0A+    dev_length =3D sizeof(*range);=0A     if ( header_length < =
(block_length + dev_length) )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD =
Error: Invalid Device_Entry Length!\n");=0A         return 0;=0A     }=0A =
=0A-    if ( ivhd_device->extended_range.trailer.type !=3D=0A-         =
AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )=0A+    if ( range->end.header.type =
!=3D ACPI_IVRS_TYPE_END )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: =
"=0A                         "Invalid Range: End_Type 0x%x\n",=0A-         =
               ivhd_device->extended_range.trailer.type);=0A+              =
          range->end.header.type);=0A         return 0;=0A     }=0A =0A-   =
 first_bdf =3D ivhd_device->header.dev_id;=0A+    first_bdf =3D range->exte=
nded.header.id;=0A     if ( first_bdf >=3D ivrs_bdf_entries )=0A     {=0A  =
       AMD_IOMMU_DEBUG("IVHD Error: "=0A@@ -592,7 +612,7 @@ static u16 =
__init parse_ivhd_device_exte=0A         return 0;=0A     }=0A =0A-    =
last_bdf =3D ivhd_device->extended_range.trailer.dev_id;=0A+    last_bdf =
=3D range->end.header.id;=0A     if ( (last_bdf >=3D ivrs_bdf_entries) || =
(last_bdf <=3D first_bdf) )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD =
Error: "=0A@@ -604,116 +624,116 @@ static u16 __init parse_ivhd_device_exte=
=0A                     first_bdf, last_bdf);=0A =0A     for ( bdf =3D =
first_bdf; bdf <=3D last_bdf; bdf++ )=0A-        add_ivrs_mapping_entry(bdf=
, bdf, ivhd_device->header.flags, iommu);=0A+        add_ivrs_mapping_entry=
(bdf, bdf, range->extended.header.data_setting,=0A+                        =
       iommu);=0A =0A     return dev_length;=0A }=0A =0A static u16 __init =
parse_ivhd_device_special(=0A-    union acpi_ivhd_device *ivhd_device, u16 =
seg,=0A+    const struct acpi_ivrs_device8c *special, u16 seg,=0A     u16 =
header_length, u16 block_length, struct amd_iommu *iommu)=0A {=0A     u16 =
dev_length, bdf;=0A =0A-    dev_length =3D sizeof(struct acpi_ivhd_device_s=
pecial);=0A+    dev_length =3D sizeof(*special);=0A     if ( header_length =
< (block_length + dev_length) )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD =
Error: Invalid Device_Entry Length!\n");=0A         return 0;=0A     }=0A =
=0A-    bdf =3D ivhd_device->special.dev_id;=0A+    bdf =3D special->used_i=
d;=0A     if ( bdf >=3D ivrs_bdf_entries )=0A     {=0A         AMD_IOMMU_DE=
BUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", bdf);=0A         =
return 0;=0A     }=0A =0A-    add_ivrs_mapping_entry(bdf, bdf, ivhd_device-=
>header.flags, iommu);=0A+    add_ivrs_mapping_entry(bdf, bdf, special->hea=
der.data_setting, iommu);=0A     /* set device id of ioapic */=0A-    =
ioapic_sbdf[ivhd_device->special.handle].bdf =3D bdf;=0A-    ioapic_sbdf[iv=
hd_device->special.handle].seg =3D seg;=0A+    ioapic_sbdf[special->handle]=
.bdf =3D bdf;=0A+    ioapic_sbdf[special->handle].seg =3D seg;=0A     =
return dev_length;=0A }=0A =0A-static int __init parse_ivhd_block(struct =
acpi_ivhd_block_header *ivhd_block)=0A+static int __init parse_ivhd_block(c=
onst struct acpi_ivrs_hardware *ivhd_block)=0A {=0A-    union acpi_ivhd_dev=
ice *ivhd_device;=0A+    const union acpi_ivhd_device *ivhd_device;=0A     =
u16 block_length, dev_length;=0A     struct amd_iommu *iommu;=0A =0A-    =
if ( ivhd_block->header.length <=0A-         sizeof(struct acpi_ivhd_block_=
header) )=0A+    if ( ivhd_block->header.length < sizeof(*ivhd_block) )=0A =
    {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Block Length!\n");=0A=
         return -ENODEV;=0A     }=0A =0A-    iommu =3D find_iommu_from_bdf_=
cap(ivhd_block->header.dev_id,=0A-                                    =
ivhd_block->cap_offset);=0A+    iommu =3D find_iommu_from_bdf_cap(ivhd_bloc=
k->header.device_id,=0A+                                    ivhd_block->cap=
ability_offset);=0A     if ( !iommu )=0A     {=0A         AMD_IOMMU_DEBUG("=
IVHD Error: No IOMMU for Dev_Id 0x%x  Cap 0x%x\n",=0A-                     =
   ivhd_block->header.dev_id, ivhd_block->cap_offset);=0A+                 =
       ivhd_block->header.device_id,=0A+                        ivhd_block-=
>capability_offset);=0A         return -ENODEV;=0A     }=0A =0A     /* =
parse Device Entries */=0A-    block_length =3D sizeof(struct acpi_ivhd_blo=
ck_header);=0A+    block_length =3D sizeof(*ivhd_block);=0A     while ( =
ivhd_block->header.length >=3D=0A-            (block_length + sizeof(struct=
 acpi_ivhd_device_header)) )=0A+            (block_length + sizeof(struct =
acpi_ivrs_de_header)) )=0A     {=0A-        ivhd_device =3D (union =
acpi_ivhd_device *)=0A-            ((u8 *)ivhd_block + block_length);=0A+  =
      ivhd_device =3D (const void *)((const u8 *)ivhd_block + block_length)=
;=0A =0A         AMD_IOMMU_DEBUG( "IVHD Device Entry:\n");=0A         =
AMD_IOMMU_DEBUG( " Type 0x%x\n", ivhd_device->header.type);=0A-        =
AMD_IOMMU_DEBUG( " Dev_Id 0x%x\n", ivhd_device->header.dev_id);=0A-        =
AMD_IOMMU_DEBUG( " Flags 0x%x\n", ivhd_device->header.flags);=0A+        =
AMD_IOMMU_DEBUG( " Dev_Id 0x%x\n", ivhd_device->header.id);=0A+        =
AMD_IOMMU_DEBUG( " Flags 0x%x\n", ivhd_device->header.data_setting);=0A =
=0A         switch ( ivhd_device->header.type )=0A         {=0A-        =
case AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD:=0A+        case ACPI_IVRS_TYPE_PAD4:=
=0A             dev_length =3D parse_ivhd_device_padding(=0A               =
  sizeof(u32),=0A                 ivhd_block->header.length, block_length);=
=0A             break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD:=0A+=
        case ACPI_IVRS_TYPE_PAD8:=0A             dev_length =3D parse_ivhd_=
device_padding(=0A                 sizeof(u64),=0A                 =
ivhd_block->header.length, block_length);=0A             break;=0A-        =
case AMD_IOMMU_ACPI_IVHD_DEV_SELECT:=0A-            dev_length =3D =
parse_ivhd_device_select(ivhd_device, iommu);=0A+        case ACPI_IVRS_TYP=
E_SELECT:=0A+            dev_length =3D parse_ivhd_device_select(&ivhd_devi=
ce->select, iommu);=0A             break;=0A-        case AMD_IOMMU_ACPI_IV=
HD_DEV_RANGE_START:=0A+        case ACPI_IVRS_TYPE_START:=0A             =
dev_length =3D parse_ivhd_device_range(=0A-                ivhd_device,=0A+=
                &ivhd_device->range,=0A                 ivhd_block->header.=
length, block_length, iommu);=0A             break;=0A-        case =
AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT:=0A+        case ACPI_IVRS_TYPE_ALIAS_=
SELECT:=0A             dev_length =3D parse_ivhd_device_alias(=0A-         =
       ivhd_device,=0A+                &ivhd_device->alias,=0A             =
    ivhd_block->header.length, block_length, iommu);=0A             =
break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE:=0A+        =
case ACPI_IVRS_TYPE_ALIAS_START:=0A             dev_length =3D parse_ivhd_d=
evice_alias_range(=0A-                ivhd_device,=0A+                =
&ivhd_device->alias_range,=0A                 ivhd_block->header.length, =
block_length, iommu);=0A             break;=0A-        case AMD_IOMMU_ACPI_=
IVHD_DEV_EXT_SELECT:=0A+        case ACPI_IVRS_TYPE_EXT_SELECT:=0A         =
    dev_length =3D parse_ivhd_device_extended(=0A-                =
ivhd_device,=0A+                &ivhd_device->extended,=0A                 =
ivhd_block->header.length, block_length, iommu);=0A             break;=0A- =
       case AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE:=0A+        case ACPI_IVRS_TY=
PE_EXT_START:=0A             dev_length =3D parse_ivhd_device_extended_rang=
e(=0A-                ivhd_device,=0A+                &ivhd_device->extende=
d_range,=0A                 ivhd_block->header.length, block_length, =
iommu);=0A             break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_SPECI=
AL:=0A+        case ACPI_IVRS_TYPE_SPECIAL:=0A             dev_length =3D =
parse_ivhd_device_special(=0A-                ivhd_device, ivhd_block->pci_=
segment,=0A+                &ivhd_device->special, ivhd_block->pci_segment_=
group,=0A                 ivhd_block->header.length, block_length, =
iommu);=0A             break;=0A         default:=0A@@ -730,22 +750,24 @@ =
static int __init parse_ivhd_block(struc=0A     return 0;=0A }=0A =
=0A-static int __init parse_ivrs_block(struct acpi_ivrs_block_header =
*ivrs_block)=0A+static int __init parse_ivrs_block(const struct acpi_ivrs_h=
eader *ivrs_block)=0A {=0A-    struct acpi_ivhd_block_header *ivhd_block;=
=0A-    struct acpi_ivmd_block_header *ivmd_block;=0A+    const struct =
acpi_ivrs_hardware *ivhd_block;=0A+    const struct acpi_ivrs_memory =
*ivmd_block;=0A =0A     switch ( ivrs_block->type )=0A     {=0A-    case =
AMD_IOMMU_ACPI_IVHD_TYPE:=0A-        ivhd_block =3D (struct acpi_ivhd_block=
_header *)ivrs_block;=0A+    case ACPI_IVRS_TYPE_HARDWARE:=0A+        =
ivhd_block =3D container_of(ivrs_block, const struct acpi_ivrs_hardware,=0A=
+                                  header);=0A         return parse_ivhd_bl=
ock(ivhd_block);=0A =0A-    case AMD_IOMMU_ACPI_IVMD_ALL_TYPE:=0A-    case =
AMD_IOMMU_ACPI_IVMD_ONE_TYPE:=0A-    case AMD_IOMMU_ACPI_IVMD_RANGE_TYPE:=
=0A-    case AMD_IOMMU_ACPI_IVMD_IOMMU_TYPE:=0A-        ivmd_block =3D =
(struct acpi_ivmd_block_header *)ivrs_block;=0A+    case ACPI_IVRS_TYPE_MEM=
ORY_ALL:=0A+    case ACPI_IVRS_TYPE_MEMORY_ONE:=0A+    case ACPI_IVRS_TYPE_=
MEMORY_RANGE:=0A+    case ACPI_IVRS_TYPE_MEMORY_IOMMU:=0A+        =
ivmd_block =3D container_of(ivrs_block, const struct acpi_ivrs_memory,=0A+ =
                                 header);=0A         return parse_ivmd_bloc=
k(ivmd_block);=0A =0A     default:=0A@@ -792,12 +814,11 @@ static void =
__init dump_acpi_table_heade=0A =0A }=0A =0A-static int __init parse_ivrs_t=
able(struct acpi_table_header *_table)=0A+static int __init parse_ivrs_tabl=
e(struct acpi_table_header *table)=0A {=0A-    struct acpi_ivrs_block_heade=
r *ivrs_block;=0A+    const struct acpi_ivrs_header *ivrs_block;=0A     =
unsigned long length;=0A     int error =3D 0;=0A-    struct acpi_table_head=
er *table =3D (struct acpi_table_header *)_table;=0A =0A     BUG_ON(!table)=
;=0A =0A@@ -805,17 +826,16 @@ static int __init parse_ivrs_table(struc=0A  =
       dump_acpi_table_header(table);=0A =0A     /* parse IVRS blocks =
*/=0A-    length =3D sizeof(struct acpi_ivrs_table_header);=0A+    length =
=3D sizeof(struct acpi_table_ivrs);=0A     while ( (error =3D=3D 0) && =
(table->length > (length + sizeof(*ivrs_block))) )=0A     {=0A-        =
ivrs_block =3D (struct acpi_ivrs_block_header *)=0A-            ((u8 =
*)table + length);=0A+        ivrs_block =3D (struct acpi_ivrs_header =
*)((u8 *)table + length);=0A =0A         AMD_IOMMU_DEBUG("IVRS Block:\n");=
=0A         AMD_IOMMU_DEBUG(" Type 0x%x\n", ivrs_block->type);=0A         =
AMD_IOMMU_DEBUG(" Flags 0x%x\n", ivrs_block->flags);=0A         AMD_IOMMU_D=
EBUG(" Length 0x%x\n", ivrs_block->length);=0A-        AMD_IOMMU_DEBUG(" =
Dev_Id 0x%x\n", ivrs_block->dev_id);=0A+        AMD_IOMMU_DEBUG(" Dev_Id =
0x%x\n", ivrs_block->device_id);=0A =0A         if ( table->length < =
(length + ivrs_block->length) )=0A         {=0A@@ -833,12 +853,11 @@ =
static int __init parse_ivrs_table(struc=0A     return error;=0A }=0A =
=0A-static int __init detect_iommu_acpi(struct acpi_table_header =
*_table)=0A+static int __init detect_iommu_acpi(struct acpi_table_header =
*table)=0A {=0A-    struct acpi_ivrs_block_header *ivrs_block;=0A-    =
struct acpi_table_header *table =3D (struct acpi_table_header *)_table;=0A+=
    const struct acpi_ivrs_header *ivrs_block;=0A     unsigned long i;=0A- =
   unsigned long length =3D sizeof(struct acpi_ivrs_table_header);=0A+    =
unsigned long length =3D sizeof(struct acpi_table_ivrs);=0A     u8 =
checksum, *raw_table;=0A =0A     /* validate checksum: sum of entire table =
=3D=3D 0 */=0A@@ -854,12 +873,14 @@ static int __init detect_iommu_acpi(str=
u=0A =0A     while ( table->length > (length + sizeof(*ivrs_block)) )=0A   =
  {=0A-        ivrs_block =3D (struct acpi_ivrs_block_header *) ((u8 =
*)table + length);=0A+        ivrs_block =3D (struct acpi_ivrs_header =
*)((u8 *)table + length);=0A         if ( table->length < (length + =
ivrs_block->length) )=0A             return -ENODEV;=0A-        if ( =
ivrs_block->type =3D=3D AMD_IOMMU_ACPI_IVHD_TYPE )=0A-            if ( =
amd_iommu_detect_one_acpi((void*)ivrs_block) !=3D 0 )=0A-                =
return -ENODEV;=0A+        if ( ivrs_block->type =3D=3D ACPI_IVRS_TYPE_HARD=
WARE &&=0A+             amd_iommu_detect_one_acpi(=0A+                 =
container_of(ivrs_block, const struct acpi_ivrs_hardware,=0A+              =
                header)) !=3D 0 )=0A+            return -ENODEV;=0A        =
 length +=3D ivrs_block->length;=0A     }=0A     return 0;=0A@@ -870,63 =
+891,59 @@ static int __init detect_iommu_acpi(stru=0A        last_bdf =3D =
(x); \=0A    } while(0);=0A =0A-static int __init get_last_bdf_ivhd(void =
*ivhd)=0A+static int __init get_last_bdf_ivhd(=0A+    const struct =
acpi_ivrs_hardware *ivhd_block)=0A {=0A-    union acpi_ivhd_device =
*ivhd_device;=0A+    const union acpi_ivhd_device *ivhd_device;=0A     u16 =
block_length, dev_length;=0A-    struct acpi_ivhd_block_header *ivhd_block;=
=0A-=0A-    ivhd_block =3D (struct acpi_ivhd_block_header *)ivhd;=0A =0A-  =
  if ( ivhd_block->header.length <=0A-         sizeof(struct acpi_ivhd_bloc=
k_header) )=0A+    if ( ivhd_block->header.length < sizeof(*ivhd_block) =
)=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Block Length!\n"=
);=0A         return -ENODEV;=0A     }=0A =0A-    block_length =3D =
sizeof(struct acpi_ivhd_block_header);=0A+    block_length =3D sizeof(*ivhd=
_block);=0A     while ( ivhd_block->header.length >=3D=0A-            =
(block_length + sizeof(struct acpi_ivhd_device_header)) )=0A+            =
(block_length + sizeof(struct acpi_ivrs_de_header)) )=0A     {=0A-        =
ivhd_device =3D (union acpi_ivhd_device *)=0A-            ((u8 *)ivhd_block=
 + block_length);=0A+        ivhd_device =3D (const void *)((u8 *)ivhd_bloc=
k + block_length);=0A =0A         switch ( ivhd_device->header.type )=0A   =
      {=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD:=0A+        case =
ACPI_IVRS_TYPE_PAD4:=0A             dev_length =3D sizeof(u32);=0A         =
    break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD:=0A+        =
case ACPI_IVRS_TYPE_PAD8:=0A             dev_length =3D sizeof(u64);=0A    =
         break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_SELECT:=0A-        =
    UPDATE_LAST_BDF(ivhd_device->header.dev_id);=0A-            dev_length =
=3D sizeof(struct acpi_ivhd_device_header);=0A-            break;=0A-      =
  case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT:=0A-            UPDATE_LAST_BDF=
(ivhd_device->header.dev_id);=0A-            dev_length =3D sizeof(struct =
acpi_ivhd_device_alias);=0A-            break;=0A-        case AMD_IOMMU_AC=
PI_IVHD_DEV_EXT_SELECT:=0A-            UPDATE_LAST_BDF(ivhd_device->header.=
dev_id);=0A-            dev_length =3D sizeof(struct acpi_ivhd_device_exten=
ded);=0A-            break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_RANGE_S=
TART:=0A-            UPDATE_LAST_BDF(ivhd_device->range.trailer.dev_id);=0A=
-            dev_length =3D sizeof(struct acpi_ivhd_device_range);=0A-     =
       break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE:=0A-     =
       UPDATE_LAST_BDF(ivhd_device->alias_range.trailer.dev_id)=0A-        =
    dev_length =3D sizeof(struct acpi_ivhd_device_alias_range);=0A-        =
    break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE:=0A-          =
  UPDATE_LAST_BDF(ivhd_device->extended_range.trailer.dev_id)=0A-          =
  dev_length =3D sizeof(struct acpi_ivhd_device_extended_range);=0A-       =
     break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL:=0A-           =
 UPDATE_LAST_BDF(ivhd_device->special.dev_id)=0A-            dev_length =
=3D sizeof(struct acpi_ivhd_device_special);=0A+        case ACPI_IVRS_TYPE=
_SELECT:=0A+            UPDATE_LAST_BDF(ivhd_device->select.header.id);=0A+=
            dev_length =3D sizeof(ivhd_device->header);=0A+            =
break;=0A+        case ACPI_IVRS_TYPE_ALIAS_SELECT:=0A+            =
UPDATE_LAST_BDF(ivhd_device->alias.header.id);=0A+            dev_length =
=3D sizeof(ivhd_device->alias);=0A+            break;=0A+        case =
ACPI_IVRS_TYPE_EXT_SELECT:=0A+            UPDATE_LAST_BDF(ivhd_device->exte=
nded.header.id);=0A+            dev_length =3D sizeof(ivhd_device->extended=
);=0A+            break;=0A+        case ACPI_IVRS_TYPE_START:=0A+         =
   UPDATE_LAST_BDF(ivhd_device->range.end.header.id);=0A+            =
dev_length =3D sizeof(ivhd_device->range);=0A+            break;=0A+       =
 case ACPI_IVRS_TYPE_ALIAS_START:=0A+            UPDATE_LAST_BDF(ivhd_devic=
e->alias_range.end.header.id)=0A+            dev_length =3D sizeof(ivhd_dev=
ice->alias_range);=0A+            break;=0A+        case ACPI_IVRS_TYPE_EXT=
_START:=0A+            UPDATE_LAST_BDF(ivhd_device->extended_range.end.head=
er.id)=0A+            dev_length =3D sizeof(ivhd_device->extended_range);=
=0A+            break;=0A+        case ACPI_IVRS_TYPE_SPECIAL:=0A+         =
   UPDATE_LAST_BDF(ivhd_device->special.used_id)=0A+            dev_length =
=3D sizeof(ivhd_device->special);=0A             break;=0A         =
default:=0A             AMD_IOMMU_DEBUG("IVHD Error: Invalid Device =
Type!\n");=0A@@ -942,20 +959,21 @@ static int __init get_last_bdf_ivhd(void=
=0A     return 0;=0A }=0A =0A-static int __init get_last_bdf_acpi(struct =
acpi_table_header *_table)=0A+static int __init get_last_bdf_acpi(struct =
acpi_table_header *table)=0A {=0A-    struct acpi_ivrs_block_header =
*ivrs_block;=0A-    struct acpi_table_header *table =3D (struct acpi_table_=
header *)_table;=0A-    unsigned long length =3D sizeof(struct acpi_ivrs_ta=
ble_header);=0A+    const struct acpi_ivrs_header *ivrs_block;=0A+    =
unsigned long length =3D sizeof(struct acpi_table_ivrs);=0A =0A     while =
( table->length > (length + sizeof(*ivrs_block)) )=0A     {=0A-        =
ivrs_block =3D (struct acpi_ivrs_block_header *) ((u8 *)table + length);=0A=
+        ivrs_block =3D (struct acpi_ivrs_header *)((u8 *)table + =
length);=0A         if ( table->length < (length + ivrs_block->length) =
)=0A             return -ENODEV;=0A-        if ( ivrs_block->type =3D=3D =
AMD_IOMMU_ACPI_IVHD_TYPE )=0A-            if ( get_last_bdf_ivhd((void*)ivr=
s_block) !=3D 0 )=0A-                return -ENODEV;=0A+        if ( =
ivrs_block->type =3D=3D ACPI_IVRS_TYPE_HARDWARE &&=0A+             =
get_last_bdf_ivhd(=0A+                 container_of(ivrs_block, const =
struct acpi_ivrs_hardware,=0A+                              header)) !=3D =
0 )=0A+            return -ENODEV;=0A         length +=3D ivrs_block->lengt=
h;=0A     }=0A    return 0;=0A@@ -963,16 +981,16 @@ static int __init =
get_last_bdf_acpi(stru=0A =0A int __init amd_iommu_detect_acpi(void)=0A =
{=0A-    return acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, detect_iommu_acpi=
);=0A+    return acpi_table_parse(ACPI_SIG_IVRS, detect_iommu_acpi);=0A =
}=0A =0A int __init amd_iommu_get_ivrs_dev_entries(void)=0A {=0A-    =
acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, get_last_bdf_acpi);=0A+    =
acpi_table_parse(ACPI_SIG_IVRS, get_last_bdf_acpi);=0A     return last_bdf =
+ 1;=0A }=0A =0A int __init amd_iommu_update_ivrs_mapping_acpi(void)=0A =
{=0A-    return acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, parse_ivrs_table)=
;=0A+    return acpi_table_parse(ACPI_SIG_IVRS, parse_ivrs_table);=0A =
}=0A--- a/xen/drivers/passthrough/amd/iommu_detect.c=0A+++ b/xen/drivers/pa=
ssthrough/amd/iommu_detect.c=0A@@ -20,12 +20,12 @@=0A =0A #include =
<xen/config.h>=0A #include <xen/errno.h>=0A+#include <xen/acpi.h>=0A =
#include <xen/iommu.h>=0A #include <xen/pci.h>=0A #include <xen/pci_regs.h>=
=0A #include <asm/amd-iommu.h>=0A #include <asm/hvm/svm/amd-iommu-proto.h>=
=0A-#include <asm/hvm/svm/amd-iommu-acpi.h>=0A =0A static int __init =
get_iommu_msi_capabilities(=0A     u16 seg, u8 bus, u8 dev, u8 func, =
struct amd_iommu *iommu)=0A@@ -103,23 +103,21 @@ void __init get_iommu_feat=
ures(struct am=0A     }=0A }=0A =0A-int __init amd_iommu_detect_one_acpi(vo=
id *ivhd)=0A+int __init amd_iommu_detect_one_acpi(=0A+    const struct =
acpi_ivrs_hardware *ivhd_block)=0A {=0A     struct amd_iommu *iommu;=0A    =
 u8 bus, dev, func;=0A-    struct acpi_ivhd_block_header *ivhd_block;=0A   =
  int rt =3D 0;=0A =0A-    ivhd_block =3D (struct acpi_ivhd_block_header =
*)ivhd;=0A-=0A-    if ( ivhd_block->header.length < sizeof(struct =
acpi_ivhd_block_header) )=0A+    if ( ivhd_block->header.length < =
sizeof(*ivhd_block) )=0A     {=0A         AMD_IOMMU_DEBUG("Invalid IVHD =
Block Length!\n");=0A         return -ENODEV;=0A     }=0A =0A-    if ( =
!ivhd_block->header.dev_id ||=0A-        !ivhd_block->cap_offset || =
!ivhd_block->mmio_base)=0A+    if ( !ivhd_block->header.device_id ||=0A+   =
     !ivhd_block->capability_offset || !ivhd_block->base_address)=0A     =
{=0A         AMD_IOMMU_DEBUG("Invalid IVHD Block!\n");=0A         return =
-ENODEV;=0A@@ -134,10 +132,10 @@ int __init amd_iommu_detect_one_acpi(voi=
=0A =0A     spin_lock_init(&iommu->lock);=0A =0A-    iommu->seg =3D =
ivhd_block->pci_segment;=0A-    iommu->bdf =3D ivhd_block->header.dev_id;=
=0A-    iommu->cap_offset =3D ivhd_block->cap_offset;=0A-    iommu->mmio_ba=
se_phys =3D ivhd_block->mmio_base;=0A+    iommu->seg =3D ivhd_block->pci_se=
gment_group;=0A+    iommu->bdf =3D ivhd_block->header.device_id;=0A+    =
iommu->cap_offset =3D ivhd_block->capability_offset;=0A+    iommu->mmio_bas=
e_phys =3D ivhd_block->base_address;=0A =0A     /* override IOMMU HT flags =
*/=0A     iommu->ht_flags =3D ivhd_block->header.flags;=0A--- a/xen/drivers=
/passthrough/amd/iommu_init.c=0A+++ b/xen/drivers/passthrough/amd/iommu_ini=
t.c=0A@@ -20,6 +20,7 @@=0A =0A #include <xen/config.h>=0A #include =
<xen/errno.h>=0A+#include <xen/acpi.h>=0A #include <xen/pci.h>=0A #include =
<xen/pci_regs.h>=0A #include <xen/irq.h>=0A@@ -28,7 +29,6 @@=0A #include =
<asm/hvm/svm/amd-iommu-proto.h>=0A #include <asm-x86/fixmap.h>=0A #include =
<mach_apic.h>=0A-#include <asm/hvm/svm/amd-iommu-acpi.h>=0A =0A static int =
__initdata nr_amd_iommus;=0A =0A@@ -37,9 +37,8 @@ static struct radix_tree_=
root ivrs_maps;=0A struct list_head amd_iommu_head;=0A struct table_struct =
device_table;=0A =0A-static int iommu_has_ht_flag(struct amd_iommu *iommu, =
uint8_t bit)=0A+static int iommu_has_ht_flag(struct amd_iommu *iommu, u8 =
mask)=0A {=0A-    u8 mask =3D 1U << bit;=0A     return iommu->ht_flags & =
mask;=0A }=0A =0A@@ -80,19 +79,19 @@ static void set_iommu_ht_flags(struct =
am=0A =0A     /* Setup HT flags */=0A     if ( iommu_has_cap(iommu, =
PCI_CAP_HT_TUNNEL_SHIFT) )=0A-        iommu_has_ht_flag(iommu, AMD_IOMMU_AC=
PI_HT_TUN_ENB_SHIFT) ?=0A+        iommu_has_ht_flag(iommu, ACPI_IVHD_TT_ENA=
BLE) ?=0A             iommu_set_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLA=
TION_SHIFT) :=0A             iommu_clear_bit(&entry, IOMMU_CONTROL_HT_TUNNE=
L_TRANSLATION_SHIFT);=0A =0A-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_RE=
S_PASS_PW_SHIFT) ?=0A+    iommu_has_ht_flag(iommu, ACPI_IVHD_RES_PASS_PW) =
?=0A         iommu_set_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHI=
FT):=0A         iommu_clear_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRIT=
E_SHIFT);=0A =0A-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_ISOC_SHIFT) =
?=0A+    iommu_has_ht_flag(iommu, ACPI_IVHD_ISOC) ?=0A         iommu_set_bi=
t(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT):=0A         iommu_clear_bit(&ent=
ry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT);=0A =0A-    iommu_has_ht_flag(iommu, =
AMD_IOMMU_ACPI_PASS_PW_SHIFT) ?=0A+    iommu_has_ht_flag(iommu, ACPI_IVHD_P=
ASS_PW) ?=0A         iommu_set_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_=
SHIFT):=0A         iommu_clear_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_=
SHIFT);=0A =0A--- a/xen/drivers/passthrough/amd/iommu_map.c=0A+++ =
b/xen/drivers/passthrough/amd/iommu_map.c=0A@@ -18,12 +18,13 @@=0A  * =
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 =
USA=0A  */=0A =0A+#include <xen/config.h>=0A+#include <xen/acpi.h>=0A =
#include <xen/sched.h>=0A #include <asm/p2m.h>=0A #include <xen/hvm/iommu.h=
>=0A #include <asm/amd-iommu.h>=0A #include <asm/hvm/svm/amd-iommu-proto.h>=
=0A-#include <asm/hvm/svm/amd-iommu-acpi.h>=0A #include "../ats.h"=0A =
#include <xen/pci.h>=0A =0A@@ -215,8 +216,7 @@ void __init iommu_dte_add_de=
vice_entry(u=0A     dte[7] =3D dte[6] =3D dte[4] =3D dte[2] =3D dte[1] =3D =
dte[0] =3D 0;=0A =0A     flags =3D ivrs_dev->device_flags;=0A-    sys_mgt =
=3D get_field_from_byte(flags, AMD_IOMMU_ACPI_SYS_MGT_MASK,=0A-            =
                      AMD_IOMMU_ACPI_SYS_MGT_SHIFT);=0A+    sys_mgt =3D =
get_field_from_byte(flags, ACPI_IVHD_SYSTEM_MGMT);=0A     dev_ex =3D =
ivrs_dev->dte_allow_exclusion;=0A =0A     flags &=3D mask;=0A--- a/xen/incl=
ude/asm-x86/hvm/svm/amd-iommu-acpi.h=0A+++ /dev/null=0A@@ -1,185 +0,0 =
@@=0A-/*=0A- * Copyright (C) 2007 Advanced Micro Devices, Inc.=0A- * =
Author: Leo Duran <leo.duran@amd.com>=0A- * Author: Wei Wang <wei.wang2@amd=
.com> - adapted to xen=0A- *=0A- * This program is free software; you can =
redistribute it and/or modify=0A- * it under the terms of the GNU General =
Public License as published by=0A- * the Free Software Foundation; either =
version 2 of the License, or=0A- * (at your option) any later version.=0A- =
*=0A- * This program is distributed in the hope that it will be useful,=0A-=
 * but WITHOUT ANY WARRANTY; without even the implied warranty of=0A- * =
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the=0A- * GNU =
General Public License for more details.=0A- *=0A- * You should have =
received a copy of the GNU General Public License=0A- * along with this =
program; if not, write to the Free Software=0A- * Foundation, Inc., 59 =
Temple Place, Suite 330, Boston, MA  02111-1307 USA=0A- */=0A-=0A-#ifndef =
_ASM_X86_64_AMD_IOMMU_ACPI_H=0A-#define _ASM_X86_64_AMD_IOMMU_ACPI_H=0A-=0A=
-#include <xen/acpi.h>=0A-=0A-/* I/O Virtualization Reporting Structure =
*/=0A-#define AMD_IOMMU_ACPI_IVRS_SIG            "IVRS"=0A-#define =
AMD_IOMMU_ACPI_IVHD_TYPE       0x10=0A-#define AMD_IOMMU_ACPI_IVMD_ALL_TYPE=
       0x20=0A-#define AMD_IOMMU_ACPI_IVMD_ONE_TYPE       0x21=0A-#define =
AMD_IOMMU_ACPI_IVMD_RANGE_TYPE     0x22=0A-#define AMD_IOMMU_ACPI_IVMD_IOMM=
U_TYPE     0x23=0A-=0A-/* 4-byte Device Entries */=0A-#define AMD_IOMMU_ACP=
I_IVHD_DEV_U32_PAD        0=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_SELECT     =
2=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_RANGE_START    3=0A-#define AMD_IOMMU_=
ACPI_IVHD_DEV_RANGE_END  4=0A-=0A-/* 8-byte Device Entries */=0A-#define =
AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD        64=0A-#define AMD_IOMMU_ACPI_IVHD_DE=
V_ALIAS_SELECT   66=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE    =
67=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_EXT_SELECT 70=0A-#define AMD_IOMMU_AC=
PI_IVHD_DEV_EXT_RANGE  71=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL    =
72=0A-=0A-/* IVHD IOMMU Flags */=0A-#define AMD_IOMMU_ACPI_COHERENT_MASK   =
    0x20=0A-#define AMD_IOMMU_ACPI_COHERENT_SHIFT      5=0A-#define =
AMD_IOMMU_ACPI_IOTLB_SUP_MASK      0x10=0A-#define AMD_IOMMU_ACPI_IOTLB_SUP=
_SHIFT     4=0A-#define AMD_IOMMU_ACPI_ISOC_MASK       0x08=0A-#define =
AMD_IOMMU_ACPI_ISOC_SHIFT      3=0A-#define AMD_IOMMU_ACPI_RES_PASS_PW_MASK=
        0x04=0A-#define AMD_IOMMU_ACPI_RES_PASS_PW_SHIFT   2=0A-#define =
AMD_IOMMU_ACPI_PASS_PW_MASK        0x02=0A-#define AMD_IOMMU_ACPI_PASS_PW_S=
HIFT       1=0A-#define AMD_IOMMU_ACPI_HT_TUN_ENB_MASK     0x01=0A-#define =
AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT        0=0A-=0A-/* IVHD Device Flags =
*/=0A-#define AMD_IOMMU_ACPI_LINT1_PASS_MASK     0x80=0A-#define AMD_IOMMU_=
ACPI_LINT1_PASS_SHIFT        7=0A-#define AMD_IOMMU_ACPI_LINT0_PASS_MASK   =
  0x40=0A-#define AMD_IOMMU_ACPI_LINT0_PASS_SHIFT        6=0A-#define =
AMD_IOMMU_ACPI_SYS_MGT_MASK        0x30=0A-#define AMD_IOMMU_ACPI_SYS_MGT_S=
HIFT       4=0A-#define AMD_IOMMU_ACPI_NMI_PASS_MASK       0x04=0A-#define =
AMD_IOMMU_ACPI_NMI_PASS_SHIFT      2=0A-#define AMD_IOMMU_ACPI_EINT_PASS_MA=
SK      0x02=0A-#define AMD_IOMMU_ACPI_EINT_PASS_SHIFT     1=0A-#define =
AMD_IOMMU_ACPI_INIT_PASS_MASK      0x01=0A-#define AMD_IOMMU_ACPI_INIT_PASS=
_SHIFT     0=0A-=0A-/* IVHD Device Extended Flags */=0A-#define AMD_IOMMU_A=
CPI_ATS_DISABLED_MASK   0x80000000=0A-#define AMD_IOMMU_ACPI_ATS_DISABLED_S=
HIFT  31=0A-=0A-/* IVMD Device Flags */=0A-#define AMD_IOMMU_ACPI_EXCLUSION=
_RANGE_MASK    0x08=0A-#define AMD_IOMMU_ACPI_EXCLUSION_RANGE_SHIFT   =
3=0A-#define AMD_IOMMU_ACPI_IW_PERMISSION_MASK  0x04=0A-#define AMD_IOMMU_A=
CPI_IW_PERMISSION_SHIFT 2=0A-#define AMD_IOMMU_ACPI_IR_PERMISSION_MASK  =
0x02=0A-#define AMD_IOMMU_ACPI_IR_PERMISSION_SHIFT 1=0A-#define AMD_IOMMU_A=
CPI_UNITY_MAPPING_MASK  0x01=0A-#define AMD_IOMMU_ACPI_UNITY_MAPPING_SHIFT =
0=0A-=0A-#define ACPI_OEM_ID_SIZE                6=0A-#define ACPI_OEM_TABL=
E_ID_SIZE          8=0A-=0A-#pragma pack(1)=0A-struct acpi_ivrs_table_heade=
r {=0A-   struct acpi_table_header acpi_header;=0A-   u32 io_info;=0A-   =
u8  reserved[8];=0A-};=0A-=0A-struct acpi_ivrs_block_header {=0A-   u8  =
type;=0A-   u8  flags;=0A-   u16 length;=0A-   u16 dev_id;=0A-};=0A-=0A-str=
uct acpi_ivhd_block_header {=0A-   struct acpi_ivrs_block_header header;=0A=
-   u16 cap_offset;=0A-   u64 mmio_base;=0A-   u16 pci_segment;=0A-   u16 =
iommu_info;=0A-   u8 reserved[4];=0A-};=0A-=0A-struct acpi_ivhd_device_head=
er {=0A-   u8  type;=0A-   u16 dev_id;=0A-   u8  flags;=0A-};=0A-=0A-struct=
 acpi_ivhd_device_trailer {=0A-   u8  type;=0A-   u16 dev_id;=0A-   u8  =
reserved;=0A-};=0A-=0A-struct acpi_ivhd_device_range {=0A-   struct =
acpi_ivhd_device_header header;=0A-   struct acpi_ivhd_device_trailer =
trailer;=0A-};=0A-=0A-struct acpi_ivhd_device_alias {=0A-   struct =
acpi_ivhd_device_header header;=0A-   u8  reserved1;=0A-   u16 dev_id;=0A- =
  u8  reserved2;=0A-};=0A-=0A-struct acpi_ivhd_device_alias_range {=0A-   =
struct acpi_ivhd_device_alias alias;=0A-   struct acpi_ivhd_device_trailer =
trailer;=0A-};=0A-=0A-struct acpi_ivhd_device_extended {=0A-   struct =
acpi_ivhd_device_header header;=0A-   u32 ext_flags;=0A-};=0A-=0A-struct =
acpi_ivhd_device_extended_range {=0A-   struct acpi_ivhd_device_extended =
extended;=0A-   struct acpi_ivhd_device_trailer trailer;=0A-};=0A-=0A-struc=
t acpi_ivhd_device_special {=0A-   struct acpi_ivhd_device_header =
header;=0A-   u8  handle;=0A-   u16 dev_id;=0A-   u8  variety;=0A-};=0A-=0A=
-union acpi_ivhd_device {=0A-   struct acpi_ivhd_device_header header;=0A- =
  struct acpi_ivhd_device_range range;=0A-   struct acpi_ivhd_device_alias =
alias;=0A-   struct acpi_ivhd_device_alias_range alias_range;=0A-   struct =
acpi_ivhd_device_extended extended;=0A-   struct acpi_ivhd_device_extended_=
range extended_range;=0A-   struct acpi_ivhd_device_special special;=0A-};=
=0A-=0A-struct acpi_ivmd_block_header {=0A-   struct acpi_ivrs_block_header=
 header;=0A-   union {=0A-       u16 last_dev_id;=0A-       u16 cap_offset;=
=0A-       u16 reserved1;=0A-   };=0A-   u64 reserved2;=0A-   u64 =
start_addr;=0A-   u64 mem_length;=0A-};=0A-#pragma pack()=0A-=0A-#endif /* =
_ASM_X86_64_AMD_IOMMU_ACPI_H */=0A--- a/xen/include/asm-x86/hvm/svm/amd-iom=
mu-proto.h=0A+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h=0A@@ =
-26,6 +26,8 @@=0A #include <asm/apicdef.h>=0A #include <xen/domain_page.h>=
=0A =0A+struct acpi_ivrs_hardware;=0A+=0A #define for_each_amd_iommu(amd_io=
mmu) \=0A     list_for_each_entry(amd_iommu, \=0A         &amd_iommu_head, =
list)=0A@@ -41,7 +43,7 @@=0A =0A /* amd-iommu-detect functions */=0A int =
amd_iommu_get_ivrs_dev_entries(void);=0A-int amd_iommu_detect_one_acpi(void=
 *ivhd);=0A+int amd_iommu_detect_one_acpi(const struct acpi_ivrs_hardware =
*);=0A int amd_iommu_detect_acpi(void);=0A void get_iommu_features(struct =
amd_iommu *iommu);=0A =0A@@ -121,11 +123,9 @@ static inline u32 set_field_i=
n_reg_u32(u=0A     return reg_value;=0A }=0A =0A-static inline u8 =
get_field_from_byte(u8 value, u8 mask, u8 shift)=0A+static inline u8 =
get_field_from_byte(u8 value, u8 mask)=0A {=0A-    u8 field;=0A-    field =
=3D (value & mask) >> shift;=0A-    return field;=0A+    return (value & =
mask) / (mask & -mask);=0A }=0A =0A static inline unsigned long region_to_p=
ages(unsigned long addr, unsigned long size)=0A
--=__PartA9860C5A.1__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__PartA9860C5A.1__=--


From xen-changelog-bounces@lists.xensource.com Tue Dec 13 09:33:29 2011
Return-path: <xen-changelog-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Tue, 13 Dec 2011 09:33:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-changelog-bounces@lists.xensource.com>)
	id 1RaOjp-0003OB-Nf; Tue, 13 Dec 2011 09:33:29 +0000
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1RaOjn-0003Bp-Ev
	for xen-changelog@lists.xensource.com; Tue, 13 Dec 2011 09:33:28 +0000
X-Env-Sender: xen@xenbits.xen.org
X-Msg-Ref: server-9.tower-27.messagelabs.com!1323768713!56443421!1
X-Originating-IP: [50.57.168.107]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14156 invoked from network); 13 Dec 2011 09:31:55 -0000
Received: from mail.xen.org (HELO mail.xen.org) (50.57.168.107)
	by server-9.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	13 Dec 2011 09:31:55 -0000
Received: from xenbits.xen.org ([50.57.170.242])
	by mail.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1RaOpt-0004pK-5P
	for xen-changelog@lists.xensource.com; Tue, 13 Dec 2011 09:39:45 +0000
Received: from xen by xenbits.xen.org with local (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1RaOja-0002R3-QY
	for xen-changelog@lists.xensource.com; Tue, 13 Dec 2011 09:33:14 +0000
Message-Id: <E1RaOja-0002R3-QY@xenbits.xen.org>
Date: Tue, 13 Dec 2011 09:33:14 +0000
From: Xen patchbot-unstable <patchbot@xen.org>
To: xen-changelog@lists.xensource.com
Subject: [Xen-changelog] [xen-unstable] libxl: Use GC_INIT and GC_FREE
	everywhere
X-BeenThere: xen-changelog@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: xen-devel@lists.xensource.com
List-Id: BK change log <xen-changelog.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-changelog>, 
	<mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-changelog@lists.xensource.com>
List-Help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>,
	<mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-changelog-bounces@lists.xensource.com
Errors-To: xen-changelog-bounces@lists.xensource.com

# HG changeset patch
# User Ian Jackson <ian.jackson@eu.citrix.com>
# Date 1323712122 0
# Node ID 7e90178b8bbfd2f78e8f4c6d593a2fb233350f41
# Parent  b5d6ed400122d008dc807300eaf705a3ec6bbd67
libxl: Use GC_INIT and GC_FREE everywhere

Replace
    libxl__gc gc = LIBXL_INIT_GC(ctx);
    ...
    libxl__free_all(&gc);
with
    GC_INIT(ctx);
    ...
    GC_FREE;
throughout with a couple of perl runes.

We must then adjust uses of the resulting gc for pointerness, which is
mostly just replacing all occurrences of "&gc" with "gc".  Also a
couple of unusual uses of LIBXL_INIT_GC needed to be fixed up by hand.

Here are those runes:
 perl -i -pe 's/\Q    libxl__gc gc = LIBXL_INIT_GC(ctx);/    GC_INIT(ctx);/' tools/libxl/*.c
 perl -i -pe 's/\Q    libxl__free_all(&gc);/    GC_FREE;/' tools/libxl/*.c

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
---


diff -r b5d6ed400122 -r 7e90178b8bbf tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Mon Dec 12 17:48:42 2011 +0000
+++ b/tools/libxl/libxl.c	Mon Dec 12 17:48:42 2011 +0000
@@ -233,19 +233,19 @@
 int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid,
                         const char *old_name, const char *new_name)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = libxl__domain_rename(&gc, domid, old_name, new_name, XBT_NULL);
-    libxl__free_all(&gc);
+    rc = libxl__domain_rename(gc, domid, old_name, new_name, XBT_NULL);
+    GC_FREE;
     return rc;
 }
 
 int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = 0;
 
-    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
+    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
         LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Called domain_resume on "
                 "non-cooperative hvm domain %u", domid);
         rc = ERROR_NI;
@@ -265,7 +265,7 @@
         rc = ERROR_FAIL;
     }
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -278,7 +278,7 @@
 int libxl_domain_preserve(libxl_ctx *ctx, uint32_t domid,
                           libxl_domain_create_info *info, const char *name_suffix, libxl_uuid new_uuid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     struct xs_permissions roperm[2];
     xs_transaction_t t;
     char *preserved_name;
@@ -288,27 +288,27 @@
 
     int rc;
 
-    preserved_name = libxl__sprintf(&gc, "%s%s", info->name, name_suffix);
+    preserved_name = libxl__sprintf(gc, "%s%s", info->name, name_suffix);
     if (!preserved_name) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
-    uuid_string = libxl__uuid2string(&gc, new_uuid);
+    uuid_string = libxl__uuid2string(gc, new_uuid);
     if (!uuid_string) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
-    vm_path = libxl__sprintf(&gc, "/vm/%s", uuid_string);
+    vm_path = libxl__sprintf(gc, "/vm/%s", uuid_string);
     if (!vm_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
@@ -324,20 +324,20 @@
     xs_mkdir(ctx->xsh, t, vm_path);
     xs_set_permissions(ctx->xsh, t, vm_path, roperm, ARRAY_SIZE(roperm));
 
-    xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
-    rc = libxl__domain_rename(&gc, domid, info->name, preserved_name, t);
+    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
+    rc = libxl__domain_rename(gc, domid, info->name, preserved_name, t);
     if (rc) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return rc;
     }
 
-    xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
+    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
 
     if (!xs_transaction_end(ctx->xsh, t, 0))
         if (errno == EAGAIN)
             goto retry_transaction;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -480,16 +480,16 @@
 int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info,
                          uint32_t domid, int fd)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    libxl_domain_type type = libxl__domain_type(&gc, domid);
+    GC_INIT(ctx);
+    libxl_domain_type type = libxl__domain_type(gc, domid);
     int live = info != NULL && info->flags & XL_SUSPEND_LIVE;
     int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG;
     int rc = 0;
 
-    rc = libxl__domain_suspend_common(&gc, domid, fd, type, live, debug);
+    rc = libxl__domain_suspend_common(gc, domid, fd, type, live, debug);
     if (!rc && type == LIBXL_DOMAIN_TYPE_HVM)
-        rc = libxl__domain_save_device_model(&gc, domid, fd);
-    libxl__free_all(&gc);
+        rc = libxl__domain_save_device_model(gc, domid, fd);
+    GC_FREE;
     return rc;
 }
 
@@ -519,17 +519,17 @@
 
 int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *path;
     char *state;
     int ret, rc = 0;
 
-    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
-        path = libxl__sprintf(&gc, "/local/domain/0/device-model/%d/state", domid);
-        state = libxl__xs_read(&gc, XBT_NULL, path);
+    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
+        path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+        state = libxl__xs_read(gc, XBT_NULL, path);
         if (state != NULL && !strcmp(state, "paused")) {
-            libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/0/device-model/%d/command", domid), "continue");
-            libxl__wait_for_device_model(&gc, domid, "running",
+            libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid), "continue");
+            libxl__wait_for_device_model(gc, domid, "running",
                                          NULL, NULL, NULL);
         }
     }
@@ -538,7 +538,7 @@
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unpausing domain %d", domid);
         rc = ERROR_FAIL;
     }
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -552,42 +552,42 @@
 
 int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *shutdown_path;
     char *dom_path;
 
     if (req > ARRAY_SIZE(req_table)) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_INVAL;
     }
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
-    if (LIBXL__DOMAIN_IS_TYPE(&gc,  domid, HVM)) {
+    if (LIBXL__DOMAIN_IS_TYPE(gc,  domid, HVM)) {
         unsigned long pvdriver = 0;
         int ret;
         ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
         if (ret<0) {
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting HVM callback IRQ");
-            libxl__free_all(&gc);
+            GC_FREE;
             return ERROR_FAIL;
         }
         if (!pvdriver) {
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "HVM domain without PV drivers:"
                        " graceful shutdown not possible, use destroy");
-            libxl__free_all(&gc);
+            GC_FREE;
             return ERROR_FAIL;
         }
     }
 
-    shutdown_path = libxl__sprintf(&gc, "%s/control/shutdown", dom_path);
+    shutdown_path = libxl__sprintf(gc, "%s/control/shutdown", dom_path);
     xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], strlen(req_table[req]));
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -609,7 +609,7 @@
 
 int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_device_disk *disks, int num_disks, libxl_waiter *waiter)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int i, rc = -1;
     uint32_t domid = libxl_get_stubdom_id(ctx, guest_domid);
 
@@ -618,7 +618,7 @@
 
     for (i = 0; i < num_disks; i++) {
         if (asprintf(&(waiter[i].path), "%s/device/vbd/%d/eject",
-                     libxl__xs_get_dompath(&gc, domid),
+                     libxl__xs_get_dompath(gc, domid),
                      libxl__device_disk_dev_number(disks[i].vdev,
                                                    NULL, NULL)) < 0)
             goto out;
@@ -628,7 +628,7 @@
     }
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -682,22 +682,22 @@
 
 int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *path;
     char *backend;
     char *value;
     char backend_type[BACKEND_STRING_SIZE+1];
 
-    value = libxl__xs_read(&gc, XBT_NULL, event->path);
+    value = libxl__xs_read(gc, XBT_NULL, event->path);
 
     if (!value || strcmp(value,  "eject")) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return 0;
     }
 
     path = strdup(event->path);
     path[strlen(path) - 6] = '\0';
-    backend = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", path));
+    backend = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", path));
 
     sscanf(backend,
             "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE) "[a-z]/%*d/%*d",
@@ -713,19 +713,19 @@
     disk->pdev_path = strdup("");
     disk->format = LIBXL_DISK_FORMAT_EMPTY;
     /* this value is returned to the user: do not free right away */
-    disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend), NULL);
+    disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/dev", backend), NULL);
     disk->removable = 1;
     disk->readwrite = 0;
     disk->is_cdrom = 1;
 
     free(path);
-    libxl__free_all(&gc);
+    GC_FREE;
     return 1;
 }
 
 int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_dominfo dominfo;
     char *dom_path;
     char *vm_path;
@@ -742,40 +742,40 @@
         return rc;
     }
 
-    switch (libxl__domain_type(&gc, domid)) {
+    switch (libxl__domain_type(gc, domid)) {
     case LIBXL_DOMAIN_TYPE_HVM:
         dm_present = 1;
         break;
     case LIBXL_DOMAIN_TYPE_PV:
-        pid = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/%d/image/device-model-pid", domid));
+        pid = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/%d/image/device-model-pid", domid));
         dm_present = (pid != NULL);
         break;
     default:
         abort();
     }
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
         rc = ERROR_FAIL;
         goto out;
     }
 
-    if (libxl__device_pci_destroy_all(&gc, domid) < 0)
+    if (libxl__device_pci_destroy_all(gc, domid) < 0)
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "pci shutdown failed for domid %d", domid);
     rc = xc_domain_pause(ctx->xch, domid);
     if (rc < 0) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "xc_domain_pause failed for %d", domid);
     }
     if (dm_present) {
-        if (libxl__destroy_device_model(&gc, domid) < 0)
+        if (libxl__destroy_device_model(gc, domid) < 0)
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl__destroy_device_model failed for %d", domid);
 
-        libxl__qmp_cleanup(&gc, domid);
+        libxl__qmp_cleanup(gc, domid);
     }
-    if (libxl__devices_destroy(&gc, domid, force) < 0)
+    if (libxl__devices_destroy(gc, domid, force) < 0)
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_devices_dispose failed for %d", domid);
 
-    vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
+    vm_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path));
     if (vm_path)
         if (!xs_rm(ctx->xsh, XBT_NULL, vm_path))
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", vm_path);
@@ -783,9 +783,9 @@
     if (!xs_rm(ctx->xsh, XBT_NULL, dom_path))
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", dom_path);
 
-    xs_rm(ctx->xsh, XBT_NULL, libxl__xs_libxl_path(&gc, domid));
-
-    libxl__userdata_destroyall(&gc, domid);
+    xs_rm(ctx->xsh, XBT_NULL, libxl__xs_libxl_path(gc, domid));
+
+    libxl__userdata_destroyall(gc, domid);
 
     rc = xc_domain_destroy(ctx->xch, domid);
     if (rc < 0) {
@@ -795,16 +795,16 @@
     }
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_console_exec(libxl_ctx *ctx, uint32_t domid, int cons_num, libxl_console_type type)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *p = libxl__sprintf(&gc, "%s/xenconsole", libxl_private_bindir_path());
-    char *domid_s = libxl__sprintf(&gc, "%d", domid);
-    char *cons_num_s = libxl__sprintf(&gc, "%d", cons_num);
+    GC_INIT(ctx);
+    char *p = libxl__sprintf(gc, "%s/xenconsole", libxl_private_bindir_path());
+    char *domid_s = libxl__sprintf(gc, "%d", domid);
+    char *cons_num_s = libxl__sprintf(gc, "%d", cons_num);
     char *cons_type_s;
 
     switch (type) {
@@ -821,20 +821,20 @@
     execl(p, p, domid_s, "--num", cons_num_s, "--type", cons_type_s, (void *)NULL);
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return ERROR_FAIL;
 }
 
 int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm);
     int rc;
     if (stubdomid)
         rc = libxl_console_exec(ctx, stubdomid,
                                 STUBDOM_CONSOLE_SERIAL, LIBXL_CONSOLE_TYPE_PV);
     else {
-        switch (libxl__domain_type(&gc, domid_vm)) {
+        switch (libxl__domain_type(gc, domid_vm)) {
         case LIBXL_DOMAIN_TYPE_HVM:
             rc = libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSOLE_TYPE_SERIAL);
             break;
@@ -845,13 +845,13 @@
             abort();
         }
     }
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     const char *vnc_port;
     const char *vnc_listen = NULL, *vnc_pass = NULL;
     int port = 0, autopass_fd = -1;
@@ -862,19 +862,19 @@
         NULL,
     };
 
-    vnc_port = libxl__xs_read(&gc, XBT_NULL,
-                            libxl__sprintf(&gc,
+    vnc_port = libxl__xs_read(gc, XBT_NULL,
+                            libxl__sprintf(gc,
                             "/local/domain/%d/console/vnc-port", domid));
     if ( vnc_port )
         port = atoi(vnc_port) - 5900;
 
-    vnc_listen = libxl__xs_read(&gc, XBT_NULL,
-                                libxl__sprintf(&gc,
+    vnc_listen = libxl__xs_read(gc, XBT_NULL,
+                                libxl__sprintf(gc,
                             "/local/domain/%d/console/vnc-listen", domid));
 
     if ( autopass )
-        vnc_pass = libxl__xs_read(&gc, XBT_NULL,
-                                  libxl__sprintf(&gc,
+        vnc_pass = libxl__xs_read(gc, XBT_NULL,
+                                  libxl__sprintf(gc,
                             "/local/domain/%d/console/vnc-pass", domid));
 
     if ( NULL == vnc_listen )
@@ -883,7 +883,7 @@
     if ( (vnc_bin = getenv("VNCVIEWER")) )
         args[0] = vnc_bin;
 
-    args[1] = libxl__sprintf(&gc, "%s:%d", vnc_listen, port);
+    args[1] = libxl__sprintf(gc, "%s:%d", vnc_listen, port);
 
     if ( vnc_pass ) {
         char tmpname[] = "/tmp/vncautopass.XXXXXX";
@@ -918,7 +918,7 @@
     abort();
 
  x_fail:
-    libxl__free_all(&gc);
+    GC_FREE;
     return ERROR_FAIL;
 }
 
@@ -972,17 +972,17 @@
 
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     char *dev;
     libxl__device device;
     int major, minor, rc;
 
-    rc = libxl__device_disk_set_backend(&gc, disk);
+    rc = libxl__device_disk_set_backend(gc, disk);
     if (rc) goto out;
 
-    rc = libxl__device_disk_set_backend(&gc, disk);
+    rc = libxl__device_disk_set_backend(gc, disk);
     if (rc) goto out;
 
     front = flexarray_make(16, 1);
@@ -1003,7 +1003,7 @@
         goto out_free;
     }
 
-    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
     if (rc != 0) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
                " virtual disk identifier %s", disk->vdev);
@@ -1016,7 +1016,7 @@
     do_backend_phy:
             libxl__device_physdisk_major_minor(dev, &major, &minor);
             flexarray_append(back, "physical-device");
-            flexarray_append(back, libxl__sprintf(&gc, "%x:%x", major, minor));
+            flexarray_append(back, libxl__sprintf(gc, "%x:%x", major, minor));
 
             flexarray_append(back, "params");
             flexarray_append(back, dev);
@@ -1024,13 +1024,13 @@
             assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD);
             break;
         case LIBXL_DISK_BACKEND_TAP:
-            dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format);
+            dev = libxl__blktap_devpath(gc, disk->pdev_path, disk->format);
             if (!dev) {
                 rc = ERROR_FAIL;
                 goto out_free;
             }
             flexarray_append(back, "tapdisk-params");
-            flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
+            flexarray_append(back, libxl__sprintf(gc, "%s:%s",
                 libxl__device_disk_string_of_format(disk->format),
                 disk->pdev_path));
 
@@ -1038,7 +1038,7 @@
             goto do_backend_phy;
         case LIBXL_DISK_BACKEND_QDISK:
             flexarray_append(back, "params");
-            flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
+            flexarray_append(back, libxl__sprintf(gc, "%s:%s",
                           libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
             assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK);
             break;
@@ -1049,15 +1049,15 @@
     }
 
     flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
     flexarray_append(back, "online");
     flexarray_append(back, "1");
     flexarray_append(back, "removable");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", (disk->removable) ? 1 : 0));
+    flexarray_append(back, libxl__sprintf(gc, "%d", (disk->removable) ? 1 : 0));
     flexarray_append(back, "bootable");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     flexarray_append(back, "dev");
     flexarray_append(back, disk->vdev);
     flexarray_append(back, "type");
@@ -1068,17 +1068,17 @@
     flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
 
     flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", disk->backend_domid));
     flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
     flexarray_append(front, "virtual-device");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", device.devid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", device.devid));
     flexarray_append(front, "device-type");
     flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk");
 
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
 
     rc = 0;
 
@@ -1086,39 +1086,39 @@
     flexarray_free(back);
     flexarray_free(front);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid,
                              libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    rc = libxl__device_from_disk(gc, domid, disk, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1170,27 +1170,27 @@
 int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
                                int devid, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *path;
     int rc = ERROR_FAIL;
 
     libxl_device_disk_init(ctx, disk);
 
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     if (!dompath) {
         goto out;
     }
-    path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
+    path = libxl__xs_read(gc, XBT_NULL,
+                          libxl__sprintf(gc, "%s/device/vbd/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
 
-    libxl__device_disk_from_xs_be(&gc, path, disk);
+    libxl__device_disk_from_xs_be(gc, path, disk);
 
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1230,22 +1230,22 @@
 
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_device_disk *disks = NULL;
     int rc;
 
     *num = 0;
 
-    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
+    rc = libxl__append_disk_list_of_type(gc, domid, "vbd", &disks, num);
     if (rc) goto out_err;
 
-    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
+    rc = libxl__append_disk_list_of_type(gc, domid, "tap", &disks, num);
     if (rc) goto out_err;
 
-    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
+    rc = libxl__append_disk_list_of_type(gc, domid, "qdisk", &disks, num);
     if (rc) goto out_err;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return disks;
 
 out_err:
@@ -1261,35 +1261,35 @@
 int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk, libxl_diskinfo *diskinfo)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *diskpath;
     char *val;
 
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
 
     /* tap devices entries in xenstore are written as vbd devices. */
-    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
+    diskpath = libxl__sprintf(gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
     diskinfo->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", diskpath), NULL);
+                                libxl__sprintf(gc, "%s/backend", diskpath), NULL);
     if (!diskinfo->backend) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend-id", diskpath));
     diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/state", diskpath));
     diskinfo->state = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/event-channel", diskpath));
     diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/ring-ref", diskpath));
     diskinfo->rref = val ? strtoul(val, NULL, 10) : -1;
     diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend));
+                                 libxl__sprintf(gc, "%s/frontend", diskinfo->backend), NULL);
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend-id", diskinfo->backend));
     diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -1333,12 +1333,12 @@
 
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dev = NULL;
     char *ret = NULL;
     int rc;
 
-    rc = libxl__device_disk_set_backend(&gc, disk);
+    rc = libxl__device_disk_set_backend(gc, disk);
     if (rc) goto out;
 
     switch (disk->backend) {
@@ -1357,7 +1357,7 @@
                 dev = disk->pdev_path;
                 break;
             case LIBXL_DISK_FORMAT_VHD:
-                dev = libxl__blktap_devpath(&gc, disk->pdev_path,
+                dev = libxl__blktap_devpath(gc, disk->pdev_path,
                                             disk->format);
                 break;
             case LIBXL_DISK_FORMAT_QCOW:
@@ -1388,7 +1388,7 @@
  out:
     if (dev != NULL)
         ret = strdup(dev);
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -1450,7 +1450,7 @@
 
 int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     libxl__device device;
@@ -1469,59 +1469,59 @@
     }
 
     if (nic->devid == -1) {
-        if (!(dompath = libxl__xs_get_dompath(&gc, domid))) {
+        if (!(dompath = libxl__xs_get_dompath(gc, domid))) {
             rc = ERROR_FAIL;
             goto out_free;
         }
-        if (!(l = libxl__xs_directory(&gc, XBT_NULL,
-                                     libxl__sprintf(&gc, "%s/device/vif", dompath), &nb))) {
+        if (!(l = libxl__xs_directory(gc, XBT_NULL,
+                                     libxl__sprintf(gc, "%s/device/vif", dompath), &nb))) {
             nic->devid = 0;
         } else {
             nic->devid = strtoul(l[nb - 1], NULL, 10) + 1;
         }
     }
 
-    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
     if ( rc != 0 ) goto out_free;
 
     flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
     flexarray_append(back, "online");
     flexarray_append(back, "1");
     flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     if (nic->script) {
         flexarray_append(back, "script");
         flexarray_append(back, nic->script[0]=='/' ? nic->script
-                         : libxl__sprintf(&gc, "%s/%s",
+                         : libxl__sprintf(gc, "%s/%s",
                                           libxl_xen_script_dir_path(),
                                           nic->script));
     }
     flexarray_append(back, "mac");
-    flexarray_append(back,libxl__sprintf(&gc,
+    flexarray_append(back,libxl__sprintf(gc,
                                     LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
     if (nic->ip) {
         flexarray_append(back, "ip");
-        flexarray_append(back, libxl__strdup(&gc, nic->ip));
+        flexarray_append(back, libxl__strdup(gc, nic->ip));
     }
 
     flexarray_append(back, "bridge");
-    flexarray_append(back, libxl__strdup(&gc, nic->bridge));
+    flexarray_append(back, libxl__strdup(gc, nic->bridge));
     flexarray_append(back, "handle");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", nic->devid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", nic->devid));
 
     flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->backend_domid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", nic->backend_domid));
     flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
     flexarray_append(front, "handle");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", nic->devid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", nic->devid));
     flexarray_append(front, "mac");
-    flexarray_append(front, libxl__sprintf(&gc,
+    flexarray_append(front, libxl__sprintf(gc,
                                     LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nic->mac)));
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
 
     /* FIXME: wait for plug */
     rc = 0;
@@ -1529,39 +1529,39 @@
     flexarray_free(back);
     flexarray_free(front);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    rc = libxl__device_from_nic(gc, domid, nic, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1609,26 +1609,26 @@
 int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
                               int devid, libxl_device_nic *nic)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *path;
     int rc = ERROR_FAIL;
 
     memset(nic, 0, sizeof (libxl_device_nic));
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     if (!dompath)
         goto out;
 
-    path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vif/%d/backend",
+    path = libxl__xs_read(gc, XBT_NULL,
+                          libxl__sprintf(gc, "%s/device/vif/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
 
-    libxl__device_nic_from_xs_be(&gc, path, nic);
+    libxl__device_nic_from_xs_be(gc, path, nic);
 
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1667,16 +1667,16 @@
 
 libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_device_nic *nics = NULL;
     int rc;
 
     *num = 0;
 
-    rc = libxl__append_nic_list_of_type(&gc, domid, "vif", &nics, num);
+    rc = libxl__append_nic_list_of_type(gc, domid, "vif", &nics, num);
     if (rc) goto out_err;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return nics;
 
 out_err:
@@ -1692,36 +1692,36 @@
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *dompath, *nicpath;
     char *val;
 
-    dompath = libxl__xs_get_dompath(&gc, domid);
+    dompath = libxl__xs_get_dompath(gc, domid);
     nicinfo->devid = nic->devid;
 
-    nicpath = libxl__sprintf(&gc, "%s/device/vif/%d", dompath, nicinfo->devid);
+    nicpath = libxl__sprintf(gc, "%s/device/vif/%d", dompath, nicinfo->devid);
     nicinfo->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", nicpath), NULL);
+                                libxl__sprintf(gc, "%s/backend", nicpath), NULL);
     if (!nicinfo->backend) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend-id", nicpath));
     nicinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/state", nicpath));
     nicinfo->state = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/event-channel", nicpath));
     nicinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/tx-ring-ref", nicpath));
     nicinfo->rref_tx = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nicpath));
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/rx-ring-ref", nicpath));
     nicinfo->rref_rx = val ? strtoul(val, NULL, 10) : -1;
     nicinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", nicinfo->backend), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nicinfo->backend));
+                                 libxl__sprintf(gc, "%s/frontend", nicinfo->backend), NULL);
+    val = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend-id", nicinfo->backend));
     nicinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
@@ -1827,7 +1827,7 @@
 
 int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     libxl__device device;
@@ -1844,64 +1844,64 @@
         goto out_free;
     }
 
-    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
     if (rc != 0) goto out_free;
 
     flexarray_append(back, "frontend-id");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
+    flexarray_append(back, libxl__sprintf(gc, "%d", domid));
     flexarray_append(back, "online");
     flexarray_append(back, "1");
     flexarray_append(back, "state");
-    flexarray_append(back, libxl__sprintf(&gc, "%d", 1));
+    flexarray_append(back, libxl__sprintf(gc, "%d", 1));
     flexarray_append(back, "domain");
-    flexarray_append(back, libxl__domid_to_name(&gc, domid));
+    flexarray_append(back, libxl__domid_to_name(gc, domid));
 
     flexarray_append(front, "backend-id");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", vkb->backend_domid));
+    flexarray_append(front, libxl__sprintf(gc, "%d", vkb->backend_domid));
     flexarray_append(front, "state");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
-
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    flexarray_append(front, libxl__sprintf(gc, "%d", 1));
+
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
     rc = 0;
 out_free:
     flexarray_free(back);
     flexarray_free(front);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_vkb *vkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_vkb *vkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    rc = libxl__device_from_vkb(gc, domid, vkb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1937,7 +1937,7 @@
 
 int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     flexarray_t *front;
     flexarray_t *back;
     libxl__device device;
@@ -1954,20 +1954,20 @@
         goto out_free;
     }
 
-    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
     if (rc != 0) goto out_free;
 
-    flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid));
+    flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", domid));
     flexarray_append_pair(back, "online", "1");
-    flexarray_append_pair(back, "state", libxl__sprintf(&gc, "%d", 1));
-    flexarray_append_pair(back, "domain", libxl__domid_to_name(&gc, domid));
-    flexarray_append_pair(back, "vnc", libxl__sprintf(&gc, "%d", vfb->vnc));
+    flexarray_append_pair(back, "state", libxl__sprintf(gc, "%d", 1));
+    flexarray_append_pair(back, "domain", libxl__domid_to_name(gc, domid));
+    flexarray_append_pair(back, "vnc", libxl__sprintf(gc, "%d", vfb->vnc));
     flexarray_append_pair(back, "vnclisten", vfb->vnclisten);
     flexarray_append_pair(back, "vncpasswd", vfb->vncpasswd);
-    flexarray_append_pair(back, "vncdisplay", libxl__sprintf(&gc, "%d", vfb->vncdisplay));
-    flexarray_append_pair(back, "vncunused", libxl__sprintf(&gc, "%d", vfb->vncunused));
-    flexarray_append_pair(back, "sdl", libxl__sprintf(&gc, "%d", vfb->sdl));
-    flexarray_append_pair(back, "opengl", libxl__sprintf(&gc, "%d", vfb->opengl));
+    flexarray_append_pair(back, "vncdisplay", libxl__sprintf(gc, "%d", vfb->vncdisplay));
+    flexarray_append_pair(back, "vncunused", libxl__sprintf(gc, "%d", vfb->vncunused));
+    flexarray_append_pair(back, "sdl", libxl__sprintf(gc, "%d", vfb->sdl));
+    flexarray_append_pair(back, "opengl", libxl__sprintf(gc, "%d", vfb->opengl));
     if (vfb->xauthority) {
         flexarray_append_pair(back, "xauthority", vfb->xauthority);
     }
@@ -1975,50 +1975,50 @@
         flexarray_append_pair(back, "display", vfb->display);
     }
 
-    flexarray_append_pair(front, "backend-id", libxl__sprintf(&gc, "%d", vfb->backend_domid));
-    flexarray_append_pair(front, "state", libxl__sprintf(&gc, "%d", 1));
-
-    libxl__device_generic_add(&gc, &device,
-                             libxl__xs_kvs_of_flexarray(&gc, back, back->count),
-                             libxl__xs_kvs_of_flexarray(&gc, front, front->count));
+    flexarray_append_pair(front, "backend-id", libxl__sprintf(gc, "%d", vfb->backend_domid));
+    flexarray_append_pair(front, "state", libxl__sprintf(gc, "%d", 1));
+
+    libxl__device_generic_add(gc, &device,
+                             libxl__xs_kvs_of_flexarray(gc, back, back->count),
+                             libxl__xs_kvs_of_flexarray(gc, front, front->count));
     rc = 0;
 out_free:
     flexarray_free(front);
     flexarray_free(back);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid,
                             libxl_device_vfb *vfb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_remove(&gc, &device, 1);
+    rc = libxl__device_remove(gc, &device, 1);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_vfb *vfb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl__device device;
     int rc;
 
-    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    rc = libxl__device_from_vfb(gc, domid, vfb, &device);
     if (rc != 0) goto out;
 
-    rc = libxl__device_destroy(&gc, &device);
+    rc = libxl__device_destroy(gc, &device);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2026,13 +2026,13 @@
 
 int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *mem, *endptr;
     uint32_t memorykb;
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     int rc = 1;
 
-    mem = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/memory/target", dompath));
+    mem = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/memory/target", dompath));
     if (!mem) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot get memory info from %s/memory/target\n", dompath);
         goto out;
@@ -2057,7 +2057,7 @@
 
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2165,12 +2165,12 @@
 int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid,
         int32_t target_memkb, int relative, int enforce)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = 1, abort = 0;
     uint32_t memorykb = 0, videoram = 0;
     uint32_t current_target_memkb = 0, new_target_memkb = 0;
     char *memmax, *endptr, *videoram_s = NULL, *target = NULL;
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     xc_domaininfo_t info;
     libxl_dominfo ptr;
     char *uuid;
@@ -2179,11 +2179,11 @@
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
 
-    target = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+    target = libxl__xs_read(gc, t, libxl__sprintf(gc,
                 "%s/memory/target", dompath));
     if (!target && !domid) {
         xs_transaction_end(ctx->xsh, t, 1);
-        rc = libxl__fill_dom0_memory_info(&gc, &current_target_memkb);
+        rc = libxl__fill_dom0_memory_info(gc, &current_target_memkb);
         if (rc < 0) {
             abort = 1;
             goto out;
@@ -2205,7 +2205,7 @@
             goto out;
         }
     }
-    memmax = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+    memmax = libxl__xs_read(gc, t, libxl__sprintf(gc,
                 "%s/memory/static-max", dompath));
     if (!memmax) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
@@ -2245,7 +2245,7 @@
         abort = 1;
         goto out;
     }
-    videoram_s = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+    videoram_s = libxl__xs_read(gc, t, libxl__sprintf(gc,
                 "%s/memory/videoram", dompath));
     videoram = videoram_s ? atoi(videoram_s) : 0;
 
@@ -2274,7 +2274,7 @@
         goto out;
     }
 
-    libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/memory/target",
+    libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/memory/target",
                 dompath), "%"PRIu32, new_target_memkb);
     rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info);
     if (rc != 1 || info.domain != domid) {
@@ -2282,8 +2282,8 @@
         goto out;
     }
     xcinfo2xlinfo(&info, &ptr);
-    uuid = libxl__uuid2string(&gc, ptr.uuid);
-    libxl__xs_write(&gc, t, libxl__sprintf(&gc, "/vm/%s/memory", uuid),
+    uuid = libxl__uuid2string(gc, ptr.uuid);
+    libxl__xs_write(gc, t, libxl__sprintf(gc, "/vm/%s/memory", uuid),
             "%"PRIu32, new_target_memkb / 1024);
 
 out:
@@ -2291,22 +2291,22 @@
         if (errno == EAGAIN)
             goto retry_transaction;
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = 1;
     char *target = NULL, *endptr = NULL;
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     uint32_t target_memkb;
 
-    target = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc,
+    target = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc,
                 "%s/memory/target", dompath));
     if (!target && !domid) {
-        rc = libxl__fill_dom0_memory_info(&gc, &target_memkb);
+        rc = libxl__fill_dom0_memory_info(gc, &target_memkb);
         if (rc < 0)
             goto out;
     } else if (!target) {
@@ -2327,14 +2327,14 @@
     rc = 0;
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
         libxl_device_model_info *dm_info, uint32_t *need_memkb)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc = ERROR_INVAL;
     *need_memkb = b_info->target_memkb;
     switch (b_info->type) {
@@ -2353,7 +2353,7 @@
         *need_memkb += (2 * 1024) - (*need_memkb % (2 * 1024));
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 
 }
@@ -2363,12 +2363,12 @@
     int rc = 0;
     libxl_physinfo info;
     uint32_t freemem_slack;
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
 
     rc = libxl_get_physinfo(ctx, &info);
     if (rc < 0)
         goto out;
-    rc = libxl__get_free_memory_slack(&gc, &freemem_slack);
+    rc = libxl__get_free_memory_slack(gc, &freemem_slack);
     if (rc < 0)
         goto out;
 
@@ -2378,7 +2378,7 @@
         *memkb = 0;
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2388,9 +2388,9 @@
     int rc = 0;
     libxl_physinfo info;
     uint32_t freemem_slack;
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-
-    rc = libxl__get_free_memory_slack(&gc, &freemem_slack);
+    GC_INIT(ctx);
+
+    rc = libxl__get_free_memory_slack(gc, &freemem_slack);
     if (rc < 0)
         goto out;
     while (wait_secs > 0) {
@@ -2407,7 +2407,7 @@
     rc = ERROR_NOMEM;
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2633,7 +2633,7 @@
 
 int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_cpumap *cpumap)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_dominfo info;
     char *dompath;
     xs_transaction_t t;
@@ -2643,14 +2643,14 @@
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "getting domain info list");
         goto out;
     }
-    if (!(dompath = libxl__xs_get_dompath(&gc, domid)))
+    if (!(dompath = libxl__xs_get_dompath(gc, domid)))
         goto out;
 
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
     for (i = 0; i <= info.vcpu_max_id; i++)
-        libxl__xs_write(&gc, t,
-                       libxl__sprintf(&gc, "%s/cpu/%u/availability", dompath, i),
+        libxl__xs_write(gc, t,
+                       libxl__sprintf(gc, "%s/cpu/%u/availability", dompath, i),
                        "%s", libxl_cpumap_test(cpumap, i) ? "online" : "offline");
     if (!xs_transaction_end(ctx->xsh, t, 0)) {
         if (errno == EAGAIN)
@@ -2658,7 +2658,7 @@
     } else
         rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -2883,12 +2883,12 @@
 
 int libxl_send_sysrq(libxl_ctx *ctx, uint32_t domid, char sysrq)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
-
-    libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/control/sysrq", dompath), "%c", sysrq);
-
-    libxl__free_all(&gc);
+    GC_INIT(ctx);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
+
+    libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "%s/control/sysrq", dompath), "%c", sysrq);
+
+    GC_FREE;
     return 0;
 }
 
@@ -2975,15 +2975,15 @@
 
 uint32_t libxl_vm_get_start_time(libxl_ctx *ctx, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath = libxl__xs_get_dompath(&gc, domid);
+    GC_INIT(ctx);
+    char *dompath = libxl__xs_get_dompath(gc, domid);
     char *vm_path, *start_time;
     uint32_t ret;
 
     vm_path = libxl__xs_read(
-        &gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dompath));
+        gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dompath));
     start_time = libxl__xs_read(
-        &gc, XBT_NULL, libxl__sprintf(&gc, "%s/start_time", vm_path));
+        gc, XBT_NULL, libxl__sprintf(gc, "%s/start_time", vm_path));
     if (start_time == NULL) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, -1,
                         "Can't get start time of domain '%d'", domid);
@@ -2991,7 +2991,7 @@
     }else{
         ret = strtoul(start_time, NULL, 10);
     }
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -3144,15 +3144,15 @@
                          libxl_cpumap cpumap, libxl_uuid *uuid,
                          uint32_t *poolid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
     int i;
     xs_transaction_t t;
     char *uuid_string;
 
-    uuid_string = libxl__uuid2string(&gc, *uuid);
+    uuid_string = libxl__uuid2string(gc, *uuid);
     if (!uuid_string) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
@@ -3160,7 +3160,7 @@
     if (rc) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
            "Could not create cpupool");
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
@@ -3171,7 +3171,7 @@
                 LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
                     "Error moving cpu to cpupool");
                 libxl_cpupool_destroy(ctx, *poolid);
-                libxl__free_all(&gc);
+                GC_FREE;
                 return ERROR_FAIL;
             }
         }
@@ -3179,16 +3179,16 @@
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        xs_mkdir(ctx->xsh, t, libxl__sprintf(&gc, "/local/pool/%d", *poolid));
-        libxl__xs_write(&gc, t,
-                        libxl__sprintf(&gc, "/local/pool/%d/uuid", *poolid),
+        xs_mkdir(ctx->xsh, t, libxl__sprintf(gc, "/local/pool/%d", *poolid));
+        libxl__xs_write(gc, t,
+                        libxl__sprintf(gc, "/local/pool/%d/uuid", *poolid),
                         "%s", uuid_string);
-        libxl__xs_write(&gc, t,
-                        libxl__sprintf(&gc, "/local/pool/%d/name", *poolid),
+        libxl__xs_write(gc, t,
+                        libxl__sprintf(gc, "/local/pool/%d/name", *poolid),
                         "%s", name);
 
         if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN)) {
-            libxl__free_all(&gc);
+            GC_FREE;
             return 0;
         }
     }
@@ -3196,7 +3196,7 @@
 
 int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc, i;
     xc_cpupoolinfo_t *info;
     xs_transaction_t t;
@@ -3204,7 +3204,7 @@
 
     info = xc_cpupool_getinfo(ctx->xch, poolid);
     if (info == NULL) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
@@ -3238,7 +3238,7 @@
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "/local/pool/%d", poolid));
+        xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "/local/pool/%d", poolid));
 
         if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN))
             break;
@@ -3250,21 +3250,21 @@
     libxl_cpumap_dispose(&cpumap);
 out:
     xc_cpupool_infofree(ctx->xch, info);
-    libxl__free_all(&gc);
+    GC_FREE;
 
     return rc;
 }
 
 int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     xs_transaction_t t;
     xc_cpupoolinfo_t *info;
     int rc;
 
     info = xc_cpupool_getinfo(ctx->xch, poolid);
     if (info == NULL) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_NOMEM;
     }
 
@@ -3277,8 +3277,8 @@
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        libxl__xs_write(&gc, t,
-                        libxl__sprintf(&gc, "/local/pool/%d/name", poolid),
+        libxl__xs_write(gc, t,
+                        libxl__sprintf(gc, "/local/pool/%d/name", poolid),
                         "%s", name);
 
         if (xs_transaction_end(ctx->xsh, t, 0))
@@ -3293,7 +3293,7 @@
 
 out:
     xc_cpupool_infofree(ctx->xch, info);
-    libxl__free_all(&gc);
+    GC_FREE;
 
     return rc;
 }
@@ -3400,16 +3400,16 @@
 
 int libxl_cpupool_movedomain(libxl_ctx *ctx, uint32_t poolid, uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
     char *dom_path;
     char *vm_path;
     char *poolname;
     xs_transaction_t t;
 
-    dom_path = libxl__xs_get_dompath(&gc, domid);
+    dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) {
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
@@ -3417,26 +3417,26 @@
     if (rc) {
         LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
             "Error moving domain to cpupool");
-        libxl__free_all(&gc);
+        GC_FREE;
         return ERROR_FAIL;
     }
 
     for (;;) {
         t = xs_transaction_start(ctx->xsh);
 
-        poolname = libxl__cpupoolid_to_name(&gc, poolid);
-        vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
+        poolname = libxl__cpupoolid_to_name(gc, poolid);
+        vm_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path));
         if (!vm_path)
             break;
 
-        libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/pool_name", vm_path),
+        libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/pool_name", vm_path),
                         "%s", poolname);
 
         if (xs_transaction_end(ctx->xsh, t, 0) || (errno != EAGAIN))
             break;
     }
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return 0;
 }
 
diff -r b5d6ed400122 -r 7e90178b8bbf tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Mon Dec 12 17:48:42 2011 +0000
+++ b/tools/libxl/libxl_bootloader.c	Mon Dec 12 17:48:42 2011 +0000
@@ -328,7 +328,7 @@
                          libxl_device_disk *disk,
                          uint32_t domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int ret, rc = 0;
     char *fifo = NULL;
     char *diskpath = NULL;
@@ -388,7 +388,7 @@
         goto out_close;
     }
 
-    args = make_bootloader_args(&gc, info, domid, fifo, diskpath);
+    args = make_bootloader_args(gc, info, domid, fifo, diskpath);
     if (args == NULL) {
         rc = ERROR_NOMEM;
         goto out_close;
@@ -411,8 +411,8 @@
         goto out_close;
     }
 
-    dom_console_xs_path = libxl__sprintf(&gc, "%s/console/tty", libxl__xs_get_dompath(&gc, domid));
-    libxl__xs_write(&gc, XBT_NULL, dom_console_xs_path, "%s", dom_console_slave_tty_path);
+    dom_console_xs_path = libxl__sprintf(gc, "%s/console/tty", libxl__xs_get_dompath(gc, domid));
+    libxl__xs_write(gc, XBT_NULL, dom_console_xs_path, "%s", dom_console_slave_tty_path);
 
     pid = fork_exec_bootloader(&bootloader_fd, info->u.pv.bootloader, args);
     if (pid < 0) {
@@ -435,7 +435,7 @@
 
     fcntl(fifo_fd, F_SETFL, O_NDELAY);
 
-    blout = bootloader_interact(&gc, xenconsoled_fd, bootloader_fd, fifo_fd);
+    blout = bootloader_interact(gc, xenconsoled_fd, bootloader_fd, fifo_fd);
     if (blout == NULL) {
         goto out_close;
     }
@@ -445,7 +445,7 @@
         goto out_close;
     }
 
-    parse_bootloader_result(&gc, info, blout);
+    parse_bootloader_result(gc, info, blout);
 
     rc = 0;
 out_close:
@@ -472,7 +472,7 @@
     free(args);
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
diff -r b5d6ed400122 -r 7e90178b8bbf tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c	Mon Dec 12 17:48:42 2011 +0000
+++ b/tools/libxl/libxl_create.c	Mon Dec 12 17:48:42 2011 +0000
@@ -670,20 +670,20 @@
 int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config,
                             libxl_console_ready cb, void *priv, uint32_t *domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = do_domain_create(&gc, d_config, cb, priv, domid, -1);
-    libxl__free_all(&gc);
+    rc = do_domain_create(gc, d_config, cb, priv, domid, -1);
+    GC_FREE;
     return rc;
 }
 
 int libxl_domain_create_restore(libxl_ctx *ctx, libxl_domain_config *d_config,
                                 libxl_console_ready cb, void *priv, uint32_t *domid, int restore_fd)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = do_domain_create(&gc, d_config, cb, priv, domid, restore_fd);
-    libxl__free_all(&gc);
+    rc = do_domain_create(gc, d_config, cb, priv, domid, restore_fd);
+    GC_FREE;
     return rc;
 }
 
diff -r b5d6ed400122 -r 7e90178b8bbf tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c	Mon Dec 12 17:48:42 2011 +0000
+++ b/tools/libxl/libxl_dom.c	Mon Dec 12 17:48:42 2011 +0000
@@ -752,7 +752,7 @@
                               const char *userdata_userid,
                               const uint8_t *data, int datalen)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     const char *filename;
     const char *newfilename;
     int e, rc;
@@ -760,18 +760,18 @@
     FILE *f = NULL;
     size_t rs;
 
-    filename = userdata_path(&gc, domid, userdata_userid, "d");
+    filename = userdata_path(gc, domid, userdata_userid, "d");
     if (!filename) {
         rc = ERROR_NOMEM;
         goto out;
     }
 
     if (!datalen) {
-        rc = userdata_delete(&gc, filename);
+        rc = userdata_delete(gc, filename);
         goto out;
     }
 
-    newfilename = userdata_path(&gc, domid, userdata_userid, "n");
+    newfilename = userdata_path(gc, domid, userdata_userid, "n");
     if (!newfilename) {
         rc = ERROR_NOMEM;
         goto out;
@@ -813,7 +813,7 @@
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "cannot write %s for %s",
                  newfilename, filename);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -821,13 +821,13 @@
                                  const char *userdata_userid,
                                  uint8_t **data_r, int *datalen_r)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     const char *filename;
     int e, rc;
     int datalen = 0;
     void *data = 0;
 
-    filename = userdata_path(&gc, domid, userdata_userid, "d");
+    filename = userdata_path(gc, domid, userdata_userid, "d");
     if (!filename) {
         rc = ERROR_NOMEM;
         goto out;
@@ -849,7 +849,7 @@
     if (datalen_r) *datalen_r = datalen;
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
diff -r b5d6ed400122 -r 7e90178b8bbf tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Mon Dec 12 17:48:42 2011 +0000
+++ b/tools/libxl/libxl_pci.c	Mon Dec 12 17:48:42 2011 +0000
@@ -483,7 +483,7 @@
 
 libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     libxl_device_pci *pcidevs = NULL, *new, *assigned;
     struct dirent *de;
     DIR *dir;
@@ -491,7 +491,7 @@
 
     *num = 0;
 
-    rc = get_all_assigned_devices(&gc, &assigned, &num_assigned);
+    rc = get_all_assigned_devices(gc, &assigned, &num_assigned);
     if ( rc )
         goto out;
 
@@ -528,7 +528,7 @@
 out_closedir:
     closedir(dir);
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return pcidevs;
 }
 
@@ -782,10 +782,10 @@
 
 int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
-    rc = libxl__device_pci_add(&gc, domid, pcidev, 0);
-    libxl__free_all(&gc);
+    rc = libxl__device_pci_add(gc, domid, pcidev, 0);
+    GC_FREE;
     return rc;
 }
 
@@ -1057,24 +1057,24 @@
 
 int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
 
-    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 0);
+    rc = libxl__device_pci_remove_common(gc, domid, pcidev, 0);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
 int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid,
                                   libxl_device_pci *pcidev)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     int rc;
 
-    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 1);
+    rc = libxl__device_pci_remove_common(gc, domid, pcidev, 1);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
@@ -1115,15 +1115,15 @@
 
 libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *be_path, *num_devs;
     int n, i;
     libxl_device_pci *pcidevs = NULL;
 
     *num = 0;
 
-    be_path = libxl__sprintf(&gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(&gc, 0), domid);
-    num_devs = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/num_devs", be_path));
+    be_path = libxl__sprintf(gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(gc, 0), domid);
+    num_devs = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/num_devs", be_path));
     if (!num_devs)
         goto out;
 
@@ -1131,11 +1131,11 @@
     pcidevs = calloc(n, sizeof(libxl_device_pci));
 
     for (i = 0; i < n; i++)
-        libxl__device_pci_from_xs_be(&gc, be_path, pcidevs + i, i);
+        libxl__device_pci_from_xs_be(gc, be_path, pcidevs + i, i);
 
     *num = n;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return pcidevs;
 }
 
diff -r b5d6ed400122 -r 7e90178b8bbf tools/libxl/libxl_qmp.c
--- a/tools/libxl/libxl_qmp.c	Mon Dec 12 17:48:42 2011 +0000
+++ b/tools/libxl/libxl_qmp.c	Mon Dec 12 17:48:42 2011 +0000
@@ -94,7 +94,7 @@
                                   const char *chardev,
                                   int port)
 {
-    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    GC_INIT(qmp->ctx);
     char *path = NULL;
     int ret = 0;
 
@@ -102,12 +102,12 @@
         return 0;
     }
 
-    path = libxl__xs_get_dompath(&gc, qmp->domid);
-    path = libxl__sprintf(&gc, "%s/serial/%d/tty", path, port);
+    path = libxl__xs_get_dompath(gc, qmp->domid);
+    path = libxl__sprintf(gc, "%s/serial/%d/tty", path, port);
 
-    ret = libxl__xs_write(&gc, XBT_NULL, path, "%s", chardev + 4);
+    ret = libxl__xs_write(gc, XBT_NULL, path, "%s", chardev + 4);
 
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -587,7 +587,7 @@
 {
     int id = 0;
     int ret = 0;
-    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    GC_INIT(qmp->ctx);
     qmp_request_context context = { .rc = 0 };
 
     id = qmp_send(qmp, cmd, args, callback, opaque, &context);
@@ -597,7 +597,7 @@
     qmp->wait_for_id = id;
 
     while (qmp->wait_for_id == id) {
-        if ((ret = qmp_next(&gc, qmp)) < 0) {
+        if ((ret = qmp_next(gc, qmp)) < 0) {
             break;
         }
     }
@@ -606,7 +606,7 @@
         ret = context.rc;
     }
 
-    libxl__free_all(&gc);
+    GC_FREE;
 
     return ret;
 }
@@ -625,15 +625,15 @@
     int ret = 0;
     libxl__qmp_handler *qmp = NULL;
     char *qmp_socket;
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
 
     qmp = qmp_init_handler(ctx, domid);
 
-    qmp_socket = libxl__sprintf(&gc, "%s/qmp-libxl-%d",
+    qmp_socket = libxl__sprintf(gc, "%s/qmp-libxl-%d",
                                 libxl_run_dir_path(), domid);
     if ((ret = qmp_open(qmp, qmp_socket, QMP_SOCKET_CONNECT_TIMEOUT)) < 0) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Connection error");
-        libxl__free_all(&gc);
+        GC_FREE;
         qmp_free_handler(qmp);
         return NULL;
     }
@@ -642,12 +642,12 @@
 
     /* Wait for the response to qmp_capabilities */
     while (!qmp->connected) {
-        if ((ret = qmp_next(&gc, qmp)) < 0) {
+        if ((ret = qmp_next(gc, qmp)) < 0) {
             break;
         }
     }
 
-    libxl__free_all(&gc);
+    GC_FREE;
     if (!qmp->connected) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Failed to connect to QMP");
         libxl__qmp_close(qmp);
@@ -692,9 +692,9 @@
 {
     libxl_device_pci *pcidev = opaque;
     const libxl__json_object *bus = NULL;
-    libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
+    GC_INIT(qmp->ctx);
     int i, j, rc = -1;
-    char *asked_id = libxl__sprintf(&gc, PCI_PT_QDEV_ID,
+    char *asked_id = libxl__sprintf(gc, PCI_PT_QDEV_ID,
                                     pcidev->bus, pcidev->dev, pcidev->func);
 
     for (i = 0; (bus = libxl__json_array_get(response, i)); i++) {
@@ -731,7 +731,7 @@
 
 
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 
diff -r b5d6ed400122 -r 7e90178b8bbf tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Mon Dec 12 17:48:42 2011 +0000
+++ b/tools/libxl/libxl_utils.c	Mon Dec 12 17:48:42 2011 +0000
@@ -186,29 +186,29 @@
 
 int libxl_get_stubdom_id(libxl_ctx *ctx, int guest_domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char * stubdom_id_s;
     int ret;
 
-    stubdom_id_s = libxl__xs_read(&gc, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/image/device-model-domid",
-                                               libxl__xs_get_dompath(&gc, guest_domid)));
+    stubdom_id_s = libxl__xs_read(gc, XBT_NULL,
+                                 libxl__sprintf(gc, "%s/image/device-model-domid",
+                                               libxl__xs_get_dompath(gc, guest_domid)));
     if (stubdom_id_s)
         ret = atoi(stubdom_id_s);
     else
         ret = 0;
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
 int libxl_is_stubdom(libxl_ctx *ctx, uint32_t domid, uint32_t *target_domid)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     char *target, *endptr;
     uint32_t value;
     int ret = 0;
 
-    target = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/target", libxl__xs_get_dompath(&gc, domid)));
+    target = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/target", libxl__xs_get_dompath(gc, domid)));
     if (!target)
         goto out;
     value = strtol(target, &endptr, 10);
@@ -218,7 +218,7 @@
         *target_domid = value;
     ret = 1;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return ret;
 }
 
@@ -240,27 +240,27 @@
 
 int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    GC_INIT(ctx);
     struct stat stat_buf;
     char *logfile, *logfile_new;
     int i, rc;
 
-    logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log", name);
+    logfile = libxl__sprintf(gc, "/var/log/xen/%s.log", name);
     if (stat(logfile, &stat_buf) == 0) {
         /* file exists, rotate */
-        logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log.10", name);
+        logfile = libxl__sprintf(gc, "/var/log/xen/%s.log.10", name);
         unlink(logfile);
         for (i = 9; i > 0; i--) {
-            logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i);
-            logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i + 1);
-            rc = logrename(&gc, logfile, logfile_new);
+            logfile = libxl__sprintf(gc, "/var/log/xen/%s.log.%d", name, i);
+            logfile_new = libxl__sprintf(gc, "/var/log/xen/%s.log.%d", name, i + 1);
+            rc = logrename(gc, logfile, logfile_new);
             if (rc)
                 goto out;
         }
-        logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log", name);
-        logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.1", name);
+        logfile = libxl__sprintf(gc, "/var/log/xen/%s.log", name);
+        logfile_new = libxl__sprintf(gc, "/var/log/xen/%s.log.1", name);
 
-        rc = logrename(&gc, logfile, logfile_new);
+        rc = logrename(gc, logfile, logfile_new);
         if (rc)
             goto out;
     } else {
@@ -272,7 +272,7 @@
     *full_name = strdup(logfile);
     rc = 0;
 out:
-    libxl__free_all(&gc);
+    GC_FREE;
     return rc;
 }
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog

From xen-changelog-bounces@lists.xensource.com Tue Dec 13 16:11:27 2011
Return-path: <xen-changelog-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Tue, 13 Dec 2011 16:11:27 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-changelog-bounces@lists.xensource.com>)
	id 1RaUww-000498-GD; Tue, 13 Dec 2011 16:11:26 +0000
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1RaUwu-00045s-Ix
	for xen-changelog@lists.xensource.com; Tue, 13 Dec 2011 16:11:25 +0000
X-Env-Sender: xen@xenbits.xen.org
X-Msg-Ref: server-10.tower-21.messagelabs.com!1323792626!7804149!1
X-Originating-IP: [50.57.168.107]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10246 invoked from network); 13 Dec 2011 16:10:27 -0000
Received: from mail.xen.org (HELO mail.xen.org) (50.57.168.107)
	by server-10.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	13 Dec 2011 16:10:27 -0000
Received: from xenbits.xen.org ([50.57.170.242])
	by mail.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1RaV31-0001xY-OK
	for xen-changelog@lists.xensource.com; Tue, 13 Dec 2011 16:17:43 +0000
Received: from xen by xenbits.xen.org with local (Exim 4.72)
	(envelope-from <xen@xenbits.xen.org>) id 1RaUwi-0005pO-Up
	for xen-changelog@lists.xensource.com; Tue, 13 Dec 2011 16:11:12 +0000
Message-Id: <E1RaUwi-0005pO-Up@xenbits.xen.org>
Date: Tue, 13 Dec 2011 16:11:12 +0000
From: Xen patchbot-unstable <patchbot@xen.org>
To: xen-changelog@lists.xensource.com
Subject: [Xen-changelog] [xen-unstable] ACPI: update table interface headers
X-BeenThere: xen-changelog@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: xen-devel@lists.xensource.com
List-Id: BK change log <xen-changelog.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-changelog>, 
	<mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-changelog@lists.xensource.com>
List-Help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>,
	<mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-changelog-bounces@lists.xensource.com
Errors-To: xen-changelog-bounces@lists.xensource.com

# HG changeset patch
# User Jan Beulich <jbeulich@suse.com>
# Date 1323773288 -3600
# Node ID 028de9cd0466c6564c960219fdafe18a546b690a
# Parent  c2ff4cb6663431d95bf5cacb1d214d137741d8b3
ACPI: update table interface headers

... to what is being used on Linux 3.1 (and 3.2-rc).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
---


diff -r c2ff4cb66634 -r 028de9cd0466 xen/drivers/acpi/numa.c
--- a/xen/drivers/acpi/numa.c	Tue Dec 13 11:46:21 2011 +0100
+++ b/xen/drivers/acpi/numa.c	Tue Dec 13 11:48:08 2011 +0100
@@ -78,9 +78,11 @@
 			if (srat_rev < 2)
 				proximity_domain &= 0xff;
 			ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-					  "SRAT Memory (0x%016"PRIx64" length 0x%016"PRIx64" type 0x%x) in proximity domain %d %s%s\n",
+					  "SRAT Memory (%#016"PRIx64
+					  " length %#016"PRIx64")"
+					  " in proximity domain %d %s%s\n",
 					  p->base_address, p->length,
-					  p->memory_type, proximity_domain,
+					  proximity_domain,
 					  p->flags & ACPI_SRAT_MEM_ENABLED
 					  ? "enabled" : "disabled",
 					  p->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE
diff -r c2ff4cb66634 -r 028de9cd0466 xen/include/acpi/actbl.h
--- a/xen/include/acpi/actbl.h	Tue Dec 13 11:46:21 2011 +0100
+++ b/xen/include/acpi/actbl.h	Tue Dec 13 11:48:08 2011 +0100
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2007, R. Byron Moore
+ * Copyright (C) 2000 - 2011, Intel Corp.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,9 +44,23 @@
 #ifndef __ACTBL_H__
 #define __ACTBL_H__
 
+/*******************************************************************************
+ *
+ * Fundamental ACPI tables
+ *
+ * This file contains definitions for the ACPI tables that are directly consumed
+ * by ACPICA. All other tables are consumed by the OS-dependent ACPI-related
+ * device drivers and other OS support code.
+ *
+ * The RSDP and FACS do not use the common ACPI table header. All other ACPI
+ * tables use the header.
+ *
+ ******************************************************************************/
+
 /*
- * Values for description table header signatures. Useful because they make
- * it more difficult to inadvertently type in the wrong signature.
+ * Values for description table header signatures for tables defined in this
+ * file. Useful because they make it more difficult to inadvertently type in
+ * the wrong signature.
  */
 #define ACPI_SIG_DSDT           "DSDT"	/* Differentiated System Description Table */
 #define ACPI_SIG_FADT           "FACP"	/* Fixed ACPI Description Table */
@@ -65,11 +79,6 @@
 #pragma pack(1)
 
 /*
- * These are the ACPI tables that are directly consumed by the subsystem.
- *
- * The RSDP and FACS do not use the common ACPI table header. All other ACPI
- * tables use the header.
- *
  * Note about bitfields: The u8 type is used for bitfields in ACPI tables.
  * This is the only type that is even remotely portable. Anything else is not
  * portable, so do not use any other bitfield types.
@@ -77,9 +86,8 @@
 
 /*******************************************************************************
  *
- * ACPI Table Header. This common header is used by all tables except the
- * RSDP and FACS. The define is used for direct inclusion of header into
- * other ACPI tables
+ * Master ACPI Table Header. This common header is used by all ACPI tables
+ * except the RSDP and FACS.
  *
  ******************************************************************************/
 
@@ -95,13 +103,16 @@
 	u32 asl_compiler_revision;	/* ASL compiler version */
 };
 
-/*
+/*******************************************************************************
+ *
  * GAS - Generic Address Structure (ACPI 2.0+)
  *
  * Note: Since this structure is used in the ACPI tables, it is byte aligned.
- * If misalignment is not supported, access to the Address field must be
- * performed with care.
- */
+ * If misaliged access is not supported by the hardware, accesses to the
+ * 64-bit Address field must be performed with care.
+ *
+ ******************************************************************************/
+
 struct acpi_generic_address {
 	u8 space_id;		/* Address space where struct or register exists */
 	u8 bit_width;		/* Size in bits of given register */
@@ -113,6 +124,7 @@
 /*******************************************************************************
  *
  * RSDP - Root System Description Pointer (Signature is "RSD PTR ")
+ *        Version 2
  *
  ******************************************************************************/
 
@@ -133,6 +145,7 @@
 /*******************************************************************************
  *
  * RSDT/XSDT - Root System Description Tables
+ *             Version 1 (both)
  *
  ******************************************************************************/
 
@@ -161,21 +174,29 @@
 	u32 flags;
 	u64 xfirmware_waking_vector;	/* 64-bit version of the Firmware Waking Vector (ACPI 2.0+) */
 	u8 version;		/* Version of this table (ACPI 2.0+) */
-	u8 reserved[31];	/* Reserved, must be zero */
+	u8 reserved[3];		/* Reserved, must be zero */
+	u32 ospm_flags;		/* Flags to be set by OSPM (ACPI 4.0) */
+	u8 reserved1[24];	/* Reserved, must be zero */
 };
 
-/* Flag macros */
+/* Masks for global_lock flag field above */
 
-#define ACPI_FACS_S4_BIOS_PRESENT (1)	/* 00: S4BIOS support is present */
+#define ACPI_GLOCK_PENDING          (1)	/* 00: Pending global lock ownership */
+#define ACPI_GLOCK_OWNED            (1<<1)	/* 01: Global lock is owned */
 
-/* Global lock flags */
+/* Masks for Flags field above  */
 
-#define ACPI_GLOCK_PENDING      0x01	/* 00: Pending global lock ownership */
-#define ACPI_GLOCK_OWNED        0x02	/* 01: Global lock is owned */
+#define ACPI_FACS_S4_BIOS_PRESENT   (1)	/* 00: S4BIOS support is present */
+#define ACPI_FACS_64BIT_WAKE        (1<<1)	/* 01: 64-bit wake vector supported (ACPI 4.0) */
+
+/* Masks for ospm_flags field above */
+
+#define ACPI_FACS_64BIT_ENVIRONMENT (1)	/* 00: 64-bit wake environment is required (ACPI 4.0) */
 
 /*******************************************************************************
  *
  * FADT - Fixed ACPI Description Table (Signature "FACP")
+ *        Version 4
  *
  ******************************************************************************/
 
@@ -214,11 +235,11 @@
 	u16 flush_size;		/* Processor's memory cache line width, in bytes */
 	u16 flush_stride;	/* Number of flush strides that need to be read */
 	u8 duty_offset;		/* Processor duty cycle index in processor's P_CNT reg */
-	u8 duty_width;		/* Processor duty cycle value bit width in P_CNT register. */
+	u8 duty_width;		/* Processor duty cycle value bit width in P_CNT register */
 	u8 day_alarm;		/* Index to day-of-month alarm in RTC CMOS RAM */
 	u8 month_alarm;		/* Index to month-of-year alarm in RTC CMOS RAM */
 	u8 century;		/* Index to century in RTC CMOS RAM */
-	u16 boot_flags;		/* IA-PC Boot Architecture Flags. See Table 5-10 for description */
+	u16 boot_flags;		/* IA-PC Boot Architecture Flags (see below for individual flags) */
 	u8 reserved;		/* Reserved, must be zero */
 	u32 flags;		/* Miscellaneous flag bits (see below for individual flags) */
 	struct acpi_generic_address reset_register;	/* 64-bit address of the Reset register */
@@ -236,32 +257,41 @@
 	struct acpi_generic_address xgpe1_block;	/* 64-bit Extended General Purpose Event 1 Reg Blk address */
 };
 
-/* FADT flags */
+/* Masks for FADT Boot Architecture Flags (boot_flags) */
 
-#define ACPI_FADT_WBINVD            (1)	/* 00: The wbinvd instruction works properly */
-#define ACPI_FADT_WBINVD_FLUSH      (1<<1)	/* 01: The wbinvd flushes but does not invalidate */
-#define ACPI_FADT_C1_SUPPORTED      (1<<2)	/* 02: All processors support C1 state */
-#define ACPI_FADT_C2_MP_SUPPORTED   (1<<3)	/* 03: C2 state works on MP system */
-#define ACPI_FADT_POWER_BUTTON      (1<<4)	/* 04: Power button is handled as a generic feature */
-#define ACPI_FADT_SLEEP_BUTTON      (1<<5)	/* 05: Sleep button is handled as a generic feature, or  not present */
-#define ACPI_FADT_FIXED_RTC         (1<<6)	/* 06: RTC wakeup stat not in fixed register space */
-#define ACPI_FADT_S4_RTC_WAKE       (1<<7)	/* 07: RTC wakeup stat not possible from S4 */
-#define ACPI_FADT_32BIT_TIMER       (1<<8)	/* 08: tmr_val is 32 bits 0=24-bits */
-#define ACPI_FADT_DOCKING_SUPPORTED (1<<9)	/* 09: Docking supported */
-#define ACPI_FADT_RESET_REGISTER    (1<<10)	/* 10: System reset via the FADT RESET_REG supported */
-#define ACPI_FADT_SEALED_CASE       (1<<11)	/* 11: No internal expansion capabilities and case is sealed */
-#define ACPI_FADT_HEADLESS          (1<<12)	/* 12: No local video capabilities or local input devices */
-#define ACPI_FADT_SLEEP_TYPE        (1<<13)	/* 13: Must execute native instruction after writing  SLP_TYPx register */
-#define ACPI_FADT_PCI_EXPRESS_WAKE  (1<<14)	/* 14: System supports PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */
-#define ACPI_FADT_PLATFORM_CLOCK    (1<<15)	/* 15: OSPM should use platform-provided timer (ACPI 3.0) */
-#define ACPI_FADT_S4_RTC_VALID      (1<<16)	/* 16: Contents of RTC_STS valid after S4 wake (ACPI 3.0) */
-#define ACPI_FADT_REMOTE_POWER_ON   (1<<17)	/* 17: System is compatible with remote power on (ACPI 3.0) */
-#define ACPI_FADT_APIC_CLUSTER      (1<<18)	/* 18: All local APICs must use cluster model (ACPI 3.0) */
-#define ACPI_FADT_APIC_PHYSICAL     (1<<19)	/* 19: All local x_aPICs must use physical dest mode (ACPI 3.0) */
+#define ACPI_FADT_LEGACY_DEVICES    (1)  	/* 00: [V2] System has LPC or ISA bus devices */
+#define ACPI_FADT_8042              (1<<1)	/* 01: [V3] System has an 8042 controller on port 60/64 */
+#define ACPI_FADT_NO_VGA            (1<<2)	/* 02: [V4] It is not safe to probe for VGA hardware */
+#define ACPI_FADT_NO_MSI            (1<<3)	/* 03: [V4] Message Signaled Interrupts (MSI) must not be enabled */
+#define ACPI_FADT_NO_ASPM           (1<<4)	/* 04: [V4] PCIe ASPM control must not be enabled */
 
-/*
- * FADT Prefered Power Management Profiles
- */
+#define FADT2_REVISION_ID               3
+
+/* Masks for FADT flags */
+
+#define ACPI_FADT_WBINVD            (1)	/* 00: [V1] The wbinvd instruction works properly */
+#define ACPI_FADT_WBINVD_FLUSH      (1<<1)	/* 01: [V1] wbinvd flushes but does not invalidate caches */
+#define ACPI_FADT_C1_SUPPORTED      (1<<2)	/* 02: [V1] All processors support C1 state */
+#define ACPI_FADT_C2_MP_SUPPORTED   (1<<3)	/* 03: [V1] C2 state works on MP system */
+#define ACPI_FADT_POWER_BUTTON      (1<<4)	/* 04: [V1] Power button is handled as a control method device */
+#define ACPI_FADT_SLEEP_BUTTON      (1<<5)	/* 05: [V1] Sleep button is handled as a control method device */
+#define ACPI_FADT_FIXED_RTC         (1<<6)	/* 06: [V1] RTC wakeup status not in fixed register space */
+#define ACPI_FADT_S4_RTC_WAKE       (1<<7)	/* 07: [V1] RTC alarm can wake system from S4 */
+#define ACPI_FADT_32BIT_TIMER       (1<<8)	/* 08: [V1] ACPI timer width is 32-bit (0=24-bit) */
+#define ACPI_FADT_DOCKING_SUPPORTED (1<<9)	/* 09: [V1] Docking supported */
+#define ACPI_FADT_RESET_REGISTER    (1<<10)	/* 10: [V2] System reset via the FADT RESET_REG supported */
+#define ACPI_FADT_SEALED_CASE       (1<<11)	/* 11: [V3] No internal expansion capabilities and case is sealed */
+#define ACPI_FADT_HEADLESS          (1<<12)	/* 12: [V3] No local video capabilities or local input devices */
+#define ACPI_FADT_SLEEP_TYPE        (1<<13)	/* 13: [V3] Must execute native instruction after writing  SLP_TYPx register */
+#define ACPI_FADT_PCI_EXPRESS_WAKE  (1<<14)	/* 14: [V4] System supports PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */
+#define ACPI_FADT_PLATFORM_CLOCK    (1<<15)	/* 15: [V4] OSPM should use platform-provided timer (ACPI 3.0) */
+#define ACPI_FADT_S4_RTC_VALID      (1<<16)	/* 16: [V4] Contents of RTC_STS valid after S4 wake (ACPI 3.0) */
+#define ACPI_FADT_REMOTE_POWER_ON   (1<<17)	/* 17: [V4] System is compatible with remote power on (ACPI 3.0) */
+#define ACPI_FADT_APIC_CLUSTER      (1<<18)	/* 18: [V4] All local APICs must use cluster model (ACPI 3.0) */
+#define ACPI_FADT_APIC_PHYSICAL     (1<<19)	/* 19: [V4] All local x_aPICs must use physical dest mode (ACPI 3.0) */
+
+/* Values for preferred_profile (Preferred Power Management Profiles) */
+
 enum acpi_prefered_pm_profiles {
 	PM_UNSPECIFIED = 0,
 	PM_DESKTOP = 1,
@@ -272,15 +302,6 @@
 	PM_APPLIANCE_PC = 6
 };
 
-/* FADT Boot Arch Flags */
-
-#define BAF_LEGACY_DEVICES              0x0001
-#define BAF_8042_KEYBOARD_CONTROLLER    0x0002
-#define BAF_MSI_NOT_SUPPORTED           0x0008
-
-#define FADT2_REVISION_ID               3
-#define FADT2_MINUS_REVISION_ID         2
-
 /* Reset to default packing */
 
 #pragma pack()
@@ -292,5 +313,22 @@
  */
 
 #include <acpi/actbl1.h>
+#include <acpi/actbl2.h>
+
+/*
+ * Sizes of the various flavors of FADT. We need to look closely
+ * at the FADT length because the version number essentially tells
+ * us nothing because of many BIOS bugs where the version does not
+ * match the expected length. In other words, the length of the
+ * FADT is the bottom line as to what the version really is.
+ *
+ * For reference, the values below are as follows:
+ *     FADT V1  size: 0x74
+ *     FADT V2  size: 0x84
+ *     FADT V3+ size: 0xF4
+ */
+#define ACPI_FADT_V1_SIZE       (u32) (ACPI_FADT_OFFSET (flags) + 4)
+#define ACPI_FADT_V2_SIZE       (u32) (ACPI_FADT_OFFSET (reserved4[0]) + 3)
+#define ACPI_FADT_V3_SIZE       (u32) (sizeof (struct acpi_table_fadt))
 
 #endif				/* __ACTBL_H__ */
diff -r c2ff4cb66634 -r 028de9cd0466 xen/include/acpi/actbl1.h
--- a/xen/include/acpi/actbl1.h	Tue Dec 13 11:46:21 2011 +0100
+++ b/xen/include/acpi/actbl1.h	Tue Dec 13 11:48:08 2011 +0100
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2007, R. Byron Moore
+ * Copyright (C) 2000 - 2011, Intel Corp.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -46,34 +46,31 @@
 
 /*******************************************************************************
  *
- * Additional ACPI Tables
+ * Additional ACPI Tables (1)
  *
  * These tables are not consumed directly by the ACPICA subsystem, but are
  * included here to support device drivers and the AML disassembler.
  *
+ * The tables in this file are fully defined within the ACPI specification.
+ *
  ******************************************************************************/
 
 /*
- * Values for description table header signatures. Useful because they make
- * it more difficult to inadvertently type in the wrong signature.
+ * Values for description table header signatures for tables defined in this
+ * file. Useful because they make it more difficult to inadvertently type in
+ * the wrong signature.
  */
-#define ACPI_SIG_ASF            "ASF!"	/* Alert Standard Format table */
-#define ACPI_SIG_BOOT           "BOOT"	/* Simple Boot Flag Table */
+#define ACPI_SIG_BERT           "BERT"	/* Boot Error Record Table */
 #define ACPI_SIG_CPEP           "CPEP"	/* Corrected Platform Error Polling table */
-#define ACPI_SIG_ERST           "ERST"  /* Error Record Serialization Table */
-#define ACPI_SIG_DBGP           "DBGP"	/* Debug Port table */
-#define ACPI_SIG_DMAR           "DMAR"	/* DMA Remapping table */
 #define ACPI_SIG_ECDT           "ECDT"	/* Embedded Controller Boot Resources Table */
-#define ACPI_SIG_HPET           "HPET"	/* High Precision Event Timer table */
+#define ACPI_SIG_EINJ           "EINJ"	/* Error Injection table */
+#define ACPI_SIG_ERST           "ERST"	/* Error Record Serialization Table */
+#define ACPI_SIG_HEST           "HEST"	/* Hardware Error Source Table */
 #define ACPI_SIG_MADT           "APIC"	/* Multiple APIC Description Table */
-#define ACPI_SIG_MCFG           "MCFG"	/* PCI Memory Mapped Configuration table */
+#define ACPI_SIG_MSCT           "MSCT"	/* Maximum System Characteristics Table */
 #define ACPI_SIG_SBST           "SBST"	/* Smart Battery Specification Table */
 #define ACPI_SIG_SLIT           "SLIT"	/* System Locality Distance Information Table */
-#define ACPI_SIG_SPCR           "SPCR"	/* Serial Port Console Redirection table */
-#define ACPI_SIG_SPMI           "SPMI"	/* Server Platform Management Interface table */
 #define ACPI_SIG_SRAT           "SRAT"	/* System Resource Affinity Table */
-#define ACPI_SIG_TCPA           "TCPA"	/* Trusted Computing Platform Alliance table */
-#define ACPI_SIG_WDRT           "WDRT"	/* Watchdog Resource Table */
 
 /*
  * All tables must be byte-packed to match the ACPI specification, since
@@ -87,7 +84,13 @@
  * portable, so do not use any other bitfield types.
  */
 
-/* Common Sub-table header (used in MADT, SRAT, etc.) */
+/*******************************************************************************
+ *
+ * Common subtable headers
+ *
+ ******************************************************************************/
+
+/* Generic subtable header (used in MADT, SRAT, etc.) */
 
 struct acpi_subtable_header {
 	u8 type;
@@ -108,128 +111,54 @@
 
 /*******************************************************************************
  *
- * ASF - Alert Standard Format table (Signature "ASF!")
- *
- * Conforms to the Alert Standard Format Specification V2.0, 23 April 2003
+ * BERT - Boot Error Record Table (ACPI 4.0)
+ *        Version 1
  *
  ******************************************************************************/
 
-struct acpi_table_asf {
+struct acpi_table_bert {
 	struct acpi_table_header header;	/* Common ACPI table header */
+	u32 region_length;	/* Length of the boot error region */
+	u64 address;		/* Physical address of the error region */
 };
 
-/* ASF subtable header */
+/* Boot Error Region (not a subtable, pointed to by Address field above) */
 
-struct acpi_asf_header {
-	u8 type;
-	u8 reserved;
-	u16 length;
+struct acpi_bert_region {
+	u32 block_status;	/* Type of error information */
+	u32 raw_data_offset;	/* Offset to raw error data */
+	u32 raw_data_length;	/* Length of raw error data */
+	u32 data_length;	/* Length of generic error data */
+	u32 error_severity;	/* Severity code */
 };
 
-/* Values for Type field above */
+/* Values for block_status flags above */
 
-enum acpi_asf_type {
-	ACPI_ASF_TYPE_INFO = 0,
-	ACPI_ASF_TYPE_ALERT = 1,
-	ACPI_ASF_TYPE_CONTROL = 2,
-	ACPI_ASF_TYPE_BOOT = 3,
-	ACPI_ASF_TYPE_ADDRESS = 4,
-	ACPI_ASF_TYPE_RESERVED = 5
+#define ACPI_BERT_UNCORRECTABLE             (1)
+#define ACPI_BERT_CORRECTABLE               (1<<1)
+#define ACPI_BERT_MULTIPLE_UNCORRECTABLE    (1<<2)
+#define ACPI_BERT_MULTIPLE_CORRECTABLE      (1<<3)
+#define ACPI_BERT_ERROR_ENTRY_COUNT         (0xFF<<4)	/* 8 bits, error count */
+
+/* Values for error_severity above */
+
+enum acpi_bert_error_severity {
+	ACPI_BERT_ERROR_CORRECTABLE = 0,
+	ACPI_BERT_ERROR_FATAL = 1,
+	ACPI_BERT_ERROR_CORRECTED = 2,
+	ACPI_BERT_ERROR_NONE = 3,
+	ACPI_BERT_ERROR_RESERVED = 4	/* 4 and greater are reserved */
 };
 
 /*
- * ASF subtables
+ * Note: The generic error data that follows the error_severity field above
+ * uses the struct acpi_hest_generic_data defined under the HEST table below
  */
 
-/* 0: ASF Information */
-
-struct acpi_asf_info {
-	struct acpi_asf_header header;
-	u8 min_reset_value;
-	u8 min_poll_interval;
-	u16 system_id;
-	u32 mfg_id;
-	u8 flags;
-	u8 reserved2[3];
-};
-
-/* 1: ASF Alerts */
-
-struct acpi_asf_alert {
-	struct acpi_asf_header header;
-	u8 assert_mask;
-	u8 deassert_mask;
-	u8 alerts;
-	u8 data_length;
-};
-
-struct acpi_asf_alert_data {
-	u8 address;
-	u8 command;
-	u8 mask;
-	u8 value;
-	u8 sensor_type;
-	u8 type;
-	u8 offset;
-	u8 source_type;
-	u8 severity;
-	u8 sensor_number;
-	u8 entity;
-	u8 instance;
-};
-
-/* 2: ASF Remote Control */
-
-struct acpi_asf_remote {
-	struct acpi_asf_header header;
-	u8 controls;
-	u8 data_length;
-	u16 reserved2;
-};
-
-struct acpi_asf_control_data {
-	u8 function;
-	u8 address;
-	u8 command;
-	u8 value;
-};
-
-/* 3: ASF RMCP Boot Options */
-
-struct acpi_asf_rmcp {
-	struct acpi_asf_header header;
-	u8 capabilities[7];
-	u8 completion_code;
-	u32 enterprise_id;
-	u8 command;
-	u16 parameter;
-	u16 boot_options;
-	u16 oem_parameters;
-};
-
-/* 4: ASF Address */
-
-struct acpi_asf_address {
-	struct acpi_asf_header header;
-	u8 eprom_address;
-	u8 devices;
-};
-
 /*******************************************************************************
  *
- * BOOT - Simple Boot Flag Table
- *
- ******************************************************************************/
-
-struct acpi_table_boot {
-	struct acpi_table_header header;	/* Common ACPI table header */
-	u8 cmos_index;		/* Index in CMOS RAM for the boot register */
-	u8 reserved[3];
-};
-
-/*******************************************************************************
- *
- * CPEP - Corrected Platform Error Polling table
+ * CPEP - Corrected Platform Error Polling table (ACPI 4.0)
+ *        Version 1
  *
  ******************************************************************************/
 
@@ -241,8 +170,7 @@
 /* Subtable */
 
 struct acpi_cpep_polling {
-	u8 type;
-	u8 length;
+	struct acpi_subtable_header header;
 	u8 id;			/* Processor ID */
 	u8 eid;			/* Processor EID */
 	u32 interval;		/* Polling interval (msec) */
@@ -250,105 +178,8 @@
 
 /*******************************************************************************
  *
- * DBGP - Debug Port table
- *
- ******************************************************************************/
-
-struct acpi_table_dbgp {
-	struct acpi_table_header header;	/* Common ACPI table header */
-	u8 type;		/* 0=full 16550, 1=subset of 16550 */
-	u8 reserved[3];
-	struct acpi_generic_address debug_port;
-};
-
-/*******************************************************************************
- *
- * DMAR - DMA Remapping table
- *
- ******************************************************************************/
-
-struct acpi_table_dmar {
-	struct acpi_table_header header;	/* Common ACPI table header */
-	u8 width;		/* Host Address Width */
-	u8 flags;
-	u8 reserved[10];
-};
-
-/* DMAR subtable header */
-
-struct acpi_dmar_header {
-	u16 type;
-	u16 length;
-};
-
-/* Values for subtable type in struct acpi_dmar_header */
-
-enum acpi_dmar_type {
-	ACPI_DMAR_TYPE_HARDWARE_UNIT = 0,
-	ACPI_DMAR_TYPE_RESERVED_MEMORY = 1,
-	ACPI_DMAR_TYPE_ATSR = 2,
-	ACPI_DMAR_TYPE_RESERVED = 3	/* 3 and greater are reserved */
-};
-
-struct acpi_dmar_device_scope {
-	u8 entry_type;
-	u8 length;
-	u16 reserved;
-	u8 enumeration_id;
-	u8 bus;
-};
-
-/* Values for entry_type in struct acpi_dmar_device_scope */
-
-enum acpi_dmar_scope_type {
-	ACPI_DMAR_SCOPE_TYPE_NOT_USED = 0,
-	ACPI_DMAR_SCOPE_TYPE_ENDPOINT = 1,
-	ACPI_DMAR_SCOPE_TYPE_BRIDGE = 2,
-	ACPI_DMAR_SCOPE_TYPE_IOAPIC = 3,
-	ACPI_DMAR_SCOPE_TYPE_HPET = 4,
-	ACPI_DMAR_SCOPE_TYPE_RESERVED = 5	/* 5 and greater are reserved */
-};
-
-struct acpi_dmar_pci_path {
-	u8 dev;
-	u8 fn;
-};
-
-/*
- * DMAR Sub-tables, correspond to Type in struct acpi_dmar_header
- */
-
-/* 0: Hardware Unit Definition */
-
-struct acpi_dmar_hardware_unit {
-	struct acpi_dmar_header header;
-	u8 flags;
-	u8 reserved;
-	u16 segment;
-	u64 address;		/* Register Base Address */
-};
-
-/* Flags */
-
-#define ACPI_DMAR_INCLUDE_ALL       (1)
-
-/* 1: Reserved Memory Defininition */
-
-struct acpi_dmar_reserved_memory {
-	struct acpi_dmar_header header;
-	u16 reserved;
-	u16 segment;
-	u64 base_address;		/* 4_k aligned base address */
-	u64 end_address;	/* 4_k aligned limit address */
-};
-
-/* Flags */
-
-#define ACPI_DMAR_ALLOW_ALL         (1)
-
-/*******************************************************************************
- *
  * ECDT - Embedded Controller Boot Resources Table
+ *        Version 1
  *
  ******************************************************************************/
 
@@ -363,6 +194,90 @@
 
 /*******************************************************************************
  *
+ * EINJ - Error Injection Table (ACPI 4.0)
+ *        Version 1
+ *
+ ******************************************************************************/
+
+struct acpi_table_einj {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u32 header_length;
+	u8 flags;
+	u8 reserved[3];
+	u32 entries;
+};
+
+/* EINJ Injection Instruction Entries (actions) */
+
+struct acpi_einj_entry {
+	struct acpi_whea_header whea_header;	/* Common header for WHEA tables */
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_EINJ_PRESERVE          (1)
+
+/* Values for Action field above */
+
+enum acpi_einj_actions {
+	ACPI_EINJ_BEGIN_OPERATION = 0,
+	ACPI_EINJ_GET_TRIGGER_TABLE = 1,
+	ACPI_EINJ_SET_ERROR_TYPE = 2,
+	ACPI_EINJ_GET_ERROR_TYPE = 3,
+	ACPI_EINJ_END_OPERATION = 4,
+	ACPI_EINJ_EXECUTE_OPERATION = 5,
+	ACPI_EINJ_CHECK_BUSY_STATUS = 6,
+	ACPI_EINJ_GET_COMMAND_STATUS = 7,
+	ACPI_EINJ_ACTION_RESERVED = 8,	/* 8 and greater are reserved */
+	ACPI_EINJ_TRIGGER_ERROR = 0xFF	/* Except for this value */
+};
+
+/* Values for Instruction field above */
+
+enum acpi_einj_instructions {
+	ACPI_EINJ_READ_REGISTER = 0,
+	ACPI_EINJ_READ_REGISTER_VALUE = 1,
+	ACPI_EINJ_WRITE_REGISTER = 2,
+	ACPI_EINJ_WRITE_REGISTER_VALUE = 3,
+	ACPI_EINJ_NOOP = 4,
+	ACPI_EINJ_INSTRUCTION_RESERVED = 5	/* 5 and greater are reserved */
+};
+
+/* EINJ Trigger Error Action Table */
+
+struct acpi_einj_trigger {
+	u32 header_size;
+	u32 revision;
+	u32 table_size;
+	u32 entry_count;
+};
+
+/* Command status return values */
+
+enum acpi_einj_command_status {
+	ACPI_EINJ_SUCCESS = 0,
+	ACPI_EINJ_FAILURE = 1,
+	ACPI_EINJ_INVALID_ACCESS = 2,
+	ACPI_EINJ_STATUS_RESERVED = 3	/* 3 and greater are reserved */
+};
+
+/* Error types returned from ACPI_EINJ_GET_ERROR_TYPE (bitfield) */
+
+#define ACPI_EINJ_PROCESSOR_CORRECTABLE     (1)
+#define ACPI_EINJ_PROCESSOR_UNCORRECTABLE   (1<<1)
+#define ACPI_EINJ_PROCESSOR_FATAL           (1<<2)
+#define ACPI_EINJ_MEMORY_CORRECTABLE        (1<<3)
+#define ACPI_EINJ_MEMORY_UNCORRECTABLE      (1<<4)
+#define ACPI_EINJ_MEMORY_FATAL              (1<<5)
+#define ACPI_EINJ_PCIX_CORRECTABLE          (1<<6)
+#define ACPI_EINJ_PCIX_UNCORRECTABLE        (1<<7)
+#define ACPI_EINJ_PCIX_FATAL                (1<<8)
+#define ACPI_EINJ_PLATFORM_CORRECTABLE      (1<<9)
+#define ACPI_EINJ_PLATFORM_UNCORRECTABLE    (1<<10)
+#define ACPI_EINJ_PLATFORM_FATAL            (1<<11)
+
+/*******************************************************************************
+ *
  * ERST - Error Record Serialization Table (ACPI 4.0)
  *        Version 1
  *
@@ -453,30 +368,237 @@
 
 /*******************************************************************************
  *
- * HPET - High Precision Event Timer table
+ * HEST - Hardware Error Source Table (ACPI 4.0)
+ *        Version 1
  *
  ******************************************************************************/
 
-struct acpi_table_hpet {
+struct acpi_table_hest {
 	struct acpi_table_header header;	/* Common ACPI table header */
-	u32 id;			/* Hardware ID of event timer block */
-	struct acpi_generic_address address;	/* Address of event timer block */
-	u8 sequence;		/* HPET sequence number */
-	u16 minimum_tick;	/* Main counter min tick, periodic mode */
-	u8 flags;
+	u32 error_source_count;
 };
 
-/*! Flags */
+/* HEST subtable header */
 
-#define ACPI_HPET_PAGE_PROTECT      (1)	/* 00: No page protection */
-#define ACPI_HPET_PAGE_PROTECT_4    (1<<1)	/* 01: 4KB page protected */
-#define ACPI_HPET_PAGE_PROTECT_64   (1<<2)	/* 02: 64KB page protected */
+struct acpi_hest_header {
+	u16 type;
+	u16 source_id;
+};
 
-/*! [End] no source code translation !*/
+/* Values for Type field above for subtables */
+
+enum acpi_hest_types {
+	ACPI_HEST_TYPE_IA32_CHECK = 0,
+	ACPI_HEST_TYPE_IA32_CORRECTED_CHECK = 1,
+	ACPI_HEST_TYPE_IA32_NMI = 2,
+	ACPI_HEST_TYPE_NOT_USED3 = 3,
+	ACPI_HEST_TYPE_NOT_USED4 = 4,
+	ACPI_HEST_TYPE_NOT_USED5 = 5,
+	ACPI_HEST_TYPE_AER_ROOT_PORT = 6,
+	ACPI_HEST_TYPE_AER_ENDPOINT = 7,
+	ACPI_HEST_TYPE_AER_BRIDGE = 8,
+	ACPI_HEST_TYPE_GENERIC_ERROR = 9,
+	ACPI_HEST_TYPE_RESERVED = 10	/* 10 and greater are reserved */
+};
+
+/*
+ * HEST substructures contained in subtables
+ */
+
+/*
+ * IA32 Error Bank(s) - Follows the struct acpi_hest_ia_machine_check and
+ * struct acpi_hest_ia_corrected structures.
+ */
+struct acpi_hest_ia_error_bank {
+	u8 bank_number;
+	u8 clear_status_on_init;
+	u8 status_format;
+	u8 reserved;
+	u32 control_register;
+	u64 control_data;
+	u32 status_register;
+	u32 address_register;
+	u32 misc_register;
+};
+
+/* Common HEST sub-structure for PCI/AER structures below (6,7,8) */
+
+struct acpi_hest_aer_common {
+	u16 reserved1;
+	u8 flags;
+	u8 enabled;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	u32 bus;
+	u16 device;
+	u16 function;
+	u16 device_control;
+	u16 reserved2;
+	u32 uncorrectable_mask;
+	u32 uncorrectable_severity;
+	u32 correctable_mask;
+	u32 advanced_capabilities;
+};
+
+/* Masks for HEST Flags fields */
+
+#define ACPI_HEST_FIRMWARE_FIRST        (1)
+#define ACPI_HEST_GLOBAL                (1<<1)
+
+/* Hardware Error Notification */
+
+struct acpi_hest_notify {
+	u8 type;
+	u8 length;
+	u16 config_write_enable;
+	u32 poll_interval;
+	u32 vector;
+	u32 polling_threshold_value;
+	u32 polling_threshold_window;
+	u32 error_threshold_value;
+	u32 error_threshold_window;
+};
+
+/* Values for Notify Type field above */
+
+enum acpi_hest_notify_types {
+	ACPI_HEST_NOTIFY_POLLED = 0,
+	ACPI_HEST_NOTIFY_EXTERNAL = 1,
+	ACPI_HEST_NOTIFY_LOCAL = 2,
+	ACPI_HEST_NOTIFY_SCI = 3,
+	ACPI_HEST_NOTIFY_NMI = 4,
+	ACPI_HEST_NOTIFY_RESERVED = 5	/* 5 and greater are reserved */
+};
+
+/* Values for config_write_enable bitfield above */
+
+#define ACPI_HEST_TYPE                  (1)
+#define ACPI_HEST_POLL_INTERVAL         (1<<1)
+#define ACPI_HEST_POLL_THRESHOLD_VALUE  (1<<2)
+#define ACPI_HEST_POLL_THRESHOLD_WINDOW (1<<3)
+#define ACPI_HEST_ERR_THRESHOLD_VALUE   (1<<4)
+#define ACPI_HEST_ERR_THRESHOLD_WINDOW  (1<<5)
+
+/*
+ * HEST subtables
+ */
+
+/* 0: IA32 Machine Check Exception */
+
+struct acpi_hest_ia_machine_check {
+	struct acpi_hest_header header;
+	u16 reserved1;
+	u8 flags;
+	u8 enabled;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	u64 global_capability_data;
+	u64 global_control_data;
+	u8 num_hardware_banks;
+	u8 reserved3[7];
+};
+
+/* 1: IA32 Corrected Machine Check */
+
+struct acpi_hest_ia_corrected {
+	struct acpi_hest_header header;
+	u16 reserved1;
+	u8 flags;
+	u8 enabled;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	struct acpi_hest_notify notify;
+	u8 num_hardware_banks;
+	u8 reserved2[3];
+};
+
+/* 2: IA32 Non-Maskable Interrupt */
+
+struct acpi_hest_ia_nmi {
+	struct acpi_hest_header header;
+	u32 reserved;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	u32 max_raw_data_length;
+};
+
+/* 3,4,5: Not used */
+
+/* 6: PCI Express Root Port AER */
+
+struct acpi_hest_aer_root {
+	struct acpi_hest_header header;
+	struct acpi_hest_aer_common aer;
+	u32 root_error_command;
+};
+
+/* 7: PCI Express AER (AER Endpoint) */
+
+struct acpi_hest_aer {
+	struct acpi_hest_header header;
+	struct acpi_hest_aer_common aer;
+};
+
+/* 8: PCI Express/PCI-X Bridge AER */
+
+struct acpi_hest_aer_bridge {
+	struct acpi_hest_header header;
+	struct acpi_hest_aer_common aer;
+	u32 uncorrectable_mask2;
+	u32 uncorrectable_severity2;
+	u32 advanced_capabilities2;
+};
+
+/* 9: Generic Hardware Error Source */
+
+struct acpi_hest_generic {
+	struct acpi_hest_header header;
+	u16 related_source_id;
+	u8 reserved;
+	u8 enabled;
+	u32 records_to_preallocate;
+	u32 max_sections_per_record;
+	u32 max_raw_data_length;
+	struct acpi_generic_address error_status_address;
+	struct acpi_hest_notify notify;
+	u32 error_block_length;
+};
+
+/* Generic Error Status block */
+
+struct acpi_hest_generic_status {
+	u32 block_status;
+	u32 raw_data_offset;
+	u32 raw_data_length;
+	u32 data_length;
+	u32 error_severity;
+};
+
+/* Values for block_status flags above */
+
+#define ACPI_HEST_UNCORRECTABLE             (1)
+#define ACPI_HEST_CORRECTABLE               (1<<1)
+#define ACPI_HEST_MULTIPLE_UNCORRECTABLE    (1<<2)
+#define ACPI_HEST_MULTIPLE_CORRECTABLE      (1<<3)
+#define ACPI_HEST_ERROR_ENTRY_COUNT         (0xFF<<4)	/* 8 bits, error count */
+
+/* Generic Error Data entry */
+
+struct acpi_hest_generic_data {
+	u8 section_type[16];
+	u32 error_severity;
+	u16 revision;
+	u8 validation_bits;
+	u8 flags;
+	u32 error_data_length;
+	u8 fru_id[16];
+	u8 fru_text[20];
+};
 
 /*******************************************************************************
  *
  * MADT - Multiple APIC Description Table
+ *        Version 3
  *
  ******************************************************************************/
 
@@ -486,7 +608,7 @@
 	u32 flags;
 };
 
-/* Flags */
+/* Masks for Flags field above */
 
 #define ACPI_MADT_PCAT_COMPAT       (1)	/* 00:    System also has dual 8259s */
 
@@ -495,7 +617,7 @@
 #define ACPI_MADT_DUAL_PIC          0
 #define ACPI_MADT_MULTIPLE_APIC     1
 
-/* Values for subtable type in struct acpi_subtable_header */
+/* Values for MADT subtable type in struct acpi_subtable_header */
 
 enum acpi_madt_type {
 	ACPI_MADT_TYPE_LOCAL_APIC = 0,
@@ -606,7 +728,7 @@
 	u32 flags;		/* Interrupt Source Flags */
 };
 
-/* Flags field above */
+/* Masks for Flags field above */
 
 #define ACPI_MADT_CPEI_OVERRIDE     (1)
 
@@ -615,9 +737,9 @@
 struct acpi_madt_local_x2apic {
 	struct acpi_subtable_header header;
 	u16 reserved;		/* Reserved - must be zero */
-	u32 local_apic_id;	/* Processor X2_APIC ID  */
+	u32 local_apic_id;	/* Processor x2APIC ID  */
 	u32 lapic_flags;
-	u32 uid;		/* Extended X2_APIC processor ID */
+	u32 uid;		/* ACPI processor UID */
 };
 
 /* 10: Local X2APIC NMI (ACPI 4.0) */
@@ -625,7 +747,7 @@
 struct acpi_madt_local_x2apic_nmi {
 	struct acpi_subtable_header header;
 	u16 inti_flags;
-	u32 uid;		/* Processor X2_APIC ID */
+	u32 uid;		/* ACPI processor UID */
 	u8 lint;		/* LINTn to which NMI is connected */
 	u8 reserved[3];
 };
@@ -657,28 +779,34 @@
 
 /*******************************************************************************
  *
- * MCFG - PCI Memory Mapped Configuration table and sub-table
+ * MSCT - Maximum System Characteristics Table (ACPI 4.0)
+ *        Version 1
  *
  ******************************************************************************/
 
-struct acpi_table_mcfg {
+struct acpi_table_msct {
 	struct acpi_table_header header;	/* Common ACPI table header */
-	u8 reserved[8];
+	u32 proximity_offset;	/* Location of proximity info struct(s) */
+	u32 max_proximity_domains;	/* Max number of proximity domains */
+	u32 max_clock_domains;	/* Max number of clock domains */
+	u64 max_address;	/* Max physical address in system */
 };
 
-/* Subtable */
+/* Subtable - Maximum Proximity Domain Information. Version 1 */
 
-struct acpi_mcfg_allocation {
-	u64 address;		/* Base address, processor-relative */
-	u16 pci_segment;	/* PCI segment group number */
-	u8 start_bus_number;	/* Starting PCI Bus number */
-	u8 end_bus_number;	/* Final PCI Bus number */
-	u32 reserved;
+struct acpi_msct_proximity {
+	u8 revision;
+	u8 length;
+	u32 range_start;	/* Start of domain range */
+	u32 range_end;		/* End of domain range */
+	u32 processor_capacity;
+	u64 memory_capacity;	/* In bytes */
 };
 
 /*******************************************************************************
  *
  * SBST - Smart Battery Specification Table
+ *        Version 1
  *
  ******************************************************************************/
 
@@ -692,6 +820,7 @@
 /*******************************************************************************
  *
  * SLIT - System Locality Distance Information Table
+ *        Version 1
  *
  ******************************************************************************/
 
@@ -703,60 +832,8 @@
 
 /*******************************************************************************
  *
- * SPCR - Serial Port Console Redirection table
- *
- ******************************************************************************/
-
-struct acpi_table_spcr {
-	struct acpi_table_header header;	/* Common ACPI table header */
-	u8 interface_type;	/* 0=full 16550, 1=subset of 16550 */
-	u8 reserved[3];
-	struct acpi_generic_address serial_port;
-	u8 interrupt_type;
-	u8 pc_interrupt;
-	u32 interrupt;
-	u8 baud_rate;
-	u8 parity;
-	u8 stop_bits;
-	u8 flow_control;
-	u8 terminal_type;
-	u8 reserved1;
-	u16 pci_device_id;
-	u16 pci_vendor_id;
-	u8 pci_bus;
-	u8 pci_device;
-	u8 pci_function;
-	u32 pci_flags;
-	u8 pci_segment;
-	u32 reserved2;
-};
-
-/*******************************************************************************
- *
- * SPMI - Server Platform Management Interface table
- *
- ******************************************************************************/
-
-struct acpi_table_spmi {
-	struct acpi_table_header header;	/* Common ACPI table header */
-	u8 reserved;
-	u8 interface_type;
-	u16 spec_revision;	/* Version of IPMI */
-	u8 interrupt_type;
-	u8 gpe_number;		/* GPE assigned */
-	u8 reserved1;
-	u8 pci_device_flag;
-	u32 interrupt;
-	struct acpi_generic_address ipmi_register;
-	u8 pci_segment;
-	u8 pci_bus;
-	u8 pci_device;
-	u8 pci_function;
-};
-
-/*******************************************************************************
- *
  * SRAT - System Resource Affinity Table
+ *        Version 3
  *
  ******************************************************************************/
 
@@ -775,7 +852,9 @@
 	ACPI_SRAT_TYPE_RESERVED = 3	/* 3 and greater are reserved */
 };
 
-/* SRAT sub-tables */
+/*
+ * SRAT Sub-tables, correspond to Type in struct acpi_subtable_header
+ */
 
 /* 0: Processor Local APIC/SAPIC Affinity */
 
@@ -789,6 +868,10 @@
 	u32 reserved;		/* Reserved, must be zero */
 };
 
+/* Flags */
+
+#define ACPI_SRAT_CPU_USE_AFFINITY  (1)	/* 00: Use affinity structure */
+
 /* 1: Memory Affinity */
 
 struct acpi_srat_mem_affinity {
@@ -797,9 +880,9 @@
 	u16 reserved;		/* Reserved, must be zero */
 	u64 base_address;
 	u64 length;
-	u32 memory_type;	/* See acpi_address_range_id */
+	u32 reserved1;
 	u32 flags;
-	u64 reserved1;		/* Reserved, must be zero */
+	u64 reserved2;		/* Reserved, must be zero */
 };
 
 /* Flags */
@@ -824,44 +907,6 @@
 
 #define ACPI_SRAT_CPU_ENABLED       (1)	/* 00: Use affinity structure */
 
-/*******************************************************************************
- *
- * TCPA - Trusted Computing Platform Alliance table
- *
- ******************************************************************************/
-
-struct acpi_table_tcpa {
-	struct acpi_table_header header;	/* Common ACPI table header */
-	u16 reserved;
-	u32 max_log_length;	/* Maximum length for the event log area */
-	u64 log_address;	/* Address of the event log area */
-};
-
-/*******************************************************************************
- *
- * WDRT - Watchdog Resource Table
- *
- ******************************************************************************/
-
-struct acpi_table_wdrt {
-	struct acpi_table_header header;	/* Common ACPI table header */
-	u32 header_length;	/* Watchdog Header Length */
-	u8 pci_segment;		/* PCI Segment number */
-	u8 pci_bus;		/* PCI Bus number */
-	u8 pci_device;		/* PCI Device number */
-	u8 pci_function;	/* PCI Function number */
-	u32 timer_period;	/* Period of one timer count (msec) */
-	u32 max_count;		/* Maximum counter value supported */
-	u32 min_count;		/* Minimum counter value */
-	u8 flags;
-	u8 reserved[3];
-	u32 entries;		/* Number of watchdog entries that follow */
-};
-
-/* Flags */
-
-#define ACPI_WDRT_TIMER_ENABLED     (1)	/* 00: Timer enabled */
-
 /* Reset to default packing */
 
 #pragma pack()
diff -r c2ff4cb66634 -r 028de9cd0466 xen/include/acpi/actbl2.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/acpi/actbl2.h	Tue Dec 13 11:48:08 2011 +0100
@@ -0,0 +1,1050 @@
+/******************************************************************************
+ *
+ * Name: actbl2.h - ACPI Table Definitions (tables not in ACPI spec)
+ *
+ *****************************************************************************/
+
+/*
+ * Copyright (C) 2000 - 2011, Intel Corp.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    substantially similar to the "NO WARRANTY" disclaimer below
+ *    ("Disclaimer") and any redistribution must be conditioned upon
+ *    including a substantially similar Disclaimer requirement for further
+ *    binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ *    of any contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ */
+
+#ifndef __ACTBL2_H__
+#define __ACTBL2_H__
+
+/*******************************************************************************
+ *
+ * Additional ACPI Tables (2)
+ *
+ * These tables are not consumed directly by the ACPICA subsystem, but are
+ * included here to support device drivers and the AML disassembler.
+ *
+ * The tables in this file are defined by third-party specifications, and are
+ * not defined directly by the ACPI specification itself.
+ *
+ ******************************************************************************/
+
+/*
+ * Values for description table header signatures for tables defined in this
+ * file. Useful because they make it more difficult to inadvertently type in
+ * the wrong signature.
+ */
+#define ACPI_SIG_ASF            "ASF!"	/* Alert Standard Format table */
+#define ACPI_SIG_BOOT           "BOOT"	/* Simple Boot Flag Table */
+#define ACPI_SIG_DBGP           "DBGP"	/* Debug Port table */
+#define ACPI_SIG_DMAR           "DMAR"	/* DMA Remapping table */
+#define ACPI_SIG_HPET           "HPET"	/* High Precision Event Timer table */
+#define ACPI_SIG_IBFT           "IBFT"	/* i_sCSI Boot Firmware Table */
+#define ACPI_SIG_IVRS           "IVRS"	/* I/O Virtualization Reporting Structure */
+#define ACPI_SIG_MCFG           "MCFG"	/* PCI Memory Mapped Configuration table */
+#define ACPI_SIG_MCHI           "MCHI"	/* Management Controller Host Interface table */
+#define ACPI_SIG_SLIC           "SLIC"	/* Software Licensing Description Table */
+#define ACPI_SIG_SPCR           "SPCR"	/* Serial Port Console Redirection table */
+#define ACPI_SIG_SPMI           "SPMI"	/* Server Platform Management Interface table */
+#define ACPI_SIG_TCPA           "TCPA"	/* Trusted Computing Platform Alliance table */
+#define ACPI_SIG_UEFI           "UEFI"	/* Uefi Boot Optimization Table */
+#define ACPI_SIG_WAET           "WAET"	/* Windows ACPI Emulated devices Table */
+#define ACPI_SIG_WDAT           "WDAT"	/* Watchdog Action Table */
+#define ACPI_SIG_WDDT           "WDDT"	/* Watchdog Timer Description Table */
+#define ACPI_SIG_WDRT           "WDRT"	/* Watchdog Resource Table */
+
+#ifdef ACPI_UNDEFINED_TABLES
+/*
+ * These tables have been seen in the field, but no definition has been found
+ */
+#define ACPI_SIG_ATKG           "ATKG"
+#define ACPI_SIG_GSCI           "GSCI"	/* GMCH SCI table */
+#define ACPI_SIG_IEIT           "IEIT"
+#endif
+
+/*
+ * All tables must be byte-packed to match the ACPI specification, since
+ * the tables are provided by the system BIOS.
+ */
+#pragma pack(1)
+
+/*
+ * Note about bitfields: The u8 type is used for bitfields in ACPI tables.
+ * This is the only type that is even remotely portable. Anything else is not
+ * portable, so do not use any other bitfield types.
+ */
+
+/*******************************************************************************
+ *
+ * ASF - Alert Standard Format table (Signature "ASF!")
+ *       Revision 0x10
+ *
+ * Conforms to the Alert Standard Format Specification V2.0, 23 April 2003
+ *
+ ******************************************************************************/
+
+struct acpi_table_asf {
+	struct acpi_table_header header;	/* Common ACPI table header */
+};
+
+/* ASF subtable header */
+
+struct acpi_asf_header {
+	u8 type;
+	u8 reserved;
+	u16 length;
+};
+
+/* Values for Type field above */
+
+enum acpi_asf_type {
+	ACPI_ASF_TYPE_INFO = 0,
+	ACPI_ASF_TYPE_ALERT = 1,
+	ACPI_ASF_TYPE_CONTROL = 2,
+	ACPI_ASF_TYPE_BOOT = 3,
+	ACPI_ASF_TYPE_ADDRESS = 4,
+	ACPI_ASF_TYPE_RESERVED = 5
+};
+
+/*
+ * ASF subtables
+ */
+
+/* 0: ASF Information */
+
+struct acpi_asf_info {
+	struct acpi_asf_header header;
+	u8 min_reset_value;
+	u8 min_poll_interval;
+	u16 system_id;
+	u32 mfg_id;
+	u8 flags;
+	u8 reserved2[3];
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_ASF_SMBUS_PROTOCOLS    (1)
+
+/* 1: ASF Alerts */
+
+struct acpi_asf_alert {
+	struct acpi_asf_header header;
+	u8 assert_mask;
+	u8 deassert_mask;
+	u8 alerts;
+	u8 data_length;
+};
+
+struct acpi_asf_alert_data {
+	u8 address;
+	u8 command;
+	u8 mask;
+	u8 value;
+	u8 sensor_type;
+	u8 type;
+	u8 offset;
+	u8 source_type;
+	u8 severity;
+	u8 sensor_number;
+	u8 entity;
+	u8 instance;
+};
+
+/* 2: ASF Remote Control */
+
+struct acpi_asf_remote {
+	struct acpi_asf_header header;
+	u8 controls;
+	u8 data_length;
+	u16 reserved2;
+};
+
+struct acpi_asf_control_data {
+	u8 function;
+	u8 address;
+	u8 command;
+	u8 value;
+};
+
+/* 3: ASF RMCP Boot Options */
+
+struct acpi_asf_rmcp {
+	struct acpi_asf_header header;
+	u8 capabilities[7];
+	u8 completion_code;
+	u32 enterprise_id;
+	u8 command;
+	u16 parameter;
+	u16 boot_options;
+	u16 oem_parameters;
+};
+
+/* 4: ASF Address */
+
+struct acpi_asf_address {
+	struct acpi_asf_header header;
+	u8 eprom_address;
+	u8 devices;
+};
+
+/*******************************************************************************
+ *
+ * BOOT - Simple Boot Flag Table
+ *        Version 1
+ *
+ * Conforms to the "Simple Boot Flag Specification", Version 2.1
+ *
+ ******************************************************************************/
+
+struct acpi_table_boot {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 cmos_index;		/* Index in CMOS RAM for the boot register */
+	u8 reserved[3];
+};
+
+/*******************************************************************************
+ *
+ * DBGP - Debug Port table
+ *        Version 1
+ *
+ * Conforms to the "Debug Port Specification", Version 1.00, 2/9/2000
+ *
+ ******************************************************************************/
+
+struct acpi_table_dbgp {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 type;		/* 0=full 16550, 1=subset of 16550 */
+	u8 reserved[3];
+	struct acpi_generic_address debug_port;
+};
+
+/*******************************************************************************
+ *
+ * DMAR - DMA Remapping table
+ *        Version 1
+ *
+ * Conforms to "Intel Virtualization Technology for Directed I/O",
+ * Version 1.2, Sept. 2008
+ *
+ ******************************************************************************/
+
+struct acpi_table_dmar {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 width;		/* Host Address Width */
+	u8 flags;
+	u8 reserved[10];
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_DMAR_INTR_REMAP        (1)
+#define ACPI_DMAR_X2APIC_OPT_OUT    (1<<1)
+
+/* DMAR subtable header */
+
+struct acpi_dmar_header {
+	u16 type;
+	u16 length;
+};
+
+/* Values for subtable type in struct acpi_dmar_header */
+
+enum acpi_dmar_type {
+	ACPI_DMAR_TYPE_HARDWARE_UNIT = 0,
+	ACPI_DMAR_TYPE_RESERVED_MEMORY = 1,
+	ACPI_DMAR_TYPE_ATSR = 2,
+	ACPI_DMAR_HARDWARE_AFFINITY = 3,
+	ACPI_DMAR_TYPE_RESERVED = 4	/* 4 and greater are reserved */
+};
+
+/* DMAR Device Scope structure */
+
+struct acpi_dmar_device_scope {
+	u8 entry_type;
+	u8 length;
+	u16 reserved;
+	u8 enumeration_id;
+	u8 bus;
+};
+
+/* Values for entry_type in struct acpi_dmar_device_scope */
+
+enum acpi_dmar_scope_type {
+	ACPI_DMAR_SCOPE_TYPE_NOT_USED = 0,
+	ACPI_DMAR_SCOPE_TYPE_ENDPOINT = 1,
+	ACPI_DMAR_SCOPE_TYPE_BRIDGE = 2,
+	ACPI_DMAR_SCOPE_TYPE_IOAPIC = 3,
+	ACPI_DMAR_SCOPE_TYPE_HPET = 4,
+	ACPI_DMAR_SCOPE_TYPE_RESERVED = 5	/* 5 and greater are reserved */
+};
+
+struct acpi_dmar_pci_path {
+	u8 dev;
+	u8 fn;
+};
+
+/*
+ * DMAR Sub-tables, correspond to Type in struct acpi_dmar_header
+ */
+
+/* 0: Hardware Unit Definition */
+
+struct acpi_dmar_hardware_unit {
+	struct acpi_dmar_header header;
+	u8 flags;
+	u8 reserved;
+	u16 segment;
+	u64 address;		/* Register Base Address */
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_DMAR_INCLUDE_ALL       (1)
+
+/* 1: Reserved Memory Defininition */
+
+struct acpi_dmar_reserved_memory {
+	struct acpi_dmar_header header;
+	u16 reserved;
+	u16 segment;
+	u64 base_address;	/* 4_k aligned base address */
+	u64 end_address;	/* 4_k aligned limit address */
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_DMAR_ALLOW_ALL         (1)
+
+/* 2: Root Port ATS Capability Reporting Structure */
+
+struct acpi_dmar_atsr {
+	struct acpi_dmar_header header;
+	u8 flags;
+	u8 reserved;
+	u16 segment;
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_DMAR_ALL_PORTS         (1)
+
+/* 3: Remapping Hardware Static Affinity Structure */
+
+struct acpi_dmar_rhsa {
+	struct acpi_dmar_header header;
+	u32 reserved;
+	u64 base_address;
+	u32 proximity_domain;
+};
+
+/*******************************************************************************
+ *
+ * HPET - High Precision Event Timer table
+ *        Version 1
+ *
+ * Conforms to "IA-PC HPET (High Precision Event Timers) Specification",
+ * Version 1.0a, October 2004
+ *
+ ******************************************************************************/
+
+struct acpi_table_hpet {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u32 id;			/* Hardware ID of event timer block */
+	struct acpi_generic_address address;	/* Address of event timer block */
+	u8 sequence;		/* HPET sequence number */
+	u16 minimum_tick;	/* Main counter min tick, periodic mode */
+	u8 flags;
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_HPET_PAGE_PROTECT_MASK (3)
+
+/* Values for Page Protect flags */
+
+enum acpi_hpet_page_protect {
+	ACPI_HPET_NO_PAGE_PROTECT = 0,
+	ACPI_HPET_PAGE_PROTECT4 = 1,
+	ACPI_HPET_PAGE_PROTECT64 = 2
+};
+
+/*******************************************************************************
+ *
+ * IBFT - Boot Firmware Table
+ *        Version 1
+ *
+ * Conforms to "iSCSI Boot Firmware Table (iBFT) as Defined in ACPI 3.0b
+ * Specification", Version 1.01, March 1, 2007
+ *
+ * Note: It appears that this table is not intended to appear in the RSDT/XSDT.
+ * Therefore, it is not currently supported by the disassembler.
+ *
+ ******************************************************************************/
+
+struct acpi_table_ibft {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 reserved[12];
+};
+
+/* IBFT common subtable header */
+
+struct acpi_ibft_header {
+	u8 type;
+	u8 version;
+	u16 length;
+	u8 index;
+	u8 flags;
+};
+
+/* Values for Type field above */
+
+enum acpi_ibft_type {
+	ACPI_IBFT_TYPE_NOT_USED = 0,
+	ACPI_IBFT_TYPE_CONTROL = 1,
+	ACPI_IBFT_TYPE_INITIATOR = 2,
+	ACPI_IBFT_TYPE_NIC = 3,
+	ACPI_IBFT_TYPE_TARGET = 4,
+	ACPI_IBFT_TYPE_EXTENSIONS = 5,
+	ACPI_IBFT_TYPE_RESERVED = 6	/* 6 and greater are reserved */
+};
+
+/* IBFT subtables */
+
+struct acpi_ibft_control {
+	struct acpi_ibft_header header;
+	u16 extensions;
+	u16 initiator_offset;
+	u16 nic0_offset;
+	u16 target0_offset;
+	u16 nic1_offset;
+	u16 target1_offset;
+};
+
+struct acpi_ibft_initiator {
+	struct acpi_ibft_header header;
+	u8 sns_server[16];
+	u8 slp_server[16];
+	u8 primary_server[16];
+	u8 secondary_server[16];
+	u16 name_length;
+	u16 name_offset;
+};
+
+struct acpi_ibft_nic {
+	struct acpi_ibft_header header;
+	u8 ip_address[16];
+	u8 subnet_mask_prefix;
+	u8 origin;
+	u8 gateway[16];
+	u8 primary_dns[16];
+	u8 secondary_dns[16];
+	u8 dhcp[16];
+	u16 vlan;
+	u8 mac_address[6];
+	u16 pci_address;
+	u16 name_length;
+	u16 name_offset;
+};
+
+struct acpi_ibft_target {
+	struct acpi_ibft_header header;
+	u8 target_ip_address[16];
+	u16 target_ip_socket;
+	u8 target_boot_lun[8];
+	u8 chap_type;
+	u8 nic_association;
+	u16 target_name_length;
+	u16 target_name_offset;
+	u16 chap_name_length;
+	u16 chap_name_offset;
+	u16 chap_secret_length;
+	u16 chap_secret_offset;
+	u16 reverse_chap_name_length;
+	u16 reverse_chap_name_offset;
+	u16 reverse_chap_secret_length;
+	u16 reverse_chap_secret_offset;
+};
+
+/*******************************************************************************
+ *
+ * IVRS - I/O Virtualization Reporting Structure
+ *        Version 1
+ *
+ * Conforms to "AMD I/O Virtualization Technology (IOMMU) Specification",
+ * Revision 1.26, February 2009.
+ *
+ ******************************************************************************/
+
+struct acpi_table_ivrs {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u32 info;		/* Common virtualization info */
+	u64 reserved;
+};
+
+/* Values for Info field above */
+
+#define ACPI_IVRS_PHYSICAL_SIZE     0x00007F00	/* 7 bits, physical address size */
+#define ACPI_IVRS_VIRTUAL_SIZE      0x003F8000	/* 7 bits, virtual address size */
+#define ACPI_IVRS_ATS_RESERVED      0x00400000	/* ATS address translation range reserved */
+
+/* IVRS subtable header */
+
+struct acpi_ivrs_header {
+	u8 type;		/* Subtable type */
+	u8 flags;
+	u16 length;		/* Subtable length */
+	u16 device_id;		/* ID of IOMMU */
+};
+
+/* Values for subtable Type above */
+
+enum acpi_ivrs_type {
+	ACPI_IVRS_TYPE_HARDWARE = 0x10,
+	ACPI_IVRS_TYPE_MEMORY_ALL /* _MEMORY1 */ = 0x20,
+	ACPI_IVRS_TYPE_MEMORY_ONE /* _MEMORY2 */ = 0x21,
+	ACPI_IVRS_TYPE_MEMORY_RANGE /* _MEMORY3 */ = 0x22,
+	ACPI_IVRS_TYPE_MEMORY_IOMMU = 0x23
+};
+
+/* Masks for Flags field above for IVHD subtable */
+
+#define ACPI_IVHD_TT_ENABLE         (1)
+#define ACPI_IVHD_PASS_PW           (1<<1)
+#define ACPI_IVHD_RES_PASS_PW       (1<<2)
+#define ACPI_IVHD_ISOC              (1<<3)
+#define ACPI_IVHD_IOTLB             (1<<4)
+
+/* Masks for Flags field above for IVMD subtable */
+
+#define ACPI_IVMD_UNITY             (1)
+#define ACPI_IVMD_READ              (1<<1)
+#define ACPI_IVMD_WRITE             (1<<2)
+#define ACPI_IVMD_EXCLUSION_RANGE   (1<<3)
+
+/*
+ * IVRS subtables, correspond to Type in struct acpi_ivrs_header
+ */
+
+/* 0x10: I/O Virtualization Hardware Definition Block (IVHD) */
+
+struct acpi_ivrs_hardware {
+	struct acpi_ivrs_header header;
+	u16 capability_offset;	/* Offset for IOMMU control fields */
+	u64 base_address;	/* IOMMU control registers */
+	u16 pci_segment_group;
+	u16 info;		/* MSI number and unit ID */
+	u32 reserved;
+};
+
+/* Masks for Info field above */
+
+#define ACPI_IVHD_MSI_NUMBER_MASK   0x001F	/* 5 bits, MSI message number */
+#define ACPI_IVHD_UNIT_ID_MASK      0x1F00	/* 5 bits, unit_iD */
+
+/*
+ * Device Entries for IVHD subtable, appear after struct acpi_ivrs_hardware structure.
+ * Upper two bits of the Type field are the (encoded) length of the structure.
+ * Currently, only 4 and 8 byte entries are defined. 16 and 32 byte entries
+ * are reserved for future use but not defined.
+ */
+struct acpi_ivrs_de_header {
+	u8 type;
+	u16 id;
+	u8 data_setting;
+};
+
+/* Length of device entry is in the top two bits of Type field above */
+
+#define ACPI_IVHD_ENTRY_LENGTH      0xC0
+
+/* Values for device entry Type field above */
+
+enum acpi_ivrs_device_entry_type {
+	/* 4-byte device entries, all use struct acpi_ivrs_device4 */
+
+	ACPI_IVRS_TYPE_PAD4 = 0,
+	ACPI_IVRS_TYPE_ALL = 1,
+	ACPI_IVRS_TYPE_SELECT = 2,
+	ACPI_IVRS_TYPE_START = 3,
+	ACPI_IVRS_TYPE_END = 4,
+
+	/* 8-byte device entries */
+
+	ACPI_IVRS_TYPE_PAD8 = 64,
+	ACPI_IVRS_TYPE_NOT_USED = 65,
+	ACPI_IVRS_TYPE_ALIAS_SELECT = 66,	/* Uses struct acpi_ivrs_device8a */
+	ACPI_IVRS_TYPE_ALIAS_START = 67,	/* Uses struct acpi_ivrs_device8a */
+	ACPI_IVRS_TYPE_EXT_SELECT = 70,	/* Uses struct acpi_ivrs_device8b */
+	ACPI_IVRS_TYPE_EXT_START = 71,	/* Uses struct acpi_ivrs_device8b */
+	ACPI_IVRS_TYPE_SPECIAL = 72	/* Uses struct acpi_ivrs_device8c */
+};
+
+/* Values for Data field above */
+
+#define ACPI_IVHD_INIT_PASS         (1)
+#define ACPI_IVHD_EINT_PASS         (1<<1)
+#define ACPI_IVHD_NMI_PASS          (1<<2)
+#define ACPI_IVHD_SYSTEM_MGMT       (3<<4)
+#define ACPI_IVHD_LINT0_PASS        (1<<6)
+#define ACPI_IVHD_LINT1_PASS        (1<<7)
+
+/* Types 0-4: 4-byte device entry */
+
+struct acpi_ivrs_device4 {
+	struct acpi_ivrs_de_header header;
+};
+
+/* Types 66-67: 8-byte device entry */
+
+struct acpi_ivrs_device8a {
+	struct acpi_ivrs_de_header header;
+	u8 reserved1;
+	u16 used_id;
+	u8 reserved2;
+};
+
+/* Types 70-71: 8-byte device entry */
+
+struct acpi_ivrs_device8b {
+	struct acpi_ivrs_de_header header;
+	u32 extended_data;
+};
+
+/* Values for extended_data above */
+
+#define ACPI_IVHD_ATS_DISABLED      (1<<31)
+
+/* Type 72: 8-byte device entry */
+
+struct acpi_ivrs_device8c {
+	struct acpi_ivrs_de_header header;
+	u8 handle;
+	u16 used_id;
+	u8 variety;
+};
+
+/* Values for Variety field above */
+
+#define ACPI_IVHD_IOAPIC            1
+#define ACPI_IVHD_HPET              2
+
+/* 0x20, 0x21, 0x22: I/O Virtualization Memory Definition Block (IVMD) */
+
+struct acpi_ivrs_memory {
+	struct acpi_ivrs_header header;
+	u16 aux_data;
+	u64 reserved;
+	u64 start_address;
+	u64 memory_length;
+};
+
+/*******************************************************************************
+ *
+ * MCFG - PCI Memory Mapped Configuration table and sub-table
+ *        Version 1
+ *
+ * Conforms to "PCI Firmware Specification", Revision 3.0, June 20, 2005
+ *
+ ******************************************************************************/
+
+struct acpi_table_mcfg {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 reserved[8];
+};
+
+/* Subtable */
+
+struct acpi_mcfg_allocation {
+	u64 address;		/* Base address, processor-relative */
+	u16 pci_segment;	/* PCI segment group number */
+	u8 start_bus_number;	/* Starting PCI Bus number */
+	u8 end_bus_number;	/* Final PCI Bus number */
+	u32 reserved;
+};
+
+/*******************************************************************************
+ *
+ * MCHI - Management Controller Host Interface Table
+ *        Version 1
+ *
+ * Conforms to "Management Component Transport Protocol (MCTP) Host
+ * Interface Specification", Revision 1.0.0a, October 13, 2009
+ *
+ ******************************************************************************/
+
+struct acpi_table_mchi {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 interface_type;
+	u8 protocol;
+	u64 protocol_data;
+	u8 interrupt_type;
+	u8 gpe;
+	u8 pci_device_flag;
+	u32 global_interrupt;
+	struct acpi_generic_address control_register;
+	u8 pci_segment;
+	u8 pci_bus;
+	u8 pci_device;
+	u8 pci_function;
+};
+
+/*******************************************************************************
+ *
+ * SLIC - Software Licensing Description Table
+ *        Version 1
+ *
+ * Conforms to "OEM Activation 2.0 for Windows Vista Operating Systems",
+ * Copyright 2006
+ *
+ ******************************************************************************/
+
+/* Basic SLIC table is only the common ACPI header */
+
+struct acpi_table_slic {
+	struct acpi_table_header header;	/* Common ACPI table header */
+};
+
+/* Common SLIC subtable header */
+
+struct acpi_slic_header {
+	u32 type;
+	u32 length;
+};
+
+/* Values for Type field above */
+
+enum acpi_slic_type {
+	ACPI_SLIC_TYPE_PUBLIC_KEY = 0,
+	ACPI_SLIC_TYPE_WINDOWS_MARKER = 1,
+	ACPI_SLIC_TYPE_RESERVED = 2	/* 2 and greater are reserved */
+};
+
+/*
+ * SLIC Sub-tables, correspond to Type in struct acpi_slic_header
+ */
+
+/* 0: Public Key Structure */
+
+struct acpi_slic_key {
+	struct acpi_slic_header header;
+	u8 key_type;
+	u8 version;
+	u16 reserved;
+	u32 algorithm;
+	char magic[4];
+	u32 bit_length;
+	u32 exponent;
+	u8 modulus[128];
+};
+
+/* 1: Windows Marker Structure */
+
+struct acpi_slic_marker {
+	struct acpi_slic_header header;
+	u32 version;
+	char oem_id[ACPI_OEM_ID_SIZE];	/* ASCII OEM identification */
+	char oem_table_id[ACPI_OEM_TABLE_ID_SIZE];	/* ASCII OEM table identification */
+	char windows_flag[8];
+	u32 slic_version;
+	u8 reserved[16];
+	u8 signature[128];
+};
+
+/*******************************************************************************
+ *
+ * SPCR - Serial Port Console Redirection table
+ *        Version 1
+ *
+ * Conforms to "Serial Port Console Redirection Table",
+ * Version 1.00, January 11, 2002
+ *
+ ******************************************************************************/
+
+struct acpi_table_spcr {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 interface_type;	/* 0=full 16550, 1=subset of 16550 */
+	u8 reserved[3];
+	struct acpi_generic_address serial_port;
+	u8 interrupt_type;
+	u8 pc_interrupt;
+	u32 interrupt;
+	u8 baud_rate;
+	u8 parity;
+	u8 stop_bits;
+	u8 flow_control;
+	u8 terminal_type;
+	u8 reserved1;
+	u16 pci_device_id;
+	u16 pci_vendor_id;
+	u8 pci_bus;
+	u8 pci_device;
+	u8 pci_function;
+	u32 pci_flags;
+	u8 pci_segment;
+	u32 reserved2;
+};
+
+/* Masks for pci_flags field above */
+
+#define ACPI_SPCR_DO_NOT_DISABLE    (1)
+
+/*******************************************************************************
+ *
+ * SPMI - Server Platform Management Interface table
+ *        Version 5
+ *
+ * Conforms to "Intelligent Platform Management Interface Specification
+ * Second Generation v2.0", Document Revision 1.0, February 12, 2004 with
+ * June 12, 2009 markup.
+ *
+ ******************************************************************************/
+
+struct acpi_table_spmi {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 interface_type;
+	u8 reserved;		/* Must be 1 */
+	u16 spec_revision;	/* Version of IPMI */
+	u8 interrupt_type;
+	u8 gpe_number;		/* GPE assigned */
+	u8 reserved1;
+	u8 pci_device_flag;
+	u32 interrupt;
+	struct acpi_generic_address ipmi_register;
+	u8 pci_segment;
+	u8 pci_bus;
+	u8 pci_device;
+	u8 pci_function;
+	u8 reserved2;
+};
+
+/* Values for interface_type above */
+
+enum acpi_spmi_interface_types {
+	ACPI_SPMI_NOT_USED = 0,
+	ACPI_SPMI_KEYBOARD = 1,
+	ACPI_SPMI_SMI = 2,
+	ACPI_SPMI_BLOCK_TRANSFER = 3,
+	ACPI_SPMI_SMBUS = 4,
+	ACPI_SPMI_RESERVED = 5	/* 5 and above are reserved */
+};
+
+/*******************************************************************************
+ *
+ * TCPA - Trusted Computing Platform Alliance table
+ *        Version 1
+ *
+ * Conforms to "TCG PC Specific Implementation Specification",
+ * Version 1.1, August 18, 2003
+ *
+ ******************************************************************************/
+
+struct acpi_table_tcpa {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u16 reserved;
+	u32 max_log_length;	/* Maximum length for the event log area */
+	u64 log_address;	/* Address of the event log area */
+};
+
+/*******************************************************************************
+ *
+ * UEFI - UEFI Boot optimization Table
+ *        Version 1
+ *
+ * Conforms to "Unified Extensible Firmware Interface Specification",
+ * Version 2.3, May 8, 2009
+ *
+ ******************************************************************************/
+
+struct acpi_table_uefi {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u8 identifier[16];	/* UUID identifier */
+	u16 data_offset;	/* Offset of remaining data in table */
+};
+
+/*******************************************************************************
+ *
+ * WAET - Windows ACPI Emulated devices Table
+ *        Version 1
+ *
+ * Conforms to "Windows ACPI Emulated Devices Table", version 1.0, April 6, 2009
+ *
+ ******************************************************************************/
+
+struct acpi_table_waet {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u32 flags;
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_WAET_RTC_NO_ACK        (1)	/* RTC requires no int acknowledge */
+#define ACPI_WAET_TIMER_ONE_READ    (1<<1)	/* PM timer requires only one read */
+
+/*******************************************************************************
+ *
+ * WDAT - Watchdog Action Table
+ *        Version 1
+ *
+ * Conforms to "Hardware Watchdog Timers Design Specification",
+ * Copyright 2006 Microsoft Corporation.
+ *
+ ******************************************************************************/
+
+struct acpi_table_wdat {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u32 header_length;	/* Watchdog Header Length */
+	u16 pci_segment;	/* PCI Segment number */
+	u8 pci_bus;		/* PCI Bus number */
+	u8 pci_device;		/* PCI Device number */
+	u8 pci_function;	/* PCI Function number */
+	u8 reserved[3];
+	u32 timer_period;	/* Period of one timer count (msec) */
+	u32 max_count;		/* Maximum counter value supported */
+	u32 min_count;		/* Minimum counter value */
+	u8 flags;
+	u8 reserved2[3];
+	u32 entries;		/* Number of watchdog entries that follow */
+};
+
+/* Masks for Flags field above */
+
+#define ACPI_WDAT_ENABLED           (1)
+#define ACPI_WDAT_STOPPED           0x80
+
+/* WDAT Instruction Entries (actions) */
+
+struct acpi_wdat_entry {
+	u8 action;
+	u8 instruction;
+	u16 reserved;
+	struct acpi_generic_address register_region;
+	u32 value;		/* Value used with Read/Write register */
+	u32 mask;		/* Bitmask required for this register instruction */
+};
+
+/* Values for Action field above */
+
+enum acpi_wdat_actions {
+	ACPI_WDAT_RESET = 1,
+	ACPI_WDAT_GET_CURRENT_COUNTDOWN = 4,
+	ACPI_WDAT_GET_COUNTDOWN = 5,
+	ACPI_WDAT_SET_COUNTDOWN = 6,
+	ACPI_WDAT_GET_RUNNING_STATE = 8,
+	ACPI_WDAT_SET_RUNNING_STATE = 9,
+	ACPI_WDAT_GET_STOPPED_STATE = 10,
+	ACPI_WDAT_SET_STOPPED_STATE = 11,
+	ACPI_WDAT_GET_REBOOT = 16,
+	ACPI_WDAT_SET_REBOOT = 17,
+	ACPI_WDAT_GET_SHUTDOWN = 18,
+	ACPI_WDAT_SET_SHUTDOWN = 19,
+	ACPI_WDAT_GET_STATUS = 32,
+	ACPI_WDAT_SET_STATUS = 33,
+	ACPI_WDAT_ACTION_RESERVED = 34	/* 34 and greater are reserved */
+};
+
+/* Values for Instruction field above */
+
+enum acpi_wdat_instructions {
+	ACPI_WDAT_READ_VALUE = 0,
+	ACPI_WDAT_READ_COUNTDOWN = 1,
+	ACPI_WDAT_WRITE_VALUE = 2,
+	ACPI_WDAT_WRITE_COUNTDOWN = 3,
+	ACPI_WDAT_INSTRUCTION_RESERVED = 4,	/* 4 and greater are reserved */
+	ACPI_WDAT_PRESERVE_REGISTER = 0x80	/* Except for this value */
+};
+
+/*******************************************************************************
+ *
+ * WDDT - Watchdog Descriptor Table
+ *        Version 1
+ *
+ * Conforms to "Using the Intel ICH Family Watchdog Timer (WDT)",
+ * Version 001, September 2002
+ *
+ ******************************************************************************/
+
+struct acpi_table_wddt {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	u16 spec_version;
+	u16 table_version;
+	u16 pci_vendor_id;
+	struct acpi_generic_address address;
+	u16 max_count;		/* Maximum counter value supported */
+	u16 min_count;		/* Minimum counter value supported */
+	u16 period;
+	u16 status;
+	u16 capability;
+};
+
+/* Flags for Status field above */
+
+#define ACPI_WDDT_AVAILABLE     (1)
+#define ACPI_WDDT_ACTIVE        (1<<1)
+#define ACPI_WDDT_TCO_OS_OWNED  (1<<2)
+#define ACPI_WDDT_USER_RESET    (1<<11)
+#define ACPI_WDDT_WDT_RESET     (1<<12)
+#define ACPI_WDDT_POWER_FAIL    (1<<13)
+#define ACPI_WDDT_UNKNOWN_RESET (1<<14)
+
+/* Flags for Capability field above */
+
+#define ACPI_WDDT_AUTO_RESET    (1)
+#define ACPI_WDDT_ALERT_SUPPORT (1<<1)
+
+/*******************************************************************************
+ *
+ * WDRT - Watchdog Resource Table
+ *        Version 1
+ *
+ * Conforms to "Watchdog Timer Hardware Requirements for Windows Server 2003",
+ * Version 1.01, August 28, 2006
+ *
+ ******************************************************************************/
+
+struct acpi_table_wdrt {
+	struct acpi_table_header header;	/* Common ACPI table header */
+	struct acpi_generic_address control_register;
+	struct acpi_generic_address count_register;
+	u16 pci_device_id;
+	u16 pci_vendor_id;
+	u8 pci_bus;		/* PCI Bus number */
+	u8 pci_device;		/* PCI Device number */
+	u8 pci_function;	/* PCI Function number */
+	u8 pci_segment;		/* PCI Segment number */
+	u16 max_count;		/* Maximum counter value supported */
+	u8 units;
+};
+
+/* Reset to default packing */
+
+#pragma pack()
+
+#endif				/* __ACTBL2_H__ */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog

From xen-devel-bounces@lists.xensource.com Wed Dec 14 18:33:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 14 Dec 2011 18:33:11 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RatdC-0003yP-Of; Wed, 14 Dec 2011 18:32:42 +0000
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <quartex73@gmail.com>) id 1RatdA-0003w5-BH
	for xen-devel@lists.xensource.com; Wed, 14 Dec 2011 18:32:41 +0000
X-Env-Sender: quartex73@gmail.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1323887498!7225023!1
X-Originating-IP: [209.85.213.171]
X-SpamReason: No, hits=0.8 required=7.0 tests=BODY_RANDOM_LONG,
	ML_RADAR_SPEW_LINKS_14,RCVD_BY_IP,spamassassin: 
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19161 invoked from network); 14 Dec 2011 18:31:39 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Dec 2011 18:31:39 -0000
Received: by yenr9 with SMTP id r9so15679992yen.30
	for <xen-devel@lists.xensource.com>;
	Wed, 14 Dec 2011 10:31:38 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=GKbQdTdSv4i+Bpr7t920Hr4qle/cbnzhIPIVpnI28+E=;
	b=WynrLPOl6SuXtdUTjlqjMa5jlelPJ438mDPKdIy+Y6WUk2nUSFUsC5g61nJIvcbtk2
	Ox8hFO/B+MmPwa1NHzFszlI1sNe9UjKNMUszQfUhenpHY4irfy2RkSgk5+YflCwgFxmo
	ZE/GXQyLsyQKuq+/hBsjklKVEnc4+mpbulkmw=
MIME-Version: 1.0
Received: by 10.236.176.2 with SMTP id a2mr13811338yhm.12.1323887498320; Wed,
	14 Dec 2011 10:31:38 -0800 (PST)
Received: by 10.146.58.7 with HTTP; Wed, 14 Dec 2011 10:31:38 -0800 (PST)
In-Reply-To: <20111202195727.GA18758@andromeda.dapyr.net>
References: <CAMhBqqiLc1994GUKtA7UY52pR29nktmFy+XiwTwpZb_E+fwFRQ@mail.gmail.com>
	<CAMhBqqgu6v8NB-X0dNdfrzd12=Y2i==fYCCC2Z+MkDupqqKAOg@mail.gmail.com>
	<20111202195727.GA18758@andromeda.dapyr.net>
Date: Wed, 14 Dec 2011 19:31:38 +0100
Message-ID: <CAMhBqqgJ0Q3BZDuK3KEEGuDS2eGBZq89E7_Kbv+VNTYxZJLAAA@mail.gmail.com>
From: Quartexx <quartex73@gmail.com>
To: xen-devel@lists.xensource.com
Cc: Konrad Rzeszutek Wilk <konrad@darnok.org>
Subject: Re: [Xen-devel] xen 4.0.1 w/2.6.32.47 hangs at boot
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

2011/12/2 Konrad Rzeszutek Wilk <konrad@darnok.org>:
> On Fri, Dec 02, 2011 at 08:22:46PM +0100, Quartexx wrote:
>> ### lspci
>
> <sigh> You seem to be missing the most important - that is the serial
> console output with 'sync_console' enabled.


here it is:

 __  __            _  _    ___   _
 \ \/ /___ _ __   | || |  / _ \ / |
  \  // _ \ '_ \  | || |_| | | || |
  /  \  __/ | | | |__   _| |_| || |
 /_/\_\___|_| |_|    |_|(_)___(_)_|

(XEN) Xen version 4.0.1 (root@foo-net.private) (gcc version 4.4.5
(Debian 4.4.5-8) ) Fri Dec  2 16:56:12 CET 2011
(XEN) Latest ChangeSet: unavailable
(XEN) Console output is synchronous.
(XEN) Bootloader: GNU GRUB 0.97
(XEN) Command line: dom0_mem=3D1024M max_cstate=3D1 loglvl=3Dall
guest_loglvl=3Dall sync_console console_to_ring com1=3D38400,8n1
console=3Dcom1
(XEN) Video information:
(XEN)  VGA is text mode 80x25, font 8x16
(XEN)  VBE/DDC methods: V2; EDID transfer time: 1 seconds
(XEN) Disc information:
(XEN)  Found 1 MBR signatures
(XEN)  Found 1 EDD information structures
(XEN) Xen-e820 RAM map:
(XEN)  0000000000000000 - 000000000009b800 (usable)
(XEN)  000000000009b800 - 00000000000a0000 (reserved)
(XEN)  00000000000e0000 - 0000000000100000 (reserved)
(XEN)  0000000000100000 - 000000009d8e9000 (usable)
(XEN)  000000009d8e9000 - 000000009d9bb000 (ACPI NVS)
(XEN)  000000009d9bb000 - 000000009f6a4000 (ACPI data)
(XEN)  000000009f6a4000 - 000000009f6df000 (reserved)
(XEN)  000000009f6df000 - 000000009f78a000 (ACPI data)
(XEN)  000000009f78a000 - 000000009f7df000 (ACPI NVS)
(XEN)  000000009f7df000 - 000000009f800000 (ACPI data)
(XEN)  000000009f800000 - 00000000b0000000 (reserved)
(XEN)  00000000fed1c000 - 00000000fed20000 (reserved)
(XEN)  00000000ff800000 - 0000000100000000 (reserved)
(XEN)  0000000100000000 - 0000000460000000 (usable)
(XEN) ACPI: RSDP 000F0410, 0024 (r2 INTEL )
(XEN) ACPI: XSDT 9F7FD120, 008C (r1 INTEL  S3420GPC        0       1000013)
(XEN) ACPI: FACP 9F7FB000, 00F4 (r4 INTEL  S3420GPC        0 MSFT  100000D)
(XEN) ACPI: DSDT 9F7F6000, 4E22 (r2 INTEL  S3420GPC        3 MSFT  100000D)
(XEN) ACPI: FACS 9F78A000, 0040
(XEN) ACPI: APIC 9F7F5000, 00BC (r2 INTEL  S3420GPC        0 MSFT  100000D)
(XEN) ACPI: MCFG 9F7F4000, 003C (r1 INTEL  S3420GPC        1 MSFT  100000D)
(XEN) ACPI: HPET 9F7F3000, 0038 (r1 INTEL  S3420GPC        1 MSFT  100000D)
(XEN) ACPI: SLIT 9F7F2000, 0030 (r1 INTEL  S3420GPC        1 MSFT  100000D)
(XEN) ACPI: SPCR 9F7F1000, 0050 (r1 INTEL  S3420GPC        0 MSFT  100000D)
(XEN) ACPI: WDDT 9F7F0000, 0040 (r1 INTEL  S3420GPC        0 MSFT  100000D)
(XEN) ACPI: SSDT 9F7E5000, AEF4 (r2  INTEL SSDT  PM     4000 INTL 20061109)
(XEN) ACPI: SSDT 9F7E4000, 01D8 (r2  INTEL IPMI         4000 INTL 20061109)
(XEN) ACPI: HEST 9F7E3000, 00A8 (r1 INTEL  S3420GPC        1 INTL        1)
(XEN) ACPI: BERT 9F7E2000, 0030 (r1 INTEL  S3420GPC        1 INTL        1)
(XEN) ACPI: ERST 9F7E1000, 0230 (r1 INTEL  S3420GPC        1 INTL        1)
(XEN) ACPI: EINJ 9F7E0000, 0130 (r1 INTEL  S3420GPC        1 INTL        1)
(XEN) System RAM: 16344MB (16736784kB)
(XEN) No NUMA configuration found
(XEN) Faking a node at 0000000000000000-0000000460000000
(XEN) Domain heap initialised
(XEN) found SMP MP-table at 000fd9a0
(XEN) DMI 2.5 present.
(XEN) Using APIC driver default
(XEN) ACPI: PM-Timer IO Port: 0x408
(XEN) ACPI: ACPI SLEEP INFO: pm1x_cnt[404,0], pm1x_evt[400,0]
(XEN) ACPI:                  wakeup_vec[9f78a00c], vec_size[20]
(XEN) ACPI: Local APIC address 0xfee00000
(XEN) ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
(XEN) Processor #0 7:14 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] enabled)
(XEN) Processor #2 7:14 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x02] lapic_id[0x04] enabled)
(XEN) Processor #4 7:14 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x03] lapic_id[0x06] enabled)
(XEN) Processor #6 7:14 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x04] lapic_id[0x01] disabled)
(XEN) ACPI: LAPIC (acpi_id[0x05] lapic_id[0x03] disabled)
(XEN) ACPI: LAPIC (acpi_id[0x06] lapic_id[0x05] disabled)
(XEN) ACPI: LAPIC (acpi_id[0x07] lapic_id[0x07] disabled)
(XEN) ACPI: LAPIC_NMI (acpi_id[0x00] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x01] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x02] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x03] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x04] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x05] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x06] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x07] high level lint[0x1])
(XEN) ACPI: IOAPIC (id[0x08] address[0xfec00000] gsi_base[0])
(XEN) IOAPIC[0]: apic_id 8, version 32, address 0xfec00000, GSI 0-23
(XEN) ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
(XEN) ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
(XEN) ACPI: IRQ0 used by override.
(XEN) ACPI: IRQ2 used by override.
(XEN) ACPI: IRQ9 used by override.
(XEN) Enabling APIC mode:  Flat.  Using 1 I/O APICs
(XEN) ACPI: HPET id: 0x8086a801 base: 0xfed00000
(XEN) PCI: MCFG configuration 0: base a0000000 segment 0 buses 0 - 255
(XEN) PCI: MCFG area at a0000000 reserved in E820
(XEN) Using ACPI (MADT) for SMP configuration information
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) Detected 2400.027 MHz processor.
(XEN) Initing memory sharing.
(XEN) VMX: Supported advanced features:
(XEN)  - APIC MMIO access virtualisation
(XEN)  - APIC TPR shadow
(XEN)  - Extended Page Tables (EPT)
(XEN)  - Virtual-Processor Identifiers (VPID)
(XEN)  - Virtual NMI
(XEN)  - MSR direct-access bitmap
(XEN) EPT supports 2MB super page.
(XEN) HVM: ASIDs enabled.
(XEN) HVM: VMX enabled
(XEN) HVM: Hardware Assisted Paging detected.
(XEN) Intel machine check reporting enabled
(XEN) I/O virtualisation disabled
(XEN) Total of 4 processors activated.
(XEN) ENABLING IO-APIC IRQs
(XEN)  -> Using new ACK method
(XEN) ..TIMER: vector=3D0xF0 apic1=3D0 pin1=3D2 apic2=3D-1 pin2=3D-1
(XEN) TSC is reliable, synchronization unnecessary
(XEN) Platform timer appears to have unexpectedly wrapped 1 times.
(XEN) Platform timer is 14.318MHz HPET
=FF(XEN) Allocated console ring of 32 KiB.
(XEN) microcode.c:73:d32767 microcode: CPU1 resumed
(XEN) microcode.c:73:d32767 microcode: CPU3 resumed
(XEN) microcode.c:73:d32767 microcode: CPU2 resumed
(XEN) Brought up 4 CPUs
(XEN) Turbo Mode detected!
(XEN) HPET: 8 timers in total, 8 timers will be used for broadcast
(XEN) ACPI sleep modes: S3
(XEN) mcheck_poll: Machine check polling timer started.
(XEN) *** LOADING DOMAIN 0 ***
(XEN)  Xen  kernel: 64-bit, lsb, compat32
(XEN)  Dom0 kernel: 64-bit, PAE, lsb, paddr 0x1000000 -> 0x1bfc000
(XEN) PHYSICAL MEMORY ARRANGEMENT:
(XEN)  Dom0 alloc.:   0000000450000000->0000000454000000 (245760 pages
to be allocated)
(XEN) VIRTUAL MEMORY ARRANGEMENT:
(XEN)  Loaded kernel: ffffffff81000000->ffffffff81bfc000
(XEN)  Init. ramdisk: ffffffff81bfc000->ffffffff820c7c00
(XEN)  Phys-Mach map: ffffffff820c8000->ffffffff822c8000
(XEN)  Start info:    ffffffff822c8000->ffffffff822c84b4
(XEN)  Page tables:   ffffffff822c9000->ffffffff822de000
(XEN)  Boot stack:    ffffffff822de000->ffffffff822df000
(XEN)  TOTAL:         ffffffff80000000->ffffffff82400000
(XEN)  ENTRY ADDRESS: ffffffff81976200
(XEN) Dom0 has maximum 4 VCPUs
(XEN) Scrubbing Free RAM:
...........................................................................=
...........................................................................=
..done.
(XEN) trace.c:89:d32767 calc_tinfo_first_offset: NR_CPUs 128,
offset_in_bytes 258, t_info_first_offset 65
(XEN) Xen trace buffers: disabled
(XEN) Std. Loglevel: All
(XEN) Guest Loglevel: All
(XEN) **********************************************
(XEN) ******* WARNING: CONSOLE OUTPUT IS SYNCHRONOUS
(XEN) ******* This option is intended to aid debugging of Xen by ensuring
(XEN) ******* that all output is synchronously delivered on the serial line.
(XEN) ******* However it can introduce SIGNIFICANT latencies and affect
(XEN) ******* timekeeping. It is NOT recommended for production use!
(XEN) **********************************************
(XEN) 3... 2... 1...
(XEN) *** Serial input -> DOM0 (type 'CTRL-a' three times to switch
input to Xen)
(XEN) Freed 176kB init memory.
mapping kernel into physical memory
Xen: setup ISA identity maps
about to get started...
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 2.6.32.47 (root@xenhost-rack2) (gcc
version 4.4.5 (Debian 4.4.5-8) ) #1 SMP Fri Dec 2 13:05:28 CET 2011
[    0.000000] Command line:
root=3DUUID=3D5563bc26-6e98-4768-abee-5ca053e2795c ro nomodeset
max_loop=3D255 console=3Dhvc0 earlyprintk=3Dxen
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] released 0 pages of unused memory
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  Xen: 0000000000000000 - 000000000009b000 (usable)
[    0.000000]  Xen: 000000000009b800 - 0000000000100000 (reserved)
[    0.000000]  Xen: 0000000000100000 - 0000000040000000 (usable)
[    0.000000]  Xen: 0000000040000000 - 000000009d8e9000 (unusable)
[    0.000000]  Xen: 000000009d8e9000 - 000000009d9bb000 (ACPI NVS)
[    0.000000]  Xen: 000000009d9bb000 - 000000009f6a4000 (ACPI data)
[    0.000000]  Xen: 000000009f6a4000 - 000000009f6df000 (reserved)
[    0.000000]  Xen: 000000009f6df000 - 000000009f78a000 (ACPI data)
[    0.000000]  Xen: 000000009f78a000 - 000000009f7df000 (ACPI NVS)
[    0.000000]  Xen: 000000009f7df000 - 000000009f800000 (ACPI data)
[    0.000000]  Xen: 000000009f800000 - 00000000b0000000 (reserved)
[    0.000000]  Xen: 00000000fec00000 - 00000000fec01000 (reserved)
[    0.000000]  Xen: 00000000fed1c000 - 00000000fed20000 (reserved)
[    0.000000]  Xen: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  Xen: 00000000ff800000 - 0000000100000000 (reserved)
[    0.000000]  Xen: 0000000100000000 - 0000000340000000 (usable)
[    0.000000] bootconsole [xenboot0] enabled
[    0.000000] DMI 2.5 present.
[    0.000000] last_pfn =3D 0x340000 max_arch_pfn =3D 0x400000000
[    0.000000] x86 PAT enabled: cpu 0, old 0x50100070406, new 0x70106000701=
06
[    0.000000] last_pfn =3D 0x40000 max_arch_pfn =3D 0x400000000
[    0.000000] Scanning 1 areas for low memory corruption
[    0.000000] modified physical RAM map:
[    0.000000]  modified: 0000000000000000 - 0000000000001000 (usable)
[    0.000000]  modified: 0000000000001000 - 0000000000006000 (reserved)
[    0.000000]  modified: 0000000000006000 - 000000000009b000 (usable)
[    0.000000]  modified: 000000000009b800 - 0000000000100000 (reserved)
[    0.000000]  modified: 0000000000100000 - 0000000040000000 (usable)
[    0.000000]  modified: 0000000040000000 - 000000009d8e9000 (unusable)
[    0.000000]  modified: 000000009d8e9000 - 000000009d9bb000 (ACPI NVS)
[    0.000000]  modified: 000000009d9bb000 - 000000009f6a4000 (ACPI data)
[    0.000000]  modified: 000000009f6a4000 - 000000009f6df000 (reserved)
[    0.000000]  modified: 000000009f6df000 - 000000009f78a000 (ACPI data)
[    0.000000]  modified: 000000009f78a000 - 000000009f7df000 (ACPI NVS)
[    0.000000]  modified: 000000009f7df000 - 000000009f800000 (ACPI data)
[    0.000000]  modified: 000000009f800000 - 00000000b0000000 (reserved)
[    0.000000]  modified: 00000000fec00000 - 00000000fec01000 (reserved)
[    0.000000]  modified: 00000000fed1c000 - 00000000fed20000 (reserved)
[    0.000000]  modified: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  modified: 00000000ff800000 - 0000000100000000 (reserved)
[    0.000000]  modified: 0000000100000000 - 0000000340000000 (usable)
[    0.000000] init_memory_mapping: 0000000000000000-0000000040000000
[    0.000000] init_memory_mapping: 0000000100000000-0000000340000000
[    0.000000] RAMDISK: 01bfc000 - 020c7c00
[    0.000000] ACPI: RSDP 00000000000f0410 00024 (v02 INTEL )
[    0.000000] ACPI: XSDT 000000009f7fd120 0008C (v01 INTEL  S3420GPC
00000000      01000013)
[    0.000000] ACPI: FACP 000000009f7fb000 000F4 (v04 INTEL  S3420GPC
00000000 MSFT 0100000D)
[    0.000000] ACPI: DSDT 000000009f7f6000 04E22 (v02 INTEL  S3420GPC
00000003 MSFT 0100000D)
[    0.000000] ACPI: FACS 000000009f78a000 00040
[    0.000000] ACPI: APIC 000000009f7f5000 000BC (v02 INTEL  S3420GPC
00000000 MSFT 0100000D)
[    0.000000] ACPI: MCFG 000000009f7f4000 0003C (v01 INTEL  S3420GPC
00000001 MSFT 0100000D)
[    0.000000] ACPI: HPET 000000009f7f3000 00038 (v01 INTEL  S3420GPC
00000001 MSFT 0100000D)
[    0.000000] ACPI: SLIT 000000009f7f2000 00030 (v01 INTEL  S3420GPC
00000001 MSFT 0100000D)
[    0.000000] ACPI: SPCR 000000009f7f1000 00050 (v01 INTEL  S3420GPC
00000000 MSFT 0100000D)
[    0.000000] ACPI: WDDT 000000009f7f0000 00040 (v01 INTEL  S3420GPC
00000000 MSFT 0100000D)
[    0.000000] ACPI: SSDT 000000009f7e5000 0AEF4 (v02  INTEL SSDT  PM
00004000 INTL 20061109)
[    0.000000] ACPI: SSDT 000000009f7e4000 001D8 (v02  INTEL IPMI
00004000 INTL 20061109)
[    0.000000] ACPI: HEST 000000009f7e3000 000A8 (v01 INTEL  S3420GPC
00000001 INTL 00000001)
[    0.000000] ACPI: BERT 000000009f7e2000 00030 (v01 INTEL  S3420GPC
00000001 INTL 00000001)
[    0.000000] ACPI: ERST 000000009f7e1000 00230 (v01 INTEL  S3420GPC
00000001 INTL 00000001)
[    0.000000] ACPI: EINJ 000000009f7e0000 00130 (v01 INTEL  S3420GPC
00000001 INTL 00000001)
[    0.000000] (10 early reservations) =3D=3D> bootmem [0000000000 - 034000=
0000]
[    0.000000]   #0 [0000000000 - 0000001000]   BIOS data page =3D=3D>
[0000000000 - 0000001000]
[    0.000000]   #1 [00022c9000 - 00022de000]   XEN PAGETABLES =3D=3D>
[00022c9000 - 00022de000]
[    0.000000]   #2 [0000006000 - 0000008000]       TRAMPOLINE =3D=3D>
[0000006000 - 0000008000]
[    0.000000]   #3 [0001000000 - 0001ad1474]    TEXT DATA BSS =3D=3D>
[0001000000 - 0001ad1474]
[    0.000000]   #4 [0001bfc000 - 00020c7c00]          RAMDISK =3D=3D>
[0001bfc000 - 00020c7c00]
[    0.000000]   #5 [00020c8000 - 00022c9000]   XEN START INFO =3D=3D>
[00020c8000 - 00022c9000]
[    0.000000]   #6 [0100000000 - 0340000000]        XEN EXTRA =3D=3D>
[0100000000 - 0340000000]
[    0.000000]   #7 [0001ad2000 - 0001ade36c]              BRK =3D=3D>
[0001ad2000 - 0001ade36c]
[    0.000000]   #8 [0000100000 - 00002ea000]          PGTABLE =3D=3D>
[0000100000 - 00002ea000]
[    0.000000]   #9 [00022de000 - 00034e7000]          PGTABLE =3D=3D>
[00022de000 - 00034e7000]
[    0.000000] found SMP MP-table at [ffff8800000fd9a0] fd9a0
[    0.000000] Zone PFN ranges:
[    0.000000]   DMA      0x00000000 -> 0x00001000
[    0.000000]   DMA32    0x00001000 -> 0x00100000
[    0.000000]   Normal   0x00100000 -> 0x00340000
[    0.000000] Movable zone start PFN for each node
[    0.000000] early_node_map[4] active PFN ranges
[    0.000000]     0: 0x00000000 -> 0x00000001
[    0.000000]     0: 0x00000006 -> 0x0000009b
[    0.000000]     0: 0x00000100 -> 0x00040000
[    0.000000]     0: 0x00100000 -> 0x00340000
[    0.000000] ACPI: PM-Timer IO Port: 0x408
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x04] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x06] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x04] lapic_id[0x01] disabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x05] lapic_id[0x03] disabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x06] lapic_id[0x05] disabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x07] lapic_id[0x07] disabled)
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x02] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x03] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x04] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x05] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x06] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x07] high level lint[0x1])
[    0.000000] ACPI: IOAPIC (id[0x08] address[0xfec00000] gsi_base[0])
[    0.000000] IOAPIC[0]: apic_id 8, version 0, address 0xfec00000, GSI 0-0
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[    0.000000] ERROR: Unable to locate IOAPIC for GSI 2
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[    0.000000] ERROR: Unable to locate IOAPIC for GSI 9
[    0.000000] Using ACPI (MADT) for SMP configuration information
[    0.000000] ACPI: HPET id: 0x8086a801 base: 0xfed00000
[    0.000000] SMP: Allowing 4 CPUs, 0 hotplug CPUs
[    0.000000] PM: Registered nosave memory: 0000000000001000 - 00000000000=
06000
[    0.000000] PM: Registered nosave memory: 000000000009b000 - 00000000000=
9c000
[    0.000000] PM: Registered nosave memory: 000000000009c000 - 00000000001=
00000
[    0.000000] PM: Registered nosave memory: 0000000040000000 - 000000009d8=
e9000
[    0.000000] PM: Registered nosave memory: 000000009d8e9000 - 000000009d9=
bb000
[    0.000000] PM: Registered nosave memory: 000000009d9bb000 - 000000009f6=
a4000
[    0.000000] PM: Registered nosave memory: 000000009f6a4000 - 000000009f6=
df000
[    0.000000] PM: Registered nosave memory: 000000009f6df000 - 000000009f7=
8a000
[    0.000000] PM: Registered nosave memory: 000000009f78a000 - 000000009f7=
df000
[    0.000000] PM: Registered nosave memory: 000000009f7df000 - 000000009f8=
00000
[    0.000000] PM: Registered nosave memory: 000000009f800000 - 00000000b00=
00000
[    0.000000] PM: Registered nosave memory: 00000000b0000000 - 00000000fec=
00000
[    0.000000] PM: Registered nosave memory: 00000000fec00000 - 00000000fec=
01000
[    0.000000] PM: Registered nosave memory: 00000000fec01000 - 00000000fed=
1c000
[    0.000000] PM: Registered nosave memory: 00000000fed1c000 - 00000000fed=
20000
[    0.000000] PM: Registered nosave memory: 00000000fed20000 - 00000000fee=
00000
[    0.000000] PM: Registered nosave memory: 00000000fee00000 - 00000000fee=
01000
[    0.000000] PM: Registered nosave memory: 00000000fee01000 - 00000000ff8=
00000
[    0.000000] PM: Registered nosave memory: 00000000ff800000 - 00000001000=
00000
[    0.000000] Allocating PCI resources starting at b0000000 (gap:
b0000000:4ec00000)
[    0.000000] Booting paravirtualized kernel on Xen
[    0.000000] Xen version: 4.0.1 (preserve-AD) (dom0)
[    0.000000] NR_CPUS:8 nr_cpumask_bits:8 nr_cpu_ids:4 nr_node_ids:1
[    0.000000] PERCPU: Embedded 29 pages/cpu @ffff880028038000 s88536
r8192 d22056 u118784
[    0.000000] pcpu-alloc: s88536 r8192 d22056 u118784 alloc=3D29*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
[    9.839051] Built 1 zonelists in Zone order, mobility grouping on.
Total pages: 2574249
[    9.865636] Kernel command line:
root=3DUUID=3D5563bc26-6e98-4768-abee-5ca053e2795c ro nomodeset
max_loop=3D255 console=3Dhvc0 earlyprintk=3Dxen
[    9.905431] PID hash table entries: 4096 (order: 3, 32768 bytes)
[    9.926753] Dentry cache hash table entries: 2097152 (order: 12,
16777216 bytes)
[    9.954316] Inode-cache hash table entries: 1048576 (order: 11,
8388608 bytes)
[    9.979372] Initializing CPU#0
[    9.995611] DMA: Placing 64MB software IO TLB between
ffff880020000000 - ffff880024000000
[   10.021944] DMA: software IO TLB at phys 0x20000000 - 0x24000000
[   10.041672] xen_swiotlb_fixup: buf=3Dffff880020000000 size=3D67108864
[   10.079409] xen_swiotlb_fixup: buf=3Dffff880024060000 size=3D32768
[   10.101542] Memory: 774160k/13631488k available (5877k kernel code,
3146152k absent, 9710440k reserved, 3717k data, 568k init)
[   10.138468] SLUB: Genslabs=3D13, HWalign=3D64, Order=3D0-3, MinObjects=
=3D0,
CPUs=3D4, Nodes=3D1
[   10.163634] Hierarchical RCU implementation.
[   10.177636] NR_IRQS:4352 nr_irqs:1280
[   10.189792] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[   10.210523] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[   10.232257] xen: sci override: source_irq=3D9 global_irq=3D9 trigger=3Dc=
 polarity=3D1
[   10.255712] xen_allocate_pirq: returning irq 9 for gsi 9
[   10.273159] xen: acpi sci 9
[   10.293028] Console: colour VGA+ 80x25
[   10.304769] console [hvc0] enabled, bootconsole disabled
[   10.304769] console [hvc0] enabled, bootconsole disabled
[   10.339957] installing Xen timer for CPU 0
[   10.353698] Detected 2400.026 MHz processor.
[   10.367971] Calibrating delay loop (skipped), value calculated
using timer frequency.. 4800.05 BogoMIPS (lpj=3D2400026)
[   10.403157] Security Framework initialized
[   10.416878] SELinux:  Initializing.
[   10.428608] Mount-cache hash table entries: 256
[   10.443892] Initializing cgroup subsys ns
[   10.457205] Initializing cgroup subsys cpuacct
[   10.472071] Initializing cgroup subsys freezer
[   10.486973] CPU: L1 I cache: 32K, L1 D cache: 32K
[   10.502669] CPU: L2 cache: 256K
[   10.513252] CPU: L3 cache: 8192K
[   10.524125] CPU: Unsupported number of siblings 16
[   10.539282] mce: CPU supports 9 MCE banks
[   10.553603] Performance Events: unsupported p6 CPU model 30 no PMU
driver, software events only.
[   10.582756] SMP alternatives: switching to UP code
[   10.635796] ACPI: Core revision 20090903
[   10.668729] installing Xen timer for CPU 1
[   10.681928] SMP alternatives: switching to SMP code
[   10.734120] Initializing CPU#1
[   10.734156] CPU: L1 I cache: 32K, L1 D cache: 32K
[   10.734158] CPU: L2 cache: 256K
[   10.734159] CPU: L3 cache: 8192K
[   10.734163] CPU: Unsupported number of siblings 16
[   10.734239] installing Xen timer for CPU 2
[   10.810958] Initializing CPU#2
[   10.810992] CPU: L1 I cache: 32K, L1 D cache: 32K
[   10.810994] CPU: L2 cache: 256K
[   10.810995] CPU: L3 cache: 8192K
[   10.810999] CPU: Unsupported number of siblings 16
[   10.811070] installing Xen timer for CPU 3
[   10.888173] Initializing CPU#3
[   10.888207] CPU: L1 I cache: 32K, L1 D cache: 32K
[   10.888209] CPU: L2 cache: 256K
[   10.888211] CPU: L3 cache: 8192K
[   10.888214] CPU: Unsupported number of siblings 16
[   10.888248] Brought up 4 CPUs
[   10.962416] Grant table initialized
[   10.973608] Time: 15:24:53  Date: 12/14/11
[   10.987357] NET: Registered protocol family 16
[   11.002765] ACPI FADT declares the system doesn't support PCIe
ASPM, so disable it
[   11.027370] ACPI: bus type pci registered
[   11.041225] PCI: MCFG configuration 0: base a0000000 segment 0 buses 0 -=
 255
[   11.064263] PCI: MCFG area at a0000000 reserved in E820
[   11.105483] PCI: Using MMCONFIG at a0000000 - afffffff
[   11.122083] PCI: Using configuration type 1 for base access
[   11.152342] bio: create slab <bio-0> at 0
[   11.166715] ERROR: Unable to locate IOAPIC for GSI 9
[   11.184378] ACPI Error: Field [CPB3] at 96 exceeds Buffer [NULL]
size 64 (bits) (20090903/dsopcode-596)
[   11.214992] ACPI Error (psparse-0537): Method parse/execution
failed [\_SB_._OSC] (Node ffff88003fc187c0), AE_AML_BUFFER_LIMIT
[   11.275785] ACPI: Interpreter enabled
[   11.287525] ACPI: (supports S0 S1 S5)
[   11.299822] ACPI: Using IOAPIC for interrupt routing
[   11.329279] ACPI: No dock devices found.
[   11.342638] ACPI: PCI Root Bridge [PCI0] (0000:00)
[   11.358366] pci 0000:00:05.0: PME# supported from D0 D3hot D3cold
[   11.378399] pci 0000:00:05.0: PME# disabled
[   11.393065] pci 0000:00:19.0: PME# supported from D0 D3hot D3cold
[   11.412812] pci 0000:00:19.0: PME# disabled
[   11.427012] pci 0000:00:1a.0: PME# supported from D0 D3hot D3cold
[   11.447131] pci 0000:00:1a.0: PME# disabled
[   11.461256] pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold
[   11.481449] pci 0000:00:1c.0: PME# disabled
[   11.495578] pci 0000:00:1c.4: PME# supported from D0 D3hot D3cold
[   11.515769] pci 0000:00:1c.4: PME# disabled
[   11.529893] pci 0000:00:1c.6: PME# supported from D0 D3hot D3cold
[   11.550087] pci 0000:00:1c.6: PME# disabled
[   11.564212] pci 0000:00:1c.7: PME# supported from D0 D3hot D3cold
[   11.584407] pci 0000:00:1c.7: PME# disabled
[   11.598597] pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold
[   11.618728] pci 0000:00:1d.0: PME# disabled
[   11.633590] pci 0000:03:00.0: PME# supported from D0 D3hot D3cold
[   11.653337] pci 0000:03:00.0: PME# disabled
[   11.667914] pci 0000:00:1e.0: transparent bridge
(XEN) PCI add device 00:00.0
(XEN) PCI add device 00:05.0
(XEN) PCI add device 00:08.0
(XEN) PCI add device 00:08.1
(XEN) PCI add device 00:08.2
(XEN) PCI add device 00:08.3
(XEN) PCI add device 00:10.0
(XEN) PCI add device 00:10.1
(XEN) PCI add device 00:19.0
(XEN) PCI add device 00:1a.0
(XEN) PCI add device 00:1c.0
(XEN) PCI add device 00:1c.4
(XEN) PCI add device 00:1c.6
(XEN) PCI add device 00:1c.7
(XEN) PCI add device 00:1d.0
(XEN) PCI add device 00:1e.0
(XEN) PCI add device 00:1f.0
(XEN) PCI add device 00:1f.3
(XEN) PCI add device 01:00.0
(XEN) PCI add device 03:00.0
(XEN) PCI add device 04:00.0
[   11.864475] ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 9 *10
11 12 14 15)
[   11.888232] ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 6 7 9 10
*11 12 14 15)
[   11.912254] ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 *5 6 7 9 10
11 12 14 15)
[   11.936300] ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 7 9 10
*11 12 14 15)
[   11.960301] ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 6 7 9 10 11
12 14 15) *0, disabled.
[   11.988037] ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 7 *9 10
11 12 14 15)
[   12.012064] ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 9 10 11
12 14 15) *0, disabled.
[   12.039801] ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 7 9 *10
11 12 14 15)
[   12.063966] xen_balloon: Initialising balloon driver with page order 0.
[   12.085852] last_pfn =3D 0x340000 max_arch_pfn =3D 0x400000000
[   12.134092] vgaarb: device added:
PCI:0000:04:00.0,decodes=3Dio+mem,owns=3Dio+mem,locks=3Dnone
[   12.160419] vgaarb: loaded
[   12.169810] SCSI subsystem initialized
[   12.182634] usbcore: registered new interface driver usbfs
[   12.200513] usbcore: registered new interface driver hub
[   12.218271] usbcore: registered new device driver usb
[   12.235434] PCI: Using ACPI for IRQ routing
[   12.249456] cfg80211: Using static regulatory domain info
[   12.267093] cfg80211: Regulatory domain: US
[   12.281108] 	(start_freq - end_freq @ bandwidth),
(max_antenna_gain, max_eirp)
[   12.305128] 	(2402000 KHz - 2472000 KHz @ 40000 KHz), (600 mBi, 2700 mBm)
[   12.327725] 	(5170000 KHz - 5190000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[   12.350318] 	(5190000 KHz - 5210000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[   12.372912] 	(5210000 KHz - 5230000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[   12.395505] 	(5230000 KHz - 5330000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[   12.418099] 	(5735000 KHz - 5835000 KHz @ 40000 KHz), (600 mBi, 3000 mBm)
[   12.440703] cfg80211: Calling CRDA for country: US
[   12.456754] NetLabel: Initializing
[   12.468144] NetLabel:  domain hash size =3D 128
[   12.482728] NetLabel:  protocols =3D UNLABELED CIPSOv4
[   12.499325] NetLabel:  unlabeled traffic allowed by default
[   12.518090] Switching to clocksource xen
[   12.533142] pnp: PnP ACPI init
[   12.542896] ACPI: bus type pnp registered
[   12.557733] xen_allocate_pirq: returning irq 8 for gsi 8
[   12.575024] xen_allocate_pirq: returning irq 13 for gsi 13
[   12.594078] xen_allocate_pirq: returning irq 4 for gsi 4
[   12.611257] Already setup the GSI :4
[   12.623748] xen_allocate_pirq: returning irq 3 for gsi 3
[   12.641472] pnp: PnP ACPI: found 11 devices
[   12.655004] ACPI: ACPI bus type pnp unregistered
[   12.670480] system 00:07: ioport range 0x500-0x57f has been reserved
[   12.691635] system 00:07: ioport range 0x600-0x61f has been reserved
[   12.712799] system 00:07: ioport range 0x880-0x883 has been reserved
[   12.733963] system 00:07: ioport range 0xca4-0xca5 has been reserved
[   12.755125] system 00:07: ioport range 0x400-0x47f has been reserved
[   12.776290] system 00:07: ioport range 0x800-0x81f has been reserved
[   12.797453] system 00:07: ioport range 0xca2-0xca3 has been reserved
[   12.818617] system 00:07: iomem range 0xfed1c000-0xfed3fffe could
not be reserved
[   12.843499] system 00:07: iomem range 0xff000000-0xffffffff could
not be reserved
[   12.868380] system 00:07: iomem range 0xfee00000-0xfeefffff could
not be reserved
[   12.893260] system 00:07: iomem range 0xfe900000-0xfe90001f has been res=
erved
[   12.916999] system 00:07: iomem range 0xfea00000-0xfea0001f has been res=
erved
[   12.940735] system 00:07: iomem range 0xfed1b000-0xfed1bfff has been res=
erved
[   12.964474] system 00:07: iomem range 0xfed14000-0xfed17ffe has been res=
erved
[   12.988211] system 00:07: iomem range 0xfed18000-0xfed18ffe has been res=
erved
[   13.011948] system 00:07: iomem range 0xfed19000-0xfed19ffe has been res=
erved
[   13.040791] PM-Timer failed consistency check  (0x0xffffff) - aborting.
[   13.062258] pci 0000:01:00.0: BAR 6: no parent found for of device
[0xfffe0000-0xffffffff]
[   13.089706] pci 0000:04:00.0: BAR 6: no parent found for of device
[0xffff0000-0xffffffff]
[   13.117229] pci 0000:00:05.0: PCI bridge, secondary bus 0000:01
[   13.136896] pci 0000:00:05.0:   IO window: 0x2000-0x2fff
[   13.154630] pci 0000:00:05.0:   MEM window: 0xb3a00000-0xb3afffff
[   13.174934] pci 0000:00:05.0:   PREFETCH window:
0x000000b0000000-0x000000b1ffffff
[   13.200105] pci 0000:00:1c.0: PCI bridge, secondary bus 0000:02
[   13.219833] pci 0000:00:1c.0:   IO window: disabled
[   13.236139] pci 0000:00:1c.0:   MEM window: disabled
[   13.252725] pci 0000:00:1c.0:   PREFETCH window: disabled
[   13.270747] pci 0000:00:1c.4: PCI bridge, secondary bus 0000:03
[   13.290474] pci 0000:00:1c.4:   IO window: 0x1000-0x1fff
[   13.308211] pci 0000:00:1c.4:   MEM window: 0xb3900000-0xb39fffff
[   13.328512] pci 0000:00:1c.4:   PREFETCH window: disabled
[   13.346535] pci 0000:00:1c.6: PCI bridge, secondary bus 0000:04
[   13.366260] pci 0000:00:1c.6:   IO window: disabled
[   13.382568] pci 0000:00:1c.6:   MEM window: 0xb3000000-0xb38fffff
[   13.402871] pci 0000:00:1c.6:   PREFETCH window:
0x000000b2000000-0x000000b2ffffff
[   13.428042] pci 0000:00:1c.7: PCI bridge, secondary bus 0000:05
[   13.447768] pci 0000:00:1c.7:   IO window: disabled
[   13.464075] pci 0000:00:1c.7:   MEM window: disabled
[   13.480662] pci 0000:00:1c.7:   PREFETCH window: disabled
[   13.498683] pci 0000:00:1e.0: PCI bridge, secondary bus 0000:06
[   13.518410] pci 0000:00:1e.0:   IO window: disabled
[   13.534715] pci 0000:00:1e.0:   MEM window: disabled
[   13.551301] pci 0000:00:1e.0:   PREFETCH window: disabled
[   13.569362] pci 0000:00:05.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[   13.591642] xen_allocate_pirq: returning irq 16 for gsi 16
[   13.609934] Already setup the GSI :16
[   13.622226] pci 0000:00:1c.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[   13.644549] xen_allocate_pirq: returning irq 16 for gsi 16
[   13.662868] Already setup the GSI :16
[   13.675158] pci 0000:00:1c.4: PCI INT B -> GSI 16 (level, low) -> IRQ 16
[   13.697497] pci 0000:00:1c.6: PCI INT C -> GSI 18 (level, low) -> IRQ 18
[   13.719804] pci 0000:00:1c.7: PCI INT D -> GSI 19 (level, low) -> IRQ 19
[   13.742154] NET: Registered protocol family 2
[   13.756744] IP route cache hash table entries: 524288 (order: 10,
4194304 bytes)
[   13.781907] TCP established hash table entries: 262144 (order: 10,
4194304 bytes)
[   13.807468] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[   13.829520] TCP: Hash tables configured (established 262144 bind 65536)
[   13.851233] TCP reno registered
[   13.861877] NET: Registered protocol family 1
[   13.876613] RPC: Registered udp transport module.
[   13.892130] RPC: Registered tcp transport module.
[   13.907860] RPC: Registered tcp NFSv4.1 backchannel transport module.
[   13.929669] Trying to unpack rootfs image as initramfs...
[   13.951302] Freeing initrd memory: 4911k freed
[   13.966207] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
[   13.987093] DMA: Placing 64MB software IO TLB between
ffff880020000000 - ffff880024000000
[   14.014263] DMA: software IO TLB at phys 0x20000000 - 0x24000000
[   14.034354] kvm: no hardware support
[   14.046297] has_svm: not amd
[   14.056017] kvm: no hardware support
[   14.070606] Microcode Update Driver: v2.00
<tigran@aivazian.fsnet.co.uk>, Peter Oruba
[   14.096071] Scanning for low memory corruption every 60 seconds
[   14.116238] audit: initializing netlink socket (disabled)
[   14.133839] type=3D2000 audit(1323876295.119:1): initialized
[   14.166146] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[   14.190435] VFS: Disk quotas dquot_6.5.2
[   14.203141] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[   14.225580] msgmni has been set to 1523
[   14.238220] alg: No test for cipher_null (cipher_null-generic)
[   14.257375] alg: No test for ecb(cipher_null) (ecb-cipher_null)
[   14.277104] alg: No test for digest_null (digest_null-generic)
[   14.296552] alg: No test for compress_null (compress_null-generic)
[   14.318199] alg: No test for stdrng (krng)
[   14.331510] Block layer SCSI generic (bsg) driver version 0.4
loaded (major 252)
[   14.355960] io scheduler noop registered
[   14.369119] io scheduler anticipatory registered
[   14.384558] io scheduler deadline registered
[   14.399011] io scheduler cfq registered (default)
[   14.416324] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
[   14.434795] input: Sleep Button as
/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input0
[   14.462101] ACPI: Sleep Button [SLPB]
[   14.474475] input: Power Button as
/devices/LNXSYSTM:00/LNXPWRBN:00/input/input1
[   14.498985] ACPI: Power Button [PWRF]
[   14.517284] Event-channel device installed.
[   14.532898] blktap_device_init: blktap device major 253
[   14.549785] blktap_ring_init: blktap ring major: 251
[   14.569119] registering netback
[   14.583933] hpet_acpi_add: no address or irqs in _CRS
[   14.600423] Non-volatile memory driver v1.3
[   14.614307] Linux agpgart interface v0.103
[   14.628106] [drm] Initialized drm 1.1.0 20060810
[   14.643467] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
(XEN) irq.c:1139:d0 Cannot bind IRQ 4 to guest. In use by 'ns16550'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 2 to guest. In use by 'cascade'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 4 to guest. In use by 'ns16550'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 2 to guest. In use by 'cascade'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 4 to guest. In use by 'ns16550'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 2 to guest. In use by 'cascade'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 4 to guest. In use by 'ns16550'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 2 to guest. In use by 'cascade'.
[   15.065371] serial8250: ttyS1 at I/O 0x2f8 (irq =3D 3) is a 16550A
[   15.086004] 00:09: ttyS1 at I/O 0x2f8 (irq =3D 3) is a 16550A
[   15.106511] brd: module loaded
[   15.166239] loop: module loaded
[   15.176421] input: Macintosh mouse button emulation as
/devices/virtual/input/input2
[   15.202110] 3ware 9000 Storage Controller device driver for Linux
v2.26.02.012.
[   15.226331] xen_allocate_pirq: returning irq 16 for gsi 16
[   15.244631] Already setup the GSI :16
[   15.256909] 3w-9xxx 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IR=
Q 16
[   15.535246] 3w-9xxx: scsi0: AEN: INFO (0x04:0x0053): Battery
capacity test is overdue:.
[   15.662242] scsi0 : 3ware 9000 Storage Controller
[   15.677727] 3w-9xxx: scsi0: Found a 3ware 9000 Storage Controller
at 0xb3a00000, IRQ: 16.
[   16.010243] 3w-9xxx: scsi0: Firmware FH9X 4.10.00.021, BIOS BE9X
4.08.00.003, Ports: 128.
[   16.037272] scsi 0:0:0:0: Direct-Access     AMCC     9690SA-4I
DISK  4.10 PQ: 0 ANSI: 5
[   16.073169] sd 0:0:0:0: [sda] 2929666048 512-byte logical blocks:
(1.49 TB/1.36 TiB)
[   16.077572] sd 0:0:0:0: Attached scsi generic sg0 type 0
[   16.077953] Intel(R) PRO/1000 Network Driver - version 7.3.21-k5-NAPI
[   16.077955] Copyright (c) 1999-2006 Intel Corporation.
[   16.078011] e1000e: Intel(R) PRO/1000 Network Driver - 1.0.2-k2
[   16.078012] e1000e: Copyright (c) 1999-2008 Intel Corporation.
[   16.078055] xen_allocate_pirq: returning irq 16 for gsi 16
[   16.078058] Already setup the GSI :16
[   16.078061] e1000e 0000:00:19.0: PCI INT A -> GSI 16 (level, low) -> IRQ=
 16
[   16.248299] sd 0:0:0:0: [sda] Write Protect is off
[   16.264315] sd 0:0:0:0: [sda] Write cache: enabled, read cache:
enabled, supports DPO and FUA
[   16.293627]  sda: sda1 sda2 < sda5 sda6 sda7 sda8 sda9 >
[   16.362257] sd 0:0:0:0: [sda] Attached SCSI disk
[1032482.485795] IPT FORWARD [NEW INVALID] IN=3Deth0 OUT=3Deth0
PHYSIN=3Dvif2.0 PHYSOUT=3Dpeth0 SRC=3D192.168.40.18 DST=3D80.74.180.217
LEN=3D644 TOS=3D0x00 PREC=3D0x00 TTL=3D64 ID=3D9056 DF PROTO=3DTCP SPT=3D80=
 DPT=3D7629
WINDOW=3D82 RES=3D0x00 ACK PSH URGP=3D0
 __  __            _  _    ___   _
 \ \/ /___ _ __   | || |  / _ \ / |
  \  // _ \ '_ \  | || |_| | | || |
  /  \  __/ | | | |__   _| |_| || |
 /_/\_\___|_| |_|    |_|(_)___(_)_|

(XEN) Xen version 4.0.1 (root@mens-net.private) (gcc version 4.4.5
(Debian 4.4.5-8) ) Fri Dec  2 16:56:12 CET 2011
(XEN) Latest ChangeSet: unavailable
(XEN) Console output is synchronous.
(XEN) Bootloader: GNU GRUB 0.97
(XEN) Command line: dom0_mem=3D2048M max_cstate=3D1 loglvl=3Dall
guest_loglvl=3Dall sync_console com1=3D38400,8n1 console=3Dcom1
(XEN) Video information:
(XEN)  VGA is text mode 80x25, font 8x16
(XEN)  VBE/DDC methods: V2; EDID transfer time: 1 seconds
(XEN) Disc information:
(XEN)  Found 1 MBR signatures
(XEN)  Found 1 EDD information structures
(XEN) Xen-e820 RAM map:
(XEN)  0000000000000000 - 000000000009b800 (usable)
(XEN)  000000000009b800 - 00000000000a0000 (reserved)
(XEN)  00000000000e0000 - 0000000000100000 (reserved)
(XEN)  0000000000100000 - 000000009d8e9000 (usable)
(XEN)  000000009d8e9000 - 000000009d9bb000 (ACPI NVS)
(XEN)  000000009d9bb000 - 000000009f6a4000 (ACPI data)
(XEN)  000000009f6a4000 - 000000009f6df000 (reserved)
(XEN)  000000009f6df000 - 000000009f78a000 (ACPI data)
(XEN)  000000009f78a000 - 000000009f7df000 (ACPI NVS)
(XEN)  000000009f7df000 - 000000009f800000 (ACPI data)
(XEN)  000000009f800000 - 00000000b0000000 (reserved)
(XEN)  00000000fed1c000 - 00000000fed20000 (reserved)
(XEN)  00000000ff800000 - 0000000100000000 (reserved)
(XEN)  0000000100000000 - 0000000460000000 (usable)
(XEN) ACPI: RSDP 000F0410, 0024 (r2 INTEL )
(XEN) ACPI: XSDT 9F7FD120, 008C (r1 INTEL  S3420GPC        0       1000013)
(XEN) ACPI: FACP 9F7FB000, 00F4 (r4 INTEL  S3420GPC        0 MSFT  100000D)
(XEN) ACPI: DSDT 9F7F6000, 4E22 (r2 INTEL  S3420GPC        3 MSFT  100000D)
(XEN) ACPI: FACS 9F78A000, 0040
(XEN) ACPI: APIC 9F7F5000, 00BC (r2 INTEL  S3420GPC        0 MSFT  100000D)
(XEN) ACPI: MCFG 9F7F4000, 003C (r1 INTEL  S3420GPC        1 MSFT  100000D)
(XEN) ACPI: HPET 9F7F3000, 0038 (r1 INTEL  S3420GPC        1 MSFT  100000D)
(XEN) ACPI: SLIT 9F7F2000, 0030 (r1 INTEL  S3420GPC        1 MSFT  100000D)
(XEN) ACPI: SPCR 9F7F1000, 0050 (r1 INTEL  S3420GPC        0 MSFT  100000D)
(XEN) ACPI: WDDT 9F7F0000, 0040 (r1 INTEL  S3420GPC        0 MSFT  100000D)
(XEN) ACPI: SSDT 9F7E5000, AEF4 (r2  INTEL SSDT  PM     4000 INTL 20061109)
(XEN) ACPI: SSDT 9F7E4000, 01D8 (r2  INTEL IPMI         4000 INTL 20061109)
(XEN) ACPI: HEST 9F7E3000, 00A8 (r1 INTEL  S3420GPC        1 INTL        1)
(XEN) ACPI: BERT 9F7E2000, 0030 (r1 INTEL  S3420GPC        1 INTL        1)
(XEN) ACPI: ERST 9F7E1000, 0230 (r1 INTEL  S3420GPC        1 INTL        1)
(XEN) ACPI: EINJ 9F7E0000, 0130 (r1 INTEL  S3420GPC        1 INTL        1)
(XEN) System RAM: 16344MB (16736784kB)
(XEN) No NUMA configuration found
(XEN) Faking a node at 0000000000000000-0000000460000000
(XEN) Domain heap initialised
(XEN) found SMP MP-table at 000fd9a0
(XEN) DMI 2.5 present.
(XEN) Using APIC driver default
(XEN) ACPI: PM-Timer IO Port: 0x408
(XEN) ACPI: ACPI SLEEP INFO: pm1x_cnt[404,0], pm1x_evt[400,0]
(XEN) ACPI:                  wakeup_vec[9f78a00c], vec_size[20]
(XEN) ACPI: Local APIC address 0xfee00000
(XEN) ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
(XEN) Processor #0 7:14 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] enabled)
(XEN) Processor #2 7:14 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x02] lapic_id[0x04] enabled)
(XEN) Processor #4 7:14 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x03] lapic_id[0x06] enabled)
(XEN) Processor #6 7:14 APIC version 21
(XEN) ACPI: LAPIC (acpi_id[0x04] lapic_id[0x01] disabled)
(XEN) ACPI: LAPIC (acpi_id[0x05] lapic_id[0x03] disabled)
(XEN) ACPI: LAPIC (acpi_id[0x06] lapic_id[0x05] disabled)
(XEN) ACPI: LAPIC (acpi_id[0x07] lapic_id[0x07] disabled)
(XEN) ACPI: LAPIC_NMI (acpi_id[0x00] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x01] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x02] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x03] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x04] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x05] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x06] high level lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x07] high level lint[0x1])
(XEN) ACPI: IOAPIC (id[0x08] address[0xfec00000] gsi_base[0])
(XEN) IOAPIC[0]: apic_id 8, version 32, address 0xfec00000, GSI 0-23
(XEN) ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
(XEN) ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
(XEN) ACPI: IRQ0 used by override.
(XEN) ACPI: IRQ2 used by override.
(XEN) ACPI: IRQ9 used by override.
(XEN) Enabling APIC mode:  Flat.  Using 1 I/O APICs
(XEN) ACPI: HPET id: 0x8086a801 base: 0xfed00000
(XEN) PCI: MCFG configuration 0: base a0000000 segment 0 buses 0 - 255
(XEN) PCI: MCFG area at a0000000 reserved in E820
(XEN) Using ACPI (MADT) for SMP configuration information
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) Detected 2400.040 MHz processor.
(XEN) Initing memory sharing.
(XEN) VMX: Supported advanced features:
(XEN)  - APIC MMIO access virtualisation
(XEN)  - APIC TPR shadow
(XEN)  - Extended Page Tables (EPT)
(XEN)  - Virtual-Processor Identifiers (VPID)
(XEN)  - Virtual NMI
(XEN)  - MSR direct-access bitmap
(XEN) EPT supports 2MB super page.
(XEN) HVM: ASIDs enabled.
(XEN) HVM: VMX enabled
(XEN) HVM: Hardware Assisted Paging detected.
(XEN) Intel machine check reporting enabled
(XEN) I/O virtualisation disabled
(XEN) Total of 4 processors activated.
(XEN) ENABLING IO-APIC IRQs
(XEN)  -> Using new ACK method
(XEN) ..TIMER: vector=3D0xF0 apic1=3D0 pin1=3D2 apic2=3D-1 pin2=3D-1
(XEN) TSC is reliable, synchronization unnecessary
(XEN) Platform timer appears to have unexpectedly wrapped 1 times.
(XEN) Platform timer is 14.318MHz HPET
=FF(XEN) Allocated console ring of 32 KiB.
(XEN) microcode.c:73:d32767 microcode: CPU1 resumed
(XEN) microcode.c:73:d32767 microcode: CPU3 resumed
(XEN) Brought up 4 CPUs
(XEN) microcode.c:73:d32767 microcode: CPU2 resumed
(XEN) Turbo Mode detected!
(XEN) HPET: 8 timers in total, 8 timers will be used for broadcast
(XEN) ACPI sleep modes: S3
(XEN) mcheck_poll: Machine check polling timer started.
(XEN) *** LOADING DOMAIN 0 ***
(XEN)  Xen  kernel: 64-bit, lsb, compat32
(XEN)  Dom0 kernel: 64-bit, PAE, lsb, paddr 0x1000000 -> 0x1bfc000
(XEN) PHYSICAL MEMORY ARRANGEMENT:
(XEN)  Dom0 alloc.:   0000000450000000->0000000454000000 (507904 pages
to be allocated)
(XEN) VIRTUAL MEMORY ARRANGEMENT:
(XEN)  Loaded kernel: ffffffff81000000->ffffffff81bfc000
(XEN)  Init. ramdisk: ffffffff81bfc000->ffffffff820c7c00
(XEN)  Phys-Mach map: ffffffff820c8000->ffffffff824c8000
(XEN)  Start info:    ffffffff824c8000->ffffffff824c84b4
(XEN)  Page tables:   ffffffff824c9000->ffffffff824e0000
(XEN)  Boot stack:    ffffffff824e0000->ffffffff824e1000
(XEN)  TOTAL:         ffffffff80000000->ffffffff82800000
(XEN)  ENTRY ADDRESS: ffffffff81976200
(XEN) Dom0 has maximum 4 VCPUs
(XEN) Scrubbing Free RAM:
...........................................................................=
..................................................................done.
(XEN) trace.c:89:d32767 calc_tinfo_first_offset: NR_CPUs 128,
offset_in_bytes 258, t_info_first_offset 65
(XEN) Xen trace buffers: disabled
(XEN) Std. Loglevel: All
(XEN) Guest Loglevel: All
(XEN) **********************************************
(XEN) ******* WARNING: CONSOLE OUTPUT IS SYNCHRONOUS
(XEN) ******* This option is intended to aid debugging of Xen by ensuring
(XEN) ******* that all output is synchronously delivered on the serial line.
(XEN) ******* However it can introduce SIGNIFICANT latencies and affect
(XEN) ******* timekeeping. It is NOT recommended for production use!
(XEN) **********************************************
(XEN) 3... 2... 1...
(XEN) *** Serial input -> DOM0 (type 'CTRL-a' three times to switch
input to Xen)
(XEN) Freed 176kB init memory.
mapping kernel into physical memory
Xen: setup ISA identity maps
about to get started...
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 2.6.32.47 (root@xenhost-rack2) (gcc
version 4.4.5 (Debian 4.4.5-8) ) #1 SMP Fri Dec 2 13:05:28 CET 2011
[    0.000000] Command line:
root=3DUUID=3D5563bc26-6e98-4768-abee-5ca053e2795c ro nomodeset
max_loop=3D255 console=3Dhvc0 earlyprintk=3Dxen nomodeset initcall_debug
debug loglevel=3D10
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] released 0 pages of unused memory
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  Xen: 0000000000000000 - 000000000009b000 (usable)
[    0.000000]  Xen: 000000000009b800 - 0000000000100000 (reserved)
[    0.000000]  Xen: 0000000000100000 - 0000000080000000 (usable)
[    0.000000]  Xen: 0000000080000000 - 000000009d8e9000 (unusable)
[    0.000000]  Xen: 000000009d8e9000 - 000000009d9bb000 (ACPI NVS)
[    0.000000]  Xen: 000000009d9bb000 - 000000009f6a4000 (ACPI data)
[    0.000000]  Xen: 000000009f6a4000 - 000000009f6df000 (reserved)
[    0.000000]  Xen: 000000009f6df000 - 000000009f78a000 (ACPI data)
[    0.000000]  Xen: 000000009f78a000 - 000000009f7df000 (ACPI NVS)
[    0.000000]  Xen: 000000009f7df000 - 000000009f800000 (ACPI data)
[    0.000000]  Xen: 000000009f800000 - 00000000b0000000 (reserved)
[    0.000000]  Xen: 00000000fec00000 - 00000000fec01000 (reserved)
[    0.000000]  Xen: 00000000fed1c000 - 00000000fed20000 (reserved)
[    0.000000]  Xen: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  Xen: 00000000ff800000 - 0000000100000000 (reserved)
[    0.000000]  Xen: 0000000100000000 - 000000047d8e9000 (usable)
[    0.000000] bootconsole [xenboot0] enabled
[    0.000000] DMI 2.5 present.
[    0.000000] last_pfn =3D 0x47d8e9 max_arch_pfn =3D 0x400000000
[    0.000000] x86 PAT enabled: cpu 0, old 0x50100070406, new 0x70106000701=
06
[    0.000000] last_pfn =3D 0x80000 max_arch_pfn =3D 0x400000000
[    0.000000] e820 update range: 0000000000001000 - 0000000000006000
(usable) =3D=3D> (reserved)
[    0.000000] Scanning 1 areas for low memory corruption
[    0.000000] modified physical RAM map:
[    0.000000]  modified: 0000000000000000 - 0000000000001000 (usable)
[    0.000000]  modified: 0000000000001000 - 0000000000006000 (reserved)
[    0.000000]  modified: 0000000000006000 - 000000000009b000 (usable)
[    0.000000]  modified: 000000000009b800 - 0000000000100000 (reserved)
[    0.000000]  modified: 0000000000100000 - 0000000080000000 (usable)
[    0.000000]  modified: 0000000080000000 - 000000009d8e9000 (unusable)
[    0.000000]  modified: 000000009d8e9000 - 000000009d9bb000 (ACPI NVS)
[    0.000000]  modified: 000000009d9bb000 - 000000009f6a4000 (ACPI data)
[    0.000000]  modified: 000000009f6a4000 - 000000009f6df000 (reserved)
[    0.000000]  modified: 000000009f6df000 - 000000009f78a000 (ACPI data)
[    0.000000]  modified: 000000009f78a000 - 000000009f7df000 (ACPI NVS)
[    0.000000]  modified: 000000009f7df000 - 000000009f800000 (ACPI data)
[    0.000000]  modified: 000000009f800000 - 00000000b0000000 (reserved)
[    0.000000]  modified: 00000000fec00000 - 00000000fec01000 (reserved)
[    0.000000]  modified: 00000000fed1c000 - 00000000fed20000 (reserved)
[    0.000000]  modified: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  modified: 00000000ff800000 - 0000000100000000 (reserved)
[    0.000000]  modified: 0000000100000000 - 000000047d8e9000 (usable)
[    0.000000] initial memory mapped : 0 - 020c8000
[    0.000000] init_memory_mapping: 0000000000000000-0000000080000000
[    0.000000]  0000000000 - 0080000000 page 4k
[    0.000000] kernel direct mapping tables up to 80000000 @ 100000-503000
[    0.000000] init_memory_mapping: 0000000100000000-000000047d8e9000
[    0.000000]  0100000000 - 047d8e9000 page 4k
[    0.000000] kernel direct mapping tables up to 47d8e9000 @ 24e0000-48e00=
00
[    0.000000] RAMDISK: 01bfc000 - 020c7c00
[    0.000000] ACPI: RSDP 00000000000f0410 00024 (v02 INTEL )
[    0.000000] ACPI: XSDT 000000009f7fd120 0008C (v01 INTEL  S3420GPC
00000000      01000013)
[    0.000000] ACPI: FACP 000000009f7fb000 000F4 (v04 INTEL  S3420GPC
00000000 MSFT 0100000D)
[    0.000000] ACPI: DSDT 000000009f7f6000 04E22 (v02 INTEL  S3420GPC
00000003 MSFT 0100000D)
[    0.000000] ACPI: FACS 000000009f78a000 00040
[    0.000000] ACPI: APIC 000000009f7f5000 000BC (v02 INTEL  S3420GPC
00000000 MSFT 0100000D)
[    0.000000] ACPI: MCFG 000000009f7f4000 0003C (v01 INTEL  S3420GPC
00000001 MSFT 0100000D)
[    0.000000] ACPI: HPET 000000009f7f3000 00038 (v01 INTEL  S3420GPC
00000001 MSFT 0100000D)
[    0.000000] ACPI: SLIT 000000009f7f2000 00030 (v01 INTEL  S3420GPC
00000001 MSFT 0100000D)
[    0.000000] ACPI: SPCR 000000009f7f1000 00050 (v01 INTEL  S3420GPC
00000000 MSFT 0100000D)
[    0.000000] ACPI: WDDT 000000009f7f0000 00040 (v01 INTEL  S3420GPC
00000000 MSFT 0100000D)
[    0.000000] ACPI: SSDT 000000009f7e5000 0AEF4 (v02  INTEL SSDT  PM
00004000 INTL 20061109)
[    0.000000] ACPI: SSDT 000000009f7e4000 001D8 (v02  INTEL IPMI
00004000 INTL 20061109)
[    0.000000] ACPI: HEST 000000009f7e3000 000A8 (v01 INTEL  S3420GPC
00000001 INTL 00000001)
[    0.000000] ACPI: BERT 000000009f7e2000 00030 (v01 INTEL  S3420GPC
00000001 INTL 00000001)
[    0.000000] ACPI: ERST 000000009f7e1000 00230 (v01 INTEL  S3420GPC
00000001 INTL 00000001)
[    0.000000] ACPI: EINJ 000000009f7e0000 00130 (v01 INTEL  S3420GPC
00000001 INTL 00000001)
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] (10 early reservations) =3D=3D> bootmem [0000000000 - 047d8e=
9000]
[    0.000000]   #0 [0000000000 - 0000001000]   BIOS data page =3D=3D>
[0000000000 - 0000001000]
[    0.000000]   #1 [00024c9000 - 00024e0000]   XEN PAGETABLES =3D=3D>
[00024c9000 - 00024e0000]
[    0.000000]   #2 [0000006000 - 0000008000]       TRAMPOLINE =3D=3D>
[0000006000 - 0000008000]
[    0.000000]   #3 [0001000000 - 0001ad1474]    TEXT DATA BSS =3D=3D>
[0001000000 - 0001ad1474]
[    0.000000]   #4 [0001bfc000 - 00020c7c00]          RAMDISK =3D=3D>
[0001bfc000 - 00020c7c00]
[    0.000000]   #5 [00020c8000 - 00024c9000]   XEN START INFO =3D=3D>
[00020c8000 - 00024c9000]
[    0.000000]   #6 [0100000000 - 047d8e9000]        XEN EXTRA =3D=3D>
[0100000000 - 047d8e9000]
[    0.000000]   #7 [0001ad2000 - 0001ae036c]              BRK =3D=3D>
[0001ad2000 - 0001ae036c]
[    0.000000]   #8 [0000100000 - 00004e9000]          PGTABLE =3D=3D>
[0000100000 - 00004e9000]
[    0.000000]   #9 [00024e0000 - 00040db000]          PGTABLE =3D=3D>
[00024e0000 - 00040db000]
[    0.000000] found SMP MP-table at [ffff8800000fd9a0] fd9a0
[    0.000000] Zone PFN ranges:
[    0.000000]   DMA      0x00000000 -> 0x00001000
[    0.000000]   DMA32    0x00001000 -> 0x00100000
[    0.000000]   Normal   0x00100000 -> 0x0047d8e9
[    0.000000] Movable zone start PFN for each node
[    0.000000] early_node_map[4] active PFN ranges
[    0.000000]     0: 0x00000000 -> 0x00000001
[    0.000000]     0: 0x00000006 -> 0x0000009b
[    0.000000]     0: 0x00000100 -> 0x00080000
[    0.000000]     0: 0x00100000 -> 0x0047d8e9
[    0.000000] On node 0 totalpages: 4184191
[    0.000000]   DMA zone: 56 pages used for memmap
[    0.000000]   DMA zone: 1004 pages reserved
[    0.000000]   DMA zone: 2930 pages, LIFO batch:0
[    0.000000]   DMA32 zone: 14280 pages used for memmap
[    0.000000]   DMA32 zone: 505912 pages, LIFO batch:31
[    0.000000]   Normal zone: 50040 pages used for memmap
[    0.000000]   Normal zone: 3609969 pages, LIFO batch:31
[    0.000000] ACPI: PM-Timer IO Port: 0x408
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x04] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x06] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x04] lapic_id[0x01] disabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x05] lapic_id[0x03] disabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x06] lapic_id[0x05] disabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x07] lapic_id[0x07] disabled)
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x02] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x03] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x04] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x05] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x06] high level lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x07] high level lint[0x1])
[    0.000000] ACPI: IOAPIC (id[0x08] address[0xfec00000] gsi_base[0])
[    0.000000] IOAPIC[0]: apic_id 8, version 0, address 0xfec00000, GSI 0-0
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[    0.000000] ERROR: Unable to locate IOAPIC for GSI 2
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[    0.000000] ERROR: Unable to locate IOAPIC for GSI 9
[    0.000000] Using ACPI (MADT) for SMP configuration information
[    0.000000] ACPI: HPET id: 0x8086a801 base: 0xfed00000
[    0.000000] SMP: Allowing 4 CPUs, 0 hotplug CPUs
[    0.000000] nr_irqs_gsi: 256
[    0.000000] PM: Registered nosave memory: 0000000000001000 - 00000000000=
06000
[    0.000000] PM: Registered nosave memory: 000000000009b000 - 00000000000=
9c000
[    0.000000] PM: Registered nosave memory: 000000000009c000 - 00000000001=
00000
[    0.000000] PM: Registered nosave memory: 0000000080000000 - 000000009d8=
e9000
[    0.000000] PM: Registered nosave memory: 000000009d8e9000 - 000000009d9=
bb000
[    0.000000] PM: Registered nosave memory: 000000009d9bb000 - 000000009f6=
a4000
[    0.000000] PM: Registered nosave memory: 000000009f6a4000 - 000000009f6=
df000
[    0.000000] PM: Registered nosave memory: 000000009f6df000 - 000000009f7=
8a000
[    0.000000] PM: Registered nosave memory: 000000009f78a000 - 000000009f7=
df000
[    0.000000] PM: Registered nosave memory: 000000009f7df000 - 000000009f8=
00000
[    0.000000] PM: Registered nosave memory: 000000009f800000 - 00000000b00=
00000
[    0.000000] PM: Registered nosave memory: 00000000b0000000 - 00000000fec=
00000
[    0.000000] PM: Registered nosave memory: 00000000fec00000 - 00000000fec=
01000
[    0.000000] PM: Registered nosave memory: 00000000fec01000 - 00000000fed=
1c000
[    0.000000] PM: Registered nosave memory: 00000000fed1c000 - 00000000fed=
20000
[    0.000000] PM: Registered nosave memory: 00000000fed20000 - 00000000fee=
00000
[    0.000000] PM: Registered nosave memory: 00000000fee00000 - 00000000fee=
01000
[    0.000000] PM: Registered nosave memory: 00000000fee01000 - 00000000ff8=
00000
[    0.000000] PM: Registered nosave memory: 00000000ff800000 - 00000001000=
00000
[    0.000000] Allocating PCI resources starting at b0000000 (gap:
b0000000:4ec00000)
[    0.000000] Booting paravirtualized kernel on Xen
[    0.000000] Xen version: 4.0.1 (preserve-AD) (dom0)
[    0.000000] NR_CPUS:8 nr_cpumask_bits:8 nr_cpu_ids:4 nr_node_ids:1
[    0.000000] PERCPU: Embedded 29 pages/cpu @ffff880028038000 s88536
r8192 d22056 u118784
[    0.000000] pcpu-alloc: s88536 r8192 d22056 u118784 alloc=3D29*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
[   10.311419] Built 1 zonelists in Zone order, mobility grouping on.
Total pages: 4118811
[   10.338004] Kernel command line:
root=3DUUID=3D5563bc26-6e98-4768-abee-5ca053e2795c ro nomodeset
max_loop=3D255 console=3Dhvc0 earlyprintk=3Dxen nomodeset initcall_debug
debug loglevel=3D10
[   10.390120] PID hash table entries: 4096 (order: 3, 32768 bytes)
[   10.411419] Dentry cache hash table entries: 2097152 (order: 12,
16777216 bytes)
[   10.438973] Inode-cache hash table entries: 1048576 (order: 11,
8388608 bytes)
[   10.464013] Initializing CPU#0
[   10.480240] DMA: Placing 64MB software IO TLB between
ffff880020000000 - ffff880024000000
[   10.506573] DMA: software IO TLB at phys 0x20000000 - 0x24000000
[   10.526301] xen_swiotlb_fixup: buf=3Dffff880020000000 size=3D67108864
[   10.564039] xen_swiotlb_fixup: buf=3Dffff880024060000 size=3D32768
[   10.590216] Memory: 1722512k/18834340k available (5877k kernel
code, 2097576k absent, 15013600k reserved, 3717k data, 568k init)
[   10.627713] SLUB: Genslabs=3D13, HWalign=3D64, Order=3D0-3, MinObjects=
=3D0,
CPUs=3D4, Nodes=3D1
[   10.652877] Hierarchical RCU implementation.
[   10.666880] NR_IRQS:4352 nr_irqs:1280
[   10.678959] xen: --> irq=3D0
[   10.687790] xen: --> irq=3D1
[   10.696651] xen: --> irq=3D2
[   10.705516] xen: --> irq=3D3
[   10.714382] xen: --> irq=3D4
[   10.723247] xen: --> irq=3D5
[   10.732113] xen: --> irq=3D6
[   10.740979] xen: --> irq=3D7
[   10.749844] xen: --> irq=3D8
[   10.758711] xen: --> irq=3D9
[   10.767577] xen: --> irq=3D10
[   10.776728] xen: --> irq=3D11
[   10.785880] xen: --> irq=3D12
[   10.795031] xen: --> irq=3D13
[   10.804183] xen: --> irq=3D14
[   10.813336] xen: --> irq=3D15
[   10.822497] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
[   10.843363] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[   10.865097] xen: sci override: source_irq=3D9 global_irq=3D9 trigger=3Dc=
 polarity=3D1
[   10.888550] xen: registering gsi 9 triggering 0 polarity 0
[   10.906566] xen_allocate_pirq: returning irq 9 for gsi 9
[   10.924012] xen: --> irq=3D9
[   10.932880] xen: acpi sci 9
[   10.952809] Console: colour VGA+ 80x25
[   10.964550] console [hvc0] enabled, bootconsole disabled
[   10.964550] console [hvc0] enabled, bootconsole disabled
[   10.999734] Xen: using vcpuop timer interface
[   11.014307] installing Xen timer for CPU 0
[   11.028044]   alloc irq_desc for 1279 on node -1
[   11.043477]   alloc kstat_irqs on node -1
[   11.056938] Detected 2400.040 MHz processor.
[   11.071222] Calibrating delay loop (skipped), value calculated
using timer frequency.. 4800.08 BogoMIPS (lpj=3D2400040)
[   11.106407] Security Framework initialized
[   11.120129] SELinux:  Initializing.
[   11.131853] SELinux:  Starting in permissive mode
[   11.147581] Mount-cache hash table entries: 256
[   11.162872] Initializing cgroup subsys ns
[   11.176183] Initializing cgroup subsys cpuacct
[   11.191051] Initializing cgroup subsys freezer
[   11.205950] CPU: L1 I cache: 32K, L1 D cache: 32K
[   11.221649] CPU: L2 cache: 256K
[   11.232231] CPU: L3 cache: 8192K
[   11.243104] CPU: Unsupported number of siblings 16
[   11.258262] mce: CPU supports 9 MCE banks
[   11.272583] Performance Events: unsupported p6 CPU model 30 no PMU
driver, software events only.
[   11.301735] SMP alternatives: switching to UP code
[   11.354691] ACPI: Core revision 20090903
[   11.387437]   alloc irq_desc for 1278 on node -1
[   11.402317]   alloc kstat_irqs on node -1
[   11.415771]   alloc irq_desc for 1277 on node -1
[   11.431203]   alloc kstat_irqs on node -1
[   11.444653]   alloc irq_desc for 1276 on node -1
[   11.460086]   alloc kstat_irqs on node -1
[   11.473539]   alloc irq_desc for 1275 on node -1
[   11.488972]   alloc kstat_irqs on node -1
[   11.502443] calling  migration_init+0x0/0x5a @ 1
[   11.517890] initcall migration_init+0x0/0x5a returned 0 after 976 usecs
[   11.539884] calling  spawn_ksoftirqd+0x0/0x59 @ 1
[   11.555630] initcall spawn_ksoftirqd+0x0/0x59 returned 0 after 976 usecs
[   11.577922] calling  init_call_single_data+0x0/0x89 @ 1
[   11.595367] initcall init_call_single_data+0x0/0x89 returned 0 after 0 u=
secs
[   11.618815] calling  relay_init+0x0/0x14 @ 1
[   11.633112] initcall relay_init+0x0/0x14 returned 0 after 0 usecs
[   11.653418] calling  tracer_alloc_buffers+0x0/0x173 @ 1
[   11.670885] initcall tracer_alloc_buffers+0x0/0x173 returned 0 after 0 u=
secs
[   11.694344] calling  init_trace_printk+0x0/0x12 @ 1
[   11.710647] initcall init_trace_printk+0x0/0x12 returned 0 after 0 usecs
[   11.732958] calling  mce_amd_init+0x0/0x33 @ 1
[   11.747824] initcall mce_amd_init+0x0/0x33 returned 0 after 0 usecs
[   11.768745] installing Xen timer for CPU 1
[   11.782435]   alloc irq_desc for 1274 on node -1
[   11.797872]   alloc kstat_irqs on node -1
[   11.811342] SMP alternatives: switching to SMP code
[   11.863556]   alloc irq_desc for 1273 on node -1
[   11.878435]   alloc kstat_irqs on node -1
[   11.891891]   alloc irq_desc for 1272 on node -1
[   11.907322]   alloc kstat_irqs on node -1
[   11.920773]   alloc irq_desc for 1271 on node -1
[   11.936207]   alloc kstat_irqs on node -1
[   11.949657]   alloc irq_desc for 1270 on node -1
[   11.965092]   alloc kstat_irqs on node -1
[   11.978549] Initializing CPU#1
[   11.978585] CPU: L1 I cache: 32K, L1 D cache: 32K
[   11.978587] CPU: L2 cache: 256K
[   11.978589] CPU: L3 cache: 8192K
[   11.978592] CPU: Unsupported number of siblings 16
[   11.978669] installing Xen timer for CPU 2
[   12.055756]   alloc irq_desc for 1269 on node -1
[   12.071195]   alloc kstat_irqs on node -1
[   12.084662]   alloc irq_desc for 1268 on node -1
[   12.100080]   alloc kstat_irqs on node -1
[   12.113533]   alloc irq_desc for 1267 on node -1
[   12.128965]   alloc kstat_irqs on node -1
[   12.142416]   alloc irq_desc for 1266 on node -1
[   12.157851]   alloc kstat_irqs on node -1
[   12.171305]   alloc irq_desc for 1265 on node -1
[   12.186735]   alloc kstat_irqs on node -1
[   12.200192] Initializing CPU#2
[   12.200226] CPU: L1 I cache: 32K, L1 D cache: 32K
[   12.200228] CPU: L2 cache: 256K
[   12.200229] CPU: L3 cache: 8192K
[   12.200233] CPU: Unsupported number of siblings 16
[   12.200303] installing Xen timer for CPU 3
[   12.277400]   alloc irq_desc for 1264 on node -1
[   12.292839]   alloc kstat_irqs on node -1
[   12.306306]   alloc irq_desc for 1263 on node -1
[   12.321723]   alloc kstat_irqs on node -1
[   12.335176]   alloc irq_desc for 1262 on node -1
[   12.350609]   alloc kstat_irqs on node -1
[   12.364060]   alloc irq_desc for 1261 on node -1
[   12.379495]   alloc kstat_irqs on node -1
[   12.392945]   alloc irq_desc for 1260 on node -1
[   12.408378]   alloc kstat_irqs on node -1
[   12.421836] Initializing CPU#3
[   12.421869] CPU: L1 I cache: 32K, L1 D cache: 32K
[   12.421871] CPU: L2 cache: 256K
[   12.421873] CPU: L3 cache: 8192K
[   12.421876] CPU: Unsupported number of siblings 16
[   12.421909] Brought up 4 CPUs
[   12.495792] calling  init_mmap_min_addr+0x0/0x26 @ 1
[   12.511910] initcall init_mmap_min_addr+0x0/0x26 returned 0 after 0 usecs
[   12.534507] calling  init_cpufreq_transition_notifier_list+0x0/0x1b @ 1
[   12.556528] initcall init_cpufreq_transition_notifier_list+0x0/0x1b
returned 0 after 0 usecs
[   12.584552] calling  net_ns_init+0x0/0xed @ 1
[   12.599178] initcall net_ns_init+0x0/0xed returned 0 after 976 usecs
[   12.620301] calling  e820_mark_nvs_memory+0x0/0x40 @ 1
[   12.637520] initcall e820_mark_nvs_memory+0x0/0x40 returned 0 after 976 =
usecs
[   12.661198] calling  cpufreq_tsc+0x0/0x28 @ 1
[   12.675782] initcall cpufreq_tsc+0x0/0x28 returned 0 after 0 usecs
[   12.696404] calling  pci_reboot_init+0x0/0x14 @ 1
[   12.712134] initcall pci_reboot_init+0x0/0x14 returned 0 after 0 usecs
[   12.733873] calling  init_lapic_sysfs+0x0/0x2d @ 1
[   12.749974] initcall init_lapic_sysfs+0x0/0x2d returned 0 after 976 usecs
[   12.772483] calling  alloc_frozen_cpus+0x0/0x8 @ 1
[   12.788492] initcall alloc_frozen_cpus+0x0/0x8 returned 0 after 0 usecs
[   12.810517] calling  sysctl_init+0x0/0x32 @ 1
[   12.825200] initcall sysctl_init+0x0/0x32 returned 0 after 0 usecs
[   12.845691] calling  ksysfs_init+0x0/0x94 @ 1
[   12.860281] initcall ksysfs_init+0x0/0x94 returned 0 after 0 usecs
[   12.880867] calling  async_init+0x0/0x60 @ 1
[   12.895198] initcall async_init+0x0/0x60 returned 0 after 976 usecs
[   12.916045] calling  init_jiffies_clocksource+0x0/0x12 @ 1
[   12.934353] initcall init_jiffies_clocksource+0x0/0x12 returned 0
after 0 usecs
[   12.958658] calling  pm_init+0x0/0x34 @ 1
[   12.972106] initcall pm_init+0x0/0x34 returned 0 after 0 usecs
[   12.991545] calling  pm_disk_init+0x0/0x19 @ 1
[   13.006420] initcall pm_disk_init+0x0/0x19 returned 0 after 0 usecs
[   13.027297] calling  swsusp_header_init+0x0/0x2c @ 1
[   13.043884] initcall swsusp_header_init+0x0/0x2c returned 0 after 0 usecs
[   13.066480] calling  init_zero_pfn+0x0/0x68 @ 1
[   13.081635] initcall init_zero_pfn+0x0/0x68 returned 0 after 0 usecs
[   13.102796] calling  filelock_init+0x0/0x2e @ 1
[   13.117956] initcall filelock_init+0x0/0x2e returned 0 after 0 usecs
[   13.139118] calling  init_misc_binfmt+0x0/0x44 @ 1
[   13.155134] initcall init_misc_binfmt+0x0/0x44 returned 0 after 0 usecs
[   13.177159] calling  init_script_binfmt+0x0/0x14 @ 1
[   13.193742] initcall init_script_binfmt+0x0/0x14 returned 0 after 0 usecs
[   13.216340] calling  init_elf_binfmt+0x0/0x14 @ 1
[   13.232066] initcall init_elf_binfmt+0x0/0x14 returned 0 after 0 usecs
[   13.253804] calling  init_compat_elf_binfmt+0x0/0x14 @ 1
[   13.271536] initcall init_compat_elf_binfmt+0x0/0x14 returned 0 after 0 =
usecs
[   13.295271] calling  debugfs_init+0x0/0x5c @ 1
[   13.310142] initcall debugfs_init+0x0/0x5c returned 0 after 0 usecs
[   13.331018] calling  random32_init+0x0/0xd8 @ 1
[   13.346177] initcall random32_init+0x0/0xd8 returned 0 after 0 usecs
[   13.367341] calling  __gnttab_init+0x0/0x21 @ 1
[   13.382510] Grant table initialized
[   13.394222] initcall __gnttab_init+0x0/0x21 returned 0 after 976 usecs
[   13.415964] calling  early_resume_init+0x0/0x19e @ 1
[   13.432573] Time: 16:33:26  Date: 12/14/11
[   13.446278] initcall early_resume_init+0x0/0x19e returned 0 after 0 usecs
[   13.468870] calling  cpufreq_core_init+0x0/0x9b @ 1
[   13.485170] initcall cpufreq_core_init+0x0/0x9b returned 0 after 0 usecs
[   13.507478] calling  cpuidle_init+0x0/0x40 @ 1
[   13.522348] initcall cpuidle_init+0x0/0x40 returned 0 after 0 usecs
[   13.543225] calling  sock_init+0x0/0x5e @ 1
[   13.557277] initcall sock_init+0x0/0x5e returned 0 after 976 usecs
[   13.577829] calling  net_inuse_init+0x0/0x26 @ 1
[   13.593274] initcall net_inuse_init+0x0/0x26 returned 0 after 0 usecs
[   13.614725] calling  netpoll_init+0x0/0x31 @ 1
[   13.629595] initcall netpoll_init+0x0/0x31 returned 0 after 0 usecs
[   13.650471] calling  netlink_proto_init+0x0/0x143 @ 1
[   13.667352] NET: Registered protocol family 16
[   13.682228] initcall netlink_proto_init+0x0/0x143 returned 0 after 976 u=
secs
[   13.705696] calling  bdi_class_init+0x0/0x41 @ 1
[   13.721200] initcall bdi_class_init+0x0/0x41 returned 0 after 976 usecs
[   13.743167] calling  kobject_uevent_init+0x0/0x54 @ 1
[   13.760046] initcall kobject_uevent_init+0x0/0x54 returned 0 after 976 u=
secs
[   13.783487] calling  pcibus_class_init+0x0/0x19 @ 1
[   13.799837] initcall pcibus_class_init+0x0/0x19 returned 0 after 976 use=
cs
[   13.822672] calling  pci_driver_init+0x0/0x12 @ 1
[   13.838455] initcall pci_driver_init+0x0/0x12 returned 0 after 976 usecs
[   13.860709] calling  backlight_class_init+0x0/0x5d @ 1
[   13.877914] initcall backlight_class_init+0x0/0x5d returned 0 after 976 =
usecs
[   13.901601] calling  video_output_class_init+0x0/0x19 @ 1
[   13.919669] initcall video_output_class_init+0x0/0x19 returned 0
after 976 usecs
[   13.944214] calling  xenbus_init+0x0/0x2c7 @ 1
[   13.959092]   alloc irq_desc for 1259 on node -1
[   13.974528]   alloc kstat_irqs on node -1
[   13.988039] initcall xenbus_init+0x0/0x2c7 returned 0 after 1952 usecs
[   14.009710] calling  tty_class_init+0x0/0x38 @ 1
[   14.025196] initcall tty_class_init+0x0/0x38 returned 0 after 976 usecs
[   14.047175] calling  vtconsole_class_init+0x0/0xc2 @ 1
[   14.064437] initcall vtconsole_class_init+0x0/0xc2 returned 0 after 976 =
usecs
[   14.088067] calling  i2c_init+0x0/0x6a @ 1
[   14.101898] initcall i2c_init+0x0/0x6a returned 0 after 976 usecs
[   14.122102] calling  amd_postcore_init+0x0/0x77 @ 1
[   14.138403] initcall amd_postcore_init+0x0/0x77 returned 0 after 0 usecs
[   14.160713] calling  arch_kdebugfs_init+0x0/0x235 @ 1
[   14.177595] initcall arch_kdebugfs_init+0x0/0x235 returned 0 after 0 use=
cs
[   14.200467] calling  mtrr_if_init+0x0/0x61 @ 1
[   14.215336] initcall mtrr_if_init+0x0/0x61 returned 0 after 0 usecs
[   14.236213] calling  ffh_cstate_init+0x0/0x2a @ 1
[   14.251943] initcall ffh_cstate_init+0x0/0x2a returned 0 after 0 usecs
[   14.273681] calling  acpi_pci_init+0x0/0x57 @ 1
[   14.288832] ACPI FADT declares the system doesn't support PCIe
ASPM, so disable it
[   14.314001] ACPI: bus type pci registered
[   14.327447] initcall acpi_pci_init+0x0/0x57 returned 0 after 0 usecs
[   14.348607] calling  xen_pcpu_init+0x0/0xa8 @ 1
[   14.363859] sync cpu 0 get result 1 max_id 3
[   14.378115] sync cpu 1 get result 1 max_id 3
[   14.392415] sync cpu 2 get result 1 max_id 3
[   14.406714] sync cpu 3 get result 1 max_id 3
[   14.420961]   alloc irq_desc for 1258 on node -1
[   14.436404]   alloc kstat_irqs on node -1
[   14.449863] initcall xen_pcpu_init+0x0/0xa8 returned 1258 after 4882 use=
cs
[   14.472731] initcall xen_pcpu_init+0x0/0xa8 returned with error code 1258
[   14.495610] calling  register_xen_pci_notifier+0x0/0x24 @ 1
[   14.514200] initcall register_xen_pci_notifier+0x0/0x24 returned 0
after 0 usecs
[   14.538789] calling  setup_vcpu_hotplug_event+0x0/0x22 @ 1
[   14.557098] initcall setup_vcpu_hotplug_event+0x0/0x22 returned 0
after 0 usecs
[   14.581402] calling  dmi_id_init+0x0/0x319 @ 1
[   14.596397] initcall dmi_id_init+0x0/0x319 returned 0 after 976 usecs
[   14.617729] calling  pci_arch_init+0x0/0x60 @ 1
[   14.632913] PCI: MCFG configuration 0: base a0000000 segment 0 buses 0 -=
 255
[   14.656332] PCI: MCFG area at a0000000 reserved in E820
[   14.697586] PCI: Using MMCONFIG at a0000000 - afffffff
[   14.714186] PCI: Using configuration type 1 for base access
[   14.732781] initcall pci_arch_init+0x0/0x60 returned 0 after 21481 usecs
[   14.755084] calling  topology_init+0x0/0x40 @ 1
[   14.770429] initcall topology_init+0x0/0x40 returned 0 after 976 usecs
[   14.791977] calling  mtrr_init_finialize+0x0/0x3d @ 1
[   14.808851] initcall mtrr_init_finialize+0x0/0x3d returned 0 after 0 use=
cs
[   14.831730] calling  param_sysfs_init+0x0/0x224 @ 1
[   14.859267] initcall param_sysfs_init+0x0/0x224 returned 0 after 11716 u=
secs
[   14.882156] calling  pm_sysrq_init+0x0/0x19 @ 1
[   14.897314] initcall pm_sysrq_init+0x0/0x19 returned 0 after 0 usecs
[   14.918478] calling  audit_watch_init+0x0/0x2f @ 1
[   14.934494] initcall audit_watch_init+0x0/0x2f returned 0 after 0 usecs
[   14.956518] calling  init_slow_work+0x0/0x3e @ 1
[   14.971958] initcall init_slow_work+0x0/0x3e returned 0 after 0 usecs
[   14.993411] calling  default_bdi_init+0x0/0xb1 @ 1
[   15.009543] initcall default_bdi_init+0x0/0xb1 returned 0 after 976 usecs
[   15.032019] calling  init_bio+0x0/0xda @ 1
[   15.045750] bio: create slab <bio-0> at 0
[   15.059189] initcall init_bio+0x0/0xda returned 0 after 0 usecs
[   15.078917] calling  fsnotify_init+0x0/0x12 @ 1
[   15.094076] initcall fsnotify_init+0x0/0x12 returned 0 after 0 usecs
[   15.115239] calling  fsnotify_notification_init+0x0/0xf0 @ 1
[   15.134117] initcall fsnotify_notification_init+0x0/0xf0 returned 0
after 0 usecs
[   15.158995] calling  cryptomgr_init+0x0/0x12 @ 1
[   15.174440] initcall cryptomgr_init+0x0/0x12 returned 0 after 0 usecs
[   15.195894] calling  blk_settings_init+0x0/0x2a @ 1
[   15.212191] initcall blk_settings_init+0x0/0x2a returned 0 after 0 usecs
[   15.234502] calling  blk_ioc_init+0x0/0x2a @ 1
[   15.249370] initcall blk_ioc_init+0x0/0x2a returned 0 after 0 usecs
[   15.270246] calling  blk_softirq_init+0x0/0x6e @ 1
[   15.286263] initcall blk_softirq_init+0x0/0x6e returned 0 after 0 usecs
[   15.308287] calling  blk_iopoll_setup+0x0/0x6e @ 1
[   15.324301] initcall blk_iopoll_setup+0x0/0x6e returned 0 after 0 usecs
[   15.346324] calling  genhd_device_init+0x0/0x7b @ 1
[   15.362769] initcall genhd_device_init+0x0/0x7b returned 0 after 976 use=
cs
[   15.385507] calling  pci_slot_init+0x0/0x46 @ 1
[   15.400661] initcall pci_slot_init+0x0/0x46 returned 0 after 0 usecs
[   15.421822] calling  fbmem_init+0x0/0x98 @ 1
[   15.436175] initcall fbmem_init+0x0/0x98 returned 0 after 976 usecs
[   15.457000] calling  acpi_init+0x0/0x130 @ 1
[   15.472585] ERROR: Unable to locate IOAPIC for GSI 9
[   15.488638] ACPI: EC: Look up EC in DSDT
[   15.502971] ACPI Error: Field [CPB3] at 96 exceeds Buffer [NULL]
size 64 (bits) (20090903/dsopcode-596)
[   15.533587] ACPI Error (psparse-0537): Method parse/execution
failed [\_SB_._OSC] (Node ffff88007fc187c0), AE_AML_BUFFER_LIMIT
[   15.594403] ACPI: Interpreter enabled
[   15.606143] ACPI: (supports S0 S1 S5)
[   15.618442] ACPI: Using IOAPIC for interrupt routing
[   15.647695] initcall acpi_init+0x0/0x130 returned 0 after 38080 usecs
[   15.668586] calling  dock_init+0x0/0x8d @ 1
[   15.682694] ACPI: No dock devices found.
[   15.695785] initcall dock_init+0x0/0x8d returned 0 after 0 usecs
[   15.715799] calling  acpi_pci_root_init+0x0/0x28 @ 1
[   15.733153] ACPI: PCI Root Bridge [PCI0] (0000:00)
[   15.748882] pci 0000:00:05.0: PME# supported from D0 D3hot D3cold
[   15.768915] pci 0000:00:05.0: PME# disabled
[   15.783492] pci 0000:00:19.0: reg 10 32bit mmio: [0xb3b00000-0xb3b1ffff]
[   15.805249] pci 0000:00:19.0: reg 14 32bit mmio: [0xb3b24000-0xb3b24fff]
[   15.827556] pci 0000:00:19.0: reg 18 io port: [0x3020-0x303f]
[   15.846775] pci 0000:00:19.0: PME# supported from D0 D3hot D3cold
[   15.867015] pci 0000:00:19.0: PME# disabled
[   15.881118] pci 0000:00:1a.0: reg 10 32bit mmio: [0xb3b21000-0xb3b213ff]
[   15.903426] pci 0000:00:1a.0: PME# supported from D0 D3hot D3cold
[   15.923642] pci 0000:00:1a.0: PME# disabled
[   15.937766] pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold
[   15.957960] pci 0000:00:1c.0: PME# disabled
[   15.972088] pci 0000:00:1c.4: PME# supported from D0 D3hot D3cold
[   15.992278] pci 0000:00:1c.4: PME# disabled
[   16.006403] pci 0000:00:1c.6: PME# supported from D0 D3hot D3cold
[   16.026599] pci 0000:00:1c.6: PME# disabled
[   16.040723] pci 0000:00:1c.7: PME# supported from D0 D3hot D3cold
[   16.060917] pci 0000:00:1c.7: PME# disabled
[   16.075015] pci 0000:00:1d.0: reg 10 32bit mmio: [0xb3b20000-0xb3b203ff]
[   16.097329] pci 0000:00:1d.0: PME# supported from D0 D3hot D3cold
[   16.117544] pci 0000:00:1d.0: PME# disabled
[   16.131828] pci 0000:00:1f.3: reg 10 64bit mmio: [0xb3b22000-0xb3b220ff]
[   16.153885] pci 0000:00:1f.3: reg 20 io port: [0x3000-0x301f]
[   16.173110] pci 0000:01:00.0: reg 10 64bit mmio pref: [0xb0000000-0xb1ff=
ffff]
[   16.196774] pci 0000:01:00.0: reg 18 64bit mmio: [0xb3a00000-0xb3a00fff]
[   16.219078] pci 0000:01:00.0: reg 20 io port: [0x2000-0x20ff]
[   16.238242] pci 0000:01:00.0: reg 30 32bit mmio pref: [0xfffe0000-0xffff=
ffff]
[   16.262001] pci 0000:01:00.0: supports D1 D2
[   16.276323] pci 0000:00:05.0: bridge io port: [0x2000-0x2fff]
[   16.295430] pci 0000:00:05.0: bridge 32bit mmio: [0xb3a00000-0xb3afffff]
[   16.317745] pci 0000:00:05.0: bridge 64bit mmio pref: [0xb0000000-0xb1ff=
ffff]
[   16.341634] pci 0000:03:00.0: reg 10 32bit mmio: [0xb3900000-0xb391ffff]
[   16.363808] pci 0000:03:00.0: reg 18 io port: [0x1000-0x101f]
[   16.382952] pci 0000:03:00.0: reg 1c 32bit mmio: [0xb3920000-0xb3923fff]
[   16.405360] pci 0000:03:00.0: PME# supported from D0 D3hot D3cold
[   16.425559] pci 0000:03:00.0: PME# disabled
[   16.439662] pci 0000:00:1c.4: bridge io port: [0x1000-0x1fff]
[   16.458732] pci 0000:00:1c.4: bridge 32bit mmio: [0xb3900000-0xb39fffff]
[   16.481112] pci 0000:04:00.0: reg 10 32bit mmio pref: [0xb2000000-0xb2ff=
ffff]
[   16.504785] pci 0000:04:00.0: reg 14 32bit mmio: [0xb3800000-0xb3803fff]
[   16.527095] pci 0000:04:00.0: reg 18 32bit mmio: [0xb3000000-0xb37fffff]
[   16.549435] pci 0000:04:00.0: reg 30 32bit mmio pref: [0xffff0000-0xffff=
ffff]
[   16.573258] pci 0000:00:1c.6: bridge 32bit mmio: [0xb3000000-0xb38fffff]
[   16.595443] pci 0000:00:1c.6: bridge 64bit mmio pref: [0xb2000000-0xb2ff=
ffff]
[   16.619320] pci 0000:00:1e.0: transparent bridge
[   16.634669] pci_bus 0000:00: on NUMA node 0
[   16.648633] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
[   16.668734] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.MRP3._PRT]
[   16.689623] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PEX0._PRT]
[   16.710806] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PEX4._PRT]
[   16.731922] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PEX6._PRT]
[   16.753123] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.IP2P._PRT]
(XEN) PCI add device 00:00.0
(XEN) PCI add device 00:05.0
(XEN) PCI add device 00:08.0
(XEN) PCI add device 00:08.1
(XEN) PCI add device 00:08.2
(XEN) PCI add device 00:08.3
(XEN) PCI add device 00:10.0
(XEN) PCI add device 00:10.1
(XEN) PCI add device 00:19.0
(XEN) PCI add device 00:1a.0
(XEN) PCI add device 00:1c.0
(XEN) PCI add device 00:1c.4
(XEN) PCI add device 00:1c.6
(XEN) PCI add device 00:1c.7
(XEN) PCI add device 00:1d.0
(XEN) PCI add device 00:1e.0
(XEN) PCI add device 00:1f.0
(XEN) PCI add device 00:1f.3
(XEN) PCI add device 01:00.0
(XEN) PCI add device 03:00.0
(XEN) PCI add device 04:00.0
[   16.954739] initcall acpi_pci_root_init+0x0/0x28 returned 0 after 25386 =
usecs
[   16.978208] calling  acpi_pci_link_init+0x0/0x43 @ 1
[   16.994873] ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 9 *10
11 12 14 15)
[   17.018917] ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 6 7 9 10
*11 12 14 15)
[   17.042938] ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 *5 6 7 9 10
11 12 14 15)
[   17.066986] ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 7 9 10
*11 12 14 15)
[   17.090987] ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 6 7 9 10 11
12 14 15) *0, disabled.
[   17.118722] ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 7 *9 10
11 12 14 15)
[   17.142750] ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 9 10 11
12 14 15) *0, disabled.
[   17.170486] ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 7 9 *10
11 12 14 15)
[   17.194505] initcall acpi_pci_link_init+0x0/0x43 returned 0 after 1952 u=
secs
[   17.217868] calling  pnp_init+0x0/0x12 @ 1
[   17.231652] initcall pnp_init+0x0/0x12 returned 0 after 976 usecs
[   17.251902] calling  xen_setup_shutdown_event+0x0/0x22 @ 1
[   17.270209] initcall xen_setup_shutdown_event+0x0/0x22 returned 0
after 0 usecs
[   17.294515] calling  xenbus_probe_backend_init+0x0/0x2d @ 1
[   17.313159] initcall xenbus_probe_backend_init+0x0/0x2d returned 0
after 976 usecs
[   17.338271] calling  xenbus_probe_frontend_init+0x0/0x2d @ 1
[   17.357196] initcall xenbus_probe_frontend_init+0x0/0x2d returned 0
after 976 usecs
[   17.382600] calling  balloon_init+0x0/0x279 @ 1
[   17.397757] xen_balloon: Initialising balloon driver with page order 0.
[   17.419876] last_pfn =3D 0x47d8e9 max_arch_pfn =3D 0x400000000
[   17.484316] initcall balloon_init+0x0/0x279 returned 0 after 41985 usecs
[   17.506067] calling  xen_acpi_processor_extcntl_init+0x0/0x4f @ 1
[   17.526369] initcall xen_acpi_processor_extcntl_init+0x0/0x4f
returned 0 after 0 usecs
[   17.552683] calling  misc_init+0x0/0xb7 @ 1
[   17.566811] initcall misc_init+0x0/0xb7 returned 0 after 976 usecs
[   17.587284] calling  vga_arb_device_init+0x0/0x80 @ 1
[   17.604246] vgaarb: device added:
PCI:0000:04:00.0,decodes=3Dio+mem,owns=3Dio+mem,locks=3Dnone
[   17.631044] vgaarb: loaded
[   17.640197] initcall vga_arb_device_init+0x0/0x80 returned 0 after 976 u=
secs
[   17.663645] calling  cn_init+0x0/0x9e @ 1
[   17.677103] initcall cn_init+0x0/0x9e returned 0 after 976 usecs
[   17.697134] calling  init_scsi+0x0/0x8c @ 1
[   17.711359] SCSI subsystem initialized
[   17.723736] initcall init_scsi+0x0/0x8c returned 0 after 976 usecs
[   17.744322] calling  ata_init+0x0/0x351 @ 1
[   17.758476] libata version 3.00 loaded.
[   17.771209] initcall ata_init+0x0/0x351 returned 0 after 976 usecs
[   17.791796] calling  phy_init+0x0/0x2e @ 1
[   17.805682] initcall phy_init+0x0/0x2e returned 0 after 976 usecs
[   17.825831] calling  init_pcmcia_cs+0x0/0x36 @ 1
[   17.841321] initcall init_pcmcia_cs+0x0/0x36 returned 0 after 976 usecs
[   17.863299] calling  usb_init+0x0/0x1a9 @ 1
[   17.877459] usbcore: registered new interface driver usbfs
[   17.895670] usbcore: registered new interface driver hub
[   17.913426] usbcore: registered new device driver usb
[   17.930222] initcall usb_init+0x0/0x1a9 returned 0 after 2929 usecs
[   17.951094] calling  serio_init+0x0/0x86 @ 1
[   17.965470] initcall serio_init+0x0/0x86 returned 0 after 976 usecs
[   17.986271] calling  input_init+0x0/0x13c @ 1
[   18.000910] initcall input_init+0x0/0x13c returned 0 after 976 usecs
[   18.022019] calling  rtc_init+0x0/0x71 @ 1
[   18.035799] initcall rtc_init+0x0/0x71 returned 0 after 976 usecs
[   18.056053] calling  power_supply_class_init+0x0/0x38 @ 1
[   18.074122] initcall power_supply_class_init+0x0/0x38 returned 0
after 976 usecs
[   18.098665] calling  hwmon_init+0x0/0x106 @ 1
[   18.113300] initcall hwmon_init+0x0/0x106 returned 0 after 976 usecs
[   18.134415] calling  thermal_init+0x0/0x3f @ 1
[   18.149333] initcall thermal_init+0x0/0x3f returned 0 after 976 usecs
[   18.170740] calling  md_init+0x0/0xd0 @ 1
[   18.184189] initcall md_init+0x0/0xd0 returned 0 after 0 usecs
[   18.203625] calling  leds_init+0x0/0x40 @ 1
[   18.217690] initcall leds_init+0x0/0x40 returned 0 after 976 usecs
[   18.238230] calling  pci_subsys_init+0x0/0x107 @ 1
[   18.254244] PCI: Using ACPI for IRQ routing
[   18.268366] initcall pci_subsys_init+0x0/0x107 returned 0 after 0 usecs
[   18.290284] calling  proto_init+0x0/0x12 @ 1
[   18.304581] initcall proto_init+0x0/0x12 returned 0 after 0 usecs
[   18.324885] calling  net_dev_init+0x0/0x175 @ 1
[   18.340189] initcall net_dev_init+0x0/0x175 returned 0 after 976 usecs
[   18.361781] calling  neigh_init+0x0/0x71 @ 1
[   18.376078] initcall neigh_init+0x0/0x71 returned 0 after 0 usecs
[   18.396383] calling  fib_rules_init+0x0/0xa6 @ 1
[   18.411828] initcall fib_rules_init+0x0/0xa6 returned 0 after 0 usecs
[   18.433281] calling  pktsched_init+0x0/0xd0 @ 1
[   18.448435] initcall pktsched_init+0x0/0xd0 returned 0 after 0 usecs
[   18.469597] calling  tc_filter_init+0x0/0x4c @ 1
[   18.485041] initcall tc_filter_init+0x0/0x4c returned 0 after 0 usecs
[   18.506494] calling  tc_action_init+0x0/0x4c @ 1
[   18.521934] initcall tc_action_init+0x0/0x4c returned 0 after 0 usecs
[   18.543388] calling  genl_init+0x0/0x8f @ 1
[   18.557415] initcall genl_init+0x0/0x8f returned 0 after 976 usecs
[   18.577989] calling  cipso_v4_init+0x0/0x61 @ 1
[   18.593148] initcall cipso_v4_init+0x0/0x61 returned 0 after 0 usecs
[   18.614308] calling  wireless_nlevent_init+0x0/0x12 @ 1
[   18.631759] initcall wireless_nlevent_init+0x0/0x12 returned 0 after 0 u=
secs
[   18.655205] calling  cfg80211_init+0x0/0x92 @ 1
[   18.670486] cfg80211: Using static regulatory domain info
[   18.688383] cfg80211: Regulatory domain: US
[   18.702426] 	(start_freq - end_freq @ bandwidth),
(max_antenna_gain, max_eirp)
[   18.726447] 	(2402000 KHz - 2472000 KHz @ 40000 KHz), (600 mBi, 2700 mBm)
[   18.749043] 	(5170000 KHz - 5190000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[   18.771637] 	(5190000 KHz - 5210000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[   18.794230] 	(5210000 KHz - 5230000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[   18.816824] 	(5230000 KHz - 5330000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[   18.839417] 	(5735000 KHz - 5835000 KHz @ 40000 KHz), (600 mBi, 3000 mBm)
[   18.862022] cfg80211: Calling CRDA for country: US
[   18.878072] initcall cfg80211_init+0x0/0x92 returned 0 after 2929 usecs
[   18.900048] calling  ieee80211_init+0x0/0xb @ 1
[   18.915202] initcall ieee80211_init+0x0/0xb returned 0 after 0 usecs
[   18.936364] calling  netlbl_init+0x0/0x81 @ 1
[   18.950948] NetLabel: Initializing
[   18.962389] NetLabel:  domain hash size =3D 128
[   18.976975] NetLabel:  protocols =3D UNLABELED CIPSOv4
[   18.993570] NetLabel:  unlabeled traffic allowed by default
[   19.012157] initcall netlbl_init+0x0/0x81 returned 0 after 0 usecs
[   19.032744] calling  rfkill_init+0x0/0x79 @ 1
[   19.047431] initcall rfkill_init+0x0/0x79 returned 0 after 976 usecs
[   19.068492] calling  sysctl_init+0x0/0x48 @ 1
[   19.083079] initcall sysctl_init+0x0/0x48 returned 0 after 0 usecs
[   19.103670] calling  xen_mc_debugfs+0x0/0x118 @ 1
[   19.119420] initcall xen_mc_debugfs+0x0/0x118 returned 0 after 976 usecs
[   19.141710] calling  xen_mmu_debugfs+0x0/0x2be @ 1
[   19.157760] initcall xen_mmu_debugfs+0x0/0x2be returned 0 after 976 usecs
[   19.180320] calling  print_all_ICs+0x0/0x51b @ 1
[   19.195771] initcall print_all_ICs+0x0/0x51b returned 0 after 976 usecs
[   19.217785] calling  hpet_late_init+0x0/0xec @ 1
[   19.233224] initcall hpet_late_init+0x0/0xec returned -19 after 0 usecs
[   19.255249] calling  init_k8_nbs+0x0/0x28 @ 1
[   19.269840] initcall init_k8_nbs+0x0/0x28 returned 0 after 0 usecs
[   19.290423] calling  clocksource_done_booting+0x0/0x5a @ 1
[   19.308730] Switching to clocksource xen
[   19.322088] initcall clocksource_done_booting+0x0/0x5a returned 0
after 1046 usecs
[   19.347049] calling  rb_init_debugfs+0x0/0x2f @ 1
[   19.362805] initcall rb_init_debugfs+0x0/0x2f returned 0 after 26 usecs
[   19.384800] calling  tracer_init_debugfs+0x0/0x2d2 @ 1
[   19.402038] initcall tracer_init_debugfs+0x0/0x2d2 returned 0 after 76 u=
secs
[   19.425410] calling  init_trace_printk_function_export+0x0/0x2f @ 1
[   19.446291] initcall init_trace_printk_function_export+0x0/0x2f
returned 0 after 1 usecs
[   19.473171] calling  event_trace_init+0x0/0x1f7 @ 1
[   19.491236] initcall event_trace_init+0x0/0x1f7 returned 0 after 1721 us=
ecs
[   19.513843] calling  init_pipe_fs+0x0/0x4c @ 1
[   19.528731] initcall init_pipe_fs+0x0/0x4c returned 0 after 19 usecs
[   19.549877] calling  eventpoll_init+0x0/0xd9 @ 1
[   19.565321] initcall eventpoll_init+0x0/0xd9 returned 0 after 2 usecs
[   19.586769] calling  anon_inode_init+0x0/0x125 @ 1
[   19.602797] initcall anon_inode_init+0x0/0x125 returned 0 after 13 usecs
[   19.625094] calling  blk_scsi_ioctl_init+0x0/0x289 @ 1
[   19.642252] initcall blk_scsi_ioctl_init+0x0/0x289 returned 0 after 0 us=
ecs
[   19.665417] calling  acpi_event_init+0x0/0x81 @ 1
[   19.681160] initcall acpi_event_init+0x0/0x81 returned 0 after 13 usecs
[   19.703196] calling  pnpacpi_init+0x0/0x8c @ 1
[   19.718066] pnp: PnP ACPI init
[   19.728375] ACPI: bus type pnp registered
[   19.743206] xen: registering gsi 8 triggering 1 polarity 0
[   19.760946] xen_allocate_pirq: returning irq 8 for gsi 8
[   19.778678] xen: --> irq=3D8
[   19.787951] xen: registering gsi 13 triggering 1 polarity 0
[   19.806420] xen_allocate_pirq: returning irq 13 for gsi 13
[   19.824721] xen: --> irq=3D13
[   19.835027] xen: registering gsi 4 triggering 1 polarity 0
[   19.852768] xen_allocate_pirq: returning irq 4 for gsi 4
[   19.870501] xen: --> irq=3D4
[   19.879663] Already setup the GSI :4
[   19.892142] xen: registering gsi 3 triggering 1 polarity 0
[   19.909968] xen_allocate_pirq: returning irq 3 for gsi 3
[   19.927699] xen: --> irq=3D3
[   19.937319] pnp: PnP ACPI: found 11 devices
[   19.950864] ACPI: ACPI bus type pnp unregistered
[   19.966310] initcall pnpacpi_init+0x0/0x8c returned 0 after 242423 usecs
[   19.988615] calling  pnp_system_init+0x0/0x12 @ 1
[   20.004353] system 00:07: ioport range 0x500-0x57f has been reserved
[   20.025508] system 00:07: ioport range 0x600-0x61f has been reserved
[   20.046672] system 00:07: ioport range 0x880-0x883 has been reserved
[   20.067836] system 00:07: ioport range 0xca4-0xca5 has been reserved
[   20.088999] system 00:07: ioport range 0x400-0x47f has been reserved
[   20.110162] system 00:07: ioport range 0x800-0x81f has been reserved
[   20.131327] system 00:07: ioport range 0xca2-0xca3 has been reserved
[   20.152489] system 00:07: iomem range 0xfed1c000-0xfed3fffe could
not be reserved
[   20.177370] system 00:07: iomem range 0xff000000-0xffffffff could
not be reserved
[   20.202252] system 00:07: iomem range 0xfee00000-0xfeefffff could
not be reserved
[   20.227134] system 00:07: iomem range 0xfe900000-0xfe90001f has been res=
erved
[   20.250869] system 00:07: iomem range 0xfea00000-0xfea0001f has been res=
erved
[   20.274607] system 00:07: iomem range 0xfed1b000-0xfed1bfff has been res=
erved
[   20.298344] system 00:07: iomem range 0xfed14000-0xfed17ffe has been res=
erved
[   20.322081] system 00:07: iomem range 0xfed18000-0xfed18ffe has been res=
erved
[   20.345819] system 00:07: iomem range 0xfed19000-0xfed19ffe has been res=
erved
[   20.369608] initcall pnp_system_init+0x0/0x12 returned 0 after 356699 us=
ecs
[   20.392722] calling  pcistub_init+0x0/0x1d7 @ 1
[   20.408017] initcall pcistub_init+0x0/0x1d7 returned 0 after 133 usecs
[   20.429615] calling  chr_dev_init+0x0/0xc3 @ 1
[   20.445116] initcall chr_dev_init+0x0/0xc3 returned 0 after 613 usecs
[   20.466003] calling  firmware_class_init+0x0/0x79 @ 1
[   20.482929] initcall firmware_class_init+0x0/0x79 returned 0 after 51 us=
ecs
[   20.506042] calling  init_pcmcia_bus+0x0/0x74 @ 1
[   20.521832] initcall init_pcmcia_bus+0x0/0x74 returned 0 after 59 usecs
[   20.543793] calling  cpufreq_gov_performance_init+0x0/0x12 @ 1
[   20.563241] initcall cpufreq_gov_performance_init+0x0/0x12 returned
0 after 0 usecs
[   20.588694] calling  cpufreq_gov_userspace_init+0x0/0x12 @ 1
[   20.607569] initcall cpufreq_gov_userspace_init+0x0/0x12 returned 0
after 0 usecs
[   20.632449] calling  init_acpi_pm_clocksource+0x0/0xf6 @ 1
[   20.654920] PM-Timer failed consistency check  (0x0xffffff) - aborting.
[   20.676380] initcall init_acpi_pm_clocksource+0x0/0xf6 returned -19
after 25024 usecs
[   20.702436] calling  pcibios_assign_resources+0x0/0x74 @ 1
[   20.720745] pci 0000:01:00.0: BAR 6: no parent found for of device
[0xfffe0000-0xffffffff]
[   20.748192] pci 0000:04:00.0: BAR 6: no parent found for of device
[0xffff0000-0xffffffff]
[   20.775715] pci 0000:00:05.0: PCI bridge, secondary bus 0000:01
[   20.795382] pci 0000:00:05.0:   IO window: 0x2000-0x2fff
[   20.813115] pci 0000:00:05.0:   MEM window: 0xb3a00000-0xb3afffff
[   20.833420] pci 0000:00:05.0:   PREFETCH window:
0x000000b0000000-0x000000b1ffffff
[   20.858590] pci 0000:00:1c.0: PCI bridge, secondary bus 0000:02
[   20.878316] pci 0000:00:1c.0:   IO window: disabled
[   20.894624] pci 0000:00:1c.0:   MEM window: disabled
[   20.911209] pci 0000:00:1c.0:   PREFETCH window: disabled
[   20.929230] pci 0000:00:1c.4: PCI bridge, secondary bus 0000:03
[   20.948958] pci 0000:00:1c.4:   IO window: 0x1000-0x1fff
[   20.966693] pci 0000:00:1c.4:   MEM window: 0xb3900000-0xb39fffff
[   20.986997] pci 0000:00:1c.4:   PREFETCH window: disabled
[   21.005020] pci 0000:00:1c.6: PCI bridge, secondary bus 0000:04
[   21.024745] pci 0000:00:1c.6:   IO window: disabled
[   21.041051] pci 0000:00:1c.6:   MEM window: 0xb3000000-0xb38fffff
[   21.061355] pci 0000:00:1c.6:   PREFETCH window:
0x000000b2000000-0x000000b2ffffff
[   21.086525] pci 0000:00:1c.7: PCI bridge, secondary bus 0000:05
[   21.106253] pci 0000:00:1c.7:   IO window: disabled
[   21.122559] pci 0000:00:1c.7:   MEM window: disabled
[   21.139145] pci 0000:00:1c.7:   PREFETCH window: disabled
[   21.157166] pci 0000:00:1e.0: PCI bridge, secondary bus 0000:06
[   21.176893] pci 0000:00:1e.0:   IO window: disabled
[   21.193200] pci 0000:00:1e.0:   MEM window: disabled
[   21.209785] pci 0000:00:1e.0:   PREFETCH window: disabled
[   21.227816] xen: registering gsi 16 triggering 0 polarity 1
[   21.246394]   alloc irq_desc for 16 on node 0
[   21.260974]   alloc kstat_irqs on node 0
[   21.274144] xen: --> irq=3D16
[   21.283576] pci 0000:00:05.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[   21.305878] pci 0000:00:05.0: setting latency timer to 64
[   21.323904] xen: registering gsi 16 triggering 0 polarity 1
[   21.342482] xen_allocate_pirq: returning irq 16 for gsi 16
[   21.360785] xen: --> irq=3D16
[   21.370228] Already setup the GSI :16
[   21.382521] pci 0000:00:1c.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[   21.404832] pci 0000:00:1c.0: setting latency timer to 64
[   21.422854] xen: registering gsi 16 triggering 0 polarity 1
[   21.441435] xen_allocate_pirq: returning irq 16 for gsi 16
[   21.459738] xen: --> irq=3D16
[   21.469180] Already setup the GSI :16
[   21.481475] pci 0000:00:1c.4: PCI INT B -> GSI 16 (level, low) -> IRQ 16
[   21.503785] pci 0000:00:1c.4: setting latency timer to 64
[   21.521807] xen: registering gsi 18 triggering 0 polarity 1
[   21.540390]   alloc irq_desc for 18 on node 0
[   21.554973]   alloc kstat_irqs on node 0
[   21.568136] xen: --> irq=3D18
[   21.577575] pci 0000:00:1c.6: PCI INT C -> GSI 18 (level, low) -> IRQ 18
[   21.599877] pci 0000:00:1c.6: setting latency timer to 64
[   21.617902] xen: registering gsi 19 triggering 0 polarity 1
[   21.636483]   alloc irq_desc for 19 on node 0
[   21.651066]   alloc kstat_irqs on node 0
[   21.664228] xen: --> irq=3D19
[   21.673666] pci 0000:00:1c.7: PCI INT D -> GSI 19 (level, low) -> IRQ 19
[   21.695972] pci 0000:00:1c.7: setting latency timer to 64
[   21.714022] pci 0000:00:1e.0: setting latency timer to 64
[   21.732034] pci_bus 0000:00: resource 0 io:  [0x00-0xffff]
[   21.750337] pci_bus 0000:00: resource 1 mem: [0x000000-0xfffffffffffffff=
f]
[   21.773215] pci_bus 0000:01: resource 0 io:  [0x2000-0x2fff]
[   21.792090] pci_bus 0000:01: resource 1 mem: [0xb3a00000-0xb3afffff]
[   21.813253] pci_bus 0000:01: resource 2 pref mem [0xb0000000-0xb1ffffff]
[   21.835561] pci_bus 0000:03: resource 0 io:  [0x1000-0x1fff]
[   21.854437] pci_bus 0000:03: resource 1 mem: [0xb3900000-0xb39fffff]
[   21.875599] pci_bus 0000:04: resource 1 mem: [0xb3000000-0xb38fffff]
[   21.896765] pci_bus 0000:04: resource 2 pref mem [0xb2000000-0xb2ffffff]
[   21.919070] pci_bus 0000:06: resource 3 io:  [0x00-0xffff]
[   21.937375] pci_bus 0000:06: resource 4 mem: [0x000000-0xfffffffffffffff=
f]
[   21.960256] initcall pcibios_assign_resources+0x0/0x74 returned 0
after 1210466 usecs
[   21.986279] calling  sysctl_core_init+0x0/0x38 @ 1
[   22.002312] initcall sysctl_core_init+0x0/0x38 returned 0 after 15 usecs
[   22.024602] calling  inet_init+0x0/0x20a @ 1
[   22.038919] NET: Registered protocol family 2
[   22.053569] IP route cache hash table entries: 524288 (order: 10,
4194304 bytes)
[   22.078712] TCP established hash table entries: 262144 (order: 10,
4194304 bytes)
[   22.104272] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[   22.126325] TCP: Hash tables configured (established 262144 bind 65536)
[   22.148037] TCP reno registered
[   22.158685] initcall inet_init+0x0/0x20a returned 0 after 116972 usecs
[   22.180356] calling  af_unix_init+0x0/0x55 @ 1
[   22.195227] NET: Registered protocol family 1
[   22.209819] initcall af_unix_init+0x0/0x55 returned 0 after 14249 usecs
[   22.231834] calling  init_sunrpc+0x0/0x5d @ 1
[   22.246619] RPC: Registered udp transport module.
[   22.262149] RPC: Registered tcp transport module.
[   22.277878] RPC: Registered tcp NFSv4.1 backchannel transport module.
[   22.299330] initcall init_sunrpc+0x0/0x5d returned 0 after 51669 usecs
[   22.321065] calling  pci_apply_final_quirks+0x0/0x36 @ 1
[   22.339105] pci 0000:04:00.0: Boot video device
[   22.353954] initcall pci_apply_final_quirks+0x0/0x36 returned 0
after 14801 usecs
[   22.378835] calling  populate_rootfs+0x0/0xd7 @ 1
[   22.394616] Trying to unpack rootfs image as initramfs...
[   22.416540] Freeing initrd memory: 4911k freed
[   22.431447] initcall populate_rootfs+0x0/0xd7 returned 0 after 36015 use=
cs
[   22.453765] calling  pci_iommu_init+0x0/0x3a @ 1
[   22.469206] PCI-DMA: Using software bounce buffering for IO (SWIOTLB)
[   22.490657] DMA: Placing 64MB software IO TLB between
ffff880020000000 - ffff880024000000
[   22.517825] DMA: software IO TLB at phys 0x20000000 - 0x24000000
[   22.537847] initcall pci_iommu_init+0x0/0x3a returned 0 after 67031 usecs
[   22.560438] calling  irqfd_module_init+0x0/0x31 @ 1
[   22.576804] initcall irqfd_module_init+0x0/0x31 returned 0 after 61 usecs
[   22.599334] calling  vmx_init+0x0/0x1ff @ 1
[   22.613359] kvm: no hardware support
[   22.625362] initcall vmx_init+0x0/0x1ff returned -95 after 11733 usecs
[   22.647094] initcall vmx_init+0x0/0x1ff returned with error code -95
[   22.668544] calling  svm_init+0x0/0x19 @ 1
[   22.682272] has_svm: not amd
[   22.691993] kvm: no hardware support
[   22.704007] initcall svm_init+0x0/0x19 returned -95 after 21225 usecs
[   22.725485] initcall svm_init+0x0/0x19 returned with error code -95
[   22.746649] calling  i8259A_init_sysfs+0x0/0x22 @ 1
[   22.763076] initcall i8259A_init_sysfs+0x0/0x22 returned 0 after 123 use=
cs
[   22.785830] calling  vsyscall_init+0x0/0x6c @ 1
[   22.801087] initcall vsyscall_init+0x0/0x6c returned 0 after 97 usecs
[   22.822436] calling  sbf_init+0x0/0xe9 @ 1
[   22.836165] initcall sbf_init+0x0/0xe9 returned 0 after 0 usecs
[   22.855897] calling  i8237A_init_sysfs+0x0/0x22 @ 1
[   22.872306] initcall i8237A_init_sysfs+0x0/0x22 returned 0 after 103 use=
cs
[   22.895078] calling  add_rtc_cmos+0x0/0xa9 @ 1
[   22.909952] initcall add_rtc_cmos+0x0/0xa9 returned 0 after 2 usecs
[   22.930829] calling  cache_sysfs_init+0x0/0x64 @ 1
[   22.947960] initcall cache_sysfs_init+0x0/0x64 returned 0 after 1089 use=
cs
[   22.970278] calling  mce_init_device+0x0/0xff @ 1
[   22.986385] initcall mce_init_device+0x0/0xff returned 0 after 366 usecs
[   23.008315] calling  msr_init+0x0/0x14a @ 1
[   23.022628] initcall msr_init+0x0/0x14a returned 0 after 291 usecs
[   23.042919] calling  cpuid_init+0x0/0x14a @ 1
[   23.057793] initcall cpuid_init+0x0/0x14a returned 0 after 279 usecs
[   23.078668] calling  ioapic_init_sysfs+0x0/0xb3 @ 1
[   23.095073] initcall ioapic_init_sysfs+0x0/0xb3 returned 0 after 101 use=
cs
[   23.117850] calling  add_pcspkr+0x0/0x28 @ 1
[   23.132208] initcall add_pcspkr+0x0/0x28 returned 0 after 57 usecs
[   23.152741] calling  microcode_init+0x0/0x132 @ 1
[   23.168613] Microcode Update Driver: v2.00
<tigran@aivazian.fsnet.co.uk>, Peter Oruba
[   23.194495] initcall microcode_init+0x0/0x132 returned 0 after 25414 use=
cs
[   23.217378] calling  start_periodic_check_for_corruption+0x0/0x37 @ 1
[   23.238822] Scanning for low memory corruption every 60 seconds
[   23.258559] initcall start_periodic_check_for_corruption+0x0/0x37
returned 0 after 19272 usecs
[   23.287156] calling  audit_classes_init+0x0/0xaf @ 1
[   23.303769] initcall audit_classes_init+0x0/0xaf returned 0 after 20 use=
cs
[   23.326628] calling  init_vdso_vars+0x0/0x241 @ 1
[   23.342370] initcall init_vdso_vars+0x0/0x241 returned 0 after 15 usecs
[   23.364378] calling  ia32_binfmt_init+0x0/0x14 @ 1
[   23.380395] initcall ia32_binfmt_init+0x0/0x14 returned 0 after 4 usecs
[   23.402416] calling  sysenter_setup+0x0/0x2f1 @ 1
[   23.418143] initcall sysenter_setup+0x0/0x2f1 returned 0 after 1 usecs
[   23.439880] calling  proc_schedstat_init+0x0/0x22 @ 1
[   23.456757] initcall proc_schedstat_init+0x0/0x22 returned 0 after 3 use=
cs
[   23.479634] calling  proc_execdomains_init+0x0/0x22 @ 1
[   23.497080] initcall proc_execdomains_init+0x0/0x22 returned 0 after 1 u=
secs
[   23.520526] calling  ioresources_init+0x0/0x3c @ 1
[   23.536544] initcall ioresources_init+0x0/0x3c returned 0 after 1 usecs
[   23.558566] calling  uid_cache_init+0x0/0x9b @ 1
[   23.574020] initcall uid_cache_init+0x0/0x9b returned 0 after 12 usecs
[   23.595746] calling  init_posix_timers+0x0/0x17a @ 1
[   23.612331] initcall init_posix_timers+0x0/0x17a returned 0 after 1 usecs
[   23.634927] calling  init_posix_cpu_timers+0x0/0xe5 @ 1
[   23.652373] initcall init_posix_cpu_timers+0x0/0xe5 returned 0 after 0 u=
secs
[   23.675819] calling  nsproxy_cache_init+0x0/0x2d @ 1
[   23.692409] initcall nsproxy_cache_init+0x0/0x2d returned 0 after 0 usecs
[   23.715035] calling  create_proc_profile+0x0/0x283 @ 1
[   23.732194] initcall create_proc_profile+0x0/0x283 returned 0 after 0 us=
ecs
[   23.755359] calling  timekeeping_init_device+0x0/0x22 @ 1
[   23.773480] initcall timekeeping_init_device+0x0/0x22 returned 0
after 101 usecs
[   23.797967] calling  init_clocksource_sysfs+0x0/0x50 @ 1
[   23.815801] initcall init_clocksource_sysfs+0x0/0x50 returned 0
after 95 usecs
[   23.839721] calling  init_timer_list_procfs+0x0/0x2c @ 1
[   23.857460] initcall init_timer_list_procfs+0x0/0x2c returned 0 after 1 =
usecs
[   23.881191] calling  init_tstats_procfs+0x0/0x2c @ 1
[   23.897779] initcall init_tstats_procfs+0x0/0x2c returned 0 after 0 usecs
[   23.920376] calling  futex_init+0x0/0x68 @ 1
[   23.934684] initcall futex_init+0x0/0x68 returned 0 after 12 usecs
[   23.955262] calling  proc_dma_init+0x0/0x22 @ 1
[   23.970422] initcall proc_dma_init+0x0/0x22 returned 0 after 1 usecs
[   23.991583] calling  proc_modules_init+0x0/0x22 @ 1
[   24.007887] initcall proc_modules_init+0x0/0x22 returned 0 after 0 usecs
[   24.030197] calling  kallsyms_init+0x0/0x25 @ 1
[   24.045351] initcall kallsyms_init+0x0/0x25 returned 0 after 0 usecs
[   24.066514] calling  snapshot_device_init+0x0/0x12 @ 1
[   24.083738] initcall snapshot_device_init+0x0/0x12 returned 0 after 57 u=
secs
[   24.107125] calling  crash_save_vmcoreinfo_init+0x0/0x4a5 @ 1
[   24.126305] initcall crash_save_vmcoreinfo_init+0x0/0x4a5 returned
0 after 19 usecs
[   24.151739] calling  crash_notes_memory_init+0x0/0x37 @ 1
[   24.169762] initcall crash_notes_memory_init+0x0/0x37 returned 0
after 1 usecs
[   24.193780] calling  pid_namespaces_init+0x0/0x2d @ 1
[   24.210660] initcall pid_namespaces_init+0x0/0x2d returned 0 after 2 use=
cs
[   24.233536] calling  audit_init+0x0/0x133 @ 1
[   24.248118] audit: initializing netlink socket (disabled)
[   24.266155] type=3D2000 audit(1323880410.207:1): initialized
[   24.284444] initcall audit_init+0x0/0x133 returned 0 after 35472 usecs
[   24.306178] calling  audit_tree_init+0x0/0x49 @ 1
[   24.321904] initcall audit_tree_init+0x0/0x49 returned 0 after 0 usecs
[   24.343644] calling  init_kprobes+0x0/0x148 @ 1
[   24.372692] initcall init_kprobes+0x0/0x148 returned 0 after 13569 usecs
[   24.394441] calling  utsname_sysctl_init+0x0/0x14 @ 1
[   24.411326] initcall utsname_sysctl_init+0x0/0x14 returned 0 after 11 us=
ecs
[   24.434480] calling  init_tracepoints+0x0/0x12 @ 1
[   24.450491] initcall init_tracepoints+0x0/0x12 returned 0 after 0 usecs
[   24.472516] calling  init_events+0x0/0x64 @ 1
[   24.487100] initcall init_events+0x0/0x64 returned 0 after 1 usecs
[   24.507690] calling  init_sched_switch_trace+0x0/0x12 @ 1
[   24.525712] initcall init_sched_switch_trace+0x0/0x12 returned 0
after 0 usecs
[   24.549730] calling  init_blk_tracer+0x0/0x55 @ 1
[   24.565461] initcall init_blk_tracer+0x0/0x55 returned 0 after 0 usecs
[   24.587199] calling  perf_event_sysfs_init+0x0/0x19 @ 1
[   24.604650] initcall perf_event_sysfs_init+0x0/0x19 returned 0 after 3 u=
secs
[   24.628091] calling  init_per_zone_wmark_min+0x0/0x67 @ 1
[   24.646545] initcall init_per_zone_wmark_min+0x0/0x67 returned 0
after 420 usecs
[   24.670705] calling  kswapd_init+0x0/0x20 @ 1
[   24.685337] initcall kswapd_init+0x0/0x20 returned 0 after 43 usecs
[   24.706168] calling  setup_vmstat+0x0/0xc5 @ 1
[   24.721077] initcall setup_vmstat+0x0/0xc5 returned 0 after 8 usecs
[   24.741946] calling  mm_sysfs_init+0x0/0x29 @ 1
[   24.757106] initcall mm_sysfs_init+0x0/0x29 returned 0 after 3 usecs
[   24.778268] calling  proc_vmalloc_init+0x0/0x25 @ 1
[   24.794569] initcall proc_vmalloc_init+0x0/0x25 returned 0 after 1 usecs
[   24.816880] calling  procswaps_init+0x0/0x22 @ 1
[   24.832321] initcall procswaps_init+0x0/0x22 returned 0 after 0 usecs
[   24.853772] calling  hugetlb_init+0x0/0x3c8 @ 1
[   24.868926] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[   24.890096] initcall hugetlb_init+0x0/0x3c8 returned 0 after 20674 usecs
[   24.912401] calling  slab_proc_init+0x0/0x25 @ 1
[   24.927842] initcall slab_proc_init+0x0/0x25 returned 0 after 1 usecs
[   24.949293] calling  slab_sysfs_init+0x0/0xee @ 1
[   24.968295] initcall slab_sysfs_init+0x0/0xee returned 0 after 3197 usecs
[   24.990331] calling  fasync_init+0x0/0x2a @ 1
[   25.004915] initcall fasync_init+0x0/0x2a returned 0 after 3 usecs
[   25.025504] calling  proc_filesystems_init+0x0/0x22 @ 1
[   25.042956] initcall proc_filesystems_init+0x0/0x22 returned 0 after 2 u=
secs
[   25.066399] calling  dnotify_init+0x0/0x80 @ 1
[   25.081278] initcall dnotify_init+0x0/0x80 returned 0 after 6 usecs
[   25.102150] calling  inotify_setup+0x0/0x12 @ 1
[   25.117306] initcall inotify_setup+0x0/0x12 returned 0 after 0 usecs
[   25.138470] calling  inotify_user_setup+0x0/0xbe @ 1
[   25.155074] initcall inotify_user_setup+0x0/0xbe returned 0 after 15 use=
cs
[   25.177942] calling  aio_setup+0x0/0x71 @ 1
[   25.192070] initcall aio_setup+0x0/0x71 returned 0 after 110 usecs
[   25.212541] calling  proc_locks_init+0x0/0x22 @ 1
[   25.228274] initcall proc_locks_init+0x0/0x22 returned 0 after 2 usecs
[   25.250010] calling  init_sys32_ioctl+0x0/0x83 @ 1
[   25.266036] initcall init_sys32_ioctl+0x0/0x83 returned 0 after 12 usecs
[   25.288334] calling  init_mbcache+0x0/0x14 @ 1
[   25.303203] initcall init_mbcache+0x0/0x14 returned 0 after 0 usecs
[   25.324079] calling  dquot_init+0x0/0xf9 @ 1
[   25.338377] VFS: Disk quotas dquot_6.5.2
[   25.351639] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[   25.372992] initcall dquot_init+0x0/0xf9 returned 0 after 33801 usecs
[   25.394438] calling  init_v2_quota_format+0x0/0x12 @ 1
[   25.411597] initcall init_v2_quota_format+0x0/0x12 returned 0 after 0 us=
ecs
[   25.434762] calling  proc_cmdline_init+0x0/0x22 @ 1
[   25.451061] initcall proc_cmdline_init+0x0/0x22 returned 0 after 1 usecs
[   25.473371] calling  proc_cpuinfo_init+0x0/0x22 @ 1
[   25.489668] initcall proc_cpuinfo_init+0x0/0x22 returned 0 after 0 usecs
[   25.511979] calling  proc_devices_init+0x0/0x22 @ 1
[   25.528279] initcall proc_devices_init+0x0/0x22 returned 0 after 1 usecs
[   25.550588] calling  proc_interrupts_init+0x0/0x22 @ 1
[   25.567748] initcall proc_interrupts_init+0x0/0x22 returned 0 after 0 us=
ecs
[   25.590914] calling  proc_loadavg_init+0x0/0x22 @ 1
[   25.607212] initcall proc_loadavg_init+0x0/0x22 returned 0 after 0 usecs
[   25.629523] calling  proc_meminfo_init+0x0/0x22 @ 1
[   25.645820] initcall proc_meminfo_init+0x0/0x22 returned 0 after 0 usecs
[   25.668132] calling  proc_stat_init+0x0/0x22 @ 1
[   25.683571] initcall proc_stat_init+0x0/0x22 returned 0 after 0 usecs
[   25.705025] calling  proc_uptime_init+0x0/0x22 @ 1
[   25.721065] initcall proc_uptime_init+0x0/0x22 returned 0 after 0 usecs
[   25.743091] calling  proc_version_init+0x0/0x22 @ 1
[   25.759388] initcall proc_version_init+0x0/0x22 returned 0 after 0 usecs
[   25.781699] calling  proc_softirqs_init+0x0/0x22 @ 1
[   25.798284] initcall proc_softirqs_init+0x0/0x22 returned 0 after 1 usecs
[   25.820879] calling  proc_kcore_init+0x0/0xa9 @ 1
[   25.836609] initcall proc_kcore_init+0x0/0xa9 returned 0 after 4 usecs
[   25.858344] calling  vmcore_init+0x0/0x333 @ 1
[   25.873213] initcall vmcore_init+0x0/0x333 returned 0 after 0 usecs
[   25.894090] calling  proc_kmsg_init+0x0/0x25 @ 1
[   25.909534] initcall proc_kmsg_init+0x0/0x25 returned 0 after 0 usecs
[   25.930986] calling  proc_page_init+0x0/0x42 @ 1
[   25.946428] initcall proc_page_init+0x0/0x42 returned 0 after 1 usecs
[   25.967880] calling  init_devpts_fs+0x0/0x4c @ 1
[   25.983326] initcall init_devpts_fs+0x0/0x4c returned 0 after 6 usecs
[   26.004772] calling  init_ext3_fs+0x0/0x71 @ 1
[   26.019806] initcall init_ext3_fs+0x0/0x71 returned 0 after 162 usecs
[   26.041095] calling  journal_init+0x0/0x99 @ 1
[   26.056248] initcall journal_init+0x0/0x99 returned 0 after 279 usecs
[   26.077414] calling  init_ramfs_fs+0x0/0x12 @ 1
[   26.092570] initcall init_ramfs_fs+0x0/0x12 returned 0 after 1 usecs
[   26.113731] calling  init_hugetlbfs_fs+0x0/0x98 @ 1
[   26.130114] initcall init_hugetlbfs_fs+0x0/0x98 returned 0 after 77 usecs
[   26.152631] calling  init_fat_fs+0x0/0x4f @ 1
[   26.167355] initcall init_fat_fs+0x0/0x4f returned 0 after 138 usecs
[   26.188376] calling  init_vfat_fs+0x0/0x12 @ 1
[   26.203248] initcall init_vfat_fs+0x0/0x12 returned 0 after 1 usecs
[   26.224124] calling  init_msdos_fs+0x0/0x12 @ 1
[   26.239282] initcall init_msdos_fs+0x0/0x12 returned 0 after 0 usecs
[   26.260446] calling  init_iso9660_fs+0x0/0x71 @ 1
[   26.276263] initcall init_iso9660_fs+0x0/0x71 returned 0 after 85 usecs
[   26.298200] calling  init_nfs_fs+0x0/0x148 @ 1
[   26.313328] initcall init_nfs_fs+0x0/0x148 returned 0 after 253 usecs
[   26.334521] calling  init_nlm+0x0/0x22 @ 1
[   26.348260] initcall init_nlm+0x0/0x22 returned 0 after 10 usecs
[   26.368263] calling  init_nls_cp437+0x0/0x12 @ 1
[   26.383708] initcall init_nls_cp437+0x0/0x12 returned 0 after 0 usecs
[   26.405160] calling  init_nls_ascii+0x0/0x12 @ 1
[   26.420601] initcall init_nls_ascii+0x0/0x12 returned 0 after 0 usecs
[   26.442053] calling  init_nls_iso8859_1+0x0/0x12 @ 1
[   26.458638] initcall init_nls_iso8859_1+0x0/0x12 returned 0 after 0 usecs
[   26.481234] calling  init_nls_utf8+0x0/0x29 @ 1
[   26.496390] initcall init_nls_utf8+0x0/0x29 returned 0 after 0 usecs
[   26.517550] calling  init_autofs4_fs+0x0/0x26 @ 1
[   26.533342] initcall init_autofs4_fs+0x0/0x26 returned 0 after 57 usecs
[   26.555306] calling  ipc_init+0x0/0x23 @ 1
[   26.569036] msgmni has been set to 3375
[   26.581906] initcall ipc_init+0x0/0x23 returned 0 after 12571 usecs
[   26.602777] calling  ipc_sysctl_init+0x0/0x14 @ 1
[   26.618527] initcall ipc_sysctl_init+0x0/0x14 returned 0 after 20 usecs
[   26.640532] calling  init_mqueue_fs+0x0/0xb4 @ 1
[   26.656077] initcall init_mqueue_fs+0x0/0xb4 returned 0 after 101 usecs
[   26.677997] calling  key_proc_init+0x0/0x59 @ 1
[   26.693154] initcall key_proc_init+0x0/0x59 returned 0 after 3 usecs
[   26.714346] calling  selinux_nf_ip_init+0x0/0x62 @ 1
[   26.730929] SELinux:  Registering netfilter hooks
[   26.746662] initcall selinux_nf_ip_init+0x0/0x62 returned 0 after 15363 =
usecs
[   26.770398] calling  init_sel_fs+0x0/0x68 @ 1
[   26.785061] initcall init_sel_fs+0x0/0x68 returned 0 after 75 usecs
[   26.805860] calling  selnl_init+0x0/0x4d @ 1
[   26.820171] initcall selnl_init+0x0/0x4d returned 0 after 9 usecs
[   26.840465] calling  sel_netif_init+0x0/0x66 @ 1
[   26.855912] initcall sel_netif_init+0x0/0x66 returned 0 after 2 usecs
[   26.877362] calling  sel_netnode_init+0x0/0x74 @ 1
[   26.893375] initcall sel_netnode_init+0x0/0x74 returned 0 after 0 usecs
[   26.915399] calling  sel_netport_init+0x0/0x74 @ 1
[   26.931412] initcall sel_netport_init+0x0/0x74 returned 0 after 0 usecs
[   26.953436] calling  aurule_init+0x0/0x37 @ 1
[   26.968019] initcall aurule_init+0x0/0x37 returned 0 after 0 usecs
[   26.988609] calling  crypto_wq_init+0x0/0x2e @ 1
[   27.004152] initcall crypto_wq_init+0x0/0x2e returned 0 after 95 usecs
[   27.025793] calling  crypto_algapi_init+0x0/0xd @ 1
[   27.042093] initcall crypto_algapi_init+0x0/0xd returned 0 after 2 usecs
[   27.064400] calling  skcipher_module_init+0x0/0x39 @ 1
[   27.081562] initcall skcipher_module_init+0x0/0x39 returned 0 after 0 us=
ecs
[   27.104725] calling  chainiv_module_init+0x0/0x12 @ 1
[   27.121600] initcall chainiv_module_init+0x0/0x12 returned 0 after 0 use=
cs
[   27.144479] calling  eseqiv_module_init+0x0/0x12 @ 1
[   27.161063] initcall eseqiv_module_init+0x0/0x12 returned 0 after 0 usecs
[   27.183658] calling  hmac_module_init+0x0/0x12 @ 1
[   27.199672] initcall hmac_module_init+0x0/0x12 returned 0 after 0 usecs
[   27.221697] calling  crypto_null_mod_init+0x0/0x7d @ 1
[   27.238894] alg: No test for cipher_null (cipher_null-generic)
[   27.258337] alg: No test for ecb(cipher_null) (ecb-cipher_null)
[   27.278068] alg: No test for digest_null (digest_null-generic)
[   27.297515] alg: No test for compress_null (compress_null-generic)
[   27.318083] initcall crypto_null_mod_init+0x0/0x7d returned 0 after
77368 usecs
[   27.342381] calling  md5_mod_init+0x0/0x12 @ 1
[   27.357314] initcall md5_mod_init+0x0/0x12 returned 0 after 57 usecs
[   27.378416] calling  sha1_generic_mod_init+0x0/0x12 @ 1
[   27.395917] initcall sha1_generic_mod_init+0x0/0x12 returned 0 after 49 =
usecs
[   27.419600] calling  crypto_ecb_module_init+0x0/0x12 @ 1
[   27.437334] initcall crypto_ecb_module_init+0x0/0x12 returned 0 after 0 =
usecs
[   27.461067] calling  crypto_cbc_module_init+0x0/0x12 @ 1
[   27.478803] initcall crypto_cbc_module_init+0x0/0x12 returned 0 after 0 =
usecs
[   27.502536] calling  des_generic_mod_init+0x0/0x3f @ 1
[   27.519818] initcall des_generic_mod_init+0x0/0x3f returned 0 after 114 =
usecs
[   27.543434] calling  aes_init+0x0/0x12 @ 1
[   27.557225] initcall aes_init+0x0/0x12 returned 0 after 58 usecs
[   27.577180] calling  arc4_init+0x0/0x12 @ 1
[   27.591274] initcall arc4_init+0x0/0x12 returned 0 after 73 usecs
[   27.611499] calling  deflate_mod_init+0x0/0x12 @ 1
[   27.627762] initcall deflate_mod_init+0x0/0x12 returned 0 after 239 usecs
[   27.650111] calling  zlib_mod_init+0x0/0x12 @ 1
[   27.665600] initcall zlib_mod_init+0x0/0x12 returned 0 after 326 usecs
[   27.687006] calling  crc32c_mod_init+0x0/0x12 @ 1
[   27.702798] initcall crc32c_mod_init+0x0/0x12 returned 0 after 65 usecs
[   27.724786] calling  crypto_authenc_module_init+0x0/0x12 @ 1
[   27.743657] initcall crypto_authenc_module_init+0x0/0x12 returned 0
after 0 usecs
[   27.768537] calling  lzo_mod_init+0x0/0x12 @ 1
[   27.783508] initcall lzo_mod_init+0x0/0x12 returned 0 after 94 usecs
[   27.804573] calling  krng_mod_init+0x0/0x12 @ 1
[   27.819767] alg: No test for stdrng (krng)
[   27.833468] initcall krng_mod_init+0x0/0x12 returned 0 after 13413 usecs
[   27.855769] calling  proc_genhd_init+0x0/0x3c @ 1
[   27.871498] initcall proc_genhd_init+0x0/0x3c returned 0 after 3 usecs
[   27.893234] calling  bsg_init+0x0/0x12e @ 1
[   27.907379] Block layer SCSI generic (bsg) driver version 0.4
loaded (major 252)
[   27.931840] initcall bsg_init+0x0/0x12e returned 0 after 24015 usecs
[   27.953003] calling  noop_init+0x0/0x14 @ 1
[   27.967019] io scheduler noop registered
[   27.980176] initcall noop_init+0x0/0x14 returned 0 after 12848 usecs
[   28.001335] calling  as_init+0x0/0x14 @ 1
[   28.014779] io scheduler anticipatory registered
[   28.030220] initcall as_init+0x0/0x14 returned 0 after 15078 usecs
[   28.050811] calling  deadline_init+0x0/0x14 @ 1
[   28.065968] io scheduler deadline registered
[   28.080270] initcall deadline_init+0x0/0x14 returned 0 after 13965 usecs
[   28.102580] calling  cfq_init+0x0/0x94 @ 1
[   28.116461] io scheduler cfq registered (default)
[   28.132033] initcall cfq_init+0x0/0x94 returned 0 after 15355 usecs
[   28.152911] calling  init_kmp+0x0/0x12 @ 1
[   28.166643] initcall init_kmp+0x0/0x12 returned 0 after 0 usecs
[   28.186372] calling  init_bm+0x0/0x12 @ 1
[   28.199818] initcall init_bm+0x0/0x12 returned 0 after 0 usecs
[   28.219260] calling  init_fsm+0x0/0x12 @ 1
[   28.232993] initcall init_fsm+0x0/0x12 returned 0 after 0 usecs
[   28.252721] calling  percpu_counter_startup+0x0/0x3c @ 1
[   28.270459] initcall percpu_counter_startup+0x0/0x3c returned 0 after 0 =
usecs
[   28.294190] calling  pci_proc_init+0x0/0x6a @ 1
[   28.309384] initcall pci_proc_init+0x0/0x6a returned 0 after 34 usecs
[   28.330801] calling  pcie_portdrv_init+0x0/0x4c @ 1
[   28.347261]   alloc irq_desc for 1257 on node -1
[   28.362542]   alloc kstat_irqs on node -1
[   28.376024] pcieport 0000:00:05.0: setting latency timer to 64
[   28.395693]   alloc irq_desc for 1256 on node -1
[   28.410874]   alloc kstat_irqs on node -1
[   28.424352] pcieport 0000:00:1c.0: setting latency timer to 64
[   28.443971]   alloc irq_desc for 1255 on node -1
[   28.459207]   alloc kstat_irqs on node -1
[   28.472684] pcieport 0000:00:1c.4: setting latency timer to 64
[   28.492303]   alloc irq_desc for 1254 on node -1
[   28.507540]   alloc kstat_irqs on node -1
[   28.521018] pcieport 0000:00:1c.6: setting latency timer to 64
[   28.540641]   alloc irq_desc for 1253 on node -1
[   28.555872]   alloc kstat_irqs on node -1
[   28.569350] pcieport 0000:00:1c.7: setting latency timer to 64
[   28.588957] initcall pcie_portdrv_init+0x0/0x4c returned 0 after 236188 =
usecs
[   28.612500] calling  aer_service_init+0x0/0x2b @ 1
[   28.628701] aer 0000:00:05.0:pcie02: service driver aer loaded
[   28.648018] initcall aer_service_init+0x0/0x2b returned 0 after 19045 us=
ecs
[   28.671131] calling  pci_hotplug_init+0x0/0x1d @ 1
[   28.687144] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
[   28.705737] initcall pci_hotplug_init+0x0/0x1d returned 0 after 18156 us=
ecs
[   28.728932] calling  pcifront_init+0x0/0x4f @ 1
[   28.744144] initcall pcifront_init+0x0/0x4f returned 0 after 57 usecs
[   28.765538] calling  fb_console_init+0x0/0x11d @ 1
[   28.781610] initcall fb_console_init+0x0/0x11d returned 0 after 59 usecs
[   28.803861] calling  genericbl_init+0x0/0x12 @ 1
[   28.819353] initcall genericbl_init+0x0/0x12 returned 0 after 52 usecs
[   28.841040] calling  xenfb_init+0x0/0x5d @ 1
[   28.855335] initcall xenfb_init+0x0/0x5d returned -19 after 0 usecs
[   28.876213] calling  efifb_init+0x0/0x1f5 @ 1
[   28.890803] initcall efifb_init+0x0/0x1f5 returned -19 after 3 usecs
[   28.911963] calling  acpi_reserve_resources+0x0/0xeb @ 1
[   28.929699] initcall acpi_reserve_resources+0x0/0xeb returned 0 after 2 =
usecs
[   28.953430] calling  irqrouter_init_sysfs+0x0/0x38 @ 1
[   28.970696] initcall irqrouter_init_sysfs+0x0/0x38 returned 0 after 99 u=
secs
[   28.994042] calling  acpi_ac_init+0x0/0x45 @ 1
[   29.008989] initcall acpi_ac_init+0x0/0x45 returned 0 after 73 usecs
[   29.030077] calling  acpi_button_init+0x0/0x56 @ 1
[   29.046201] input: Sleep Button as
/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0E:00/input/input0
[   29.073842] ACPI: Sleep Button [SLPB]
[   29.086229] input: Power Button as
/devices/LNXSYSTM:00/LNXPWRBN:00/input/input1
[   29.110725] ACPI: Power Button [PWRF]
[   29.123098] initcall acpi_button_init+0x0/0x56 returned 0 after 75200 us=
ecs
[   29.146193] calling  acpi_fan_init+0x0/0x56 @ 1
[   29.161409] initcall acpi_fan_init+0x0/0x56 returned 0 after 60 usecs
[   29.182800] calling  acpi_video_init+0x0/0x76 @ 1
[   29.198598] initcall acpi_video_init+0x0/0x76 returned 0 after 70 usecs
[   29.220551] calling  acpi_processor_init+0x0/0x136 @ 1
[   29.241016] initcall acpi_processor_init+0x0/0x136 returned 0 after
3226 usecs
[   29.264479] calling  acpi_container_init+0x0/0x42 @ 1
[   29.283573] initcall acpi_container_init+0x0/0x42 returned 0 after 2163 =
usecs
[   29.306749] calling  acpi_thermal_init+0x0/0x7b @ 1
[   29.323119] initcall acpi_thermal_init+0x0/0x7b returned 0 after 66 usecs
[   29.345647] calling  acpi_battery_init+0x0/0x16 @ 1
[   29.361949] initcall acpi_battery_init+0x0/0x16 returned 0 after 2 usecs
[   29.361988] calling  1_acpi_battery_init_async+0x0/0x3c @ 683
[   29.362066] initcall 1_acpi_battery_init_async+0x0/0x3c returned 0
after 72 usecs
[   29.428296] calling  xenbus_probe_initcall+0x0/0x37 @ 1
[   29.445744] initcall xenbus_probe_initcall+0x0/0x37 returned 0 after 0 u=
secs
[   29.469193] calling  evtchn_init+0x0/0x6e @ 1
[   29.483853] Event-channel device installed.
[   29.497796] initcall evtchn_init+0x0/0x6e returned 0 after 13689 usecs
[   29.519531] calling  gntdev_init+0x0/0x3d @ 1
[   29.534179] initcall gntdev_init+0x0/0x3d returned 0 after 64 usecs
[   29.554990] calling  pciback_init+0x0/0x151 @ 1
[   29.570311] initcall pciback_init+0x0/0x151 returned 0 after 159 usecs
[   29.591887] calling  blkif_init+0x0/0x17b @ 1
[   29.608285] initcall blkif_init+0x0/0x17b returned 0 after 1772 usecs
[   29.629177] calling  blktap_init+0x0/0xf1 @ 1
[   29.643759] blktap_device_init: blktap device major 253
[   29.661208] blktap_ring_init: blktap ring major: 251
[   29.678142] initcall blktap_init+0x0/0xf1 returned 0 after 33576 usecs
[   29.699531] calling  netback_init+0x0/0x3d7 @ 1
[   29.717007] registering netback
[   29.727151] initcall netback_init+0x0/0x3d7 returned 0 after 12172 usecs
[   29.749365] calling  xenfs_init+0x0/0x6a @ 1
[   29.763673] initcall xenfs_init+0x0/0x6a returned 0 after 10 usecs
[   29.784255] calling  hypervisor_subsys_init+0x0/0x25 @ 1
[   29.801986] initcall hypervisor_subsys_init+0x0/0x25 returned 0 after 0 =
usecs
[   29.825724] calling  hyper_sysfs_init+0x0/0xfb @ 1
[   29.841747] initcall hyper_sysfs_init+0x0/0xfb returned 0 after 7 usecs
[   29.863763] calling  rand_initialize+0x0/0x2c @ 1
[   29.879498] initcall rand_initialize+0x0/0x2c returned 0 after 9 usecs
[   29.901226] calling  tty_init+0x0/0xf5 @ 1
[   29.919028] initcall tty_init+0x0/0xf5 returned 0 after 3978 usecs
[   29.939058] calling  pty_init+0x0/0x336 @ 1
[   29.953154] initcall pty_init+0x0/0x336 returned 0 after 78 usecs
[   29.973376] calling  sysrq_init+0x0/0x25 @ 1
[   29.987681] initcall sysrq_init+0x0/0x25 returned 0 after 5 usecs
[   30.007981] calling  xen_hvc_init+0x0/0xf0 @ 1
[   30.022853]   alloc irq_desc for 1252 on node -1
[   30.038296]   alloc kstat_irqs on node -1
[   30.052237] initcall xen_hvc_init+0x0/0xf0 returned 0 after 28695 usecs
[   30.073760] calling  hpet_init+0x0/0x6a @ 1
[   30.087961] hpet_acpi_add: no address or irqs in _CRS
[   30.104710] initcall hpet_init+0x0/0x6a returned 0 after 16539 usecs
[   30.125810] calling  nvram_init+0x0/0x82 @ 1
[   30.140169] Non-volatile memory driver v1.3
[   30.154123] initcall nvram_init+0x0/0x82 returned 0 after 13684 usecs
[   30.175572] calling  mod_init+0x0/0x220 @ 1
[   30.189624] initcall mod_init+0x0/0x220 returned -19 after 37 usecs
[   30.210463] calling  mod_init+0x0/0xba @ 1
[   30.224200] initcall mod_init+0x0/0xba returned -19 after 8 usecs
[   30.244496] calling  mod_init+0x0/0x4d @ 1
[   30.258223] initcall mod_init+0x0/0x4d returned -19 after 0 usecs
[   30.278528] calling  agp_init+0x0/0x26 @ 1
[   30.292255] Linux agpgart interface v0.103
[   30.305985] initcall agp_init+0x0/0x26 returned 0 after 13406 usecs
[   30.326862] calling  agp_intel_init+0x0/0x29 @ 1
[   30.342379] initcall agp_intel_init+0x0/0x29 returned 0 after 71 usecs
[   30.364042] calling  drm_core_init+0x0/0x12d @ 1
[   30.379552] [drm] Initialized drm 1.1.0 20060810
[   30.394929] initcall drm_core_init+0x0/0x12d returned 0 after 15082 usecs
[   30.417520] calling  i915_init+0x0/0x52 @ 1
[   30.431570] initcall i915_init+0x0/0x52 returned 0 after 34 usecs
[   30.451841] calling  cn_proc_init+0x0/0x3d @ 1
[   30.466712] initcall cn_proc_init+0x0/0x3d returned 0 after 1 usecs
[   30.487590] calling  serial8250_init+0x0/0x143 @ 1
[   30.503603] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[   30.524729] async_waiting @ 1
[   30.534493] async_continuing @ 1 after 0 usec
(XEN) irq.c:1139:d0 Cannot bind IRQ 4 to guest. In use by 'ns16550'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 2 to guest. In use by 'cascade'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 4 to guest. In use by 'ns16550'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 2 to guest. In use by 'cascade'.
[   30.750139] async_waiting @ 1
[   30.759588] async_continuing @ 1 after 0 usec
(XEN) irq.c:1139:d0 Cannot bind IRQ 4 to guest. In use by 'ns16550'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 2 to guest. In use by 'cascade'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 4 to guest. In use by 'ns16550'.
(XEN) irq.c:1139:d0 Cannot bind IRQ 2 to guest. In use by 'cascade'.
[   30.975191] serial8250: ttyS1 at I/O 0x2f8 (irq =3D 3) is a 16550A
[   30.995161] initcall serial8250_init+0x0/0x143 returned 0 after 480031 u=
secs
[   31.018101] calling  serial8250_pnp_init+0x0/0x12 @ 1
[   31.035357] 00:09: ttyS1 at I/O 0x2f8 (irq =3D 3) is a 16550A
[   31.053682] initcall serial8250_pnp_init+0x0/0x12 returned 0 after
18267 usecs
[   31.077589] calling  serial8250_pci_init+0x0/0x1b @ 1
[   31.094540] initcall serial8250_pci_init+0x0/0x1b returned 0 after 74 us=
ecs
[   31.117630] calling  topology_sysfs_init+0x0/0x50 @ 1
[   31.134514] initcall topology_sysfs_init+0x0/0x50 returned 0 after 13 us=
ecs
[   31.157666] calling  brd_init+0x0/0x1c8 @ 1
[   31.173904] brd: module loaded
[   31.183638] initcall brd_init+0x0/0x1c8 returned 0 after 11677 usecs
[   31.204802] calling  loop_init+0x0/0x1d5 @ 1
[   31.270200] loop: module loaded
[   31.280224] initcall loop_init+0x0/0x1d5 returned 0 after 59689 usecs
[   31.301672] calling  xlblk_init+0x0/0x7a @ 1
[   31.316024] initcall xlblk_init+0x0/0x7a returned 0 after 52 usecs
[   31.336560] calling  mac_hid_init+0x0/0x8e @ 1
[   31.351525] input: Macintosh mouse button emulation as
/devices/virtual/input/input2
[   31.377185] initcall mac_hid_init+0x0/0x8e returned 0 after 25148 usecs
[   31.399192] calling  spi_transport_init+0x0/0x79 @ 1
[   31.415880] initcall spi_transport_init+0x0/0x79 returned 0 after 96 use=
cs
[   31.438659] calling  twa_init+0x0/0x30 @ 1
[   31.452385] 3ware 9000 Storage Controller device driver for Linux
v2.26.02.012.
[   31.476716] xen: registering gsi 16 triggering 0 polarity 1
[   31.495286] xen_allocate_pirq: returning irq 16 for gsi 16
[   31.513589] xen: --> irq=3D16
[   31.523039] Already setup the GSI :16
[   31.535324] 3w-9xxx 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IR=
Q 16
[   31.558779] 3w-9xxx 0000:01:00.0: setting latency timer to 64
[   31.832075] 3w-9xxx: scsi0: AEN: INFO (0x04:0x0053): Battery
capacity test is overdue:.
[   31.934073] 3w-9xxx: scsi0: AEN: INFO (0x04:0x0053): Battery
capacity test is overdue:.
[   32.036072] scsi0 : 3ware 9000 Storage Controller
[   32.051530] 3w-9xxx: scsi0: Found a 3ware 9000 Storage Controller
at 0xb3a00000, IRQ: 16.
[   32.384072] 3w-9xxx: scsi0: Firmware FH9X 4.10.00.021, BIOS BE9X
4.08.00.003, Ports: 128.
[   32.411054] scsi 0:0:0:0: Direct-Access     AMCC     9690SA-4I
DISK  4.10 PQ: 0 ANSI: 5
[   32.446653] initcall twa_init+0x0/0x30 returned 0 after 970962 usecs
[   32.467256] calling  init_sd+0x0/0x142 @ 1
[   32.481169] calling  2_sd_probe_async+0x0/0x1dc @ 1352
[   32.481210] initcall init_sd+0x0/0x142 returned 0 after 215 usecs
[   32.481212] calling  init_sr+0x0/0x46 @ 1
[   32.481266] initcall init_sr+0x0/0x46 returned 0 after 49 usecs
[   32.481269] calling  init_sg+0x0/0x125 @ 1
[   32.481394] sd 0:0:0:0: Attached scsi generic sg0 type 0
[   32.481408] initcall init_sg+0x0/0x125 returned 0 after 133 usecs
[   32.481411] calling  ahci_init+0x0/0x1b @ 1
[   32.481476] initcall ahci_init+0x0/0x1b returned 0 after 60 usecs
[   32.481479] calling  piix_init+0x0/0x29 @ 1
[   32.481537] initcall piix_init+0x0/0x29 returned 0 after 53 usecs
[   32.481539] calling  amd_init+0x0/0x1b @ 1
[   32.481596] initcall amd_init+0x0/0x1b returned 0 after 52 usecs
[   32.481598] calling  mpiix_init+0x0/0x1b @ 1
[   32.481653] initcall mpiix_init+0x0/0x1b returned 0 after 50 usecs
[   32.481656] calling  oldpiix_init+0x0/0x1b @ 1
[   32.481710] initcall oldpiix_init+0x0/0x1b returned 0 after 50 usecs
[   32.481713] calling  sch_init+0x0/0x1b @ 1
[   32.481767] initcall sch_init+0x0/0x1b returned 0 after 49 usecs
[   32.481769] calling  ata_generic_init+0x0/0x1b @ 1
[   32.481824] initcall ata_generic_init+0x0/0x1b returned 0 after 50 usecs
[   32.481827] calling  e1000_init_module+0x0/0x87 @ 1
[   32.481829] Intel(R) PRO/1000 Network Driver - version 7.3.21-k5-NAPI
[   32.481830] Copyright (c) 1999-2006 Intel Corporation.
[   32.481889] initcall e1000_init_module+0x0/0x87 returned 0 after 57 usecs
[   32.481892] calling  e1000_init_module+0x0/0x6b @ 1
[   32.481894] e1000e: Intel(R) PRO/1000 Network Driver - 1.0.2-k2
[   32.481895] e1000e: Copyright (c) 1999-2008 Intel Corporation.
[   32.481936] xen: registering gsi 16 triggering 0 polarity 1
[   32.481937] xen_allocate_pirq: returning irq 16 for gsi 16
[   32.481939] xen: --> irq=3D16
[   32.481941] Already setup the GSI :16
[   32.481943] e1000e 0000:00:19.0: PCI INT A -> GSI 16 (level, low) -> IRQ=
 16
[   32.481951] e1000e 0000:00:19.0: setting latency timer to 64
[   32.482075]   alloc irq_desc for 1251 on node -1
[   32.482076]   alloc kstat_irqs on node -1
[   33.111523] sd 0:0:0:0: [sda] 2929666048 512-byte logical blocks:
(1.49 TB/1.36 TiB)
[   33.137722] sd 0:0:0:0: [sda] Write Protect is off
[   33.153176] sd 0:0:0:0: [sda] Mode Sense: 23 00 10 00
[   33.172013] sd 0:0:0:0: [sda] Write cache: enabled, read cache:
enabled, supports DPO and FUA
[   33.201332]  sda: sda1 sda2 < sda5 sda6 sda7 sda8 sda9 >
[   33.266171] sd 0:0:0:0: [sda] Attached SCSI disk
[   33.281064] initcall 2_sd_probe_async+0x0/0x1dc returned 0 after 165744 =
usecs

then it hangs
thanks for your help

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-api-bounces@lists.xensource.com Wed Dec 14 18:37:07 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 14 Dec 2011 18:37:07 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-api-bounces@lists.xensource.com>)
	id 1RathN-0004CU-NM; Wed, 14 Dec 2011 18:37:01 +0000
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <george.shuklin@gmail.com>) id 1RathM-0004CO-3f
	for xen-api@lists.xensource.com; Wed, 14 Dec 2011 18:37:00 +0000
X-Env-Sender: george.shuklin@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1323887708!60757827!1
X-Originating-IP: [209.85.215.171]
X-SpamReason: No, hits=0.3 required=7.0 tests=ML_RADAR_SPEW_LINKS_14,
	RCVD_BY_IP,spamassassin: 
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19380 invoked from network); 14 Dec 2011 18:35:08 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Dec 2011 18:35:08 -0000
Received: by eaa1 with SMTP id 1so3504932eaa.30
	for <xen-api@lists.xensource.com>; Wed, 14 Dec 2011 10:36:01 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=message-id:date:from:user-agent:mime-version:to:subject:references
	:in-reply-to:content-type;
	bh=55TbFnqzfQCG6j+tsFwrIX5R/lkXqBGj87dyMEBvzLk=;
	b=BoayrG7oquWQuUF8drJYZUeFZcmkQIyqf6nbCbAG94hcsJ8LvXkuDVmuz5mrOUbba3
	BJPxFM1i0XW5n0AJIhJQ0VtcIDz2ZZOjeJ8PDw9JUXaJX7cl07OTx/iUQ3aUTefiZ1zJ
	R5KhdYtqYX2rEfj4m0HYzff6TpShh4KDeTWoQ=
Received: by 10.205.129.137 with SMTP id hi9mr1840844bkc.90.1323887760576;
	Wed, 14 Dec 2011 10:36:00 -0800 (PST)
Received: from [192.168.40.44] (officecvt.selectel.ru. [188.93.16.50])
	by mx.google.com with ESMTPS id fg16sm7991195bkb.16.2011.12.14.10.35.57
	(version=SSLv3 cipher=OTHER); Wed, 14 Dec 2011 10:35:58 -0800 (PST)
Message-ID: <4EE8EC8B.4060606@gmail.com>
Date: Wed, 14 Dec 2011 22:35:55 +0400
From: George Shuklin <george.shuklin@gmail.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:9.0) Gecko/20111209 Thunderbird/9.0
MIME-Version: 1.0
To: xen-api@lists.xensource.com
References: <CACi2erDbY3LGYVOHzK9yNktaEL9Br1YS+7wdVsSQa-XqRDwBug@mail.gmail.com>
	<4EE08360.5010701@citrix.com> <20111211190619.GR12984@reaktio.net>
	<4EE8DCC7.8090708@citrix.com>
In-Reply-To: <4EE8DCC7.8090708@citrix.com>
Content-Type: multipart/mixed; boundary="------------000201030606040204060402"
Subject: Re: [Xen-API] [Xen-users] New name for Kronos? [was XCP 1.5
	availability]
X-BeenThere: xen-api@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-api@lists.xensource.com>
List-Help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>,
	<mailto:xen-api-request@lists.xensource.com?subject=subscribe>
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--------------000201030606040204060402
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

On 14.12.2011 21:28, Mike McClurg wrote:
>> I think we should use the name "XCP" only for the appliance,
>> and maybe just "XAPI toolstack" for the packages in Debian/Ubuntu?
>>
>> Does that make sense? Some people are getting confused about what XCP is..
>>
> I think that does make sense, Pasi. For the Debian packages, I think I'd
> like to call them the "XCP toolstack" packages. And for a Debian host
> with the XCP toolstack installed, perhaps we should just call it a
> Kronos host? I'd like the name Kronos to drop away, but it seems like
> the easiest way to differentiate the two.
>
> Does anyone else have any suggestions?
>
XCP is Xen Cloud Platform, which means it provides ready-out-of-box 
system. This includes every piece of current installation, includes 
xs-tools.iso, pre-created iso sr and other stuff. When we talking about 
toolstack it must be toolstack, not the 'platfrorm'. We can note XCP in 
description, but definitively not in name.

In our internal documentation I usually call all stuff around xapi 
(includes patched LVM, SM and so on) as xapi-toolstack. I think this 
will make very easy to understand model.

            +xend toolstack (Open Source, by community)
           /
          /                                                           
+----- XenServer (Proprientary, by Citrix)
         /                                  + appiances ----+ -----Xen 
Cloud Platform (Open Source, by Citrix)
        /                                  /
Xen + xapi toolstack -----+ ------kronos (Open source, ... by community?)


If this looks ugly I've attach litte diagram in png. (If someone needs 
for SVG, ask)


--------------000201030606040204060402
Content-Type: image/png;
 name="xen-toolstacks.png"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="xen-toolstacks.png"

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
--------------000201030606040204060402
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

--------------000201030606040204060402--


From xen-devel-bounces@lists.xensource.com Thu Dec 15 12:37:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Thu, 15 Dec 2011 12:37:47 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RbAYz-0004qj-No; Thu, 15 Dec 2011 12:37:29 +0000
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <JBeulich@suse.com>) id 1RbAYy-0004qT-24
	for xen-devel@lists.xensource.com; Thu, 15 Dec 2011 12:37:28 +0000
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1323952588!2093214!1
X-Originating-IP: [130.57.49.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11824 invoked from network); 15 Dec 2011 12:36:28 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Dec 2011 12:36:28 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 12 Dec 2011 16:10:36 +0000
Message-Id: <4EE635C20200007800067068@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 
Date: Mon, 12 Dec 2011 16:11:30 +0000
From: "Jan Beulich" <JBeulich@suse.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part456AE0A2.0__="
Subject: [Xen-devel] [PATCH 4/4] ACPI: eliminate duplicate IVRS definitions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a MIME message. If you are reading this text, you may want to 
consider changing to a mail reader or gateway that understands how to 
properly handle MIME multipart messages.

--=__Part456AE0A2.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Use their proper counterparts in include/acpi/actbl*.h instead.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/passthrough/amd/iommu_acpi.c
+++ b/xen/drivers/passthrough/amd/iommu_acpi.c
@@ -20,10 +20,38 @@
=20
 #include <xen/config.h>
 #include <xen/errno.h>
+#include <xen/acpi.h>
 #include <asm/apicdef.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
-#include <asm/hvm/svm/amd-iommu-acpi.h>
+
+/* Some helper structures, particularly to deal with ranges. */
+
+struct acpi_ivhd_device_range {
+   struct acpi_ivrs_device4 start;
+   struct acpi_ivrs_device4 end;
+};
+
+struct acpi_ivhd_device_alias_range {
+   struct acpi_ivrs_device8a alias;
+   struct acpi_ivrs_device4 end;
+};
+
+struct acpi_ivhd_device_extended_range {
+   struct acpi_ivrs_device8b extended;
+   struct acpi_ivrs_device4 end;
+};
+
+union acpi_ivhd_device {
+   struct acpi_ivrs_de_header header;
+   struct acpi_ivrs_device4 select;
+   struct acpi_ivhd_device_range range;
+   struct acpi_ivrs_device8a alias;
+   struct acpi_ivhd_device_alias_range alias_range;
+   struct acpi_ivrs_device8b extended;
+   struct acpi_ivhd_device_extended_range extended_range;
+   struct acpi_ivrs_device8c special;
+};
=20
 static unsigned short __initdata last_bdf;
=20
@@ -242,12 +270,12 @@ static int __init register_exclusion_ran
 }
=20
 static int __init parse_ivmd_device_select(
-    struct acpi_ivmd_block_header *ivmd_block,
+    const struct acpi_ivrs_memory *ivmd_block,
     unsigned long base, unsigned long limit, u8 iw, u8 ir)
 {
     u16 bdf;
=20
-    bdf =3D ivmd_block->header.dev_id;
+    bdf =3D ivmd_block->header.device_id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVMD Error: Invalid Dev_Id 0x%x\n", bdf);
@@ -258,13 +286,13 @@ static int __init parse_ivmd_device_sele
 }
=20
 static int __init parse_ivmd_device_range(
-    struct acpi_ivmd_block_header *ivmd_block,
+    const struct acpi_ivrs_memory *ivmd_block,
     unsigned long base, unsigned long limit, u8 iw, u8 ir)
 {
     u16 first_bdf, last_bdf, bdf;
     int error;
=20
-    first_bdf =3D ivmd_block->header.dev_id;
+    first_bdf =3D ivmd_block->header.device_id;
     if ( first_bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVMD Error: "
@@ -272,7 +300,7 @@ static int __init parse_ivmd_device_rang
         return -ENODEV;
     }
=20
-    last_bdf =3D ivmd_block->last_dev_id;
+    last_bdf =3D ivmd_block->aux_data;
     if ( (last_bdf >=3D ivrs_bdf_entries) || (last_bdf <=3D first_bdf) )
     {
         AMD_IOMMU_DEBUG("IVMD Error: "
@@ -288,18 +316,18 @@ static int __init parse_ivmd_device_rang
 }
=20
 static int __init parse_ivmd_device_iommu(
-    struct acpi_ivmd_block_header *ivmd_block,
+    const struct acpi_ivrs_memory *ivmd_block,
     unsigned long base, unsigned long limit, u8 iw, u8 ir)
 {
     struct amd_iommu *iommu;
=20
     /* find target IOMMU */
-    iommu =3D find_iommu_from_bdf_cap(ivmd_block->header.dev_id,
-                                    ivmd_block->cap_offset);
+    iommu =3D find_iommu_from_bdf_cap(ivmd_block->header.device_id,
+                                    ivmd_block->aux_data);
     if ( !iommu )
     {
         AMD_IOMMU_DEBUG("IVMD Error: No IOMMU for Dev_Id 0x%x  Cap =
0x%x\n",
-                        ivmd_block->header.dev_id, ivmd_block->cap_offset)=
;
+                        ivmd_block->header.device_id, ivmd_block->aux_data=
);
         return -ENODEV;
     }
=20
@@ -307,20 +335,19 @@ static int __init parse_ivmd_device_iomm
         iommu, base, limit, iw, ir);
 }
=20
-static int __init parse_ivmd_block(struct acpi_ivmd_block_header =
*ivmd_block)
+static int __init parse_ivmd_block(const struct acpi_ivrs_memory =
*ivmd_block)
 {
     unsigned long start_addr, mem_length, base, limit;
     u8 iw, ir;
=20
-    if ( ivmd_block->header.length <
-         sizeof(struct acpi_ivmd_block_header) )
+    if ( ivmd_block->header.length < sizeof(*ivmd_block) )
     {
         AMD_IOMMU_DEBUG("IVMD Error: Invalid Block Length!\n");
         return -ENODEV;
     }
=20
-    start_addr =3D (unsigned long)ivmd_block->start_addr;
-    mem_length =3D (unsigned long)ivmd_block->mem_length;
+    start_addr =3D (unsigned long)ivmd_block->start_address;
+    mem_length =3D (unsigned long)ivmd_block->memory_length;
     base =3D start_addr & PAGE_MASK;
     limit =3D (start_addr + mem_length - 1) & PAGE_MASK;
=20
@@ -328,20 +355,14 @@ static int __init parse_ivmd_block(struc
     AMD_IOMMU_DEBUG(" Start_Addr_Phys 0x%lx\n", start_addr);
     AMD_IOMMU_DEBUG(" Mem_Length 0x%lx\n", mem_length);
=20
-    if ( get_field_from_byte(ivmd_block->header.flags,
-                             AMD_IOMMU_ACPI_EXCLUSION_RANGE_MASK,
-                             AMD_IOMMU_ACPI_EXCLUSION_RANGE_SHIFT) )
+    if ( ivmd_block->header.flags & ACPI_IVMD_EXCLUSION_RANGE )
         iw =3D ir =3D IOMMU_CONTROL_ENABLED;
-    else if ( get_field_from_byte(ivmd_block->header.flags,
-                                  AMD_IOMMU_ACPI_UNITY_MAPPING_MASK,
-                                  AMD_IOMMU_ACPI_UNITY_MAPPING_SHIFT) )
-    {
-        iw =3D get_field_from_byte(ivmd_block->header.flags,
-                                 AMD_IOMMU_ACPI_IW_PERMISSION_MASK,
-                                 AMD_IOMMU_ACPI_IW_PERMISSION_SHIFT);
-        ir =3D get_field_from_byte(ivmd_block->header.flags,
-                                 AMD_IOMMU_ACPI_IR_PERMISSION_MASK,
-                                 AMD_IOMMU_ACPI_IR_PERMISSION_SHIFT);
+    else if ( ivmd_block->header.flags & ACPI_IVMD_UNITY )
+    {
+        iw =3D ivmd_block->header.flags & ACPI_IVMD_READ ?
+            IOMMU_CONTROL_ENABLED : IOMMU_CONTROL_DISABLED;
+        ir =3D ivmd_block->header.flags & ACPI_IVMD_WRITE ?
+            IOMMU_CONTROL_ENABLED : IOMMU_CONTROL_DISABLED;
     }
     else
     {
@@ -351,19 +372,19 @@ static int __init parse_ivmd_block(struc
=20
     switch( ivmd_block->header.type )
     {
-    case AMD_IOMMU_ACPI_IVMD_ALL_TYPE:
+    case ACPI_IVRS_TYPE_MEMORY_ALL:
         return register_exclusion_range_for_all_devices(
             base, limit, iw, ir);
=20
-    case AMD_IOMMU_ACPI_IVMD_ONE_TYPE:
+    case ACPI_IVRS_TYPE_MEMORY_ONE:
         return parse_ivmd_device_select(ivmd_block,
                                         base, limit, iw, ir);
=20
-    case AMD_IOMMU_ACPI_IVMD_RANGE_TYPE:
+    case ACPI_IVRS_TYPE_MEMORY_RANGE:
         return parse_ivmd_device_range(ivmd_block,
                                        base, limit, iw, ir);
=20
-    case AMD_IOMMU_ACPI_IVMD_IOMMU_TYPE:
+    case ACPI_IVRS_TYPE_MEMORY_IOMMU:
         return parse_ivmd_device_iommu(ivmd_block,
                                        base, limit, iw, ir);
=20
@@ -386,45 +407,44 @@ static u16 __init parse_ivhd_device_padd
 }
=20
 static u16 __init parse_ivhd_device_select(
-    union acpi_ivhd_device *ivhd_device, struct amd_iommu *iommu)
+    const struct acpi_ivrs_device4 *select, struct amd_iommu *iommu)
 {
     u16 bdf;
=20
-    bdf =3D ivhd_device->header.dev_id;
+    bdf =3D select->header.id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", =
bdf);
         return 0;
     }
=20
-    add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, iommu);
+    add_ivrs_mapping_entry(bdf, bdf, select->header.data_setting, iommu);
=20
-    return sizeof(struct acpi_ivhd_device_header);
+    return sizeof(*select);
 }
=20
 static u16 __init parse_ivhd_device_range(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivhd_device_range *range,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, first_bdf, last_bdf, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_range);
+    dev_length =3D sizeof(*range);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    if ( ivhd_device->range.trailer.type !=3D
-         AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )
+    if ( range->end.header.type !=3D ACPI_IVRS_TYPE_END )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
                         "Invalid Range: End_Type 0x%x\n",
-                        ivhd_device->range.trailer.type);
+                        range->end.header.type);
         return 0;
     }
=20
-    first_bdf =3D ivhd_device->header.dev_id;
+    first_bdf =3D range->start.header.id;
     if ( first_bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -432,7 +452,7 @@ static u16 __init parse_ivhd_device_rang
         return 0;
     }
=20
-    last_bdf =3D ivhd_device->range.trailer.dev_id;
+    last_bdf =3D range->end.header.id;
     if ( (last_bdf >=3D ivrs_bdf_entries) || (last_bdf <=3D first_bdf) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -443,32 +463,33 @@ static u16 __init parse_ivhd_device_rang
     AMD_IOMMU_DEBUG(" Dev_Id Range: 0x%x -> 0x%x\n", first_bdf, last_bdf);=

=20
     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ )
-        add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, =
iommu);
+        add_ivrs_mapping_entry(bdf, bdf, range->start.header.data_setting,=

+                               iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_alias(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivrs_device8a *alias,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, alias_id, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_alias);
+    dev_length =3D sizeof(*alias);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    bdf =3D ivhd_device->header.dev_id;
+    bdf =3D alias->header.id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", =
bdf);
         return 0;
     }
=20
-    alias_id =3D ivhd_device->alias.dev_id;
+    alias_id =3D alias->used_id;
     if ( alias_id >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Alias Dev_Id 0x%x\n", =
alias_id);
@@ -477,35 +498,34 @@ static u16 __init parse_ivhd_device_alia
=20
     AMD_IOMMU_DEBUG(" Dev_Id Alias: 0x%x\n", alias_id);
=20
-    add_ivrs_mapping_entry(bdf, alias_id, ivhd_device->header.flags, =
iommu);
+    add_ivrs_mapping_entry(bdf, alias_id, alias->header.data_setting, =
iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_alias_range(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivhd_device_alias_range *range,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
=20
     u16 dev_length, first_bdf, last_bdf, alias_id, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_alias_range);
+    dev_length =3D sizeof(*range);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    if ( ivhd_device->alias_range.trailer.type !=3D
-         AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )
+    if ( range->end.header.type !=3D ACPI_IVRS_TYPE_END )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
                         "Invalid Range: End_Type 0x%x\n",
-                        ivhd_device->alias_range.trailer.type);
+                        range->end.header.type);
         return 0;
     }
=20
-    first_bdf =3D ivhd_device->header.dev_id;
+    first_bdf =3D range->alias.header.id;
     if ( first_bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -513,7 +533,7 @@ static u16 __init parse_ivhd_device_alia
         return 0;
     }
=20
-    last_bdf =3D ivhd_device->alias_range.trailer.dev_id;
+    last_bdf =3D range->end.header.id;
     if ( last_bdf >=3D ivrs_bdf_entries || last_bdf <=3D first_bdf )
     {
         AMD_IOMMU_DEBUG(
@@ -521,7 +541,7 @@ static u16 __init parse_ivhd_device_alia
         return 0;
     }
=20
-    alias_id =3D ivhd_device->alias_range.alias.dev_id;
+    alias_id =3D range->alias.used_id;
     if ( alias_id >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Alias Dev_Id 0x%x\n", =
alias_id);
@@ -532,59 +552,59 @@ static u16 __init parse_ivhd_device_alia
     AMD_IOMMU_DEBUG(" Dev_Id Alias: 0x%x\n", alias_id);
=20
     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ )
-        add_ivrs_mapping_entry(bdf, alias_id, ivhd_device->header.flags, =
iommu);
+        add_ivrs_mapping_entry(bdf, alias_id, range->alias.header.data_set=
ting,
+                               iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_extended(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivrs_device8b *ext,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_extended);
+    dev_length =3D sizeof(*ext);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    bdf =3D ivhd_device->header.dev_id;
+    bdf =3D ext->header.id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", =
bdf);
         return 0;
     }
=20
-    add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, iommu);
+    add_ivrs_mapping_entry(bdf, bdf, ext->header.data_setting, iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_extended_range(
-    union acpi_ivhd_device *ivhd_device,
+    const struct acpi_ivhd_device_extended_range *range,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, first_bdf, last_bdf, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_extended_range);
+    dev_length =3D sizeof(*range);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    if ( ivhd_device->extended_range.trailer.type !=3D
-         AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )
+    if ( range->end.header.type !=3D ACPI_IVRS_TYPE_END )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
                         "Invalid Range: End_Type 0x%x\n",
-                        ivhd_device->extended_range.trailer.type);
+                        range->end.header.type);
         return 0;
     }
=20
-    first_bdf =3D ivhd_device->header.dev_id;
+    first_bdf =3D range->extended.header.id;
     if ( first_bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -592,7 +612,7 @@ static u16 __init parse_ivhd_device_exte
         return 0;
     }
=20
-    last_bdf =3D ivhd_device->extended_range.trailer.dev_id;
+    last_bdf =3D range->end.header.id;
     if ( (last_bdf >=3D ivrs_bdf_entries) || (last_bdf <=3D first_bdf) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: "
@@ -604,116 +624,116 @@ static u16 __init parse_ivhd_device_exte
                     first_bdf, last_bdf);
=20
     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ )
-        add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, =
iommu);
+        add_ivrs_mapping_entry(bdf, bdf, range->extended.header.data_setti=
ng,
+                               iommu);
=20
     return dev_length;
 }
=20
 static u16 __init parse_ivhd_device_special(
-    union acpi_ivhd_device *ivhd_device, u16 seg,
+    const struct acpi_ivrs_device8c *special, u16 seg,
     u16 header_length, u16 block_length, struct amd_iommu *iommu)
 {
     u16 dev_length, bdf;
=20
-    dev_length =3D sizeof(struct acpi_ivhd_device_special);
+    dev_length =3D sizeof(*special);
     if ( header_length < (block_length + dev_length) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");
         return 0;
     }
=20
-    bdf =3D ivhd_device->special.dev_id;
+    bdf =3D special->used_id;
     if ( bdf >=3D ivrs_bdf_entries )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", =
bdf);
         return 0;
     }
=20
-    add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, iommu);
+    add_ivrs_mapping_entry(bdf, bdf, special->header.data_setting, =
iommu);
     /* set device id of ioapic */
-    ioapic_sbdf[ivhd_device->special.handle].bdf =3D bdf;
-    ioapic_sbdf[ivhd_device->special.handle].seg =3D seg;
+    ioapic_sbdf[special->handle].bdf =3D bdf;
+    ioapic_sbdf[special->handle].seg =3D seg;
     return dev_length;
 }
=20
-static int __init parse_ivhd_block(struct acpi_ivhd_block_header =
*ivhd_block)
+static int __init parse_ivhd_block(const struct acpi_ivrs_hardware =
*ivhd_block)
 {
-    union acpi_ivhd_device *ivhd_device;
+    const union acpi_ivhd_device *ivhd_device;
     u16 block_length, dev_length;
     struct amd_iommu *iommu;
=20
-    if ( ivhd_block->header.length <
-         sizeof(struct acpi_ivhd_block_header) )
+    if ( ivhd_block->header.length < sizeof(*ivhd_block) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Block Length!\n");
         return -ENODEV;
     }
=20
-    iommu =3D find_iommu_from_bdf_cap(ivhd_block->header.dev_id,
-                                    ivhd_block->cap_offset);
+    iommu =3D find_iommu_from_bdf_cap(ivhd_block->header.device_id,
+                                    ivhd_block->capability_offset);
     if ( !iommu )
     {
         AMD_IOMMU_DEBUG("IVHD Error: No IOMMU for Dev_Id 0x%x  Cap =
0x%x\n",
-                        ivhd_block->header.dev_id, ivhd_block->cap_offset)=
;
+                        ivhd_block->header.device_id,
+                        ivhd_block->capability_offset);
         return -ENODEV;
     }
=20
     /* parse Device Entries */
-    block_length =3D sizeof(struct acpi_ivhd_block_header);
+    block_length =3D sizeof(*ivhd_block);
     while ( ivhd_block->header.length >=3D
-            (block_length + sizeof(struct acpi_ivhd_device_header)) )
+            (block_length + sizeof(struct acpi_ivrs_de_header)) )
     {
-        ivhd_device =3D (union acpi_ivhd_device *)
-            ((u8 *)ivhd_block + block_length);
+        ivhd_device =3D (const void *)((const u8 *)ivhd_block + block_leng=
th);
=20
         AMD_IOMMU_DEBUG( "IVHD Device Entry:\n");
         AMD_IOMMU_DEBUG( " Type 0x%x\n", ivhd_device->header.type);
-        AMD_IOMMU_DEBUG( " Dev_Id 0x%x\n", ivhd_device->header.dev_id);
-        AMD_IOMMU_DEBUG( " Flags 0x%x\n", ivhd_device->header.flags);
+        AMD_IOMMU_DEBUG( " Dev_Id 0x%x\n", ivhd_device->header.id);
+        AMD_IOMMU_DEBUG( " Flags 0x%x\n", ivhd_device->header.data_setting=
);
=20
         switch ( ivhd_device->header.type )
         {
-        case AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD:
+        case ACPI_IVRS_TYPE_PAD4:
             dev_length =3D parse_ivhd_device_padding(
                 sizeof(u32),
                 ivhd_block->header.length, block_length);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD:
+        case ACPI_IVRS_TYPE_PAD8:
             dev_length =3D parse_ivhd_device_padding(
                 sizeof(u64),
                 ivhd_block->header.length, block_length);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_SELECT:
-            dev_length =3D parse_ivhd_device_select(ivhd_device, iommu);
+        case ACPI_IVRS_TYPE_SELECT:
+            dev_length =3D parse_ivhd_device_select(&ivhd_device->select, =
iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_RANGE_START:
+        case ACPI_IVRS_TYPE_START:
             dev_length =3D parse_ivhd_device_range(
-                ivhd_device,
+                &ivhd_device->range,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT:
+        case ACPI_IVRS_TYPE_ALIAS_SELECT:
             dev_length =3D parse_ivhd_device_alias(
-                ivhd_device,
+                &ivhd_device->alias,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE:
+        case ACPI_IVRS_TYPE_ALIAS_START:
             dev_length =3D parse_ivhd_device_alias_range(
-                ivhd_device,
+                &ivhd_device->alias_range,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_SELECT:
+        case ACPI_IVRS_TYPE_EXT_SELECT:
             dev_length =3D parse_ivhd_device_extended(
-                ivhd_device,
+                &ivhd_device->extended,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE:
+        case ACPI_IVRS_TYPE_EXT_START:
             dev_length =3D parse_ivhd_device_extended_range(
-                ivhd_device,
+                &ivhd_device->extended_range,
                 ivhd_block->header.length, block_length, iommu);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL:
+        case ACPI_IVRS_TYPE_SPECIAL:
             dev_length =3D parse_ivhd_device_special(
-                ivhd_device, ivhd_block->pci_segment,
+                &ivhd_device->special, ivhd_block->pci_segment_group,
                 ivhd_block->header.length, block_length, iommu);
             break;
         default:
@@ -730,22 +750,24 @@ static int __init parse_ivhd_block(struc
     return 0;
 }
=20
-static int __init parse_ivrs_block(struct acpi_ivrs_block_header =
*ivrs_block)
+static int __init parse_ivrs_block(const struct acpi_ivrs_header =
*ivrs_block)
 {
-    struct acpi_ivhd_block_header *ivhd_block;
-    struct acpi_ivmd_block_header *ivmd_block;
+    const struct acpi_ivrs_hardware *ivhd_block;
+    const struct acpi_ivrs_memory *ivmd_block;
=20
     switch ( ivrs_block->type )
     {
-    case AMD_IOMMU_ACPI_IVHD_TYPE:
-        ivhd_block =3D (struct acpi_ivhd_block_header *)ivrs_block;
+    case ACPI_IVRS_TYPE_HARDWARE:
+        ivhd_block =3D container_of(ivrs_block, const struct acpi_ivrs_har=
dware,
+                                  header);
         return parse_ivhd_block(ivhd_block);
=20
-    case AMD_IOMMU_ACPI_IVMD_ALL_TYPE:
-    case AMD_IOMMU_ACPI_IVMD_ONE_TYPE:
-    case AMD_IOMMU_ACPI_IVMD_RANGE_TYPE:
-    case AMD_IOMMU_ACPI_IVMD_IOMMU_TYPE:
-        ivmd_block =3D (struct acpi_ivmd_block_header *)ivrs_block;
+    case ACPI_IVRS_TYPE_MEMORY_ALL:
+    case ACPI_IVRS_TYPE_MEMORY_ONE:
+    case ACPI_IVRS_TYPE_MEMORY_RANGE:
+    case ACPI_IVRS_TYPE_MEMORY_IOMMU:
+        ivmd_block =3D container_of(ivrs_block, const struct acpi_ivrs_mem=
ory,
+                                  header);
         return parse_ivmd_block(ivmd_block);
=20
     default:
@@ -792,12 +814,11 @@ static void __init dump_acpi_table_heade
=20
 }
=20
-static int __init parse_ivrs_table(struct acpi_table_header *_table)
+static int __init parse_ivrs_table(struct acpi_table_header *table)
 {
-    struct acpi_ivrs_block_header *ivrs_block;
+    const struct acpi_ivrs_header *ivrs_block;
     unsigned long length;
     int error =3D 0;
-    struct acpi_table_header *table =3D (struct acpi_table_header =
*)_table;
=20
     BUG_ON(!table);
=20
@@ -805,17 +826,16 @@ static int __init parse_ivrs_table(struc
         dump_acpi_table_header(table);
=20
     /* parse IVRS blocks */
-    length =3D sizeof(struct acpi_ivrs_table_header);
+    length =3D sizeof(struct acpi_table_ivrs);
     while ( (error =3D=3D 0) && (table->length > (length + sizeof(*ivrs_bl=
ock))) )
     {
-        ivrs_block =3D (struct acpi_ivrs_block_header *)
-            ((u8 *)table + length);
+        ivrs_block =3D (struct acpi_ivrs_header *)((u8 *)table + length);
=20
         AMD_IOMMU_DEBUG("IVRS Block:\n");
         AMD_IOMMU_DEBUG(" Type 0x%x\n", ivrs_block->type);
         AMD_IOMMU_DEBUG(" Flags 0x%x\n", ivrs_block->flags);
         AMD_IOMMU_DEBUG(" Length 0x%x\n", ivrs_block->length);
-        AMD_IOMMU_DEBUG(" Dev_Id 0x%x\n", ivrs_block->dev_id);
+        AMD_IOMMU_DEBUG(" Dev_Id 0x%x\n", ivrs_block->device_id);
=20
         if ( table->length < (length + ivrs_block->length) )
         {
@@ -833,12 +853,11 @@ static int __init parse_ivrs_table(struc
     return error;
 }
=20
-static int __init detect_iommu_acpi(struct acpi_table_header *_table)
+static int __init detect_iommu_acpi(struct acpi_table_header *table)
 {
-    struct acpi_ivrs_block_header *ivrs_block;
-    struct acpi_table_header *table =3D (struct acpi_table_header =
*)_table;
+    const struct acpi_ivrs_header *ivrs_block;
     unsigned long i;
-    unsigned long length =3D sizeof(struct acpi_ivrs_table_header);
+    unsigned long length =3D sizeof(struct acpi_table_ivrs);
     u8 checksum, *raw_table;
=20
     /* validate checksum: sum of entire table =3D=3D 0 */
@@ -854,12 +873,14 @@ static int __init detect_iommu_acpi(stru
=20
     while ( table->length > (length + sizeof(*ivrs_block)) )
     {
-        ivrs_block =3D (struct acpi_ivrs_block_header *) ((u8 *)table + =
length);
+        ivrs_block =3D (struct acpi_ivrs_header *)((u8 *)table + length);
         if ( table->length < (length + ivrs_block->length) )
             return -ENODEV;
-        if ( ivrs_block->type =3D=3D AMD_IOMMU_ACPI_IVHD_TYPE )
-            if ( amd_iommu_detect_one_acpi((void*)ivrs_block) !=3D 0 )
-                return -ENODEV;
+        if ( ivrs_block->type =3D=3D ACPI_IVRS_TYPE_HARDWARE &&
+             amd_iommu_detect_one_acpi(
+                 container_of(ivrs_block, const struct acpi_ivrs_hardware,=

+                              header)) !=3D 0 )
+            return -ENODEV;
         length +=3D ivrs_block->length;
     }
     return 0;
@@ -870,63 +891,59 @@ static int __init detect_iommu_acpi(stru
        last_bdf =3D (x); \
    } while(0);
=20
-static int __init get_last_bdf_ivhd(void *ivhd)
+static int __init get_last_bdf_ivhd(
+    const struct acpi_ivrs_hardware *ivhd_block)
 {
-    union acpi_ivhd_device *ivhd_device;
+    const union acpi_ivhd_device *ivhd_device;
     u16 block_length, dev_length;
-    struct acpi_ivhd_block_header *ivhd_block;
-
-    ivhd_block =3D (struct acpi_ivhd_block_header *)ivhd;
=20
-    if ( ivhd_block->header.length <
-         sizeof(struct acpi_ivhd_block_header) )
+    if ( ivhd_block->header.length < sizeof(*ivhd_block) )
     {
         AMD_IOMMU_DEBUG("IVHD Error: Invalid Block Length!\n");
         return -ENODEV;
     }
=20
-    block_length =3D sizeof(struct acpi_ivhd_block_header);
+    block_length =3D sizeof(*ivhd_block);
     while ( ivhd_block->header.length >=3D
-            (block_length + sizeof(struct acpi_ivhd_device_header)) )
+            (block_length + sizeof(struct acpi_ivrs_de_header)) )
     {
-        ivhd_device =3D (union acpi_ivhd_device *)
-            ((u8 *)ivhd_block + block_length);
+        ivhd_device =3D (const void *)((u8 *)ivhd_block + block_length);
=20
         switch ( ivhd_device->header.type )
         {
-        case AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD:
+        case ACPI_IVRS_TYPE_PAD4:
             dev_length =3D sizeof(u32);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD:
+        case ACPI_IVRS_TYPE_PAD8:
             dev_length =3D sizeof(u64);
             break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_SELECT:
-            UPDATE_LAST_BDF(ivhd_device->header.dev_id);
-            dev_length =3D sizeof(struct acpi_ivhd_device_header);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT:
-            UPDATE_LAST_BDF(ivhd_device->header.dev_id);
-            dev_length =3D sizeof(struct acpi_ivhd_device_alias);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_SELECT:
-            UPDATE_LAST_BDF(ivhd_device->header.dev_id);
-            dev_length =3D sizeof(struct acpi_ivhd_device_extended);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_RANGE_START:
-            UPDATE_LAST_BDF(ivhd_device->range.trailer.dev_id);
-            dev_length =3D sizeof(struct acpi_ivhd_device_range);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE:
-            UPDATE_LAST_BDF(ivhd_device->alias_range.trailer.dev_id)
-            dev_length =3D sizeof(struct acpi_ivhd_device_alias_range);
-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE:
-            UPDATE_LAST_BDF(ivhd_device->extended_range.trailer.dev_id)
-            dev_length =3D sizeof(struct acpi_ivhd_device_extended_range);=

-            break;
-        case AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL:
-            UPDATE_LAST_BDF(ivhd_device->special.dev_id)
-            dev_length =3D sizeof(struct acpi_ivhd_device_special);
+        case ACPI_IVRS_TYPE_SELECT:
+            UPDATE_LAST_BDF(ivhd_device->select.header.id);
+            dev_length =3D sizeof(ivhd_device->header);
+            break;
+        case ACPI_IVRS_TYPE_ALIAS_SELECT:
+            UPDATE_LAST_BDF(ivhd_device->alias.header.id);
+            dev_length =3D sizeof(ivhd_device->alias);
+            break;
+        case ACPI_IVRS_TYPE_EXT_SELECT:
+            UPDATE_LAST_BDF(ivhd_device->extended.header.id);
+            dev_length =3D sizeof(ivhd_device->extended);
+            break;
+        case ACPI_IVRS_TYPE_START:
+            UPDATE_LAST_BDF(ivhd_device->range.end.header.id);
+            dev_length =3D sizeof(ivhd_device->range);
+            break;
+        case ACPI_IVRS_TYPE_ALIAS_START:
+            UPDATE_LAST_BDF(ivhd_device->alias_range.end.header.id)
+            dev_length =3D sizeof(ivhd_device->alias_range);
+            break;
+        case ACPI_IVRS_TYPE_EXT_START:
+            UPDATE_LAST_BDF(ivhd_device->extended_range.end.header.id)
+            dev_length =3D sizeof(ivhd_device->extended_range);
+            break;
+        case ACPI_IVRS_TYPE_SPECIAL:
+            UPDATE_LAST_BDF(ivhd_device->special.used_id)
+            dev_length =3D sizeof(ivhd_device->special);
             break;
         default:
             AMD_IOMMU_DEBUG("IVHD Error: Invalid Device Type!\n");
@@ -942,20 +959,21 @@ static int __init get_last_bdf_ivhd(void
     return 0;
 }
=20
-static int __init get_last_bdf_acpi(struct acpi_table_header *_table)
+static int __init get_last_bdf_acpi(struct acpi_table_header *table)
 {
-    struct acpi_ivrs_block_header *ivrs_block;
-    struct acpi_table_header *table =3D (struct acpi_table_header =
*)_table;
-    unsigned long length =3D sizeof(struct acpi_ivrs_table_header);
+    const struct acpi_ivrs_header *ivrs_block;
+    unsigned long length =3D sizeof(struct acpi_table_ivrs);
=20
     while ( table->length > (length + sizeof(*ivrs_block)) )
     {
-        ivrs_block =3D (struct acpi_ivrs_block_header *) ((u8 *)table + =
length);
+        ivrs_block =3D (struct acpi_ivrs_header *)((u8 *)table + length);
         if ( table->length < (length + ivrs_block->length) )
             return -ENODEV;
-        if ( ivrs_block->type =3D=3D AMD_IOMMU_ACPI_IVHD_TYPE )
-            if ( get_last_bdf_ivhd((void*)ivrs_block) !=3D 0 )
-                return -ENODEV;
+        if ( ivrs_block->type =3D=3D ACPI_IVRS_TYPE_HARDWARE &&
+             get_last_bdf_ivhd(
+                 container_of(ivrs_block, const struct acpi_ivrs_hardware,=

+                              header)) !=3D 0 )
+            return -ENODEV;
         length +=3D ivrs_block->length;
     }
    return 0;
@@ -963,16 +981,16 @@ static int __init get_last_bdf_acpi(stru
=20
 int __init amd_iommu_detect_acpi(void)
 {
-    return acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, detect_iommu_acpi);
+    return acpi_table_parse(ACPI_SIG_IVRS, detect_iommu_acpi);
 }
=20
 int __init amd_iommu_get_ivrs_dev_entries(void)
 {
-    acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, get_last_bdf_acpi);
+    acpi_table_parse(ACPI_SIG_IVRS, get_last_bdf_acpi);
     return last_bdf + 1;
 }
=20
 int __init amd_iommu_update_ivrs_mapping_acpi(void)
 {
-    return acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, parse_ivrs_table);
+    return acpi_table_parse(ACPI_SIG_IVRS, parse_ivrs_table);
 }
--- a/xen/drivers/passthrough/amd/iommu_detect.c
+++ b/xen/drivers/passthrough/amd/iommu_detect.c
@@ -20,12 +20,12 @@
=20
 #include <xen/config.h>
 #include <xen/errno.h>
+#include <xen/acpi.h>
 #include <xen/iommu.h>
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
-#include <asm/hvm/svm/amd-iommu-acpi.h>
=20
 static int __init get_iommu_msi_capabilities(
     u16 seg, u8 bus, u8 dev, u8 func, struct amd_iommu *iommu)
@@ -103,23 +103,21 @@ void __init get_iommu_features(struct am
     }
 }
=20
-int __init amd_iommu_detect_one_acpi(void *ivhd)
+int __init amd_iommu_detect_one_acpi(
+    const struct acpi_ivrs_hardware *ivhd_block)
 {
     struct amd_iommu *iommu;
     u8 bus, dev, func;
-    struct acpi_ivhd_block_header *ivhd_block;
     int rt =3D 0;
=20
-    ivhd_block =3D (struct acpi_ivhd_block_header *)ivhd;
-
-    if ( ivhd_block->header.length < sizeof(struct acpi_ivhd_block_header)=
 )
+    if ( ivhd_block->header.length < sizeof(*ivhd_block) )
     {
         AMD_IOMMU_DEBUG("Invalid IVHD Block Length!\n");
         return -ENODEV;
     }
=20
-    if ( !ivhd_block->header.dev_id ||
-        !ivhd_block->cap_offset || !ivhd_block->mmio_base)
+    if ( !ivhd_block->header.device_id ||
+        !ivhd_block->capability_offset || !ivhd_block->base_address)
     {
         AMD_IOMMU_DEBUG("Invalid IVHD Block!\n");
         return -ENODEV;
@@ -134,10 +132,10 @@ int __init amd_iommu_detect_one_acpi(voi
=20
     spin_lock_init(&iommu->lock);
=20
-    iommu->seg =3D ivhd_block->pci_segment;
-    iommu->bdf =3D ivhd_block->header.dev_id;
-    iommu->cap_offset =3D ivhd_block->cap_offset;
-    iommu->mmio_base_phys =3D ivhd_block->mmio_base;
+    iommu->seg =3D ivhd_block->pci_segment_group;
+    iommu->bdf =3D ivhd_block->header.device_id;
+    iommu->cap_offset =3D ivhd_block->capability_offset;
+    iommu->mmio_base_phys =3D ivhd_block->base_address;
=20
     /* override IOMMU HT flags */
     iommu->ht_flags =3D ivhd_block->header.flags;
--- a/xen/drivers/passthrough/amd/iommu_init.c
+++ b/xen/drivers/passthrough/amd/iommu_init.c
@@ -20,6 +20,7 @@
=20
 #include <xen/config.h>
 #include <xen/errno.h>
+#include <xen/acpi.h>
 #include <xen/pci.h>
 #include <xen/pci_regs.h>
 #include <xen/irq.h>
@@ -28,7 +29,6 @@
 #include <asm/hvm/svm/amd-iommu-proto.h>
 #include <asm-x86/fixmap.h>
 #include <mach_apic.h>
-#include <asm/hvm/svm/amd-iommu-acpi.h>
=20
 static int __initdata nr_amd_iommus;
=20
@@ -37,9 +37,8 @@ static struct radix_tree_root ivrs_maps;
 struct list_head amd_iommu_head;
 struct table_struct device_table;
=20
-static int iommu_has_ht_flag(struct amd_iommu *iommu, uint8_t bit)
+static int iommu_has_ht_flag(struct amd_iommu *iommu, u8 mask)
 {
-    u8 mask =3D 1U << bit;
     return iommu->ht_flags & mask;
 }
=20
@@ -80,19 +79,19 @@ static void set_iommu_ht_flags(struct am
=20
     /* Setup HT flags */
     if ( iommu_has_cap(iommu, PCI_CAP_HT_TUNNEL_SHIFT) )
-        iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT) ?
+        iommu_has_ht_flag(iommu, ACPI_IVHD_TT_ENABLE) ?
             iommu_set_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIF=
T) :
             iommu_clear_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SH=
IFT);
=20
-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_RES_PASS_PW_SHIFT) ?
+    iommu_has_ht_flag(iommu, ACPI_IVHD_RES_PASS_PW) ?
         iommu_set_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT):=

         iommu_clear_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT=
);
=20
-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_ISOC_SHIFT) ?
+    iommu_has_ht_flag(iommu, ACPI_IVHD_ISOC) ?
         iommu_set_bit(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT):
         iommu_clear_bit(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT);
=20
-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_PASS_PW_SHIFT) ?
+    iommu_has_ht_flag(iommu, ACPI_IVHD_PASS_PW) ?
         iommu_set_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT):
         iommu_clear_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT);
=20
--- a/xen/drivers/passthrough/amd/iommu_map.c
+++ b/xen/drivers/passthrough/amd/iommu_map.c
@@ -18,12 +18,13 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 =
USA
  */
=20
+#include <xen/config.h>
+#include <xen/acpi.h>
 #include <xen/sched.h>
 #include <asm/p2m.h>
 #include <xen/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
-#include <asm/hvm/svm/amd-iommu-acpi.h>
 #include "../ats.h"
 #include <xen/pci.h>
=20
@@ -215,8 +216,7 @@ void __init iommu_dte_add_device_entry(u
     dte[7] =3D dte[6] =3D dte[4] =3D dte[2] =3D dte[1] =3D dte[0] =3D 0;
=20
     flags =3D ivrs_dev->device_flags;
-    sys_mgt =3D get_field_from_byte(flags, AMD_IOMMU_ACPI_SYS_MGT_MASK,
-                                  AMD_IOMMU_ACPI_SYS_MGT_SHIFT);
+    sys_mgt =3D get_field_from_byte(flags, ACPI_IVHD_SYSTEM_MGMT);
     dev_ex =3D ivrs_dev->dte_allow_exclusion;
=20
     flags &=3D mask;
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-acpi.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2007 Advanced Micro Devices, Inc.
- * Author: Leo Duran <leo.duran@amd.com>
- * Author: Wei Wang <wei.wang2@amd.com> - adapted to xen
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 =
USA
- */
-
-#ifndef _ASM_X86_64_AMD_IOMMU_ACPI_H
-#define _ASM_X86_64_AMD_IOMMU_ACPI_H
-
-#include <xen/acpi.h>
-
-/* I/O Virtualization Reporting Structure */
-#define AMD_IOMMU_ACPI_IVRS_SIG            "IVRS"
-#define AMD_IOMMU_ACPI_IVHD_TYPE       0x10
-#define AMD_IOMMU_ACPI_IVMD_ALL_TYPE       0x20
-#define AMD_IOMMU_ACPI_IVMD_ONE_TYPE       0x21
-#define AMD_IOMMU_ACPI_IVMD_RANGE_TYPE     0x22
-#define AMD_IOMMU_ACPI_IVMD_IOMMU_TYPE     0x23
-
-/* 4-byte Device Entries */
-#define AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD        0
-#define AMD_IOMMU_ACPI_IVHD_DEV_SELECT     2
-#define AMD_IOMMU_ACPI_IVHD_DEV_RANGE_START    3
-#define AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END  4
-
-/* 8-byte Device Entries */
-#define AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD        64
-#define AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT   66
-#define AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE    67
-#define AMD_IOMMU_ACPI_IVHD_DEV_EXT_SELECT 70
-#define AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE  71
-#define AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL    72
-
-/* IVHD IOMMU Flags */
-#define AMD_IOMMU_ACPI_COHERENT_MASK       0x20
-#define AMD_IOMMU_ACPI_COHERENT_SHIFT      5
-#define AMD_IOMMU_ACPI_IOTLB_SUP_MASK      0x10
-#define AMD_IOMMU_ACPI_IOTLB_SUP_SHIFT     4
-#define AMD_IOMMU_ACPI_ISOC_MASK       0x08
-#define AMD_IOMMU_ACPI_ISOC_SHIFT      3
-#define AMD_IOMMU_ACPI_RES_PASS_PW_MASK        0x04
-#define AMD_IOMMU_ACPI_RES_PASS_PW_SHIFT   2
-#define AMD_IOMMU_ACPI_PASS_PW_MASK        0x02
-#define AMD_IOMMU_ACPI_PASS_PW_SHIFT       1
-#define AMD_IOMMU_ACPI_HT_TUN_ENB_MASK     0x01
-#define AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT        0
-
-/* IVHD Device Flags */
-#define AMD_IOMMU_ACPI_LINT1_PASS_MASK     0x80
-#define AMD_IOMMU_ACPI_LINT1_PASS_SHIFT        7
-#define AMD_IOMMU_ACPI_LINT0_PASS_MASK     0x40
-#define AMD_IOMMU_ACPI_LINT0_PASS_SHIFT        6
-#define AMD_IOMMU_ACPI_SYS_MGT_MASK        0x30
-#define AMD_IOMMU_ACPI_SYS_MGT_SHIFT       4
-#define AMD_IOMMU_ACPI_NMI_PASS_MASK       0x04
-#define AMD_IOMMU_ACPI_NMI_PASS_SHIFT      2
-#define AMD_IOMMU_ACPI_EINT_PASS_MASK      0x02
-#define AMD_IOMMU_ACPI_EINT_PASS_SHIFT     1
-#define AMD_IOMMU_ACPI_INIT_PASS_MASK      0x01
-#define AMD_IOMMU_ACPI_INIT_PASS_SHIFT     0
-
-/* IVHD Device Extended Flags */
-#define AMD_IOMMU_ACPI_ATS_DISABLED_MASK   0x80000000
-#define AMD_IOMMU_ACPI_ATS_DISABLED_SHIFT  31
-
-/* IVMD Device Flags */
-#define AMD_IOMMU_ACPI_EXCLUSION_RANGE_MASK    0x08
-#define AMD_IOMMU_ACPI_EXCLUSION_RANGE_SHIFT   3
-#define AMD_IOMMU_ACPI_IW_PERMISSION_MASK  0x04
-#define AMD_IOMMU_ACPI_IW_PERMISSION_SHIFT 2
-#define AMD_IOMMU_ACPI_IR_PERMISSION_MASK  0x02
-#define AMD_IOMMU_ACPI_IR_PERMISSION_SHIFT 1
-#define AMD_IOMMU_ACPI_UNITY_MAPPING_MASK  0x01
-#define AMD_IOMMU_ACPI_UNITY_MAPPING_SHIFT 0
-
-#define ACPI_OEM_ID_SIZE                6
-#define ACPI_OEM_TABLE_ID_SIZE          8
-
-#pragma pack(1)
-struct acpi_ivrs_table_header {
-   struct acpi_table_header acpi_header;
-   u32 io_info;
-   u8  reserved[8];
-};
-
-struct acpi_ivrs_block_header {
-   u8  type;
-   u8  flags;
-   u16 length;
-   u16 dev_id;
-};
-
-struct acpi_ivhd_block_header {
-   struct acpi_ivrs_block_header header;
-   u16 cap_offset;
-   u64 mmio_base;
-   u16 pci_segment;
-   u16 iommu_info;
-   u8 reserved[4];
-};
-
-struct acpi_ivhd_device_header {
-   u8  type;
-   u16 dev_id;
-   u8  flags;
-};
-
-struct acpi_ivhd_device_trailer {
-   u8  type;
-   u16 dev_id;
-   u8  reserved;
-};
-
-struct acpi_ivhd_device_range {
-   struct acpi_ivhd_device_header header;
-   struct acpi_ivhd_device_trailer trailer;
-};
-
-struct acpi_ivhd_device_alias {
-   struct acpi_ivhd_device_header header;
-   u8  reserved1;
-   u16 dev_id;
-   u8  reserved2;
-};
-
-struct acpi_ivhd_device_alias_range {
-   struct acpi_ivhd_device_alias alias;
-   struct acpi_ivhd_device_trailer trailer;
-};
-
-struct acpi_ivhd_device_extended {
-   struct acpi_ivhd_device_header header;
-   u32 ext_flags;
-};
-
-struct acpi_ivhd_device_extended_range {
-   struct acpi_ivhd_device_extended extended;
-   struct acpi_ivhd_device_trailer trailer;
-};
-
-struct acpi_ivhd_device_special {
-   struct acpi_ivhd_device_header header;
-   u8  handle;
-   u16 dev_id;
-   u8  variety;
-};
-
-union acpi_ivhd_device {
-   struct acpi_ivhd_device_header header;
-   struct acpi_ivhd_device_range range;
-   struct acpi_ivhd_device_alias alias;
-   struct acpi_ivhd_device_alias_range alias_range;
-   struct acpi_ivhd_device_extended extended;
-   struct acpi_ivhd_device_extended_range extended_range;
-   struct acpi_ivhd_device_special special;
-};
-
-struct acpi_ivmd_block_header {
-   struct acpi_ivrs_block_header header;
-   union {
-       u16 last_dev_id;
-       u16 cap_offset;
-       u16 reserved1;
-   };
-   u64 reserved2;
-   u64 start_addr;
-   u64 mem_length;
-};
-#pragma pack()
-
-#endif /* _ASM_X86_64_AMD_IOMMU_ACPI_H */
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
@@ -26,6 +26,8 @@
 #include <asm/apicdef.h>
 #include <xen/domain_page.h>
=20
+struct acpi_ivrs_hardware;
+
 #define for_each_amd_iommu(amd_iommu) \
     list_for_each_entry(amd_iommu, \
         &amd_iommu_head, list)
@@ -41,7 +43,7 @@
=20
 /* amd-iommu-detect functions */
 int amd_iommu_get_ivrs_dev_entries(void);
-int amd_iommu_detect_one_acpi(void *ivhd);
+int amd_iommu_detect_one_acpi(const struct acpi_ivrs_hardware *);
 int amd_iommu_detect_acpi(void);
 void get_iommu_features(struct amd_iommu *iommu);
=20
@@ -121,11 +123,9 @@ static inline u32 set_field_in_reg_u32(u
     return reg_value;
 }
=20
-static inline u8 get_field_from_byte(u8 value, u8 mask, u8 shift)
+static inline u8 get_field_from_byte(u8 value, u8 mask)
 {
-    u8 field;
-    field =3D (value & mask) >> shift;
-    return field;
+    return (value & mask) / (mask & -mask);
 }
=20
 static inline unsigned long region_to_pages(unsigned long addr, unsigned =
long size)



--=__Part456AE0A2.0__=
Content-Type: text/plain; name="acpi-duplicate-ivrs-structs.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="acpi-duplicate-ivrs-structs.patch"

ACPI: eliminate duplicate IVRS definitions=0A=0AUse their proper counterpar=
ts in include/acpi/actbl*.h instead.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/drivers/passthrough/amd/iommu_acpi.c=0A+=
++ b/xen/drivers/passthrough/amd/iommu_acpi.c=0A@@ -20,10 +20,38 @@=0A =0A =
#include <xen/config.h>=0A #include <xen/errno.h>=0A+#include <xen/acpi.h>=
=0A #include <asm/apicdef.h>=0A #include <asm/amd-iommu.h>=0A #include =
<asm/hvm/svm/amd-iommu-proto.h>=0A-#include <asm/hvm/svm/amd-iommu-acpi.h>=
=0A+=0A+/* Some helper structures, particularly to deal with ranges. =
*/=0A+=0A+struct acpi_ivhd_device_range {=0A+   struct acpi_ivrs_device4 =
start;=0A+   struct acpi_ivrs_device4 end;=0A+};=0A+=0A+struct acpi_ivhd_de=
vice_alias_range {=0A+   struct acpi_ivrs_device8a alias;=0A+   struct =
acpi_ivrs_device4 end;=0A+};=0A+=0A+struct acpi_ivhd_device_extended_range =
{=0A+   struct acpi_ivrs_device8b extended;=0A+   struct acpi_ivrs_device4 =
end;=0A+};=0A+=0A+union acpi_ivhd_device {=0A+   struct acpi_ivrs_de_header=
 header;=0A+   struct acpi_ivrs_device4 select;=0A+   struct acpi_ivhd_devi=
ce_range range;=0A+   struct acpi_ivrs_device8a alias;=0A+   struct =
acpi_ivhd_device_alias_range alias_range;=0A+   struct acpi_ivrs_device8b =
extended;=0A+   struct acpi_ivhd_device_extended_range extended_range;=0A+ =
  struct acpi_ivrs_device8c special;=0A+};=0A =0A static unsigned short =
__initdata last_bdf;=0A =0A@@ -242,12 +270,12 @@ static int __init =
register_exclusion_ran=0A }=0A =0A static int __init parse_ivmd_device_sele=
ct(=0A-    struct acpi_ivmd_block_header *ivmd_block,=0A+    const struct =
acpi_ivrs_memory *ivmd_block,=0A     unsigned long base, unsigned long =
limit, u8 iw, u8 ir)=0A {=0A     u16 bdf;=0A =0A-    bdf =3D ivmd_block->he=
ader.dev_id;=0A+    bdf =3D ivmd_block->header.device_id;=0A     if ( bdf =
>=3D ivrs_bdf_entries )=0A     {=0A         AMD_IOMMU_DEBUG("IVMD Error: =
Invalid Dev_Id 0x%x\n", bdf);=0A@@ -258,13 +286,13 @@ static int __init =
parse_ivmd_device_sele=0A }=0A =0A static int __init parse_ivmd_device_rang=
e(=0A-    struct acpi_ivmd_block_header *ivmd_block,=0A+    const struct =
acpi_ivrs_memory *ivmd_block,=0A     unsigned long base, unsigned long =
limit, u8 iw, u8 ir)=0A {=0A     u16 first_bdf, last_bdf, bdf;=0A     int =
error;=0A =0A-    first_bdf =3D ivmd_block->header.dev_id;=0A+    =
first_bdf =3D ivmd_block->header.device_id;=0A     if ( first_bdf >=3D =
ivrs_bdf_entries )=0A     {=0A         AMD_IOMMU_DEBUG("IVMD Error: "=0A@@ =
-272,7 +300,7 @@ static int __init parse_ivmd_device_rang=0A         =
return -ENODEV;=0A     }=0A =0A-    last_bdf =3D ivmd_block->last_dev_id;=
=0A+    last_bdf =3D ivmd_block->aux_data;=0A     if ( (last_bdf >=3D =
ivrs_bdf_entries) || (last_bdf <=3D first_bdf) )=0A     {=0A         =
AMD_IOMMU_DEBUG("IVMD Error: "=0A@@ -288,18 +316,18 @@ static int __init =
parse_ivmd_device_rang=0A }=0A =0A static int __init parse_ivmd_device_iomm=
u(=0A-    struct acpi_ivmd_block_header *ivmd_block,=0A+    const struct =
acpi_ivrs_memory *ivmd_block,=0A     unsigned long base, unsigned long =
limit, u8 iw, u8 ir)=0A {=0A     struct amd_iommu *iommu;=0A =0A     /* =
find target IOMMU */=0A-    iommu =3D find_iommu_from_bdf_cap(ivmd_block->h=
eader.dev_id,=0A-                                    ivmd_block->cap_offset=
);=0A+    iommu =3D find_iommu_from_bdf_cap(ivmd_block->header.device_id,=
=0A+                                    ivmd_block->aux_data);=0A     if ( =
!iommu )=0A     {=0A         AMD_IOMMU_DEBUG("IVMD Error: No IOMMU for =
Dev_Id 0x%x  Cap 0x%x\n",=0A-                        ivmd_block->header.dev=
_id, ivmd_block->cap_offset);=0A+                        ivmd_block->header=
.device_id, ivmd_block->aux_data);=0A         return -ENODEV;=0A     }=0A =
=0A@@ -307,20 +335,19 @@ static int __init parse_ivmd_device_iomm=0A       =
  iommu, base, limit, iw, ir);=0A }=0A =0A-static int __init parse_ivmd_blo=
ck(struct acpi_ivmd_block_header *ivmd_block)=0A+static int __init =
parse_ivmd_block(const struct acpi_ivrs_memory *ivmd_block)=0A {=0A     =
unsigned long start_addr, mem_length, base, limit;=0A     u8 iw, ir;=0A =
=0A-    if ( ivmd_block->header.length <=0A-         sizeof(struct =
acpi_ivmd_block_header) )=0A+    if ( ivmd_block->header.length < =
sizeof(*ivmd_block) )=0A     {=0A         AMD_IOMMU_DEBUG("IVMD Error: =
Invalid Block Length!\n");=0A         return -ENODEV;=0A     }=0A =0A-    =
start_addr =3D (unsigned long)ivmd_block->start_addr;=0A-    mem_length =
=3D (unsigned long)ivmd_block->mem_length;=0A+    start_addr =3D (unsigned =
long)ivmd_block->start_address;=0A+    mem_length =3D (unsigned long)ivmd_b=
lock->memory_length;=0A     base =3D start_addr & PAGE_MASK;=0A     limit =
=3D (start_addr + mem_length - 1) & PAGE_MASK;=0A =0A@@ -328,20 +355,14 @@ =
static int __init parse_ivmd_block(struc=0A     AMD_IOMMU_DEBUG(" =
Start_Addr_Phys 0x%lx\n", start_addr);=0A     AMD_IOMMU_DEBUG(" Mem_Length =
0x%lx\n", mem_length);=0A =0A-    if ( get_field_from_byte(ivmd_block->head=
er.flags,=0A-                             AMD_IOMMU_ACPI_EXCLUSION_RANGE_MA=
SK,=0A-                             AMD_IOMMU_ACPI_EXCLUSION_RANGE_SHIFT) =
)=0A+    if ( ivmd_block->header.flags & ACPI_IVMD_EXCLUSION_RANGE )=0A    =
     iw =3D ir =3D IOMMU_CONTROL_ENABLED;=0A-    else if ( get_field_from_b=
yte(ivmd_block->header.flags,=0A-                                  =
AMD_IOMMU_ACPI_UNITY_MAPPING_MASK,=0A-                                  =
AMD_IOMMU_ACPI_UNITY_MAPPING_SHIFT) )=0A-    {=0A-        iw =3D get_field_=
from_byte(ivmd_block->header.flags,=0A-                                 =
AMD_IOMMU_ACPI_IW_PERMISSION_MASK,=0A-                                 =
AMD_IOMMU_ACPI_IW_PERMISSION_SHIFT);=0A-        ir =3D get_field_from_byte(=
ivmd_block->header.flags,=0A-                                 AMD_IOMMU_ACP=
I_IR_PERMISSION_MASK,=0A-                                 AMD_IOMMU_ACPI_IR=
_PERMISSION_SHIFT);=0A+    else if ( ivmd_block->header.flags & ACPI_IVMD_U=
NITY )=0A+    {=0A+        iw =3D ivmd_block->header.flags & ACPI_IVMD_READ=
 ?=0A+            IOMMU_CONTROL_ENABLED : IOMMU_CONTROL_DISABLED;=0A+      =
  ir =3D ivmd_block->header.flags & ACPI_IVMD_WRITE ?=0A+            =
IOMMU_CONTROL_ENABLED : IOMMU_CONTROL_DISABLED;=0A     }=0A     else=0A    =
 {=0A@@ -351,19 +372,19 @@ static int __init parse_ivmd_block(struc=0A =0A =
    switch( ivmd_block->header.type )=0A     {=0A-    case AMD_IOMMU_ACPI_I=
VMD_ALL_TYPE:=0A+    case ACPI_IVRS_TYPE_MEMORY_ALL:=0A         return =
register_exclusion_range_for_all_devices(=0A             base, limit, iw, =
ir);=0A =0A-    case AMD_IOMMU_ACPI_IVMD_ONE_TYPE:=0A+    case ACPI_IVRS_TY=
PE_MEMORY_ONE:=0A         return parse_ivmd_device_select(ivmd_block,=0A   =
                                      base, limit, iw, ir);=0A =0A-    =
case AMD_IOMMU_ACPI_IVMD_RANGE_TYPE:=0A+    case ACPI_IVRS_TYPE_MEMORY_RANG=
E:=0A         return parse_ivmd_device_range(ivmd_block,=0A                =
                        base, limit, iw, ir);=0A =0A-    case AMD_IOMMU_ACP=
I_IVMD_IOMMU_TYPE:=0A+    case ACPI_IVRS_TYPE_MEMORY_IOMMU:=0A         =
return parse_ivmd_device_iommu(ivmd_block,=0A                              =
          base, limit, iw, ir);=0A =0A@@ -386,45 +407,44 @@ static u16 =
__init parse_ivhd_device_padd=0A }=0A =0A static u16 __init parse_ivhd_devi=
ce_select(=0A-    union acpi_ivhd_device *ivhd_device, struct amd_iommu =
*iommu)=0A+    const struct acpi_ivrs_device4 *select, struct amd_iommu =
*iommu)=0A {=0A     u16 bdf;=0A =0A-    bdf =3D ivhd_device->header.dev_id;=
=0A+    bdf =3D select->header.id;=0A     if ( bdf >=3D ivrs_bdf_entries =
)=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry =
Dev_Id 0x%x\n", bdf);=0A         return 0;=0A     }=0A =0A-    add_ivrs_map=
ping_entry(bdf, bdf, ivhd_device->header.flags, iommu);=0A+    add_ivrs_map=
ping_entry(bdf, bdf, select->header.data_setting, iommu);=0A =0A-    =
return sizeof(struct acpi_ivhd_device_header);=0A+    return sizeof(*select=
);=0A }=0A =0A static u16 __init parse_ivhd_device_range(=0A-    union =
acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivhd_device_range =
*range,=0A     u16 header_length, u16 block_length, struct amd_iommu =
*iommu)=0A {=0A     u16 dev_length, first_bdf, last_bdf, bdf;=0A =0A-    =
dev_length =3D sizeof(struct acpi_ivhd_device_range);=0A+    dev_length =
=3D sizeof(*range);=0A     if ( header_length < (block_length + dev_length)=
 )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry =
Length!\n");=0A         return 0;=0A     }=0A =0A-    if ( ivhd_device->ran=
ge.trailer.type !=3D=0A-         AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )=0A+   =
 if ( range->end.header.type !=3D ACPI_IVRS_TYPE_END )=0A     {=0A         =
AMD_IOMMU_DEBUG("IVHD Error: "=0A                         "Invalid Range: =
End_Type 0x%x\n",=0A-                        ivhd_device->range.trailer.typ=
e);=0A+                        range->end.header.type);=0A         return =
0;=0A     }=0A =0A-    first_bdf =3D ivhd_device->header.dev_id;=0A+    =
first_bdf =3D range->start.header.id;=0A     if ( first_bdf >=3D ivrs_bdf_e=
ntries )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: "=0A@@ -432,7 =
+452,7 @@ static u16 __init parse_ivhd_device_rang=0A         return 0;=0A =
    }=0A =0A-    last_bdf =3D ivhd_device->range.trailer.dev_id;=0A+    =
last_bdf =3D range->end.header.id;=0A     if ( (last_bdf >=3D ivrs_bdf_entr=
ies) || (last_bdf <=3D first_bdf) )=0A     {=0A         AMD_IOMMU_DEBUG("IV=
HD Error: "=0A@@ -443,32 +463,33 @@ static u16 __init parse_ivhd_device_ran=
g=0A     AMD_IOMMU_DEBUG(" Dev_Id Range: 0x%x -> 0x%x\n", first_bdf, =
last_bdf);=0A =0A     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ =
)=0A-        add_ivrs_mapping_entry(bdf, bdf, ivhd_device->header.flags, =
iommu);=0A+        add_ivrs_mapping_entry(bdf, bdf, range->start.header.dat=
a_setting,=0A+                               iommu);=0A =0A     return =
dev_length;=0A }=0A =0A static u16 __init parse_ivhd_device_alias(=0A-    =
union acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivrs_device8a=
 *alias,=0A     u16 header_length, u16 block_length, struct amd_iommu =
*iommu)=0A {=0A     u16 dev_length, alias_id, bdf;=0A =0A-    dev_length =
=3D sizeof(struct acpi_ivhd_device_alias);=0A+    dev_length =3D sizeof(*al=
ias);=0A     if ( header_length < (block_length + dev_length) )=0A     =
{=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");=
=0A         return 0;=0A     }=0A =0A-    bdf =3D ivhd_device->header.dev_i=
d;=0A+    bdf =3D alias->header.id;=0A     if ( bdf >=3D ivrs_bdf_entries =
)=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry =
Dev_Id 0x%x\n", bdf);=0A         return 0;=0A     }=0A =0A-    alias_id =
=3D ivhd_device->alias.dev_id;=0A+    alias_id =3D alias->used_id;=0A     =
if ( alias_id >=3D ivrs_bdf_entries )=0A     {=0A         AMD_IOMMU_DEBUG("=
IVHD Error: Invalid Alias Dev_Id 0x%x\n", alias_id);=0A@@ -477,35 +498,34 =
@@ static u16 __init parse_ivhd_device_alia=0A =0A     AMD_IOMMU_DEBUG(" =
Dev_Id Alias: 0x%x\n", alias_id);=0A =0A-    add_ivrs_mapping_entry(bdf, =
alias_id, ivhd_device->header.flags, iommu);=0A+    add_ivrs_mapping_entry(=
bdf, alias_id, alias->header.data_setting, iommu);=0A =0A     return =
dev_length;=0A }=0A =0A static u16 __init parse_ivhd_device_alias_range(=0A=
-    union acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivhd_dev=
ice_alias_range *range,=0A     u16 header_length, u16 block_length, struct =
amd_iommu *iommu)=0A {=0A =0A     u16 dev_length, first_bdf, last_bdf, =
alias_id, bdf;=0A =0A-    dev_length =3D sizeof(struct acpi_ivhd_device_ali=
as_range);=0A+    dev_length =3D sizeof(*range);=0A     if ( header_length =
< (block_length + dev_length) )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD =
Error: Invalid Device_Entry Length!\n");=0A         return 0;=0A     }=0A =
=0A-    if ( ivhd_device->alias_range.trailer.type !=3D=0A-         =
AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )=0A+    if ( range->end.header.type =
!=3D ACPI_IVRS_TYPE_END )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: =
"=0A                         "Invalid Range: End_Type 0x%x\n",=0A-         =
               ivhd_device->alias_range.trailer.type);=0A+                 =
       range->end.header.type);=0A         return 0;=0A     }=0A =0A-    =
first_bdf =3D ivhd_device->header.dev_id;=0A+    first_bdf =3D range->alias=
.header.id;=0A     if ( first_bdf >=3D ivrs_bdf_entries )=0A     {=0A      =
   AMD_IOMMU_DEBUG("IVHD Error: "=0A@@ -513,7 +533,7 @@ static u16 __init =
parse_ivhd_device_alia=0A         return 0;=0A     }=0A =0A-    last_bdf =
=3D ivhd_device->alias_range.trailer.dev_id;=0A+    last_bdf =3D range->end=
.header.id;=0A     if ( last_bdf >=3D ivrs_bdf_entries || last_bdf <=3D =
first_bdf )=0A     {=0A         AMD_IOMMU_DEBUG(=0A@@ -521,7 +541,7 @@ =
static u16 __init parse_ivhd_device_alia=0A         return 0;=0A     }=0A =
=0A-    alias_id =3D ivhd_device->alias_range.alias.dev_id;=0A+    =
alias_id =3D range->alias.used_id;=0A     if ( alias_id >=3D ivrs_bdf_entri=
es )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Alias Dev_Id =
0x%x\n", alias_id);=0A@@ -532,59 +552,59 @@ static u16 __init parse_ivhd_de=
vice_alia=0A     AMD_IOMMU_DEBUG(" Dev_Id Alias: 0x%x\n", alias_id);=0A =
=0A     for ( bdf =3D first_bdf; bdf <=3D last_bdf; bdf++ )=0A-        =
add_ivrs_mapping_entry(bdf, alias_id, ivhd_device->header.flags, iommu);=0A=
+        add_ivrs_mapping_entry(bdf, alias_id, range->alias.header.data_set=
ting,=0A+                               iommu);=0A =0A     return =
dev_length;=0A }=0A =0A static u16 __init parse_ivhd_device_extended(=0A-  =
  union acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivrs_device=
8b *ext,=0A     u16 header_length, u16 block_length, struct amd_iommu =
*iommu)=0A {=0A     u16 dev_length, bdf;=0A =0A-    dev_length =3D =
sizeof(struct acpi_ivhd_device_extended);=0A+    dev_length =3D sizeof(*ext=
);=0A     if ( header_length < (block_length + dev_length) )=0A     {=0A   =
      AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Length!\n");=0A    =
     return 0;=0A     }=0A =0A-    bdf =3D ivhd_device->header.dev_id;=0A+ =
   bdf =3D ext->header.id;=0A     if ( bdf >=3D ivrs_bdf_entries )=0A     =
{=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Device_Entry Dev_Id =
0x%x\n", bdf);=0A         return 0;=0A     }=0A =0A-    add_ivrs_mapping_en=
try(bdf, bdf, ivhd_device->header.flags, iommu);=0A+    add_ivrs_mapping_en=
try(bdf, bdf, ext->header.data_setting, iommu);=0A =0A     return =
dev_length;=0A }=0A =0A static u16 __init parse_ivhd_device_extended_range(=
=0A-    union acpi_ivhd_device *ivhd_device,=0A+    const struct acpi_ivhd_=
device_extended_range *range,=0A     u16 header_length, u16 block_length, =
struct amd_iommu *iommu)=0A {=0A     u16 dev_length, first_bdf, last_bdf, =
bdf;=0A =0A-    dev_length =3D sizeof(struct acpi_ivhd_device_extended_rang=
e);=0A+    dev_length =3D sizeof(*range);=0A     if ( header_length < =
(block_length + dev_length) )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD =
Error: Invalid Device_Entry Length!\n");=0A         return 0;=0A     }=0A =
=0A-    if ( ivhd_device->extended_range.trailer.type !=3D=0A-         =
AMD_IOMMU_ACPI_IVHD_DEV_RANGE_END )=0A+    if ( range->end.header.type =
!=3D ACPI_IVRS_TYPE_END )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: =
"=0A                         "Invalid Range: End_Type 0x%x\n",=0A-         =
               ivhd_device->extended_range.trailer.type);=0A+              =
          range->end.header.type);=0A         return 0;=0A     }=0A =0A-   =
 first_bdf =3D ivhd_device->header.dev_id;=0A+    first_bdf =3D range->exte=
nded.header.id;=0A     if ( first_bdf >=3D ivrs_bdf_entries )=0A     {=0A  =
       AMD_IOMMU_DEBUG("IVHD Error: "=0A@@ -592,7 +612,7 @@ static u16 =
__init parse_ivhd_device_exte=0A         return 0;=0A     }=0A =0A-    =
last_bdf =3D ivhd_device->extended_range.trailer.dev_id;=0A+    last_bdf =
=3D range->end.header.id;=0A     if ( (last_bdf >=3D ivrs_bdf_entries) || =
(last_bdf <=3D first_bdf) )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD =
Error: "=0A@@ -604,116 +624,116 @@ static u16 __init parse_ivhd_device_exte=
=0A                     first_bdf, last_bdf);=0A =0A     for ( bdf =3D =
first_bdf; bdf <=3D last_bdf; bdf++ )=0A-        add_ivrs_mapping_entry(bdf=
, bdf, ivhd_device->header.flags, iommu);=0A+        add_ivrs_mapping_entry=
(bdf, bdf, range->extended.header.data_setting,=0A+                        =
       iommu);=0A =0A     return dev_length;=0A }=0A =0A static u16 __init =
parse_ivhd_device_special(=0A-    union acpi_ivhd_device *ivhd_device, u16 =
seg,=0A+    const struct acpi_ivrs_device8c *special, u16 seg,=0A     u16 =
header_length, u16 block_length, struct amd_iommu *iommu)=0A {=0A     u16 =
dev_length, bdf;=0A =0A-    dev_length =3D sizeof(struct acpi_ivhd_device_s=
pecial);=0A+    dev_length =3D sizeof(*special);=0A     if ( header_length =
< (block_length + dev_length) )=0A     {=0A         AMD_IOMMU_DEBUG("IVHD =
Error: Invalid Device_Entry Length!\n");=0A         return 0;=0A     }=0A =
=0A-    bdf =3D ivhd_device->special.dev_id;=0A+    bdf =3D special->used_i=
d;=0A     if ( bdf >=3D ivrs_bdf_entries )=0A     {=0A         AMD_IOMMU_DE=
BUG("IVHD Error: Invalid Device_Entry Dev_Id 0x%x\n", bdf);=0A         =
return 0;=0A     }=0A =0A-    add_ivrs_mapping_entry(bdf, bdf, ivhd_device-=
>header.flags, iommu);=0A+    add_ivrs_mapping_entry(bdf, bdf, special->hea=
der.data_setting, iommu);=0A     /* set device id of ioapic */=0A-    =
ioapic_sbdf[ivhd_device->special.handle].bdf =3D bdf;=0A-    ioapic_sbdf[iv=
hd_device->special.handle].seg =3D seg;=0A+    ioapic_sbdf[special->handle]=
.bdf =3D bdf;=0A+    ioapic_sbdf[special->handle].seg =3D seg;=0A     =
return dev_length;=0A }=0A =0A-static int __init parse_ivhd_block(struct =
acpi_ivhd_block_header *ivhd_block)=0A+static int __init parse_ivhd_block(c=
onst struct acpi_ivrs_hardware *ivhd_block)=0A {=0A-    union acpi_ivhd_dev=
ice *ivhd_device;=0A+    const union acpi_ivhd_device *ivhd_device;=0A     =
u16 block_length, dev_length;=0A     struct amd_iommu *iommu;=0A =0A-    =
if ( ivhd_block->header.length <=0A-         sizeof(struct acpi_ivhd_block_=
header) )=0A+    if ( ivhd_block->header.length < sizeof(*ivhd_block) )=0A =
    {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Block Length!\n");=0A=
         return -ENODEV;=0A     }=0A =0A-    iommu =3D find_iommu_from_bdf_=
cap(ivhd_block->header.dev_id,=0A-                                    =
ivhd_block->cap_offset);=0A+    iommu =3D find_iommu_from_bdf_cap(ivhd_bloc=
k->header.device_id,=0A+                                    ivhd_block->cap=
ability_offset);=0A     if ( !iommu )=0A     {=0A         AMD_IOMMU_DEBUG("=
IVHD Error: No IOMMU for Dev_Id 0x%x  Cap 0x%x\n",=0A-                     =
   ivhd_block->header.dev_id, ivhd_block->cap_offset);=0A+                 =
       ivhd_block->header.device_id,=0A+                        ivhd_block-=
>capability_offset);=0A         return -ENODEV;=0A     }=0A =0A     /* =
parse Device Entries */=0A-    block_length =3D sizeof(struct acpi_ivhd_blo=
ck_header);=0A+    block_length =3D sizeof(*ivhd_block);=0A     while ( =
ivhd_block->header.length >=3D=0A-            (block_length + sizeof(struct=
 acpi_ivhd_device_header)) )=0A+            (block_length + sizeof(struct =
acpi_ivrs_de_header)) )=0A     {=0A-        ivhd_device =3D (union =
acpi_ivhd_device *)=0A-            ((u8 *)ivhd_block + block_length);=0A+  =
      ivhd_device =3D (const void *)((const u8 *)ivhd_block + block_length)=
;=0A =0A         AMD_IOMMU_DEBUG( "IVHD Device Entry:\n");=0A         =
AMD_IOMMU_DEBUG( " Type 0x%x\n", ivhd_device->header.type);=0A-        =
AMD_IOMMU_DEBUG( " Dev_Id 0x%x\n", ivhd_device->header.dev_id);=0A-        =
AMD_IOMMU_DEBUG( " Flags 0x%x\n", ivhd_device->header.flags);=0A+        =
AMD_IOMMU_DEBUG( " Dev_Id 0x%x\n", ivhd_device->header.id);=0A+        =
AMD_IOMMU_DEBUG( " Flags 0x%x\n", ivhd_device->header.data_setting);=0A =
=0A         switch ( ivhd_device->header.type )=0A         {=0A-        =
case AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD:=0A+        case ACPI_IVRS_TYPE_PAD4:=
=0A             dev_length =3D parse_ivhd_device_padding(=0A               =
  sizeof(u32),=0A                 ivhd_block->header.length, block_length);=
=0A             break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD:=0A+=
        case ACPI_IVRS_TYPE_PAD8:=0A             dev_length =3D parse_ivhd_=
device_padding(=0A                 sizeof(u64),=0A                 =
ivhd_block->header.length, block_length);=0A             break;=0A-        =
case AMD_IOMMU_ACPI_IVHD_DEV_SELECT:=0A-            dev_length =3D =
parse_ivhd_device_select(ivhd_device, iommu);=0A+        case ACPI_IVRS_TYP=
E_SELECT:=0A+            dev_length =3D parse_ivhd_device_select(&ivhd_devi=
ce->select, iommu);=0A             break;=0A-        case AMD_IOMMU_ACPI_IV=
HD_DEV_RANGE_START:=0A+        case ACPI_IVRS_TYPE_START:=0A             =
dev_length =3D parse_ivhd_device_range(=0A-                ivhd_device,=0A+=
                &ivhd_device->range,=0A                 ivhd_block->header.=
length, block_length, iommu);=0A             break;=0A-        case =
AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT:=0A+        case ACPI_IVRS_TYPE_ALIAS_=
SELECT:=0A             dev_length =3D parse_ivhd_device_alias(=0A-         =
       ivhd_device,=0A+                &ivhd_device->alias,=0A             =
    ivhd_block->header.length, block_length, iommu);=0A             =
break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE:=0A+        =
case ACPI_IVRS_TYPE_ALIAS_START:=0A             dev_length =3D parse_ivhd_d=
evice_alias_range(=0A-                ivhd_device,=0A+                =
&ivhd_device->alias_range,=0A                 ivhd_block->header.length, =
block_length, iommu);=0A             break;=0A-        case AMD_IOMMU_ACPI_=
IVHD_DEV_EXT_SELECT:=0A+        case ACPI_IVRS_TYPE_EXT_SELECT:=0A         =
    dev_length =3D parse_ivhd_device_extended(=0A-                =
ivhd_device,=0A+                &ivhd_device->extended,=0A                 =
ivhd_block->header.length, block_length, iommu);=0A             break;=0A- =
       case AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE:=0A+        case ACPI_IVRS_TY=
PE_EXT_START:=0A             dev_length =3D parse_ivhd_device_extended_rang=
e(=0A-                ivhd_device,=0A+                &ivhd_device->extende=
d_range,=0A                 ivhd_block->header.length, block_length, =
iommu);=0A             break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_SPECI=
AL:=0A+        case ACPI_IVRS_TYPE_SPECIAL:=0A             dev_length =3D =
parse_ivhd_device_special(=0A-                ivhd_device, ivhd_block->pci_=
segment,=0A+                &ivhd_device->special, ivhd_block->pci_segment_=
group,=0A                 ivhd_block->header.length, block_length, =
iommu);=0A             break;=0A         default:=0A@@ -730,22 +750,24 @@ =
static int __init parse_ivhd_block(struc=0A     return 0;=0A }=0A =
=0A-static int __init parse_ivrs_block(struct acpi_ivrs_block_header =
*ivrs_block)=0A+static int __init parse_ivrs_block(const struct acpi_ivrs_h=
eader *ivrs_block)=0A {=0A-    struct acpi_ivhd_block_header *ivhd_block;=
=0A-    struct acpi_ivmd_block_header *ivmd_block;=0A+    const struct =
acpi_ivrs_hardware *ivhd_block;=0A+    const struct acpi_ivrs_memory =
*ivmd_block;=0A =0A     switch ( ivrs_block->type )=0A     {=0A-    case =
AMD_IOMMU_ACPI_IVHD_TYPE:=0A-        ivhd_block =3D (struct acpi_ivhd_block=
_header *)ivrs_block;=0A+    case ACPI_IVRS_TYPE_HARDWARE:=0A+        =
ivhd_block =3D container_of(ivrs_block, const struct acpi_ivrs_hardware,=0A=
+                                  header);=0A         return parse_ivhd_bl=
ock(ivhd_block);=0A =0A-    case AMD_IOMMU_ACPI_IVMD_ALL_TYPE:=0A-    case =
AMD_IOMMU_ACPI_IVMD_ONE_TYPE:=0A-    case AMD_IOMMU_ACPI_IVMD_RANGE_TYPE:=
=0A-    case AMD_IOMMU_ACPI_IVMD_IOMMU_TYPE:=0A-        ivmd_block =3D =
(struct acpi_ivmd_block_header *)ivrs_block;=0A+    case ACPI_IVRS_TYPE_MEM=
ORY_ALL:=0A+    case ACPI_IVRS_TYPE_MEMORY_ONE:=0A+    case ACPI_IVRS_TYPE_=
MEMORY_RANGE:=0A+    case ACPI_IVRS_TYPE_MEMORY_IOMMU:=0A+        =
ivmd_block =3D container_of(ivrs_block, const struct acpi_ivrs_memory,=0A+ =
                                 header);=0A         return parse_ivmd_bloc=
k(ivmd_block);=0A =0A     default:=0A@@ -792,12 +814,11 @@ static void =
__init dump_acpi_table_heade=0A =0A }=0A =0A-static int __init parse_ivrs_t=
able(struct acpi_table_header *_table)=0A+static int __init parse_ivrs_tabl=
e(struct acpi_table_header *table)=0A {=0A-    struct acpi_ivrs_block_heade=
r *ivrs_block;=0A+    const struct acpi_ivrs_header *ivrs_block;=0A     =
unsigned long length;=0A     int error =3D 0;=0A-    struct acpi_table_head=
er *table =3D (struct acpi_table_header *)_table;=0A =0A     BUG_ON(!table)=
;=0A =0A@@ -805,17 +826,16 @@ static int __init parse_ivrs_table(struc=0A  =
       dump_acpi_table_header(table);=0A =0A     /* parse IVRS blocks =
*/=0A-    length =3D sizeof(struct acpi_ivrs_table_header);=0A+    length =
=3D sizeof(struct acpi_table_ivrs);=0A     while ( (error =3D=3D 0) && =
(table->length > (length + sizeof(*ivrs_block))) )=0A     {=0A-        =
ivrs_block =3D (struct acpi_ivrs_block_header *)=0A-            ((u8 =
*)table + length);=0A+        ivrs_block =3D (struct acpi_ivrs_header =
*)((u8 *)table + length);=0A =0A         AMD_IOMMU_DEBUG("IVRS Block:\n");=
=0A         AMD_IOMMU_DEBUG(" Type 0x%x\n", ivrs_block->type);=0A         =
AMD_IOMMU_DEBUG(" Flags 0x%x\n", ivrs_block->flags);=0A         AMD_IOMMU_D=
EBUG(" Length 0x%x\n", ivrs_block->length);=0A-        AMD_IOMMU_DEBUG(" =
Dev_Id 0x%x\n", ivrs_block->dev_id);=0A+        AMD_IOMMU_DEBUG(" Dev_Id =
0x%x\n", ivrs_block->device_id);=0A =0A         if ( table->length < =
(length + ivrs_block->length) )=0A         {=0A@@ -833,12 +853,11 @@ =
static int __init parse_ivrs_table(struc=0A     return error;=0A }=0A =
=0A-static int __init detect_iommu_acpi(struct acpi_table_header =
*_table)=0A+static int __init detect_iommu_acpi(struct acpi_table_header =
*table)=0A {=0A-    struct acpi_ivrs_block_header *ivrs_block;=0A-    =
struct acpi_table_header *table =3D (struct acpi_table_header *)_table;=0A+=
    const struct acpi_ivrs_header *ivrs_block;=0A     unsigned long i;=0A- =
   unsigned long length =3D sizeof(struct acpi_ivrs_table_header);=0A+    =
unsigned long length =3D sizeof(struct acpi_table_ivrs);=0A     u8 =
checksum, *raw_table;=0A =0A     /* validate checksum: sum of entire table =
=3D=3D 0 */=0A@@ -854,12 +873,14 @@ static int __init detect_iommu_acpi(str=
u=0A =0A     while ( table->length > (length + sizeof(*ivrs_block)) )=0A   =
  {=0A-        ivrs_block =3D (struct acpi_ivrs_block_header *) ((u8 =
*)table + length);=0A+        ivrs_block =3D (struct acpi_ivrs_header =
*)((u8 *)table + length);=0A         if ( table->length < (length + =
ivrs_block->length) )=0A             return -ENODEV;=0A-        if ( =
ivrs_block->type =3D=3D AMD_IOMMU_ACPI_IVHD_TYPE )=0A-            if ( =
amd_iommu_detect_one_acpi((void*)ivrs_block) !=3D 0 )=0A-                =
return -ENODEV;=0A+        if ( ivrs_block->type =3D=3D ACPI_IVRS_TYPE_HARD=
WARE &&=0A+             amd_iommu_detect_one_acpi(=0A+                 =
container_of(ivrs_block, const struct acpi_ivrs_hardware,=0A+              =
                header)) !=3D 0 )=0A+            return -ENODEV;=0A        =
 length +=3D ivrs_block->length;=0A     }=0A     return 0;=0A@@ -870,63 =
+891,59 @@ static int __init detect_iommu_acpi(stru=0A        last_bdf =3D =
(x); \=0A    } while(0);=0A =0A-static int __init get_last_bdf_ivhd(void =
*ivhd)=0A+static int __init get_last_bdf_ivhd(=0A+    const struct =
acpi_ivrs_hardware *ivhd_block)=0A {=0A-    union acpi_ivhd_device =
*ivhd_device;=0A+    const union acpi_ivhd_device *ivhd_device;=0A     u16 =
block_length, dev_length;=0A-    struct acpi_ivhd_block_header *ivhd_block;=
=0A-=0A-    ivhd_block =3D (struct acpi_ivhd_block_header *)ivhd;=0A =0A-  =
  if ( ivhd_block->header.length <=0A-         sizeof(struct acpi_ivhd_bloc=
k_header) )=0A+    if ( ivhd_block->header.length < sizeof(*ivhd_block) =
)=0A     {=0A         AMD_IOMMU_DEBUG("IVHD Error: Invalid Block Length!\n"=
);=0A         return -ENODEV;=0A     }=0A =0A-    block_length =3D =
sizeof(struct acpi_ivhd_block_header);=0A+    block_length =3D sizeof(*ivhd=
_block);=0A     while ( ivhd_block->header.length >=3D=0A-            =
(block_length + sizeof(struct acpi_ivhd_device_header)) )=0A+            =
(block_length + sizeof(struct acpi_ivrs_de_header)) )=0A     {=0A-        =
ivhd_device =3D (union acpi_ivhd_device *)=0A-            ((u8 *)ivhd_block=
 + block_length);=0A+        ivhd_device =3D (const void *)((u8 *)ivhd_bloc=
k + block_length);=0A =0A         switch ( ivhd_device->header.type )=0A   =
      {=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_U32_PAD:=0A+        case =
ACPI_IVRS_TYPE_PAD4:=0A             dev_length =3D sizeof(u32);=0A         =
    break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD:=0A+        =
case ACPI_IVRS_TYPE_PAD8:=0A             dev_length =3D sizeof(u64);=0A    =
         break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_SELECT:=0A-        =
    UPDATE_LAST_BDF(ivhd_device->header.dev_id);=0A-            dev_length =
=3D sizeof(struct acpi_ivhd_device_header);=0A-            break;=0A-      =
  case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_SELECT:=0A-            UPDATE_LAST_BDF=
(ivhd_device->header.dev_id);=0A-            dev_length =3D sizeof(struct =
acpi_ivhd_device_alias);=0A-            break;=0A-        case AMD_IOMMU_AC=
PI_IVHD_DEV_EXT_SELECT:=0A-            UPDATE_LAST_BDF(ivhd_device->header.=
dev_id);=0A-            dev_length =3D sizeof(struct acpi_ivhd_device_exten=
ded);=0A-            break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_RANGE_S=
TART:=0A-            UPDATE_LAST_BDF(ivhd_device->range.trailer.dev_id);=0A=
-            dev_length =3D sizeof(struct acpi_ivhd_device_range);=0A-     =
       break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE:=0A-     =
       UPDATE_LAST_BDF(ivhd_device->alias_range.trailer.dev_id)=0A-        =
    dev_length =3D sizeof(struct acpi_ivhd_device_alias_range);=0A-        =
    break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_EXT_RANGE:=0A-          =
  UPDATE_LAST_BDF(ivhd_device->extended_range.trailer.dev_id)=0A-          =
  dev_length =3D sizeof(struct acpi_ivhd_device_extended_range);=0A-       =
     break;=0A-        case AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL:=0A-           =
 UPDATE_LAST_BDF(ivhd_device->special.dev_id)=0A-            dev_length =
=3D sizeof(struct acpi_ivhd_device_special);=0A+        case ACPI_IVRS_TYPE=
_SELECT:=0A+            UPDATE_LAST_BDF(ivhd_device->select.header.id);=0A+=
            dev_length =3D sizeof(ivhd_device->header);=0A+            =
break;=0A+        case ACPI_IVRS_TYPE_ALIAS_SELECT:=0A+            =
UPDATE_LAST_BDF(ivhd_device->alias.header.id);=0A+            dev_length =
=3D sizeof(ivhd_device->alias);=0A+            break;=0A+        case =
ACPI_IVRS_TYPE_EXT_SELECT:=0A+            UPDATE_LAST_BDF(ivhd_device->exte=
nded.header.id);=0A+            dev_length =3D sizeof(ivhd_device->extended=
);=0A+            break;=0A+        case ACPI_IVRS_TYPE_START:=0A+         =
   UPDATE_LAST_BDF(ivhd_device->range.end.header.id);=0A+            =
dev_length =3D sizeof(ivhd_device->range);=0A+            break;=0A+       =
 case ACPI_IVRS_TYPE_ALIAS_START:=0A+            UPDATE_LAST_BDF(ivhd_devic=
e->alias_range.end.header.id)=0A+            dev_length =3D sizeof(ivhd_dev=
ice->alias_range);=0A+            break;=0A+        case ACPI_IVRS_TYPE_EXT=
_START:=0A+            UPDATE_LAST_BDF(ivhd_device->extended_range.end.head=
er.id)=0A+            dev_length =3D sizeof(ivhd_device->extended_range);=
=0A+            break;=0A+        case ACPI_IVRS_TYPE_SPECIAL:=0A+         =
   UPDATE_LAST_BDF(ivhd_device->special.used_id)=0A+            dev_length =
=3D sizeof(ivhd_device->special);=0A             break;=0A         =
default:=0A             AMD_IOMMU_DEBUG("IVHD Error: Invalid Device =
Type!\n");=0A@@ -942,20 +959,21 @@ static int __init get_last_bdf_ivhd(void=
=0A     return 0;=0A }=0A =0A-static int __init get_last_bdf_acpi(struct =
acpi_table_header *_table)=0A+static int __init get_last_bdf_acpi(struct =
acpi_table_header *table)=0A {=0A-    struct acpi_ivrs_block_header =
*ivrs_block;=0A-    struct acpi_table_header *table =3D (struct acpi_table_=
header *)_table;=0A-    unsigned long length =3D sizeof(struct acpi_ivrs_ta=
ble_header);=0A+    const struct acpi_ivrs_header *ivrs_block;=0A+    =
unsigned long length =3D sizeof(struct acpi_table_ivrs);=0A =0A     while =
( table->length > (length + sizeof(*ivrs_block)) )=0A     {=0A-        =
ivrs_block =3D (struct acpi_ivrs_block_header *) ((u8 *)table + length);=0A=
+        ivrs_block =3D (struct acpi_ivrs_header *)((u8 *)table + =
length);=0A         if ( table->length < (length + ivrs_block->length) =
)=0A             return -ENODEV;=0A-        if ( ivrs_block->type =3D=3D =
AMD_IOMMU_ACPI_IVHD_TYPE )=0A-            if ( get_last_bdf_ivhd((void*)ivr=
s_block) !=3D 0 )=0A-                return -ENODEV;=0A+        if ( =
ivrs_block->type =3D=3D ACPI_IVRS_TYPE_HARDWARE &&=0A+             =
get_last_bdf_ivhd(=0A+                 container_of(ivrs_block, const =
struct acpi_ivrs_hardware,=0A+                              header)) !=3D =
0 )=0A+            return -ENODEV;=0A         length +=3D ivrs_block->lengt=
h;=0A     }=0A    return 0;=0A@@ -963,16 +981,16 @@ static int __init =
get_last_bdf_acpi(stru=0A =0A int __init amd_iommu_detect_acpi(void)=0A =
{=0A-    return acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, detect_iommu_acpi=
);=0A+    return acpi_table_parse(ACPI_SIG_IVRS, detect_iommu_acpi);=0A =
}=0A =0A int __init amd_iommu_get_ivrs_dev_entries(void)=0A {=0A-    =
acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, get_last_bdf_acpi);=0A+    =
acpi_table_parse(ACPI_SIG_IVRS, get_last_bdf_acpi);=0A     return last_bdf =
+ 1;=0A }=0A =0A int __init amd_iommu_update_ivrs_mapping_acpi(void)=0A =
{=0A-    return acpi_table_parse(AMD_IOMMU_ACPI_IVRS_SIG, parse_ivrs_table)=
;=0A+    return acpi_table_parse(ACPI_SIG_IVRS, parse_ivrs_table);=0A =
}=0A--- a/xen/drivers/passthrough/amd/iommu_detect.c=0A+++ b/xen/drivers/pa=
ssthrough/amd/iommu_detect.c=0A@@ -20,12 +20,12 @@=0A =0A #include =
<xen/config.h>=0A #include <xen/errno.h>=0A+#include <xen/acpi.h>=0A =
#include <xen/iommu.h>=0A #include <xen/pci.h>=0A #include <xen/pci_regs.h>=
=0A #include <asm/amd-iommu.h>=0A #include <asm/hvm/svm/amd-iommu-proto.h>=
=0A-#include <asm/hvm/svm/amd-iommu-acpi.h>=0A =0A static int __init =
get_iommu_msi_capabilities(=0A     u16 seg, u8 bus, u8 dev, u8 func, =
struct amd_iommu *iommu)=0A@@ -103,23 +103,21 @@ void __init get_iommu_feat=
ures(struct am=0A     }=0A }=0A =0A-int __init amd_iommu_detect_one_acpi(vo=
id *ivhd)=0A+int __init amd_iommu_detect_one_acpi(=0A+    const struct =
acpi_ivrs_hardware *ivhd_block)=0A {=0A     struct amd_iommu *iommu;=0A    =
 u8 bus, dev, func;=0A-    struct acpi_ivhd_block_header *ivhd_block;=0A   =
  int rt =3D 0;=0A =0A-    ivhd_block =3D (struct acpi_ivhd_block_header =
*)ivhd;=0A-=0A-    if ( ivhd_block->header.length < sizeof(struct =
acpi_ivhd_block_header) )=0A+    if ( ivhd_block->header.length < =
sizeof(*ivhd_block) )=0A     {=0A         AMD_IOMMU_DEBUG("Invalid IVHD =
Block Length!\n");=0A         return -ENODEV;=0A     }=0A =0A-    if ( =
!ivhd_block->header.dev_id ||=0A-        !ivhd_block->cap_offset || =
!ivhd_block->mmio_base)=0A+    if ( !ivhd_block->header.device_id ||=0A+   =
     !ivhd_block->capability_offset || !ivhd_block->base_address)=0A     =
{=0A         AMD_IOMMU_DEBUG("Invalid IVHD Block!\n");=0A         return =
-ENODEV;=0A@@ -134,10 +132,10 @@ int __init amd_iommu_detect_one_acpi(voi=
=0A =0A     spin_lock_init(&iommu->lock);=0A =0A-    iommu->seg =3D =
ivhd_block->pci_segment;=0A-    iommu->bdf =3D ivhd_block->header.dev_id;=
=0A-    iommu->cap_offset =3D ivhd_block->cap_offset;=0A-    iommu->mmio_ba=
se_phys =3D ivhd_block->mmio_base;=0A+    iommu->seg =3D ivhd_block->pci_se=
gment_group;=0A+    iommu->bdf =3D ivhd_block->header.device_id;=0A+    =
iommu->cap_offset =3D ivhd_block->capability_offset;=0A+    iommu->mmio_bas=
e_phys =3D ivhd_block->base_address;=0A =0A     /* override IOMMU HT flags =
*/=0A     iommu->ht_flags =3D ivhd_block->header.flags;=0A--- a/xen/drivers=
/passthrough/amd/iommu_init.c=0A+++ b/xen/drivers/passthrough/amd/iommu_ini=
t.c=0A@@ -20,6 +20,7 @@=0A =0A #include <xen/config.h>=0A #include =
<xen/errno.h>=0A+#include <xen/acpi.h>=0A #include <xen/pci.h>=0A #include =
<xen/pci_regs.h>=0A #include <xen/irq.h>=0A@@ -28,7 +29,6 @@=0A #include =
<asm/hvm/svm/amd-iommu-proto.h>=0A #include <asm-x86/fixmap.h>=0A #include =
<mach_apic.h>=0A-#include <asm/hvm/svm/amd-iommu-acpi.h>=0A =0A static int =
__initdata nr_amd_iommus;=0A =0A@@ -37,9 +37,8 @@ static struct radix_tree_=
root ivrs_maps;=0A struct list_head amd_iommu_head;=0A struct table_struct =
device_table;=0A =0A-static int iommu_has_ht_flag(struct amd_iommu *iommu, =
uint8_t bit)=0A+static int iommu_has_ht_flag(struct amd_iommu *iommu, u8 =
mask)=0A {=0A-    u8 mask =3D 1U << bit;=0A     return iommu->ht_flags & =
mask;=0A }=0A =0A@@ -80,19 +79,19 @@ static void set_iommu_ht_flags(struct =
am=0A =0A     /* Setup HT flags */=0A     if ( iommu_has_cap(iommu, =
PCI_CAP_HT_TUNNEL_SHIFT) )=0A-        iommu_has_ht_flag(iommu, AMD_IOMMU_AC=
PI_HT_TUN_ENB_SHIFT) ?=0A+        iommu_has_ht_flag(iommu, ACPI_IVHD_TT_ENA=
BLE) ?=0A             iommu_set_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLA=
TION_SHIFT) :=0A             iommu_clear_bit(&entry, IOMMU_CONTROL_HT_TUNNE=
L_TRANSLATION_SHIFT);=0A =0A-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_RE=
S_PASS_PW_SHIFT) ?=0A+    iommu_has_ht_flag(iommu, ACPI_IVHD_RES_PASS_PW) =
?=0A         iommu_set_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHI=
FT):=0A         iommu_clear_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRIT=
E_SHIFT);=0A =0A-    iommu_has_ht_flag(iommu, AMD_IOMMU_ACPI_ISOC_SHIFT) =
?=0A+    iommu_has_ht_flag(iommu, ACPI_IVHD_ISOC) ?=0A         iommu_set_bi=
t(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT):=0A         iommu_clear_bit(&ent=
ry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT);=0A =0A-    iommu_has_ht_flag(iommu, =
AMD_IOMMU_ACPI_PASS_PW_SHIFT) ?=0A+    iommu_has_ht_flag(iommu, ACPI_IVHD_P=
ASS_PW) ?=0A         iommu_set_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_=
SHIFT):=0A         iommu_clear_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_=
SHIFT);=0A =0A--- a/xen/drivers/passthrough/amd/iommu_map.c=0A+++ =
b/xen/drivers/passthrough/amd/iommu_map.c=0A@@ -18,12 +18,13 @@=0A  * =
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 =
USA=0A  */=0A =0A+#include <xen/config.h>=0A+#include <xen/acpi.h>=0A =
#include <xen/sched.h>=0A #include <asm/p2m.h>=0A #include <xen/hvm/iommu.h=
>=0A #include <asm/amd-iommu.h>=0A #include <asm/hvm/svm/amd-iommu-proto.h>=
=0A-#include <asm/hvm/svm/amd-iommu-acpi.h>=0A #include "../ats.h"=0A =
#include <xen/pci.h>=0A =0A@@ -215,8 +216,7 @@ void __init iommu_dte_add_de=
vice_entry(u=0A     dte[7] =3D dte[6] =3D dte[4] =3D dte[2] =3D dte[1] =3D =
dte[0] =3D 0;=0A =0A     flags =3D ivrs_dev->device_flags;=0A-    sys_mgt =
=3D get_field_from_byte(flags, AMD_IOMMU_ACPI_SYS_MGT_MASK,=0A-            =
                      AMD_IOMMU_ACPI_SYS_MGT_SHIFT);=0A+    sys_mgt =3D =
get_field_from_byte(flags, ACPI_IVHD_SYSTEM_MGMT);=0A     dev_ex =3D =
ivrs_dev->dte_allow_exclusion;=0A =0A     flags &=3D mask;=0A--- a/xen/incl=
ude/asm-x86/hvm/svm/amd-iommu-acpi.h=0A+++ /dev/null=0A@@ -1,185 +0,0 =
@@=0A-/*=0A- * Copyright (C) 2007 Advanced Micro Devices, Inc.=0A- * =
Author: Leo Duran <leo.duran@amd.com>=0A- * Author: Wei Wang <wei.wang2@amd=
.com> - adapted to xen=0A- *=0A- * This program is free software; you can =
redistribute it and/or modify=0A- * it under the terms of the GNU General =
Public License as published by=0A- * the Free Software Foundation; either =
version 2 of the License, or=0A- * (at your option) any later version.=0A- =
*=0A- * This program is distributed in the hope that it will be useful,=0A-=
 * but WITHOUT ANY WARRANTY; without even the implied warranty of=0A- * =
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the=0A- * GNU =
General Public License for more details.=0A- *=0A- * You should have =
received a copy of the GNU General Public License=0A- * along with this =
program; if not, write to the Free Software=0A- * Foundation, Inc., 59 =
Temple Place, Suite 330, Boston, MA  02111-1307 USA=0A- */=0A-=0A-#ifndef =
_ASM_X86_64_AMD_IOMMU_ACPI_H=0A-#define _ASM_X86_64_AMD_IOMMU_ACPI_H=0A-=0A=
-#include <xen/acpi.h>=0A-=0A-/* I/O Virtualization Reporting Structure =
*/=0A-#define AMD_IOMMU_ACPI_IVRS_SIG            "IVRS"=0A-#define =
AMD_IOMMU_ACPI_IVHD_TYPE       0x10=0A-#define AMD_IOMMU_ACPI_IVMD_ALL_TYPE=
       0x20=0A-#define AMD_IOMMU_ACPI_IVMD_ONE_TYPE       0x21=0A-#define =
AMD_IOMMU_ACPI_IVMD_RANGE_TYPE     0x22=0A-#define AMD_IOMMU_ACPI_IVMD_IOMM=
U_TYPE     0x23=0A-=0A-/* 4-byte Device Entries */=0A-#define AMD_IOMMU_ACP=
I_IVHD_DEV_U32_PAD        0=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_SELECT     =
2=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_RANGE_START    3=0A-#define AMD_IOMMU_=
ACPI_IVHD_DEV_RANGE_END  4=0A-=0A-/* 8-byte Device Entries */=0A-#define =
AMD_IOMMU_ACPI_IVHD_DEV_U64_PAD        64=0A-#define AMD_IOMMU_ACPI_IVHD_DE=
V_ALIAS_SELECT   66=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_ALIAS_RANGE    =
67=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_EXT_SELECT 70=0A-#define AMD_IOMMU_AC=
PI_IVHD_DEV_EXT_RANGE  71=0A-#define AMD_IOMMU_ACPI_IVHD_DEV_SPECIAL    =
72=0A-=0A-/* IVHD IOMMU Flags */=0A-#define AMD_IOMMU_ACPI_COHERENT_MASK   =
    0x20=0A-#define AMD_IOMMU_ACPI_COHERENT_SHIFT      5=0A-#define =
AMD_IOMMU_ACPI_IOTLB_SUP_MASK      0x10=0A-#define AMD_IOMMU_ACPI_IOTLB_SUP=
_SHIFT     4=0A-#define AMD_IOMMU_ACPI_ISOC_MASK       0x08=0A-#define =
AMD_IOMMU_ACPI_ISOC_SHIFT      3=0A-#define AMD_IOMMU_ACPI_RES_PASS_PW_MASK=
        0x04=0A-#define AMD_IOMMU_ACPI_RES_PASS_PW_SHIFT   2=0A-#define =
AMD_IOMMU_ACPI_PASS_PW_MASK        0x02=0A-#define AMD_IOMMU_ACPI_PASS_PW_S=
HIFT       1=0A-#define AMD_IOMMU_ACPI_HT_TUN_ENB_MASK     0x01=0A-#define =
AMD_IOMMU_ACPI_HT_TUN_ENB_SHIFT        0=0A-=0A-/* IVHD Device Flags =
*/=0A-#define AMD_IOMMU_ACPI_LINT1_PASS_MASK     0x80=0A-#define AMD_IOMMU_=
ACPI_LINT1_PASS_SHIFT        7=0A-#define AMD_IOMMU_ACPI_LINT0_PASS_MASK   =
  0x40=0A-#define AMD_IOMMU_ACPI_LINT0_PASS_SHIFT        6=0A-#define =
AMD_IOMMU_ACPI_SYS_MGT_MASK        0x30=0A-#define AMD_IOMMU_ACPI_SYS_MGT_S=
HIFT       4=0A-#define AMD_IOMMU_ACPI_NMI_PASS_MASK       0x04=0A-#define =
AMD_IOMMU_ACPI_NMI_PASS_SHIFT      2=0A-#define AMD_IOMMU_ACPI_EINT_PASS_MA=
SK      0x02=0A-#define AMD_IOMMU_ACPI_EINT_PASS_SHIFT     1=0A-#define =
AMD_IOMMU_ACPI_INIT_PASS_MASK      0x01=0A-#define AMD_IOMMU_ACPI_INIT_PASS=
_SHIFT     0=0A-=0A-/* IVHD Device Extended Flags */=0A-#define AMD_IOMMU_A=
CPI_ATS_DISABLED_MASK   0x80000000=0A-#define AMD_IOMMU_ACPI_ATS_DISABLED_S=
HIFT  31=0A-=0A-/* IVMD Device Flags */=0A-#define AMD_IOMMU_ACPI_EXCLUSION=
_RANGE_MASK    0x08=0A-#define AMD_IOMMU_ACPI_EXCLUSION_RANGE_SHIFT   =
3=0A-#define AMD_IOMMU_ACPI_IW_PERMISSION_MASK  0x04=0A-#define AMD_IOMMU_A=
CPI_IW_PERMISSION_SHIFT 2=0A-#define AMD_IOMMU_ACPI_IR_PERMISSION_MASK  =
0x02=0A-#define AMD_IOMMU_ACPI_IR_PERMISSION_SHIFT 1=0A-#define AMD_IOMMU_A=
CPI_UNITY_MAPPING_MASK  0x01=0A-#define AMD_IOMMU_ACPI_UNITY_MAPPING_SHIFT =
0=0A-=0A-#define ACPI_OEM_ID_SIZE                6=0A-#define ACPI_OEM_TABL=
E_ID_SIZE          8=0A-=0A-#pragma pack(1)=0A-struct acpi_ivrs_table_heade=
r {=0A-   struct acpi_table_header acpi_header;=0A-   u32 io_info;=0A-   =
u8  reserved[8];=0A-};=0A-=0A-struct acpi_ivrs_block_header {=0A-   u8  =
type;=0A-   u8  flags;=0A-   u16 length;=0A-   u16 dev_id;=0A-};=0A-=0A-str=
uct acpi_ivhd_block_header {=0A-   struct acpi_ivrs_block_header header;=0A=
-   u16 cap_offset;=0A-   u64 mmio_base;=0A-   u16 pci_segment;=0A-   u16 =
iommu_info;=0A-   u8 reserved[4];=0A-};=0A-=0A-struct acpi_ivhd_device_head=
er {=0A-   u8  type;=0A-   u16 dev_id;=0A-   u8  flags;=0A-};=0A-=0A-struct=
 acpi_ivhd_device_trailer {=0A-   u8  type;=0A-   u16 dev_id;=0A-   u8  =
reserved;=0A-};=0A-=0A-struct acpi_ivhd_device_range {=0A-   struct =
acpi_ivhd_device_header header;=0A-   struct acpi_ivhd_device_trailer =
trailer;=0A-};=0A-=0A-struct acpi_ivhd_device_alias {=0A-   struct =
acpi_ivhd_device_header header;=0A-   u8  reserved1;=0A-   u16 dev_id;=0A- =
  u8  reserved2;=0A-};=0A-=0A-struct acpi_ivhd_device_alias_range {=0A-   =
struct acpi_ivhd_device_alias alias;=0A-   struct acpi_ivhd_device_trailer =
trailer;=0A-};=0A-=0A-struct acpi_ivhd_device_extended {=0A-   struct =
acpi_ivhd_device_header header;=0A-   u32 ext_flags;=0A-};=0A-=0A-struct =
acpi_ivhd_device_extended_range {=0A-   struct acpi_ivhd_device_extended =
extended;=0A-   struct acpi_ivhd_device_trailer trailer;=0A-};=0A-=0A-struc=
t acpi_ivhd_device_special {=0A-   struct acpi_ivhd_device_header =
header;=0A-   u8  handle;=0A-   u16 dev_id;=0A-   u8  variety;=0A-};=0A-=0A=
-union acpi_ivhd_device {=0A-   struct acpi_ivhd_device_header header;=0A- =
  struct acpi_ivhd_device_range range;=0A-   struct acpi_ivhd_device_alias =
alias;=0A-   struct acpi_ivhd_device_alias_range alias_range;=0A-   struct =
acpi_ivhd_device_extended extended;=0A-   struct acpi_ivhd_device_extended_=
range extended_range;=0A-   struct acpi_ivhd_device_special special;=0A-};=
=0A-=0A-struct acpi_ivmd_block_header {=0A-   struct acpi_ivrs_block_header=
 header;=0A-   union {=0A-       u16 last_dev_id;=0A-       u16 cap_offset;=
=0A-       u16 reserved1;=0A-   };=0A-   u64 reserved2;=0A-   u64 =
start_addr;=0A-   u64 mem_length;=0A-};=0A-#pragma pack()=0A-=0A-#endif /* =
_ASM_X86_64_AMD_IOMMU_ACPI_H */=0A--- a/xen/include/asm-x86/hvm/svm/amd-iom=
mu-proto.h=0A+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h=0A@@ =
-26,6 +26,8 @@=0A #include <asm/apicdef.h>=0A #include <xen/domain_page.h>=
=0A =0A+struct acpi_ivrs_hardware;=0A+=0A #define for_each_amd_iommu(amd_io=
mmu) \=0A     list_for_each_entry(amd_iommu, \=0A         &amd_iommu_head, =
list)=0A@@ -41,7 +43,7 @@=0A =0A /* amd-iommu-detect functions */=0A int =
amd_iommu_get_ivrs_dev_entries(void);=0A-int amd_iommu_detect_one_acpi(void=
 *ivhd);=0A+int amd_iommu_detect_one_acpi(const struct acpi_ivrs_hardware =
*);=0A int amd_iommu_detect_acpi(void);=0A void get_iommu_features(struct =
amd_iommu *iommu);=0A =0A@@ -121,11 +123,9 @@ static inline u32 set_field_i=
n_reg_u32(u=0A     return reg_value;=0A }=0A =0A-static inline u8 =
get_field_from_byte(u8 value, u8 mask, u8 shift)=0A+static inline u8 =
get_field_from_byte(u8 value, u8 mask)=0A {=0A-    u8 field;=0A-    field =
=3D (value & mask) >> shift;=0A-    return field;=0A+    return (value & =
mask) / (mask & -mask);=0A }=0A =0A static inline unsigned long region_to_p=
ages(unsigned long addr, unsigned long size)=0A
--=__Part456AE0A2.0__=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--=__Part456AE0A2.0__=--


From xen-devel-bounces@lists.xensource.com Thu Dec 15 16:29:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Thu, 15 Dec 2011 16:29:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RbEBT-0002G1-71; Thu, 15 Dec 2011 16:29:27 +0000
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <Stefano.Stabellini@eu.citrix.com>)
	id 1RbEBQ-000263-LU
	for xen-devel@lists.xensource.com; Thu, 15 Dec 2011 16:29:25 +0000
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1323966500!60916191!2
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAxMDY5Mjg=\n
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17608 invoked from network); 15 Dec 2011 16:28:23 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2011 16:28:23 -0000
X-IronPort-AV: E=Sophos;i="4.71,357,1320642000"; d="scan'208";a="20001868"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Dec 2011 11:29:16 -0500
Received: from smtp01.ad.xensource.com (10.219.128.104) by
	smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id
	8.3.213.0; Thu, 15 Dec 2011 11:29:02 -0500
Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id pBFGSMtX003330;
	Thu, 15 Dec 2011 08:28:45 -0800
From: <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Thu, 15 Dec 2011 16:30:41 +0000
Message-ID: <1323966657-19790-9-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <alpine.DEB.2.00.1112131831560.3517@kaball-desktop>
References: <alpine.DEB.2.00.1112131831560.3517@kaball-desktop>
MIME-Version: 1.0
Cc: keir.xen@gmail.com, Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>, JBeulich@suse.com,
	Tim.Deegan@citrix.com
Subject: [Xen-devel] [PATCH v3 09/25] arm: header files
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

A simple implementation of everything under asm-arm and arch-arm.h; some
of these files are shamelessly taken from Linux.


Changes in v2:

- remove div64.


Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
---
 xen/include/asm-arm/atomic.h      |  212 +++++++++++++++++++++++++++++
 xen/include/asm-arm/bitops.h      |  195 +++++++++++++++++++++++++++
 xen/include/asm-arm/bug.h         |   15 ++
 xen/include/asm-arm/byteorder.h   |   16 +++
 xen/include/asm-arm/cache.h       |   20 +++
 xen/include/asm-arm/config.h      |  122 +++++++++++++++++
 xen/include/asm-arm/cpregs.h      |  207 ++++++++++++++++++++++++++++
 xen/include/asm-arm/current.h     |   60 ++++++++
 xen/include/asm-arm/debugger.h    |   15 ++
 xen/include/asm-arm/delay.h       |   15 ++
 xen/include/asm-arm/desc.h        |   12 ++
 xen/include/asm-arm/div64.h       |  235 ++++++++++++++++++++++++++++++++
 xen/include/asm-arm/elf.h         |   33 +++++
 xen/include/asm-arm/event.h       |   41 ++++++
 xen/include/asm-arm/flushtlb.h    |   31 +++++
 xen/include/asm-arm/grant_table.h |   35 +++++
 xen/include/asm-arm/hardirq.h     |   28 ++++
 xen/include/asm-arm/hypercall.h   |   24 ++++
 xen/include/asm-arm/init.h        |   12 ++
 xen/include/asm-arm/io.h          |   12 ++
 xen/include/asm-arm/iocap.h       |   20 +++
 xen/include/asm-arm/multicall.h   |   23 +++
 xen/include/asm-arm/nmi.h         |   15 ++
 xen/include/asm-arm/numa.h        |   21 +++
 xen/include/asm-arm/paging.h      |   13 ++
 xen/include/asm-arm/percpu.h      |   28 ++++
 xen/include/asm-arm/processor.h   |  269 +++++++++++++++++++++++++++++++++++++
 xen/include/asm-arm/regs.h        |   43 ++++++
 xen/include/asm-arm/setup.h       |   16 +++
 xen/include/asm-arm/smp.h         |   25 ++++
 xen/include/asm-arm/softirq.h     |   15 ++
 xen/include/asm-arm/spinlock.h    |  144 ++++++++++++++++++++
 xen/include/asm-arm/string.h      |   38 +++++
 xen/include/asm-arm/system.h      |  202 ++++++++++++++++++++++++++++
 xen/include/asm-arm/trace.h       |   12 ++
 xen/include/asm-arm/types.h       |   57 ++++++++
 xen/include/asm-arm/xenoprof.h    |   12 ++
 xen/include/public/arch-arm.h     |  125 +++++++++++++++++
 xen/include/public/xen.h          |    2 +
 39 files changed, 2420 insertions(+), 0 deletions(-)
 create mode 100644 xen/include/asm-arm/atomic.h
 create mode 100644 xen/include/asm-arm/bitops.h
 create mode 100644 xen/include/asm-arm/bug.h
 create mode 100644 xen/include/asm-arm/byteorder.h
 create mode 100644 xen/include/asm-arm/cache.h
 create mode 100644 xen/include/asm-arm/config.h
 create mode 100644 xen/include/asm-arm/cpregs.h
 create mode 100644 xen/include/asm-arm/current.h
 create mode 100644 xen/include/asm-arm/debugger.h
 create mode 100644 xen/include/asm-arm/delay.h
 create mode 100644 xen/include/asm-arm/desc.h
 create mode 100644 xen/include/asm-arm/div64.h
 create mode 100644 xen/include/asm-arm/elf.h
 create mode 100644 xen/include/asm-arm/event.h
 create mode 100644 xen/include/asm-arm/flushtlb.h
 create mode 100644 xen/include/asm-arm/grant_table.h
 create mode 100644 xen/include/asm-arm/hardirq.h
 create mode 100644 xen/include/asm-arm/hypercall.h
 create mode 100644 xen/include/asm-arm/init.h
 create mode 100644 xen/include/asm-arm/io.h
 create mode 100644 xen/include/asm-arm/iocap.h
 create mode 100644 xen/include/asm-arm/multicall.h
 create mode 100644 xen/include/asm-arm/nmi.h
 create mode 100644 xen/include/asm-arm/numa.h
 create mode 100644 xen/include/asm-arm/paging.h
 create mode 100644 xen/include/asm-arm/percpu.h
 create mode 100644 xen/include/asm-arm/processor.h
 create mode 100644 xen/include/asm-arm/regs.h
 create mode 100644 xen/include/asm-arm/setup.h
 create mode 100644 xen/include/asm-arm/smp.h
 create mode 100644 xen/include/asm-arm/softirq.h
 create mode 100644 xen/include/asm-arm/spinlock.h
 create mode 100644 xen/include/asm-arm/string.h
 create mode 100644 xen/include/asm-arm/system.h
 create mode 100644 xen/include/asm-arm/trace.h
 create mode 100644 xen/include/asm-arm/types.h
 create mode 100644 xen/include/asm-arm/xenoprof.h
 create mode 100644 xen/include/public/arch-arm.h

diff --git a/xen/include/asm-arm/atomic.h b/xen/include/asm-arm/atomic.h
new file mode 100644
index 0000000..2b9ce0e
--- /dev/null
+++ b/xen/include/asm-arm/atomic.h
@@ -0,0 +1,212 @@
+/*
+ *  arch/arm/include/asm/atomic.h
+ *
+ *  Copyright (C) 1996 Russell King.
+ *  Copyright (C) 2002 Deep Blue Solutions Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef __ARCH_ARM_ATOMIC__
+#define __ARCH_ARM_ATOMIC__
+
+#include <xen/config.h>
+#include <asm/system.h>
+
+#define build_atomic_read(name, size, type, reg)   \
+static inline type name(const volatile type *addr) \
+{                                                  \
+    type ret;                                      \
+    asm volatile("ldr" size " %0,%1"               \
+                 : reg (ret)                       \
+                 : "m" (*(volatile type *)addr));  \
+    return ret;                                    \
+}
+
+#define build_atomic_write(name, size, type, reg)      \
+static inline void name(volatile type *addr, type val) \
+{                                                      \
+    asm volatile("str" size " %1,%0"                   \
+                 : "=m" (*(volatile type *)addr)       \
+                 : reg (val));                         \
+}
+
+build_atomic_read(atomic_read8, "b", uint8_t, "=q")
+build_atomic_read(atomic_read16, "h", uint16_t, "=r")
+build_atomic_read(atomic_read32, "", uint32_t, "=r")
+//build_atomic_read(atomic_read64, "d", uint64_t, "=r")
+build_atomic_read(atomic_read_int, "", int, "=r")
+
+build_atomic_write(atomic_write8, "b", uint8_t, "q")
+build_atomic_write(atomic_write16, "h", uint16_t, "r")
+build_atomic_write(atomic_write32, "", uint32_t, "r")
+//build_atomic_write(atomic_write64, "d", uint64_t, "r")
+build_atomic_write(atomic_write_int, "", int, "r")
+
+/*
+ * NB. I've pushed the volatile qualifier into the operations. This allows
+ * fast accessors such as _atomic_read() and _atomic_set() which don't give
+ * the compiler a fit.
+ */
+typedef struct { int counter; } atomic_t;
+
+#define ATOMIC_INIT(i) { (i) }
+
+/*
+ * On ARM, ordinary assignment (str instruction) doesn't clear the local
+ * strex/ldrex monitor on some implementations. The reason we can use it for
+ * atomic_set() is the clrex or dummy strex done on every exception return.
+ */
+#define _atomic_read(v) ((v).counter)
+#define atomic_read(v)  (*(volatile int *)&(v)->counter)
+
+#define _atomic_set(v,i) (((v).counter) = (i))
+#define atomic_set(v,i) (((v)->counter) = (i))
+
+/*
+ * ARMv6 UP and SMP safe atomic ops.  We use load exclusive and
+ * store exclusive to ensure that these are atomic.  We may loop
+ * to ensure that the update happens.
+ */
+static inline void atomic_add(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        __asm__ __volatile__("@ atomic_add\n"
+"1:     ldrex   %0, [%3]\n"
+"       add     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+}
+
+static inline int atomic_add_return(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        smp_mb();
+
+        __asm__ __volatile__("@ atomic_add_return\n"
+"1:     ldrex   %0, [%3]\n"
+"       add     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+
+        smp_mb();
+
+        return result;
+}
+
+static inline void atomic_sub(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        __asm__ __volatile__("@ atomic_sub\n"
+"1:     ldrex   %0, [%3]\n"
+"       sub     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+}
+
+static inline int atomic_sub_return(int i, atomic_t *v)
+{
+        unsigned long tmp;
+        int result;
+
+        smp_mb();
+
+        __asm__ __volatile__("@ atomic_sub_return\n"
+"1:     ldrex   %0, [%3]\n"
+"       sub     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (result), "=&r" (tmp), "+Qo" (v->counter)
+        : "r" (&v->counter), "Ir" (i)
+        : "cc");
+
+        smp_mb();
+
+        return result;
+}
+
+static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
+{
+        unsigned long oldval, res;
+
+        smp_mb();
+
+        do {
+                __asm__ __volatile__("@ atomic_cmpxchg\n"
+                "ldrex  %1, [%3]\n"
+                "mov    %0, #0\n"
+                "teq    %1, %4\n"
+                "strexeq %0, %5, [%3]\n"
+                    : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter)
+                    : "r" (&ptr->counter), "Ir" (old), "r" (new)
+                    : "cc");
+        } while (res);
+
+        smp_mb();
+
+        return oldval;
+}
+
+static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
+{
+        unsigned long tmp, tmp2;
+
+        __asm__ __volatile__("@ atomic_clear_mask\n"
+"1:     ldrex   %0, [%3]\n"
+"       bic     %0, %0, %4\n"
+"       strex   %1, %0, [%3]\n"
+"       teq     %1, #0\n"
+"       bne     1b"
+        : "=&r" (tmp), "=&r" (tmp2), "+Qo" (*addr)
+        : "r" (addr), "Ir" (mask)
+        : "cc");
+}
+
+#define atomic_inc(v)           atomic_add(1, v)
+#define atomic_dec(v)           atomic_sub(1, v)
+
+#define atomic_inc_and_test(v)  (atomic_add_return(1, v) == 0)
+#define atomic_dec_and_test(v)  (atomic_sub_return(1, v) == 0)
+#define atomic_inc_return(v)    (atomic_add_return(1, v))
+#define atomic_dec_return(v)    (atomic_sub_return(1, v))
+#define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
+
+#define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0)
+
+static inline atomic_t atomic_compareandswap(
+    atomic_t old, atomic_t new, atomic_t *v)
+{
+    atomic_t rc;
+    rc.counter = __cmpxchg(&v->counter, old.counter, new.counter, sizeof(int));
+    return rc;
+}
+
+#endif /* __ARCH_ARM_ATOMIC__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/bitops.h b/xen/include/asm-arm/bitops.h
new file mode 100644
index 0000000..3d6b30b
--- /dev/null
+++ b/xen/include/asm-arm/bitops.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright 1995, Russell King.
+ * Various bits and pieces copyrights include:
+ *  Linus Torvalds (test_bit).
+ * Big endian support: Copyright 2001, Nicolas Pitre
+ *  reworked by rmk.
+ */
+
+#ifndef _ARM_BITOPS_H
+#define _ARM_BITOPS_H
+
+extern void _set_bit(int nr, volatile void * p);
+extern void _clear_bit(int nr, volatile void * p);
+extern void _change_bit(int nr, volatile void * p);
+extern int _test_and_set_bit(int nr, volatile void * p);
+extern int _test_and_clear_bit(int nr, volatile void * p);
+extern int _test_and_change_bit(int nr, volatile void * p);
+
+#define set_bit(n,p)              _set_bit(n,p)
+#define clear_bit(n,p)            _clear_bit(n,p)
+#define change_bit(n,p)           _change_bit(n,p)
+#define test_and_set_bit(n,p)     _test_and_set_bit(n,p)
+#define test_and_clear_bit(n,p)   _test_and_clear_bit(n,p)
+#define test_and_change_bit(n,p)  _test_and_change_bit(n,p)
+
+#define BIT(nr)                 (1UL << (nr))
+#define BIT_MASK(nr)            (1UL << ((nr) % BITS_PER_LONG))
+#define BIT_WORD(nr)            ((nr) / BITS_PER_LONG)
+#define BITS_PER_BYTE           8
+
+#define ADDR (*(volatile long *) addr)
+#define CONST_ADDR (*(const volatile long *) addr)
+
+/**
+ * __test_and_set_bit - Set a bit and return its old value
+ * @nr: Bit to set
+ * @addr: Address to count from
+ *
+ * This operation is non-atomic and can be reordered.
+ * If two examples of this operation race, one can appear to succeed
+ * but actually fail.  You must protect multiple accesses with a lock.
+ */
+static inline int __test_and_set_bit(int nr, volatile void *addr)
+{
+        unsigned long mask = BIT_MASK(nr);
+        volatile unsigned long *p =
+                ((volatile unsigned long *)addr) + BIT_WORD(nr);
+        unsigned long old = *p;
+
+        *p = old | mask;
+        return (old & mask) != 0;
+}
+
+/**
+ * __test_and_clear_bit - Clear a bit and return its old value
+ * @nr: Bit to clear
+ * @addr: Address to count from
+ *
+ * This operation is non-atomic and can be reordered.
+ * If two examples of this operation race, one can appear to succeed
+ * but actually fail.  You must protect multiple accesses with a lock.
+ */
+static inline int __test_and_clear_bit(int nr, volatile void *addr)
+{
+        unsigned long mask = BIT_MASK(nr);
+        volatile unsigned long *p =
+                ((volatile unsigned long *)addr) + BIT_WORD(nr);
+        unsigned long old = *p;
+
+        *p = old & ~mask;
+        return (old & mask) != 0;
+}
+
+/* WARNING: non atomic and it can be reordered! */
+static inline int __test_and_change_bit(int nr,
+                                            volatile void *addr)
+{
+        unsigned long mask = BIT_MASK(nr);
+        volatile unsigned long *p =
+                ((volatile unsigned long *)addr) + BIT_WORD(nr);
+        unsigned long old = *p;
+
+        *p = old ^ mask;
+        return (old & mask) != 0;
+}
+
+/**
+ * test_bit - Determine whether a bit is set
+ * @nr: bit number to test
+ * @addr: Address to start counting from
+ */
+static inline int test_bit(int nr, const volatile void *addr)
+{
+        const volatile unsigned long *p = (const volatile unsigned long *)addr;
+        return 1UL & (p[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
+}
+
+
+extern unsigned int _find_first_bit(
+    const unsigned long *addr, unsigned int size);
+extern unsigned int _find_next_bit(
+    const unsigned long *addr, unsigned int size, unsigned int offset);
+extern unsigned int _find_first_zero_bit(
+    const unsigned long *addr, unsigned int size);
+extern unsigned int _find_next_zero_bit(
+    const unsigned long *addr, unsigned int size, unsigned int offset);
+
+/*
+ * These are the little endian, atomic definitions.
+ */
+#define find_first_zero_bit(p,sz)       _find_first_zero_bit(p,sz)
+#define find_next_zero_bit(p,sz,off)    _find_next_zero_bit(p,sz,off)
+#define find_first_bit(p,sz)            _find_first_bit(p,sz)
+#define find_next_bit(p,sz,off)         _find_next_bit(p,sz,off)
+
+static inline int constant_fls(int x)
+{
+        int r = 32;
+
+        if (!x)
+                return 0;
+        if (!(x & 0xffff0000u)) {
+                x <<= 16;
+                r -= 16;
+        }
+        if (!(x & 0xff000000u)) {
+                x <<= 8;
+                r -= 8;
+        }
+        if (!(x & 0xf0000000u)) {
+                x <<= 4;
+                r -= 4;
+        }
+        if (!(x & 0xc0000000u)) {
+                x <<= 2;
+                r -= 2;
+        }
+        if (!(x & 0x80000000u)) {
+                x <<= 1;
+                r -= 1;
+        }
+        return r;
+}
+
+/*
+ * On ARMv5 and above those functions can be implemented around
+ * the clz instruction for much better code efficiency.
+ */
+
+static inline int fls(int x)
+{
+        int ret;
+
+        if (__builtin_constant_p(x))
+               return constant_fls(x);
+
+        asm("clz\t%0, %1" : "=r" (ret) : "r" (x));
+        ret = 32 - ret;
+        return ret;
+}
+
+#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
+
+/**
+ * find_first_set_bit - find the first set bit in @word
+ * @word: the word to search
+ *
+ * Returns the bit-number of the first set bit (first bit being 0).
+ * The input must *not* be zero.
+ */
+static inline unsigned int find_first_set_bit(unsigned long word)
+{
+        return ffs(word) - 1;
+}
+
+/**
+ * hweightN - returns the hamming weight of a N-bit word
+ * @x: the word to weigh
+ *
+ * The Hamming Weight of a number is the total number of bits set in it.
+ */
+#define hweight64(x) generic_hweight64(x)
+#define hweight32(x) generic_hweight32(x)
+#define hweight16(x) generic_hweight16(x)
+#define hweight8(x) generic_hweight8(x)
+
+#endif /* _ARM_BITOPS_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/bug.h b/xen/include/asm-arm/bug.h
new file mode 100644
index 0000000..bc2532c
--- /dev/null
+++ b/xen/include/asm-arm/bug.h
@@ -0,0 +1,15 @@
+#ifndef __ARM_BUG_H__
+#define __ARM_BUG_H__
+
+#define BUG() __bug(__FILE__, __LINE__)
+#define WARN() __warn(__FILE__, __LINE__)
+
+#endif /* __X86_BUG_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/byteorder.h b/xen/include/asm-arm/byteorder.h
new file mode 100644
index 0000000..f6ad883
--- /dev/null
+++ b/xen/include/asm-arm/byteorder.h
@@ -0,0 +1,16 @@
+#ifndef __ASM_ARM_BYTEORDER_H__
+#define __ASM_ARM_BYTEORDER_H__
+
+#define __BYTEORDER_HAS_U64__
+
+#include <xen/byteorder/little_endian.h>
+
+#endif /* __ASM_ARM_BYTEORDER_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/cache.h b/xen/include/asm-arm/cache.h
new file mode 100644
index 0000000..41b6291
--- /dev/null
+++ b/xen/include/asm-arm/cache.h
@@ -0,0 +1,20 @@
+#ifndef __ARCH_ARM_CACHE_H
+#define __ARCH_ARM_CACHE_H
+
+#include <xen/config.h>
+
+/* L1 cache line size */
+#define L1_CACHE_SHIFT  (CONFIG_ARM_L1_CACHE_SHIFT)
+#define L1_CACHE_BYTES  (1 << L1_CACHE_SHIFT)
+
+#define __read_mostly __attribute__((__section__(".data.read_mostly")))
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/config.h b/xen/include/asm-arm/config.h
new file mode 100644
index 0000000..12285dd
--- /dev/null
+++ b/xen/include/asm-arm/config.h
@@ -0,0 +1,122 @@
+/******************************************************************************
+ * config.h
+ *
+ * A Linux-style configuration list.
+ */
+
+#ifndef __ARM_CONFIG_H__
+#define __ARM_CONFIG_H__
+
+#define CONFIG_PAGING_LEVELS 3
+
+#define CONFIG_ARM 1
+
+#define CONFIG_ARM_L1_CACHE_SHIFT 7 /* XXX */
+
+#define CONFIG_SMP 1
+
+#define CONFIG_DOMAIN_PAGE 1
+
+#define OPT_CONSOLE_STR "com1"
+
+#ifdef MAX_PHYS_CPUS
+#define NR_CPUS MAX_PHYS_CPUS
+#else
+#define NR_CPUS 128
+#endif
+
+#define MAX_VIRT_CPUS 128 /* XXX */
+#define MAX_HVM_VCPUS MAX_VIRT_CPUS
+
+#define asmlinkage /* Nothing needed */
+
+/* Linkage for ARM */
+#define __ALIGN .align 2
+#define __ALIGN_STR ".align 2"
+#ifdef __ASSEMBLY__
+#define ALIGN __ALIGN
+#define ALIGN_STR __ALIGN_STR
+#define ENTRY(name)                             \
+  .globl name;                                  \
+  ALIGN;                                        \
+  name:
+#define END(name) \
+  .size name, .-name
+#define ENDPROC(name) \
+  .type name, %function; \
+  END(name)
+#endif
+
+/*
+ * Memory layout:
+ *  0  -   2M   Unmapped
+ *  2M -   4M   Xen text, data, bss
+ *  4M -   6M   Fixmap: special-purpose 4K mapping slots
+ *
+ * 32M - 128M   Frametable: 24 bytes per page for 16GB of RAM
+ *
+ *  1G -   2G   Xenheap: always-mapped memory
+ *  2G -   4G   Domheap: on-demand-mapped
+ */
+
+#define XEN_VIRT_START         0x00200000
+#define FIXMAP_ADDR(n)        (0x00400000 + (n) * PAGE_SIZE)
+#define FRAMETABLE_VIRT_START  0x02000000
+#define XENHEAP_VIRT_START     0x40000000
+#define DOMHEAP_VIRT_START     0x80000000
+
+#define HYPERVISOR_VIRT_START mk_unsigned_long(XEN_VIRT_START)
+
+#define DOMHEAP_ENTRIES        1024  /* 1024 2MB mapping slots */
+
+/* Fixmap slots */
+#define FIXMAP_CONSOLE  0  /* The primary UART */
+#define FIXMAP_PT       1  /* Temporary mappings of pagetable pages */
+#define FIXMAP_MISC     2  /* Ephemeral mappings of hardware */
+#define FIXMAP_GICD     3  /* Interrupt controller: distributor registers */
+#define FIXMAP_GICC1    4  /* Interrupt controller: CPU registers (first page) */
+#define FIXMAP_GICC2    5  /* Interrupt controller: CPU registers (second page) */
+#define FIXMAP_GICH     6  /* Interrupt controller: virtual interface control registers */
+
+#define PAGE_SHIFT              12
+
+#ifndef __ASSEMBLY__
+#define PAGE_SIZE           (1L << PAGE_SHIFT)
+#else
+#define PAGE_SIZE           (1 << PAGE_SHIFT)
+#endif
+#define PAGE_MASK           (~(PAGE_SIZE-1))
+#define PAGE_FLAG_MASK      (~0)
+
+#define STACK_ORDER 3
+#define STACK_SIZE  (PAGE_SIZE << STACK_ORDER)
+
+#ifndef __ASSEMBLY__
+extern unsigned long xen_phys_start;
+extern unsigned long xenheap_phys_end;
+extern unsigned long frametable_virt_end;
+#endif
+
+#define supervisor_mode_kernel (0)
+
+#define watchdog_disable() ((void)0)
+#define watchdog_enable()  ((void)0)
+
+/* Board-specific: base address of PL011 UART */
+#define EARLY_UART_ADDRESS 0x1c090000
+/* Board-specific: base address of GIC + its regs */
+#define GIC_BASE_ADDRESS 0x2c000000
+#define GIC_DR_OFFSET 0x1000
+#define GIC_CR_OFFSET 0x2000
+#define GIC_HR_OFFSET 0x4000 /* Guess work http://lists.infradead.org/pipermail/linux-arm-kernel/2011-September/064219.html */
+#define GIC_VR_OFFSET 0x6000 /* Virtual Machine CPU interface) */
+
+#endif /* __ARM_CONFIG_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/cpregs.h b/xen/include/asm-arm/cpregs.h
new file mode 100644
index 0000000..3a4028d
--- /dev/null
+++ b/xen/include/asm-arm/cpregs.h
@@ -0,0 +1,207 @@
+#ifndef __ASM_ARM_CPREGS_H
+#define __ASM_ARM_CPREGS_H
+
+#include <xen/stringify.h>
+
+/* Co-processor registers */
+
+/* Layout as used in assembly, with src/dest registers mixed in */
+#define __CP32(r, coproc, opc1, crn, crm, opc2) coproc, opc1, r, crn, crm, opc2
+#define __CP64(r1, r2, coproc, opc, crm) coproc, opc, r1, r2, crm
+#define CP32(r, name...) __CP32(r, name)
+#define CP64(r, name...) __CP64(r, name)
+
+/* Stringified for inline assembly */
+#define LOAD_CP32(r, name...)  "mrc " __stringify(CP32(%r, name)) ";"
+#define STORE_CP32(r, name...) "mcr " __stringify(CP32(%r, name)) ";"
+#define LOAD_CP64(r, name...)  "mrrc " __stringify(CP64(%r, %H##r, name)) ";"
+#define STORE_CP64(r, name...) "mcrr " __stringify(CP64(%r, %H##r, name)) ";"
+
+/* C wrappers */
+#define READ_CP32(name...) ({                                   \
+    register uint32_t _r;                                       \
+    asm volatile(LOAD_CP32(0, name) : "=r" (_r));               \
+    _r; })
+
+#define WRITE_CP32(v, name...) do {                             \
+    register uint32_t _r = (v);                                 \
+    asm volatile(STORE_CP32(0, name) : : "r" (_r));             \
+} while (0)
+
+#define READ_CP64(name...) ({                                   \
+    register uint64_t _r;                                       \
+    asm volatile(LOAD_CP64(0, name) : "=r" (_r));               \
+    _r; })
+
+#define WRITE_CP64(v, name...) do {                             \
+    register uint64_t _r = (v);                                 \
+    asm volatile(STORE_CP64(0, name) : : "r" (_r));             \
+} while (0)
+
+#define __HSR_CPREG_c0  0
+#define __HSR_CPREG_c1  1
+#define __HSR_CPREG_c2  2
+#define __HSR_CPREG_c3  3
+#define __HSR_CPREG_c4  4
+#define __HSR_CPREG_c5  5
+#define __HSR_CPREG_c6  6
+#define __HSR_CPREG_c7  7
+#define __HSR_CPREG_c8  8
+#define __HSR_CPREG_c9  9
+#define __HSR_CPREG_c10 10
+#define __HSR_CPREG_c11 11
+#define __HSR_CPREG_c12 12
+#define __HSR_CPREG_c13 13
+#define __HSR_CPREG_c14 14
+#define __HSR_CPREG_c15 15
+
+#define __HSR_CPREG_0   0
+#define __HSR_CPREG_1   1
+#define __HSR_CPREG_2   2
+#define __HSR_CPREG_3   3
+#define __HSR_CPREG_4   4
+#define __HSR_CPREG_5   5
+#define __HSR_CPREG_6   6
+#define __HSR_CPREG_7   7
+
+#define _HSR_CPREG32(cp,op1,crn,crm,op2) \
+    ((__HSR_CPREG_##crn) << HSR_CP32_CRN_SHIFT) | \
+    ((__HSR_CPREG_##crm) << HSR_CP32_CRM_SHIFT) | \
+    ((__HSR_CPREG_##op1) << HSR_CP32_OP1_SHIFT) | \
+    ((__HSR_CPREG_##op2) << HSR_CP32_OP2_SHIFT)
+
+#define _HSR_CPREG64(cp,op1,crm) \
+    ((__HSR_CPREG_##crm) << HSR_CP64_CRM_SHIFT) | \
+    ((__HSR_CPREG_##op1) << HSR_CP64_OP1_SHIFT)
+
+/* Encode a register as per HSR ISS pattern */
+#define HSR_CPREG32(X) _HSR_CPREG32(X)
+#define HSR_CPREG64(X) _HSR_CPREG64(X)
+
+/*
+ * Order registers by Coprocessor-> CRn-> Opcode 1-> CRm-> Opcode 2
+ *
+ * This matches the ordering used in the ARM as well as the groupings
+ * which the CP registers are allocated in.
+ *
+ * This is slightly different to the form of the instruction
+ * arguments, which are cp,opc1,crn,crm,opc2.
+ */
+
+/* Coprocessor 15 */
+
+/* CP15 CR0: CPUID and Cache Type Registers */
+#define ID_PFR0         p15,0,c0,c1,0   /* Processor Feature Register 0 */
+#define ID_PFR1         p15,0,c0,c1,1   /* Processor Feature Register 1 */
+#define CCSIDR          p15,1,c0,c0,0   /* Cache Size ID Registers */
+#define CLIDR           p15,1,c0,c0,1   /* Cache Level ID Register */
+#define CSSELR          p15,2,c0,c0,0   /* Cache Size Selection Register */
+
+/* CP15 CR1: System Control Registers */
+#define SCTLR           p15,0,c1,c0,0   /* System Control Register */
+#define SCR             p15,0,c1,c1,0   /* Secure Configuration Register */
+#define NSACR           p15,0,c1,c1,2   /* Non-Secure Access Control Register */
+#define HSCTLR          p15,4,c1,c0,0   /* Hyp. System Control Register */
+#define HCR             p15,4,c1,c1,0   /* Hyp. Configuration Register */
+
+/* CP15 CR2: Translation Table Base and Control Registers */
+#define TTBR0           p15,0,c2,c0,0   /* Translation Table Base Reg. 0 */
+#define TTBR1           p15,0,c2,c0,1   /* Translation Table Base Reg. 1 */
+#define TTBCR           p15,0,c2,c0,2   /* Translatation Table Base Control Register */
+#define HTTBR           p15,4,c2        /* Hyp. Translation Table Base Register */
+#define HTCR            p15,4,c2,c0,2   /* Hyp. Translation Control Register */
+#define VTCR            p15,4,c2,c1,2   /* Virtualization Translation Control Register */
+#define VTTBR           p15,6,c2        /* Virtualization Translation Table Base Register */
+
+/* CP15 CR3: Domain Access Control Register */
+
+/* CP15 CR4: */
+
+/* CP15 CR5: Fault Status Registers */
+#define DFSR            p15,0,c5,c0,0   /* Data Fault Status Register */
+#define IFSR            p15,0,c5,c0,1   /* Instruction Fault Status Register */
+#define HSR             p15,4,c5,c2,0   /* Hyp. Syndrome Register */
+
+/* CP15 CR6: Fault Address Registers */
+#define DFAR            p15,0,c6,c0,0   /* Data Fault Address Register  */
+#define IFAR            p15,0,c6,c0,2   /* Instruction Fault Address Register */
+#define HDFAR           p15,4,c6,c0,0   /* Hyp. Data Fault Address Register */
+#define HIFAR           p15,4,c6,c0,2   /* Hyp. Instruction Fault Address Register */
+#define HPFAR           p15,4,c6,c0,4   /* Hyp. IPA Fault Address Register */
+
+/* CP15 CR7: Cache and address translation operations */
+#define PAR             p15,0,c7        /* Physical Address Register */
+#define ICIALLUIS       p15,0,c7,c1,0   /* Invalidate all instruction caches to PoU inner shareable */
+#define BPIALLIS        p15,0,c7,c1,6   /* Invalidate entire branch predictor array inner shareable */
+#define ICIALLU         p15,0,c7,c5,0   /* Invalidate all instruction caches to PoU */
+#define BPIALL          p15,0,c7,c5,6   /* Invalidate entire branch predictor array */
+#define ATS1CPR         p15,0,c7,c8,0   /* Address Translation Stage 1. Non-Secure Kernel Read */
+#define ATS1CPW         p15,0,c7,c8,1   /* Address Translation Stage 1. Non-Secure Kernel Write */
+#define ATS1CUR         p15,0,c7,c8,2   /* Address Translation Stage 1. Non-Secure User Read */
+#define ATS1CUW         p15,0,c7,c8,3   /* Address Translation Stage 1. Non-Secure User Write */
+#define ATS12NSOPR      p15,0,c7,c8,4   /* Address Translation Stage 1+2 Non-Secure Kernel Read */
+#define ATS12NSOPW      p15,0,c7,c8,5   /* Address Translation Stage 1+2 Non-Secure Kernel Write */
+#define ATS12NSOUR      p15,0,c7,c8,6   /* Address Translation Stage 1+2 Non-Secure User Read */
+#define ATS12NSOUW      p15,0,c7,c8,7   /* Address Translation Stage 1+2 Non-Secure User Write */
+#define DCCMVAC         p15,0,c7,c10,1  /* Clean data or unified cache line by MVA to PoC */
+#define DCCISW          p15,0,c7,c14,2  /* Clean and invalidate data cache line by set/way */
+#define ATS1HR          p15,4,c7,c8,0   /* Address Translation Stage 1 Hyp. Read */
+#define ATS1HW          p15,4,c7,c8,1   /* Address Translation Stage 1 Hyp. Write */
+
+/* CP15 CR8: TLB maintenance operations */
+#define TLBIALLIS       p15,0,c8,c3,0   /* Invalidate entire TLB innrer shareable */
+#define TLBIMVAIS       p15,0,c8,c3,1   /* Invalidate unified TLB entry by MVA inner shareable */
+#define TLBIASIDIS      p15,0,c8,c3,2   /* Invalidate unified TLB by ASID match inner shareable */
+#define TLBIMVAAIS      p15,0,c8,c3,3   /* Invalidate unified TLB entry by MVA all ASID inner shareable */
+#define DTLBIALL        p15,0,c8,c6,0   /* Invalidate data TLB */
+#define DTLBIMVA        p15,0,c8,c6,1   /* Invalidate data TLB entry by MVA */
+#define DTLBIASID       p15,0,c8,c6,2   /* Invalidate data TLB by ASID match */
+#define TLBILLHIS       p15,4,c8,c3,0   /* Invalidate Entire Hyp. Unified TLB inner shareable */
+#define TLBIMVAHIS      p15,4,c8,c3,1   /* Invalidate Unified Hyp. TLB by MVA inner shareable */
+#define TLBIALLNSNHIS   p15,4,c8,c7,4   /* Invalidate Entire Non-Secure Non-Hyp. Unified TLB inner shareable */
+#define TLBIALLH        p15,4,c8,c7,0   /* Invalidate Entire Hyp. Unified TLB */
+#define TLBIMVAH        p15,4,c8,c7,1   /* Invalidate Unified Hyp. TLB by MVA */
+#define TLBIALLNSNH     p15,4,c8,c7,4   /* Invalidate Entire Non-Secure Non-Hyp. Unified TLB */
+
+/* CP15 CR9: */
+
+/* CP15 CR10: */
+#define MAIR0           p15,0,c10,c2,0  /* Memory Attribute Indirection Register 0 */
+#define MAIR1           p15,0,c10,c2,1  /* Memory Attribute Indirection Register 1 */
+#define HMAIR0          p15,4,c10,c2,0  /* Hyp. Memory Attribute Indirection Register 0 */
+#define HMAIR1          p15,4,c10,c2,1  /* Hyp. Memory Attribute Indirection Register 1 */
+
+/* CP15 CR11: DMA Operations for TCM Access */
+
+/* CP15 CR12:  */
+#define HVBAR           p15,4,c12,c0,0  /* Hyp. Vector Base Address Register */
+
+/* CP15 CR13:  */
+#define FCSEIDR         p15,0,c13,c0,0  /* FCSE Process ID Register */
+#define CONTEXTIDR      p15,0,c13,c0,1  /* Context ID Register */
+
+/* CP15 CR14:  */
+#define CNTPCT          p15,0,c14       /* Time counter value */
+#define CNTFRQ          p15,0,c14,c0,0  /* Time counter frequency */
+#define CNTKCTL         p15,0,c14,c1,0  /* Time counter kernel control */
+#define CNTP_TVAL       p15,0,c14,c2,0  /* Physical Timer value */
+#define CNTP_CTL        p15,0,c14,c2,1  /* Physical Timer control register */
+#define CNTVCT          p15,1,c14       /* Time counter value + offset */
+#define CNTP_CVAL       p15,2,c14       /* Physical Timer comparator */
+#define CNTVOFF         p15,4,c14       /* Time counter offset */
+#define CNTHCTL         p15,4,c14,c1,0  /* Time counter hyp. control */
+#define CNTHP_TVAL      p15,4,c14,c2,0  /* Hyp. Timer value */
+#define CNTHP_CTL       p15,4,c14,c2,1  /* Hyp. Timer control register */
+#define CNTHP_CVAL      p15,6,c14       /* Hyp. Timer comparator */
+
+/* CP15 CR15: Implementation Defined Registers */
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/current.h b/xen/include/asm-arm/current.h
new file mode 100644
index 0000000..826efa5
--- /dev/null
+++ b/xen/include/asm-arm/current.h
@@ -0,0 +1,60 @@
+#ifndef __ARM_CURRENT_H__
+#define __ARM_CURRENT_H__
+
+#include <xen/config.h>
+#include <xen/percpu.h>
+#include <public/xen.h>
+
+#ifndef __ASSEMBLY__
+
+struct vcpu;
+
+struct cpu_info {
+    struct cpu_user_regs guest_cpu_user_regs;
+    unsigned long elr;
+    unsigned int processor_id;
+    struct vcpu *current_vcpu;
+    unsigned long per_cpu_offset;
+};
+
+static inline struct cpu_info *get_cpu_info(void)
+{
+        register unsigned long sp asm ("sp");
+        return (struct cpu_info *)((sp & ~(STACK_SIZE - 1)) + STACK_SIZE - sizeof(struct cpu_info));
+}
+
+#define get_current()         (get_cpu_info()->current_vcpu)
+#define set_current(vcpu)     (get_cpu_info()->current_vcpu = (vcpu))
+#define current               (get_current())
+
+#define get_processor_id()    (get_cpu_info()->processor_id)
+#define set_processor_id(id)  do {                                      \
+    struct cpu_info *ci__ = get_cpu_info();                             \
+    ci__->per_cpu_offset = __per_cpu_offset[ci__->processor_id = (id)]; \
+} while (0)
+
+#define guest_cpu_user_regs() (&get_cpu_info()->guest_cpu_user_regs)
+
+#define reset_stack_and_jump(__fn)              \
+    __asm__ __volatile__ (                      \
+        "mov sp,%0; b "STR(__fn)      \
+        : : "r" (guest_cpu_user_regs()) : "memory" )
+#endif
+
+
+/*
+ * Which VCPU's state is currently running on each CPU?
+ * This is not necesasrily the same as 'current' as a CPU may be
+ * executing a lazy state switch.
+ */
+DECLARE_PER_CPU(struct vcpu *, curr_vcpu);
+
+#endif /* __ARM_CURRENT_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/debugger.h b/xen/include/asm-arm/debugger.h
new file mode 100644
index 0000000..84b2eec
--- /dev/null
+++ b/xen/include/asm-arm/debugger.h
@@ -0,0 +1,15 @@
+#ifndef __ARM_DEBUGGER_H__
+#define __ARM_DEBUGGER_H__
+
+#define debugger_trap_fatal(v, r) (0)
+#define debugger_trap_immediate() (0)
+
+#endif /* __ARM_DEBUGGER_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/delay.h b/xen/include/asm-arm/delay.h
new file mode 100644
index 0000000..6250774
--- /dev/null
+++ b/xen/include/asm-arm/delay.h
@@ -0,0 +1,15 @@
+#ifndef _ARM_DELAY_H
+#define _ARM_DELAY_H
+
+extern void __udelay(unsigned long usecs);
+#define udelay(n) __udelay(n)
+
+#endif /* defined(_ARM_DELAY_H) */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/desc.h b/xen/include/asm-arm/desc.h
new file mode 100644
index 0000000..3989e8a
--- /dev/null
+++ b/xen/include/asm-arm/desc.h
@@ -0,0 +1,12 @@
+#ifndef __ARCH_DESC_H
+#define __ARCH_DESC_H
+
+#endif /* __ARCH_DESC_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/div64.h b/xen/include/asm-arm/div64.h
new file mode 100644
index 0000000..7b00808
--- /dev/null
+++ b/xen/include/asm-arm/div64.h
@@ -0,0 +1,235 @@
+/* Taken from Linux arch/arm */
+#ifndef __ASM_ARM_DIV64
+#define __ASM_ARM_DIV64
+
+#include <asm/system.h>
+#include <xen/types.h>
+
+/*
+ * The semantics of do_div() are:
+ *
+ * uint32_t do_div(uint64_t *n, uint32_t base)
+ * {
+ * 	uint32_t remainder = *n % base;
+ * 	*n = *n / base;
+ * 	return remainder;
+ * }
+ *
+ * In other words, a 64-bit dividend with a 32-bit divisor producing
+ * a 64-bit result and a 32-bit remainder.  To accomplish this optimally
+ * we call a special __do_div64 helper with completely non standard
+ * calling convention for arguments and results (beware).
+ */
+
+#ifdef __ARMEB__
+#define __xh "r0"
+#define __xl "r1"
+#else
+#define __xl "r0"
+#define __xh "r1"
+#endif
+
+#define __do_div_asm(n, base)					\
+({								\
+	register unsigned int __base      asm("r4") = base;	\
+	register unsigned long long __n   asm("r0") = n;	\
+	register unsigned long long __res asm("r2");		\
+	register unsigned int __rem       asm(__xh);		\
+	asm(	__asmeq("%0", __xh)				\
+		__asmeq("%1", "r2")				\
+		__asmeq("%2", "r0")				\
+		__asmeq("%3", "r4")				\
+		"bl	__do_div64"				\
+		: "=r" (__rem), "=r" (__res)			\
+		: "r" (__n), "r" (__base)			\
+		: "ip", "lr", "cc");				\
+	n = __res;						\
+	__rem;							\
+})
+
+#if __GNUC__ < 4
+
+/*
+ * gcc versions earlier than 4.0 are simply too problematic for the
+ * optimized implementation below. First there is gcc PR 15089 that
+ * tend to trig on more complex constructs, spurious .global __udivsi3
+ * are inserted even if none of those symbols are referenced in the
+ * generated code, and those gcc versions are not able to do constant
+ * propagation on long long values anyway.
+ */
+#define do_div(n, base) __do_div_asm(n, base)
+
+#elif __GNUC__ >= 4
+
+#include <asm/bug.h>
+
+/*
+ * If the divisor happens to be constant, we determine the appropriate
+ * inverse at compile time to turn the division into a few inline
+ * multiplications instead which is much faster. And yet only if compiling
+ * for ARMv4 or higher (we need umull/umlal) and if the gcc version is
+ * sufficiently recent to perform proper long long constant propagation.
+ * (It is unfortunate that gcc doesn't perform all this internally.)
+ */
+#define do_div(n, base)							\
+({									\
+	unsigned int __r, __b = (base);					\
+	if (!__builtin_constant_p(__b) || __b == 0) {			\
+		/* non-constant divisor (or zero): slow path */		\
+		__r = __do_div_asm(n, __b);				\
+	} else if ((__b & (__b - 1)) == 0) {				\
+		/* Trivial: __b is constant and a power of 2 */		\
+		/* gcc does the right thing with this code.  */		\
+		__r = n;						\
+		__r &= (__b - 1);					\
+		n /= __b;						\
+	} else {							\
+		/* Multiply by inverse of __b: n/b = n*(p/b)/p       */	\
+		/* We rely on the fact that most of this code gets   */	\
+		/* optimized away at compile time due to constant    */	\
+		/* propagation and only a couple inline assembly     */	\
+		/* instructions should remain. Better avoid any      */	\
+		/* code construct that might prevent that.           */	\
+		unsigned long long __res, __x, __t, __m, __n = n;	\
+		unsigned int __c, __p, __z = 0;				\
+		/* preserve low part of n for reminder computation */	\
+		__r = __n;						\
+		/* determine number of bits to represent __b */		\
+		__p = 1 << __div64_fls(__b);				\
+		/* compute __m = ((__p << 64) + __b - 1) / __b */	\
+		__m = (~0ULL / __b) * __p;				\
+		__m += (((~0ULL % __b + 1) * __p) + __b - 1) / __b;	\
+		/* compute __res = __m*(~0ULL/__b*__b-1)/(__p << 64) */	\
+		__x = ~0ULL / __b * __b - 1;				\
+		__res = (__m & 0xffffffff) * (__x & 0xffffffff);	\
+		__res >>= 32;						\
+		__res += (__m & 0xffffffff) * (__x >> 32);		\
+		__t = __res;						\
+		__res += (__x & 0xffffffff) * (__m >> 32);		\
+		__t = (__res < __t) ? (1ULL << 32) : 0;			\
+		__res = (__res >> 32) + __t;				\
+		__res += (__m >> 32) * (__x >> 32);			\
+		__res /= __p;						\
+		/* Now sanitize and optimize what we've got. */		\
+		if (~0ULL % (__b / (__b & -__b)) == 0) {		\
+			/* those cases can be simplified with: */	\
+			__n /= (__b & -__b);				\
+			__m = ~0ULL / (__b / (__b & -__b));		\
+			__p = 1;					\
+			__c = 1;					\
+		} else if (__res != __x / __b) {			\
+			/* We can't get away without a correction    */	\
+			/* to compensate for bit truncation errors.  */	\
+			/* To avoid it we'd need an additional bit   */	\
+			/* to represent __m which would overflow it. */	\
+			/* Instead we do m=p/b and n/b=(n*m+m)/p.    */	\
+			__c = 1;					\
+			/* Compute __m = (__p << 64) / __b */		\
+			__m = (~0ULL / __b) * __p;			\
+			__m += ((~0ULL % __b + 1) * __p) / __b;		\
+		} else {						\
+			/* Reduce __m/__p, and try to clear bit 31   */	\
+			/* of __m when possible otherwise that'll    */	\
+			/* need extra overflow handling later.       */	\
+			unsigned int __bits = -(__m & -__m);		\
+			__bits |= __m >> 32;				\
+			__bits = (~__bits) << 1;			\
+			/* If __bits == 0 then setting bit 31 is     */	\
+			/* unavoidable.  Simply apply the maximum    */	\
+			/* possible reduction in that case.          */	\
+			/* Otherwise the MSB of __bits indicates the */	\
+			/* best reduction we should apply.           */	\
+			if (!__bits) {					\
+				__p /= (__m & -__m);			\
+				__m /= (__m & -__m);			\
+			} else {					\
+				__p >>= __div64_fls(__bits);		\
+				__m >>= __div64_fls(__bits);		\
+			}						\
+			/* No correction needed. */			\
+			__c = 0;					\
+		}							\
+		/* Now we have a combination of 2 conditions:        */	\
+		/* 1) whether or not we need a correction (__c), and */	\
+		/* 2) whether or not there might be an overflow in   */	\
+		/*    the cross product (__m & ((1<<63) | (1<<31)))  */	\
+		/* Select the best insn combination to perform the   */	\
+		/* actual __m * __n / (__p << 64) operation.         */	\
+		if (!__c) {						\
+			asm (	"umull	%Q0, %R0, %1, %Q2\n\t"		\
+				"mov	%Q0, #0"			\
+				: "=&r" (__res)				\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		} else if (!(__m & ((1ULL << 63) | (1ULL << 31)))) {	\
+			__res = __m;					\
+			asm (	"umlal	%Q0, %R0, %Q1, %Q2\n\t"		\
+				"mov	%Q0, #0"			\
+				: "+&r" (__res)				\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		} else {						\
+			asm (	"umull	%Q0, %R0, %Q1, %Q2\n\t"		\
+				"cmn	%Q0, %Q1\n\t"			\
+				"adcs	%R0, %R0, %R1\n\t"		\
+				"adc	%Q0, %3, #0"			\
+				: "=&r" (__res)				\
+				: "r" (__m), "r" (__n), "r" (__z)	\
+				: "cc" );				\
+		}							\
+		if (!(__m & ((1ULL << 63) | (1ULL << 31)))) {		\
+			asm (	"umlal	%R0, %Q0, %R1, %Q2\n\t"		\
+				"umlal	%R0, %Q0, %Q1, %R2\n\t"		\
+				"mov	%R0, #0\n\t"			\
+				"umlal	%Q0, %R0, %R1, %R2"		\
+				: "+&r" (__res)				\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		} else {						\
+			asm (	"umlal	%R0, %Q0, %R2, %Q3\n\t"		\
+				"umlal	%R0, %1, %Q2, %R3\n\t"		\
+				"mov	%R0, #0\n\t"			\
+				"adds	%Q0, %1, %Q0\n\t"		\
+				"adc	%R0, %R0, #0\n\t"		\
+				"umlal	%Q0, %R0, %R2, %R3"		\
+				: "+&r" (__res), "+&r" (__z)		\
+				: "r" (__m), "r" (__n)			\
+				: "cc" );				\
+		}							\
+		__res /= __p;						\
+		/* The reminder can be computed with 32-bit regs     */	\
+		/* only, and gcc is good at that.                    */	\
+		{							\
+			unsigned int __res0 = __res;			\
+			unsigned int __b0 = __b;			\
+			__r -= __res0 * __b0;				\
+		}							\
+		/* BUG_ON(__r >= __b || __res * __b + __r != n); */	\
+		n = __res;						\
+	}								\
+	__r;								\
+})
+
+/* our own fls implementation to make sure constant propagation is fine */
+#define __div64_fls(bits)						\
+({									\
+	unsigned int __left = (bits), __nr = 0;				\
+	if (__left & 0xffff0000) __nr += 16, __left >>= 16;		\
+	if (__left & 0x0000ff00) __nr +=  8, __left >>=  8;		\
+	if (__left & 0x000000f0) __nr +=  4, __left >>=  4;		\
+	if (__left & 0x0000000c) __nr +=  2, __left >>=  2;		\
+	if (__left & 0x00000002) __nr +=  1;				\
+	__nr;								\
+})
+
+#endif
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/elf.h b/xen/include/asm-arm/elf.h
new file mode 100644
index 0000000..12d487c
--- /dev/null
+++ b/xen/include/asm-arm/elf.h
@@ -0,0 +1,33 @@
+#ifndef __ARM_ELF_H__
+#define __ARM_ELF_H__
+
+typedef struct {
+    unsigned long r0;
+    unsigned long r1;
+    unsigned long r2;
+    unsigned long r3;
+    unsigned long r4;
+    unsigned long r5;
+    unsigned long r6;
+    unsigned long r7;
+    unsigned long r8;
+    unsigned long r9;
+    unsigned long r10;
+    unsigned long r11;
+    unsigned long r12;
+    unsigned long sp;
+    unsigned long lr;
+    unsigned long pc;
+} ELF_Gregset;
+
+#endif /* __ARM_ELF_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/event.h b/xen/include/asm-arm/event.h
new file mode 100644
index 0000000..6b2fb7c
--- /dev/null
+++ b/xen/include/asm-arm/event.h
@@ -0,0 +1,41 @@
+#ifndef __ASM_EVENT_H__
+#define __ASM_EVENT_H__
+
+void vcpu_kick(struct vcpu *v);
+void vcpu_mark_events_pending(struct vcpu *v);
+
+static inline int local_events_need_delivery(void)
+{
+    /* TODO
+     * return (vcpu_info(v, evtchn_upcall_pending) &&
+                        !vcpu_info(v, evtchn_upcall_mask)); */
+        return 0;
+}
+
+int local_event_delivery_is_enabled(void);
+
+static inline void local_event_delivery_disable(void)
+{
+    /* TODO current->vcpu_info->evtchn_upcall_mask = 1; */
+}
+
+static inline void local_event_delivery_enable(void)
+{
+    /* TODO current->vcpu_info->evtchn_upcall_mask = 0; */
+}
+
+/* No arch specific virq definition now. Default to global. */
+static inline int arch_virq_is_global(int virq)
+{
+    return 1;
+}
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/flushtlb.h b/xen/include/asm-arm/flushtlb.h
new file mode 100644
index 0000000..c8486fc
--- /dev/null
+++ b/xen/include/asm-arm/flushtlb.h
@@ -0,0 +1,31 @@
+#ifndef __FLUSHTLB_H__
+#define __FLUSHTLB_H__
+
+#include <xen/cpumask.h>
+
+/*
+ * Filter the given set of CPUs, removing those that definitely flushed their
+ * TLB since @page_timestamp.
+ */
+/* XXX lazy implementation just doesn't clear anything.... */
+#define tlbflush_filter(mask, page_timestamp)                           \
+do {                                                                    \
+} while ( 0 )
+
+#define tlbflush_current_time()                 (0)
+
+/* Flush local TLBs */
+void flush_tlb_local(void);
+
+/* Flush specified CPUs' TLBs */
+void flush_tlb_mask(const cpumask_t *mask);
+
+#endif /* __FLUSHTLB_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h
new file mode 100644
index 0000000..8f6ffd8
--- /dev/null
+++ b/xen/include/asm-arm/grant_table.h
@@ -0,0 +1,35 @@
+#ifndef __ASM_GRANT_TABLE_H__
+#define __ASM_GRANT_TABLE_H__
+
+#include <xen/grant_table.h>
+
+#define INVALID_GFN (-1UL)
+#define INITIAL_NR_GRANT_FRAMES 1
+
+void gnttab_clear_flag(unsigned long nr, uint16_t *addr);
+int create_grant_host_mapping(unsigned long gpaddr,
+		unsigned long mfn, unsigned int flags, unsigned int
+		cache_flags);
+#define gnttab_host_mapping_get_page_type(op, d, rd) (0)
+int replace_grant_host_mapping(unsigned long gpaddr, unsigned long mfn,
+		unsigned long new_gpaddr, unsigned int flags);
+void gnttab_mark_dirty(struct domain *d, unsigned long l);
+#define gnttab_create_status_page(d, t, i) (0)
+#define gnttab_create_shared_page(d, t, i) (0)
+#define gnttab_shared_gmfn(d, t, i) (0)
+#define gnttab_status_gmfn(d, t, i) (0)
+#define gnttab_release_host_mappings(domain) 1
+static inline int replace_grant_supported(void)
+{
+    return 1;
+}
+
+#endif /* __ASM_GRANT_TABLE_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/hardirq.h b/xen/include/asm-arm/hardirq.h
new file mode 100644
index 0000000..9c031a8
--- /dev/null
+++ b/xen/include/asm-arm/hardirq.h
@@ -0,0 +1,28 @@
+#ifndef __ASM_HARDIRQ_H
+#define __ASM_HARDIRQ_H
+
+#include <xen/config.h>
+#include <xen/cache.h>
+#include <xen/smp.h>
+
+typedef struct {
+        unsigned long __softirq_pending;
+        unsigned int __local_irq_count;
+} __cacheline_aligned irq_cpustat_t;
+
+#include <xen/irq_cpustat.h>    /* Standard mappings for irq_cpustat_t above */
+
+#define in_irq() (local_irq_count(smp_processor_id()) != 0)
+
+#define irq_enter()     (local_irq_count(smp_processor_id())++)
+#define irq_exit()      (local_irq_count(smp_processor_id())--)
+
+#endif /* __ASM_HARDIRQ_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/hypercall.h b/xen/include/asm-arm/hypercall.h
new file mode 100644
index 0000000..90a87ef
--- /dev/null
+++ b/xen/include/asm-arm/hypercall.h
@@ -0,0 +1,24 @@
+#ifndef __ASM_ARM_HYPERCALL_H__
+#define __ASM_ARM_HYPERCALL_H__
+
+#include <public/domctl.h> /* for arch_do_domctl */
+
+struct vcpu;
+extern long
+arch_do_vcpu_op(
+    int cmd, struct vcpu *v, XEN_GUEST_HANDLE(void) arg);
+
+extern long
+arch_do_sysctl(
+    struct xen_sysctl *op,
+    XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl);
+
+#endif /* __ASM_ARM_HYPERCALL_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/init.h b/xen/include/asm-arm/init.h
new file mode 100644
index 0000000..5f44929
--- /dev/null
+++ b/xen/include/asm-arm/init.h
@@ -0,0 +1,12 @@
+#ifndef _XEN_ASM_INIT_H
+#define _XEN_ASM_INIT_H
+
+#endif /* _XEN_ASM_INIT_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/io.h b/xen/include/asm-arm/io.h
new file mode 100644
index 0000000..1babbab
--- /dev/null
+++ b/xen/include/asm-arm/io.h
@@ -0,0 +1,12 @@
+#ifndef _ASM_IO_H
+#define _ASM_IO_H
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/iocap.h b/xen/include/asm-arm/iocap.h
new file mode 100644
index 0000000..f647f30
--- /dev/null
+++ b/xen/include/asm-arm/iocap.h
@@ -0,0 +1,20 @@
+#ifndef __X86_IOCAP_H__
+#define __X86_IOCAP_H__
+
+#define cache_flush_permitted(d)                        \
+    (!rangeset_is_empty((d)->iomem_caps))
+
+#define multipage_allocation_permitted(d, order)        \
+    (((order) <= 9) || /* allow 2MB superpages */       \
+     !rangeset_is_empty((d)->iomem_caps))
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/multicall.h b/xen/include/asm-arm/multicall.h
new file mode 100644
index 0000000..c800940
--- /dev/null
+++ b/xen/include/asm-arm/multicall.h
@@ -0,0 +1,23 @@
+#ifndef __ASM_ARM_MULTICALL_H__
+#define __ASM_ARM_MULTICALL_H__
+
+#define do_multicall_call(_call)                             \
+    do {                                                     \
+        __asm__ __volatile__ (                               \
+            ".word 0xe7f000f0@; do_multicall_call\n"         \
+            "    mov r0,#0; @ do_multicall_call\n"           \
+            "    str r0, [r0];\n"                            \
+            :                                                \
+            :                                                \
+            : );                                             \
+    } while ( 0 )
+
+#endif /* __ASM_ARM_MULTICALL_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/nmi.h b/xen/include/asm-arm/nmi.h
new file mode 100644
index 0000000..e0f19f9
--- /dev/null
+++ b/xen/include/asm-arm/nmi.h
@@ -0,0 +1,15 @@
+#ifndef ASM_NMI_H
+#define ASM_NMI_H
+
+#define register_guest_nmi_callback(a)  (-ENOSYS)
+#define unregister_guest_nmi_callback() (-ENOSYS)
+
+#endif /* ASM_NMI_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/numa.h b/xen/include/asm-arm/numa.h
new file mode 100644
index 0000000..cffee5c
--- /dev/null
+++ b/xen/include/asm-arm/numa.h
@@ -0,0 +1,21 @@
+#ifndef __ARCH_ARM_NUMA_H
+#define __ARCH_ARM_NUMA_H
+
+/* Fake one node for now... */
+#define cpu_to_node(cpu) 0
+#define node_to_cpumask(node)	(cpu_online_map)
+
+static inline __attribute__((pure)) int phys_to_nid(paddr_t addr)
+{
+        return 0;
+}
+
+#endif /* __ARCH_ARM_NUMA_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/paging.h b/xen/include/asm-arm/paging.h
new file mode 100644
index 0000000..4dc340f
--- /dev/null
+++ b/xen/include/asm-arm/paging.h
@@ -0,0 +1,13 @@
+#ifndef _XEN_PAGING_H
+#define _XEN_PAGING_H
+
+#endif /* XEN_PAGING_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/percpu.h b/xen/include/asm-arm/percpu.h
new file mode 100644
index 0000000..9d369eb
--- /dev/null
+++ b/xen/include/asm-arm/percpu.h
@@ -0,0 +1,28 @@
+#ifndef __ARM_PERCPU_H__
+#define __ARM_PERCPU_H__
+
+#ifndef __ASSEMBLY__
+extern char __per_cpu_start[], __per_cpu_data_end[];
+extern unsigned long __per_cpu_offset[NR_CPUS];
+void percpu_init_areas(void);
+#endif
+
+/* Separate out the type, so (int[3], foo) works. */
+#define __DEFINE_PER_CPU(type, name, suffix)                    \
+    __attribute__((__section__(".bss.percpu" #suffix)))         \
+    __typeof__(type) per_cpu_##name
+
+#define per_cpu(var, cpu) ((&per_cpu__##var)[cpu?0:0])
+#define __get_cpu_var(var) per_cpu__##var
+
+#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
+
+#endif /* __ARM_PERCPU_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/processor.h b/xen/include/asm-arm/processor.h
new file mode 100644
index 0000000..1f85d31
--- /dev/null
+++ b/xen/include/asm-arm/processor.h
@@ -0,0 +1,269 @@
+#ifndef __ASM_ARM_PROCESSOR_H
+#define __ASM_ARM_PROCESSOR_H
+
+#include <asm/cpregs.h>
+
+/* PSR bits (CPSR, SPSR)*/
+
+/* 0-4: Mode */
+#define PSR_MODE_MASK 0x1f
+#define PSR_MODE_USR 0x10
+#define PSR_MODE_FIQ 0x11
+#define PSR_MODE_IRQ 0x12
+#define PSR_MODE_SVC 0x13
+#define PSR_MODE_MON 0x16
+#define PSR_MODE_ABT 0x17
+#define PSR_MODE_HYP 0x1a
+#define PSR_MODE_UND 0x1b
+#define PSR_MODE_SYS 0x1f
+
+#define PSR_THUMB        (1<<5)        /* Thumb Mode enable */
+#define PSR_FIQ_MASK        (1<<6)        /* Fast Interrupt mask */
+#define PSR_IRQ_MASK        (1<<7)        /* Interrupt mask */
+#define PSR_ABT_MASK         (1<<8)        /* Asynchronous Abort mask */
+#define PSR_BIG_ENDIAN        (1<<9)        /* Big Endian Mode */
+#define PSR_JAZELLE        (1<<24)        /* Jazelle Mode */
+
+/* TTBCR Translation Table Base Control Register */
+#define TTBCR_N_MASK 0x07
+#define TTBCR_N_16KB 0x00
+#define TTBCR_N_8KB  0x01
+#define TTBCR_N_4KB  0x02
+#define TTBCR_N_2KB  0x03
+#define TTBCR_N_1KB  0x04
+
+/* SCTLR System Control Register. */
+/* HSCTLR is a subset of this. */
+#define SCTLR_TE        (1<<30)
+#define SCTLR_AFE        (1<<29)
+#define SCTLR_TRE        (1<<28)
+#define SCTLR_NMFI        (1<<27)
+#define SCTLR_EE        (1<<25)
+#define SCTLR_VE        (1<<24)
+#define SCTLR_U                (1<<22)
+#define SCTLR_FI        (1<<21)
+#define SCTLR_WXN        (1<<19)
+#define SCTLR_HA        (1<<17)
+#define SCTLR_RR        (1<<14)
+#define SCTLR_V                (1<<13)
+#define SCTLR_I                (1<<12)
+#define SCTLR_Z                (1<<11)
+#define SCTLR_SW        (1<<10)
+#define SCTLR_B                (1<<7)
+#define SCTLR_C                (1<<2)
+#define SCTLR_A                (1<<1)
+#define SCTLR_M                (1<<0)
+
+#define SCTLR_BASE        0x00c50078
+#define HSCTLR_BASE        0x30c51878
+
+/* HCR Hyp Configuration Register */
+#define HCR_TGE                (1<<27)
+#define HCR_TVM                (1<<26)
+#define HCR_TTLB        (1<<25)
+#define HCR_TPU                (1<<24)
+#define HCR_TPC                (1<<23)
+#define HCR_TSW                (1<<22)
+#define HCR_TAC                (1<<21)
+#define HCR_TIDCP        (1<<20)
+#define HCR_TSC                (1<<19)
+#define HCR_TID3        (1<<18)
+#define HCR_TID2        (1<<17)
+#define HCR_TID1        (1<<16)
+#define HCR_TID0        (1<<15)
+#define HCR_TWE                (1<<14)
+#define HCR_TWI                (1<<13)
+#define HCR_DC                (1<<12)
+#define HCR_BSU_MASK        (3<<10)
+#define HCR_FB                (1<<9)
+#define HCR_VA                (1<<8)
+#define HCR_VI                (1<<7)
+#define HCR_VF                (1<<6)
+#define HCR_AMO                (1<<5)
+#define HCR_IMO                (1<<4)
+#define HCR_FMO                (1<<3)
+#define HCR_PTW                (1<<2)
+#define HCR_SWIO        (1<<1)
+#define HCR_VM                (1<<0)
+
+#define HSR_EC_WFI_WFE              0x01
+#define HSR_EC_CP15_32              0x03
+#define HSR_EC_CP15_64              0x04
+#define HSR_EC_CP14_32              0x05
+#define HSR_EC_CP14_DBG             0x06
+#define HSR_EC_CP                   0x07
+#define HSR_EC_CP10                 0x08
+#define HSR_EC_JAZELLE              0x09
+#define HSR_EC_BXJ                  0x0a
+#define HSR_EC_CP14_64              0x0c
+#define HSR_EC_SVC                  0x11
+#define HSR_EC_HVC                  0x12
+#define HSR_EC_INSTR_ABORT_GUEST    0x20
+#define HSR_EC_INSTR_ABORT_HYP      0x21
+#define HSR_EC_DATA_ABORT_GUEST     0x24
+#define HSR_EC_DATA_ABORT_HYP       0x25
+
+#ifndef __ASSEMBLY__
+union hsr {
+    uint32_t bits;
+    struct {
+        unsigned long iss:25;  /* Instruction Specific Syndrome */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    };
+
+    struct hsr_cp32 {
+        unsigned long read:1;  /* Direction */
+        unsigned long crm:4;   /* CRm */
+        unsigned long reg:4;   /* Rt */
+        unsigned long sbzp:1;
+        unsigned long crn:4;   /* CRn */
+        unsigned long op1:3;   /* Op1 */
+        unsigned long op2:3;   /* Op2 */
+        unsigned long cc:4;    /* Condition Code */
+        unsigned long ccvalid:1;/* CC Valid */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    } cp32; /* HSR_EC_CP15_32, CP14_32, CP10 */
+
+    struct hsr_cp64 {
+        unsigned long read:1;   /* Direction */
+        unsigned long crm:4;    /* CRm */
+        unsigned long reg1:4;   /* Rt1 */
+        unsigned long sbzp1:1;
+        unsigned long reg2:4;   /* Rt2 */
+        unsigned long sbzp2:2;
+        unsigned long op1:4;   /* Op1 */
+        unsigned long cc:4;    /* Condition Code */
+        unsigned long ccvalid:1;/* CC Valid */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    } cp64; /* HSR_EC_CP15_64, HSR_EC_CP14_64 */
+
+    struct hsr_dabt {
+        unsigned long dfsc:6;  /* Data Fault Status Code */
+        unsigned long write:1; /* Write / not Read */
+        unsigned long s1ptw:1; /* */
+        unsigned long cache:1; /* Cache Maintenance */
+        unsigned long eat:1;   /* External Abort Type */
+        unsigned long sbzp0:6;
+        unsigned long reg:4;   /* Register */
+        unsigned long sbzp1:1;
+        unsigned long sign:1;  /* Sign extend */
+        unsigned long size:2;  /* Access Size */
+        unsigned long valid:1; /* Syndrome Valid */
+        unsigned long len:1;   /* Instruction length */
+        unsigned long ec:6;    /* Exception Class */
+    } dabt; /* HSR_EC_DATA_ABORT_* */
+};
+#endif
+
+/* HSR.EC == HSR_CP{15,14,10}_32 */
+#define HSR_CP32_OP2_MASK (0x000e0000)
+#define HSR_CP32_OP2_SHIFT (17)
+#define HSR_CP32_OP1_MASK (0x0001c000)
+#define HSR_CP32_OP1_SHIFT (14)
+#define HSR_CP32_CRN_MASK (0x00003c00)
+#define HSR_CP32_CRN_SHIFT (10)
+#define HSR_CP32_CRM_MASK (0x0000001e)
+#define HSR_CP32_CRM_SHIFT (1)
+#define HSR_CP32_REGS_MASK (HSR_CP32_OP1_MASK|HSR_CP32_OP2_MASK|\
+                            HSR_CP32_CRN_MASK|HSR_CP32_CRM_MASK)
+
+/* HSR.EC == HSR_CP{15,14}_64 */
+#define HSR_CP64_OP1_MASK (0x000f0000)
+#define HSR_CP64_OP1_SHIFT (16)
+#define HSR_CP64_CRM_MASK (0x0000001e)
+#define HSR_CP64_CRM_SHIFT (1)
+#define HSR_CP64_REGS_MASK (HSR_CP64_OP1_MASK|HSR_CP64_CRM_MASK)
+
+/* Physical Address Register */
+#define PAR_F           (1<<0)
+
+/* .... If F == 1 */
+#define PAR_FSC_SHIFT   (1)
+#define PAR_FSC_MASK    (0x3f<<PAR_FSC_SHIFT)
+#define PAR_STAGE21     (1<<8)     /* Stage 2 Fault During Stage 1 Walk */
+#define PAR_STAGE2      (1<<9)     /* Stage 2 Fault */
+
+/* If F == 0 */
+#define PAR_MAIR_SHIFT  56                       /* Memory Attributes */
+#define PAR_MAIR_MASK   (0xffLL<<PAR_MAIR_SHIFT)
+#define PAR_NS          (1<<9)                   /* Non-Secure */
+#define PAR_SH_SHIFT    7                        /* Shareability */
+#define PAR_SH_MASK     (3<<PAR_SH_SHIFT)
+
+/* Fault Status Register */
+/*
+ * 543210 BIT
+ * 00XXLL -- XX Fault Level LL
+ * ..01LL -- Translation Fault LL
+ * ..10LL -- Access Fault LL
+ * ..11LL -- Permission Fault LL
+ * 01xxxx -- Abort/Parity
+ * 10xxxx -- Other
+ * 11xxxx -- Implementation Defined
+ */
+#define FSC_TYPE_MASK (0x3<<4)
+#define FSC_TYPE_FAULT (0x00<<4)
+#define FSC_TYPE_ABT   (0x01<<4)
+#define FSC_TYPE_OTH   (0x02<<4)
+#define FSC_TYPE_IMPL  (0x03<<4)
+
+#define FSC_FLT_TRANS  (0x04)
+#define FSC_FLT_ACCESS (0x08)
+#define FSC_FLT_PERM   (0x0c)
+#define FSC_SEA        (0x10) /* Synchronous External Abort */
+#define FSC_SPE        (0x18) /* Memory Access Synchronous Parity Error */
+#define FSC_APE        (0x11) /* Memory Access Asynchronous Parity Error */
+#define FSC_SEATT      (0x14) /* Sync. Ext. Abort Translation Table */
+#define FSC_SPETT      (0x1c) /* Sync. Parity. Error Translation Table */
+#define FSC_AF         (0x21) /* Alignment Fault */
+#define FSC_DE         (0x22) /* Debug Event */
+#define FSC_LKD        (0x34) /* Lockdown Abort */
+#define FSC_CPR        (0x3a) /* Coprocossor Abort */
+
+#define FSC_LL_MASK    (0x03<<0)
+
+/* Time counter hypervisor control register */
+#define CNTHCTL_PA      (1u<<0)  /* Kernel/user access to physical counter */
+#define CNTHCTL_TA      (1u<<1)  /* Kernel/user access to CNTP timer */
+
+/* Timer control registers */
+#define CNTx_CTL_ENABLE   (1u<<0)  /* Enable timer */
+#define CNTx_CTL_MASK     (1u<<1)  /* Mask IRQ */
+#define CNTx_CTL_PENDING  (1u<<2)  /* IRQ pending */
+
+/* CPUID bits */
+#define ID_PFR1_GT_MASK  0x000F0000  /* Generic Timer interface support */
+#define ID_PFR1_GT_v1    0x00010000
+
+#define MSR(reg,val)        asm volatile ("msr "#reg", %0\n" : : "r" (val))
+#define MRS(val,reg)        asm volatile ("mrs %0,"#reg"\n" : "=r" (v))
+
+#ifndef __ASSEMBLY__
+extern uint32_t hyp_traps_vector[8];
+
+void panic_PAR(uint64_t par, const char *when);
+
+void show_execution_state(struct cpu_user_regs *regs);
+void show_registers(struct cpu_user_regs *regs);
+//#define dump_execution_state() run_in_exception_handler(show_execution_state)
+#define dump_execution_state() asm volatile (".word 0xe7f000f0\n"); /* XXX */
+
+#define cpu_relax() barrier() /* Could yield? */
+
+/* All a bit UP for the moment */
+#define cpu_to_core(_cpu)   (0)
+#define cpu_to_socket(_cpu) (0)
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ASM_ARM_PROCESSOR_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/regs.h b/xen/include/asm-arm/regs.h
new file mode 100644
index 0000000..ee095bf
--- /dev/null
+++ b/xen/include/asm-arm/regs.h
@@ -0,0 +1,43 @@
+#ifndef __ARM_REGS_H__
+#define __ARM_REGS_H__
+
+#include <xen/types.h>
+#include <public/xen.h>
+#include <asm/processor.h>
+
+#define psr_mode(psr,m) (((psr) & PSR_MODE_MASK) == m)
+
+#define usr_mode(r)     psr_mode((r)->cpsr,PSR_MODE_USR)
+#define fiq_mode(r)     psr_mode((r)->cpsr,PSR_MODE_FIQ)
+#define irq_mode(r)     psr_mode((r)->cpsr,PSR_MODE_IRQ)
+#define svc_mode(r)     psr_mode((r)->cpsr,PSR_MODE_SVC)
+#define mon_mode(r)     psr_mode((r)->cpsr,PSR_MODE_MON)
+#define abt_mode(r)     psr_mode((r)->cpsr,PSR_MODE_ABT)
+#define hyp_mode(r)     psr_mode((r)->cpsr,PSR_MODE_HYP)
+#define und_mode(r)     psr_mode((r)->cpsr,PSR_MODE_UND)
+#define sys_mode(r)     psr_mode((r)->cpsr,PSR_MODE_SYS)
+
+#define guest_mode(r)                                                         \
+({                                                                            \
+    unsigned long diff = (char *)guest_cpu_user_regs() - (char *)(r);         \
+    /* Frame pointer must point into current CPU stack. */                    \
+    ASSERT(diff < STACK_SIZE);                                                \
+    /* If not a guest frame, it must be a hypervisor frame. */                \
+    ASSERT((diff == 0) || hyp_mode(r));                                       \
+    /* Return TRUE if it's a guest frame. */                                  \
+    (diff == 0);                                                              \
+})
+
+#define return_reg(v) ((v)->arch.user_regs.r0)
+
+#define CTXT_SWITCH_STACK_BYTES (sizeof(struct cpu_user_regs))
+
+#endif /* __ARM_REGS_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
new file mode 100644
index 0000000..c27d438
--- /dev/null
+++ b/xen/include/asm-arm/setup.h
@@ -0,0 +1,16 @@
+#ifndef __ARM_SETUP_H_
+#define __ARM_SETUP_H_
+
+#include <public/version.h>
+
+void arch_get_xen_caps(xen_capabilities_info_t *info);
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/smp.h b/xen/include/asm-arm/smp.h
new file mode 100644
index 0000000..9cdd87f
--- /dev/null
+++ b/xen/include/asm-arm/smp.h
@@ -0,0 +1,25 @@
+#ifndef __ASM_SMP_H
+#define __ASM_SMP_H
+
+#ifndef __ASSEMBLY__
+#include <xen/config.h>
+#include <xen/cpumask.h>
+#include <asm/current.h>
+#endif
+
+DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_mask);
+DECLARE_PER_CPU(cpumask_var_t, cpu_core_mask);
+
+#define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
+
+#define raw_smp_processor_id() (get_processor_id())
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/softirq.h b/xen/include/asm-arm/softirq.h
new file mode 100644
index 0000000..536af38
--- /dev/null
+++ b/xen/include/asm-arm/softirq.h
@@ -0,0 +1,15 @@
+#ifndef __ASM_SOFTIRQ_H__
+#define __ASM_SOFTIRQ_H__
+
+#define VGIC_SOFTIRQ        (NR_COMMON_SOFTIRQS + 0)
+#define NR_ARCH_SOFTIRQS       1
+
+#endif /* __ASM_SOFTIRQ_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/spinlock.h b/xen/include/asm-arm/spinlock.h
new file mode 100644
index 0000000..b1825c9
--- /dev/null
+++ b/xen/include/asm-arm/spinlock.h
@@ -0,0 +1,144 @@
+#ifndef __ASM_SPINLOCK_H
+#define __ASM_SPINLOCK_H
+
+#include <xen/config.h>
+#include <xen/lib.h>
+
+static inline void dsb_sev(void)
+{
+    __asm__ __volatile__ (
+        "dsb\n"
+        "sev\n"
+        );
+}
+
+typedef struct {
+    volatile unsigned int lock;
+} raw_spinlock_t;
+
+#define _RAW_SPIN_LOCK_UNLOCKED { 0 }
+
+#define _raw_spin_is_locked(x)          ((x)->lock != 0)
+
+static always_inline void _raw_spin_unlock(raw_spinlock_t *lock)
+{
+    ASSERT(_raw_spin_is_locked(lock));
+
+    smp_mb();
+
+    __asm__ __volatile__(
+"   str     %1, [%0]\n"
+    :
+    : "r" (&lock->lock), "r" (0)
+    : "cc");
+
+    dsb_sev();
+}
+
+static always_inline int _raw_spin_trylock(raw_spinlock_t *lock)
+{
+    unsigned long tmp;
+
+    __asm__ __volatile__(
+"   ldrex   %0, [%1]\n"
+"   teq     %0, #0\n"
+"   strexeq %0, %2, [%1]"
+    : "=&r" (tmp)
+    : "r" (&lock->lock), "r" (1)
+    : "cc");
+
+    if (tmp == 0) {
+        smp_mb();
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+typedef struct {
+    volatile unsigned int lock;
+} raw_rwlock_t;
+
+#define _RAW_RW_LOCK_UNLOCKED { 0 }
+
+static always_inline int _raw_read_trylock(raw_rwlock_t *rw)
+{
+    unsigned long tmp, tmp2 = 1;
+
+    __asm__ __volatile__(
+"1: ldrex   %0, [%2]\n"
+"   adds    %0, %0, #1\n"
+"   strexpl %1, %0, [%2]\n"
+    : "=&r" (tmp), "+r" (tmp2)
+    : "r" (&rw->lock)
+    : "cc");
+
+    smp_mb();
+    return tmp2 == 0;
+}
+
+static always_inline int _raw_write_trylock(raw_rwlock_t *rw)
+{
+    unsigned long tmp;
+
+    __asm__ __volatile__(
+"1: ldrex   %0, [%1]\n"
+"   teq     %0, #0\n"
+"   strexeq %0, %2, [%1]"
+    : "=&r" (tmp)
+    : "r" (&rw->lock), "r" (0x80000000)
+    : "cc");
+
+    if (tmp == 0) {
+        smp_mb();
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+static inline void _raw_read_unlock(raw_rwlock_t *rw)
+{
+    unsigned long tmp, tmp2;
+
+    smp_mb();
+
+    __asm__ __volatile__(
+"1: ldrex   %0, [%2]\n"
+"   sub     %0, %0, #1\n"
+"   strex   %1, %0, [%2]\n"
+"   teq     %1, #0\n"
+"   bne     1b"
+    : "=&r" (tmp), "=&r" (tmp2)
+    : "r" (&rw->lock)
+    : "cc");
+
+    if (tmp == 0)
+        dsb_sev();
+}
+
+static inline void _raw_write_unlock(raw_rwlock_t *rw)
+{
+    smp_mb();
+
+    __asm__ __volatile__(
+    "str    %1, [%0]\n"
+    :
+    : "r" (&rw->lock), "r" (0)
+    : "cc");
+
+    dsb_sev();
+}
+
+#define _raw_rw_is_locked(x) ((x)->lock != 0)
+#define _raw_rw_is_write_locked(x) ((x)->lock == 0x80000000)
+
+#endif /* __ASM_SPINLOCK_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/string.h b/xen/include/asm-arm/string.h
new file mode 100644
index 0000000..f2d643d
--- /dev/null
+++ b/xen/include/asm-arm/string.h
@@ -0,0 +1,38 @@
+#ifndef __ARM_STRING_H__
+#define __ARM_STRING_H__
+
+#include <xen/config.h>
+
+#define __HAVE_ARCH_MEMCPY
+extern void * memcpy(void *, const void *, __kernel_size_t);
+
+/* Some versions of gcc don't have this builtin. It's non-critical anyway. */
+#define __HAVE_ARCH_MEMMOVE
+extern void *memmove(void *dest, const void *src, size_t n);
+
+#define __HAVE_ARCH_MEMSET
+extern void * memset(void *, int, __kernel_size_t);
+
+extern void __memzero(void *ptr, __kernel_size_t n);
+
+#define memset(p,v,n)                                                   \
+        ({                                                              \
+                void *__p = (p); size_t __n = n;                        \
+                if ((__n) != 0) {                                       \
+                        if (__builtin_constant_p((v)) && (v) == 0)      \
+                                __memzero((__p),(__n));                 \
+                        else                                            \
+                                memset((__p),(v),(__n));                \
+                }                                                       \
+                (__p);                                                  \
+        })
+
+#endif /* __ARM_STRING_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/system.h b/xen/include/asm-arm/system.h
new file mode 100644
index 0000000..731d89f
--- /dev/null
+++ b/xen/include/asm-arm/system.h
@@ -0,0 +1,202 @@
+/* Portions taken from Linux arch arm */
+#ifndef __ASM_SYSTEM_H
+#define __ASM_SYSTEM_H
+
+#include <xen/lib.h>
+#include <asm/processor.h>
+
+#define nop() \
+    asm volatile ( "nop" )
+
+#define xchg(ptr,x) \
+        ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
+
+#define isb() __asm__ __volatile__ ("isb" : : : "memory")
+#define dsb() __asm__ __volatile__ ("dsb" : : : "memory")
+#define dmb() __asm__ __volatile__ ("dmb" : : : "memory")
+
+#define mb()            dsb()
+#define rmb()           dsb()
+#define wmb()           mb()
+
+#define smp_mb()        dmb()
+#define smp_rmb()       dmb()
+#define smp_wmb()       dmb()
+
+/*
+ * This is used to ensure the compiler did actually allocate the register we
+ * asked it for some inline assembly sequences.  Apparently we can't trust
+ * the compiler from one version to another so a bit of paranoia won't hurt.
+ * This string is meant to be concatenated with the inline asm string and
+ * will cause compilation to stop on mismatch.
+ * (for details, see gcc PR 15089)
+ */
+#define __asmeq(x, y)  ".ifnc " x "," y " ; .err ; .endif\n\t"
+
+extern void __bad_xchg(volatile void *, int);
+
+static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
+{
+        unsigned long ret;
+        unsigned int tmp;
+
+        smp_mb();
+
+        switch (size) {
+        case 1:
+                asm volatile("@ __xchg1\n"
+                "1:     ldrexb  %0, [%3]\n"
+                "       strexb  %1, %2, [%3]\n"
+                "       teq     %1, #0\n"
+                "       bne     1b"
+                        : "=&r" (ret), "=&r" (tmp)
+                        : "r" (x), "r" (ptr)
+                        : "memory", "cc");
+                break;
+        case 4:
+                asm volatile("@ __xchg4\n"
+                "1:     ldrex   %0, [%3]\n"
+                "       strex   %1, %2, [%3]\n"
+                "       teq     %1, #0\n"
+                "       bne     1b"
+                        : "=&r" (ret), "=&r" (tmp)
+                        : "r" (x), "r" (ptr)
+                        : "memory", "cc");
+                break;
+        default:
+                __bad_xchg(ptr, size), ret = 0;
+                break;
+        }
+        smp_mb();
+
+        return ret;
+}
+
+/*
+ * Atomic compare and exchange.  Compare OLD with MEM, if identical,
+ * store NEW in MEM.  Return the initial value in MEM.  Success is
+ * indicated by comparing RETURN with OLD.
+ */
+
+extern void __bad_cmpxchg(volatile void *ptr, int size);
+
+static always_inline unsigned long __cmpxchg(
+    volatile void *ptr, unsigned long old, unsigned long new, int size)
+{
+    unsigned long /*long*/ oldval, res;
+
+    switch (size) {
+    case 1:
+        do {
+            asm volatile("@ __cmpxchg1\n"
+                         "       ldrexb  %1, [%2]\n"
+                         "       mov     %0, #0\n"
+                         "       teq     %1, %3\n"
+                         "       strexbeq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+    case 2:
+        do {
+            asm volatile("@ __cmpxchg2\n"
+                         "       ldrexh  %1, [%2]\n"
+                         "       mov     %0, #0\n"
+                         "       teq     %1, %3\n"
+                         "       strexheq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+    case 4:
+        do {
+            asm volatile("@ __cmpxchg4\n"
+                         "       ldrex   %1, [%2]\n"
+                         "       mov     %0, #0\n"
+                         "       teq     %1, %3\n"
+                         "       strexeq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+#if 0
+    case 8:
+        do {
+            asm volatile("@ __cmpxchg8\n"
+                         "       ldrexd   %1, [%2]\n"
+                         "       mov      %0, #0\n"
+                         "       teq      %1, %3\n"
+                         "       strexdeq %0, %4, [%2]\n"
+                         : "=&r" (res), "=&r" (oldval)
+                         : "r" (ptr), "Ir" (old), "r" (new)
+                         : "memory", "cc");
+        } while (res);
+        break;
+#endif
+    default:
+        __bad_cmpxchg(ptr, size);
+        oldval = 0;
+    }
+
+    return oldval;
+}
+#define cmpxchg(ptr,o,n)                                                \
+    ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),            \
+                                   (unsigned long)(n),sizeof(*(ptr))))
+
+#define local_irq_disable() asm volatile ( "cpsid i @ local_irq_disable\n" : : : "cc" )
+#define local_irq_enable()  asm volatile ( "cpsie i @ local_irq_enable\n" : : : "cc" )
+
+#define local_save_flags(x)                                      \
+({                                                               \
+    BUILD_BUG_ON(sizeof(x) != sizeof(long));                     \
+    asm volatile ( "mrs %0, cpsr     @ local_save_flags\n"       \
+                  : "=r" (x) :: "memory", "cc" );                \
+})
+#define local_irq_save(x)                                        \
+({                                                               \
+    local_save_flags(x);                                         \
+    local_irq_disable();                                         \
+})
+#define local_irq_restore(x)                                     \
+({                                                               \
+    BUILD_BUG_ON(sizeof(x) != sizeof(long));                     \
+    asm volatile (                                               \
+            "msr     cpsr_c, %0      @ local_irq_restore\n"      \
+            :                                                    \
+            : "r" (flags)                                        \
+            : "memory", "cc");                                   \
+})
+
+static inline int local_irq_is_enabled(void)
+{
+    unsigned long flags;
+    local_save_flags(flags);
+    return !(flags & PSR_IRQ_MASK);
+}
+
+#define local_fiq_enable()  __asm__("cpsie f   @ __stf\n" : : : "memory", "cc")
+#define local_fiq_disable() __asm__("cpsid f   @ __clf\n" : : : "memory", "cc")
+
+#define local_abort_enable() __asm__("cpsie a  @ __sta\n" : : : "memory", "cc")
+#define local_abort_disable() __asm__("cpsid a @ __sta\n" : : : "memory", "cc")
+
+static inline int local_fiq_is_enabled(void)
+{
+    unsigned long flags;
+    local_save_flags(flags);
+    return !!(flags & PSR_FIQ_MASK);
+}
+
+#endif
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/trace.h b/xen/include/asm-arm/trace.h
new file mode 100644
index 0000000..db84541
--- /dev/null
+++ b/xen/include/asm-arm/trace.h
@@ -0,0 +1,12 @@
+#ifndef __ASM_TRACE_H__
+#define __ASM_TRACE_H__
+
+#endif /* __ASM_TRACE_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/types.h b/xen/include/asm-arm/types.h
new file mode 100644
index 0000000..48864f9
--- /dev/null
+++ b/xen/include/asm-arm/types.h
@@ -0,0 +1,57 @@
+#ifndef __ARM_TYPES_H__
+#define __ARM_TYPES_H__
+
+#ifndef __ASSEMBLY__
+
+#include <xen/config.h>
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+typedef signed char s8;
+typedef unsigned char u8;
+
+typedef signed short s16;
+typedef unsigned short u16;
+
+typedef signed int s32;
+typedef unsigned int u32;
+
+typedef signed long long s64;
+typedef unsigned long long u64;
+typedef u64 paddr_t;
+#define INVALID_PADDR (~0ULL)
+#define PRIpaddr "016llx"
+
+typedef unsigned long size_t;
+
+typedef char bool_t;
+#define test_and_set_bool(b)   xchg(&(b), 1)
+#define test_and_clear_bool(b) xchg(&(b), 0)
+
+#endif /* __ASSEMBLY__ */
+
+#define BITS_PER_LONG 32
+#define BYTES_PER_LONG 4
+#define LONG_BYTEORDER 2
+
+#endif /* __ARM_TYPES_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/xenoprof.h b/xen/include/asm-arm/xenoprof.h
new file mode 100644
index 0000000..131ac13
--- /dev/null
+++ b/xen/include/asm-arm/xenoprof.h
@@ -0,0 +1,12 @@
+#ifndef __ASM_XENOPROF_H__
+#define __ASM_XENOPROF_H__
+
+#endif /* __ASM_XENOPROF_H__ */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h
new file mode 100644
index 0000000..4d1daa9
--- /dev/null
+++ b/xen/include/public/arch-arm.h
@@ -0,0 +1,125 @@
+/******************************************************************************
+ * arch-arm.h
+ *
+ * Guest OS interface to ARM Xen.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Copyright 2011 (C) Citrix Systems
+ */
+
+#ifndef __XEN_PUBLIC_ARCH_ARM_H__
+#define __XEN_PUBLIC_ARCH_ARM_H__
+
+#ifndef __ASSEMBLY__
+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
+    typedef struct { type *p; } __guest_handle_ ## name
+
+#define __DEFINE_XEN_GUEST_HANDLE(name, type) \
+    ___DEFINE_XEN_GUEST_HANDLE(name, type);   \
+    ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type)
+#define DEFINE_XEN_GUEST_HANDLE(name)   __DEFINE_XEN_GUEST_HANDLE(name, name)
+#define __XEN_GUEST_HANDLE(name)        __guest_handle_ ## name
+#define XEN_GUEST_HANDLE(name)          __XEN_GUEST_HANDLE(name)
+#define set_xen_guest_handle_raw(hnd, val)  do { (hnd).p = val; } while (0)
+#ifdef __XEN_TOOLS__
+#define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
+#endif
+#define set_xen_guest_handle(hnd, val) set_xen_guest_handle_raw(hnd, val)
+
+struct cpu_user_regs
+{
+    uint32_t r0;
+    uint32_t r1;
+    uint32_t r2;
+    uint32_t r3;
+    uint32_t r4;
+    uint32_t r5;
+    uint32_t r6;
+    uint32_t r7;
+    uint32_t r8;
+    uint32_t r9;
+    uint32_t r10;
+    union {
+	uint32_t r11;
+	uint32_t fp;
+    };
+    uint32_t r12;
+
+    uint32_t sp; /* r13 - SP: Valid for Hyp. frames only, o/w banked (see below) */
+    uint32_t lr; /* r14 - LR: Valid for Hyp. Same physical register as lr_usr. */
+
+    uint32_t pc; /* Return IP */
+    uint32_t cpsr; /* Return mode */
+    uint32_t pad0; /* Doubleword-align the kernel half of the frame */
+
+    /* Outer guest frame only from here on... */
+
+    uint32_t r8_fiq, r9_fiq, r10_fiq, r11_fiq, r12_fiq;
+
+    uint32_t sp_usr, sp_svc, sp_abt, sp_und, sp_irq, sp_fiq;
+    uint32_t lr_usr, lr_svc, lr_abt, lr_und, lr_irq, lr_fiq;
+
+    uint32_t spsr_svc, spsr_abt, spsr_und, spsr_irq, spsr_fiq;
+};
+typedef struct cpu_user_regs cpu_user_regs_t;
+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
+
+typedef uint64_t xen_pfn_t;
+#define PRI_xen_pfn PRIx64
+
+/* Maximum number of virtual CPUs in legacy multi-processor guests. */
+/* Only one. All other VCPUS must use VCPUOP_register_vcpu_info */
+#define XEN_LEGACY_MAX_VCPUS 1
+
+typedef uint32_t xen_ulong_t;
+
+struct vcpu_guest_context {
+    struct cpu_user_regs user_regs;         /* User-level CPU registers     */
+    union {
+	uint32_t reg[16];
+	struct {
+	    uint32_t __pad[12];
+	    uint32_t sp; /* r13 */
+	    uint32_t lr; /* r14 */
+	    uint32_t pc; /* r15 */
+	};
+    };
+};
+typedef struct vcpu_guest_context vcpu_guest_context_t;
+DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
+
+struct arch_vcpu_info { };
+typedef struct arch_vcpu_info arch_vcpu_info_t;
+
+struct arch_shared_info { };
+typedef struct arch_shared_info arch_shared_info_t;
+#endif
+
+#endif /*  __XEN_PUBLIC_ARCH_ARM_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h
index fde9fa5..7196400 100644
--- a/xen/include/public/xen.h
+++ b/xen/include/public/xen.h
@@ -33,6 +33,8 @@
 #include "arch-x86/xen.h"
 #elif defined(__ia64__)
 #include "arch-ia64.h"
+#elif defined(__arm__)
+#include "arch-arm.h"
 #else
 #error "Unsupported architecture"
 #endif
-- 
1.7.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Dec 20 07:31:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Tue, 20 Dec 2011 07:31:17 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1Rcu9k-0006jK-Qd; Tue, 20 Dec 2011 07:30:36 +0000
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xen.org with smtp (Exim 4.72)
	(envelope-from <gbtux@126.com>) id 1Rcu9i-0006jF-Rk
	for xen-devel@lists.xensource.com; Tue, 20 Dec 2011 07:30:35 +0000
X-Env-Sender: gbtux@126.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1324366224!8007457!1
X-Originating-IP: [220.181.15.49]
X-SpamReason: No, hits=1.4 required=7.0 tests=sa_preprocessor: 
	QmFkIElQOiAyMjAuMTgxLjE1LjQ5ID0+IDQ2NTE=\n,sa_preprocessor: 
	QmFkIElQOiAyMjAuMTgxLjE1LjQ5ID0+IDQ2NTE=\n, BODY_RANDOM_LONG, HTML_40_50,
	HTML_MESSAGE,MIME_BASE64_TEXT
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8398 invoked from network); 20 Dec 2011 07:30:25 -0000
Received: from m15-49.126.com (HELO m15-49.126.com) (220.181.15.49)
	by server-10.tower-216.messagelabs.com with SMTP;
	20 Dec 2011 07:30:25 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com;
	s=s110527; h=Received:Date:From:To:Cc:Message-ID:In-Reply-To:
	References:Subject:MIME-Version:Content-Type; bh=r8UOB7gXYgFAWP3
	W+W3A/9Y63X9rCb9aBxEpA8IZoW0=; b=PNhN8K8obt+NQjUgdJcjfmyMVRA6k7o
	eoHutIoozyYbZfffus3gunwrOtDgb39Qpd4+PscXPwYf9X3adXHosuSlZuIs4H3B
	LU13rdt/O3mRGFyUmShuvNl/Tc2h+4p5d0bXTw/wtw3FY93pH+WBxYD4SY05hCu+
	HPPe0trsrotU=
Received: from gbtux ( [124.16.139.196] ) by ajax-webmail-wmsvr49 (Coremail)
	; Tue, 20 Dec 2011 15:30:04 +0800 (CST)
Date: Tue, 20 Dec 2011 15:30:04 +0800 (CST)
From: gavin  <gbtux@126.com>
To: "George Dunlap" <George.Dunlap@eu.citrix.com>
Message-ID: <5097e419.1e4d1.1345a608e69.Coremail.gbtux@126.com>
In-Reply-To: <CAFLBxZZP=K504L86WDJ-F+9SuTf7aKU_C=i8nLZwqDuejoVGag@mail.gmail.com>
References: <CAFLBxZZP=K504L86WDJ-F+9SuTf7aKU_C=i8nLZwqDuejoVGag@mail.gmail.com>
	<26c93838.3b3fb.13445de0e67.Coremail.gbtux@126.com>
	<CAFLBxZYM-8vEc5Egmv+iXqMDUE_UJcgHbwr7=71H-kFowTzXWA@mail.gmail.com>
	<676b608e.2fb26.13447553671.Coremail.gbtux@126.com>
	<CAFLBxZaBiwEvz-dgPzgBQQTj2xMi8m+QnZ3M+uoqw4AKmb0ZvA@mail.gmail.com>
	<35e4701f.ca5a.1344b4ed98e.Coremail.gbtux@126.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_343555_1040962665.1324366204520"
X-Originating-IP: [124.16.139.196]
X-Priority: 3
X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build
	111202(16086.4213.4207) Copyright (c) 2002-2011 www.mailtech.cn 126com
X-CM-CTRLDATA: +yLaI2Zvb3Rlcl9odG09MTM0OTI6ODE=
X-CM-TRANSID: McqowEAZQUV_OfBO3bcXAA--.878W
X-CM-SenderInfo: pjew35a6rslhhfrp/1tbiVwEcnE3l6FM+ZAABse
X-Coremail-Antispam: 1U5529EdanIXcx71UUUUU7vcSsGvfC2KfnxnUU==
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] A question on the credit scheduler
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

------=_Part_343555_1040962665.1324366204520
Content-Type: multipart/alternative; 
	boundary="----=_Part_343557_1060246463.1324366204521"

------=_Part_343557_1060246463.1324366204521
Content-Type: text/plain; charset=GBK
Content-Transfer-Encoding: base64

MSkgTXkgb3JpZ2luYWwgZ29hbCBpcyB0byBjYWxjdWxhdGUgdGhlIHVzYWdlIHBlcmNlbnRhZ2Ug
b2YgQ1BVIGluIGEgZGlmZmVyZW50IHdheSBmcm9tIG90aGVyIHRvb2xzLCBzdWNoIGFzIHhlbnRy
YWNlLgoKQmVjYXVzZSB0aGUgYWltIG9mIGFsbCB0aGUgc2NoZWR1bGluZyBpcyB0byBtYXAgdGhl
IHZDUFUgdG8gcENQVSwgd2UgY2FuIGdldCBhIG1hcHBpbmcgc2VxdWVuY2Ugb2YgcENQVSBhbmQg
dkNQVSBieSBtb25pdG9yaW5nIHRoZSBwQ1BVIGluIGEgZml4ZWQgaW50ZXJ2YWwuIAoKRm9yIGV4
YW1wbGUsIGlmIHRoZSBTQ0hFRFVMRV9TT0ZUSVJRIGlzIGp1c3QgcmFpc2VkIHdoZW4gdGhlIHRp
bWVzbGljZSBpcyBmaW5pc2hlZCwgdGhlIHZDUFUgcnVucyBhcyBkZXNjcmliZWQgaW4gdGhlIGZp
Z3VyZSAxICh0d28gcENQVSBhbmQgdGhyZWUgdkNQVSkuIFdlIG1vbml0b3IgYWxsIHRoZSBDUFVz
IG9uY2UgZXZlcnkgdGltZSB0LCB3aGljaCBpcyBlcXVhbCB0byB0aGUgdGltZSBvZiB0aGUgdGlt
ZXNsaWNlIGhlcmUuIEluIHRlbiB0aW1lc2xpY2UgKG1heWJlIDAuMyBzZWNvbmQgaW4gY3JlZGl0
MSksIHdlIGNhbiBnZXQgdGhlIG1hcHBpbmcgc2VxdWVuY2UsIHdoaWNoIGNvbnRhaW5zIDIwIChw
Q1BVLCB2Q1BVKSBwYWlycyBhcyB0aGUgZm9sbG93aW5nLgoKKHBDUFUxLCB2Q1BVMSksIChwQ1BV
MiwgdkNQVTIpLCAocENQVTEsIHZDUFUxKSwgKHBDUFUyLCBub24pLCAocENQVTEsIHZDUFUxKSwg
KHBDUFUyLCB2Q1BVMyksIChwQ1BVMSwgdkNQVTIpLCAocENQVTIsIG5vbiksIChwQ1BVMSwgbm9u
KSwgKHBDUFUyLCB2Q1BVMiksIChwQ1BVMSwgdkNQVTMpLCAocENQVTIsIG5vbiksIChwQ1BVMSwg
dkNQVTMpLCAocENQVTIsIHZDUFUxKSwgKHBDUFUxLCBub24pLCAocENQVTIsIHZDUFUxKSwgKHBD
UFUxLCB2Q1BVMSksIChwQ1BVMiwgbm9uKSwgKHBDUFUxLCBub24pLCAocENQVTIsIHZDUFUyKaGj
CgpJZiB0aGVyZSBpcyBubyB2Q1BVIG1hcHBlZCBvbiB0aGUgcENQVSwgd2UgdXNlIChwQ1BVKiwg
bm9uKSBwYWlyLCB3aGljaCBtZWFucyB0aGUgcENQVSBpcyBpZGxlLiBJbiB0aGUgYWJvdmUgc2Vx
dWVuY2UsIHRoZXJlIGFyZSA3IGlkbGUgcGFpcnMgaW4gdG90YWwuIAoKU28sIGZyb20gdGhlIGFi
b3ZlIG1hcHBpbmcgc2VxdWVuY2UsIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHVzYWdlIHBlcmNlbnRh
Z2Ugb2YgdGhlIENQVSBpbiB0ZW4gdGltZXNsY2llICgwLjMgc2VuY29uZCkuCgpVc2FnZSBQZXJj
ZW50YWdlID0gKDIwLTcpLzIwID0gNjUlIAoKMikgSWYgd2UgY2FuIGdldCBzdWNoIGEgbWFwcGlu
ZyBzZXF1ZW5jZSBvZiBwQ1BVIGFuZCB2Q1BVLCBiZXNpZGVzIGNhbGN1bGF0aW5nIHRoZSB1c2Fn
ZSBwZXJjZW50YWdlIG9mIENQVSwgbWF5YmUgd2UgYWxzbyBjYW4gZmluZCBzb21lbGF3cyBvZiB0
aGUgbWFwcGluZyBzZXF1ZW5jZSBhbmQgdXNlIHRoZSBsYXdzIHRvIGluZmVyIHRoZSBDUFUtYm91
bmQgdGFzayBhbmQgSS9PLWJvdW5kIHRhc2suIAoKSG93ZXZlciwgdGhpcyBpZGVhIG1heSBub3Qg
d29yay4gQmVjYXVzZSB0aGUgU0NIRURVTEVfU09GVElSUSBpcyBub3Qgb25seSByYWlzZWQgd2hl
biB0aGUgdGltZXNsaWNlIGlzIGZpbmlzaGVkLCBidXQgYWxzbyByYWlzZWQgaW4gbWFueSBvdGhl
ciBzaXR1YXRpb25zLCB3ZSBjYW5ub3QgZ2V0IGEgcmVndWxhciBtYXBwaW5nIG9mIHZDUFUgYW5k
IHBDUFUganVzdCBsaWtlIGZpZ3VyZSAxLiBUaGUgbWFwcGluZyBpcyBpcnJlZ3VsYXIgcG9zc2li
bHkgc2hvd24gaW4gZmlndXJlIDIuIEluIHRoZSBmaWd1cmUgMiwgd2UgY2Fubm90IGZpbmQgYSB2
ZXJ5IHByb3BlciB0aW1lIHQgdG8gbW9uaXRvciB0aGUgQ1BVcy4KCgoKLS0KQmVzdCBSZWdhcmRz
LApHYXZpbgoKCgpBdCAyMDExLTEyLTE5IDE4OjM3OjE0LCJHZW9yZ2UgRHVubGFwIiA8R2Vvcmdl
LkR1bmxhcEBldS5jaXRyaXguY29tPiB3cm90ZToKPjIwMTEvMTIvMTcgZ2F2aW4gPGdidHV4QDEy
Ni5jb20+Ogo+Pgo+PiBBdCAyMDExLTEyLTE2IDIzOjU4OjI2LCJHZW9yZ2UgRHVubGFwIiA8R2Vv
cmdlLkR1bmxhcEBldS5jaXRyaXguY29tPiB3cm90ZToKPj4+MjAxMS8xMi8xNiBnYXZpbiA8Z2J0
dXhAMTI2LmNvbT46Cj4+Pj4gQXQgMjAxMS0xMi0xNiAxOTowNDoxOSwiR2VvcmdlIER1bmxhcCIg
PEdlb3JnZS5EdW5sYXBAZXUuY2l0cml4LmNvbT4gd3JvdGU6Cj4+Pj4KPj4+Pj4yMDExLzEyLzE2
IHpoaWthaSA8Z2J0dXhAMTI2LmNvbT46Cj4+Pj4+PiBIaSBBbGwsCj4+Pj4+Pgo+Pj4+Pj4gSW4g
dGhlIGNyZWRpdCBzY2hlZHVsZXIsIHRoZSBzY2hlZHVsaW5nIGRlY2lzaW9uIGZ1bmN0aW9uIGNz
Y2hlZF9zY2hlZHVsZSgpCj4+Pj4+PiBpcyBjYWxsZWQgaW4gdGhlIHNjaGVkdWxlIGZ1bmN0aW9u
IGluIHNjaGVkdWxlci5jLCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcuCj4+Pj4+PiBuZXh0X3NsaWNl
ID0gc2NoZWQtPmRvX3NjaGVkdWxlKHNjaGVkLCBub3csIHRhc2tsZXRfd29ya19zY2hlZHVsZWQp
Owo+Pj4+Pj4KPj4+Pj4+IEJ1dCwgaG93IG9mdGVuIHRoZSBjc2NoZWRfc2NoZWR1bGUoKSBpcyBj
YWxsZWQgYW5kIHRvIHJ1bj8gRG9lcyB0aGlzCj4+Pj4+PiBmcmVxdWVuY3kgaGF2ZSBzb21ldGhp
bmcgdG8gZG8gd2l0aCB0aGUgc2xpY2Ugb2YgY3JlZGl0IHNjaGVkdWxlciB0aGF0IGlzCj4+Pj4+
PiAzMG1zPwo+Pj4+Pgo+Pj4+PlRoZSBzY2hlZHVsZXIgcnVucyB3aGVuZXZlciB0aGUgU0NIRURV
TEVfU09GVElSUSBpcyByYWlzZWQuICBJZiB5b3UKPj4+Pj5ncmVwIHRocm91Z2ggdGhlIHNvdXJj
ZSBjb2RlIGZybyB0aGF0IHN0cmluZywgeW91IGNhbiBmaW5kIGFsbCB0aGUKPj4+Pj5wbGFjZXMg
d2hlcmUgaXQncyByYWlzZWQuCj4+Pj4+Cj4+Pj4+U29tZSBleGFtcGxlcyBpbmNsdWRlOgo+Pj4+
PiogV2hlbiB0aGUgMzBtcyB0aW1lc2xpY2UgaXMgZmluaXNoZWQKPj4+Pj4qIFdoZW4gYSBzbGVl
cGluZyB2Y3B1IG9mIGhpZ2hlciBwcmlvcml0eSB0aGFuIHdoYXQncyBjdXJyZW50bHkgcnVubmlu
ZyB3YWtlcyB1cAo+Pj4+PiogV2hlbiBhIHZjcHUgYmxvY2tzCj4+Pj4+KiBXaGVuIGEgdmNwdSBp
cyBtaWdyYXRlZCBmcm9tIG9uZSBjcHUgdG8gYW5vdGhlcgo+Pj4+Pgo+Pj4+PjMwbXMgaXMgYWN0
dWFsbHkgYSBwcmV0dHkgbG9uZyB0aW1lOyBpbiB0eXBpY2FsIHdvcmtsb2FkcywgdmNwdXMgYmxv
Y2sKPj4+Pj5vciBhcmUgcHJlZW1wdGVkIGJ5IG90aGVyIHdha2luZyB2Y3B1cyB3aXRob3V0IHVz
aW5nIHVwIHRoZWlyIGZ1bGwKPj4+Pj50aW1lc2xpY2UuCj4+Pj4KPj4+PiBUaGFuayB5b3UgdmVy
eSBtdWNoIGZvciB5b3VyIHJlcGx5Lgo+Pj4+Cj4+Pj4gU28sIHRoZSB2Y3B1IGlzIHZlcnkgbGlr
ZWx5IHRvIGJlIHByZWVtcHRlZCB3aGVuZXZlciB0aGUgU0NIRURVTEVfU09GVElSUSBpcwo+Pj4+
IHJhaXNlZC4KPj4+Cj4+Pkl0IGRlcGVuZHM7IGlmIHlvdSBoYXZlIGEgY3B1LWJ1cm5pbmcgdmNw
dSBydW5uaW5nIG9uIGEgY3B1IGFsbCBieQo+Pj5pdHNlbGYsIHRoZW4gYWZ0ZXIgaXRzIDMwbXMg
dGltZXNsaWNlLCBYZW4gd2lsbCBoYXZlIG5vIG9uZSBlbHNlIHRvCj4+PnJ1biwgYW5kIHNvIHdp
bGwgbGV0IGl0IHJ1biBhZ2Fpbi4KPj4+Cj4+PkJ1dCB5ZXMsIGlmIHRoZXJlIGFyZSBvdGhlciB2
Y3B1cyBvbiB0aGUgcnVucXVldWUsIG9yIHRoZSBob3N0IGlzCj4+Pm1vZGVyYXRlbHkgYnVzeSwg
aXQncyBsaWtlbHkgdGhhdCBTQ0hFRFVMRV9TT0ZUSVJRIHdpbGwgY2F1c2UgYQo+Pj5jb250ZXh0
LXN3aXRjaC4KPj4+Cj4+Pj4gQW5kIHdlIGNhbm5vdCBmaW5kIGEgc21hbGwgdGltZXNsaWNlLCBz
dWNoIGFzIGEobXMpLCB3aGljaCBtYWtlcyB0aGUKPj4+PiB0aW1lIGFueSB2Y3B1IHNwZW5kaW5n
IG9uIHJ1bm5pbmcgcGhhc2UgaXMgayphKG1zKSwgayBpcyBpbnRlZ2VyIGhlcmUuIFRoZXJlCj4+
Pj4gaXMgbm8gc3VjaCBhIHNtYWxsIHRpbWVzbGljZS4gSXMgaXQgcmlnaHQ/Cj4+Pgo+Pj5JJ20g
c29ycnksIEkgZG9uJ3QgcmVhbGx5IHVuZGVyc3RhbmQgeW91ciBxdWVzdGlvbi4gIFBlcmhhcHMg
aWYgeW91Cj4+PnRvbGQgbWUgd2hhdCB5b3UncmUgdHJ5aW5nIHRvIGFjY29tcGxpc2g/Cj4+Cj4+
IEkgdHJ5IHRvIGRlc2NyaWJlIG15IGlkZWEgYXMgdGhlIGZvbGxvd2luZyBjbGVhcmx5LiBCdXQg
SSByZWFsbHkgZG9uJ3Qga25vdwo+PiBpZiBpdCB3aWxsIHdvcmsuIFBsZWFzZSBnaXZlIG1lIHNv
bWUgYWR2aWNlIGlmIHBvc3NpYmxlLgo+Pgo+PiBBY2NvcmRpbmcgdG8gdGhlIGNyZWRpdCBzY2hl
ZHVsZXIgaW4gWGVuLCBhIHZDUFUgY2FuIHJ1biBhIDMwbXMgdGltZXNsaWNlCj4+IHdoZW4gaXQg
aXMgc2NoZWR1bGVkIG9uIHRoZSBwaHlzaWNhbCBDUFUuIEFuZCwgYSB2Q1BVIHdpdGggdGhlIEJP
T1NUCj4+IHByaW9yaXR5IHdpbGwgcHJlZW1wdCB0aGUgcnVubmluZyBvbmUgYW5kIHJ1biBhZGRp
dGlvbmFsIDEwbXMuIFNvLCB3aGF0IEkKPj4gdGhpbmsgaXMgaWYgd2UgbW9uaXRvciB0aGUgcGh5
c2ljYWwgQ1BVIGV2ZXJ5IDEwbXMgYW5kIHdlIGNhbiBnZXQgdGhlCj4+IG1hcHBpbmcgaW5mb3Jt
YXRpb24gb2YgYSBwaHlzaWNhbCBDUFUgYW5kIGEgdkNQVS4gQW5kIGFsc28sIHdlIGNhbiBnZXQg
dGhlCj4+IHVuLW1hcHBpbmcgaW5mb3JtYXRpb24gdGhhdCBhIHBoeXNpY2FsIENQVSBpc26hr3Qg
bWFwcGVkIHRvIGFueSB2Q1BVLiBUaHVzLAo+PiB3ZSBjYW4gZ2V0IHRoZSBDUFUgdXNhZ2UgYnkg
Y2FsY3VsYXRpbmcgdGhlIHByb3BvcnRpb24gb2YgdGhlIG1hcHBpbmcKPj4gaW5mb3JtYXRpb24g
dG8gdGhlIHRvdGFsIHRpbWUgd2hlbiB3ZSBtb25pdG9yZWQuCj4+Cj4+IEZvciBleGFtcGxlLCBp
ZiB3ZSBtb25pdG9yIHRoZSBwaHlzaWNhbCBDUFVzIGV2ZXJ5IDEwbXMgYW5kIHdlIGNhbiBnZXQg
MTAwCj4+IHBhaXJzIG9mIHBDUFUgYW5kIHZDUFUgaW4gYSBzZWNvbmQsIHN1Y2ggYXMgKHBDUFVf
aWQsIHZDUFVfaWQpLiBJZiB0aGVyZSBpcwo+PiA2MCBtYXBwaW5nIHBhaXJzIHRoYXQgdGhlIHBD
UFUgaXMgbWFwcGVkIHRvIGEgdmFsaWQgdlBDVSwgYW5kIDQwIHVuLW1hcHBpbmcKPj4gcGFpcnMg
dGhhdCB3ZSBjYW5ub3QgZmluZCB0aGUgcENQVSB0byBiZSBtYXBwZWQgYSB2YWxpZCB2Q1BVLiBT
bywgd2UgY2FuIGdldAo+PiB0aGUgdXNhZ2Ugb2YgdGhlIHBoeXNpY2FsIENQVXMgdGhhdCBpcyA2
MCUuCj4+Cj4+IEhlcmUsIHdlIG1vbml0b3IgdGhlIHBoeXNpY2FsIENQVXMgZXZlcnkgMTBtcy4g
V2UgYWxzbyBjYW4gbW9uaXRvciB0aGVtIG9uY2UKPj4gbGVzcyB0aGFuIHRoZSAxMG1zIGludGVy
dmFsLCBzdWNoIGFzIDFtcyBpbnRlcnZhbC4gV2hhdGV2ZXIgaW50ZXJ2YWwgd2UKPj4gY2hvb3Nl
LCB3ZSBtdXN0IG1ha2Ugc3VyZSBubyBDUFUgY29udGVudCBzd2l0Y2ggaW4gdGhlIGludGVydmFs
IG9yIHRoZQo+PiBjb250ZXh0IHN3aXRjaCBhbHdheXMgb2NjdXIgYXQgdGhlIGVkZ2Ugb2YgaW50
ZXJ2YWwuIE9ubHkgaW4gdGhpcyBjb25kaXRpb24sCj4+IGNhbiB0aGlzIGlkZWEgd29yay4KPj4K
Pj4gU28sIEkgYW0gbm90IHN1cmUgd2hldGhlciB3ZSBjYW4gZmluZCBzdWNoIGEgdGltZSBpbnRl
cnZhbCB0aGF0IGNhbiBtZWV0Cj4+IHRoaXMgY29uZGl0aW9uLiBJbiBvdGhlciB3b3Jkcywgd2hl
dGhlciB3ZSBjYW4gZmluZCBzdWNoIGEgdGltZSBpbnRlcnZhbAo+PiB0aGF0IGVuc3VyZXMgYWxs
IHRoZSBDUFUgY29udGVudCBzd2l0Y2ggb2NjdXIgYXQgdGhlIGVkZ2Ugb2YgaW50ZXJ2YWwuCj4K
PllvdSBzdGlsbCBoYXZlbid0IGRlc2NyaWJlZCBleGFjdGx5IHdoYXQgaXQgaXMgeW91J3JlIHRy
eWluZyB0bwo+YWNjb21wbGlzaDogd2hhdCBpcyB5b3VyIGVuZCBnb2FsPyAgSXQgc2VlbXMgdG8g
YmUgcmVsYXRlZCBzb21laG93IHRvCj5tZWFzdXJpbmcgaG93IGJ1c3kgdGhlIHN5c3RlbSBpcyAo
aS5lLiwgdGhlIG51bWJlciBvZiBhY3RpdmUgcGNwdXMgYW5kCj5pZGxlIHBjcHVzKTsgYnV0IGFz
IEkgZG9uJ3Qga25vdyB3aGF0IHlvdSB3YW50IHRvIGRvIHdpdGggdGhhdAo+aW5mb3JtYXRpb24s
IEkgY2FuJ3QgdGVsbCB5b3UgdGhlIGJlc3Qgd2F5IHRvIGdldCBpdC4KPgo+UmVnYXJkaW5nIGEg
bWFwIG9mIHBjcHVzIHRvIHZjcHVzLCB0aGF0IGFscmVhZHkgZXhpc3RzLiAgVGhlCj5zY2hlZHVs
aW5nIGNvZGUgd2lsbCBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB2Y3B1IGhl
cmU6Cj4gIHBlcl9jcHUoc2NoZWR1bGVfZGF0YSwgcGNwdV9pZCkuY3Vycgo+Cj5Zb3UgY2FuIHNl
ZSBleGFtcGxlcyBvZiB0aGUgYWJvdmUgc3RydWN0dXJlIHVzZWQgaW4KPnhlbi9jb21tb24vc2No
ZWRfY3JlZGl0Mi5jLiAgSWYgImlzX2lkbGUocGVyX2NwdShzY2hlZHVsZV9kYXRhLAo+cGNwdSku
Y3VycikiIGlzIGZhbHNlLCB0aGVuIHRoZSBjcHUgaXMgcnVubmluZyBhIHZjcHU7IGlmIGl0IGlz
IHRydWUsCj50aGVuIHRoZSBwY3B1IGlzIGlkbGUgKGFsdGhvdWdoIGl0IG1heSBiZSBydW5uaW5n
IGEgdGFza2xldCkuCj4KPkFkZGl0aW9uYWxseSwgaWYgYWxsIHlvdSB3YW50IGlzIHRoZSBudW1i
ZXIgb2Ygbm9uLWlkbGUgY3B1cywgdGhlCj5jcmVkaXQxIHNjaGVkdWxlciBrZWVwcyB0cmFjayBv
ZiB0aGUgaWRsZSBhbmQgbm9uLWlkbGUgY3B1cyBpbgo+cHJ2LT5pZGxlcnMuICBZb3UgY291bGQg
ZWFzaWx5IHVzZSAiY3B1bWFza193ZWlnaHQoJnBydi0+aWRsZXJzKSIgdG8KPmZpbmQgb3V0IGhv
dyBtYW55IGlkbGUgY3B1cyB0aGVyZSBhcmUgYXQgYW55IGdpdmVuIHRpbWUuICBJZiB5b3Uga25v
dwo+aG93IG1hbnkgb25saW5lIGNwdXMgdGhlcmUgYXJlLCB0aGF0IHdpbGwgZ2l2ZSB5b3UgdGhl
IGJ1c3ktbmVzcyBvZgo+dGhlIHN5c3RlbS4KPgo+U28gbm93IHRoYXQgeW91IGhhdmUgdGhpcyBp
bnN0YW50YW5lb3VzIHBlcmNlbnRhZ2UsIHdoYXQgZG8geW91IHdhbnQKPnRvIGRvIHdpdGggaXQ/
Cj4KPiAtR2VvcmdlCj4KPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fCj5YZW4tZGV2ZWwgbWFpbGluZyBsaXN0Cj5YZW4tZGV2ZWxAbGlzdHMueGVuc291cmNl
LmNvbQo+aHR0cDovL2xpc3RzLnhlbnNvdXJjZS5jb20veGVuLWRldmVsCg==
------=_Part_343557_1060246463.1324366204521
Content-Type: text/html; charset=GBK
Content-Transfer-Encoding: base64

PGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6MS43O2NvbG9yOiMwMDAwMDA7Zm9udC1zaXplOjE0cHg7
Zm9udC1mYW1pbHk6YXJpYWwiPjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVT
Ij4xKSBNeSBvcmlnaW5hbCBnb2FsIGlzIHRvIGNhbGN1bGF0ZSB0aGUgdXNhZ2UKcGVyY2VudGFn
ZSBvZiBDUFUgaW4gYSBkaWZmZXJlbnQgd2F5IGZyb20gb3RoZXIgdG9vbHMsIHN1Y2ggYXMgeGVu
dHJhY2UuIDwvc3Bhbj48L3A+Cgo8cCBjbGFzcz0iTXNvTm9ybWFsIj5CZWNhdXNlIHRoZSBhaW0g
b2YgYWxsIHRoZSBzY2hlZHVsaW5nIGlzIHRvCm1hcCB0aGUgdkNQVSB0byBwQ1BVLCB3ZSBjYW4g
Z2V0IGEgbWFwcGluZyBzZXF1ZW5jZSBvZiBwQ1BVIGFuZCB2Q1BVIGJ5IG1vbml0b3JpbmcKdGhl
IHBDUFUgaW4gYSBmaXhlZCBpbnRlcnZhbC4mbmJzcDs8L3A+Cgo8cCBjbGFzcz0iTXNvTm9ybWFs
Ij48c3BhbiBsYW5nPSJFTi1VUyI+Rm9yIGV4YW1wbGUsIGlmIHRoZSA8YSBuYW1lPSJPTEVfTElO
SzMiPjwvYT48YSBuYW1lPSJPTEVfTElOSzIiPlNDSEVEVUxFX1NPRlRJUlE8L2E+CmlzIGp1c3Qg
cmFpc2VkIHdoZW4gdGhlIHRpbWVzbGljZSBpcyBmaW5pc2hlZCwgdGhlIHZDUFUgcnVucyBhcyBk
ZXNjcmliZWQgaW4KdGhlIGZpZ3VyZSAxICh0d28gcENQVSBhbmQgdGhyZWUgdkNQVSkuIFdlIDwv
c3Bhbj48Yj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImNvbG9yOnJlZCI+bW9uaXRvciBhbGwg
dGhlIENQVXMgb25jZSBldmVyeSB0aW1lIHQ8L3NwYW4+PC9iPjxzcGFuIGxhbmc9IkVOLVVTIj4s
IHdoaWNoIGlzIGVxdWFsIHRvIHRoZSB0aW1lIG9mIHRoZSB0aW1lc2xpY2UgaGVyZS4gSW4gdGVu
IHRpbWVzbGljZQoobWF5YmUgMC4zIHNlY29uZCBpbiBjcmVkaXQxKSwgd2UgY2FuIGdldCB0aGUg
bWFwcGluZyBzZXF1ZW5jZSwgd2hpY2ggY29udGFpbnMgMjAKKHBDUFUsIHZDUFUpIHBhaXJzIGFz
IHRoZSBmb2xsb3dpbmcuPC9zcGFuPjwvcD4KCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxh
bmc9IkVOLVVTIj4ocENQVTEsIHZDUFUxKSwgKHBDUFUyLCB2Q1BVMiksIChwQ1BVMSwKdkNQVTEp
LCA8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJjb2xvcjpyZWQiPihwQ1BVMiwgbm9u
KTwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyI+LCAocENQVTEsIHZDUFUxKSwgKHBDUFUyLCB2Q1BV
MyksIChwQ1BVMSwgdkNQVTIpLCA8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJjb2xv
cjpyZWQiPihwQ1BVMiwgbm9uKTwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyI+LCA8L3NwYW4+PHNw
YW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJjb2xvcjpyZWQiPihwQ1BVMSwgbm9uKTwvc3Bhbj48c3Bh
biBsYW5nPSJFTi1VUyI+LCAocENQVTIsIHZDUFUyKSwKKHBDUFUxLCB2Q1BVMyksIDwvc3Bhbj48
c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImNvbG9yOnJlZCI+KHBDUFUyLCBub24pPC9zcGFuPjxz
cGFuIGxhbmc9IkVOLVVTIj4sIChwQ1BVMSwgdkNQVTMpLCAocENQVTIsIHZDUFUxKSwgPC9zcGFu
PjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iY29sb3I6cmVkIj4ocENQVTEsIG5vbik8L3NwYW4+
PHNwYW4gbGFuZz0iRU4tVVMiPiwgKHBDUFUyLCB2Q1BVMSksIChwQ1BVMSwKdkNQVTEpLCA8L3Nw
YW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJjb2xvcjpyZWQiPihwQ1BVMiwgbm9uKTwvc3Bh
bj48c3BhbiBsYW5nPSJFTi1VUyI+LCA8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJj
b2xvcjpyZWQiPihwQ1BVMSwgbm9uKTwvc3Bhbj48c3BhbiBsYW5nPSJFTi1VUyI+LCAocENQVTIs
IHZDUFUyKTwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6y87M5Tttc28tYXNjaWktZm9u
dC1mYW1pbHk6CiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90Ozttc28taGFuc2ktZm9udC1mYW1p
bHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7Ij6hozwvc3Bhbj48L3A+Cgo8cCBjbGFzcz0i
TXNvTm9ybWFsIj48c3BhbiBsYW5nPSJFTi1VUyI+SWYgdGhlcmUgaXMgbm8gdkNQVSBtYXBwZWQg
b24gdGhlIHBDUFUsIHdlCnVzZSAocENQVSosIG5vbikgcGFpciwgd2hpY2ggbWVhbnMgdGhlIHBD
UFUgaXMgaWRsZS4gSW4gdGhlIGFib3ZlIHNlcXVlbmNlLAp0aGVyZSBhcmUgNyBpZGxlIHBhaXJz
IGluIHRvdGFsLjwvc3Bhbj4mbmJzcDs8L3A+Cgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBs
YW5nPSJFTi1VUyI+U28sIGZyb20gdGhlIGFib3ZlIG1hcHBpbmcgc2VxdWVuY2UsIHdlIGNhbgpj
YWxjdWxhdGUgdGhlIHVzYWdlIHBlcmNlbnRhZ2Ugb2YgdGhlIENQVSBpbiB0ZW4gdGltZXNsY2ll
ICgwLjMgc2VuY29uZCkuPC9zcGFuPjwvcD4KCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxh
bmc9IkVOLVVTIj5Vc2FnZSBQZXJjZW50YWdlID0gKDIwLTcpLzIwID0gNjUlPC9zcGFuPiZuYnNw
OzwvcD4KCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9IkVOLVVTIj4yKSBJZiB3ZSBj
YW4gZ2V0IHN1Y2ggYSBtYXBwaW5nIHNlcXVlbmNlIG9mCnBDUFUgYW5kIHZDUFUsIGJlc2lkZXMg
Y2FsY3VsYXRpbmcgdGhlIHVzYWdlIHBlcmNlbnRhZ2Ugb2YgQ1BVLCBtYXliZSB3ZSBhbHNvCmNh
biBmaW5kIHNvbWU8L3NwYW4+IDxzcGFuIGlkPSJ0cmFuXzFfNSI+bGF3czwvc3Bhbj4Kb2YgdGhl
IG1hcHBpbmcgc2VxdWVuY2UgYW5kIHVzZSB0aGUgbGF3cyB0byBpbmZlciB0aGUgQ1BVLWJvdW5k
IHRhc2sgYW5kIEkvTy1ib3VuZAp0YXNrLiZuYnNwOzwvcD4KCjxwIGNsYXNzPSJNc29Ob3JtYWwi
PjxzcGFuIGxhbmc9IkVOLVVTIj5Ib3dldmVyLCB0aGlzIGlkZWEgbWF5IG5vdCB3b3JrLiBCZWNh
dXNlIHRoZQpTQ0hFRFVMRV9TT0ZUSVJRIGlzIG5vdCBvbmx5IHJhaXNlZCB3aGVuIHRoZSB0aW1l
c2xpY2UgaXMgZmluaXNoZWQsIGJ1dCBhbHNvIHJhaXNlZAppbiBtYW55IG90aGVyIHNpdHVhdGlv
bnMsIHdlIGNhbm5vdCBnZXQgYSByZWd1bGFyIG1hcHBpbmcgb2YgdkNQVSBhbmQgcENQVSBqdXN0
Cmxpa2UgZmlndXJlIDEuJm5ic3A7PC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIj5UaGUgbWFwcGlu
ZyBpcyBpcnJlZ3VsYXIgcG9zc2libHkgc2hvd24gaW4KZmlndXJlIDIuIDxhIG5hbWU9Ik9MRV9M
SU5LNSI+PC9hPjxhIG5hbWU9Ik9MRV9MSU5LNCI+SW4gdGhlIGZpZ3VyZSAyLCB3ZSBjYW5ub3Qg
ZmluZCBhIHZlcnkgcHJvcGVyIDwvYT48L3NwYW4+PGI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxl
PSJjb2xvcjpyZWQiPnRpbWUgdDwvc3Bhbj48L2I+PHNwYW4gbGFuZz0iRU4tVVMiPiB0byBtb25p
dG9yIHRoZSBDUFVzLjwvc3Bhbj48L3A+PGJyPjxkaXY+LS08YnI+QmVzdCBSZWdhcmRzLDxkaXY+
R2F2aW48L2Rpdj48L2Rpdj48ZGl2IGlkPSJkaXZOZXRlYXNlTWFpbENhcmQiPjwvZGl2Pjxicj48
cHJlPjxicj5BdCZuYnNwOzIwMTEtMTItMTkmbmJzcDsxODozNzoxNCwiR2VvcmdlJm5ic3A7RHVu
bGFwIiZuYnNwOyZsdDtHZW9yZ2UuRHVubGFwQGV1LmNpdHJpeC5jb20mZ3Q7Jm5ic3A7d3JvdGU6
CiZndDsyMDExLzEyLzE3Jm5ic3A7Z2F2aW4mbmJzcDsmbHQ7Z2J0dXhAMTI2LmNvbSZndDs6CiZn
dDsmZ3Q7CiZndDsmZ3Q7Jm5ic3A7QXQmbmJzcDsyMDExLTEyLTE2Jm5ic3A7MjM6NTg6MjYsIkdl
b3JnZSZuYnNwO0R1bmxhcCImbmJzcDsmbHQ7R2VvcmdlLkR1bmxhcEBldS5jaXRyaXguY29tJmd0
OyZuYnNwO3dyb3RlOgomZ3Q7Jmd0OyZndDsyMDExLzEyLzE2Jm5ic3A7Z2F2aW4mbmJzcDsmbHQ7
Z2J0dXhAMTI2LmNvbSZndDs6CiZndDsmZ3Q7Jmd0OyZndDsmbmJzcDtBdCZuYnNwOzIwMTEtMTIt
MTYmbmJzcDsxOTowNDoxOSwiR2VvcmdlJm5ic3A7RHVubGFwIiZuYnNwOyZsdDtHZW9yZ2UuRHVu
bGFwQGV1LmNpdHJpeC5jb20mZ3Q7Jm5ic3A7d3JvdGU6CiZndDsmZ3Q7Jmd0OyZndDsKJmd0OyZn
dDsmZ3Q7Jmd0OyZndDsyMDExLzEyLzE2Jm5ic3A7emhpa2FpJm5ic3A7Jmx0O2didHV4QDEyNi5j
b20mZ3Q7OgomZ3Q7Jmd0OyZndDsmZ3Q7Jmd0OyZndDsmbmJzcDtIaSZuYnNwO0FsbCwKJmd0OyZn
dDsmZ3Q7Jmd0OyZndDsmZ3Q7CiZndDsmZ3Q7Jmd0OyZndDsmZ3Q7Jmd0OyZuYnNwO0luJm5ic3A7
dGhlJm5ic3A7Y3JlZGl0Jm5ic3A7c2NoZWR1bGVyLCZuYnNwO3RoZSZuYnNwO3NjaGVkdWxpbmcm
bmJzcDtkZWNpc2lvbiZuYnNwO2Z1bmN0aW9uJm5ic3A7Y3NjaGVkX3NjaGVkdWxlKCkKJmd0OyZn
dDsmZ3Q7Jmd0OyZndDsmZ3Q7Jm5ic3A7aXMmbmJzcDtjYWxsZWQmbmJzcDtpbiZuYnNwO3RoZSZu
YnNwO3NjaGVkdWxlJm5ic3A7ZnVuY3Rpb24mbmJzcDtpbiZuYnNwO3NjaGVkdWxlci5jLCZuYnNw
O3N1Y2gmbmJzcDthcyZuYnNwO3RoZSZuYnNwO2ZvbGxvd2luZy4KJmd0OyZndDsmZ3Q7Jmd0OyZn
dDsmZ3Q7Jm5ic3A7bmV4dF9zbGljZSZuYnNwOz0mbmJzcDtzY2hlZC0mZ3Q7ZG9fc2NoZWR1bGUo
c2NoZWQsJm5ic3A7bm93LCZuYnNwO3Rhc2tsZXRfd29ya19zY2hlZHVsZWQpOwomZ3Q7Jmd0OyZn
dDsmZ3Q7Jmd0OyZndDsKJmd0OyZndDsmZ3Q7Jmd0OyZndDsmZ3Q7Jm5ic3A7QnV0LCZuYnNwO2hv
dyZuYnNwO29mdGVuJm5ic3A7dGhlJm5ic3A7Y3NjaGVkX3NjaGVkdWxlKCkmbmJzcDtpcyZuYnNw
O2NhbGxlZCZuYnNwO2FuZCZuYnNwO3RvJm5ic3A7cnVuPyZuYnNwO0RvZXMmbmJzcDt0aGlzCiZn
dDsmZ3Q7Jmd0OyZndDsmZ3Q7Jmd0OyZuYnNwO2ZyZXF1ZW5jeSZuYnNwO2hhdmUmbmJzcDtzb21l
dGhpbmcmbmJzcDt0byZuYnNwO2RvJm5ic3A7d2l0aCZuYnNwO3RoZSZuYnNwO3NsaWNlJm5ic3A7
b2YmbmJzcDtjcmVkaXQmbmJzcDtzY2hlZHVsZXImbmJzcDt0aGF0Jm5ic3A7aXMKJmd0OyZndDsm
Z3Q7Jmd0OyZndDsmZ3Q7Jm5ic3A7MzBtcz8KJmd0OyZndDsmZ3Q7Jmd0OyZndDsKJmd0OyZndDsm
Z3Q7Jmd0OyZndDtUaGUmbmJzcDtzY2hlZHVsZXImbmJzcDtydW5zJm5ic3A7d2hlbmV2ZXImbmJz
cDt0aGUmbmJzcDtTQ0hFRFVMRV9TT0ZUSVJRJm5ic3A7aXMmbmJzcDtyYWlzZWQuJm5ic3A7Jm5i
c3A7SWYmbmJzcDt5b3UKJmd0OyZndDsmZ3Q7Jmd0OyZndDtncmVwJm5ic3A7dGhyb3VnaCZuYnNw
O3RoZSZuYnNwO3NvdXJjZSZuYnNwO2NvZGUmbmJzcDtmcm8mbmJzcDt0aGF0Jm5ic3A7c3RyaW5n
LCZuYnNwO3lvdSZuYnNwO2NhbiZuYnNwO2ZpbmQmbmJzcDthbGwmbmJzcDt0aGUKJmd0OyZndDsm
Z3Q7Jmd0OyZndDtwbGFjZXMmbmJzcDt3aGVyZSZuYnNwO2l0J3MmbmJzcDtyYWlzZWQuCiZndDsm
Z3Q7Jmd0OyZndDsmZ3Q7CiZndDsmZ3Q7Jmd0OyZndDsmZ3Q7U29tZSZuYnNwO2V4YW1wbGVzJm5i
c3A7aW5jbHVkZToKJmd0OyZndDsmZ3Q7Jmd0OyZndDsqJm5ic3A7V2hlbiZuYnNwO3RoZSZuYnNw
OzMwbXMmbmJzcDt0aW1lc2xpY2UmbmJzcDtpcyZuYnNwO2ZpbmlzaGVkCiZndDsmZ3Q7Jmd0OyZn
dDsmZ3Q7KiZuYnNwO1doZW4mbmJzcDthJm5ic3A7c2xlZXBpbmcmbmJzcDt2Y3B1Jm5ic3A7b2Ym
bmJzcDtoaWdoZXImbmJzcDtwcmlvcml0eSZuYnNwO3RoYW4mbmJzcDt3aGF0J3MmbmJzcDtjdXJy
ZW50bHkmbmJzcDtydW5uaW5nJm5ic3A7d2FrZXMmbmJzcDt1cAomZ3Q7Jmd0OyZndDsmZ3Q7Jmd0
OyombmJzcDtXaGVuJm5ic3A7YSZuYnNwO3ZjcHUmbmJzcDtibG9ja3MKJmd0OyZndDsmZ3Q7Jmd0
OyZndDsqJm5ic3A7V2hlbiZuYnNwO2EmbmJzcDt2Y3B1Jm5ic3A7aXMmbmJzcDttaWdyYXRlZCZu
YnNwO2Zyb20mbmJzcDtvbmUmbmJzcDtjcHUmbmJzcDt0byZuYnNwO2Fub3RoZXIKJmd0OyZndDsm
Z3Q7Jmd0OyZndDsKJmd0OyZndDsmZ3Q7Jmd0OyZndDszMG1zJm5ic3A7aXMmbmJzcDthY3R1YWxs
eSZuYnNwO2EmbmJzcDtwcmV0dHkmbmJzcDtsb25nJm5ic3A7dGltZTsmbmJzcDtpbiZuYnNwO3R5
cGljYWwmbmJzcDt3b3JrbG9hZHMsJm5ic3A7dmNwdXMmbmJzcDtibG9jawomZ3Q7Jmd0OyZndDsm
Z3Q7Jmd0O29yJm5ic3A7YXJlJm5ic3A7cHJlZW1wdGVkJm5ic3A7YnkmbmJzcDtvdGhlciZuYnNw
O3dha2luZyZuYnNwO3ZjcHVzJm5ic3A7d2l0aG91dCZuYnNwO3VzaW5nJm5ic3A7dXAmbmJzcDt0
aGVpciZuYnNwO2Z1bGwKJmd0OyZndDsmZ3Q7Jmd0OyZndDt0aW1lc2xpY2UuCiZndDsmZ3Q7Jmd0
OyZndDsKJmd0OyZndDsmZ3Q7Jmd0OyZuYnNwO1RoYW5rJm5ic3A7eW91Jm5ic3A7dmVyeSZuYnNw
O211Y2gmbmJzcDtmb3ImbmJzcDt5b3VyJm5ic3A7cmVwbHkuCiZndDsmZ3Q7Jmd0OyZndDsKJmd0
OyZndDsmZ3Q7Jmd0OyZuYnNwO1NvLCZuYnNwO3RoZSZuYnNwO3ZjcHUmbmJzcDtpcyZuYnNwO3Zl
cnkmbmJzcDtsaWtlbHkmbmJzcDt0byZuYnNwO2JlJm5ic3A7cHJlZW1wdGVkJm5ic3A7d2hlbmV2
ZXImbmJzcDt0aGUmbmJzcDtTQ0hFRFVMRV9TT0ZUSVJRJm5ic3A7aXMKJmd0OyZndDsmZ3Q7Jmd0
OyZuYnNwO3JhaXNlZC4KJmd0OyZndDsmZ3Q7CiZndDsmZ3Q7Jmd0O0l0Jm5ic3A7ZGVwZW5kczsm
bmJzcDtpZiZuYnNwO3lvdSZuYnNwO2hhdmUmbmJzcDthJm5ic3A7Y3B1LWJ1cm5pbmcmbmJzcDt2
Y3B1Jm5ic3A7cnVubmluZyZuYnNwO29uJm5ic3A7YSZuYnNwO2NwdSZuYnNwO2FsbCZuYnNwO2J5
CiZndDsmZ3Q7Jmd0O2l0c2VsZiwmbmJzcDt0aGVuJm5ic3A7YWZ0ZXImbmJzcDtpdHMmbmJzcDsz
MG1zJm5ic3A7dGltZXNsaWNlLCZuYnNwO1hlbiZuYnNwO3dpbGwmbmJzcDtoYXZlJm5ic3A7bm8m
bmJzcDtvbmUmbmJzcDtlbHNlJm5ic3A7dG8KJmd0OyZndDsmZ3Q7cnVuLCZuYnNwO2FuZCZuYnNw
O3NvJm5ic3A7d2lsbCZuYnNwO2xldCZuYnNwO2l0Jm5ic3A7cnVuJm5ic3A7YWdhaW4uCiZndDsm
Z3Q7Jmd0OwomZ3Q7Jmd0OyZndDtCdXQmbmJzcDt5ZXMsJm5ic3A7aWYmbmJzcDt0aGVyZSZuYnNw
O2FyZSZuYnNwO290aGVyJm5ic3A7dmNwdXMmbmJzcDtvbiZuYnNwO3RoZSZuYnNwO3J1bnF1ZXVl
LCZuYnNwO29yJm5ic3A7dGhlJm5ic3A7aG9zdCZuYnNwO2lzCiZndDsmZ3Q7Jmd0O21vZGVyYXRl
bHkmbmJzcDtidXN5LCZuYnNwO2l0J3MmbmJzcDtsaWtlbHkmbmJzcDt0aGF0Jm5ic3A7U0NIRURV
TEVfU09GVElSUSZuYnNwO3dpbGwmbmJzcDtjYXVzZSZuYnNwO2EKJmd0OyZndDsmZ3Q7Y29udGV4
dC1zd2l0Y2guCiZndDsmZ3Q7Jmd0OwomZ3Q7Jmd0OyZndDsmZ3Q7Jm5ic3A7QW5kJm5ic3A7d2Um
bmJzcDtjYW5ub3QmbmJzcDtmaW5kJm5ic3A7YSZuYnNwO3NtYWxsJm5ic3A7dGltZXNsaWNlLCZu
YnNwO3N1Y2gmbmJzcDthcyZuYnNwO2EobXMpLCZuYnNwO3doaWNoJm5ic3A7bWFrZXMmbmJzcDt0
aGUKJmd0OyZndDsmZ3Q7Jmd0OyZuYnNwO3RpbWUmbmJzcDthbnkmbmJzcDt2Y3B1Jm5ic3A7c3Bl
bmRpbmcmbmJzcDtvbiZuYnNwO3J1bm5pbmcmbmJzcDtwaGFzZSZuYnNwO2lzJm5ic3A7ayphKG1z
KSwmbmJzcDtrJm5ic3A7aXMmbmJzcDtpbnRlZ2VyJm5ic3A7aGVyZS4mbmJzcDtUaGVyZQomZ3Q7
Jmd0OyZndDsmZ3Q7Jm5ic3A7aXMmbmJzcDtubyZuYnNwO3N1Y2gmbmJzcDthJm5ic3A7c21hbGwm
bmJzcDt0aW1lc2xpY2UuJm5ic3A7SXMmbmJzcDtpdCZuYnNwO3JpZ2h0PwomZ3Q7Jmd0OyZndDsK
Jmd0OyZndDsmZ3Q7SSdtJm5ic3A7c29ycnksJm5ic3A7SSZuYnNwO2Rvbid0Jm5ic3A7cmVhbGx5
Jm5ic3A7dW5kZXJzdGFuZCZuYnNwO3lvdXImbmJzcDtxdWVzdGlvbi4mbmJzcDsmbmJzcDtQZXJo
YXBzJm5ic3A7aWYmbmJzcDt5b3UKJmd0OyZndDsmZ3Q7dG9sZCZuYnNwO21lJm5ic3A7d2hhdCZu
YnNwO3lvdSdyZSZuYnNwO3RyeWluZyZuYnNwO3RvJm5ic3A7YWNjb21wbGlzaD8KJmd0OyZndDsK
Jmd0OyZndDsmbmJzcDtJJm5ic3A7dHJ5Jm5ic3A7dG8mbmJzcDtkZXNjcmliZSZuYnNwO215Jm5i
c3A7aWRlYSZuYnNwO2FzJm5ic3A7dGhlJm5ic3A7Zm9sbG93aW5nJm5ic3A7Y2xlYXJseS4mbmJz
cDtCdXQmbmJzcDtJJm5ic3A7cmVhbGx5Jm5ic3A7ZG9uJ3QmbmJzcDtrbm93CiZndDsmZ3Q7Jm5i
c3A7aWYmbmJzcDtpdCZuYnNwO3dpbGwmbmJzcDt3b3JrLiZuYnNwO1BsZWFzZSZuYnNwO2dpdmUm
bmJzcDttZSZuYnNwO3NvbWUmbmJzcDthZHZpY2UmbmJzcDtpZiZuYnNwO3Bvc3NpYmxlLgomZ3Q7
Jmd0OwomZ3Q7Jmd0OyZuYnNwO0FjY29yZGluZyZuYnNwO3RvJm5ic3A7dGhlJm5ic3A7Y3JlZGl0
Jm5ic3A7c2NoZWR1bGVyJm5ic3A7aW4mbmJzcDtYZW4sJm5ic3A7YSZuYnNwO3ZDUFUmbmJzcDtj
YW4mbmJzcDtydW4mbmJzcDthJm5ic3A7MzBtcyZuYnNwO3RpbWVzbGljZQomZ3Q7Jmd0OyZuYnNw
O3doZW4mbmJzcDtpdCZuYnNwO2lzJm5ic3A7c2NoZWR1bGVkJm5ic3A7b24mbmJzcDt0aGUmbmJz
cDtwaHlzaWNhbCZuYnNwO0NQVS4mbmJzcDtBbmQsJm5ic3A7YSZuYnNwO3ZDUFUmbmJzcDt3aXRo
Jm5ic3A7dGhlJm5ic3A7Qk9PU1QKJmd0OyZndDsmbmJzcDtwcmlvcml0eSZuYnNwO3dpbGwmbmJz
cDtwcmVlbXB0Jm5ic3A7dGhlJm5ic3A7cnVubmluZyZuYnNwO29uZSZuYnNwO2FuZCZuYnNwO3J1
biZuYnNwO2FkZGl0aW9uYWwmbmJzcDsxMG1zLiZuYnNwO1NvLCZuYnNwO3doYXQmbmJzcDtJCiZn
dDsmZ3Q7Jm5ic3A7dGhpbmsmbmJzcDtpcyZuYnNwO2lmJm5ic3A7d2UmbmJzcDttb25pdG9yJm5i
c3A7dGhlJm5ic3A7cGh5c2ljYWwmbmJzcDtDUFUmbmJzcDtldmVyeSZuYnNwOzEwbXMmbmJzcDth
bmQmbmJzcDt3ZSZuYnNwO2NhbiZuYnNwO2dldCZuYnNwO3RoZQomZ3Q7Jmd0OyZuYnNwO21hcHBp
bmcmbmJzcDtpbmZvcm1hdGlvbiZuYnNwO29mJm5ic3A7YSZuYnNwO3BoeXNpY2FsJm5ic3A7Q1BV
Jm5ic3A7YW5kJm5ic3A7YSZuYnNwO3ZDUFUuJm5ic3A7QW5kJm5ic3A7YWxzbywmbmJzcDt3ZSZu
YnNwO2NhbiZuYnNwO2dldCZuYnNwO3RoZQomZ3Q7Jmd0OyZuYnNwO3VuLW1hcHBpbmcmbmJzcDtp
bmZvcm1hdGlvbiZuYnNwO3RoYXQmbmJzcDthJm5ic3A7cGh5c2ljYWwmbmJzcDtDUFUmbmJzcDtp
c26hr3QmbmJzcDttYXBwZWQmbmJzcDt0byZuYnNwO2FueSZuYnNwO3ZDUFUuJm5ic3A7VGh1cywK
Jmd0OyZndDsmbmJzcDt3ZSZuYnNwO2NhbiZuYnNwO2dldCZuYnNwO3RoZSZuYnNwO0NQVSZuYnNw
O3VzYWdlJm5ic3A7YnkmbmJzcDtjYWxjdWxhdGluZyZuYnNwO3RoZSZuYnNwO3Byb3BvcnRpb24m
bmJzcDtvZiZuYnNwO3RoZSZuYnNwO21hcHBpbmcKJmd0OyZndDsmbmJzcDtpbmZvcm1hdGlvbiZu
YnNwO3RvJm5ic3A7dGhlJm5ic3A7dG90YWwmbmJzcDt0aW1lJm5ic3A7d2hlbiZuYnNwO3dlJm5i
c3A7bW9uaXRvcmVkLgomZ3Q7Jmd0OwomZ3Q7Jmd0OyZuYnNwO0ZvciZuYnNwO2V4YW1wbGUsJm5i
c3A7aWYmbmJzcDt3ZSZuYnNwO21vbml0b3ImbmJzcDt0aGUmbmJzcDtwaHlzaWNhbCZuYnNwO0NQ
VXMmbmJzcDtldmVyeSZuYnNwOzEwbXMmbmJzcDthbmQmbmJzcDt3ZSZuYnNwO2NhbiZuYnNwO2dl
dCZuYnNwOzEwMAomZ3Q7Jmd0OyZuYnNwO3BhaXJzJm5ic3A7b2YmbmJzcDtwQ1BVJm5ic3A7YW5k
Jm5ic3A7dkNQVSZuYnNwO2luJm5ic3A7YSZuYnNwO3NlY29uZCwmbmJzcDtzdWNoJm5ic3A7YXMm
bmJzcDsocENQVV9pZCwmbmJzcDt2Q1BVX2lkKS4mbmJzcDtJZiZuYnNwO3RoZXJlJm5ic3A7aXMK
Jmd0OyZndDsmbmJzcDs2MCZuYnNwO21hcHBpbmcmbmJzcDtwYWlycyZuYnNwO3RoYXQmbmJzcDt0
aGUmbmJzcDtwQ1BVJm5ic3A7aXMmbmJzcDttYXBwZWQmbmJzcDt0byZuYnNwO2EmbmJzcDt2YWxp
ZCZuYnNwO3ZQQ1UsJm5ic3A7YW5kJm5ic3A7NDAmbmJzcDt1bi1tYXBwaW5nCiZndDsmZ3Q7Jm5i
c3A7cGFpcnMmbmJzcDt0aGF0Jm5ic3A7d2UmbmJzcDtjYW5ub3QmbmJzcDtmaW5kJm5ic3A7dGhl
Jm5ic3A7cENQVSZuYnNwO3RvJm5ic3A7YmUmbmJzcDttYXBwZWQmbmJzcDthJm5ic3A7dmFsaWQm
bmJzcDt2Q1BVLiZuYnNwO1NvLCZuYnNwO3dlJm5ic3A7Y2FuJm5ic3A7Z2V0CiZndDsmZ3Q7Jm5i
c3A7dGhlJm5ic3A7dXNhZ2UmbmJzcDtvZiZuYnNwO3RoZSZuYnNwO3BoeXNpY2FsJm5ic3A7Q1BV
cyZuYnNwO3RoYXQmbmJzcDtpcyZuYnNwOzYwJS4KJmd0OyZndDsKJmd0OyZndDsmbmJzcDtIZXJl
LCZuYnNwO3dlJm5ic3A7bW9uaXRvciZuYnNwO3RoZSZuYnNwO3BoeXNpY2FsJm5ic3A7Q1BVcyZu
YnNwO2V2ZXJ5Jm5ic3A7MTBtcy4mbmJzcDtXZSZuYnNwO2Fsc28mbmJzcDtjYW4mbmJzcDttb25p
dG9yJm5ic3A7dGhlbSZuYnNwO29uY2UKJmd0OyZndDsmbmJzcDtsZXNzJm5ic3A7dGhhbiZuYnNw
O3RoZSZuYnNwOzEwbXMmbmJzcDtpbnRlcnZhbCwmbmJzcDtzdWNoJm5ic3A7YXMmbmJzcDsxbXMm
bmJzcDtpbnRlcnZhbC4mbmJzcDtXaGF0ZXZlciZuYnNwO2ludGVydmFsJm5ic3A7d2UKJmd0OyZn
dDsmbmJzcDtjaG9vc2UsJm5ic3A7d2UmbmJzcDttdXN0Jm5ic3A7bWFrZSZuYnNwO3N1cmUmbmJz
cDtubyZuYnNwO0NQVSZuYnNwO2NvbnRlbnQmbmJzcDtzd2l0Y2gmbmJzcDtpbiZuYnNwO3RoZSZu
YnNwO2ludGVydmFsJm5ic3A7b3ImbmJzcDt0aGUKJmd0OyZndDsmbmJzcDtjb250ZXh0Jm5ic3A7
c3dpdGNoJm5ic3A7YWx3YXlzJm5ic3A7b2NjdXImbmJzcDthdCZuYnNwO3RoZSZuYnNwO2VkZ2Um
bmJzcDtvZiZuYnNwO2ludGVydmFsLiZuYnNwO09ubHkmbmJzcDtpbiZuYnNwO3RoaXMmbmJzcDtj
b25kaXRpb24sCiZndDsmZ3Q7Jm5ic3A7Y2FuJm5ic3A7dGhpcyZuYnNwO2lkZWEmbmJzcDt3b3Jr
LgomZ3Q7Jmd0OwomZ3Q7Jmd0OyZuYnNwO1NvLCZuYnNwO0kmbmJzcDthbSZuYnNwO25vdCZuYnNw
O3N1cmUmbmJzcDt3aGV0aGVyJm5ic3A7d2UmbmJzcDtjYW4mbmJzcDtmaW5kJm5ic3A7c3VjaCZu
YnNwO2EmbmJzcDt0aW1lJm5ic3A7aW50ZXJ2YWwmbmJzcDt0aGF0Jm5ic3A7Y2FuJm5ic3A7bWVl
dAomZ3Q7Jmd0OyZuYnNwO3RoaXMmbmJzcDtjb25kaXRpb24uJm5ic3A7SW4mbmJzcDtvdGhlciZu
YnNwO3dvcmRzLCZuYnNwO3doZXRoZXImbmJzcDt3ZSZuYnNwO2NhbiZuYnNwO2ZpbmQmbmJzcDtz
dWNoJm5ic3A7YSZuYnNwO3RpbWUmbmJzcDtpbnRlcnZhbAomZ3Q7Jmd0OyZuYnNwO3RoYXQmbmJz
cDtlbnN1cmVzJm5ic3A7YWxsJm5ic3A7dGhlJm5ic3A7Q1BVJm5ic3A7Y29udGVudCZuYnNwO3N3
aXRjaCZuYnNwO29jY3VyJm5ic3A7YXQmbmJzcDt0aGUmbmJzcDtlZGdlJm5ic3A7b2YmbmJzcDtp
bnRlcnZhbC4KJmd0OwomZ3Q7WW91Jm5ic3A7c3RpbGwmbmJzcDtoYXZlbid0Jm5ic3A7ZGVzY3Jp
YmVkJm5ic3A7ZXhhY3RseSZuYnNwO3doYXQmbmJzcDtpdCZuYnNwO2lzJm5ic3A7eW91J3JlJm5i
c3A7dHJ5aW5nJm5ic3A7dG8KJmd0O2FjY29tcGxpc2g6Jm5ic3A7d2hhdCZuYnNwO2lzJm5ic3A7
eW91ciZuYnNwO2VuZCZuYnNwO2dvYWw/Jm5ic3A7Jm5ic3A7SXQmbmJzcDtzZWVtcyZuYnNwO3Rv
Jm5ic3A7YmUmbmJzcDtyZWxhdGVkJm5ic3A7c29tZWhvdyZuYnNwO3RvCiZndDttZWFzdXJpbmcm
bmJzcDtob3cmbmJzcDtidXN5Jm5ic3A7dGhlJm5ic3A7c3lzdGVtJm5ic3A7aXMmbmJzcDsoaS5l
LiwmbmJzcDt0aGUmbmJzcDtudW1iZXImbmJzcDtvZiZuYnNwO2FjdGl2ZSZuYnNwO3BjcHVzJm5i
c3A7YW5kCiZndDtpZGxlJm5ic3A7cGNwdXMpOyZuYnNwO2J1dCZuYnNwO2FzJm5ic3A7SSZuYnNw
O2Rvbid0Jm5ic3A7a25vdyZuYnNwO3doYXQmbmJzcDt5b3UmbmJzcDt3YW50Jm5ic3A7dG8mbmJz
cDtkbyZuYnNwO3dpdGgmbmJzcDt0aGF0CiZndDtpbmZvcm1hdGlvbiwmbmJzcDtJJm5ic3A7Y2Fu
J3QmbmJzcDt0ZWxsJm5ic3A7eW91Jm5ic3A7dGhlJm5ic3A7YmVzdCZuYnNwO3dheSZuYnNwO3Rv
Jm5ic3A7Z2V0Jm5ic3A7aXQuCiZndDsKJmd0O1JlZ2FyZGluZyZuYnNwO2EmbmJzcDttYXAmbmJz
cDtvZiZuYnNwO3BjcHVzJm5ic3A7dG8mbmJzcDt2Y3B1cywmbmJzcDt0aGF0Jm5ic3A7YWxyZWFk
eSZuYnNwO2V4aXN0cy4mbmJzcDsmbmJzcDtUaGUKJmd0O3NjaGVkdWxpbmcmbmJzcDtjb2RlJm5i
c3A7d2lsbCZuYnNwO2tlZXAmbmJzcDt0cmFjayZuYnNwO29mJm5ic3A7dGhlJm5ic3A7Y3VycmVu
dGx5Jm5ic3A7cnVubmluZyZuYnNwO3ZjcHUmbmJzcDtoZXJlOgomZ3Q7Jm5ic3A7Jm5ic3A7cGVy
X2NwdShzY2hlZHVsZV9kYXRhLCZuYnNwO3BjcHVfaWQpLmN1cnIKJmd0OwomZ3Q7WW91Jm5ic3A7
Y2FuJm5ic3A7c2VlJm5ic3A7ZXhhbXBsZXMmbmJzcDtvZiZuYnNwO3RoZSZuYnNwO2Fib3ZlJm5i
c3A7c3RydWN0dXJlJm5ic3A7dXNlZCZuYnNwO2luCiZndDt4ZW4vY29tbW9uL3NjaGVkX2NyZWRp
dDIuYy4mbmJzcDsmbmJzcDtJZiZuYnNwOyJpc19pZGxlKHBlcl9jcHUoc2NoZWR1bGVfZGF0YSwK
Jmd0O3BjcHUpLmN1cnIpIiZuYnNwO2lzJm5ic3A7ZmFsc2UsJm5ic3A7dGhlbiZuYnNwO3RoZSZu
YnNwO2NwdSZuYnNwO2lzJm5ic3A7cnVubmluZyZuYnNwO2EmbmJzcDt2Y3B1OyZuYnNwO2lmJm5i
c3A7aXQmbmJzcDtpcyZuYnNwO3RydWUsCiZndDt0aGVuJm5ic3A7dGhlJm5ic3A7cGNwdSZuYnNw
O2lzJm5ic3A7aWRsZSZuYnNwOyhhbHRob3VnaCZuYnNwO2l0Jm5ic3A7bWF5Jm5ic3A7YmUmbmJz
cDtydW5uaW5nJm5ic3A7YSZuYnNwO3Rhc2tsZXQpLgomZ3Q7CiZndDtBZGRpdGlvbmFsbHksJm5i
c3A7aWYmbmJzcDthbGwmbmJzcDt5b3UmbmJzcDt3YW50Jm5ic3A7aXMmbmJzcDt0aGUmbmJzcDtu
dW1iZXImbmJzcDtvZiZuYnNwO25vbi1pZGxlJm5ic3A7Y3B1cywmbmJzcDt0aGUKJmd0O2NyZWRp
dDEmbmJzcDtzY2hlZHVsZXImbmJzcDtrZWVwcyZuYnNwO3RyYWNrJm5ic3A7b2YmbmJzcDt0aGUm
bmJzcDtpZGxlJm5ic3A7YW5kJm5ic3A7bm9uLWlkbGUmbmJzcDtjcHVzJm5ic3A7aW4KJmd0O3By
di0mZ3Q7aWRsZXJzLiZuYnNwOyZuYnNwO1lvdSZuYnNwO2NvdWxkJm5ic3A7ZWFzaWx5Jm5ic3A7
dXNlJm5ic3A7ImNwdW1hc2tfd2VpZ2h0KCZhbXA7cHJ2LSZndDtpZGxlcnMpIiZuYnNwO3RvCiZn
dDtmaW5kJm5ic3A7b3V0Jm5ic3A7aG93Jm5ic3A7bWFueSZuYnNwO2lkbGUmbmJzcDtjcHVzJm5i
c3A7dGhlcmUmbmJzcDthcmUmbmJzcDthdCZuYnNwO2FueSZuYnNwO2dpdmVuJm5ic3A7dGltZS4m
bmJzcDsmbmJzcDtJZiZuYnNwO3lvdSZuYnNwO2tub3cKJmd0O2hvdyZuYnNwO21hbnkmbmJzcDtv
bmxpbmUmbmJzcDtjcHVzJm5ic3A7dGhlcmUmbmJzcDthcmUsJm5ic3A7dGhhdCZuYnNwO3dpbGwm
bmJzcDtnaXZlJm5ic3A7eW91Jm5ic3A7dGhlJm5ic3A7YnVzeS1uZXNzJm5ic3A7b2YKJmd0O3Ro
ZSZuYnNwO3N5c3RlbS4KJmd0OwomZ3Q7U28mbmJzcDtub3cmbmJzcDt0aGF0Jm5ic3A7eW91Jm5i
c3A7aGF2ZSZuYnNwO3RoaXMmbmJzcDtpbnN0YW50YW5lb3VzJm5ic3A7cGVyY2VudGFnZSwmbmJz
cDt3aGF0Jm5ic3A7ZG8mbmJzcDt5b3UmbmJzcDt3YW50CiZndDt0byZuYnNwO2RvJm5ic3A7d2l0
aCZuYnNwO2l0PwomZ3Q7CiZndDsmbmJzcDstR2VvcmdlCiZndDsKJmd0O19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiZndDtYZW4tZGV2ZWwmbmJzcDttYWls
aW5nJm5ic3A7bGlzdAomZ3Q7WGVuLWRldmVsQGxpc3RzLnhlbnNvdXJjZS5jb20KJmd0O2h0dHA6
Ly9saXN0cy54ZW5zb3VyY2UuY29tL3hlbi1kZXZlbAo8L3ByZT48L2Rpdj48YnI+PGJyPjxzcGFu
IHRpdGxlPSJuZXRlYXNlZm9vdGVyIj48c3BhbiBpZD0ibmV0ZWFzZV9tYWlsX2Zvb3RlciI+PC9z
cGFuPjwvc3Bhbj4=
------=_Part_343557_1060246463.1324366204521--

------=_Part_343555_1040962665.1324366204520
Content-Type: image/jpeg; name="fig1.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="fig1.jpg"

/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU
FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAD/Ah4DASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KK
KACiiigAooooAKK8s/aOuZbT4faS8MrxOfGHhVC0bFSVbX9PVhx2IJBHcEivU6ACiiigAoorivA3
hybRPE/xEvH1SO/XWddivo7eNizWKrpljb+S4zwSbdpcDHEynvkgHa0UUUAFFFcR8TPDUXiT/hFP
N1aDSf7P1+0v088gfaWTfiBeR8zZ469OhoA7eiiigAooooAKK4j4aeGYvDTeLFi1aDVTfa/dX7iH
H+itIEPkNyfmUAHt94cV29ABRRRQAUVxHxM8NReJP+EU83VoNJ/s/X7S/TzyB9pZN+IF5HzNnjr0
6Gu3oAKKKKACiiuI+GnhmLw03ixYtWg1U32v3V+4hx/orSBD5Dcn5lAB7feHFAHb0UUUAFFFcR8T
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
RmHTntxdTKyw3DB44mXbbXBziGUp4ra/s1/ETV/APgbwTrA8MabpumfC3Vvh5qeq2Oq3N3NHLdxW
sKXMFu1pEJVVdPhYo0sZzcSKCfJDS6r/ALPuvWXh5l0D4TfCjwhcTanbyz6Z4Z1a90ecxRW90v2m
LWLKzhmin33CRhFt8CE3amRhc7YwDoJ/2nLRR8Qtbu9a8P8Ah34fab4N0TxToPii8iuJ/Nj1D7cq
S3NufJc/PbRKltGfMfIAffKI4/StS+MnhPSfGSeGLrULhNRM8NrJOmnXMljbXEoUw2896sZt4J5P
Mh2QyyLI/nwbVPnR7vFfGvwR+LHiLSvilprXHhjxBP4q+HWn+DItfvtRmsZrq9iW8W4vZ7WKzdIF
c6lcOI45HwbeNeBKTD3/AIX8J/EXw142129t7TwvHp3i3U7PXNYuZNRuZptMlSws7Se0t4BboLlW
Wx+S5eWAqZ9xgbytkoBvy/HrwLBrt/pdzrn2A2JuRLqd9aT2+ls9urvcxR38iLayywrFOZI0lZ4/
s8+5R5Mm3W+HvxP0H4oWeqXGgvqH/Ervf7PvbfU9Ju9NuLefyYpwjw3UUcgzFPE4O3BDjBNeFW37
MV7oereMZtM+H3wp1TUr+bxBqVr4r8Q2DXOoajLqDXciWV1EtupigVrsQvKLiYyQQMoiXzv3PsHw
V8JeJPBvhW6tPEl55kk1689np/8Aa9zrH9mwFI18j+0LpVuLvdIss2+VQU8/ylykSEgHodFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUV4l4t+MvjfSPilr/hPR/Cvg+Ww0yy0m9TVfEHjCfTftH9oT3FtBF5a6dMBK
bi1kjC7zu3w4JZyi9poPxCmOlyXfi2HSPB9xZeH7PWtYsZ9ajnm0hpVnM63BCqiwRmBwtxv2yGOb
5UEeWAO5orxzxj+094OsfhL498b+B9V0f4oP4R0yTUrzTPDOt2kzKqo7DzJBIREu2ORiSCxWN9iS
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
------=_Part_343555_1040962665.1324366204520
Content-Type: image/jpeg; name="fig2.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="fig2.jpg"

/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK
CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU
FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAEjAh8DASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KK
KACiiigAooooAKKKKAI8Hd2xWYNe0/8AtO6sPttv9tt40llt/NXeiOWCMVzkBijgE8Eo2OhrUK5B
r518U+FdO8QfHHx9oH9rato/iDX/AAtYLY3VheXZNs6y32bgRxyKFRGhgyflXc5TINwwfKcmrWV9
Tsw1GnV5ud2sr6eqX5XZ9Bi8gBP7+PjrlxTluYjIF81CT0AYc18c22oa/wCNJIPsWn+JdCXxpZJ4
f03zNb1A/wBk3tp5P2qVt7riVMXWVk2NL/ZMuC32pq7XxBfSaH8QL3S4dW1KPxPZ63pFloGmSapO
Xn0lkshdy/ZmkIulAe/LXDpI6mNzvBiBTJVnLVI9CplsabUXPV+ndLv0d18mfSUk8cAzI6Rg9Nxx
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
4Uk6nqPjnxHAhbSNc1aO702cjm5gWwtIPNUdShkhk2t0dQHUlHVj4p8NvHOiaVrXhHULDxebg694
z13TpLUamj2zW7SX00cUUQbZuaV7OQSYMh+0Iofy3RKt1JJr+uxzxwdOcaiTs1a3/gLbX4Wv/mfW
IuoTuPmx4Xr8w4+tH2mLarCVMN907hg18LL4j1HTfCen6lq3xiu9N1i5udLXWtOsy0clndSXlv50
d09xPPHbvGhuz5CRQBvKk3I0cLovo3xR0e90DxpbaJD49vvBelWumW8ui/bpL6/ub29knuPOWAfa
42vJU2237mQXH+sjUIA+15jWk/s9jepllGDX766u1trpZfO7enl56H1UORS01BhFHPTv1p1dZ8+F
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAM6DNZHinxFa+FtGl1G8LC3R44yUXJy7qi8fVhWwTgGuB+OPPw3vh0/wBKsv8A0qirKo3GDkui
Z14OnGviadKezaT9G7HfqcqD6ilpkX+qT6CnGtUcjMbxR4itfCujS6lebhbo8cZKruOXdUXj6sK1
1OQD6iuB+OBJ+HF7kY/0qy/9Koq72Mny0+grJP33Hsl+p1ypRWGhVW7lJfJKLX5sdVLUtNttZ0+5
sb62hvLK5jaGa3uIw8cqMCGRlPDKQSCDwQaujp0oxWvkce2qZheFvDb+GLCS1Orajq8fmloTqciS
SQR4AWISBFaRVx9+UvISSWdjW4QfwpQCD1pCCfpQtNhybk7sfRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUhoAToM1jaX4jttU1vWNMh3G40x4458rjl0Drg9+GFbIzzXn/gcf8XM+Imc/8fNn
/wCkqVlJ8ril1f6M66FKNSnVlLeMU1680V+TZ6FRRRWpyGJpniO01XWdX0yEsbjTHjjnyuBl0Drg
9+GFXNS0221nT7mxvreK8srmNoZ7edA8csbAhkZTwykEgg8EGuM8ED/i5vxEP/TxZ/8ApKld+e39
KyhLmi793+Z14qmqFVKH8sX83FN/izD8K+G38MWElqdW1HVo/NLQnU5EkkgjwAsQcIrSKuPvyl5C
SSzsa3CD+FKAQetIQT9K1WmxySbk7sfRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
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
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiuR8dfF
bwR8L/sP/CZeMvD/AIS+3b/sn9u6pBZfaNm3f5fmuu7bvTOM43LnqKTwv8V/BHjiztrvw34y0DX7
S6vW023n0rVILlJrpYTO1ujI5DSiFWkKD5gilsYGaAOvoorm/BXxB8L/ABI0qXU/CXibSPFOmxTG
2kvNEv4ryFJQqsYy8bMAwV0O3OcMD3FAHSUUUUAFFUNM1Wy1q3e50+8t763Saa2eS2lWRVlikaKW
MlSQGSRHRl6qysDggir9ABRRRQAUUUUAFFFUNT1Wy0W3S51C8t7G3eaG2SS5lWNWllkWKKMFiAWe
R0RV6szKBkkCgC/RRRQAUUUUAFFFUNX1Wy0DS7zU9TvbfTtNsoXubq8u5VihgiRSzyO7EBVVQSWJ
AABJoAv0UUUAFFFc341+IPhf4b6VFqfi3xNpHhbTZZhbR3mt38VnC8pVmEYeRlBYqjnbnOFJ7GgD
pKKK5vxr8QfC/wAN9Ki1Pxb4m0jwtpsswto7zW7+KzheUqzCMPIygsVRztznCk9jQB0lFeeeIv2g
vhZ4PvVtNe+JfhDRLtvM2wajr1rbufLmkgkwryA/LNDNG3o8TqeVIGrb/FbwRfa7oeiW/jLQLjWd
csl1LStOi1SBrjULVlZ1uIIw+6WIrG7B0BUhGOcA0AddRXOeG/iB4W8Y6trOmaB4m0fW9S0Sb7Nq
llpt/FcTWEu518udEYmJt0cg2sAcow7GujoAKKKoWeq2WpXN/bWt7b3VzYTC3u4oJVdraUxpKI5A
DlGMcsb7Tg7ZEPRgSAX6KK5GX4r+CLbxTd+GJfGOgReJLPyPtOjyapALyDznijh3wl96+Y9xAi5H
zNNGBkuuQDrqK888LftCfC3xxrtronhz4leD/EGtXRb7Pp2ma9a3NxNtUu2yNJCzYVWY4HAUnoKt
Wfxv+HWpeDr7xda+PvDF14UsJhbXmvQ6xbPY20pKARyTh9iMTLGNpIP7xP7wyAdzRVDSNVstf0uz
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
oAKKKKACiiigAooooAKKKKACiiigAooooA//2Q==
------=_Part_343555_1040962665.1324366204520
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

------=_Part_343555_1040962665.1324366204520--



From xen-users-bounces@lists.xensource.com Tue Dec 20 10:18:14 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Tue, 20 Dec 2011 10:18:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-users-bounces@lists.xensource.com>)
	id 1RcwkG-00018U-Kc; Tue, 20 Dec 2011 10:16:28 +0000
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <admin@artur.krakow.pl>) id 1RcwkF-00018B-4P
	for xen-users@lists.xensource.com; Tue, 20 Dec 2011 10:16:27 +0000
X-Env-Sender: admin@artur.krakow.pl
X-Msg-Ref: server-2.tower-216.messagelabs.com!1324376180!9470949!1
X-Originating-IP: [195.225.248.12]
X-SpamReason: No, hits=2.7 required=7.0 tests=HTML_50_60,
	HTML_IMAGE_ONLY_08,HTML_MESSAGE
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17699 invoked from network); 20 Dec 2011 10:16:20 -0000
Received: from sto.multi-play.pl (HELO mta.artur.krakow.pl) (195.225.248.12)
	by server-2.tower-216.messagelabs.com with AES256-SHA encrypted SMTP;
	20 Dec 2011 10:16:20 -0000
Received: from wifi.tvwisla.com.pl ([213.180.136.60]:33173
	helo=[10.154.224.110]) by mta.artur.krakow.pl with esmtpsa
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.76)
	(envelope-from <admin@artur.krakow.pl>) id 1Rcxf9-0007fz-Rw
	for xen-users@lists.xensource.com; Tue, 20 Dec 2011 12:15:16 +0100
Message-ID: <4EF06068.60103@artur.krakow.pl>
Date: Tue, 20 Dec 2011 11:16:08 +0100
From: Artur Fejklowicz <admin@artur.krakow.pl>
Organization: Artur Fejklowicz
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:8.0) Gecko/20111124 Thunderbird/8.0
MIME-Version: 1.0
To: xen-users@lists.xensource.com
Subject: [Xen-users] How to make image of existing windows 7
X-BeenThere: xen-users@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
Reply-To: Artur Fejklowicz <admin@artur.krakow.pl>
List-Id: Xen user discussion <xen-users.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xensource.com>
List-Help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============7614600869889747734=="
Sender: xen-users-bounces@lists.xensource.com
Errors-To: xen-users-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============7614600869889747734==
Content-Type: multipart/alternative;
 boundary="------------040500080509020907010001"

This is a multi-part message in MIME format.
--------------040500080509020907010001
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Hi.

I would like to know how to prepare windows 7 image so I could run it 
under Xen.
Windows 7 is on 250GB /dev/sda1 seen by my hypervisor and it occupies 70GB.
Is there a method to make image only this 70GB plus for example 10GB 
additional free space?

Best Regards.
-- 

--------------040500080509020907010001
Content-Type: multipart/related;
 boundary="------------010305000603050805010203"


--------------010305000603050805010203
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit

<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hi.<br>
    <br>
    I would like to know how to prepare windows 7 image so I could run
    it under Xen.<br>
    Windows 7 is on 250GB /dev/sda1 seen by my hypervisor and it
    occupies 70GB. <br>
    Is there a method to make image only this 70GB plus for example 10GB
    additional free space?<br>
    <br>
    Best Regards.<br>
    <div class="moz-signature">-- <br>
      <img src="cid:part1.08090200.04070106@artur.krakow.pl" border="0"></div>
  </body>
</html>

--------------010305000603050805010203
Content-Type: image/png;
 name="stopka.png"
Content-Transfer-Encoding: base64
Content-ID: <part1.08090200.04070106@artur.krakow.pl>
Content-Disposition: inline;
 filename="stopka.png"

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
--------------010305000603050805010203--

--------------040500080509020907010001--


--===============7614600869889747734==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users
--===============7614600869889747734==--


From xen-devel-bounces@lists.xensource.com Tue Dec 20 17:48:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Tue, 20 Dec 2011 17:48:53 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1Rd3nj-0004ru-NN; Tue, 20 Dec 2011 17:48:31 +0000
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xen.org with smtp (Exim 4.72)
	(envelope-from <raistlin@linux.it>) id 1Rd3ni-0004rp-Al
	for xen-devel@lists.xensource.com; Tue, 20 Dec 2011 17:48:31 +0000
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-16.tower-182.messagelabs.com!1324403300!722602!1
X-Originating-IP: [193.205.80.99]
X-SpamReason: No, hits=1.1 required=7.0 tests=BODY_RANDOM_LONG,DIET_1
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27957 invoked from network); 20 Dec 2011 17:48:21 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-16.tower-182.messagelabs.com with SMTP;
	20 Dec 2011 17:48:21 -0000
Received: from [62.94.181.91] (account d.faggioli@sssup.it HELO [192.168.0.40])
	by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 74061268; Tue, 20 Dec 2011 18:48:18 +0100
Message-ID: <1324403256.2632.0.camel@Solace>
From: Dario Faggioli <raistlin@linux.it>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Tue, 20 Dec 2011 18:47:36 +0100
X-Mailer: Evolution 3.2.2-1 
Mime-Version: 1.0
Cc: George Dunlap <George.Dunlap@eu.citrix.com>, Keir Fraser <keir@xen.org>
Subject: [Xen-devel] sedf: remove useless tracing printk and harmonize
	comments style.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============4953755209351780878=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============4953755209351780878==
Content-Type: multipart/signed; micalg="pgp-sha1"; protocol="application/pgp-signature";
	boundary="=-4GhoPkvT2knwTpwLdibp"


--=-4GhoPkvT2knwTpwLdibp
Content-Type: multipart/mixed; boundary="=-3p5/0djGq6n5G1gGRftX"


--=-3p5/0djGq6n5G1gGRftX
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

sched_sedf.c used o have its own mechanism for producing tracing-alike
kind of information (domain block, wakeup, etc.). Nowadays, with an even
not so high number of pCPUs/vCPUs, just trying to enable this makes
the serial console completely unusable, produces tons of very hard to
parse and interpreet logging and can easily livelock Dom0. Moreover,
pretty much the same result this is struggling to get to, is better
achieved by enabling the scheduler-related tracing events, as
it is for the other schedulers (say, credit or credit2).

For all these reasons, this removes that machinery completely. While at
it, check in some cosmetics that harmonize the comments withim themself
and with the rest of the code base.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>

diff -r 17d99691e0ec xen/common/sched_sedf.c
--- a/xen/common/sched_sedf.c	Tue Dec 20 16:39:56 2011 +0000
+++ b/xen/common/sched_sedf.c	Tue Dec 20 17:32:52 2011 +0000
@@ -13,14 +13,6 @@
 #include <xen/time.h>
 #include <xen/errno.h>
=20
-/*verbosity settings*/
-#define SEDFLEVEL 0
-#define PRINT(_f, _a...)                        \
-    do {                                        \
-        if ( (_f) <=3D SEDFLEVEL )                \
-            printk(_a );                        \
-    } while ( 0 )
-
 #define SEDF_CPUONLINE(_pool)                                             =
\
     (((_pool) =3D=3D NULL) ? &cpupool_free_cpus : (_pool)->cpu_valid)
=20
@@ -66,34 +58,35 @@ struct sedf_vcpu_info {
     struct list_head list;
     struct list_head extralist[2];
 =20
-    /*Parameters for EDF*/
-    s_time_t  period;  /*=3D(relative deadline)*/
-    s_time_t  slice;  /*=3Dworst case execution time*/
+    /* Parameters for EDF */
+    s_time_t  period;  /* =3D(relative deadline) */
+    s_time_t  slice;   /* =3Dworst case execution time */
 =20
-    /*Advaced Parameters*/
-    /*Latency Scaling*/
+    /* Advaced Parameters */
+
+    /* Latency Scaling */
     s_time_t  period_orig;
     s_time_t  slice_orig;
     s_time_t  latency;
 =20
-    /*status of domain*/
+    /* Status of domain */
     int       status;
-    /*weights for "Scheduling for beginners/ lazy/ etc." ;)*/
+    /* Weights for "Scheduling for beginners/ lazy/ etc." ;) */
     short     weight;
     short     extraweight;
-    /*Bookkeeping*/
+    /* Bookkeeping */
     s_time_t  deadl_abs;
     s_time_t  sched_start_abs;
     s_time_t  cputime;
-    /* times the domain un-/blocked */
+    /* Times the domain un-/blocked */
     s_time_t  block_abs;
     s_time_t  unblock_abs;
 =20
-    /*scores for {util, block penalty}-weighted extratime distribution*/
+    /* Scores for {util, block penalty}-weighted extratime distribution */
     int   score[2];
     s_time_t  short_block_lost_tot;
 =20
-    /*Statistics*/
+    /* Statistics */
     s_time_t  extra_time_tot;
=20
 #ifdef SEDF_STATS
@@ -158,18 +151,16 @@ static inline void extraq_del(struct vcp
 {
     struct list_head *list =3D EXTRALIST(d,i);
     ASSERT(extraq_on(d,i));
-    PRINT(3, "Removing domain %i.%i from L%i extraq\n",
-          d->domain->domain_id, d->vcpu_id, i);
     list_del(list);
     list->next =3D NULL;
     ASSERT(!extraq_on(d, i));
 }
=20
-/* adds a domain to the queue of processes which are aware of extra time. =
List
-   is sorted by score, where a lower score means higher priority for an ex=
tra
-   slice. It also updates the score, by simply subtracting a fixed value f=
rom
-   each entry, in order to avoid overflow. The algorithm works by simply
-   charging each domain that recieved extratime with an inverse of its wei=
ght.
+/* Adds a domain to the queue of processes which are aware of extra time. =
List
+ * is sorted by score, where a lower score means higher priority for an ex=
tra
+ * slice. It also updates the score, by simply subtracting a fixed value f=
rom
+ * each entry, in order to avoid overflow. The algorithm works by simply
+ * charging each domain that recieved extratime with an inverse of its wei=
ght.
  */=20
 static inline void extraq_add_sort_update(struct vcpu *d, int i, int sub)
 {
@@ -178,13 +169,7 @@ static inline void extraq_add_sort_updat
 =20
     ASSERT(!extraq_on(d,i));
=20
-    PRINT(3, "Adding domain %i.%i (score=3D %i, short_pen=3D %"PRIi64")"
-          " to L%i extraq\n",
-          d->domain->domain_id, d->vcpu_id, EDOM_INFO(d)->score[i],
-          EDOM_INFO(d)->short_block_lost_tot, i);
-
-    /*
-     * Iterate through all elements to find our "hole" and on our way
+    /* Iterate through all elements to find our "hole" and on our way
      * update all the other scores.
      */
     list_for_each ( cur, EXTRAQ(d->processor, i) )
@@ -193,25 +178,18 @@ static inline void extraq_add_sort_updat
         curinf->score[i] -=3D sub;
         if ( EDOM_INFO(d)->score[i] < curinf->score[i] )
             break;
-        PRINT(4,"\tbehind domain %i.%i (score=3D %i)\n",
-              curinf->vcpu->domain->domain_id,
-              curinf->vcpu->vcpu_id, curinf->score[i]);
     }
=20
-    /* cur now contains the element, before which we'll enqueue. */
-    PRINT(3, "\tlist_add to %p\n", cur->prev);
+    /* cur now contains the element, before which we'll enqueue */
     list_add(EXTRALIST(d,i),cur->prev);
 =20
-    /* Continue updating the extraq. */
+    /* Continue updating the extraq */
     if ( (cur !=3D EXTRAQ(d->processor,i)) && sub )
     {
         for ( cur =3D cur->next; cur !=3D EXTRAQ(d->processor,i); cur =3D =
cur->next )
         {
             curinf =3D list_entry(cur,struct sedf_vcpu_info, extralist[i])=
;
             curinf->score[i] -=3D sub;
-            PRINT(4, "\tupdating domain %i.%i (score=3D %u)\n",
-                  curinf->vcpu->domain->domain_id,=20
-                  curinf->vcpu->vcpu_id, curinf->score[i]);
         }
     }
=20
@@ -221,29 +199,14 @@ static inline void extraq_check(struct v
 {
     if ( extraq_on(d, EXTRA_UTIL_Q) )
     {
-        PRINT(2,"Dom %i.%i is on L1 extraQ\n",
-              d->domain->domain_id, d->vcpu_id);
-
         if ( !(EDOM_INFO(d)->status & EXTRA_AWARE) &&
              !extra_runs(EDOM_INFO(d)) )
-        {
             extraq_del(d, EXTRA_UTIL_Q);
-            PRINT(2,"Removed dom %i.%i from L1 extraQ\n",
-                  d->domain->domain_id, d->vcpu_id);
-        }
     }
     else
     {
-        PRINT(2, "Dom %i.%i is NOT on L1 extraQ\n",
-              d->domain->domain_id,
-              d->vcpu_id);
-
         if ( (EDOM_INFO(d)->status & EXTRA_AWARE) && sedf_runnable(d) )
-        {
             extraq_add_sort_update(d, EXTRA_UTIL_Q, 0);
-            PRINT(2,"Added dom %i.%i to L1 extraQ\n",
-                  d->domain->domain_id, d->vcpu_id);
-        }
     }
 }
=20
@@ -252,7 +215,7 @@ static inline void extraq_check_add_unbl
     struct sedf_vcpu_info *inf =3D EDOM_INFO(d);
=20
     if ( inf->status & EXTRA_AWARE )
-        /* Put on the weighted extraq without updating any scores. */
+        /* Put on the weighted extraq without updating any scores */
         extraq_add_sort_update(d, EXTRA_UTIL_Q, 0);
 }
=20
@@ -265,8 +228,6 @@ static inline void __del_from_queue(stru
 {
     struct list_head *list =3D LIST(d);
     ASSERT(__task_on_queue(d));
-    PRINT(3,"Removing domain %i.%i (bop=3D %"PRIu64") from runq/waitq\n",
-          d->domain->domain_id, d->vcpu_id, PERIOD_BEGIN(EDOM_INFO(d)));
     list_del(list);
     list->next =3D NULL;
     ASSERT(!__task_on_queue(d));
@@ -279,13 +240,12 @@ static inline void list_insert_sort(
 {
     struct list_head     *cur;
=20
-    /* Iterate through all elements to find our "hole". */
+    /* Iterate through all elements to find our "hole" */
     list_for_each( cur, list )
         if ( comp(element, cur) < 0 )
             break;
=20
-    /* cur now contains the element, before which we'll enqueue. */
-    PRINT(3,"\tlist_add to %p\n",cur->prev);
+    /* cur now contains the element, before which we'll enqueue */
     list_add(element, cur->prev);
 }
=20
@@ -303,30 +263,26 @@ static int name##_comp(struct list_head*
         return 1;                                                       \
 }
=20
-/* adds a domain to the queue of processes which wait for the beginning of=
 the
-   next period; this list is therefore sortet by this time, which is simpl=
y
-   absol. deadline - period
+/* Adds a domain to the queue of processes which wait for the beginning of=
 the
+ * next period; this list is therefore sortet by this time, which is simpl=
y
+ * absol. deadline - period.
  */=20
 DOMAIN_COMPARER(waitq, list, PERIOD_BEGIN(d1), PERIOD_BEGIN(d2));
 static inline void __add_to_waitqueue_sort(struct vcpu *v)
 {
     ASSERT(!__task_on_queue(v));
-    PRINT(3,"Adding domain %i.%i (bop=3D %"PRIu64") to waitq\n",
-          v->domain->domain_id, v->vcpu_id, PERIOD_BEGIN(EDOM_INFO(v)));
     list_insert_sort(WAITQ(v->processor), LIST(v), waitq_comp);
     ASSERT(__task_on_queue(v));
 }
=20
-/* adds a domain to the queue of processes which have started their curren=
t
-   period and are runnable (i.e. not blocked, dieing,...). The first eleme=
nt
-   on this list is running on the processor, if the list is empty the idle
-   task will run. As we are implementing EDF, this list is sorted by deadl=
ines.
+/* Adds a domain to the queue of processes which have started their curren=
t
+ * period and are runnable (i.e. not blocked, dieing,...). The first eleme=
nt
+ * on this list is running on the processor, if the list is empty the idle
+ * task will run. As we are implementing EDF, this list is sorted by deadl=
ines.
  */=20
 DOMAIN_COMPARER(runq, list, d1->deadl_abs, d2->deadl_abs);
 static inline void __add_to_runqueue_sort(struct vcpu *v)
 {
-    PRINT(3,"Adding domain %i.%i (deadl=3D %"PRIu64") to runq\n",
-          v->domain->domain_id, v->vcpu_id, EDOM_INFO(v)->deadl_abs);
     list_insert_sort(RUNQ(v->processor), LIST(v), runq_comp);
 }
=20
@@ -445,22 +401,21 @@ static int sedf_pick_cpu(const struct sc
     return cpumask_first(&online_affinity);
 }
=20
-/*
- * Handles the rescheduling & bookkeeping of domains running in their
+
+/* Handles the rescheduling & bookkeeping of domains running in their
  * guaranteed timeslice.
  */
 static void desched_edf_dom(s_time_t now, struct vcpu* d)
 {
     struct sedf_vcpu_info* inf =3D EDOM_INFO(d);
=20
-    /* Current domain is running in real time mode. */
+    /* Current domain is running in real time mode */
     ASSERT(__task_on_queue(d));
=20
-    /* Update the domain's cputime. */
+    /* Update the domain's cputime */
     inf->cputime +=3D now - inf->sched_start_abs;
=20
-    /*
-     * Scheduling decisions which don't remove the running domain from the
+    /* Scheduling decisions which don't remove the running domain from the
      * runq.=20
      */
     if ( (inf->cputime < inf->slice) && sedf_runnable(d) )
@@ -468,8 +423,7 @@ static void desched_edf_dom(s_time_t now
  =20
     __del_from_queue(d);
  =20
-    /*
-     * Manage bookkeeping (i.e. calculate next deadline, memorise
+    /* Manage bookkeeping (i.e. calculate next deadline, memorise
      * overrun-time of slice) of finished domains.
      */
     if ( inf->cputime >=3D inf->slice )
@@ -478,30 +432,30 @@ static void desched_edf_dom(s_time_t now
  =20
         if ( inf->period < inf->period_orig )
         {
-            /* This domain runs in latency scaling or burst mode. */
+            /* This domain runs in latency scaling or burst mode */
             inf->period *=3D 2;
             inf->slice  *=3D 2;
             if ( (inf->period > inf->period_orig) ||
                  (inf->slice > inf->slice_orig) )
             {
-                /* Reset slice and period. */
+                /* Reset slice and period */
                 inf->period =3D inf->period_orig;
                 inf->slice =3D inf->slice_orig;
             }
         }
=20
-        /* Set next deadline. */
+        /* Set next deadline */
         inf->deadl_abs +=3D inf->period;
     }
 =20
-    /* Add a runnable domain to the waitqueue. */
+    /* Add a runnable domain to the waitqueue */
     if ( sedf_runnable(d) )
     {
         __add_to_waitqueue_sort(d);
     }
     else
     {
-        /* We have a blocked realtime task -> remove it from exqs too. */
+        /* We have a blocked realtime task -> remove it from exqs too */
         if ( extraq_on(d, EXTRA_PEN_Q) )
             extraq_del(d, EXTRA_PEN_Q);
         if ( extraq_on(d, EXTRA_UTIL_Q) )
@@ -521,73 +475,59 @@ static void update_queues(
     struct list_head     *cur, *tmp;
     struct sedf_vcpu_info *curinf;
 =20
-    PRINT(3,"Updating waitq..\n");
-
-    /*
-     * Check for the first elements of the waitqueue, whether their
+    /* Check for the first elements of the waitqueue, whether their
      * next period has already started.
      */
     list_for_each_safe ( cur, tmp, waitq )
     {
         curinf =3D list_entry(cur, struct sedf_vcpu_info, list);
-        PRINT(4,"\tLooking @ dom %i.%i\n",
-              curinf->vcpu->domain->domain_id, curinf->vcpu->vcpu_id);
         if ( PERIOD_BEGIN(curinf) > now )
             break;
         __del_from_queue(curinf->vcpu);
         __add_to_runqueue_sort(curinf->vcpu);
     }
 =20
-    PRINT(3,"Updating runq..\n");
-
-    /* Process the runq, find domains that are on the runq that shouldn't.=
 */
+    /* Process the runq, find domains that are on the runq that shouldn't =
*/
     list_for_each_safe ( cur, tmp, runq )
     {
         curinf =3D list_entry(cur,struct sedf_vcpu_info,list);
-        PRINT(4,"\tLooking @ dom %i.%i\n",
-              curinf->vcpu->domain->domain_id, curinf->vcpu->vcpu_id);
=20
         if ( unlikely(curinf->slice =3D=3D 0) )
         {
-            /* Ignore domains with empty slice. */
-            PRINT(4,"\tUpdating zero-slice domain %i.%i\n",
-                  curinf->vcpu->domain->domain_id,
-                  curinf->vcpu->vcpu_id);
+            /* Ignore domains with empty slice */
             __del_from_queue(curinf->vcpu);
=20
-            /* Move them to their next period. */
+            /* Move them to their next period */
             curinf->deadl_abs +=3D curinf->period;
=20
-            /* Ensure that the start of the next period is in the future. =
*/
+            /* Ensure that the start of the next period is in the future *=
/
             if ( unlikely(PERIOD_BEGIN(curinf) < now) )
                 curinf->deadl_abs +=3D=20
                     (DIV_UP(now - PERIOD_BEGIN(curinf),
                             curinf->period)) * curinf->period;
=20
-            /* Put them back into the queue. */
+            /* Put them back into the queue */
             __add_to_waitqueue_sort(curinf->vcpu);
         }
         else if ( unlikely((curinf->deadl_abs < now) ||
                            (curinf->cputime > curinf->slice)) )
         {
-            /*
-             * We missed the deadline or the slice was already finished.
+            /* We missed the deadline or the slice was already finished.
              * Might hapen because of dom_adj.
              */
-            PRINT(4,"\tDomain %i.%i exceeded it's deadline/"
-                  "slice (%"PRIu64" / %"PRIu64") now: %"PRIu64
-                  " cputime: %"PRIu64"\n",
-                  curinf->vcpu->domain->domain_id,
-                  curinf->vcpu->vcpu_id,
-                  curinf->deadl_abs, curinf->slice, now,
-                  curinf->cputime);
+            printk("\tDomain %i.%i exceeded it's deadline/"
+                   "slice (%"PRIu64" / %"PRIu64") now: %"PRIu64
+                   " cputime: %"PRIu64"\n",
+                   curinf->vcpu->domain->domain_id,
+                   curinf->vcpu->vcpu_id,
+                   curinf->deadl_abs, curinf->slice, now,
+                   curinf->cputime);
             __del_from_queue(curinf->vcpu);
=20
-            /* Common case: we miss one period. */
+            /* Common case: we miss one period */
             curinf->deadl_abs +=3D curinf->period;
   =20
-            /*
-             * If we are still behind: modulo arithmetic, force deadline
+            /* If we are still behind: modulo arithmetic, force deadline
              * to be in future and aligned to period borders.
              */
             if ( unlikely(curinf->deadl_abs < now) )
@@ -596,7 +536,7 @@ static void update_queues(
                            curinf->period) * curinf->period;
             ASSERT(curinf->deadl_abs >=3D now);
=20
-            /* Give a fresh slice. */
+            /* Give a fresh slice */
             curinf->cputime =3D 0;
             if ( PERIOD_BEGIN(curinf) > now )
                 __add_to_waitqueue_sort(curinf->vcpu);
@@ -606,17 +546,16 @@ static void update_queues(
         else
             break;
     }
-
-    PRINT(3,"done updating the queues\n");
 }
=20

 /* removes a domain from the head of the according extraQ and
-   requeues it at a specified position:
-     round-robin extratime: end of extraQ
-     weighted ext.: insert in sorted list by score
-   if the domain is blocked / has regained its short-block-loss
-   time it is not put on any queue */
+ * requeues it at a specified position:
+ *   round-robin extratime: end of extraQ
+ *   weighted ext.: insert in sorted list by score
+ * if the domain is blocked / has regained its short-block-loss
+ * time it is not put on any queue.
+ */
 static void desched_extra_dom(s_time_t now, struct vcpu *d)
 {
     struct sedf_vcpu_info *inf =3D EDOM_INFO(d);
@@ -625,29 +564,25 @@ static void desched_extra_dom(s_time_t n
=20
     ASSERT(extraq_on(d, i));
=20
-    /* Unset all running flags. */
+    /* Unset all running flags */
     inf->status  &=3D ~(EXTRA_RUN_PEN | EXTRA_RUN_UTIL);
-    /* Fresh slice for the next run. */
+    /* Fresh slice for the next run */
     inf->cputime =3D 0;
-    /* Accumulate total extratime. */
+    /* Accumulate total extratime */
     inf->extra_time_tot +=3D now - inf->sched_start_abs;
     /* Remove extradomain from head of the queue. */
     extraq_del(d, i);
=20
-    /* Update the score. */
+    /* Update the score */
     oldscore =3D inf->score[i];
     if ( i =3D=3D EXTRA_PEN_Q )
     {
-        /*domain was running in L0 extraq*/
-        /*reduce block lost, probably more sophistication here!*/
+        /* Domain was running in L0 extraq */
+        /* reduce block lost, probably more sophistication here!*/
         /*inf->short_block_lost_tot -=3D EXTRA_QUANTUM;*/
         inf->short_block_lost_tot -=3D now - inf->sched_start_abs;
-        PRINT(3,"Domain %i.%i: Short_block_loss: %"PRIi64"\n",=20
-              inf->vcpu->domain->domain_id, inf->vcpu->vcpu_id,
-              inf->short_block_lost_tot);
 #if 0
-        /*
-         * KAF: If we don't exit short-blocking state at this point
+        /* KAF: If we don't exit short-blocking state at this point
          * domain0 can steal all CPU for up to 10 seconds before
          * scheduling settles down (when competing against another
          * CPU-bound domain). Doing this seems to make things behave
@@ -656,51 +591,56 @@ static void desched_extra_dom(s_time_t n
         if ( inf->short_block_lost_tot <=3D 0 )
 #endif
         {
-            PRINT(4,"Domain %i.%i compensated short block loss!\n",
-                  inf->vcpu->domain->domain_id, inf->vcpu->vcpu_id);
-            /*we have (over-)compensated our block penalty*/
+            /* We have (over-)compensated our block penalty */
             inf->short_block_lost_tot =3D 0;
-            /*we don't want a place on the penalty queue anymore!*/
+            /* We don't want a place on the penalty queue anymore! */
             inf->status &=3D ~EXTRA_WANT_PEN_Q;
             goto check_extra_queues;
         }
=20
-        /*we have to go again for another try in the block-extraq,
-          the score is not used incremantally here, as this is
-          already done by recalculating the block_lost*/
+        /* We have to go again for another try in the block-extraq,
+         * the score is not used incremantally here, as this is
+         * already done by recalculating the block_lost
+         */
         inf->score[EXTRA_PEN_Q] =3D (inf->period << 10) /
             inf->short_block_lost_tot;
         oldscore =3D 0;
     }
     else
     {
-        /*domain was running in L1 extraq =3D> score is inverse of
-          utilization and is used somewhat incremental!*/
+        /* Domain was running in L1 extraq =3D> score is inverse of
+         * utilization and is used somewhat incremental!
+         */
         if ( !inf->extraweight )
-            /*NB: use fixed point arithmetic with 10 bits*/
+        {
+            /* NB: use fixed point arithmetic with 10 bits */
             inf->score[EXTRA_UTIL_Q] =3D (inf->period << 10) /
                 inf->slice;
+        }
         else
-            /*conversion between realtime utilisation and extrawieght:
-              full (ie 100%) utilization is equivalent to 128 extraweight*=
/
+        {
+            /* Conversion between realtime utilisation and extrawieght:
+             * full (ie 100%) utilization is equivalent to 128 extraweight
+             */
             inf->score[EXTRA_UTIL_Q] =3D (1<<17) / inf->extraweight;
+        }
     }
=20
  check_extra_queues:
-    /* Adding a runnable domain to the right queue and removing blocked on=
es*/
+    /* Adding a runnable domain to the right queue and removing blocked on=
es */
     if ( sedf_runnable(d) )
     {
-        /*add according to score: weighted round robin*/
+        /* Add according to score: weighted round robin */
         if (((inf->status & EXTRA_AWARE) && (i =3D=3D EXTRA_UTIL_Q)) ||
             ((inf->status & EXTRA_WANT_PEN_Q) && (i =3D=3D EXTRA_PEN_Q)))
             extraq_add_sort_update(d, i, oldscore);
     }
     else
     {
-        /*remove this blocked domain from the waitq!*/
+        /* Remove this blocked domain from the waitq! */
         __del_from_queue(d);
-        /*make sure that we remove a blocked domain from the other
-          extraq too*/
+        /* Make sure that we remove a blocked domain from the other
+         * extraq too. */
         if ( i =3D=3D EXTRA_PEN_Q )
         {
             if ( extraq_on(d, EXTRA_UTIL_Q) )
@@ -732,8 +672,9 @@ static struct task_slice sedf_do_extra_s
=20
     if ( !list_empty(extraq[EXTRA_PEN_Q]) )
     {
-        /*we still have elements on the level 0 extraq=20
-          =3D> let those run first!*/
+        /* We still have elements on the level 0 extraq
+         * =3D> let those run first!
+         */
         runinf   =3D list_entry(extraq[EXTRA_PEN_Q]->next,=20
                               struct sedf_vcpu_info, extralist[EXTRA_PEN_Q=
]);
         runinf->status |=3D EXTRA_RUN_PEN;
@@ -747,7 +688,7 @@ static struct task_slice sedf_do_extra_s
     {
         if ( !list_empty(extraq[EXTRA_UTIL_Q]) )
         {
-            /*use elements from the normal extraqueue*/
+            /* Use elements from the normal extraqueue */
             runinf   =3D list_entry(extraq[EXTRA_UTIL_Q]->next,
                                   struct sedf_vcpu_info,
                                   extralist[EXTRA_UTIL_Q]);
@@ -773,10 +714,11 @@ static struct task_slice sedf_do_extra_s
=20

 /* Main scheduling function
-   Reasons for calling this function are:
-   -timeslice for the current period used up
-   -domain on waitqueue has started it's period
-   -and various others ;) in general: determine which domain to run next*/
+ * Reasons for calling this function are:
+ * -timeslice for the current period used up
+ * -domain on waitqueue has started it's period
+ * -and various others ;) in general: determine which domain to run next
+ */
 static struct task_slice sedf_do_schedule(
     const struct scheduler *ops, s_time_t now, bool_t tasklet_work_schedul=
ed)
 {
@@ -789,13 +731,14 @@ static struct task_slice sedf_do_schedul
     struct sedf_vcpu_info *runinf, *waitinf;
     struct task_slice      ret;
=20
-    /*idle tasks don't need any of the following stuf*/
+    /* Idle tasks don't need any of the following stuf */
     if ( is_idle_vcpu(current) )
         goto check_waitq;
 =20
-    /* create local state of the status of the domain, in order to avoid
-       inconsistent state during scheduling decisions, because data for
-       vcpu_runnable is not protected by the scheduling lock!*/
+    /* Create local state of the status of the domain, in order to avoid
+     * inconsistent state during scheduling decisions, because data for
+     * vcpu_runnable is not protected by the scheduling lock!
+     */
     if ( !vcpu_runnable(current) )
         inf->status |=3D SEDF_ASLEEP;
 =20
@@ -804,7 +747,7 @@ static struct task_slice sedf_do_schedul
=20
     if ( unlikely(extra_runs(inf)) )
     {
-        /*special treatment of domains running in extra time*/
+        /* Special treatment of domains running in extra time */
         desched_extra_dom(now, current);
     }
     else=20
@@ -814,10 +757,11 @@ static struct task_slice sedf_do_schedul
  check_waitq:
     update_queues(now, runq, waitq);
=20
-    /*now simply pick the first domain from the runqueue, which has the
-      earliest deadline, because the list is sorted*/
-=20
-    /* Tasklet work (which runs in idle VCPU context) overrides all else. =
*/
+    /* Now simply pick the first domain from the runqueue, which has the
+     * earliest deadline, because the list is sorted
+     *
+     * Tasklet work (which runs in idle VCPU context) overrides all else.
+     */
     if ( tasklet_work_scheduled ||
          (list_empty(runq) && list_empty(waitq)) ||
          unlikely(!cpumask_test_cpu(cpu, SEDF_CPUONLINE(per_cpu(cpupool, c=
pu)))) )
@@ -833,9 +777,10 @@ static struct task_slice sedf_do_schedul
         {
             waitinf  =3D list_entry(waitq->next,
                                   struct sedf_vcpu_info,list);
-            /*rerun scheduler, when scheduled domain reaches it's
-              end of slice or the first domain from the waitqueue
-              gets ready*/
+            /* Rerun scheduler, when scheduled domain reaches it's
+             * end of slice or the first domain from the waitqueue
+             * gets ready.
+             */
             ret.time =3D MIN(now + runinf->slice - runinf->cputime,
                            PERIOD_BEGIN(waitinf)) - now;
         }
@@ -847,14 +792,15 @@ static struct task_slice sedf_do_schedul
     else
     {
         waitinf  =3D list_entry(waitq->next,struct sedf_vcpu_info, list);
-        /*we could not find any suitable domain=20
-          =3D> look for domains that are aware of extratime*/
+        /* We could not find any suitable domain=20
+         * =3D> look for domains that are aware of extratime*/
         ret =3D sedf_do_extra_schedule(now, PERIOD_BEGIN(waitinf),
                                      extraq, cpu);
     }
=20
-    /*TODO: Do something USEFUL when this happens and find out, why it
-      still can happen!!!*/
+    /* TODO: Do something USEFUL when this happens and find out, why it
+     * still can happen!!!
+     */
     if ( ret.time < 0)
     {
         printk("Ouch! We are seriously BEHIND schedule! %"PRIi64"\n",
@@ -874,9 +820,6 @@ static struct task_slice sedf_do_schedul
=20
 static void sedf_sleep(const struct scheduler *ops, struct vcpu *d)
 {
-    PRINT(2,"sedf_sleep was called, domain-id %i.%i\n",
-          d->domain->domain_id, d->vcpu_id);
-=20
     if ( is_idle_vcpu(d) )
         return;
=20
@@ -972,27 +915,29 @@ static void sedf_sleep(const struct sche
 static void unblock_short_extra_support(
     struct sedf_vcpu_info* inf, s_time_t now)
 {
-    /*this unblocking scheme tries to support the domain, by assigning it
-    a priority in extratime distribution according to the loss of time
-    in this slice due to blocking*/
+    /* This unblocking scheme tries to support the domain, by assigning it
+     * a priority in extratime distribution according to the loss of time
+     * in this slice due to blocking
+     */
     s_time_t pen;
 =20
-    /*no more realtime execution in this period!*/
+    /* No more realtime execution in this period! */
     inf->deadl_abs +=3D inf->period;
     if ( likely(inf->block_abs) )
     {
-        //treat blocked time as consumed by the domain*/
+        /* Treat blocked time as consumed by the domain */
         /*inf->cputime +=3D now - inf->block_abs;*/
-        /*penalty is time the domain would have
-          had if it continued to run */
+        /* Penalty is time the domain would have
+         * had if it continued to run.
+         */
         pen =3D (inf->slice - inf->cputime);
         if ( pen < 0 )
             pen =3D 0;
-        /*accumulate all penalties over the periods*/
+        /* Accumulate all penalties over the periods */
         /*inf->short_block_lost_tot +=3D pen;*/
-        /*set penalty to the current value*/
+        /* Set penalty to the current value */
         inf->short_block_lost_tot =3D pen;
-        /*not sure which one is better.. but seems to work well...*/
+        /* Not sure which one is better.. but seems to work well... */
  =20
         if ( inf->short_block_lost_tot )
         {
@@ -1002,28 +947,30 @@ static void unblock_short_extra_support(
             inf->pen_extra_blocks++;
 #endif
             if ( extraq_on(inf->vcpu, EXTRA_PEN_Q) )
-                /*remove domain for possible resorting!*/
+                /* Remove domain for possible resorting! */
                 extraq_del(inf->vcpu, EXTRA_PEN_Q);
             else
-                /*remember that we want to be on the penalty q
-                  so that we can continue when we (un-)block
-                  in penalty-extratime*/
+                /* Remember that we want to be on the penalty q
+                 * so that we can continue when we (un-)block
+                 * in penalty-extratime
+                 */
                 inf->status |=3D EXTRA_WANT_PEN_Q;
   =20
-            /*(re-)add domain to the penalty extraq*/
+            /* (re-)add domain to the penalty extraq */
             extraq_add_sort_update(inf->vcpu, EXTRA_PEN_Q, 0);
         }
     }
=20
-    /*give it a fresh slice in the next period!*/
+    /* Give it a fresh slice in the next period! */
     inf->cputime =3D 0;
 }
=20

 static void unblock_long_cons_b(struct sedf_vcpu_info* inf,s_time_t now)
 {
-    /*Conservative 2b*/
-    /*Treat the unblocking time as a start of a new period */
+    /* Conservative 2b */
+
+    /* Treat the unblocking time as a start of a new period */
     inf->deadl_abs =3D now + inf->period;
     inf->cputime =3D 0;
 }
@@ -1046,15 +993,16 @@ static inline int get_run_type(struct vc
 }
=20

-/*Compares two domains in the relation of whether the one is allowed to
-  interrupt the others execution.
-  It returns true (!=3D0) if a switch to the other domain is good.
-  Current Priority scheme is as follows:
-   EDF > L0 (penalty based) extra-time >=20
-   L1 (utilization) extra-time > idle-domain
-  In the same class priorities are assigned as following:
-   EDF: early deadline > late deadline
-   L0 extra-time: lower score > higher score*/
+/* Compares two domains in the relation of whether the one is allowed to
+ * interrupt the others execution.
+ * It returns true (!=3D0) if a switch to the other domain is good.
+ * Current Priority scheme is as follows:
+ *  EDF > L0 (penalty based) extra-time >=20
+ *  L1 (utilization) extra-time > idle-domain
+ * In the same class priorities are assigned as following:
+ *  EDF: early deadline > late deadline
+ *  L0 extra-time: lower score > higher score
+ */
 static inline int should_switch(struct vcpu *cur,
                                 struct vcpu *other,
                                 s_time_t now)
@@ -1063,19 +1011,19 @@ static inline int should_switch(struct v
     cur_inf   =3D EDOM_INFO(cur);
     other_inf =3D EDOM_INFO(other);
 =20
-    /* Check whether we need to make an earlier scheduling decision. */
+    /* Check whether we need to make an earlier scheduling decision */
     if ( PERIOD_BEGIN(other_inf) <=20
          CPU_INFO(other->processor)->current_slice_expires )
         return 1;
=20
-    /* No timing-based switches need to be taken into account here. */
+    /* No timing-based switches need to be taken into account here */
     switch ( get_run_type(cur) )
     {
     case DOMAIN_EDF:
-        /* Do not interrupt a running EDF domain. */
+        /* Do not interrupt a running EDF domain */
         return 0;
     case DOMAIN_EXTRA_PEN:
-        /* Check whether we also want the L0 ex-q with lower score. */
+        /* Check whether we also want the L0 ex-q with lower score */
         return ((other_inf->status & EXTRA_WANT_PEN_Q) &&
                 (other_inf->score[EXTRA_PEN_Q] <=20
                  cur_inf->score[EXTRA_PEN_Q]));
@@ -1096,18 +1044,11 @@ static void sedf_wake(const struct sched
     s_time_t              now =3D NOW();
     struct sedf_vcpu_info* inf =3D EDOM_INFO(d);
=20
-    PRINT(3, "sedf_wake was called, domain-id %i.%i\n",d->domain->domain_i=
d,
-          d->vcpu_id);
-
     if ( unlikely(is_idle_vcpu(d)) )
         return;
   =20
     if ( unlikely(__task_on_queue(d)) )
-    {
-        PRINT(3,"\tdomain %i.%i is already in some queue\n",
-              d->domain->domain_id, d->vcpu_id);
         return;
-    }
=20
     ASSERT(!sedf_runnable(d));
     inf->status &=3D ~SEDF_ASLEEP;
@@ -1116,28 +1057,24 @@ static void sedf_wake(const struct sched
 =20
     if ( unlikely(inf->deadl_abs =3D=3D 0) )
     {
-        /*initial setup of the deadline*/
+        /* Initial setup of the deadline */
         inf->deadl_abs =3D now + inf->slice;
     }
  =20
-    PRINT(3, "waking up domain %i.%i (deadl=3D %"PRIu64" period=3D %"PRIu6=
4
-          "now=3D %"PRIu64")\n",
-          d->domain->domain_id, d->vcpu_id, inf->deadl_abs, inf->period, n=
ow);
-
 #ifdef SEDF_STATS=20
     inf->block_tot++;
 #endif
=20
     if ( unlikely(now < PERIOD_BEGIN(inf)) )
     {
-        PRINT(4,"extratime unblock\n");
-        /* unblocking in extra-time! */
+        /* Unblocking in extra-time! */
         if ( inf->status & EXTRA_WANT_PEN_Q )
         {
-            /*we have a domain that wants compensation
-              for block penalty and did just block in
-              its compensation time. Give it another
-              chance!*/
+            /* We have a domain that wants compensation
+             * for block penalty and did just block in
+             * its compensation time. Give it another
+             * chance!
+             */
             extraq_add_sort_update(d, EXTRA_PEN_Q, 0);
         }
         extraq_check_add_unblocked(d, 0);
@@ -1146,8 +1083,7 @@ static void sedf_wake(const struct sched
     { =20
         if ( now < inf->deadl_abs )
         {
-            PRINT(4,"short unblocking\n");
-            /*short blocking*/
+            /* Short blocking */
 #ifdef SEDF_STATS
             inf->short_block_tot++;
 #endif
@@ -1157,8 +1093,7 @@ static void sedf_wake(const struct sched
         }
         else
         {
-            PRINT(4,"long unblocking\n");
-            /*long unblocking*/
+            /* Long unblocking */
 #ifdef SEDF_STATS
             inf->long_block_tot++;
 #endif
@@ -1168,24 +1103,13 @@ static void sedf_wake(const struct sched
         }
     }
=20
-    PRINT(3, "woke up domain %i.%i (deadl=3D %"PRIu64" period=3D %"PRIu64
-          "now=3D %"PRIu64")\n",
-          d->domain->domain_id, d->vcpu_id, inf->deadl_abs,
-          inf->period, now);
-
     if ( PERIOD_BEGIN(inf) > now )
-    {
         __add_to_waitqueue_sort(d);
-        PRINT(3,"added to waitq\n");
-    }
     else
-    {
         __add_to_runqueue_sort(d);
-        PRINT(3,"added to runq\n");
-    }
 =20
 #ifdef SEDF_STATS
-    /*do some statistics here...*/
+    /* Do some statistics here... */
     if ( inf->block_abs !=3D 0 )
     {
         inf->block_time_tot +=3D now - inf->block_abs;
@@ -1194,12 +1118,13 @@ static void sedf_wake(const struct sched
     }
 #endif
=20
-    /*sanity check: make sure each extra-aware domain IS on the util-q!*/
+    /* Sanity check: make sure each extra-aware domain IS on the util-q! *=
/
     ASSERT(IMPLY(inf->status & EXTRA_AWARE, extraq_on(d, EXTRA_UTIL_Q)));
     ASSERT(__task_on_queue(d));
-    /*check whether the awakened task needs to invoke the do_schedule
-      routine. Try to avoid unnecessary runs but:
-      Save approximation: Always switch to scheduler!*/
+    /* Check whether the awakened task needs to invoke the do_schedule
+     * routine. Try to avoid unnecessary runs but:
+     * Save approximation: Always switch to scheduler!
+     */
     ASSERT(d->processor >=3D 0);
     ASSERT(d->processor < nr_cpu_ids);
     ASSERT(per_cpu(schedule_data, d->processor).curr);
@@ -1244,7 +1169,7 @@ static void sedf_dump_domain(struct vcpu
 }
=20

-/* dumps all domains on the specified cpu */
+/* Dumps all domains on the specified cpu */
 static void sedf_dump_cpu_state(const struct scheduler *ops, int i)
 {
     struct list_head      *list, *queue, *tmp;
@@ -1319,7 +1244,7 @@ static void sedf_dump_cpu_state(const st
 }
=20

-/* Adjusts periods and slices of the domains accordingly to their weights.=
 */
+/* Adjusts periods and slices of the domains accordingly to their weights =
*/
 static int sedf_adjust_weights(struct cpupool *c, struct xen_domctl_schedu=
ler_op *cmd)
 {
     struct vcpu *p;
@@ -1335,7 +1260,7 @@ static int sedf_adjust_weights(struct cp
         return -ENOMEM;
     }
=20
-    /* Sum across all weights. */
+    /* Sum across all weights */
     rcu_read_lock(&domlist_read_lock);
     for_each_domain_in_cpupool( d, c )
     {
@@ -1350,11 +1275,13 @@ static int sedf_adjust_weights(struct cp
             }
             else
             {
-                /*don't modify domains who don't have a weight, but sum
-                  up the time they need, projected to a WEIGHT_PERIOD,
-                  so that this time is not given to the weight-driven
-                  domains*/
-                /*check for overflows*/
+                /* Don't modify domains who don't have a weight, but sum
+                 * up the time they need, projected to a WEIGHT_PERIOD,
+                 * so that this time is not given to the weight-driven
+                 *  domains
+                 */
+
+                /* Check for overflows */
                 ASSERT((WEIGHT_PERIOD < ULONG_MAX)=20
                        && (EDOM_INFO(p)->slice_orig < ULONG_MAX));
                 sumt[cpu] +=3D=20
@@ -1365,7 +1292,7 @@ static int sedf_adjust_weights(struct cp
     }
     rcu_read_unlock(&domlist_read_lock);
=20
-    /* Adjust all slices (and periods) to the new weight. */
+    /* Adjust all slices (and periods) to the new weight */
     rcu_read_lock(&domlist_read_lock);
     for_each_domain_in_cpupool( d, c )
     {
@@ -1393,20 +1320,15 @@ static int sedf_adjust_weights(struct cp
 }
=20

-/* set or fetch domain scheduling parameters */
+/* Set or fetch domain scheduling parameters */
 static int sedf_adjust(const struct scheduler *ops, struct domain *p, stru=
ct xen_domctl_scheduler_op *op)
 {
     struct vcpu *v;
     int rc;
=20
-    PRINT(2,"sedf_adjust was called, domain-id %i new period %"PRIu64" "
-          "new slice %"PRIu64"\nlatency %"PRIu64" extra:%s\n",
-          p->domain_id, op->u.sedf.period, op->u.sedf.slice,
-          op->u.sedf.latency, (op->u.sedf.extratime)?"yes":"no");
-
     if ( op->cmd =3D=3D XEN_DOMCTL_SCHEDOP_putinfo )
     {
-        /* Check for sane parameters. */
+        /* Check for sane parameters */
         if ( !op->u.sedf.period && !op->u.sedf.weight )
             return -EINVAL;
         if ( op->u.sedf.weight )
@@ -1414,7 +1336,7 @@ static int sedf_adjust(const struct sche
             if ( (op->u.sedf.extratime & EXTRA_AWARE) &&
                  (!op->u.sedf.period) )
             {
-                /* Weight-driven domains with extratime only. */
+                /* Weight-driven domains with extratime only */
                 for_each_vcpu ( p, v )
                 {
                     EDOM_INFO(v)->extraweight =3D op->u.sedf.weight;
@@ -1425,7 +1347,7 @@ static int sedf_adjust(const struct sche
             }
             else
             {
-                /* Weight-driven domains with real-time execution. */
+                /* Weight-driven domains with real-time execution */
                 for_each_vcpu ( p, v )
                     EDOM_INFO(v)->weight =3D op->u.sedf.weight;
             }
@@ -1435,8 +1357,7 @@ static int sedf_adjust(const struct sche
             /* Time-driven domains. */
             for_each_vcpu ( p, v )
             {
-                /*
-                 * Sanity checking: note that disabling extra weight requi=
res
+                /* Sanity checking: note that disabling extra weight requi=
res
                  * that we set a non-zero slice.
                  */
                 if ( (op->u.sedf.period > PERIOD_MAX) ||
@@ -1477,7 +1398,6 @@ static int sedf_adjust(const struct sche
         op->u.sedf.weight    =3D EDOM_INFO(p->vcpu[0])->weight;
     }
=20
-    PRINT(2,"sedf_adjust_finished\n");
     return 0;
 }
=20

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
-------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa (Italy)




--=-3p5/0djGq6n5G1gGRftX
Content-Disposition: attachment; filename="sedf-debug-cleanup.patch"
Content-Type: text/x-patch; name="sedf-debug-cleanup.patch"; charset="UTF-8"
Content-Transfer-Encoding: base64

IyBIRyBjaGFuZ2VzZXQgcGF0Y2gNCiMgUGFyZW50IDE3ZDk5NjkxZTBlYzFmYTdiYjcxY2YxOGMx
MmNhM2MwNDZjMGM4ZDcNCnNlZGY6IHJlbW92ZSB1c2VsZXNzIHRyYWNpbmcgcHJpbnRrIGFuZCBo
YXJtb25pemUgY29tbWVudHMgc3R5bGUuDQoNCnNjaGVkX3NlZGYuYyB1c2VkIG8gaGF2ZSBpdHMg
b3duIG1lY2hhbmlzbSBmb3IgcHJvZHVjaW5nIHRyYWNpbmctYWxpa2UNCmtpbmQgb2YgaW5mb3Jt
YXRpb24gKGRvbWFpbiBibG9jaywgd2FrZXVwLCBldGMuKS4gTm93YWRheXMsIHdpdGggYW4gZXZl
bg0Kbm90IHNvIGhpZ2ggbnVtYmVyIG9mIHBDUFVzL3ZDUFVzLCBqdXN0IHRyeWluZyB0byBlbmFi
bGUgdGhpcyBtYWtlcw0KdGhlIHNlcmlhbCBjb25zb2xlIGNvbXBsZXRlbHkgdW51c2FibGUsIHBy
b2R1Y2VzIHRvbnMgb2YgdmVyeSBoYXJkIHRvDQpwYXJzZSBhbmQgaW50ZXJwcmVldCBsb2dnaW5n
IGFuZCBjYW4gZWFzaWx5IGxpdmVsb2NrIERvbTAuIE1vcmVvdmVyLA0KcHJldHR5IG11Y2ggdGhl
IHNhbWUgcmVzdWx0IHRoaXMgaXMgc3RydWdnbGluZyB0byBnZXQgdG8sIGlzIGJldHRlcg0KYWNo
aWV2ZWQgYnkgZW5hYmxpbmcgdGhlIHNjaGVkdWxlci1yZWxhdGVkIHRyYWNpbmcgZXZlbnRzLCBh
cw0KaXQgaXMgZm9yIHRoZSBvdGhlciBzY2hlZHVsZXJzIChzYXksIGNyZWRpdCBvciBjcmVkaXQy
KS4NCg0KRm9yIGFsbCB0aGVzZSByZWFzb25zLCB0aGlzIHJlbW92ZXMgdGhhdCBtYWNoaW5lcnkg
Y29tcGxldGVseS4gV2hpbGUgYXQNCml0LCBjaGVjayBpbiBzb21lIGNvc21ldGljcyB0aGF0IGhh
cm1vbml6ZSB0aGUgY29tbWVudHMgd2l0aGltIHRoZW1zZWxmDQphbmQgd2l0aCB0aGUgcmVzdCBv
ZiB0aGUgY29kZSBiYXNlLg0KDQpTaWduZWQtb2ZmLWJ5OiBEYXJpbyBGYWdnaW9saSA8ZGFyaW8u
ZmFnZ2lvbGlAY2l0cml4LmNvbT4NCg0KZGlmZiAtciAxN2Q5OTY5MWUwZWMgeGVuL2NvbW1vbi9z
Y2hlZF9zZWRmLmMNCi0tLSBhL3hlbi9jb21tb24vc2NoZWRfc2VkZi5jCVR1ZSBEZWMgMjAgMTY6
Mzk6NTYgMjAxMSArMDAwMA0KKysrIGIveGVuL2NvbW1vbi9zY2hlZF9zZWRmLmMJVHVlIERlYyAy
MCAxNzozMjo1MiAyMDExICswMDAwDQpAQCAtMTMsMTQgKzEzLDYgQEANCiAjaW5jbHVkZSA8eGVu
L3RpbWUuaD4NCiAjaW5jbHVkZSA8eGVuL2Vycm5vLmg+DQogDQotLyp2ZXJib3NpdHkgc2V0dGlu
Z3MqLw0KLSNkZWZpbmUgU0VERkxFVkVMIDANCi0jZGVmaW5lIFBSSU5UKF9mLCBfYS4uLikgICAg
ICAgICAgICAgICAgICAgICAgICBcDQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXA0KLSAgICAgICAgaWYgKCAoX2YpIDw9IFNFREZMRVZFTCApICAgICAg
ICAgICAgICAgIFwNCi0gICAgICAgICAgICBwcmludGsoX2EgKTsgICAgICAgICAgICAgICAgICAg
ICAgICBcDQotICAgIH0gd2hpbGUgKCAwICkNCi0NCiAjZGVmaW5lIFNFREZfQ1BVT05MSU5FKF9w
b29sKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICAg
KCgoX3Bvb2wpID09IE5VTEwpID8gJmNwdXBvb2xfZnJlZV9jcHVzIDogKF9wb29sKS0+Y3B1X3Zh
bGlkKQ0KIA0KQEAgLTY2LDM0ICs1OCwzNSBAQCBzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8gew0KICAg
ICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7DQogICAgIHN0cnVjdCBsaXN0X2hlYWQgZXh0cmFsaXN0
WzJdOw0KICANCi0gICAgLypQYXJhbWV0ZXJzIGZvciBFREYqLw0KLSAgICBzX3RpbWVfdCAgcGVy
aW9kOyAgLyo9KHJlbGF0aXZlIGRlYWRsaW5lKSovDQotICAgIHNfdGltZV90ICBzbGljZTsgIC8q
PXdvcnN0IGNhc2UgZXhlY3V0aW9uIHRpbWUqLw0KKyAgICAvKiBQYXJhbWV0ZXJzIGZvciBFREYg
Ki8NCisgICAgc190aW1lX3QgIHBlcmlvZDsgIC8qID0ocmVsYXRpdmUgZGVhZGxpbmUpICovDQor
ICAgIHNfdGltZV90ICBzbGljZTsgICAvKiA9d29yc3QgY2FzZSBleGVjdXRpb24gdGltZSAqLw0K
ICANCi0gICAgLypBZHZhY2VkIFBhcmFtZXRlcnMqLw0KLSAgICAvKkxhdGVuY3kgU2NhbGluZyov
DQorICAgIC8qIEFkdmFjZWQgUGFyYW1ldGVycyAqLw0KKw0KKyAgICAvKiBMYXRlbmN5IFNjYWxp
bmcgKi8NCiAgICAgc190aW1lX3QgIHBlcmlvZF9vcmlnOw0KICAgICBzX3RpbWVfdCAgc2xpY2Vf
b3JpZzsNCiAgICAgc190aW1lX3QgIGxhdGVuY3k7DQogIA0KLSAgICAvKnN0YXR1cyBvZiBkb21h
aW4qLw0KKyAgICAvKiBTdGF0dXMgb2YgZG9tYWluICovDQogICAgIGludCAgICAgICBzdGF0dXM7
DQotICAgIC8qd2VpZ2h0cyBmb3IgIlNjaGVkdWxpbmcgZm9yIGJlZ2lubmVycy8gbGF6eS8gZXRj
LiIgOykqLw0KKyAgICAvKiBXZWlnaHRzIGZvciAiU2NoZWR1bGluZyBmb3IgYmVnaW5uZXJzLyBs
YXp5LyBldGMuIiA7KSAqLw0KICAgICBzaG9ydCAgICAgd2VpZ2h0Ow0KICAgICBzaG9ydCAgICAg
ZXh0cmF3ZWlnaHQ7DQotICAgIC8qQm9va2tlZXBpbmcqLw0KKyAgICAvKiBCb29ra2VlcGluZyAq
Lw0KICAgICBzX3RpbWVfdCAgZGVhZGxfYWJzOw0KICAgICBzX3RpbWVfdCAgc2NoZWRfc3RhcnRf
YWJzOw0KICAgICBzX3RpbWVfdCAgY3B1dGltZTsNCi0gICAgLyogdGltZXMgdGhlIGRvbWFpbiB1
bi0vYmxvY2tlZCAqLw0KKyAgICAvKiBUaW1lcyB0aGUgZG9tYWluIHVuLS9ibG9ja2VkICovDQog
ICAgIHNfdGltZV90ICBibG9ja19hYnM7DQogICAgIHNfdGltZV90ICB1bmJsb2NrX2FiczsNCiAg
DQotICAgIC8qc2NvcmVzIGZvciB7dXRpbCwgYmxvY2sgcGVuYWx0eX0td2VpZ2h0ZWQgZXh0cmF0
aW1lIGRpc3RyaWJ1dGlvbiovDQorICAgIC8qIFNjb3JlcyBmb3Ige3V0aWwsIGJsb2NrIHBlbmFs
dHl9LXdlaWdodGVkIGV4dHJhdGltZSBkaXN0cmlidXRpb24gKi8NCiAgICAgaW50ICAgc2NvcmVb
Ml07DQogICAgIHNfdGltZV90ICBzaG9ydF9ibG9ja19sb3N0X3RvdDsNCiAgDQotICAgIC8qU3Rh
dGlzdGljcyovDQorICAgIC8qIFN0YXRpc3RpY3MgKi8NCiAgICAgc190aW1lX3QgIGV4dHJhX3Rp
bWVfdG90Ow0KIA0KICNpZmRlZiBTRURGX1NUQVRTDQpAQCAtMTU4LDE4ICsxNTEsMTYgQEAgc3Rh
dGljIGlubGluZSB2b2lkIGV4dHJhcV9kZWwoc3RydWN0IHZjcA0KIHsNCiAgICAgc3RydWN0IGxp
c3RfaGVhZCAqbGlzdCA9IEVYVFJBTElTVChkLGkpOw0KICAgICBBU1NFUlQoZXh0cmFxX29uKGQs
aSkpOw0KLSAgICBQUklOVCgzLCAiUmVtb3ZpbmcgZG9tYWluICVpLiVpIGZyb20gTCVpIGV4dHJh
cVxuIiwNCi0gICAgICAgICAgZC0+ZG9tYWluLT5kb21haW5faWQsIGQtPnZjcHVfaWQsIGkpOw0K
ICAgICBsaXN0X2RlbChsaXN0KTsNCiAgICAgbGlzdC0+bmV4dCA9IE5VTEw7DQogICAgIEFTU0VS
VCghZXh0cmFxX29uKGQsIGkpKTsNCiB9DQogDQotLyogYWRkcyBhIGRvbWFpbiB0byB0aGUgcXVl
dWUgb2YgcHJvY2Vzc2VzIHdoaWNoIGFyZSBhd2FyZSBvZiBleHRyYSB0aW1lLiBMaXN0DQotICAg
aXMgc29ydGVkIGJ5IHNjb3JlLCB3aGVyZSBhIGxvd2VyIHNjb3JlIG1lYW5zIGhpZ2hlciBwcmlv
cml0eSBmb3IgYW4gZXh0cmENCi0gICBzbGljZS4gSXQgYWxzbyB1cGRhdGVzIHRoZSBzY29yZSwg
Ynkgc2ltcGx5IHN1YnRyYWN0aW5nIGEgZml4ZWQgdmFsdWUgZnJvbQ0KLSAgIGVhY2ggZW50cnks
IGluIG9yZGVyIHRvIGF2b2lkIG92ZXJmbG93LiBUaGUgYWxnb3JpdGhtIHdvcmtzIGJ5IHNpbXBs
eQ0KLSAgIGNoYXJnaW5nIGVhY2ggZG9tYWluIHRoYXQgcmVjaWV2ZWQgZXh0cmF0aW1lIHdpdGgg
YW4gaW52ZXJzZSBvZiBpdHMgd2VpZ2h0Lg0KKy8qIEFkZHMgYSBkb21haW4gdG8gdGhlIHF1ZXVl
IG9mIHByb2Nlc3NlcyB3aGljaCBhcmUgYXdhcmUgb2YgZXh0cmEgdGltZS4gTGlzdA0KKyAqIGlz
IHNvcnRlZCBieSBzY29yZSwgd2hlcmUgYSBsb3dlciBzY29yZSBtZWFucyBoaWdoZXIgcHJpb3Jp
dHkgZm9yIGFuIGV4dHJhDQorICogc2xpY2UuIEl0IGFsc28gdXBkYXRlcyB0aGUgc2NvcmUsIGJ5
IHNpbXBseSBzdWJ0cmFjdGluZyBhIGZpeGVkIHZhbHVlIGZyb20NCisgKiBlYWNoIGVudHJ5LCBp
biBvcmRlciB0byBhdm9pZCBvdmVyZmxvdy4gVGhlIGFsZ29yaXRobSB3b3JrcyBieSBzaW1wbHkN
CisgKiBjaGFyZ2luZyBlYWNoIGRvbWFpbiB0aGF0IHJlY2lldmVkIGV4dHJhdGltZSB3aXRoIGFu
IGludmVyc2Ugb2YgaXRzIHdlaWdodC4NCiAgKi8gDQogc3RhdGljIGlubGluZSB2b2lkIGV4dHJh
cV9hZGRfc29ydF91cGRhdGUoc3RydWN0IHZjcHUgKmQsIGludCBpLCBpbnQgc3ViKQ0KIHsNCkBA
IC0xNzgsMTMgKzE2OSw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBleHRyYXFfYWRkX3NvcnRfdXBk
YXQNCiAgDQogICAgIEFTU0VSVCghZXh0cmFxX29uKGQsaSkpOw0KIA0KLSAgICBQUklOVCgzLCAi
QWRkaW5nIGRvbWFpbiAlaS4laSAoc2NvcmU9ICVpLCBzaG9ydF9wZW49ICUiUFJJaTY0IikiDQot
ICAgICAgICAgICIgdG8gTCVpIGV4dHJhcVxuIiwNCi0gICAgICAgICAgZC0+ZG9tYWluLT5kb21h
aW5faWQsIGQtPnZjcHVfaWQsIEVET01fSU5GTyhkKS0+c2NvcmVbaV0sDQotICAgICAgICAgIEVE
T01fSU5GTyhkKS0+c2hvcnRfYmxvY2tfbG9zdF90b3QsIGkpOw0KLQ0KLSAgICAvKg0KLSAgICAg
KiBJdGVyYXRlIHRocm91Z2ggYWxsIGVsZW1lbnRzIHRvIGZpbmQgb3VyICJob2xlIiBhbmQgb24g
b3VyIHdheQ0KKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggYWxsIGVsZW1lbnRzIHRvIGZpbmQgb3Vy
ICJob2xlIiBhbmQgb24gb3VyIHdheQ0KICAgICAgKiB1cGRhdGUgYWxsIHRoZSBvdGhlciBzY29y
ZXMuDQogICAgICAqLw0KICAgICBsaXN0X2Zvcl9lYWNoICggY3VyLCBFWFRSQVEoZC0+cHJvY2Vz
c29yLCBpKSApDQpAQCAtMTkzLDI1ICsxNzgsMTggQEAgc3RhdGljIGlubGluZSB2b2lkIGV4dHJh
cV9hZGRfc29ydF91cGRhdA0KICAgICAgICAgY3VyaW5mLT5zY29yZVtpXSAtPSBzdWI7DQogICAg
ICAgICBpZiAoIEVET01fSU5GTyhkKS0+c2NvcmVbaV0gPCBjdXJpbmYtPnNjb3JlW2ldICkNCiAg
ICAgICAgICAgICBicmVhazsNCi0gICAgICAgIFBSSU5UKDQsIlx0YmVoaW5kIGRvbWFpbiAlaS4l
aSAoc2NvcmU9ICVpKVxuIiwNCi0gICAgICAgICAgICAgIGN1cmluZi0+dmNwdS0+ZG9tYWluLT5k
b21haW5faWQsDQotICAgICAgICAgICAgICBjdXJpbmYtPnZjcHUtPnZjcHVfaWQsIGN1cmluZi0+
c2NvcmVbaV0pOw0KICAgICB9DQogDQotICAgIC8qIGN1ciBub3cgY29udGFpbnMgdGhlIGVsZW1l
bnQsIGJlZm9yZSB3aGljaCB3ZSdsbCBlbnF1ZXVlLiAqLw0KLSAgICBQUklOVCgzLCAiXHRsaXN0
X2FkZCB0byAlcFxuIiwgY3VyLT5wcmV2KTsNCisgICAgLyogY3VyIG5vdyBjb250YWlucyB0aGUg
ZWxlbWVudCwgYmVmb3JlIHdoaWNoIHdlJ2xsIGVucXVldWUgKi8NCiAgICAgbGlzdF9hZGQoRVhU
UkFMSVNUKGQsaSksY3VyLT5wcmV2KTsNCiAgDQotICAgIC8qIENvbnRpbnVlIHVwZGF0aW5nIHRo
ZSBleHRyYXEuICovDQorICAgIC8qIENvbnRpbnVlIHVwZGF0aW5nIHRoZSBleHRyYXEgKi8NCiAg
ICAgaWYgKCAoY3VyICE9IEVYVFJBUShkLT5wcm9jZXNzb3IsaSkpICYmIHN1YiApDQogICAgIHsN
CiAgICAgICAgIGZvciAoIGN1ciA9IGN1ci0+bmV4dDsgY3VyICE9IEVYVFJBUShkLT5wcm9jZXNz
b3IsaSk7IGN1ciA9IGN1ci0+bmV4dCApDQogICAgICAgICB7DQogICAgICAgICAgICAgY3VyaW5m
ID0gbGlzdF9lbnRyeShjdXIsc3RydWN0IHNlZGZfdmNwdV9pbmZvLCBleHRyYWxpc3RbaV0pOw0K
ICAgICAgICAgICAgIGN1cmluZi0+c2NvcmVbaV0gLT0gc3ViOw0KLSAgICAgICAgICAgIFBSSU5U
KDQsICJcdHVwZGF0aW5nIGRvbWFpbiAlaS4laSAoc2NvcmU9ICV1KVxuIiwNCi0gICAgICAgICAg
ICAgICAgICBjdXJpbmYtPnZjcHUtPmRvbWFpbi0+ZG9tYWluX2lkLCANCi0gICAgICAgICAgICAg
ICAgICBjdXJpbmYtPnZjcHUtPnZjcHVfaWQsIGN1cmluZi0+c2NvcmVbaV0pOw0KICAgICAgICAg
fQ0KICAgICB9DQogDQpAQCAtMjIxLDI5ICsxOTksMTQgQEAgc3RhdGljIGlubGluZSB2b2lkIGV4
dHJhcV9jaGVjayhzdHJ1Y3Qgdg0KIHsNCiAgICAgaWYgKCBleHRyYXFfb24oZCwgRVhUUkFfVVRJ
TF9RKSApDQogICAgIHsNCi0gICAgICAgIFBSSU5UKDIsIkRvbSAlaS4laSBpcyBvbiBMMSBleHRy
YVFcbiIsDQotICAgICAgICAgICAgICBkLT5kb21haW4tPmRvbWFpbl9pZCwgZC0+dmNwdV9pZCk7
DQotDQogICAgICAgICBpZiAoICEoRURPTV9JTkZPKGQpLT5zdGF0dXMgJiBFWFRSQV9BV0FSRSkg
JiYNCiAgICAgICAgICAgICAgIWV4dHJhX3J1bnMoRURPTV9JTkZPKGQpKSApDQotICAgICAgICB7
DQogICAgICAgICAgICAgZXh0cmFxX2RlbChkLCBFWFRSQV9VVElMX1EpOw0KLSAgICAgICAgICAg
IFBSSU5UKDIsIlJlbW92ZWQgZG9tICVpLiVpIGZyb20gTDEgZXh0cmFRXG4iLA0KLSAgICAgICAg
ICAgICAgICAgIGQtPmRvbWFpbi0+ZG9tYWluX2lkLCBkLT52Y3B1X2lkKTsNCi0gICAgICAgIH0N
CiAgICAgfQ0KICAgICBlbHNlDQogICAgIHsNCi0gICAgICAgIFBSSU5UKDIsICJEb20gJWkuJWkg
aXMgTk9UIG9uIEwxIGV4dHJhUVxuIiwNCi0gICAgICAgICAgICAgIGQtPmRvbWFpbi0+ZG9tYWlu
X2lkLA0KLSAgICAgICAgICAgICAgZC0+dmNwdV9pZCk7DQotDQogICAgICAgICBpZiAoIChFRE9N
X0lORk8oZCktPnN0YXR1cyAmIEVYVFJBX0FXQVJFKSAmJiBzZWRmX3J1bm5hYmxlKGQpICkNCi0g
ICAgICAgIHsNCiAgICAgICAgICAgICBleHRyYXFfYWRkX3NvcnRfdXBkYXRlKGQsIEVYVFJBX1VU
SUxfUSwgMCk7DQotICAgICAgICAgICAgUFJJTlQoMiwiQWRkZWQgZG9tICVpLiVpIHRvIEwxIGV4
dHJhUVxuIiwNCi0gICAgICAgICAgICAgICAgICBkLT5kb21haW4tPmRvbWFpbl9pZCwgZC0+dmNw
dV9pZCk7DQotICAgICAgICB9DQogICAgIH0NCiB9DQogDQpAQCAtMjUyLDcgKzIxNSw3IEBAIHN0
YXRpYyBpbmxpbmUgdm9pZCBleHRyYXFfY2hlY2tfYWRkX3VuYmwNCiAgICAgc3RydWN0IHNlZGZf
dmNwdV9pbmZvICppbmYgPSBFRE9NX0lORk8oZCk7DQogDQogICAgIGlmICggaW5mLT5zdGF0dXMg
JiBFWFRSQV9BV0FSRSApDQotICAgICAgICAvKiBQdXQgb24gdGhlIHdlaWdodGVkIGV4dHJhcSB3
aXRob3V0IHVwZGF0aW5nIGFueSBzY29yZXMuICovDQorICAgICAgICAvKiBQdXQgb24gdGhlIHdl
aWdodGVkIGV4dHJhcSB3aXRob3V0IHVwZGF0aW5nIGFueSBzY29yZXMgKi8NCiAgICAgICAgIGV4
dHJhcV9hZGRfc29ydF91cGRhdGUoZCwgRVhUUkFfVVRJTF9RLCAwKTsNCiB9DQogDQpAQCAtMjY1
LDggKzIyOCw2IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2RlbF9mcm9tX3F1ZXVlKHN0cnUNCiB7
DQogICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSBMSVNUKGQpOw0KICAgICBBU1NFUlQoX190
YXNrX29uX3F1ZXVlKGQpKTsNCi0gICAgUFJJTlQoMywiUmVtb3ZpbmcgZG9tYWluICVpLiVpIChi
b3A9ICUiUFJJdTY0IikgZnJvbSBydW5xL3dhaXRxXG4iLA0KLSAgICAgICAgICBkLT5kb21haW4t
PmRvbWFpbl9pZCwgZC0+dmNwdV9pZCwgUEVSSU9EX0JFR0lOKEVET01fSU5GTyhkKSkpOw0KICAg
ICBsaXN0X2RlbChsaXN0KTsNCiAgICAgbGlzdC0+bmV4dCA9IE5VTEw7DQogICAgIEFTU0VSVCgh
X190YXNrX29uX3F1ZXVlKGQpKTsNCkBAIC0yNzksMTMgKzI0MCwxMiBAQCBzdGF0aWMgaW5saW5l
IHZvaWQgbGlzdF9pbnNlcnRfc29ydCgNCiB7DQogICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgICpj
dXI7DQogDQotICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgZWxlbWVudHMgdG8gZmluZCBvdXIg
ImhvbGUiLiAqLw0KKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggYWxsIGVsZW1lbnRzIHRvIGZpbmQg
b3VyICJob2xlIiAqLw0KICAgICBsaXN0X2Zvcl9lYWNoKCBjdXIsIGxpc3QgKQ0KICAgICAgICAg
aWYgKCBjb21wKGVsZW1lbnQsIGN1cikgPCAwICkNCiAgICAgICAgICAgICBicmVhazsNCiANCi0g
ICAgLyogY3VyIG5vdyBjb250YWlucyB0aGUgZWxlbWVudCwgYmVmb3JlIHdoaWNoIHdlJ2xsIGVu
cXVldWUuICovDQotICAgIFBSSU5UKDMsIlx0bGlzdF9hZGQgdG8gJXBcbiIsY3VyLT5wcmV2KTsN
CisgICAgLyogY3VyIG5vdyBjb250YWlucyB0aGUgZWxlbWVudCwgYmVmb3JlIHdoaWNoIHdlJ2xs
IGVucXVldWUgKi8NCiAgICAgbGlzdF9hZGQoZWxlbWVudCwgY3VyLT5wcmV2KTsNCiB9DQogDQpA
QCAtMzAzLDMwICsyNjMsMjYgQEAgc3RhdGljIGludCBuYW1lIyNfY29tcChzdHJ1Y3QgbGlzdF9o
ZWFkKg0KICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwNCiB9DQogDQotLyogYWRkcyBhIGRvbWFpbiB0byB0aGUg
cXVldWUgb2YgcHJvY2Vzc2VzIHdoaWNoIHdhaXQgZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlDQot
ICAgbmV4dCBwZXJpb2Q7IHRoaXMgbGlzdCBpcyB0aGVyZWZvcmUgc29ydGV0IGJ5IHRoaXMgdGlt
ZSwgd2hpY2ggaXMgc2ltcGx5DQotICAgYWJzb2wuIGRlYWRsaW5lIC0gcGVyaW9kDQorLyogQWRk
cyBhIGRvbWFpbiB0byB0aGUgcXVldWUgb2YgcHJvY2Vzc2VzIHdoaWNoIHdhaXQgZm9yIHRoZSBi
ZWdpbm5pbmcgb2YgdGhlDQorICogbmV4dCBwZXJpb2Q7IHRoaXMgbGlzdCBpcyB0aGVyZWZvcmUg
c29ydGV0IGJ5IHRoaXMgdGltZSwgd2hpY2ggaXMgc2ltcGx5DQorICogYWJzb2wuIGRlYWRsaW5l
IC0gcGVyaW9kLg0KICAqLyANCiBET01BSU5fQ09NUEFSRVIod2FpdHEsIGxpc3QsIFBFUklPRF9C
RUdJTihkMSksIFBFUklPRF9CRUdJTihkMikpOw0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2FkZF90
b193YWl0cXVldWVfc29ydChzdHJ1Y3QgdmNwdSAqdikNCiB7DQogICAgIEFTU0VSVCghX190YXNr
X29uX3F1ZXVlKHYpKTsNCi0gICAgUFJJTlQoMywiQWRkaW5nIGRvbWFpbiAlaS4laSAoYm9wPSAl
IlBSSXU2NCIpIHRvIHdhaXRxXG4iLA0KLSAgICAgICAgICB2LT5kb21haW4tPmRvbWFpbl9pZCwg
di0+dmNwdV9pZCwgUEVSSU9EX0JFR0lOKEVET01fSU5GTyh2KSkpOw0KICAgICBsaXN0X2luc2Vy
dF9zb3J0KFdBSVRRKHYtPnByb2Nlc3NvciksIExJU1QodiksIHdhaXRxX2NvbXApOw0KICAgICBB
U1NFUlQoX190YXNrX29uX3F1ZXVlKHYpKTsNCiB9DQogDQotLyogYWRkcyBhIGRvbWFpbiB0byB0
aGUgcXVldWUgb2YgcHJvY2Vzc2VzIHdoaWNoIGhhdmUgc3RhcnRlZCB0aGVpciBjdXJyZW50DQot
ICAgcGVyaW9kIGFuZCBhcmUgcnVubmFibGUgKGkuZS4gbm90IGJsb2NrZWQsIGRpZWluZywuLi4p
LiBUaGUgZmlyc3QgZWxlbWVudA0KLSAgIG9uIHRoaXMgbGlzdCBpcyBydW5uaW5nIG9uIHRoZSBw
cm9jZXNzb3IsIGlmIHRoZSBsaXN0IGlzIGVtcHR5IHRoZSBpZGxlDQotICAgdGFzayB3aWxsIHJ1
bi4gQXMgd2UgYXJlIGltcGxlbWVudGluZyBFREYsIHRoaXMgbGlzdCBpcyBzb3J0ZWQgYnkgZGVh
ZGxpbmVzLg0KKy8qIEFkZHMgYSBkb21haW4gdG8gdGhlIHF1ZXVlIG9mIHByb2Nlc3NlcyB3aGlj
aCBoYXZlIHN0YXJ0ZWQgdGhlaXIgY3VycmVudA0KKyAqIHBlcmlvZCBhbmQgYXJlIHJ1bm5hYmxl
IChpLmUuIG5vdCBibG9ja2VkLCBkaWVpbmcsLi4uKS4gVGhlIGZpcnN0IGVsZW1lbnQNCisgKiBv
biB0aGlzIGxpc3QgaXMgcnVubmluZyBvbiB0aGUgcHJvY2Vzc29yLCBpZiB0aGUgbGlzdCBpcyBl
bXB0eSB0aGUgaWRsZQ0KKyAqIHRhc2sgd2lsbCBydW4uIEFzIHdlIGFyZSBpbXBsZW1lbnRpbmcg
RURGLCB0aGlzIGxpc3QgaXMgc29ydGVkIGJ5IGRlYWRsaW5lcy4NCiAgKi8gDQogRE9NQUlOX0NP
TVBBUkVSKHJ1bnEsIGxpc3QsIGQxLT5kZWFkbF9hYnMsIGQyLT5kZWFkbF9hYnMpOw0KIHN0YXRp
YyBpbmxpbmUgdm9pZCBfX2FkZF90b19ydW5xdWV1ZV9zb3J0KHN0cnVjdCB2Y3B1ICp2KQ0KIHsN
Ci0gICAgUFJJTlQoMywiQWRkaW5nIGRvbWFpbiAlaS4laSAoZGVhZGw9ICUiUFJJdTY0IikgdG8g
cnVucVxuIiwNCi0gICAgICAgICAgdi0+ZG9tYWluLT5kb21haW5faWQsIHYtPnZjcHVfaWQsIEVE
T01fSU5GTyh2KS0+ZGVhZGxfYWJzKTsNCiAgICAgbGlzdF9pbnNlcnRfc29ydChSVU5RKHYtPnBy
b2Nlc3NvciksIExJU1QodiksIHJ1bnFfY29tcCk7DQogfQ0KIA0KQEAgLTQ0NSwyMiArNDAxLDIx
IEBAIHN0YXRpYyBpbnQgc2VkZl9waWNrX2NwdShjb25zdCBzdHJ1Y3Qgc2MNCiAgICAgcmV0dXJu
IGNwdW1hc2tfZmlyc3QoJm9ubGluZV9hZmZpbml0eSk7DQogfQ0KIA0KLS8qDQotICogSGFuZGxl
cyB0aGUgcmVzY2hlZHVsaW5nICYgYm9va2tlZXBpbmcgb2YgZG9tYWlucyBydW5uaW5nIGluIHRo
ZWlyDQorDQorLyogSGFuZGxlcyB0aGUgcmVzY2hlZHVsaW5nICYgYm9va2tlZXBpbmcgb2YgZG9t
YWlucyBydW5uaW5nIGluIHRoZWlyDQogICogZ3VhcmFudGVlZCB0aW1lc2xpY2UuDQogICovDQog
c3RhdGljIHZvaWQgZGVzY2hlZF9lZGZfZG9tKHNfdGltZV90IG5vdywgc3RydWN0IHZjcHUqIGQp
DQogew0KICAgICBzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8qIGluZiA9IEVET01fSU5GTyhkKTsNCiAN
Ci0gICAgLyogQ3VycmVudCBkb21haW4gaXMgcnVubmluZyBpbiByZWFsIHRpbWUgbW9kZS4gKi8N
CisgICAgLyogQ3VycmVudCBkb21haW4gaXMgcnVubmluZyBpbiByZWFsIHRpbWUgbW9kZSAqLw0K
ICAgICBBU1NFUlQoX190YXNrX29uX3F1ZXVlKGQpKTsNCiANCi0gICAgLyogVXBkYXRlIHRoZSBk
b21haW4ncyBjcHV0aW1lLiAqLw0KKyAgICAvKiBVcGRhdGUgdGhlIGRvbWFpbidzIGNwdXRpbWUg
Ki8NCiAgICAgaW5mLT5jcHV0aW1lICs9IG5vdyAtIGluZi0+c2NoZWRfc3RhcnRfYWJzOw0KIA0K
LSAgICAvKg0KLSAgICAgKiBTY2hlZHVsaW5nIGRlY2lzaW9ucyB3aGljaCBkb24ndCByZW1vdmUg
dGhlIHJ1bm5pbmcgZG9tYWluIGZyb20gdGhlDQorICAgIC8qIFNjaGVkdWxpbmcgZGVjaXNpb25z
IHdoaWNoIGRvbid0IHJlbW92ZSB0aGUgcnVubmluZyBkb21haW4gZnJvbSB0aGUNCiAgICAgICog
cnVucS4gDQogICAgICAqLw0KICAgICBpZiAoIChpbmYtPmNwdXRpbWUgPCBpbmYtPnNsaWNlKSAm
JiBzZWRmX3J1bm5hYmxlKGQpICkNCkBAIC00NjgsOCArNDIzLDcgQEAgc3RhdGljIHZvaWQgZGVz
Y2hlZF9lZGZfZG9tKHNfdGltZV90IG5vdw0KICAgDQogICAgIF9fZGVsX2Zyb21fcXVldWUoZCk7
DQogICANCi0gICAgLyoNCi0gICAgICogTWFuYWdlIGJvb2trZWVwaW5nIChpLmUuIGNhbGN1bGF0
ZSBuZXh0IGRlYWRsaW5lLCBtZW1vcmlzZQ0KKyAgICAvKiBNYW5hZ2UgYm9va2tlZXBpbmcgKGku
ZS4gY2FsY3VsYXRlIG5leHQgZGVhZGxpbmUsIG1lbW9yaXNlDQogICAgICAqIG92ZXJydW4tdGlt
ZSBvZiBzbGljZSkgb2YgZmluaXNoZWQgZG9tYWlucy4NCiAgICAgICovDQogICAgIGlmICggaW5m
LT5jcHV0aW1lID49IGluZi0+c2xpY2UgKQ0KQEAgLTQ3OCwzMCArNDMyLDMwIEBAIHN0YXRpYyB2
b2lkIGRlc2NoZWRfZWRmX2RvbShzX3RpbWVfdCBub3cNCiAgIA0KICAgICAgICAgaWYgKCBpbmYt
PnBlcmlvZCA8IGluZi0+cGVyaW9kX29yaWcgKQ0KICAgICAgICAgew0KLSAgICAgICAgICAgIC8q
IFRoaXMgZG9tYWluIHJ1bnMgaW4gbGF0ZW5jeSBzY2FsaW5nIG9yIGJ1cnN0IG1vZGUuICovDQor
ICAgICAgICAgICAgLyogVGhpcyBkb21haW4gcnVucyBpbiBsYXRlbmN5IHNjYWxpbmcgb3IgYnVy
c3QgbW9kZSAqLw0KICAgICAgICAgICAgIGluZi0+cGVyaW9kICo9IDI7DQogICAgICAgICAgICAg
aW5mLT5zbGljZSAgKj0gMjsNCiAgICAgICAgICAgICBpZiAoIChpbmYtPnBlcmlvZCA+IGluZi0+
cGVyaW9kX29yaWcpIHx8DQogICAgICAgICAgICAgICAgICAoaW5mLT5zbGljZSA+IGluZi0+c2xp
Y2Vfb3JpZykgKQ0KICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLyogUmVzZXQgc2xp
Y2UgYW5kIHBlcmlvZC4gKi8NCisgICAgICAgICAgICAgICAgLyogUmVzZXQgc2xpY2UgYW5kIHBl
cmlvZCAqLw0KICAgICAgICAgICAgICAgICBpbmYtPnBlcmlvZCA9IGluZi0+cGVyaW9kX29yaWc7
DQogICAgICAgICAgICAgICAgIGluZi0+c2xpY2UgPSBpbmYtPnNsaWNlX29yaWc7DQogICAgICAg
ICAgICAgfQ0KICAgICAgICAgfQ0KIA0KLSAgICAgICAgLyogU2V0IG5leHQgZGVhZGxpbmUuICov
DQorICAgICAgICAvKiBTZXQgbmV4dCBkZWFkbGluZSAqLw0KICAgICAgICAgaW5mLT5kZWFkbF9h
YnMgKz0gaW5mLT5wZXJpb2Q7DQogICAgIH0NCiAgDQotICAgIC8qIEFkZCBhIHJ1bm5hYmxlIGRv
bWFpbiB0byB0aGUgd2FpdHF1ZXVlLiAqLw0KKyAgICAvKiBBZGQgYSBydW5uYWJsZSBkb21haW4g
dG8gdGhlIHdhaXRxdWV1ZSAqLw0KICAgICBpZiAoIHNlZGZfcnVubmFibGUoZCkgKQ0KICAgICB7
DQogICAgICAgICBfX2FkZF90b193YWl0cXVldWVfc29ydChkKTsNCiAgICAgfQ0KICAgICBlbHNl
DQogICAgIHsNCi0gICAgICAgIC8qIFdlIGhhdmUgYSBibG9ja2VkIHJlYWx0aW1lIHRhc2sgLT4g
cmVtb3ZlIGl0IGZyb20gZXhxcyB0b28uICovDQorICAgICAgICAvKiBXZSBoYXZlIGEgYmxvY2tl
ZCByZWFsdGltZSB0YXNrIC0+IHJlbW92ZSBpdCBmcm9tIGV4cXMgdG9vICovDQogICAgICAgICBp
ZiAoIGV4dHJhcV9vbihkLCBFWFRSQV9QRU5fUSkgKQ0KICAgICAgICAgICAgIGV4dHJhcV9kZWwo
ZCwgRVhUUkFfUEVOX1EpOw0KICAgICAgICAgaWYgKCBleHRyYXFfb24oZCwgRVhUUkFfVVRJTF9R
KSApDQpAQCAtNTIxLDczICs0NzUsNTkgQEAgc3RhdGljIHZvaWQgdXBkYXRlX3F1ZXVlcygNCiAg
ICAgc3RydWN0IGxpc3RfaGVhZCAgICAgKmN1ciwgKnRtcDsNCiAgICAgc3RydWN0IHNlZGZfdmNw
dV9pbmZvICpjdXJpbmY7DQogIA0KLSAgICBQUklOVCgzLCJVcGRhdGluZyB3YWl0cS4uXG4iKTsN
Ci0NCi0gICAgLyoNCi0gICAgICogQ2hlY2sgZm9yIHRoZSBmaXJzdCBlbGVtZW50cyBvZiB0aGUg
d2FpdHF1ZXVlLCB3aGV0aGVyIHRoZWlyDQorICAgIC8qIENoZWNrIGZvciB0aGUgZmlyc3QgZWxl
bWVudHMgb2YgdGhlIHdhaXRxdWV1ZSwgd2hldGhlciB0aGVpcg0KICAgICAgKiBuZXh0IHBlcmlv
ZCBoYXMgYWxyZWFkeSBzdGFydGVkLg0KICAgICAgKi8NCiAgICAgbGlzdF9mb3JfZWFjaF9zYWZl
ICggY3VyLCB0bXAsIHdhaXRxICkNCiAgICAgew0KICAgICAgICAgY3VyaW5mID0gbGlzdF9lbnRy
eShjdXIsIHN0cnVjdCBzZWRmX3ZjcHVfaW5mbywgbGlzdCk7DQotICAgICAgICBQUklOVCg0LCJc
dExvb2tpbmcgQCBkb20gJWkuJWlcbiIsDQotICAgICAgICAgICAgICBjdXJpbmYtPnZjcHUtPmRv
bWFpbi0+ZG9tYWluX2lkLCBjdXJpbmYtPnZjcHUtPnZjcHVfaWQpOw0KICAgICAgICAgaWYgKCBQ
RVJJT0RfQkVHSU4oY3VyaW5mKSA+IG5vdyApDQogICAgICAgICAgICAgYnJlYWs7DQogICAgICAg
ICBfX2RlbF9mcm9tX3F1ZXVlKGN1cmluZi0+dmNwdSk7DQogICAgICAgICBfX2FkZF90b19ydW5x
dWV1ZV9zb3J0KGN1cmluZi0+dmNwdSk7DQogICAgIH0NCiAgDQotICAgIFBSSU5UKDMsIlVwZGF0
aW5nIHJ1bnEuLlxuIik7DQotDQotICAgIC8qIFByb2Nlc3MgdGhlIHJ1bnEsIGZpbmQgZG9tYWlu
cyB0aGF0IGFyZSBvbiB0aGUgcnVucSB0aGF0IHNob3VsZG4ndC4gKi8NCisgICAgLyogUHJvY2Vz
cyB0aGUgcnVucSwgZmluZCBkb21haW5zIHRoYXQgYXJlIG9uIHRoZSBydW5xIHRoYXQgc2hvdWxk
bid0ICovDQogICAgIGxpc3RfZm9yX2VhY2hfc2FmZSAoIGN1ciwgdG1wLCBydW5xICkNCiAgICAg
ew0KICAgICAgICAgY3VyaW5mID0gbGlzdF9lbnRyeShjdXIsc3RydWN0IHNlZGZfdmNwdV9pbmZv
LGxpc3QpOw0KLSAgICAgICAgUFJJTlQoNCwiXHRMb29raW5nIEAgZG9tICVpLiVpXG4iLA0KLSAg
ICAgICAgICAgICAgY3VyaW5mLT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZCwgY3VyaW5mLT52Y3B1
LT52Y3B1X2lkKTsNCiANCiAgICAgICAgIGlmICggdW5saWtlbHkoY3VyaW5mLT5zbGljZSA9PSAw
KSApDQogICAgICAgICB7DQotICAgICAgICAgICAgLyogSWdub3JlIGRvbWFpbnMgd2l0aCBlbXB0
eSBzbGljZS4gKi8NCi0gICAgICAgICAgICBQUklOVCg0LCJcdFVwZGF0aW5nIHplcm8tc2xpY2Ug
ZG9tYWluICVpLiVpXG4iLA0KLSAgICAgICAgICAgICAgICAgIGN1cmluZi0+dmNwdS0+ZG9tYWlu
LT5kb21haW5faWQsDQotICAgICAgICAgICAgICAgICAgY3VyaW5mLT52Y3B1LT52Y3B1X2lkKTsN
CisgICAgICAgICAgICAvKiBJZ25vcmUgZG9tYWlucyB3aXRoIGVtcHR5IHNsaWNlICovDQogICAg
ICAgICAgICAgX19kZWxfZnJvbV9xdWV1ZShjdXJpbmYtPnZjcHUpOw0KIA0KLSAgICAgICAgICAg
IC8qIE1vdmUgdGhlbSB0byB0aGVpciBuZXh0IHBlcmlvZC4gKi8NCisgICAgICAgICAgICAvKiBN
b3ZlIHRoZW0gdG8gdGhlaXIgbmV4dCBwZXJpb2QgKi8NCiAgICAgICAgICAgICBjdXJpbmYtPmRl
YWRsX2FicyArPSBjdXJpbmYtPnBlcmlvZDsNCiANCi0gICAgICAgICAgICAvKiBFbnN1cmUgdGhh
dCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgcGVyaW9kIGlzIGluIHRoZSBmdXR1cmUuICovDQorICAg
ICAgICAgICAgLyogRW5zdXJlIHRoYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHBlcmlvZCBpcyBp
biB0aGUgZnV0dXJlICovDQogICAgICAgICAgICAgaWYgKCB1bmxpa2VseShQRVJJT0RfQkVHSU4o
Y3VyaW5mKSA8IG5vdykgKQ0KICAgICAgICAgICAgICAgICBjdXJpbmYtPmRlYWRsX2FicyArPSAN
CiAgICAgICAgICAgICAgICAgICAgIChESVZfVVAobm93IC0gUEVSSU9EX0JFR0lOKGN1cmluZiks
DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmluZi0+cGVyaW9kKSkgKiBjdXJpbmYt
PnBlcmlvZDsNCiANCi0gICAgICAgICAgICAvKiBQdXQgdGhlbSBiYWNrIGludG8gdGhlIHF1ZXVl
LiAqLw0KKyAgICAgICAgICAgIC8qIFB1dCB0aGVtIGJhY2sgaW50byB0aGUgcXVldWUgKi8NCiAg
ICAgICAgICAgICBfX2FkZF90b193YWl0cXVldWVfc29ydChjdXJpbmYtPnZjcHUpOw0KICAgICAg
ICAgfQ0KICAgICAgICAgZWxzZSBpZiAoIHVubGlrZWx5KChjdXJpbmYtPmRlYWRsX2FicyA8IG5v
dykgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VyaW5mLT5jcHV0aW1lID4gY3Vy
aW5mLT5zbGljZSkpICkNCiAgICAgICAgIHsNCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAg
ICAqIFdlIG1pc3NlZCB0aGUgZGVhZGxpbmUgb3IgdGhlIHNsaWNlIHdhcyBhbHJlYWR5IGZpbmlz
aGVkLg0KKyAgICAgICAgICAgIC8qIFdlIG1pc3NlZCB0aGUgZGVhZGxpbmUgb3IgdGhlIHNsaWNl
IHdhcyBhbHJlYWR5IGZpbmlzaGVkLg0KICAgICAgICAgICAgICAqIE1pZ2h0IGhhcGVuIGJlY2F1
c2Ugb2YgZG9tX2Fkai4NCiAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBQUklOVCg0LCJc
dERvbWFpbiAlaS4laSBleGNlZWRlZCBpdCdzIGRlYWRsaW5lLyINCi0gICAgICAgICAgICAgICAg
ICAic2xpY2UgKCUiUFJJdTY0IiAvICUiUFJJdTY0Iikgbm93OiAlIlBSSXU2NA0KLSAgICAgICAg
ICAgICAgICAgICIgY3B1dGltZTogJSJQUkl1NjQiXG4iLA0KLSAgICAgICAgICAgICAgICAgIGN1
cmluZi0+dmNwdS0+ZG9tYWluLT5kb21haW5faWQsDQotICAgICAgICAgICAgICAgICAgY3VyaW5m
LT52Y3B1LT52Y3B1X2lkLA0KLSAgICAgICAgICAgICAgICAgIGN1cmluZi0+ZGVhZGxfYWJzLCBj
dXJpbmYtPnNsaWNlLCBub3csDQotICAgICAgICAgICAgICAgICAgY3VyaW5mLT5jcHV0aW1lKTsN
CisgICAgICAgICAgICBwcmludGsoIlx0RG9tYWluICVpLiVpIGV4Y2VlZGVkIGl0J3MgZGVhZGxp
bmUvIg0KKyAgICAgICAgICAgICAgICAgICAic2xpY2UgKCUiUFJJdTY0IiAvICUiUFJJdTY0Iikg
bm93OiAlIlBSSXU2NA0KKyAgICAgICAgICAgICAgICAgICAiIGNwdXRpbWU6ICUiUFJJdTY0Ilxu
IiwNCisgICAgICAgICAgICAgICAgICAgY3VyaW5mLT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZCwN
CisgICAgICAgICAgICAgICAgICAgY3VyaW5mLT52Y3B1LT52Y3B1X2lkLA0KKyAgICAgICAgICAg
ICAgICAgICBjdXJpbmYtPmRlYWRsX2FicywgY3VyaW5mLT5zbGljZSwgbm93LA0KKyAgICAgICAg
ICAgICAgICAgICBjdXJpbmYtPmNwdXRpbWUpOw0KICAgICAgICAgICAgIF9fZGVsX2Zyb21fcXVl
dWUoY3VyaW5mLT52Y3B1KTsNCiANCi0gICAgICAgICAgICAvKiBDb21tb24gY2FzZTogd2UgbWlz
cyBvbmUgcGVyaW9kLiAqLw0KKyAgICAgICAgICAgIC8qIENvbW1vbiBjYXNlOiB3ZSBtaXNzIG9u
ZSBwZXJpb2QgKi8NCiAgICAgICAgICAgICBjdXJpbmYtPmRlYWRsX2FicyArPSBjdXJpbmYtPnBl
cmlvZDsNCiAgICANCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIElmIHdlIGFyZSBz
dGlsbCBiZWhpbmQ6IG1vZHVsbyBhcml0aG1ldGljLCBmb3JjZSBkZWFkbGluZQ0KKyAgICAgICAg
ICAgIC8qIElmIHdlIGFyZSBzdGlsbCBiZWhpbmQ6IG1vZHVsbyBhcml0aG1ldGljLCBmb3JjZSBk
ZWFkbGluZQ0KICAgICAgICAgICAgICAqIHRvIGJlIGluIGZ1dHVyZSBhbmQgYWxpZ25lZCB0byBw
ZXJpb2QgYm9yZGVycy4NCiAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICBpZiAoIHVubGlr
ZWx5KGN1cmluZi0+ZGVhZGxfYWJzIDwgbm93KSApDQpAQCAtNTk2LDcgKzUzNiw3IEBAIHN0YXRp
YyB2b2lkIHVwZGF0ZV9xdWV1ZXMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyaW5m
LT5wZXJpb2QpICogY3VyaW5mLT5wZXJpb2Q7DQogICAgICAgICAgICAgQVNTRVJUKGN1cmluZi0+
ZGVhZGxfYWJzID49IG5vdyk7DQogDQotICAgICAgICAgICAgLyogR2l2ZSBhIGZyZXNoIHNsaWNl
LiAqLw0KKyAgICAgICAgICAgIC8qIEdpdmUgYSBmcmVzaCBzbGljZSAqLw0KICAgICAgICAgICAg
IGN1cmluZi0+Y3B1dGltZSA9IDA7DQogICAgICAgICAgICAgaWYgKCBQRVJJT0RfQkVHSU4oY3Vy
aW5mKSA+IG5vdyApDQogICAgICAgICAgICAgICAgIF9fYWRkX3RvX3dhaXRxdWV1ZV9zb3J0KGN1
cmluZi0+dmNwdSk7DQpAQCAtNjA2LDE3ICs1NDYsMTYgQEAgc3RhdGljIHZvaWQgdXBkYXRlX3F1
ZXVlcygNCiAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICBicmVhazsNCiAgICAgfQ0KLQ0KLSAg
ICBQUklOVCgzLCJkb25lIHVwZGF0aW5nIHRoZSBxdWV1ZXNcbiIpOw0KIH0NCiANCiANCiAvKiBy
ZW1vdmVzIGEgZG9tYWluIGZyb20gdGhlIGhlYWQgb2YgdGhlIGFjY29yZGluZyBleHRyYVEgYW5k
DQotICAgcmVxdWV1ZXMgaXQgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb246DQotICAgICByb3VuZC1y
b2JpbiBleHRyYXRpbWU6IGVuZCBvZiBleHRyYVENCi0gICAgIHdlaWdodGVkIGV4dC46IGluc2Vy
dCBpbiBzb3J0ZWQgbGlzdCBieSBzY29yZQ0KLSAgIGlmIHRoZSBkb21haW4gaXMgYmxvY2tlZCAv
IGhhcyByZWdhaW5lZCBpdHMgc2hvcnQtYmxvY2stbG9zcw0KLSAgIHRpbWUgaXQgaXMgbm90IHB1
dCBvbiBhbnkgcXVldWUgKi8NCisgKiByZXF1ZXVlcyBpdCBhdCBhIHNwZWNpZmllZCBwb3NpdGlv
bjoNCisgKiAgIHJvdW5kLXJvYmluIGV4dHJhdGltZTogZW5kIG9mIGV4dHJhUQ0KKyAqICAgd2Vp
Z2h0ZWQgZXh0LjogaW5zZXJ0IGluIHNvcnRlZCBsaXN0IGJ5IHNjb3JlDQorICogaWYgdGhlIGRv
bWFpbiBpcyBibG9ja2VkIC8gaGFzIHJlZ2FpbmVkIGl0cyBzaG9ydC1ibG9jay1sb3NzDQorICog
dGltZSBpdCBpcyBub3QgcHV0IG9uIGFueSBxdWV1ZS4NCisgKi8NCiBzdGF0aWMgdm9pZCBkZXNj
aGVkX2V4dHJhX2RvbShzX3RpbWVfdCBub3csIHN0cnVjdCB2Y3B1ICpkKQ0KIHsNCiAgICAgc3Ry
dWN0IHNlZGZfdmNwdV9pbmZvICppbmYgPSBFRE9NX0lORk8oZCk7DQpAQCAtNjI1LDI5ICs1NjQs
MjUgQEAgc3RhdGljIHZvaWQgZGVzY2hlZF9leHRyYV9kb20oc190aW1lX3Qgbg0KIA0KICAgICBB
U1NFUlQoZXh0cmFxX29uKGQsIGkpKTsNCiANCi0gICAgLyogVW5zZXQgYWxsIHJ1bm5pbmcgZmxh
Z3MuICovDQorICAgIC8qIFVuc2V0IGFsbCBydW5uaW5nIGZsYWdzICovDQogICAgIGluZi0+c3Rh
dHVzICAmPSB+KEVYVFJBX1JVTl9QRU4gfCBFWFRSQV9SVU5fVVRJTCk7DQotICAgIC8qIEZyZXNo
IHNsaWNlIGZvciB0aGUgbmV4dCBydW4uICovDQorICAgIC8qIEZyZXNoIHNsaWNlIGZvciB0aGUg
bmV4dCBydW4gKi8NCiAgICAgaW5mLT5jcHV0aW1lID0gMDsNCi0gICAgLyogQWNjdW11bGF0ZSB0
b3RhbCBleHRyYXRpbWUuICovDQorICAgIC8qIEFjY3VtdWxhdGUgdG90YWwgZXh0cmF0aW1lICov
DQogICAgIGluZi0+ZXh0cmFfdGltZV90b3QgKz0gbm93IC0gaW5mLT5zY2hlZF9zdGFydF9hYnM7
DQogICAgIC8qIFJlbW92ZSBleHRyYWRvbWFpbiBmcm9tIGhlYWQgb2YgdGhlIHF1ZXVlLiAqLw0K
ICAgICBleHRyYXFfZGVsKGQsIGkpOw0KIA0KLSAgICAvKiBVcGRhdGUgdGhlIHNjb3JlLiAqLw0K
KyAgICAvKiBVcGRhdGUgdGhlIHNjb3JlICovDQogICAgIG9sZHNjb3JlID0gaW5mLT5zY29yZVtp
XTsNCiAgICAgaWYgKCBpID09IEVYVFJBX1BFTl9RICkNCiAgICAgew0KLSAgICAgICAgLypkb21h
aW4gd2FzIHJ1bm5pbmcgaW4gTDAgZXh0cmFxKi8NCi0gICAgICAgIC8qcmVkdWNlIGJsb2NrIGxv
c3QsIHByb2JhYmx5IG1vcmUgc29waGlzdGljYXRpb24gaGVyZSEqLw0KKyAgICAgICAgLyogRG9t
YWluIHdhcyBydW5uaW5nIGluIEwwIGV4dHJhcSAqLw0KKyAgICAgICAgLyogcmVkdWNlIGJsb2Nr
IGxvc3QsIHByb2JhYmx5IG1vcmUgc29waGlzdGljYXRpb24gaGVyZSEqLw0KICAgICAgICAgLypp
bmYtPnNob3J0X2Jsb2NrX2xvc3RfdG90IC09IEVYVFJBX1FVQU5UVU07Ki8NCiAgICAgICAgIGlu
Zi0+c2hvcnRfYmxvY2tfbG9zdF90b3QgLT0gbm93IC0gaW5mLT5zY2hlZF9zdGFydF9hYnM7DQot
ICAgICAgICBQUklOVCgzLCJEb21haW4gJWkuJWk6IFNob3J0X2Jsb2NrX2xvc3M6ICUiUFJJaTY0
IlxuIiwgDQotICAgICAgICAgICAgICBpbmYtPnZjcHUtPmRvbWFpbi0+ZG9tYWluX2lkLCBpbmYt
PnZjcHUtPnZjcHVfaWQsDQotICAgICAgICAgICAgICBpbmYtPnNob3J0X2Jsb2NrX2xvc3RfdG90
KTsNCiAjaWYgMA0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIEtBRjogSWYgd2UgZG9uJ3QgZXhp
dCBzaG9ydC1ibG9ja2luZyBzdGF0ZSBhdCB0aGlzIHBvaW50DQorICAgICAgICAvKiBLQUY6IElm
IHdlIGRvbid0IGV4aXQgc2hvcnQtYmxvY2tpbmcgc3RhdGUgYXQgdGhpcyBwb2ludA0KICAgICAg
ICAgICogZG9tYWluMCBjYW4gc3RlYWwgYWxsIENQVSBmb3IgdXAgdG8gMTAgc2Vjb25kcyBiZWZv
cmUNCiAgICAgICAgICAqIHNjaGVkdWxpbmcgc2V0dGxlcyBkb3duICh3aGVuIGNvbXBldGluZyBh
Z2FpbnN0IGFub3RoZXINCiAgICAgICAgICAqIENQVS1ib3VuZCBkb21haW4pLiBEb2luZyB0aGlz
IHNlZW1zIHRvIG1ha2UgdGhpbmdzIGJlaGF2ZQ0KQEAgLTY1Niw1MSArNTkxLDU2IEBAIHN0YXRp
YyB2b2lkIGRlc2NoZWRfZXh0cmFfZG9tKHNfdGltZV90IG4NCiAgICAgICAgIGlmICggaW5mLT5z
aG9ydF9ibG9ja19sb3N0X3RvdCA8PSAwICkNCiAjZW5kaWYNCiAgICAgICAgIHsNCi0gICAgICAg
ICAgICBQUklOVCg0LCJEb21haW4gJWkuJWkgY29tcGVuc2F0ZWQgc2hvcnQgYmxvY2sgbG9zcyFc
biIsDQotICAgICAgICAgICAgICAgICAgaW5mLT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZCwgaW5m
LT52Y3B1LT52Y3B1X2lkKTsNCi0gICAgICAgICAgICAvKndlIGhhdmUgKG92ZXItKWNvbXBlbnNh
dGVkIG91ciBibG9jayBwZW5hbHR5Ki8NCisgICAgICAgICAgICAvKiBXZSBoYXZlIChvdmVyLSlj
b21wZW5zYXRlZCBvdXIgYmxvY2sgcGVuYWx0eSAqLw0KICAgICAgICAgICAgIGluZi0+c2hvcnRf
YmxvY2tfbG9zdF90b3QgPSAwOw0KLSAgICAgICAgICAgIC8qd2UgZG9uJ3Qgd2FudCBhIHBsYWNl
IG9uIHRoZSBwZW5hbHR5IHF1ZXVlIGFueW1vcmUhKi8NCisgICAgICAgICAgICAvKiBXZSBkb24n
dCB3YW50IGEgcGxhY2Ugb24gdGhlIHBlbmFsdHkgcXVldWUgYW55bW9yZSEgKi8NCiAgICAgICAg
ICAgICBpbmYtPnN0YXR1cyAmPSB+RVhUUkFfV0FOVF9QRU5fUTsNCiAgICAgICAgICAgICBnb3Rv
IGNoZWNrX2V4dHJhX3F1ZXVlczsNCiAgICAgICAgIH0NCiANCi0gICAgICAgIC8qd2UgaGF2ZSB0
byBnbyBhZ2FpbiBmb3IgYW5vdGhlciB0cnkgaW4gdGhlIGJsb2NrLWV4dHJhcSwNCi0gICAgICAg
ICAgdGhlIHNjb3JlIGlzIG5vdCB1c2VkIGluY3JlbWFudGFsbHkgaGVyZSwgYXMgdGhpcyBpcw0K
LSAgICAgICAgICBhbHJlYWR5IGRvbmUgYnkgcmVjYWxjdWxhdGluZyB0aGUgYmxvY2tfbG9zdCov
DQorICAgICAgICAvKiBXZSBoYXZlIHRvIGdvIGFnYWluIGZvciBhbm90aGVyIHRyeSBpbiB0aGUg
YmxvY2stZXh0cmFxLA0KKyAgICAgICAgICogdGhlIHNjb3JlIGlzIG5vdCB1c2VkIGluY3JlbWFu
dGFsbHkgaGVyZSwgYXMgdGhpcyBpcw0KKyAgICAgICAgICogYWxyZWFkeSBkb25lIGJ5IHJlY2Fs
Y3VsYXRpbmcgdGhlIGJsb2NrX2xvc3QNCisgICAgICAgICAqLw0KICAgICAgICAgaW5mLT5zY29y
ZVtFWFRSQV9QRU5fUV0gPSAoaW5mLT5wZXJpb2QgPDwgMTApIC8NCiAgICAgICAgICAgICBpbmYt
PnNob3J0X2Jsb2NrX2xvc3RfdG90Ow0KICAgICAgICAgb2xkc2NvcmUgPSAwOw0KICAgICB9DQog
ICAgIGVsc2UNCiAgICAgew0KLSAgICAgICAgLypkb21haW4gd2FzIHJ1bm5pbmcgaW4gTDEgZXh0
cmFxID0+IHNjb3JlIGlzIGludmVyc2Ugb2YNCi0gICAgICAgICAgdXRpbGl6YXRpb24gYW5kIGlz
IHVzZWQgc29tZXdoYXQgaW5jcmVtZW50YWwhKi8NCisgICAgICAgIC8qIERvbWFpbiB3YXMgcnVu
bmluZyBpbiBMMSBleHRyYXEgPT4gc2NvcmUgaXMgaW52ZXJzZSBvZg0KKyAgICAgICAgICogdXRp
bGl6YXRpb24gYW5kIGlzIHVzZWQgc29tZXdoYXQgaW5jcmVtZW50YWwhDQorICAgICAgICAgKi8N
CiAgICAgICAgIGlmICggIWluZi0+ZXh0cmF3ZWlnaHQgKQ0KLSAgICAgICAgICAgIC8qTkI6IHVz
ZSBmaXhlZCBwb2ludCBhcml0aG1ldGljIHdpdGggMTAgYml0cyovDQorICAgICAgICB7DQorICAg
ICAgICAgICAgLyogTkI6IHVzZSBmaXhlZCBwb2ludCBhcml0aG1ldGljIHdpdGggMTAgYml0cyAq
Lw0KICAgICAgICAgICAgIGluZi0+c2NvcmVbRVhUUkFfVVRJTF9RXSA9IChpbmYtPnBlcmlvZCA8
PCAxMCkgLw0KICAgICAgICAgICAgICAgICBpbmYtPnNsaWNlOw0KKyAgICAgICAgfQ0KICAgICAg
ICAgZWxzZQ0KLSAgICAgICAgICAgIC8qY29udmVyc2lvbiBiZXR3ZWVuIHJlYWx0aW1lIHV0aWxp
c2F0aW9uIGFuZCBleHRyYXdpZWdodDoNCi0gICAgICAgICAgICAgIGZ1bGwgKGllIDEwMCUpIHV0
aWxpemF0aW9uIGlzIGVxdWl2YWxlbnQgdG8gMTI4IGV4dHJhd2VpZ2h0Ki8NCisgICAgICAgIHsN
CisgICAgICAgICAgICAvKiBDb252ZXJzaW9uIGJldHdlZW4gcmVhbHRpbWUgdXRpbGlzYXRpb24g
YW5kIGV4dHJhd2llZ2h0Og0KKyAgICAgICAgICAgICAqIGZ1bGwgKGllIDEwMCUpIHV0aWxpemF0
aW9uIGlzIGVxdWl2YWxlbnQgdG8gMTI4IGV4dHJhd2VpZ2h0DQorICAgICAgICAgICAgICovDQog
ICAgICAgICAgICAgaW5mLT5zY29yZVtFWFRSQV9VVElMX1FdID0gKDE8PDE3KSAvIGluZi0+ZXh0
cmF3ZWlnaHQ7DQorICAgICAgICB9DQogICAgIH0NCiANCiAgY2hlY2tfZXh0cmFfcXVldWVzOg0K
LSAgICAvKiBBZGRpbmcgYSBydW5uYWJsZSBkb21haW4gdG8gdGhlIHJpZ2h0IHF1ZXVlIGFuZCBy
ZW1vdmluZyBibG9ja2VkIG9uZXMqLw0KKyAgICAvKiBBZGRpbmcgYSBydW5uYWJsZSBkb21haW4g
dG8gdGhlIHJpZ2h0IHF1ZXVlIGFuZCByZW1vdmluZyBibG9ja2VkIG9uZXMgKi8NCiAgICAgaWYg
KCBzZWRmX3J1bm5hYmxlKGQpICkNCiAgICAgew0KLSAgICAgICAgLyphZGQgYWNjb3JkaW5nIHRv
IHNjb3JlOiB3ZWlnaHRlZCByb3VuZCByb2JpbiovDQorICAgICAgICAvKiBBZGQgYWNjb3JkaW5n
IHRvIHNjb3JlOiB3ZWlnaHRlZCByb3VuZCByb2JpbiAqLw0KICAgICAgICAgaWYgKCgoaW5mLT5z
dGF0dXMgJiBFWFRSQV9BV0FSRSkgJiYgKGkgPT0gRVhUUkFfVVRJTF9RKSkgfHwNCiAgICAgICAg
ICAgICAoKGluZi0+c3RhdHVzICYgRVhUUkFfV0FOVF9QRU5fUSkgJiYgKGkgPT0gRVhUUkFfUEVO
X1EpKSkNCiAgICAgICAgICAgICBleHRyYXFfYWRkX3NvcnRfdXBkYXRlKGQsIGksIG9sZHNjb3Jl
KTsNCiAgICAgfQ0KICAgICBlbHNlDQogICAgIHsNCi0gICAgICAgIC8qcmVtb3ZlIHRoaXMgYmxv
Y2tlZCBkb21haW4gZnJvbSB0aGUgd2FpdHEhKi8NCisgICAgICAgIC8qIFJlbW92ZSB0aGlzIGJs
b2NrZWQgZG9tYWluIGZyb20gdGhlIHdhaXRxISAqLw0KICAgICAgICAgX19kZWxfZnJvbV9xdWV1
ZShkKTsNCi0gICAgICAgIC8qbWFrZSBzdXJlIHRoYXQgd2UgcmVtb3ZlIGEgYmxvY2tlZCBkb21h
aW4gZnJvbSB0aGUgb3RoZXINCi0gICAgICAgICAgZXh0cmFxIHRvbyovDQorICAgICAgICAvKiBN
YWtlIHN1cmUgdGhhdCB3ZSByZW1vdmUgYSBibG9ja2VkIGRvbWFpbiBmcm9tIHRoZSBvdGhlcg0K
KyAgICAgICAgICogZXh0cmFxIHRvby4gKi8NCiAgICAgICAgIGlmICggaSA9PSBFWFRSQV9QRU5f
USApDQogICAgICAgICB7DQogICAgICAgICAgICAgaWYgKCBleHRyYXFfb24oZCwgRVhUUkFfVVRJ
TF9RKSApDQpAQCAtNzMyLDggKzY3Miw5IEBAIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRm
X2RvX2V4dHJhX3MNCiANCiAgICAgaWYgKCAhbGlzdF9lbXB0eShleHRyYXFbRVhUUkFfUEVOX1Fd
KSApDQogICAgIHsNCi0gICAgICAgIC8qd2Ugc3RpbGwgaGF2ZSBlbGVtZW50cyBvbiB0aGUgbGV2
ZWwgMCBleHRyYXEgDQotICAgICAgICAgID0+IGxldCB0aG9zZSBydW4gZmlyc3QhKi8NCisgICAg
ICAgIC8qIFdlIHN0aWxsIGhhdmUgZWxlbWVudHMgb24gdGhlIGxldmVsIDAgZXh0cmFxDQorICAg
ICAgICAgKiA9PiBsZXQgdGhvc2UgcnVuIGZpcnN0IQ0KKyAgICAgICAgICovDQogICAgICAgICBy
dW5pbmYgICA9IGxpc3RfZW50cnkoZXh0cmFxW0VYVFJBX1BFTl9RXS0+bmV4dCwgDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlZGZfdmNwdV9pbmZvLCBleHRyYWxpc3Rb
RVhUUkFfUEVOX1FdKTsNCiAgICAgICAgIHJ1bmluZi0+c3RhdHVzIHw9IEVYVFJBX1JVTl9QRU47
DQpAQCAtNzQ3LDcgKzY4OCw3IEBAIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX2V4
dHJhX3MNCiAgICAgew0KICAgICAgICAgaWYgKCAhbGlzdF9lbXB0eShleHRyYXFbRVhUUkFfVVRJ
TF9RXSkgKQ0KICAgICAgICAgew0KLSAgICAgICAgICAgIC8qdXNlIGVsZW1lbnRzIGZyb20gdGhl
IG5vcm1hbCBleHRyYXF1ZXVlKi8NCisgICAgICAgICAgICAvKiBVc2UgZWxlbWVudHMgZnJvbSB0
aGUgbm9ybWFsIGV4dHJhcXVldWUgKi8NCiAgICAgICAgICAgICBydW5pbmYgICA9IGxpc3RfZW50
cnkoZXh0cmFxW0VYVFJBX1VUSUxfUV0tPm5leHQsDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0cnVjdCBzZWRmX3ZjcHVfaW5mbywNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZXh0cmFsaXN0W0VYVFJBX1VUSUxfUV0pOw0KQEAgLTc3MywxMCArNzE0LDEx
IEBAIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX2V4dHJhX3MNCiANCiANCiAvKiBN
YWluIHNjaGVkdWxpbmcgZnVuY3Rpb24NCi0gICBSZWFzb25zIGZvciBjYWxsaW5nIHRoaXMgZnVu
Y3Rpb24gYXJlOg0KLSAgIC10aW1lc2xpY2UgZm9yIHRoZSBjdXJyZW50IHBlcmlvZCB1c2VkIHVw
DQotICAgLWRvbWFpbiBvbiB3YWl0cXVldWUgaGFzIHN0YXJ0ZWQgaXQncyBwZXJpb2QNCi0gICAt
YW5kIHZhcmlvdXMgb3RoZXJzIDspIGluIGdlbmVyYWw6IGRldGVybWluZSB3aGljaCBkb21haW4g
dG8gcnVuIG5leHQqLw0KKyAqIFJlYXNvbnMgZm9yIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhcmU6
DQorICogLXRpbWVzbGljZSBmb3IgdGhlIGN1cnJlbnQgcGVyaW9kIHVzZWQgdXANCisgKiAtZG9t
YWluIG9uIHdhaXRxdWV1ZSBoYXMgc3RhcnRlZCBpdCdzIHBlcmlvZA0KKyAqIC1hbmQgdmFyaW91
cyBvdGhlcnMgOykgaW4gZ2VuZXJhbDogZGV0ZXJtaW5lIHdoaWNoIGRvbWFpbiB0byBydW4gbmV4
dA0KKyAqLw0KIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX3NjaGVkdWxlKA0KICAg
ICBjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHNfdGltZV90IG5vdywgYm9vbF90IHRhc2ts
ZXRfd29ya19zY2hlZHVsZWQpDQogew0KQEAgLTc4OSwxMyArNzMxLDE0IEBAIHN0YXRpYyBzdHJ1
Y3QgdGFza19zbGljZSBzZWRmX2RvX3NjaGVkdWwNCiAgICAgc3RydWN0IHNlZGZfdmNwdV9pbmZv
ICpydW5pbmYsICp3YWl0aW5mOw0KICAgICBzdHJ1Y3QgdGFza19zbGljZSAgICAgIHJldDsNCiAN
Ci0gICAgLyppZGxlIHRhc2tzIGRvbid0IG5lZWQgYW55IG9mIHRoZSBmb2xsb3dpbmcgc3R1Ziov
DQorICAgIC8qIElkbGUgdGFza3MgZG9uJ3QgbmVlZCBhbnkgb2YgdGhlIGZvbGxvd2luZyBzdHVm
ICovDQogICAgIGlmICggaXNfaWRsZV92Y3B1KGN1cnJlbnQpICkNCiAgICAgICAgIGdvdG8gY2hl
Y2tfd2FpdHE7DQogIA0KLSAgICAvKiBjcmVhdGUgbG9jYWwgc3RhdGUgb2YgdGhlIHN0YXR1cyBv
ZiB0aGUgZG9tYWluLCBpbiBvcmRlciB0byBhdm9pZA0KLSAgICAgICBpbmNvbnNpc3RlbnQgc3Rh
dGUgZHVyaW5nIHNjaGVkdWxpbmcgZGVjaXNpb25zLCBiZWNhdXNlIGRhdGEgZm9yDQotICAgICAg
IHZjcHVfcnVubmFibGUgaXMgbm90IHByb3RlY3RlZCBieSB0aGUgc2NoZWR1bGluZyBsb2NrISov
DQorICAgIC8qIENyZWF0ZSBsb2NhbCBzdGF0ZSBvZiB0aGUgc3RhdHVzIG9mIHRoZSBkb21haW4s
IGluIG9yZGVyIHRvIGF2b2lkDQorICAgICAqIGluY29uc2lzdGVudCBzdGF0ZSBkdXJpbmcgc2No
ZWR1bGluZyBkZWNpc2lvbnMsIGJlY2F1c2UgZGF0YSBmb3INCisgICAgICogdmNwdV9ydW5uYWJs
ZSBpcyBub3QgcHJvdGVjdGVkIGJ5IHRoZSBzY2hlZHVsaW5nIGxvY2shDQorICAgICAqLw0KICAg
ICBpZiAoICF2Y3B1X3J1bm5hYmxlKGN1cnJlbnQpICkNCiAgICAgICAgIGluZi0+c3RhdHVzIHw9
IFNFREZfQVNMRUVQOw0KICANCkBAIC04MDQsNyArNzQ3LDcgQEAgc3RhdGljIHN0cnVjdCB0YXNr
X3NsaWNlIHNlZGZfZG9fc2NoZWR1bA0KIA0KICAgICBpZiAoIHVubGlrZWx5KGV4dHJhX3J1bnMo
aW5mKSkgKQ0KICAgICB7DQotICAgICAgICAvKnNwZWNpYWwgdHJlYXRtZW50IG9mIGRvbWFpbnMg
cnVubmluZyBpbiBleHRyYSB0aW1lKi8NCisgICAgICAgIC8qIFNwZWNpYWwgdHJlYXRtZW50IG9m
IGRvbWFpbnMgcnVubmluZyBpbiBleHRyYSB0aW1lICovDQogICAgICAgICBkZXNjaGVkX2V4dHJh
X2RvbShub3csIGN1cnJlbnQpOw0KICAgICB9DQogICAgIGVsc2UgDQpAQCAtODE0LDEwICs3NTcs
MTEgQEAgc3RhdGljIHN0cnVjdCB0YXNrX3NsaWNlIHNlZGZfZG9fc2NoZWR1bA0KICBjaGVja193
YWl0cToNCiAgICAgdXBkYXRlX3F1ZXVlcyhub3csIHJ1bnEsIHdhaXRxKTsNCiANCi0gICAgLypu
b3cgc2ltcGx5IHBpY2sgdGhlIGZpcnN0IGRvbWFpbiBmcm9tIHRoZSBydW5xdWV1ZSwgd2hpY2gg
aGFzIHRoZQ0KLSAgICAgIGVhcmxpZXN0IGRlYWRsaW5lLCBiZWNhdXNlIHRoZSBsaXN0IGlzIHNv
cnRlZCovDQotIA0KLSAgICAvKiBUYXNrbGV0IHdvcmsgKHdoaWNoIHJ1bnMgaW4gaWRsZSBWQ1BV
IGNvbnRleHQpIG92ZXJyaWRlcyBhbGwgZWxzZS4gKi8NCisgICAgLyogTm93IHNpbXBseSBwaWNr
IHRoZSBmaXJzdCBkb21haW4gZnJvbSB0aGUgcnVucXVldWUsIHdoaWNoIGhhcyB0aGUNCisgICAg
ICogZWFybGllc3QgZGVhZGxpbmUsIGJlY2F1c2UgdGhlIGxpc3QgaXMgc29ydGVkDQorICAgICAq
DQorICAgICAqIFRhc2tsZXQgd29yayAod2hpY2ggcnVucyBpbiBpZGxlIFZDUFUgY29udGV4dCkg
b3ZlcnJpZGVzIGFsbCBlbHNlLg0KKyAgICAgKi8NCiAgICAgaWYgKCB0YXNrbGV0X3dvcmtfc2No
ZWR1bGVkIHx8DQogICAgICAgICAgKGxpc3RfZW1wdHkocnVucSkgJiYgbGlzdF9lbXB0eSh3YWl0
cSkpIHx8DQogICAgICAgICAgdW5saWtlbHkoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBTRURGX0NQ
VU9OTElORShwZXJfY3B1KGNwdXBvb2wsIGNwdSkpKSkgKQ0KQEAgLTgzMyw5ICs3NzcsMTAgQEAg
c3RhdGljIHN0cnVjdCB0YXNrX3NsaWNlIHNlZGZfZG9fc2NoZWR1bA0KICAgICAgICAgew0KICAg
ICAgICAgICAgIHdhaXRpbmYgID0gbGlzdF9lbnRyeSh3YWl0cS0+bmV4dCwNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlZGZfdmNwdV9pbmZvLGxpc3QpOw0KLSAg
ICAgICAgICAgIC8qcmVydW4gc2NoZWR1bGVyLCB3aGVuIHNjaGVkdWxlZCBkb21haW4gcmVhY2hl
cyBpdCdzDQotICAgICAgICAgICAgICBlbmQgb2Ygc2xpY2Ugb3IgdGhlIGZpcnN0IGRvbWFpbiBm
cm9tIHRoZSB3YWl0cXVldWUNCi0gICAgICAgICAgICAgIGdldHMgcmVhZHkqLw0KKyAgICAgICAg
ICAgIC8qIFJlcnVuIHNjaGVkdWxlciwgd2hlbiBzY2hlZHVsZWQgZG9tYWluIHJlYWNoZXMgaXQn
cw0KKyAgICAgICAgICAgICAqIGVuZCBvZiBzbGljZSBvciB0aGUgZmlyc3QgZG9tYWluIGZyb20g
dGhlIHdhaXRxdWV1ZQ0KKyAgICAgICAgICAgICAqIGdldHMgcmVhZHkuDQorICAgICAgICAgICAg
ICovDQogICAgICAgICAgICAgcmV0LnRpbWUgPSBNSU4obm93ICsgcnVuaW5mLT5zbGljZSAtIHJ1
bmluZi0+Y3B1dGltZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRVJJT0RfQkVHSU4o
d2FpdGluZikpIC0gbm93Ow0KICAgICAgICAgfQ0KQEAgLTg0NywxNCArNzkyLDE1IEBAIHN0YXRp
YyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX3NjaGVkdWwNCiAgICAgZWxzZQ0KICAgICB7DQog
ICAgICAgICB3YWl0aW5mICA9IGxpc3RfZW50cnkod2FpdHEtPm5leHQsc3RydWN0IHNlZGZfdmNw
dV9pbmZvLCBsaXN0KTsNCi0gICAgICAgIC8qd2UgY291bGQgbm90IGZpbmQgYW55IHN1aXRhYmxl
IGRvbWFpbiANCi0gICAgICAgICAgPT4gbG9vayBmb3IgZG9tYWlucyB0aGF0IGFyZSBhd2FyZSBv
ZiBleHRyYXRpbWUqLw0KKyAgICAgICAgLyogV2UgY291bGQgbm90IGZpbmQgYW55IHN1aXRhYmxl
IGRvbWFpbiANCisgICAgICAgICAqID0+IGxvb2sgZm9yIGRvbWFpbnMgdGhhdCBhcmUgYXdhcmUg
b2YgZXh0cmF0aW1lKi8NCiAgICAgICAgIHJldCA9IHNlZGZfZG9fZXh0cmFfc2NoZWR1bGUobm93
LCBQRVJJT0RfQkVHSU4od2FpdGluZiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGV4dHJhcSwgY3B1KTsNCiAgICAgfQ0KIA0KLSAgICAvKlRPRE86IERvIHNvbWV0aGlu
ZyBVU0VGVUwgd2hlbiB0aGlzIGhhcHBlbnMgYW5kIGZpbmQgb3V0LCB3aHkgaXQNCi0gICAgICBz
dGlsbCBjYW4gaGFwcGVuISEhKi8NCisgICAgLyogVE9ETzogRG8gc29tZXRoaW5nIFVTRUZVTCB3
aGVuIHRoaXMgaGFwcGVucyBhbmQgZmluZCBvdXQsIHdoeSBpdA0KKyAgICAgKiBzdGlsbCBjYW4g
aGFwcGVuISEhDQorICAgICAqLw0KICAgICBpZiAoIHJldC50aW1lIDwgMCkNCiAgICAgew0KICAg
ICAgICAgcHJpbnRrKCJPdWNoISBXZSBhcmUgc2VyaW91c2x5IEJFSElORCBzY2hlZHVsZSEgJSJQ
UklpNjQiXG4iLA0KQEAgLTg3NCw5ICs4MjAsNiBAQCBzdGF0aWMgc3RydWN0IHRhc2tfc2xpY2Ug
c2VkZl9kb19zY2hlZHVsDQogDQogc3RhdGljIHZvaWQgc2VkZl9zbGVlcChjb25zdCBzdHJ1Y3Qg
c2NoZWR1bGVyICpvcHMsIHN0cnVjdCB2Y3B1ICpkKQ0KIHsNCi0gICAgUFJJTlQoMiwic2VkZl9z
bGVlcCB3YXMgY2FsbGVkLCBkb21haW4taWQgJWkuJWlcbiIsDQotICAgICAgICAgIGQtPmRvbWFp
bi0+ZG9tYWluX2lkLCBkLT52Y3B1X2lkKTsNCi0gDQogICAgIGlmICggaXNfaWRsZV92Y3B1KGQp
ICkNCiAgICAgICAgIHJldHVybjsNCiANCkBAIC05NzIsMjcgKzkxNSwyOSBAQCBzdGF0aWMgdm9p
ZCBzZWRmX3NsZWVwKGNvbnN0IHN0cnVjdCBzY2hlDQogc3RhdGljIHZvaWQgdW5ibG9ja19zaG9y
dF9leHRyYV9zdXBwb3J0KA0KICAgICBzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8qIGluZiwgc190aW1l
X3Qgbm93KQ0KIHsNCi0gICAgLyp0aGlzIHVuYmxvY2tpbmcgc2NoZW1lIHRyaWVzIHRvIHN1cHBv
cnQgdGhlIGRvbWFpbiwgYnkgYXNzaWduaW5nIGl0DQotICAgIGEgcHJpb3JpdHkgaW4gZXh0cmF0
aW1lIGRpc3RyaWJ1dGlvbiBhY2NvcmRpbmcgdG8gdGhlIGxvc3Mgb2YgdGltZQ0KLSAgICBpbiB0
aGlzIHNsaWNlIGR1ZSB0byBibG9ja2luZyovDQorICAgIC8qIFRoaXMgdW5ibG9ja2luZyBzY2hl
bWUgdHJpZXMgdG8gc3VwcG9ydCB0aGUgZG9tYWluLCBieSBhc3NpZ25pbmcgaXQNCisgICAgICog
YSBwcmlvcml0eSBpbiBleHRyYXRpbWUgZGlzdHJpYnV0aW9uIGFjY29yZGluZyB0byB0aGUgbG9z
cyBvZiB0aW1lDQorICAgICAqIGluIHRoaXMgc2xpY2UgZHVlIHRvIGJsb2NraW5nDQorICAgICAq
Lw0KICAgICBzX3RpbWVfdCBwZW47DQogIA0KLSAgICAvKm5vIG1vcmUgcmVhbHRpbWUgZXhlY3V0
aW9uIGluIHRoaXMgcGVyaW9kISovDQorICAgIC8qIE5vIG1vcmUgcmVhbHRpbWUgZXhlY3V0aW9u
IGluIHRoaXMgcGVyaW9kISAqLw0KICAgICBpbmYtPmRlYWRsX2FicyArPSBpbmYtPnBlcmlvZDsN
CiAgICAgaWYgKCBsaWtlbHkoaW5mLT5ibG9ja19hYnMpICkNCiAgICAgew0KLSAgICAgICAgLy90
cmVhdCBibG9ja2VkIHRpbWUgYXMgY29uc3VtZWQgYnkgdGhlIGRvbWFpbiovDQorICAgICAgICAv
KiBUcmVhdCBibG9ja2VkIHRpbWUgYXMgY29uc3VtZWQgYnkgdGhlIGRvbWFpbiAqLw0KICAgICAg
ICAgLyppbmYtPmNwdXRpbWUgKz0gbm93IC0gaW5mLT5ibG9ja19hYnM7Ki8NCi0gICAgICAgIC8q
cGVuYWx0eSBpcyB0aW1lIHRoZSBkb21haW4gd291bGQgaGF2ZQ0KLSAgICAgICAgICBoYWQgaWYg
aXQgY29udGludWVkIHRvIHJ1biAqLw0KKyAgICAgICAgLyogUGVuYWx0eSBpcyB0aW1lIHRoZSBk
b21haW4gd291bGQgaGF2ZQ0KKyAgICAgICAgICogaGFkIGlmIGl0IGNvbnRpbnVlZCB0byBydW4u
DQorICAgICAgICAgKi8NCiAgICAgICAgIHBlbiA9IChpbmYtPnNsaWNlIC0gaW5mLT5jcHV0aW1l
KTsNCiAgICAgICAgIGlmICggcGVuIDwgMCApDQogICAgICAgICAgICAgcGVuID0gMDsNCi0gICAg
ICAgIC8qYWNjdW11bGF0ZSBhbGwgcGVuYWx0aWVzIG92ZXIgdGhlIHBlcmlvZHMqLw0KKyAgICAg
ICAgLyogQWNjdW11bGF0ZSBhbGwgcGVuYWx0aWVzIG92ZXIgdGhlIHBlcmlvZHMgKi8NCiAgICAg
ICAgIC8qaW5mLT5zaG9ydF9ibG9ja19sb3N0X3RvdCArPSBwZW47Ki8NCi0gICAgICAgIC8qc2V0
IHBlbmFsdHkgdG8gdGhlIGN1cnJlbnQgdmFsdWUqLw0KKyAgICAgICAgLyogU2V0IHBlbmFsdHkg
dG8gdGhlIGN1cnJlbnQgdmFsdWUgKi8NCiAgICAgICAgIGluZi0+c2hvcnRfYmxvY2tfbG9zdF90
b3QgPSBwZW47DQotICAgICAgICAvKm5vdCBzdXJlIHdoaWNoIG9uZSBpcyBiZXR0ZXIuLiBidXQg
c2VlbXMgdG8gd29yayB3ZWxsLi4uKi8NCisgICAgICAgIC8qIE5vdCBzdXJlIHdoaWNoIG9uZSBp
cyBiZXR0ZXIuLiBidXQgc2VlbXMgdG8gd29yayB3ZWxsLi4uICovDQogICANCiAgICAgICAgIGlm
ICggaW5mLT5zaG9ydF9ibG9ja19sb3N0X3RvdCApDQogICAgICAgICB7DQpAQCAtMTAwMiwyOCAr
OTQ3LDMwIEBAIHN0YXRpYyB2b2lkIHVuYmxvY2tfc2hvcnRfZXh0cmFfc3VwcG9ydCgNCiAgICAg
ICAgICAgICBpbmYtPnBlbl9leHRyYV9ibG9ja3MrKzsNCiAjZW5kaWYNCiAgICAgICAgICAgICBp
ZiAoIGV4dHJhcV9vbihpbmYtPnZjcHUsIEVYVFJBX1BFTl9RKSApDQotICAgICAgICAgICAgICAg
IC8qcmVtb3ZlIGRvbWFpbiBmb3IgcG9zc2libGUgcmVzb3J0aW5nISovDQorICAgICAgICAgICAg
ICAgIC8qIFJlbW92ZSBkb21haW4gZm9yIHBvc3NpYmxlIHJlc29ydGluZyEgKi8NCiAgICAgICAg
ICAgICAgICAgZXh0cmFxX2RlbChpbmYtPnZjcHUsIEVYVFJBX1BFTl9RKTsNCiAgICAgICAgICAg
ICBlbHNlDQotICAgICAgICAgICAgICAgIC8qcmVtZW1iZXIgdGhhdCB3ZSB3YW50IHRvIGJlIG9u
IHRoZSBwZW5hbHR5IHENCi0gICAgICAgICAgICAgICAgICBzbyB0aGF0IHdlIGNhbiBjb250aW51
ZSB3aGVuIHdlICh1bi0pYmxvY2sNCi0gICAgICAgICAgICAgICAgICBpbiBwZW5hbHR5LWV4dHJh
dGltZSovDQorICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoYXQgd2Ugd2FudCB0byBiZSBv
biB0aGUgcGVuYWx0eSBxDQorICAgICAgICAgICAgICAgICAqIHNvIHRoYXQgd2UgY2FuIGNvbnRp
bnVlIHdoZW4gd2UgKHVuLSlibG9jaw0KKyAgICAgICAgICAgICAgICAgKiBpbiBwZW5hbHR5LWV4
dHJhdGltZQ0KKyAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgaW5mLT5zdGF0
dXMgfD0gRVhUUkFfV0FOVF9QRU5fUTsNCiAgICANCi0gICAgICAgICAgICAvKihyZS0pYWRkIGRv
bWFpbiB0byB0aGUgcGVuYWx0eSBleHRyYXEqLw0KKyAgICAgICAgICAgIC8qIChyZS0pYWRkIGRv
bWFpbiB0byB0aGUgcGVuYWx0eSBleHRyYXEgKi8NCiAgICAgICAgICAgICBleHRyYXFfYWRkX3Nv
cnRfdXBkYXRlKGluZi0+dmNwdSwgRVhUUkFfUEVOX1EsIDApOw0KICAgICAgICAgfQ0KICAgICB9
DQogDQotICAgIC8qZ2l2ZSBpdCBhIGZyZXNoIHNsaWNlIGluIHRoZSBuZXh0IHBlcmlvZCEqLw0K
KyAgICAvKiBHaXZlIGl0IGEgZnJlc2ggc2xpY2UgaW4gdGhlIG5leHQgcGVyaW9kISAqLw0KICAg
ICBpbmYtPmNwdXRpbWUgPSAwOw0KIH0NCiANCiANCiBzdGF0aWMgdm9pZCB1bmJsb2NrX2xvbmdf
Y29uc19iKHN0cnVjdCBzZWRmX3ZjcHVfaW5mbyogaW5mLHNfdGltZV90IG5vdykNCiB7DQotICAg
IC8qQ29uc2VydmF0aXZlIDJiKi8NCi0gICAgLypUcmVhdCB0aGUgdW5ibG9ja2luZyB0aW1lIGFz
IGEgc3RhcnQgb2YgYSBuZXcgcGVyaW9kICovDQorICAgIC8qIENvbnNlcnZhdGl2ZSAyYiAqLw0K
Kw0KKyAgICAvKiBUcmVhdCB0aGUgdW5ibG9ja2luZyB0aW1lIGFzIGEgc3RhcnQgb2YgYSBuZXcg
cGVyaW9kICovDQogICAgIGluZi0+ZGVhZGxfYWJzID0gbm93ICsgaW5mLT5wZXJpb2Q7DQogICAg
IGluZi0+Y3B1dGltZSA9IDA7DQogfQ0KQEAgLTEwNDYsMTUgKzk5MywxNiBAQCBzdGF0aWMgaW5s
aW5lIGludCBnZXRfcnVuX3R5cGUoc3RydWN0IHZjDQogfQ0KIA0KIA0KLS8qQ29tcGFyZXMgdHdv
IGRvbWFpbnMgaW4gdGhlIHJlbGF0aW9uIG9mIHdoZXRoZXIgdGhlIG9uZSBpcyBhbGxvd2VkIHRv
DQotICBpbnRlcnJ1cHQgdGhlIG90aGVycyBleGVjdXRpb24uDQotICBJdCByZXR1cm5zIHRydWUg
KCE9MCkgaWYgYSBzd2l0Y2ggdG8gdGhlIG90aGVyIGRvbWFpbiBpcyBnb29kLg0KLSAgQ3VycmVu
dCBQcmlvcml0eSBzY2hlbWUgaXMgYXMgZm9sbG93czoNCi0gICBFREYgPiBMMCAocGVuYWx0eSBi
YXNlZCkgZXh0cmEtdGltZSA+IA0KLSAgIEwxICh1dGlsaXphdGlvbikgZXh0cmEtdGltZSA+IGlk
bGUtZG9tYWluDQotICBJbiB0aGUgc2FtZSBjbGFzcyBwcmlvcml0aWVzIGFyZSBhc3NpZ25lZCBh
cyBmb2xsb3dpbmc6DQotICAgRURGOiBlYXJseSBkZWFkbGluZSA+IGxhdGUgZGVhZGxpbmUNCi0g
ICBMMCBleHRyYS10aW1lOiBsb3dlciBzY29yZSA+IGhpZ2hlciBzY29yZSovDQorLyogQ29tcGFy
ZXMgdHdvIGRvbWFpbnMgaW4gdGhlIHJlbGF0aW9uIG9mIHdoZXRoZXIgdGhlIG9uZSBpcyBhbGxv
d2VkIHRvDQorICogaW50ZXJydXB0IHRoZSBvdGhlcnMgZXhlY3V0aW9uLg0KKyAqIEl0IHJldHVy
bnMgdHJ1ZSAoIT0wKSBpZiBhIHN3aXRjaCB0byB0aGUgb3RoZXIgZG9tYWluIGlzIGdvb2QuDQor
ICogQ3VycmVudCBQcmlvcml0eSBzY2hlbWUgaXMgYXMgZm9sbG93czoNCisgKiAgRURGID4gTDAg
KHBlbmFsdHkgYmFzZWQpIGV4dHJhLXRpbWUgPiANCisgKiAgTDEgKHV0aWxpemF0aW9uKSBleHRy
YS10aW1lID4gaWRsZS1kb21haW4NCisgKiBJbiB0aGUgc2FtZSBjbGFzcyBwcmlvcml0aWVzIGFy
ZSBhc3NpZ25lZCBhcyBmb2xsb3dpbmc6DQorICogIEVERjogZWFybHkgZGVhZGxpbmUgPiBsYXRl
IGRlYWRsaW5lDQorICogIEwwIGV4dHJhLXRpbWU6IGxvd2VyIHNjb3JlID4gaGlnaGVyIHNjb3Jl
DQorICovDQogc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX3N3aXRjaChzdHJ1Y3QgdmNwdSAqY3Vy
LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZjcHUgKm90aGVyLA0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc190aW1lX3Qgbm93KQ0KQEAgLTEwNjMs
MTkgKzEwMTEsMTkgQEAgc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX3N3aXRjaChzdHJ1Y3Qgdg0K
ICAgICBjdXJfaW5mICAgPSBFRE9NX0lORk8oY3VyKTsNCiAgICAgb3RoZXJfaW5mID0gRURPTV9J
TkZPKG90aGVyKTsNCiAgDQotICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBtYWtlIGFu
IGVhcmxpZXIgc2NoZWR1bGluZyBkZWNpc2lvbi4gKi8NCisgICAgLyogQ2hlY2sgd2hldGhlciB3
ZSBuZWVkIHRvIG1ha2UgYW4gZWFybGllciBzY2hlZHVsaW5nIGRlY2lzaW9uICovDQogICAgIGlm
ICggUEVSSU9EX0JFR0lOKG90aGVyX2luZikgPCANCiAgICAgICAgICBDUFVfSU5GTyhvdGhlci0+
cHJvY2Vzc29yKS0+Y3VycmVudF9zbGljZV9leHBpcmVzICkNCiAgICAgICAgIHJldHVybiAxOw0K
IA0KLSAgICAvKiBObyB0aW1pbmctYmFzZWQgc3dpdGNoZXMgbmVlZCB0byBiZSB0YWtlbiBpbnRv
IGFjY291bnQgaGVyZS4gKi8NCisgICAgLyogTm8gdGltaW5nLWJhc2VkIHN3aXRjaGVzIG5lZWQg
dG8gYmUgdGFrZW4gaW50byBhY2NvdW50IGhlcmUgKi8NCiAgICAgc3dpdGNoICggZ2V0X3J1bl90
eXBlKGN1cikgKQ0KICAgICB7DQogICAgIGNhc2UgRE9NQUlOX0VERjoNCi0gICAgICAgIC8qIERv
IG5vdCBpbnRlcnJ1cHQgYSBydW5uaW5nIEVERiBkb21haW4uICovDQorICAgICAgICAvKiBEbyBu
b3QgaW50ZXJydXB0IGEgcnVubmluZyBFREYgZG9tYWluICovDQogICAgICAgICByZXR1cm4gMDsN
CiAgICAgY2FzZSBET01BSU5fRVhUUkFfUEVOOg0KLSAgICAgICAgLyogQ2hlY2sgd2hldGhlciB3
ZSBhbHNvIHdhbnQgdGhlIEwwIGV4LXEgd2l0aCBsb3dlciBzY29yZS4gKi8NCisgICAgICAgIC8q
IENoZWNrIHdoZXRoZXIgd2UgYWxzbyB3YW50IHRoZSBMMCBleC1xIHdpdGggbG93ZXIgc2NvcmUg
Ki8NCiAgICAgICAgIHJldHVybiAoKG90aGVyX2luZi0+c3RhdHVzICYgRVhUUkFfV0FOVF9QRU5f
USkgJiYNCiAgICAgICAgICAgICAgICAgKG90aGVyX2luZi0+c2NvcmVbRVhUUkFfUEVOX1FdIDwg
DQogICAgICAgICAgICAgICAgICBjdXJfaW5mLT5zY29yZVtFWFRSQV9QRU5fUV0pKTsNCkBAIC0x
MDk2LDE4ICsxMDQ0LDExIEBAIHN0YXRpYyB2b2lkIHNlZGZfd2FrZShjb25zdCBzdHJ1Y3Qgc2No
ZWQNCiAgICAgc190aW1lX3QgICAgICAgICAgICAgIG5vdyA9IE5PVygpOw0KICAgICBzdHJ1Y3Qg
c2VkZl92Y3B1X2luZm8qIGluZiA9IEVET01fSU5GTyhkKTsNCiANCi0gICAgUFJJTlQoMywgInNl
ZGZfd2FrZSB3YXMgY2FsbGVkLCBkb21haW4taWQgJWkuJWlcbiIsZC0+ZG9tYWluLT5kb21haW5f
aWQsDQotICAgICAgICAgIGQtPnZjcHVfaWQpOw0KLQ0KICAgICBpZiAoIHVubGlrZWx5KGlzX2lk
bGVfdmNwdShkKSkgKQ0KICAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgICBpZiAoIHVubGlrZWx5
KF9fdGFza19vbl9xdWV1ZShkKSkgKQ0KLSAgICB7DQotICAgICAgICBQUklOVCgzLCJcdGRvbWFp
biAlaS4laSBpcyBhbHJlYWR5IGluIHNvbWUgcXVldWVcbiIsDQotICAgICAgICAgICAgICBkLT5k
b21haW4tPmRvbWFpbl9pZCwgZC0+dmNwdV9pZCk7DQogICAgICAgICByZXR1cm47DQotICAgIH0N
CiANCiAgICAgQVNTRVJUKCFzZWRmX3J1bm5hYmxlKGQpKTsNCiAgICAgaW5mLT5zdGF0dXMgJj0g
flNFREZfQVNMRUVQOw0KQEAgLTExMTYsMjggKzEwNTcsMjQgQEAgc3RhdGljIHZvaWQgc2VkZl93
YWtlKGNvbnN0IHN0cnVjdCBzY2hlZA0KICANCiAgICAgaWYgKCB1bmxpa2VseShpbmYtPmRlYWRs
X2FicyA9PSAwKSApDQogICAgIHsNCi0gICAgICAgIC8qaW5pdGlhbCBzZXR1cCBvZiB0aGUgZGVh
ZGxpbmUqLw0KKyAgICAgICAgLyogSW5pdGlhbCBzZXR1cCBvZiB0aGUgZGVhZGxpbmUgKi8NCiAg
ICAgICAgIGluZi0+ZGVhZGxfYWJzID0gbm93ICsgaW5mLT5zbGljZTsNCiAgICAgfQ0KICAgDQot
ICAgIFBSSU5UKDMsICJ3YWtpbmcgdXAgZG9tYWluICVpLiVpIChkZWFkbD0gJSJQUkl1NjQiIHBl
cmlvZD0gJSJQUkl1NjQNCi0gICAgICAgICAgIm5vdz0gJSJQUkl1NjQiKVxuIiwNCi0gICAgICAg
ICAgZC0+ZG9tYWluLT5kb21haW5faWQsIGQtPnZjcHVfaWQsIGluZi0+ZGVhZGxfYWJzLCBpbmYt
PnBlcmlvZCwgbm93KTsNCi0NCiAjaWZkZWYgU0VERl9TVEFUUyANCiAgICAgaW5mLT5ibG9ja190
b3QrKzsNCiAjZW5kaWYNCiANCiAgICAgaWYgKCB1bmxpa2VseShub3cgPCBQRVJJT0RfQkVHSU4o
aW5mKSkgKQ0KICAgICB7DQotICAgICAgICBQUklOVCg0LCJleHRyYXRpbWUgdW5ibG9ja1xuIik7
DQotICAgICAgICAvKiB1bmJsb2NraW5nIGluIGV4dHJhLXRpbWUhICovDQorICAgICAgICAvKiBV
bmJsb2NraW5nIGluIGV4dHJhLXRpbWUhICovDQogICAgICAgICBpZiAoIGluZi0+c3RhdHVzICYg
RVhUUkFfV0FOVF9QRU5fUSApDQogICAgICAgICB7DQotICAgICAgICAgICAgLyp3ZSBoYXZlIGEg
ZG9tYWluIHRoYXQgd2FudHMgY29tcGVuc2F0aW9uDQotICAgICAgICAgICAgICBmb3IgYmxvY2sg
cGVuYWx0eSBhbmQgZGlkIGp1c3QgYmxvY2sgaW4NCi0gICAgICAgICAgICAgIGl0cyBjb21wZW5z
YXRpb24gdGltZS4gR2l2ZSBpdCBhbm90aGVyDQotICAgICAgICAgICAgICBjaGFuY2UhKi8NCisg
ICAgICAgICAgICAvKiBXZSBoYXZlIGEgZG9tYWluIHRoYXQgd2FudHMgY29tcGVuc2F0aW9uDQor
ICAgICAgICAgICAgICogZm9yIGJsb2NrIHBlbmFsdHkgYW5kIGRpZCBqdXN0IGJsb2NrIGluDQor
ICAgICAgICAgICAgICogaXRzIGNvbXBlbnNhdGlvbiB0aW1lLiBHaXZlIGl0IGFub3RoZXINCisg
ICAgICAgICAgICAgKiBjaGFuY2UhDQorICAgICAgICAgICAgICovDQogICAgICAgICAgICAgZXh0
cmFxX2FkZF9zb3J0X3VwZGF0ZShkLCBFWFRSQV9QRU5fUSwgMCk7DQogICAgICAgICB9DQogICAg
ICAgICBleHRyYXFfY2hlY2tfYWRkX3VuYmxvY2tlZChkLCAwKTsNCkBAIC0xMTQ2LDggKzEwODMs
NyBAQCBzdGF0aWMgdm9pZCBzZWRmX3dha2UoY29uc3Qgc3RydWN0IHNjaGVkDQogICAgIHsgIA0K
ICAgICAgICAgaWYgKCBub3cgPCBpbmYtPmRlYWRsX2FicyApDQogICAgICAgICB7DQotICAgICAg
ICAgICAgUFJJTlQoNCwic2hvcnQgdW5ibG9ja2luZ1xuIik7DQotICAgICAgICAgICAgLypzaG9y
dCBibG9ja2luZyovDQorICAgICAgICAgICAgLyogU2hvcnQgYmxvY2tpbmcgKi8NCiAjaWZkZWYg
U0VERl9TVEFUUw0KICAgICAgICAgICAgIGluZi0+c2hvcnRfYmxvY2tfdG90Kys7DQogI2VuZGlm
DQpAQCAtMTE1Nyw4ICsxMDkzLDcgQEAgc3RhdGljIHZvaWQgc2VkZl93YWtlKGNvbnN0IHN0cnVj
dCBzY2hlZA0KICAgICAgICAgfQ0KICAgICAgICAgZWxzZQ0KICAgICAgICAgew0KLSAgICAgICAg
ICAgIFBSSU5UKDQsImxvbmcgdW5ibG9ja2luZ1xuIik7DQotICAgICAgICAgICAgLypsb25nIHVu
YmxvY2tpbmcqLw0KKyAgICAgICAgICAgIC8qIExvbmcgdW5ibG9ja2luZyAqLw0KICNpZmRlZiBT
RURGX1NUQVRTDQogICAgICAgICAgICAgaW5mLT5sb25nX2Jsb2NrX3RvdCsrOw0KICNlbmRpZg0K
QEAgLTExNjgsMjQgKzExMDMsMTMgQEAgc3RhdGljIHZvaWQgc2VkZl93YWtlKGNvbnN0IHN0cnVj
dCBzY2hlZA0KICAgICAgICAgfQ0KICAgICB9DQogDQotICAgIFBSSU5UKDMsICJ3b2tlIHVwIGRv
bWFpbiAlaS4laSAoZGVhZGw9ICUiUFJJdTY0IiBwZXJpb2Q9ICUiUFJJdTY0DQotICAgICAgICAg
ICJub3c9ICUiUFJJdTY0IilcbiIsDQotICAgICAgICAgIGQtPmRvbWFpbi0+ZG9tYWluX2lkLCBk
LT52Y3B1X2lkLCBpbmYtPmRlYWRsX2FicywNCi0gICAgICAgICAgaW5mLT5wZXJpb2QsIG5vdyk7
DQotDQogICAgIGlmICggUEVSSU9EX0JFR0lOKGluZikgPiBub3cgKQ0KLSAgICB7DQogICAgICAg
ICBfX2FkZF90b193YWl0cXVldWVfc29ydChkKTsNCi0gICAgICAgIFBSSU5UKDMsImFkZGVkIHRv
IHdhaXRxXG4iKTsNCi0gICAgfQ0KICAgICBlbHNlDQotICAgIHsNCiAgICAgICAgIF9fYWRkX3Rv
X3J1bnF1ZXVlX3NvcnQoZCk7DQotICAgICAgICBQUklOVCgzLCJhZGRlZCB0byBydW5xXG4iKTsN
Ci0gICAgfQ0KICANCiAjaWZkZWYgU0VERl9TVEFUUw0KLSAgICAvKmRvIHNvbWUgc3RhdGlzdGlj
cyBoZXJlLi4uKi8NCisgICAgLyogRG8gc29tZSBzdGF0aXN0aWNzIGhlcmUuLi4gKi8NCiAgICAg
aWYgKCBpbmYtPmJsb2NrX2FicyAhPSAwICkNCiAgICAgew0KICAgICAgICAgaW5mLT5ibG9ja190
aW1lX3RvdCArPSBub3cgLSBpbmYtPmJsb2NrX2FiczsNCkBAIC0xMTk0LDEyICsxMTE4LDEzIEBA
IHN0YXRpYyB2b2lkIHNlZGZfd2FrZShjb25zdCBzdHJ1Y3Qgc2NoZWQNCiAgICAgfQ0KICNlbmRp
Zg0KIA0KLSAgICAvKnNhbml0eSBjaGVjazogbWFrZSBzdXJlIGVhY2ggZXh0cmEtYXdhcmUgZG9t
YWluIElTIG9uIHRoZSB1dGlsLXEhKi8NCisgICAgLyogU2FuaXR5IGNoZWNrOiBtYWtlIHN1cmUg
ZWFjaCBleHRyYS1hd2FyZSBkb21haW4gSVMgb24gdGhlIHV0aWwtcSEgKi8NCiAgICAgQVNTRVJU
KElNUExZKGluZi0+c3RhdHVzICYgRVhUUkFfQVdBUkUsIGV4dHJhcV9vbihkLCBFWFRSQV9VVElM
X1EpKSk7DQogICAgIEFTU0VSVChfX3Rhc2tfb25fcXVldWUoZCkpOw0KLSAgICAvKmNoZWNrIHdo
ZXRoZXIgdGhlIGF3YWtlbmVkIHRhc2sgbmVlZHMgdG8gaW52b2tlIHRoZSBkb19zY2hlZHVsZQ0K
LSAgICAgIHJvdXRpbmUuIFRyeSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBydW5zIGJ1dDoNCi0gICAg
ICBTYXZlIGFwcHJveGltYXRpb246IEFsd2F5cyBzd2l0Y2ggdG8gc2NoZWR1bGVyISovDQorICAg
IC8qIENoZWNrIHdoZXRoZXIgdGhlIGF3YWtlbmVkIHRhc2sgbmVlZHMgdG8gaW52b2tlIHRoZSBk
b19zY2hlZHVsZQ0KKyAgICAgKiByb3V0aW5lLiBUcnkgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcnVu
cyBidXQ6DQorICAgICAqIFNhdmUgYXBwcm94aW1hdGlvbjogQWx3YXlzIHN3aXRjaCB0byBzY2hl
ZHVsZXIhDQorICAgICAqLw0KICAgICBBU1NFUlQoZC0+cHJvY2Vzc29yID49IDApOw0KICAgICBB
U1NFUlQoZC0+cHJvY2Vzc29yIDwgbnJfY3B1X2lkcyk7DQogICAgIEFTU0VSVChwZXJfY3B1KHNj
aGVkdWxlX2RhdGEsIGQtPnByb2Nlc3NvcikuY3Vycik7DQpAQCAtMTI0NCw3ICsxMTY5LDcgQEAg
c3RhdGljIHZvaWQgc2VkZl9kdW1wX2RvbWFpbihzdHJ1Y3QgdmNwdQ0KIH0NCiANCiANCi0vKiBk
dW1wcyBhbGwgZG9tYWlucyBvbiB0aGUgc3BlY2lmaWVkIGNwdSAqLw0KKy8qIER1bXBzIGFsbCBk
b21haW5zIG9uIHRoZSBzcGVjaWZpZWQgY3B1ICovDQogc3RhdGljIHZvaWQgc2VkZl9kdW1wX2Nw
dV9zdGF0ZShjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIGludCBpKQ0KIHsNCiAgICAgc3Ry
dWN0IGxpc3RfaGVhZCAgICAgICpsaXN0LCAqcXVldWUsICp0bXA7DQpAQCAtMTMxOSw3ICsxMjQ0
LDcgQEAgc3RhdGljIHZvaWQgc2VkZl9kdW1wX2NwdV9zdGF0ZShjb25zdCBzdA0KIH0NCiANCiAN
Ci0vKiBBZGp1c3RzIHBlcmlvZHMgYW5kIHNsaWNlcyBvZiB0aGUgZG9tYWlucyBhY2NvcmRpbmds
eSB0byB0aGVpciB3ZWlnaHRzLiAqLw0KKy8qIEFkanVzdHMgcGVyaW9kcyBhbmQgc2xpY2VzIG9m
IHRoZSBkb21haW5zIGFjY29yZGluZ2x5IHRvIHRoZWlyIHdlaWdodHMgKi8NCiBzdGF0aWMgaW50
IHNlZGZfYWRqdXN0X3dlaWdodHMoc3RydWN0IGNwdXBvb2wgKmMsIHN0cnVjdCB4ZW5fZG9tY3Rs
X3NjaGVkdWxlcl9vcCAqY21kKQ0KIHsNCiAgICAgc3RydWN0IHZjcHUgKnA7DQpAQCAtMTMzNSw3
ICsxMjYwLDcgQEAgc3RhdGljIGludCBzZWRmX2FkanVzdF93ZWlnaHRzKHN0cnVjdCBjcA0KICAg
ICAgICAgcmV0dXJuIC1FTk9NRU07DQogICAgIH0NCiANCi0gICAgLyogU3VtIGFjcm9zcyBhbGwg
d2VpZ2h0cy4gKi8NCisgICAgLyogU3VtIGFjcm9zcyBhbGwgd2VpZ2h0cyAqLw0KICAgICByY3Vf
cmVhZF9sb2NrKCZkb21saXN0X3JlYWRfbG9jayk7DQogICAgIGZvcl9lYWNoX2RvbWFpbl9pbl9j
cHVwb29sKCBkLCBjICkNCiAgICAgew0KQEAgLTEzNTAsMTEgKzEyNzUsMTMgQEAgc3RhdGljIGlu
dCBzZWRmX2FkanVzdF93ZWlnaHRzKHN0cnVjdCBjcA0KICAgICAgICAgICAgIH0NCiAgICAgICAg
ICAgICBlbHNlDQogICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvKmRvbid0IG1vZGlm
eSBkb21haW5zIHdobyBkb24ndCBoYXZlIGEgd2VpZ2h0LCBidXQgc3VtDQotICAgICAgICAgICAg
ICAgICAgdXAgdGhlIHRpbWUgdGhleSBuZWVkLCBwcm9qZWN0ZWQgdG8gYSBXRUlHSFRfUEVSSU9E
LA0KLSAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhpcyB0aW1lIGlzIG5vdCBnaXZlbiB0byB0
aGUgd2VpZ2h0LWRyaXZlbg0KLSAgICAgICAgICAgICAgICAgIGRvbWFpbnMqLw0KLSAgICAgICAg
ICAgICAgICAvKmNoZWNrIGZvciBvdmVyZmxvd3MqLw0KKyAgICAgICAgICAgICAgICAvKiBEb24n
dCBtb2RpZnkgZG9tYWlucyB3aG8gZG9uJ3QgaGF2ZSBhIHdlaWdodCwgYnV0IHN1bQ0KKyAgICAg
ICAgICAgICAgICAgKiB1cCB0aGUgdGltZSB0aGV5IG5lZWQsIHByb2plY3RlZCB0byBhIFdFSUdI
VF9QRVJJT0QsDQorICAgICAgICAgICAgICAgICAqIHNvIHRoYXQgdGhpcyB0aW1lIGlzIG5vdCBn
aXZlbiB0byB0aGUgd2VpZ2h0LWRyaXZlbg0KKyAgICAgICAgICAgICAgICAgKiAgZG9tYWlucw0K
KyAgICAgICAgICAgICAgICAgKi8NCisNCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIG92
ZXJmbG93cyAqLw0KICAgICAgICAgICAgICAgICBBU1NFUlQoKFdFSUdIVF9QRVJJT0QgPCBVTE9O
R19NQVgpIA0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgKEVET01fSU5GTyhwKS0+c2xpY2Vf
b3JpZyA8IFVMT05HX01BWCkpOw0KICAgICAgICAgICAgICAgICBzdW10W2NwdV0gKz0gDQpAQCAt
MTM2NSw3ICsxMjkyLDcgQEAgc3RhdGljIGludCBzZWRmX2FkanVzdF93ZWlnaHRzKHN0cnVjdCBj
cA0KICAgICB9DQogICAgIHJjdV9yZWFkX3VubG9jaygmZG9tbGlzdF9yZWFkX2xvY2spOw0KIA0K
LSAgICAvKiBBZGp1c3QgYWxsIHNsaWNlcyAoYW5kIHBlcmlvZHMpIHRvIHRoZSBuZXcgd2VpZ2h0
LiAqLw0KKyAgICAvKiBBZGp1c3QgYWxsIHNsaWNlcyAoYW5kIHBlcmlvZHMpIHRvIHRoZSBuZXcg
d2VpZ2h0ICovDQogICAgIHJjdV9yZWFkX2xvY2soJmRvbWxpc3RfcmVhZF9sb2NrKTsNCiAgICAg
Zm9yX2VhY2hfZG9tYWluX2luX2NwdXBvb2woIGQsIGMgKQ0KICAgICB7DQpAQCAtMTM5MywyMCAr
MTMyMCwxNSBAQCBzdGF0aWMgaW50IHNlZGZfYWRqdXN0X3dlaWdodHMoc3RydWN0IGNwDQogfQ0K
IA0KIA0KLS8qIHNldCBvciBmZXRjaCBkb21haW4gc2NoZWR1bGluZyBwYXJhbWV0ZXJzICovDQor
LyogU2V0IG9yIGZldGNoIGRvbWFpbiBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgKi8NCiBzdGF0aWMg
aW50IHNlZGZfYWRqdXN0KGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIgKm9wcywgc3RydWN0IGRvbWFp
biAqcCwgc3RydWN0IHhlbl9kb21jdGxfc2NoZWR1bGVyX29wICpvcCkNCiB7DQogICAgIHN0cnVj
dCB2Y3B1ICp2Ow0KICAgICBpbnQgcmM7DQogDQotICAgIFBSSU5UKDIsInNlZGZfYWRqdXN0IHdh
cyBjYWxsZWQsIGRvbWFpbi1pZCAlaSBuZXcgcGVyaW9kICUiUFJJdTY0IiAiDQotICAgICAgICAg
ICJuZXcgc2xpY2UgJSJQUkl1NjQiXG5sYXRlbmN5ICUiUFJJdTY0IiBleHRyYTolc1xuIiwNCi0g
ICAgICAgICAgcC0+ZG9tYWluX2lkLCBvcC0+dS5zZWRmLnBlcmlvZCwgb3AtPnUuc2VkZi5zbGlj
ZSwNCi0gICAgICAgICAgb3AtPnUuc2VkZi5sYXRlbmN5LCAob3AtPnUuc2VkZi5leHRyYXRpbWUp
PyJ5ZXMiOiJubyIpOw0KLQ0KICAgICBpZiAoIG9wLT5jbWQgPT0gWEVOX0RPTUNUTF9TQ0hFRE9Q
X3B1dGluZm8gKQ0KICAgICB7DQotICAgICAgICAvKiBDaGVjayBmb3Igc2FuZSBwYXJhbWV0ZXJz
LiAqLw0KKyAgICAgICAgLyogQ2hlY2sgZm9yIHNhbmUgcGFyYW1ldGVycyAqLw0KICAgICAgICAg
aWYgKCAhb3AtPnUuc2VkZi5wZXJpb2QgJiYgIW9wLT51LnNlZGYud2VpZ2h0ICkNCiAgICAgICAg
ICAgICByZXR1cm4gLUVJTlZBTDsNCiAgICAgICAgIGlmICggb3AtPnUuc2VkZi53ZWlnaHQgKQ0K
QEAgLTE0MTQsNyArMTMzNiw3IEBAIHN0YXRpYyBpbnQgc2VkZl9hZGp1c3QoY29uc3Qgc3RydWN0
IHNjaGUNCiAgICAgICAgICAgICBpZiAoIChvcC0+dS5zZWRmLmV4dHJhdGltZSAmIEVYVFJBX0FX
QVJFKSAmJg0KICAgICAgICAgICAgICAgICAgKCFvcC0+dS5zZWRmLnBlcmlvZCkgKQ0KICAgICAg
ICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLyogV2VpZ2h0LWRyaXZlbiBkb21haW5zIHdpdGgg
ZXh0cmF0aW1lIG9ubHkuICovDQorICAgICAgICAgICAgICAgIC8qIFdlaWdodC1kcml2ZW4gZG9t
YWlucyB3aXRoIGV4dHJhdGltZSBvbmx5ICovDQogICAgICAgICAgICAgICAgIGZvcl9lYWNoX3Zj
cHUgKCBwLCB2ICkNCiAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgRURP
TV9JTkZPKHYpLT5leHRyYXdlaWdodCA9IG9wLT51LnNlZGYud2VpZ2h0Ow0KQEAgLTE0MjUsNyAr
MTM0Nyw3IEBAIHN0YXRpYyBpbnQgc2VkZl9hZGp1c3QoY29uc3Qgc3RydWN0IHNjaGUNCiAgICAg
ICAgICAgICB9DQogICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgIHsNCi0gICAgICAgICAg
ICAgICAgLyogV2VpZ2h0LWRyaXZlbiBkb21haW5zIHdpdGggcmVhbC10aW1lIGV4ZWN1dGlvbi4g
Ki8NCisgICAgICAgICAgICAgICAgLyogV2VpZ2h0LWRyaXZlbiBkb21haW5zIHdpdGggcmVhbC10
aW1lIGV4ZWN1dGlvbiAqLw0KICAgICAgICAgICAgICAgICBmb3JfZWFjaF92Y3B1ICggcCwgdiAp
DQogICAgICAgICAgICAgICAgICAgICBFRE9NX0lORk8odiktPndlaWdodCA9IG9wLT51LnNlZGYu
d2VpZ2h0Ow0KICAgICAgICAgICAgIH0NCkBAIC0xNDM1LDggKzEzNTcsNyBAQCBzdGF0aWMgaW50
IHNlZGZfYWRqdXN0KGNvbnN0IHN0cnVjdCBzY2hlDQogICAgICAgICAgICAgLyogVGltZS1kcml2
ZW4gZG9tYWlucy4gKi8NCiAgICAgICAgICAgICBmb3JfZWFjaF92Y3B1ICggcCwgdiApDQogICAg
ICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgKiBTYW5p
dHkgY2hlY2tpbmc6IG5vdGUgdGhhdCBkaXNhYmxpbmcgZXh0cmEgd2VpZ2h0IHJlcXVpcmVzDQor
ICAgICAgICAgICAgICAgIC8qIFNhbml0eSBjaGVja2luZzogbm90ZSB0aGF0IGRpc2FibGluZyBl
eHRyYSB3ZWlnaHQgcmVxdWlyZXMNCiAgICAgICAgICAgICAgICAgICogdGhhdCB3ZSBzZXQgYSBu
b24temVybyBzbGljZS4NCiAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIGlm
ICggKG9wLT51LnNlZGYucGVyaW9kID4gUEVSSU9EX01BWCkgfHwNCkBAIC0xNDc3LDcgKzEzOTgs
NiBAQCBzdGF0aWMgaW50IHNlZGZfYWRqdXN0KGNvbnN0IHN0cnVjdCBzY2hlDQogICAgICAgICBv
cC0+dS5zZWRmLndlaWdodCAgICA9IEVET01fSU5GTyhwLT52Y3B1WzBdKS0+d2VpZ2h0Ow0KICAg
ICB9DQogDQotICAgIFBSSU5UKDIsInNlZGZfYWRqdXN0X2ZpbmlzaGVkXG4iKTsNCiAgICAgcmV0
dXJuIDA7DQogfQ0KIA0K


--=-3p5/0djGq6n5G1gGRftX--

--=-4GhoPkvT2knwTpwLdibp
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk7wyjgACgkQk4XaBE3IOsR/vACgqGtZKPaaw+mk+E5KLy5ydkVO
0dgAn2xbXZ2l2w6UXsUeFgUEefZ0Zm8r
=lJaO
-----END PGP SIGNATURE-----

--=-4GhoPkvT2knwTpwLdibp--



--===============4953755209351780878==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============4953755209351780878==--



From xen-devel-bounces@lists.xensource.com Wed Dec 21 08:08:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 21 Dec 2011 08:08:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RdHDh-0002dk-6Q; Wed, 21 Dec 2011 08:08:13 +0000
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xen.org with smtp (Exim 4.72)
	(envelope-from <raistlin@linux.it>) id 1RdHDf-0002dY-81
	for xen-devel@lists.xensource.com; Wed, 21 Dec 2011 08:08:11 +0000
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-12.tower-21.messagelabs.com!1324454881!8924721!1
X-Originating-IP: [193.205.80.99]
X-SpamReason: No, hits=1.1 required=7.0 tests=BODY_RANDOM_LONG,DIET_1
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28948 invoked from network); 21 Dec 2011 08:08:01 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-12.tower-21.messagelabs.com with SMTP;
	21 Dec 2011 08:08:01 -0000
Received: from [62.94.181.91] (account d.faggioli@sssup.it HELO [192.168.0.40])
	by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 74071203; Wed, 21 Dec 2011 09:07:59 +0100
Message-ID: <1324454839.2682.1.camel@Solace>
From: Dario Faggioli <raistlin@linux.it>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Wed, 21 Dec 2011 09:07:19 +0100
X-Mailer: Evolution 3.2.2-1 
Mime-Version: 1.0
Cc: George Dunlap <George.Dunlap@eu.citrix.com>, Keir Fraser <keir@xen.org>
Subject: [Xen-devel] [PATCH] sedf: remove useless tracing printk and
 harmonize comments style.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============7346677379948124988=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============7346677379948124988==
Content-Type: multipart/signed; micalg="pgp-sha1"; protocol="application/pgp-signature";
	boundary="=-ByODJfHW+wcj4VSHJBM9"


--=-ByODJfHW+wcj4VSHJBM9
Content-Type: multipart/mixed; boundary="=-SQC3wUYrGGqGq8T7E3BQ"


--=-SQC3wUYrGGqGq8T7E3BQ
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

sched_sedf.c used o have its own mechanism for producing tracing-alike
kind of information (domain block, wakeup, etc.). Nowadays, with an even
not so high number of pCPUs/vCPUs, just trying to enable this makes
the serial console completely unusable, produces tons of very hard to
parse and interpreet logging and can easily livelock Dom0. Moreover,
pretty much the same result this is struggling to get to, is better
achieved by enabling the scheduler-related tracing events, as
it is for the other schedulers (say, credit or credit2).

For all these reasons, this removes that machinery completely. While at
it, check in some cosmetics that harmonize the comments withim themself
and with the rest of the code base.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>

diff -r 17d99691e0ec xen/common/sched_sedf.c
--- a/xen/common/sched_sedf.c	Tue Dec 20 16:39:56 2011 +0000
+++ b/xen/common/sched_sedf.c	Tue Dec 20 17:32:52 2011 +0000
@@ -13,14 +13,6 @@
 #include <xen/time.h>
 #include <xen/errno.h>
=20
-/*verbosity settings*/
-#define SEDFLEVEL 0
-#define PRINT(_f, _a...)                        \
-    do {                                        \
-        if ( (_f) <=3D SEDFLEVEL )                \
-            printk(_a );                        \
-    } while ( 0 )
-
 #define SEDF_CPUONLINE(_pool)                                             =
\
     (((_pool) =3D=3D NULL) ? &cpupool_free_cpus : (_pool)->cpu_valid)
=20
@@ -66,34 +58,35 @@ struct sedf_vcpu_info {
     struct list_head list;
     struct list_head extralist[2];
 =20
-    /*Parameters for EDF*/
-    s_time_t  period;  /*=3D(relative deadline)*/
-    s_time_t  slice;  /*=3Dworst case execution time*/
+    /* Parameters for EDF */
+    s_time_t  period;  /* =3D(relative deadline) */
+    s_time_t  slice;   /* =3Dworst case execution time */
 =20
-    /*Advaced Parameters*/
-    /*Latency Scaling*/
+    /* Advaced Parameters */
+
+    /* Latency Scaling */
     s_time_t  period_orig;
     s_time_t  slice_orig;
     s_time_t  latency;
 =20
-    /*status of domain*/
+    /* Status of domain */
     int       status;
-    /*weights for "Scheduling for beginners/ lazy/ etc." ;)*/
+    /* Weights for "Scheduling for beginners/ lazy/ etc." ;) */
     short     weight;
     short     extraweight;
-    /*Bookkeeping*/
+    /* Bookkeeping */
     s_time_t  deadl_abs;
     s_time_t  sched_start_abs;
     s_time_t  cputime;
-    /* times the domain un-/blocked */
+    /* Times the domain un-/blocked */
     s_time_t  block_abs;
     s_time_t  unblock_abs;
 =20
-    /*scores for {util, block penalty}-weighted extratime distribution*/
+    /* Scores for {util, block penalty}-weighted extratime distribution */
     int   score[2];
     s_time_t  short_block_lost_tot;
 =20
-    /*Statistics*/
+    /* Statistics */
     s_time_t  extra_time_tot;
=20
 #ifdef SEDF_STATS
@@ -158,18 +151,16 @@ static inline void extraq_del(struct vcp
 {
     struct list_head *list =3D EXTRALIST(d,i);
     ASSERT(extraq_on(d,i));
-    PRINT(3, "Removing domain %i.%i from L%i extraq\n",
-          d->domain->domain_id, d->vcpu_id, i);
     list_del(list);
     list->next =3D NULL;
     ASSERT(!extraq_on(d, i));
 }
=20
-/* adds a domain to the queue of processes which are aware of extra time. =
List
-   is sorted by score, where a lower score means higher priority for an ex=
tra
-   slice. It also updates the score, by simply subtracting a fixed value f=
rom
-   each entry, in order to avoid overflow. The algorithm works by simply
-   charging each domain that recieved extratime with an inverse of its wei=
ght.
+/* Adds a domain to the queue of processes which are aware of extra time. =
List
+ * is sorted by score, where a lower score means higher priority for an ex=
tra
+ * slice. It also updates the score, by simply subtracting a fixed value f=
rom
+ * each entry, in order to avoid overflow. The algorithm works by simply
+ * charging each domain that recieved extratime with an inverse of its wei=
ght.
  */=20
 static inline void extraq_add_sort_update(struct vcpu *d, int i, int sub)
 {
@@ -178,13 +169,7 @@ static inline void extraq_add_sort_updat
 =20
     ASSERT(!extraq_on(d,i));
=20
-    PRINT(3, "Adding domain %i.%i (score=3D %i, short_pen=3D %"PRIi64")"
-          " to L%i extraq\n",
-          d->domain->domain_id, d->vcpu_id, EDOM_INFO(d)->score[i],
-          EDOM_INFO(d)->short_block_lost_tot, i);
-
-    /*
-     * Iterate through all elements to find our "hole" and on our way
+    /* Iterate through all elements to find our "hole" and on our way
      * update all the other scores.
      */
     list_for_each ( cur, EXTRAQ(d->processor, i) )
@@ -193,25 +178,18 @@ static inline void extraq_add_sort_updat
         curinf->score[i] -=3D sub;
         if ( EDOM_INFO(d)->score[i] < curinf->score[i] )
             break;
-        PRINT(4,"\tbehind domain %i.%i (score=3D %i)\n",
-              curinf->vcpu->domain->domain_id,
-              curinf->vcpu->vcpu_id, curinf->score[i]);
     }
=20
-    /* cur now contains the element, before which we'll enqueue. */
-    PRINT(3, "\tlist_add to %p\n", cur->prev);
+    /* cur now contains the element, before which we'll enqueue */
     list_add(EXTRALIST(d,i),cur->prev);
 =20
-    /* Continue updating the extraq. */
+    /* Continue updating the extraq */
     if ( (cur !=3D EXTRAQ(d->processor,i)) && sub )
     {
         for ( cur =3D cur->next; cur !=3D EXTRAQ(d->processor,i); cur =3D =
cur->next )
         {
             curinf =3D list_entry(cur,struct sedf_vcpu_info, extralist[i])=
;
             curinf->score[i] -=3D sub;
-            PRINT(4, "\tupdating domain %i.%i (score=3D %u)\n",
-                  curinf->vcpu->domain->domain_id,=20
-                  curinf->vcpu->vcpu_id, curinf->score[i]);
         }
     }
=20
@@ -221,29 +199,14 @@ static inline void extraq_check(struct v
 {
     if ( extraq_on(d, EXTRA_UTIL_Q) )
     {
-        PRINT(2,"Dom %i.%i is on L1 extraQ\n",
-              d->domain->domain_id, d->vcpu_id);
-
         if ( !(EDOM_INFO(d)->status & EXTRA_AWARE) &&
              !extra_runs(EDOM_INFO(d)) )
-        {
             extraq_del(d, EXTRA_UTIL_Q);
-            PRINT(2,"Removed dom %i.%i from L1 extraQ\n",
-                  d->domain->domain_id, d->vcpu_id);
-        }
     }
     else
     {
-        PRINT(2, "Dom %i.%i is NOT on L1 extraQ\n",
-              d->domain->domain_id,
-              d->vcpu_id);
-
         if ( (EDOM_INFO(d)->status & EXTRA_AWARE) && sedf_runnable(d) )
-        {
             extraq_add_sort_update(d, EXTRA_UTIL_Q, 0);
-            PRINT(2,"Added dom %i.%i to L1 extraQ\n",
-                  d->domain->domain_id, d->vcpu_id);
-        }
     }
 }
=20
@@ -252,7 +215,7 @@ static inline void extraq_check_add_unbl
     struct sedf_vcpu_info *inf =3D EDOM_INFO(d);
=20
     if ( inf->status & EXTRA_AWARE )
-        /* Put on the weighted extraq without updating any scores. */
+        /* Put on the weighted extraq without updating any scores */
         extraq_add_sort_update(d, EXTRA_UTIL_Q, 0);
 }
=20
@@ -265,8 +228,6 @@ static inline void __del_from_queue(stru
 {
     struct list_head *list =3D LIST(d);
     ASSERT(__task_on_queue(d));
-    PRINT(3,"Removing domain %i.%i (bop=3D %"PRIu64") from runq/waitq\n",
-          d->domain->domain_id, d->vcpu_id, PERIOD_BEGIN(EDOM_INFO(d)));
     list_del(list);
     list->next =3D NULL;
     ASSERT(!__task_on_queue(d));
@@ -279,13 +240,12 @@ static inline void list_insert_sort(
 {
     struct list_head     *cur;
=20
-    /* Iterate through all elements to find our "hole". */
+    /* Iterate through all elements to find our "hole" */
     list_for_each( cur, list )
         if ( comp(element, cur) < 0 )
             break;
=20
-    /* cur now contains the element, before which we'll enqueue. */
-    PRINT(3,"\tlist_add to %p\n",cur->prev);
+    /* cur now contains the element, before which we'll enqueue */
     list_add(element, cur->prev);
 }
=20
@@ -303,30 +263,26 @@ static int name##_comp(struct list_head*
         return 1;                                                       \
 }
=20
-/* adds a domain to the queue of processes which wait for the beginning of=
 the
-   next period; this list is therefore sortet by this time, which is simpl=
y
-   absol. deadline - period
+/* Adds a domain to the queue of processes which wait for the beginning of=
 the
+ * next period; this list is therefore sortet by this time, which is simpl=
y
+ * absol. deadline - period.
  */=20
 DOMAIN_COMPARER(waitq, list, PERIOD_BEGIN(d1), PERIOD_BEGIN(d2));
 static inline void __add_to_waitqueue_sort(struct vcpu *v)
 {
     ASSERT(!__task_on_queue(v));
-    PRINT(3,"Adding domain %i.%i (bop=3D %"PRIu64") to waitq\n",
-          v->domain->domain_id, v->vcpu_id, PERIOD_BEGIN(EDOM_INFO(v)));
     list_insert_sort(WAITQ(v->processor), LIST(v), waitq_comp);
     ASSERT(__task_on_queue(v));
 }
=20
-/* adds a domain to the queue of processes which have started their curren=
t
-   period and are runnable (i.e. not blocked, dieing,...). The first eleme=
nt
-   on this list is running on the processor, if the list is empty the idle
-   task will run. As we are implementing EDF, this list is sorted by deadl=
ines.
+/* Adds a domain to the queue of processes which have started their curren=
t
+ * period and are runnable (i.e. not blocked, dieing,...). The first eleme=
nt
+ * on this list is running on the processor, if the list is empty the idle
+ * task will run. As we are implementing EDF, this list is sorted by deadl=
ines.
  */=20
 DOMAIN_COMPARER(runq, list, d1->deadl_abs, d2->deadl_abs);
 static inline void __add_to_runqueue_sort(struct vcpu *v)
 {
-    PRINT(3,"Adding domain %i.%i (deadl=3D %"PRIu64") to runq\n",
-          v->domain->domain_id, v->vcpu_id, EDOM_INFO(v)->deadl_abs);
     list_insert_sort(RUNQ(v->processor), LIST(v), runq_comp);
 }
=20
@@ -445,22 +401,21 @@ static int sedf_pick_cpu(const struct sc
     return cpumask_first(&online_affinity);
 }
=20
-/*
- * Handles the rescheduling & bookkeeping of domains running in their
+
+/* Handles the rescheduling & bookkeeping of domains running in their
  * guaranteed timeslice.
  */
 static void desched_edf_dom(s_time_t now, struct vcpu* d)
 {
     struct sedf_vcpu_info* inf =3D EDOM_INFO(d);
=20
-    /* Current domain is running in real time mode. */
+    /* Current domain is running in real time mode */
     ASSERT(__task_on_queue(d));
=20
-    /* Update the domain's cputime. */
+    /* Update the domain's cputime */
     inf->cputime +=3D now - inf->sched_start_abs;
=20
-    /*
-     * Scheduling decisions which don't remove the running domain from the
+    /* Scheduling decisions which don't remove the running domain from the
      * runq.=20
      */
     if ( (inf->cputime < inf->slice) && sedf_runnable(d) )
@@ -468,8 +423,7 @@ static void desched_edf_dom(s_time_t now
  =20
     __del_from_queue(d);
  =20
-    /*
-     * Manage bookkeeping (i.e. calculate next deadline, memorise
+    /* Manage bookkeeping (i.e. calculate next deadline, memorise
      * overrun-time of slice) of finished domains.
      */
     if ( inf->cputime >=3D inf->slice )
@@ -478,30 +432,30 @@ static void desched_edf_dom(s_time_t now
  =20
         if ( inf->period < inf->period_orig )
         {
-            /* This domain runs in latency scaling or burst mode. */
+            /* This domain runs in latency scaling or burst mode */
             inf->period *=3D 2;
             inf->slice  *=3D 2;
             if ( (inf->period > inf->period_orig) ||
                  (inf->slice > inf->slice_orig) )
             {
-                /* Reset slice and period. */
+                /* Reset slice and period */
                 inf->period =3D inf->period_orig;
                 inf->slice =3D inf->slice_orig;
             }
         }
=20
-        /* Set next deadline. */
+        /* Set next deadline */
         inf->deadl_abs +=3D inf->period;
     }
 =20
-    /* Add a runnable domain to the waitqueue. */
+    /* Add a runnable domain to the waitqueue */
     if ( sedf_runnable(d) )
     {
         __add_to_waitqueue_sort(d);
     }
     else
     {
-        /* We have a blocked realtime task -> remove it from exqs too. */
+        /* We have a blocked realtime task -> remove it from exqs too */
         if ( extraq_on(d, EXTRA_PEN_Q) )
             extraq_del(d, EXTRA_PEN_Q);
         if ( extraq_on(d, EXTRA_UTIL_Q) )
@@ -521,73 +475,59 @@ static void update_queues(
     struct list_head     *cur, *tmp;
     struct sedf_vcpu_info *curinf;
 =20
-    PRINT(3,"Updating waitq..\n");
-
-    /*
-     * Check for the first elements of the waitqueue, whether their
+    /* Check for the first elements of the waitqueue, whether their
      * next period has already started.
      */
     list_for_each_safe ( cur, tmp, waitq )
     {
         curinf =3D list_entry(cur, struct sedf_vcpu_info, list);
-        PRINT(4,"\tLooking @ dom %i.%i\n",
-              curinf->vcpu->domain->domain_id, curinf->vcpu->vcpu_id);
         if ( PERIOD_BEGIN(curinf) > now )
             break;
         __del_from_queue(curinf->vcpu);
         __add_to_runqueue_sort(curinf->vcpu);
     }
 =20
-    PRINT(3,"Updating runq..\n");
-
-    /* Process the runq, find domains that are on the runq that shouldn't.=
 */
+    /* Process the runq, find domains that are on the runq that shouldn't =
*/
     list_for_each_safe ( cur, tmp, runq )
     {
         curinf =3D list_entry(cur,struct sedf_vcpu_info,list);
-        PRINT(4,"\tLooking @ dom %i.%i\n",
-              curinf->vcpu->domain->domain_id, curinf->vcpu->vcpu_id);
=20
         if ( unlikely(curinf->slice =3D=3D 0) )
         {
-            /* Ignore domains with empty slice. */
-            PRINT(4,"\tUpdating zero-slice domain %i.%i\n",
-                  curinf->vcpu->domain->domain_id,
-                  curinf->vcpu->vcpu_id);
+            /* Ignore domains with empty slice */
             __del_from_queue(curinf->vcpu);
=20
-            /* Move them to their next period. */
+            /* Move them to their next period */
             curinf->deadl_abs +=3D curinf->period;
=20
-            /* Ensure that the start of the next period is in the future. =
*/
+            /* Ensure that the start of the next period is in the future *=
/
             if ( unlikely(PERIOD_BEGIN(curinf) < now) )
                 curinf->deadl_abs +=3D=20
                     (DIV_UP(now - PERIOD_BEGIN(curinf),
                             curinf->period)) * curinf->period;
=20
-            /* Put them back into the queue. */
+            /* Put them back into the queue */
             __add_to_waitqueue_sort(curinf->vcpu);
         }
         else if ( unlikely((curinf->deadl_abs < now) ||
                            (curinf->cputime > curinf->slice)) )
         {
-            /*
-             * We missed the deadline or the slice was already finished.
+            /* We missed the deadline or the slice was already finished.
              * Might hapen because of dom_adj.
              */
-            PRINT(4,"\tDomain %i.%i exceeded it's deadline/"
-                  "slice (%"PRIu64" / %"PRIu64") now: %"PRIu64
-                  " cputime: %"PRIu64"\n",
-                  curinf->vcpu->domain->domain_id,
-                  curinf->vcpu->vcpu_id,
-                  curinf->deadl_abs, curinf->slice, now,
-                  curinf->cputime);
+            printk("\tDomain %i.%i exceeded it's deadline/"
+                   "slice (%"PRIu64" / %"PRIu64") now: %"PRIu64
+                   " cputime: %"PRIu64"\n",
+                   curinf->vcpu->domain->domain_id,
+                   curinf->vcpu->vcpu_id,
+                   curinf->deadl_abs, curinf->slice, now,
+                   curinf->cputime);
             __del_from_queue(curinf->vcpu);
=20
-            /* Common case: we miss one period. */
+            /* Common case: we miss one period */
             curinf->deadl_abs +=3D curinf->period;
   =20
-            /*
-             * If we are still behind: modulo arithmetic, force deadline
+            /* If we are still behind: modulo arithmetic, force deadline
              * to be in future and aligned to period borders.
              */
             if ( unlikely(curinf->deadl_abs < now) )
@@ -596,7 +536,7 @@ static void update_queues(
                            curinf->period) * curinf->period;
             ASSERT(curinf->deadl_abs >=3D now);
=20
-            /* Give a fresh slice. */
+            /* Give a fresh slice */
             curinf->cputime =3D 0;
             if ( PERIOD_BEGIN(curinf) > now )
                 __add_to_waitqueue_sort(curinf->vcpu);
@@ -606,17 +546,16 @@ static void update_queues(
         else
             break;
     }
-
-    PRINT(3,"done updating the queues\n");
 }
=20

 /* removes a domain from the head of the according extraQ and
-   requeues it at a specified position:
-     round-robin extratime: end of extraQ
-     weighted ext.: insert in sorted list by score
-   if the domain is blocked / has regained its short-block-loss
-   time it is not put on any queue */
+ * requeues it at a specified position:
+ *   round-robin extratime: end of extraQ
+ *   weighted ext.: insert in sorted list by score
+ * if the domain is blocked / has regained its short-block-loss
+ * time it is not put on any queue.
+ */
 static void desched_extra_dom(s_time_t now, struct vcpu *d)
 {
     struct sedf_vcpu_info *inf =3D EDOM_INFO(d);
@@ -625,29 +564,25 @@ static void desched_extra_dom(s_time_t n
=20
     ASSERT(extraq_on(d, i));
=20
-    /* Unset all running flags. */
+    /* Unset all running flags */
     inf->status  &=3D ~(EXTRA_RUN_PEN | EXTRA_RUN_UTIL);
-    /* Fresh slice for the next run. */
+    /* Fresh slice for the next run */
     inf->cputime =3D 0;
-    /* Accumulate total extratime. */
+    /* Accumulate total extratime */
     inf->extra_time_tot +=3D now - inf->sched_start_abs;
     /* Remove extradomain from head of the queue. */
     extraq_del(d, i);
=20
-    /* Update the score. */
+    /* Update the score */
     oldscore =3D inf->score[i];
     if ( i =3D=3D EXTRA_PEN_Q )
     {
-        /*domain was running in L0 extraq*/
-        /*reduce block lost, probably more sophistication here!*/
+        /* Domain was running in L0 extraq */
+        /* reduce block lost, probably more sophistication here!*/
         /*inf->short_block_lost_tot -=3D EXTRA_QUANTUM;*/
         inf->short_block_lost_tot -=3D now - inf->sched_start_abs;
-        PRINT(3,"Domain %i.%i: Short_block_loss: %"PRIi64"\n",=20
-              inf->vcpu->domain->domain_id, inf->vcpu->vcpu_id,
-              inf->short_block_lost_tot);
 #if 0
-        /*
-         * KAF: If we don't exit short-blocking state at this point
+        /* KAF: If we don't exit short-blocking state at this point
          * domain0 can steal all CPU for up to 10 seconds before
          * scheduling settles down (when competing against another
          * CPU-bound domain). Doing this seems to make things behave
@@ -656,51 +591,56 @@ static void desched_extra_dom(s_time_t n
         if ( inf->short_block_lost_tot <=3D 0 )
 #endif
         {
-            PRINT(4,"Domain %i.%i compensated short block loss!\n",
-                  inf->vcpu->domain->domain_id, inf->vcpu->vcpu_id);
-            /*we have (over-)compensated our block penalty*/
+            /* We have (over-)compensated our block penalty */
             inf->short_block_lost_tot =3D 0;
-            /*we don't want a place on the penalty queue anymore!*/
+            /* We don't want a place on the penalty queue anymore! */
             inf->status &=3D ~EXTRA_WANT_PEN_Q;
             goto check_extra_queues;
         }
=20
-        /*we have to go again for another try in the block-extraq,
-          the score is not used incremantally here, as this is
-          already done by recalculating the block_lost*/
+        /* We have to go again for another try in the block-extraq,
+         * the score is not used incremantally here, as this is
+         * already done by recalculating the block_lost
+         */
         inf->score[EXTRA_PEN_Q] =3D (inf->period << 10) /
             inf->short_block_lost_tot;
         oldscore =3D 0;
     }
     else
     {
-        /*domain was running in L1 extraq =3D> score is inverse of
-          utilization and is used somewhat incremental!*/
+        /* Domain was running in L1 extraq =3D> score is inverse of
+         * utilization and is used somewhat incremental!
+         */
         if ( !inf->extraweight )
-            /*NB: use fixed point arithmetic with 10 bits*/
+        {
+            /* NB: use fixed point arithmetic with 10 bits */
             inf->score[EXTRA_UTIL_Q] =3D (inf->period << 10) /
                 inf->slice;
+        }
         else
-            /*conversion between realtime utilisation and extrawieght:
-              full (ie 100%) utilization is equivalent to 128 extraweight*=
/
+        {
+            /* Conversion between realtime utilisation and extrawieght:
+             * full (ie 100%) utilization is equivalent to 128 extraweight
+             */
             inf->score[EXTRA_UTIL_Q] =3D (1<<17) / inf->extraweight;
+        }
     }
=20
  check_extra_queues:
-    /* Adding a runnable domain to the right queue and removing blocked on=
es*/
+    /* Adding a runnable domain to the right queue and removing blocked on=
es */
     if ( sedf_runnable(d) )
     {
-        /*add according to score: weighted round robin*/
+        /* Add according to score: weighted round robin */
         if (((inf->status & EXTRA_AWARE) && (i =3D=3D EXTRA_UTIL_Q)) ||
             ((inf->status & EXTRA_WANT_PEN_Q) && (i =3D=3D EXTRA_PEN_Q)))
             extraq_add_sort_update(d, i, oldscore);
     }
     else
     {
-        /*remove this blocked domain from the waitq!*/
+        /* Remove this blocked domain from the waitq! */
         __del_from_queue(d);
-        /*make sure that we remove a blocked domain from the other
-          extraq too*/
+        /* Make sure that we remove a blocked domain from the other
+         * extraq too. */
         if ( i =3D=3D EXTRA_PEN_Q )
         {
             if ( extraq_on(d, EXTRA_UTIL_Q) )
@@ -732,8 +672,9 @@ static struct task_slice sedf_do_extra_s
=20
     if ( !list_empty(extraq[EXTRA_PEN_Q]) )
     {
-        /*we still have elements on the level 0 extraq=20
-          =3D> let those run first!*/
+        /* We still have elements on the level 0 extraq
+         * =3D> let those run first!
+         */
         runinf   =3D list_entry(extraq[EXTRA_PEN_Q]->next,=20
                               struct sedf_vcpu_info, extralist[EXTRA_PEN_Q=
]);
         runinf->status |=3D EXTRA_RUN_PEN;
@@ -747,7 +688,7 @@ static struct task_slice sedf_do_extra_s
     {
         if ( !list_empty(extraq[EXTRA_UTIL_Q]) )
         {
-            /*use elements from the normal extraqueue*/
+            /* Use elements from the normal extraqueue */
             runinf   =3D list_entry(extraq[EXTRA_UTIL_Q]->next,
                                   struct sedf_vcpu_info,
                                   extralist[EXTRA_UTIL_Q]);
@@ -773,10 +714,11 @@ static struct task_slice sedf_do_extra_s
=20

 /* Main scheduling function
-   Reasons for calling this function are:
-   -timeslice for the current period used up
-   -domain on waitqueue has started it's period
-   -and various others ;) in general: determine which domain to run next*/
+ * Reasons for calling this function are:
+ * -timeslice for the current period used up
+ * -domain on waitqueue has started it's period
+ * -and various others ;) in general: determine which domain to run next
+ */
 static struct task_slice sedf_do_schedule(
     const struct scheduler *ops, s_time_t now, bool_t tasklet_work_schedul=
ed)
 {
@@ -789,13 +731,14 @@ static struct task_slice sedf_do_schedul
     struct sedf_vcpu_info *runinf, *waitinf;
     struct task_slice      ret;
=20
-    /*idle tasks don't need any of the following stuf*/
+    /* Idle tasks don't need any of the following stuf */
     if ( is_idle_vcpu(current) )
         goto check_waitq;
 =20
-    /* create local state of the status of the domain, in order to avoid
-       inconsistent state during scheduling decisions, because data for
-       vcpu_runnable is not protected by the scheduling lock!*/
+    /* Create local state of the status of the domain, in order to avoid
+     * inconsistent state during scheduling decisions, because data for
+     * vcpu_runnable is not protected by the scheduling lock!
+     */
     if ( !vcpu_runnable(current) )
         inf->status |=3D SEDF_ASLEEP;
 =20
@@ -804,7 +747,7 @@ static struct task_slice sedf_do_schedul
=20
     if ( unlikely(extra_runs(inf)) )
     {
-        /*special treatment of domains running in extra time*/
+        /* Special treatment of domains running in extra time */
         desched_extra_dom(now, current);
     }
     else=20
@@ -814,10 +757,11 @@ static struct task_slice sedf_do_schedul
  check_waitq:
     update_queues(now, runq, waitq);
=20
-    /*now simply pick the first domain from the runqueue, which has the
-      earliest deadline, because the list is sorted*/
-=20
-    /* Tasklet work (which runs in idle VCPU context) overrides all else. =
*/
+    /* Now simply pick the first domain from the runqueue, which has the
+     * earliest deadline, because the list is sorted
+     *
+     * Tasklet work (which runs in idle VCPU context) overrides all else.
+     */
     if ( tasklet_work_scheduled ||
          (list_empty(runq) && list_empty(waitq)) ||
          unlikely(!cpumask_test_cpu(cpu, SEDF_CPUONLINE(per_cpu(cpupool, c=
pu)))) )
@@ -833,9 +777,10 @@ static struct task_slice sedf_do_schedul
         {
             waitinf  =3D list_entry(waitq->next,
                                   struct sedf_vcpu_info,list);
-            /*rerun scheduler, when scheduled domain reaches it's
-              end of slice or the first domain from the waitqueue
-              gets ready*/
+            /* Rerun scheduler, when scheduled domain reaches it's
+             * end of slice or the first domain from the waitqueue
+             * gets ready.
+             */
             ret.time =3D MIN(now + runinf->slice - runinf->cputime,
                            PERIOD_BEGIN(waitinf)) - now;
         }
@@ -847,14 +792,15 @@ static struct task_slice sedf_do_schedul
     else
     {
         waitinf  =3D list_entry(waitq->next,struct sedf_vcpu_info, list);
-        /*we could not find any suitable domain=20
-          =3D> look for domains that are aware of extratime*/
+        /* We could not find any suitable domain=20
+         * =3D> look for domains that are aware of extratime*/
         ret =3D sedf_do_extra_schedule(now, PERIOD_BEGIN(waitinf),
                                      extraq, cpu);
     }
=20
-    /*TODO: Do something USEFUL when this happens and find out, why it
-      still can happen!!!*/
+    /* TODO: Do something USEFUL when this happens and find out, why it
+     * still can happen!!!
+     */
     if ( ret.time < 0)
     {
         printk("Ouch! We are seriously BEHIND schedule! %"PRIi64"\n",
@@ -874,9 +820,6 @@ static struct task_slice sedf_do_schedul
=20
 static void sedf_sleep(const struct scheduler *ops, struct vcpu *d)
 {
-    PRINT(2,"sedf_sleep was called, domain-id %i.%i\n",
-          d->domain->domain_id, d->vcpu_id);
-=20
     if ( is_idle_vcpu(d) )
         return;
=20
@@ -972,27 +915,29 @@ static void sedf_sleep(const struct sche
 static void unblock_short_extra_support(
     struct sedf_vcpu_info* inf, s_time_t now)
 {
-    /*this unblocking scheme tries to support the domain, by assigning it
-    a priority in extratime distribution according to the loss of time
-    in this slice due to blocking*/
+    /* This unblocking scheme tries to support the domain, by assigning it
+     * a priority in extratime distribution according to the loss of time
+     * in this slice due to blocking
+     */
     s_time_t pen;
 =20
-    /*no more realtime execution in this period!*/
+    /* No more realtime execution in this period! */
     inf->deadl_abs +=3D inf->period;
     if ( likely(inf->block_abs) )
     {
-        //treat blocked time as consumed by the domain*/
+        /* Treat blocked time as consumed by the domain */
         /*inf->cputime +=3D now - inf->block_abs;*/
-        /*penalty is time the domain would have
-          had if it continued to run */
+        /* Penalty is time the domain would have
+         * had if it continued to run.
+         */
         pen =3D (inf->slice - inf->cputime);
         if ( pen < 0 )
             pen =3D 0;
-        /*accumulate all penalties over the periods*/
+        /* Accumulate all penalties over the periods */
         /*inf->short_block_lost_tot +=3D pen;*/
-        /*set penalty to the current value*/
+        /* Set penalty to the current value */
         inf->short_block_lost_tot =3D pen;
-        /*not sure which one is better.. but seems to work well...*/
+        /* Not sure which one is better.. but seems to work well... */
  =20
         if ( inf->short_block_lost_tot )
         {
@@ -1002,28 +947,30 @@ static void unblock_short_extra_support(
             inf->pen_extra_blocks++;
 #endif
             if ( extraq_on(inf->vcpu, EXTRA_PEN_Q) )
-                /*remove domain for possible resorting!*/
+                /* Remove domain for possible resorting! */
                 extraq_del(inf->vcpu, EXTRA_PEN_Q);
             else
-                /*remember that we want to be on the penalty q
-                  so that we can continue when we (un-)block
-                  in penalty-extratime*/
+                /* Remember that we want to be on the penalty q
+                 * so that we can continue when we (un-)block
+                 * in penalty-extratime
+                 */
                 inf->status |=3D EXTRA_WANT_PEN_Q;
   =20
-            /*(re-)add domain to the penalty extraq*/
+            /* (re-)add domain to the penalty extraq */
             extraq_add_sort_update(inf->vcpu, EXTRA_PEN_Q, 0);
         }
     }
=20
-    /*give it a fresh slice in the next period!*/
+    /* Give it a fresh slice in the next period! */
     inf->cputime =3D 0;
 }
=20

 static void unblock_long_cons_b(struct sedf_vcpu_info* inf,s_time_t now)
 {
-    /*Conservative 2b*/
-    /*Treat the unblocking time as a start of a new period */
+    /* Conservative 2b */
+
+    /* Treat the unblocking time as a start of a new period */
     inf->deadl_abs =3D now + inf->period;
     inf->cputime =3D 0;
 }
@@ -1046,15 +993,16 @@ static inline int get_run_type(struct vc
 }
=20

-/*Compares two domains in the relation of whether the one is allowed to
-  interrupt the others execution.
-  It returns true (!=3D0) if a switch to the other domain is good.
-  Current Priority scheme is as follows:
-   EDF > L0 (penalty based) extra-time >=20
-   L1 (utilization) extra-time > idle-domain
-  In the same class priorities are assigned as following:
-   EDF: early deadline > late deadline
-   L0 extra-time: lower score > higher score*/
+/* Compares two domains in the relation of whether the one is allowed to
+ * interrupt the others execution.
+ * It returns true (!=3D0) if a switch to the other domain is good.
+ * Current Priority scheme is as follows:
+ *  EDF > L0 (penalty based) extra-time >=20
+ *  L1 (utilization) extra-time > idle-domain
+ * In the same class priorities are assigned as following:
+ *  EDF: early deadline > late deadline
+ *  L0 extra-time: lower score > higher score
+ */
 static inline int should_switch(struct vcpu *cur,
                                 struct vcpu *other,
                                 s_time_t now)
@@ -1063,19 +1011,19 @@ static inline int should_switch(struct v
     cur_inf   =3D EDOM_INFO(cur);
     other_inf =3D EDOM_INFO(other);
 =20
-    /* Check whether we need to make an earlier scheduling decision. */
+    /* Check whether we need to make an earlier scheduling decision */
     if ( PERIOD_BEGIN(other_inf) <=20
          CPU_INFO(other->processor)->current_slice_expires )
         return 1;
=20
-    /* No timing-based switches need to be taken into account here. */
+    /* No timing-based switches need to be taken into account here */
     switch ( get_run_type(cur) )
     {
     case DOMAIN_EDF:
-        /* Do not interrupt a running EDF domain. */
+        /* Do not interrupt a running EDF domain */
         return 0;
     case DOMAIN_EXTRA_PEN:
-        /* Check whether we also want the L0 ex-q with lower score. */
+        /* Check whether we also want the L0 ex-q with lower score */
         return ((other_inf->status & EXTRA_WANT_PEN_Q) &&
                 (other_inf->score[EXTRA_PEN_Q] <=20
                  cur_inf->score[EXTRA_PEN_Q]));
@@ -1096,18 +1044,11 @@ static void sedf_wake(const struct sched
     s_time_t              now =3D NOW();
     struct sedf_vcpu_info* inf =3D EDOM_INFO(d);
=20
-    PRINT(3, "sedf_wake was called, domain-id %i.%i\n",d->domain->domain_i=
d,
-          d->vcpu_id);
-
     if ( unlikely(is_idle_vcpu(d)) )
         return;
   =20
     if ( unlikely(__task_on_queue(d)) )
-    {
-        PRINT(3,"\tdomain %i.%i is already in some queue\n",
-              d->domain->domain_id, d->vcpu_id);
         return;
-    }
=20
     ASSERT(!sedf_runnable(d));
     inf->status &=3D ~SEDF_ASLEEP;
@@ -1116,28 +1057,24 @@ static void sedf_wake(const struct sched
 =20
     if ( unlikely(inf->deadl_abs =3D=3D 0) )
     {
-        /*initial setup of the deadline*/
+        /* Initial setup of the deadline */
         inf->deadl_abs =3D now + inf->slice;
     }
  =20
-    PRINT(3, "waking up domain %i.%i (deadl=3D %"PRIu64" period=3D %"PRIu6=
4
-          "now=3D %"PRIu64")\n",
-          d->domain->domain_id, d->vcpu_id, inf->deadl_abs, inf->period, n=
ow);
-
 #ifdef SEDF_STATS=20
     inf->block_tot++;
 #endif
=20
     if ( unlikely(now < PERIOD_BEGIN(inf)) )
     {
-        PRINT(4,"extratime unblock\n");
-        /* unblocking in extra-time! */
+        /* Unblocking in extra-time! */
         if ( inf->status & EXTRA_WANT_PEN_Q )
         {
-            /*we have a domain that wants compensation
-              for block penalty and did just block in
-              its compensation time. Give it another
-              chance!*/
+            /* We have a domain that wants compensation
+             * for block penalty and did just block in
+             * its compensation time. Give it another
+             * chance!
+             */
             extraq_add_sort_update(d, EXTRA_PEN_Q, 0);
         }
         extraq_check_add_unblocked(d, 0);
@@ -1146,8 +1083,7 @@ static void sedf_wake(const struct sched
     { =20
         if ( now < inf->deadl_abs )
         {
-            PRINT(4,"short unblocking\n");
-            /*short blocking*/
+            /* Short blocking */
 #ifdef SEDF_STATS
             inf->short_block_tot++;
 #endif
@@ -1157,8 +1093,7 @@ static void sedf_wake(const struct sched
         }
         else
         {
-            PRINT(4,"long unblocking\n");
-            /*long unblocking*/
+            /* Long unblocking */
 #ifdef SEDF_STATS
             inf->long_block_tot++;
 #endif
@@ -1168,24 +1103,13 @@ static void sedf_wake(const struct sched
         }
     }
=20
-    PRINT(3, "woke up domain %i.%i (deadl=3D %"PRIu64" period=3D %"PRIu64
-          "now=3D %"PRIu64")\n",
-          d->domain->domain_id, d->vcpu_id, inf->deadl_abs,
-          inf->period, now);
-
     if ( PERIOD_BEGIN(inf) > now )
-    {
         __add_to_waitqueue_sort(d);
-        PRINT(3,"added to waitq\n");
-    }
     else
-    {
         __add_to_runqueue_sort(d);
-        PRINT(3,"added to runq\n");
-    }
 =20
 #ifdef SEDF_STATS
-    /*do some statistics here...*/
+    /* Do some statistics here... */
     if ( inf->block_abs !=3D 0 )
     {
         inf->block_time_tot +=3D now - inf->block_abs;
@@ -1194,12 +1118,13 @@ static void sedf_wake(const struct sched
     }
 #endif
=20
-    /*sanity check: make sure each extra-aware domain IS on the util-q!*/
+    /* Sanity check: make sure each extra-aware domain IS on the util-q! *=
/
     ASSERT(IMPLY(inf->status & EXTRA_AWARE, extraq_on(d, EXTRA_UTIL_Q)));
     ASSERT(__task_on_queue(d));
-    /*check whether the awakened task needs to invoke the do_schedule
-      routine. Try to avoid unnecessary runs but:
-      Save approximation: Always switch to scheduler!*/
+    /* Check whether the awakened task needs to invoke the do_schedule
+     * routine. Try to avoid unnecessary runs but:
+     * Save approximation: Always switch to scheduler!
+     */
     ASSERT(d->processor >=3D 0);
     ASSERT(d->processor < nr_cpu_ids);
     ASSERT(per_cpu(schedule_data, d->processor).curr);
@@ -1244,7 +1169,7 @@ static void sedf_dump_domain(struct vcpu
 }
=20

-/* dumps all domains on the specified cpu */
+/* Dumps all domains on the specified cpu */
 static void sedf_dump_cpu_state(const struct scheduler *ops, int i)
 {
     struct list_head      *list, *queue, *tmp;
@@ -1319,7 +1244,7 @@ static void sedf_dump_cpu_state(const st
 }
=20

-/* Adjusts periods and slices of the domains accordingly to their weights.=
 */
+/* Adjusts periods and slices of the domains accordingly to their weights =
*/
 static int sedf_adjust_weights(struct cpupool *c, struct xen_domctl_schedu=
ler_op *cmd)
 {
     struct vcpu *p;
@@ -1335,7 +1260,7 @@ static int sedf_adjust_weights(struct cp
         return -ENOMEM;
     }
=20
-    /* Sum across all weights. */
+    /* Sum across all weights */
     rcu_read_lock(&domlist_read_lock);
     for_each_domain_in_cpupool( d, c )
     {
@@ -1350,11 +1275,13 @@ static int sedf_adjust_weights(struct cp
             }
             else
             {
-                /*don't modify domains who don't have a weight, but sum
-                  up the time they need, projected to a WEIGHT_PERIOD,
-                  so that this time is not given to the weight-driven
-                  domains*/
-                /*check for overflows*/
+                /* Don't modify domains who don't have a weight, but sum
+                 * up the time they need, projected to a WEIGHT_PERIOD,
+                 * so that this time is not given to the weight-driven
+                 *  domains
+                 */
+
+                /* Check for overflows */
                 ASSERT((WEIGHT_PERIOD < ULONG_MAX)=20
                        && (EDOM_INFO(p)->slice_orig < ULONG_MAX));
                 sumt[cpu] +=3D=20
@@ -1365,7 +1292,7 @@ static int sedf_adjust_weights(struct cp
     }
     rcu_read_unlock(&domlist_read_lock);
=20
-    /* Adjust all slices (and periods) to the new weight. */
+    /* Adjust all slices (and periods) to the new weight */
     rcu_read_lock(&domlist_read_lock);
     for_each_domain_in_cpupool( d, c )
     {
@@ -1393,20 +1320,15 @@ static int sedf_adjust_weights(struct cp
 }
=20

-/* set or fetch domain scheduling parameters */
+/* Set or fetch domain scheduling parameters */
 static int sedf_adjust(const struct scheduler *ops, struct domain *p, stru=
ct xen_domctl_scheduler_op *op)
 {
     struct vcpu *v;
     int rc;
=20
-    PRINT(2,"sedf_adjust was called, domain-id %i new period %"PRIu64" "
-          "new slice %"PRIu64"\nlatency %"PRIu64" extra:%s\n",
-          p->domain_id, op->u.sedf.period, op->u.sedf.slice,
-          op->u.sedf.latency, (op->u.sedf.extratime)?"yes":"no");
-
     if ( op->cmd =3D=3D XEN_DOMCTL_SCHEDOP_putinfo )
     {
-        /* Check for sane parameters. */
+        /* Check for sane parameters */
         if ( !op->u.sedf.period && !op->u.sedf.weight )
             return -EINVAL;
         if ( op->u.sedf.weight )
@@ -1414,7 +1336,7 @@ static int sedf_adjust(const struct sche
             if ( (op->u.sedf.extratime & EXTRA_AWARE) &&
                  (!op->u.sedf.period) )
             {
-                /* Weight-driven domains with extratime only. */
+                /* Weight-driven domains with extratime only */
                 for_each_vcpu ( p, v )
                 {
                     EDOM_INFO(v)->extraweight =3D op->u.sedf.weight;
@@ -1425,7 +1347,7 @@ static int sedf_adjust(const struct sche
             }
             else
             {
-                /* Weight-driven domains with real-time execution. */
+                /* Weight-driven domains with real-time execution */
                 for_each_vcpu ( p, v )
                     EDOM_INFO(v)->weight =3D op->u.sedf.weight;
             }
@@ -1435,8 +1357,7 @@ static int sedf_adjust(const struct sche
             /* Time-driven domains. */
             for_each_vcpu ( p, v )
             {
-                /*
-                 * Sanity checking: note that disabling extra weight requi=
res
+                /* Sanity checking: note that disabling extra weight requi=
res
                  * that we set a non-zero slice.
                  */
                 if ( (op->u.sedf.period > PERIOD_MAX) ||
@@ -1477,7 +1398,6 @@ static int sedf_adjust(const struct sche
         op->u.sedf.weight    =3D EDOM_INFO(p->vcpu[0])->weight;
     }
=20
-    PRINT(2,"sedf_adjust_finished\n");
     return 0;
 }
=20

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
-------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa (Italy)





--=-SQC3wUYrGGqGq8T7E3BQ
Content-Disposition: attachment; filename="sedf-debug-cleanup.patch"
Content-Type: text/x-patch; name="sedf-debug-cleanup.patch"; charset="UTF-8"
Content-Transfer-Encoding: base64

IyBIRyBjaGFuZ2VzZXQgcGF0Y2gNCiMgUGFyZW50IDE3ZDk5NjkxZTBlYzFmYTdiYjcxY2YxOGMx
MmNhM2MwNDZjMGM4ZDcNCnNlZGY6IHJlbW92ZSB1c2VsZXNzIHRyYWNpbmcgcHJpbnRrIGFuZCBo
YXJtb25pemUgY29tbWVudHMgc3R5bGUuDQoNCnNjaGVkX3NlZGYuYyB1c2VkIG8gaGF2ZSBpdHMg
b3duIG1lY2hhbmlzbSBmb3IgcHJvZHVjaW5nIHRyYWNpbmctYWxpa2UNCmtpbmQgb2YgaW5mb3Jt
YXRpb24gKGRvbWFpbiBibG9jaywgd2FrZXVwLCBldGMuKS4gTm93YWRheXMsIHdpdGggYW4gZXZl
bg0Kbm90IHNvIGhpZ2ggbnVtYmVyIG9mIHBDUFVzL3ZDUFVzLCBqdXN0IHRyeWluZyB0byBlbmFi
bGUgdGhpcyBtYWtlcw0KdGhlIHNlcmlhbCBjb25zb2xlIGNvbXBsZXRlbHkgdW51c2FibGUsIHBy
b2R1Y2VzIHRvbnMgb2YgdmVyeSBoYXJkIHRvDQpwYXJzZSBhbmQgaW50ZXJwcmVldCBsb2dnaW5n
IGFuZCBjYW4gZWFzaWx5IGxpdmVsb2NrIERvbTAuIE1vcmVvdmVyLA0KcHJldHR5IG11Y2ggdGhl
IHNhbWUgcmVzdWx0IHRoaXMgaXMgc3RydWdnbGluZyB0byBnZXQgdG8sIGlzIGJldHRlcg0KYWNo
aWV2ZWQgYnkgZW5hYmxpbmcgdGhlIHNjaGVkdWxlci1yZWxhdGVkIHRyYWNpbmcgZXZlbnRzLCBh
cw0KaXQgaXMgZm9yIHRoZSBvdGhlciBzY2hlZHVsZXJzIChzYXksIGNyZWRpdCBvciBjcmVkaXQy
KS4NCg0KRm9yIGFsbCB0aGVzZSByZWFzb25zLCB0aGlzIHJlbW92ZXMgdGhhdCBtYWNoaW5lcnkg
Y29tcGxldGVseS4gV2hpbGUgYXQNCml0LCBjaGVjayBpbiBzb21lIGNvc21ldGljcyB0aGF0IGhh
cm1vbml6ZSB0aGUgY29tbWVudHMgd2l0aGltIHRoZW1zZWxmDQphbmQgd2l0aCB0aGUgcmVzdCBv
ZiB0aGUgY29kZSBiYXNlLg0KDQpTaWduZWQtb2ZmLWJ5OiBEYXJpbyBGYWdnaW9saSA8ZGFyaW8u
ZmFnZ2lvbGlAY2l0cml4LmNvbT4NCg0KZGlmZiAtciAxN2Q5OTY5MWUwZWMgeGVuL2NvbW1vbi9z
Y2hlZF9zZWRmLmMNCi0tLSBhL3hlbi9jb21tb24vc2NoZWRfc2VkZi5jCVR1ZSBEZWMgMjAgMTY6
Mzk6NTYgMjAxMSArMDAwMA0KKysrIGIveGVuL2NvbW1vbi9zY2hlZF9zZWRmLmMJVHVlIERlYyAy
MCAxNzozMjo1MiAyMDExICswMDAwDQpAQCAtMTMsMTQgKzEzLDYgQEANCiAjaW5jbHVkZSA8eGVu
L3RpbWUuaD4NCiAjaW5jbHVkZSA8eGVuL2Vycm5vLmg+DQogDQotLyp2ZXJib3NpdHkgc2V0dGlu
Z3MqLw0KLSNkZWZpbmUgU0VERkxFVkVMIDANCi0jZGVmaW5lIFBSSU5UKF9mLCBfYS4uLikgICAg
ICAgICAgICAgICAgICAgICAgICBcDQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXA0KLSAgICAgICAgaWYgKCAoX2YpIDw9IFNFREZMRVZFTCApICAgICAg
ICAgICAgICAgIFwNCi0gICAgICAgICAgICBwcmludGsoX2EgKTsgICAgICAgICAgICAgICAgICAg
ICAgICBcDQotICAgIH0gd2hpbGUgKCAwICkNCi0NCiAjZGVmaW5lIFNFREZfQ1BVT05MSU5FKF9w
b29sKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICAg
KCgoX3Bvb2wpID09IE5VTEwpID8gJmNwdXBvb2xfZnJlZV9jcHVzIDogKF9wb29sKS0+Y3B1X3Zh
bGlkKQ0KIA0KQEAgLTY2LDM0ICs1OCwzNSBAQCBzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8gew0KICAg
ICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7DQogICAgIHN0cnVjdCBsaXN0X2hlYWQgZXh0cmFsaXN0
WzJdOw0KICANCi0gICAgLypQYXJhbWV0ZXJzIGZvciBFREYqLw0KLSAgICBzX3RpbWVfdCAgcGVy
aW9kOyAgLyo9KHJlbGF0aXZlIGRlYWRsaW5lKSovDQotICAgIHNfdGltZV90ICBzbGljZTsgIC8q
PXdvcnN0IGNhc2UgZXhlY3V0aW9uIHRpbWUqLw0KKyAgICAvKiBQYXJhbWV0ZXJzIGZvciBFREYg
Ki8NCisgICAgc190aW1lX3QgIHBlcmlvZDsgIC8qID0ocmVsYXRpdmUgZGVhZGxpbmUpICovDQor
ICAgIHNfdGltZV90ICBzbGljZTsgICAvKiA9d29yc3QgY2FzZSBleGVjdXRpb24gdGltZSAqLw0K
ICANCi0gICAgLypBZHZhY2VkIFBhcmFtZXRlcnMqLw0KLSAgICAvKkxhdGVuY3kgU2NhbGluZyov
DQorICAgIC8qIEFkdmFjZWQgUGFyYW1ldGVycyAqLw0KKw0KKyAgICAvKiBMYXRlbmN5IFNjYWxp
bmcgKi8NCiAgICAgc190aW1lX3QgIHBlcmlvZF9vcmlnOw0KICAgICBzX3RpbWVfdCAgc2xpY2Vf
b3JpZzsNCiAgICAgc190aW1lX3QgIGxhdGVuY3k7DQogIA0KLSAgICAvKnN0YXR1cyBvZiBkb21h
aW4qLw0KKyAgICAvKiBTdGF0dXMgb2YgZG9tYWluICovDQogICAgIGludCAgICAgICBzdGF0dXM7
DQotICAgIC8qd2VpZ2h0cyBmb3IgIlNjaGVkdWxpbmcgZm9yIGJlZ2lubmVycy8gbGF6eS8gZXRj
LiIgOykqLw0KKyAgICAvKiBXZWlnaHRzIGZvciAiU2NoZWR1bGluZyBmb3IgYmVnaW5uZXJzLyBs
YXp5LyBldGMuIiA7KSAqLw0KICAgICBzaG9ydCAgICAgd2VpZ2h0Ow0KICAgICBzaG9ydCAgICAg
ZXh0cmF3ZWlnaHQ7DQotICAgIC8qQm9va2tlZXBpbmcqLw0KKyAgICAvKiBCb29ra2VlcGluZyAq
Lw0KICAgICBzX3RpbWVfdCAgZGVhZGxfYWJzOw0KICAgICBzX3RpbWVfdCAgc2NoZWRfc3RhcnRf
YWJzOw0KICAgICBzX3RpbWVfdCAgY3B1dGltZTsNCi0gICAgLyogdGltZXMgdGhlIGRvbWFpbiB1
bi0vYmxvY2tlZCAqLw0KKyAgICAvKiBUaW1lcyB0aGUgZG9tYWluIHVuLS9ibG9ja2VkICovDQog
ICAgIHNfdGltZV90ICBibG9ja19hYnM7DQogICAgIHNfdGltZV90ICB1bmJsb2NrX2FiczsNCiAg
DQotICAgIC8qc2NvcmVzIGZvciB7dXRpbCwgYmxvY2sgcGVuYWx0eX0td2VpZ2h0ZWQgZXh0cmF0
aW1lIGRpc3RyaWJ1dGlvbiovDQorICAgIC8qIFNjb3JlcyBmb3Ige3V0aWwsIGJsb2NrIHBlbmFs
dHl9LXdlaWdodGVkIGV4dHJhdGltZSBkaXN0cmlidXRpb24gKi8NCiAgICAgaW50ICAgc2NvcmVb
Ml07DQogICAgIHNfdGltZV90ICBzaG9ydF9ibG9ja19sb3N0X3RvdDsNCiAgDQotICAgIC8qU3Rh
dGlzdGljcyovDQorICAgIC8qIFN0YXRpc3RpY3MgKi8NCiAgICAgc190aW1lX3QgIGV4dHJhX3Rp
bWVfdG90Ow0KIA0KICNpZmRlZiBTRURGX1NUQVRTDQpAQCAtMTU4LDE4ICsxNTEsMTYgQEAgc3Rh
dGljIGlubGluZSB2b2lkIGV4dHJhcV9kZWwoc3RydWN0IHZjcA0KIHsNCiAgICAgc3RydWN0IGxp
c3RfaGVhZCAqbGlzdCA9IEVYVFJBTElTVChkLGkpOw0KICAgICBBU1NFUlQoZXh0cmFxX29uKGQs
aSkpOw0KLSAgICBQUklOVCgzLCAiUmVtb3ZpbmcgZG9tYWluICVpLiVpIGZyb20gTCVpIGV4dHJh
cVxuIiwNCi0gICAgICAgICAgZC0+ZG9tYWluLT5kb21haW5faWQsIGQtPnZjcHVfaWQsIGkpOw0K
ICAgICBsaXN0X2RlbChsaXN0KTsNCiAgICAgbGlzdC0+bmV4dCA9IE5VTEw7DQogICAgIEFTU0VS
VCghZXh0cmFxX29uKGQsIGkpKTsNCiB9DQogDQotLyogYWRkcyBhIGRvbWFpbiB0byB0aGUgcXVl
dWUgb2YgcHJvY2Vzc2VzIHdoaWNoIGFyZSBhd2FyZSBvZiBleHRyYSB0aW1lLiBMaXN0DQotICAg
aXMgc29ydGVkIGJ5IHNjb3JlLCB3aGVyZSBhIGxvd2VyIHNjb3JlIG1lYW5zIGhpZ2hlciBwcmlv
cml0eSBmb3IgYW4gZXh0cmENCi0gICBzbGljZS4gSXQgYWxzbyB1cGRhdGVzIHRoZSBzY29yZSwg
Ynkgc2ltcGx5IHN1YnRyYWN0aW5nIGEgZml4ZWQgdmFsdWUgZnJvbQ0KLSAgIGVhY2ggZW50cnks
IGluIG9yZGVyIHRvIGF2b2lkIG92ZXJmbG93LiBUaGUgYWxnb3JpdGhtIHdvcmtzIGJ5IHNpbXBs
eQ0KLSAgIGNoYXJnaW5nIGVhY2ggZG9tYWluIHRoYXQgcmVjaWV2ZWQgZXh0cmF0aW1lIHdpdGgg
YW4gaW52ZXJzZSBvZiBpdHMgd2VpZ2h0Lg0KKy8qIEFkZHMgYSBkb21haW4gdG8gdGhlIHF1ZXVl
IG9mIHByb2Nlc3NlcyB3aGljaCBhcmUgYXdhcmUgb2YgZXh0cmEgdGltZS4gTGlzdA0KKyAqIGlz
IHNvcnRlZCBieSBzY29yZSwgd2hlcmUgYSBsb3dlciBzY29yZSBtZWFucyBoaWdoZXIgcHJpb3Jp
dHkgZm9yIGFuIGV4dHJhDQorICogc2xpY2UuIEl0IGFsc28gdXBkYXRlcyB0aGUgc2NvcmUsIGJ5
IHNpbXBseSBzdWJ0cmFjdGluZyBhIGZpeGVkIHZhbHVlIGZyb20NCisgKiBlYWNoIGVudHJ5LCBp
biBvcmRlciB0byBhdm9pZCBvdmVyZmxvdy4gVGhlIGFsZ29yaXRobSB3b3JrcyBieSBzaW1wbHkN
CisgKiBjaGFyZ2luZyBlYWNoIGRvbWFpbiB0aGF0IHJlY2lldmVkIGV4dHJhdGltZSB3aXRoIGFu
IGludmVyc2Ugb2YgaXRzIHdlaWdodC4NCiAgKi8gDQogc3RhdGljIGlubGluZSB2b2lkIGV4dHJh
cV9hZGRfc29ydF91cGRhdGUoc3RydWN0IHZjcHUgKmQsIGludCBpLCBpbnQgc3ViKQ0KIHsNCkBA
IC0xNzgsMTMgKzE2OSw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBleHRyYXFfYWRkX3NvcnRfdXBk
YXQNCiAgDQogICAgIEFTU0VSVCghZXh0cmFxX29uKGQsaSkpOw0KIA0KLSAgICBQUklOVCgzLCAi
QWRkaW5nIGRvbWFpbiAlaS4laSAoc2NvcmU9ICVpLCBzaG9ydF9wZW49ICUiUFJJaTY0IikiDQot
ICAgICAgICAgICIgdG8gTCVpIGV4dHJhcVxuIiwNCi0gICAgICAgICAgZC0+ZG9tYWluLT5kb21h
aW5faWQsIGQtPnZjcHVfaWQsIEVET01fSU5GTyhkKS0+c2NvcmVbaV0sDQotICAgICAgICAgIEVE
T01fSU5GTyhkKS0+c2hvcnRfYmxvY2tfbG9zdF90b3QsIGkpOw0KLQ0KLSAgICAvKg0KLSAgICAg
KiBJdGVyYXRlIHRocm91Z2ggYWxsIGVsZW1lbnRzIHRvIGZpbmQgb3VyICJob2xlIiBhbmQgb24g
b3VyIHdheQ0KKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggYWxsIGVsZW1lbnRzIHRvIGZpbmQgb3Vy
ICJob2xlIiBhbmQgb24gb3VyIHdheQ0KICAgICAgKiB1cGRhdGUgYWxsIHRoZSBvdGhlciBzY29y
ZXMuDQogICAgICAqLw0KICAgICBsaXN0X2Zvcl9lYWNoICggY3VyLCBFWFRSQVEoZC0+cHJvY2Vz
c29yLCBpKSApDQpAQCAtMTkzLDI1ICsxNzgsMTggQEAgc3RhdGljIGlubGluZSB2b2lkIGV4dHJh
cV9hZGRfc29ydF91cGRhdA0KICAgICAgICAgY3VyaW5mLT5zY29yZVtpXSAtPSBzdWI7DQogICAg
ICAgICBpZiAoIEVET01fSU5GTyhkKS0+c2NvcmVbaV0gPCBjdXJpbmYtPnNjb3JlW2ldICkNCiAg
ICAgICAgICAgICBicmVhazsNCi0gICAgICAgIFBSSU5UKDQsIlx0YmVoaW5kIGRvbWFpbiAlaS4l
aSAoc2NvcmU9ICVpKVxuIiwNCi0gICAgICAgICAgICAgIGN1cmluZi0+dmNwdS0+ZG9tYWluLT5k
b21haW5faWQsDQotICAgICAgICAgICAgICBjdXJpbmYtPnZjcHUtPnZjcHVfaWQsIGN1cmluZi0+
c2NvcmVbaV0pOw0KICAgICB9DQogDQotICAgIC8qIGN1ciBub3cgY29udGFpbnMgdGhlIGVsZW1l
bnQsIGJlZm9yZSB3aGljaCB3ZSdsbCBlbnF1ZXVlLiAqLw0KLSAgICBQUklOVCgzLCAiXHRsaXN0
X2FkZCB0byAlcFxuIiwgY3VyLT5wcmV2KTsNCisgICAgLyogY3VyIG5vdyBjb250YWlucyB0aGUg
ZWxlbWVudCwgYmVmb3JlIHdoaWNoIHdlJ2xsIGVucXVldWUgKi8NCiAgICAgbGlzdF9hZGQoRVhU
UkFMSVNUKGQsaSksY3VyLT5wcmV2KTsNCiAgDQotICAgIC8qIENvbnRpbnVlIHVwZGF0aW5nIHRo
ZSBleHRyYXEuICovDQorICAgIC8qIENvbnRpbnVlIHVwZGF0aW5nIHRoZSBleHRyYXEgKi8NCiAg
ICAgaWYgKCAoY3VyICE9IEVYVFJBUShkLT5wcm9jZXNzb3IsaSkpICYmIHN1YiApDQogICAgIHsN
CiAgICAgICAgIGZvciAoIGN1ciA9IGN1ci0+bmV4dDsgY3VyICE9IEVYVFJBUShkLT5wcm9jZXNz
b3IsaSk7IGN1ciA9IGN1ci0+bmV4dCApDQogICAgICAgICB7DQogICAgICAgICAgICAgY3VyaW5m
ID0gbGlzdF9lbnRyeShjdXIsc3RydWN0IHNlZGZfdmNwdV9pbmZvLCBleHRyYWxpc3RbaV0pOw0K
ICAgICAgICAgICAgIGN1cmluZi0+c2NvcmVbaV0gLT0gc3ViOw0KLSAgICAgICAgICAgIFBSSU5U
KDQsICJcdHVwZGF0aW5nIGRvbWFpbiAlaS4laSAoc2NvcmU9ICV1KVxuIiwNCi0gICAgICAgICAg
ICAgICAgICBjdXJpbmYtPnZjcHUtPmRvbWFpbi0+ZG9tYWluX2lkLCANCi0gICAgICAgICAgICAg
ICAgICBjdXJpbmYtPnZjcHUtPnZjcHVfaWQsIGN1cmluZi0+c2NvcmVbaV0pOw0KICAgICAgICAg
fQ0KICAgICB9DQogDQpAQCAtMjIxLDI5ICsxOTksMTQgQEAgc3RhdGljIGlubGluZSB2b2lkIGV4
dHJhcV9jaGVjayhzdHJ1Y3Qgdg0KIHsNCiAgICAgaWYgKCBleHRyYXFfb24oZCwgRVhUUkFfVVRJ
TF9RKSApDQogICAgIHsNCi0gICAgICAgIFBSSU5UKDIsIkRvbSAlaS4laSBpcyBvbiBMMSBleHRy
YVFcbiIsDQotICAgICAgICAgICAgICBkLT5kb21haW4tPmRvbWFpbl9pZCwgZC0+dmNwdV9pZCk7
DQotDQogICAgICAgICBpZiAoICEoRURPTV9JTkZPKGQpLT5zdGF0dXMgJiBFWFRSQV9BV0FSRSkg
JiYNCiAgICAgICAgICAgICAgIWV4dHJhX3J1bnMoRURPTV9JTkZPKGQpKSApDQotICAgICAgICB7
DQogICAgICAgICAgICAgZXh0cmFxX2RlbChkLCBFWFRSQV9VVElMX1EpOw0KLSAgICAgICAgICAg
IFBSSU5UKDIsIlJlbW92ZWQgZG9tICVpLiVpIGZyb20gTDEgZXh0cmFRXG4iLA0KLSAgICAgICAg
ICAgICAgICAgIGQtPmRvbWFpbi0+ZG9tYWluX2lkLCBkLT52Y3B1X2lkKTsNCi0gICAgICAgIH0N
CiAgICAgfQ0KICAgICBlbHNlDQogICAgIHsNCi0gICAgICAgIFBSSU5UKDIsICJEb20gJWkuJWkg
aXMgTk9UIG9uIEwxIGV4dHJhUVxuIiwNCi0gICAgICAgICAgICAgIGQtPmRvbWFpbi0+ZG9tYWlu
X2lkLA0KLSAgICAgICAgICAgICAgZC0+dmNwdV9pZCk7DQotDQogICAgICAgICBpZiAoIChFRE9N
X0lORk8oZCktPnN0YXR1cyAmIEVYVFJBX0FXQVJFKSAmJiBzZWRmX3J1bm5hYmxlKGQpICkNCi0g
ICAgICAgIHsNCiAgICAgICAgICAgICBleHRyYXFfYWRkX3NvcnRfdXBkYXRlKGQsIEVYVFJBX1VU
SUxfUSwgMCk7DQotICAgICAgICAgICAgUFJJTlQoMiwiQWRkZWQgZG9tICVpLiVpIHRvIEwxIGV4
dHJhUVxuIiwNCi0gICAgICAgICAgICAgICAgICBkLT5kb21haW4tPmRvbWFpbl9pZCwgZC0+dmNw
dV9pZCk7DQotICAgICAgICB9DQogICAgIH0NCiB9DQogDQpAQCAtMjUyLDcgKzIxNSw3IEBAIHN0
YXRpYyBpbmxpbmUgdm9pZCBleHRyYXFfY2hlY2tfYWRkX3VuYmwNCiAgICAgc3RydWN0IHNlZGZf
dmNwdV9pbmZvICppbmYgPSBFRE9NX0lORk8oZCk7DQogDQogICAgIGlmICggaW5mLT5zdGF0dXMg
JiBFWFRSQV9BV0FSRSApDQotICAgICAgICAvKiBQdXQgb24gdGhlIHdlaWdodGVkIGV4dHJhcSB3
aXRob3V0IHVwZGF0aW5nIGFueSBzY29yZXMuICovDQorICAgICAgICAvKiBQdXQgb24gdGhlIHdl
aWdodGVkIGV4dHJhcSB3aXRob3V0IHVwZGF0aW5nIGFueSBzY29yZXMgKi8NCiAgICAgICAgIGV4
dHJhcV9hZGRfc29ydF91cGRhdGUoZCwgRVhUUkFfVVRJTF9RLCAwKTsNCiB9DQogDQpAQCAtMjY1
LDggKzIyOCw2IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2RlbF9mcm9tX3F1ZXVlKHN0cnUNCiB7
DQogICAgIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSBMSVNUKGQpOw0KICAgICBBU1NFUlQoX190
YXNrX29uX3F1ZXVlKGQpKTsNCi0gICAgUFJJTlQoMywiUmVtb3ZpbmcgZG9tYWluICVpLiVpIChi
b3A9ICUiUFJJdTY0IikgZnJvbSBydW5xL3dhaXRxXG4iLA0KLSAgICAgICAgICBkLT5kb21haW4t
PmRvbWFpbl9pZCwgZC0+dmNwdV9pZCwgUEVSSU9EX0JFR0lOKEVET01fSU5GTyhkKSkpOw0KICAg
ICBsaXN0X2RlbChsaXN0KTsNCiAgICAgbGlzdC0+bmV4dCA9IE5VTEw7DQogICAgIEFTU0VSVCgh
X190YXNrX29uX3F1ZXVlKGQpKTsNCkBAIC0yNzksMTMgKzI0MCwxMiBAQCBzdGF0aWMgaW5saW5l
IHZvaWQgbGlzdF9pbnNlcnRfc29ydCgNCiB7DQogICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgICpj
dXI7DQogDQotICAgIC8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgZWxlbWVudHMgdG8gZmluZCBvdXIg
ImhvbGUiLiAqLw0KKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggYWxsIGVsZW1lbnRzIHRvIGZpbmQg
b3VyICJob2xlIiAqLw0KICAgICBsaXN0X2Zvcl9lYWNoKCBjdXIsIGxpc3QgKQ0KICAgICAgICAg
aWYgKCBjb21wKGVsZW1lbnQsIGN1cikgPCAwICkNCiAgICAgICAgICAgICBicmVhazsNCiANCi0g
ICAgLyogY3VyIG5vdyBjb250YWlucyB0aGUgZWxlbWVudCwgYmVmb3JlIHdoaWNoIHdlJ2xsIGVu
cXVldWUuICovDQotICAgIFBSSU5UKDMsIlx0bGlzdF9hZGQgdG8gJXBcbiIsY3VyLT5wcmV2KTsN
CisgICAgLyogY3VyIG5vdyBjb250YWlucyB0aGUgZWxlbWVudCwgYmVmb3JlIHdoaWNoIHdlJ2xs
IGVucXVldWUgKi8NCiAgICAgbGlzdF9hZGQoZWxlbWVudCwgY3VyLT5wcmV2KTsNCiB9DQogDQpA
QCAtMzAzLDMwICsyNjMsMjYgQEAgc3RhdGljIGludCBuYW1lIyNfY29tcChzdHJ1Y3QgbGlzdF9o
ZWFkKg0KICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwNCiB9DQogDQotLyogYWRkcyBhIGRvbWFpbiB0byB0aGUg
cXVldWUgb2YgcHJvY2Vzc2VzIHdoaWNoIHdhaXQgZm9yIHRoZSBiZWdpbm5pbmcgb2YgdGhlDQot
ICAgbmV4dCBwZXJpb2Q7IHRoaXMgbGlzdCBpcyB0aGVyZWZvcmUgc29ydGV0IGJ5IHRoaXMgdGlt
ZSwgd2hpY2ggaXMgc2ltcGx5DQotICAgYWJzb2wuIGRlYWRsaW5lIC0gcGVyaW9kDQorLyogQWRk
cyBhIGRvbWFpbiB0byB0aGUgcXVldWUgb2YgcHJvY2Vzc2VzIHdoaWNoIHdhaXQgZm9yIHRoZSBi
ZWdpbm5pbmcgb2YgdGhlDQorICogbmV4dCBwZXJpb2Q7IHRoaXMgbGlzdCBpcyB0aGVyZWZvcmUg
c29ydGV0IGJ5IHRoaXMgdGltZSwgd2hpY2ggaXMgc2ltcGx5DQorICogYWJzb2wuIGRlYWRsaW5l
IC0gcGVyaW9kLg0KICAqLyANCiBET01BSU5fQ09NUEFSRVIod2FpdHEsIGxpc3QsIFBFUklPRF9C
RUdJTihkMSksIFBFUklPRF9CRUdJTihkMikpOw0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2FkZF90
b193YWl0cXVldWVfc29ydChzdHJ1Y3QgdmNwdSAqdikNCiB7DQogICAgIEFTU0VSVCghX190YXNr
X29uX3F1ZXVlKHYpKTsNCi0gICAgUFJJTlQoMywiQWRkaW5nIGRvbWFpbiAlaS4laSAoYm9wPSAl
IlBSSXU2NCIpIHRvIHdhaXRxXG4iLA0KLSAgICAgICAgICB2LT5kb21haW4tPmRvbWFpbl9pZCwg
di0+dmNwdV9pZCwgUEVSSU9EX0JFR0lOKEVET01fSU5GTyh2KSkpOw0KICAgICBsaXN0X2luc2Vy
dF9zb3J0KFdBSVRRKHYtPnByb2Nlc3NvciksIExJU1QodiksIHdhaXRxX2NvbXApOw0KICAgICBB
U1NFUlQoX190YXNrX29uX3F1ZXVlKHYpKTsNCiB9DQogDQotLyogYWRkcyBhIGRvbWFpbiB0byB0
aGUgcXVldWUgb2YgcHJvY2Vzc2VzIHdoaWNoIGhhdmUgc3RhcnRlZCB0aGVpciBjdXJyZW50DQot
ICAgcGVyaW9kIGFuZCBhcmUgcnVubmFibGUgKGkuZS4gbm90IGJsb2NrZWQsIGRpZWluZywuLi4p
LiBUaGUgZmlyc3QgZWxlbWVudA0KLSAgIG9uIHRoaXMgbGlzdCBpcyBydW5uaW5nIG9uIHRoZSBw
cm9jZXNzb3IsIGlmIHRoZSBsaXN0IGlzIGVtcHR5IHRoZSBpZGxlDQotICAgdGFzayB3aWxsIHJ1
bi4gQXMgd2UgYXJlIGltcGxlbWVudGluZyBFREYsIHRoaXMgbGlzdCBpcyBzb3J0ZWQgYnkgZGVh
ZGxpbmVzLg0KKy8qIEFkZHMgYSBkb21haW4gdG8gdGhlIHF1ZXVlIG9mIHByb2Nlc3NlcyB3aGlj
aCBoYXZlIHN0YXJ0ZWQgdGhlaXIgY3VycmVudA0KKyAqIHBlcmlvZCBhbmQgYXJlIHJ1bm5hYmxl
IChpLmUuIG5vdCBibG9ja2VkLCBkaWVpbmcsLi4uKS4gVGhlIGZpcnN0IGVsZW1lbnQNCisgKiBv
biB0aGlzIGxpc3QgaXMgcnVubmluZyBvbiB0aGUgcHJvY2Vzc29yLCBpZiB0aGUgbGlzdCBpcyBl
bXB0eSB0aGUgaWRsZQ0KKyAqIHRhc2sgd2lsbCBydW4uIEFzIHdlIGFyZSBpbXBsZW1lbnRpbmcg
RURGLCB0aGlzIGxpc3QgaXMgc29ydGVkIGJ5IGRlYWRsaW5lcy4NCiAgKi8gDQogRE9NQUlOX0NP
TVBBUkVSKHJ1bnEsIGxpc3QsIGQxLT5kZWFkbF9hYnMsIGQyLT5kZWFkbF9hYnMpOw0KIHN0YXRp
YyBpbmxpbmUgdm9pZCBfX2FkZF90b19ydW5xdWV1ZV9zb3J0KHN0cnVjdCB2Y3B1ICp2KQ0KIHsN
Ci0gICAgUFJJTlQoMywiQWRkaW5nIGRvbWFpbiAlaS4laSAoZGVhZGw9ICUiUFJJdTY0IikgdG8g
cnVucVxuIiwNCi0gICAgICAgICAgdi0+ZG9tYWluLT5kb21haW5faWQsIHYtPnZjcHVfaWQsIEVE
T01fSU5GTyh2KS0+ZGVhZGxfYWJzKTsNCiAgICAgbGlzdF9pbnNlcnRfc29ydChSVU5RKHYtPnBy
b2Nlc3NvciksIExJU1QodiksIHJ1bnFfY29tcCk7DQogfQ0KIA0KQEAgLTQ0NSwyMiArNDAxLDIx
IEBAIHN0YXRpYyBpbnQgc2VkZl9waWNrX2NwdShjb25zdCBzdHJ1Y3Qgc2MNCiAgICAgcmV0dXJu
IGNwdW1hc2tfZmlyc3QoJm9ubGluZV9hZmZpbml0eSk7DQogfQ0KIA0KLS8qDQotICogSGFuZGxl
cyB0aGUgcmVzY2hlZHVsaW5nICYgYm9va2tlZXBpbmcgb2YgZG9tYWlucyBydW5uaW5nIGluIHRo
ZWlyDQorDQorLyogSGFuZGxlcyB0aGUgcmVzY2hlZHVsaW5nICYgYm9va2tlZXBpbmcgb2YgZG9t
YWlucyBydW5uaW5nIGluIHRoZWlyDQogICogZ3VhcmFudGVlZCB0aW1lc2xpY2UuDQogICovDQog
c3RhdGljIHZvaWQgZGVzY2hlZF9lZGZfZG9tKHNfdGltZV90IG5vdywgc3RydWN0IHZjcHUqIGQp
DQogew0KICAgICBzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8qIGluZiA9IEVET01fSU5GTyhkKTsNCiAN
Ci0gICAgLyogQ3VycmVudCBkb21haW4gaXMgcnVubmluZyBpbiByZWFsIHRpbWUgbW9kZS4gKi8N
CisgICAgLyogQ3VycmVudCBkb21haW4gaXMgcnVubmluZyBpbiByZWFsIHRpbWUgbW9kZSAqLw0K
ICAgICBBU1NFUlQoX190YXNrX29uX3F1ZXVlKGQpKTsNCiANCi0gICAgLyogVXBkYXRlIHRoZSBk
b21haW4ncyBjcHV0aW1lLiAqLw0KKyAgICAvKiBVcGRhdGUgdGhlIGRvbWFpbidzIGNwdXRpbWUg
Ki8NCiAgICAgaW5mLT5jcHV0aW1lICs9IG5vdyAtIGluZi0+c2NoZWRfc3RhcnRfYWJzOw0KIA0K
LSAgICAvKg0KLSAgICAgKiBTY2hlZHVsaW5nIGRlY2lzaW9ucyB3aGljaCBkb24ndCByZW1vdmUg
dGhlIHJ1bm5pbmcgZG9tYWluIGZyb20gdGhlDQorICAgIC8qIFNjaGVkdWxpbmcgZGVjaXNpb25z
IHdoaWNoIGRvbid0IHJlbW92ZSB0aGUgcnVubmluZyBkb21haW4gZnJvbSB0aGUNCiAgICAgICog
cnVucS4gDQogICAgICAqLw0KICAgICBpZiAoIChpbmYtPmNwdXRpbWUgPCBpbmYtPnNsaWNlKSAm
JiBzZWRmX3J1bm5hYmxlKGQpICkNCkBAIC00NjgsOCArNDIzLDcgQEAgc3RhdGljIHZvaWQgZGVz
Y2hlZF9lZGZfZG9tKHNfdGltZV90IG5vdw0KICAgDQogICAgIF9fZGVsX2Zyb21fcXVldWUoZCk7
DQogICANCi0gICAgLyoNCi0gICAgICogTWFuYWdlIGJvb2trZWVwaW5nIChpLmUuIGNhbGN1bGF0
ZSBuZXh0IGRlYWRsaW5lLCBtZW1vcmlzZQ0KKyAgICAvKiBNYW5hZ2UgYm9va2tlZXBpbmcgKGku
ZS4gY2FsY3VsYXRlIG5leHQgZGVhZGxpbmUsIG1lbW9yaXNlDQogICAgICAqIG92ZXJydW4tdGlt
ZSBvZiBzbGljZSkgb2YgZmluaXNoZWQgZG9tYWlucy4NCiAgICAgICovDQogICAgIGlmICggaW5m
LT5jcHV0aW1lID49IGluZi0+c2xpY2UgKQ0KQEAgLTQ3OCwzMCArNDMyLDMwIEBAIHN0YXRpYyB2
b2lkIGRlc2NoZWRfZWRmX2RvbShzX3RpbWVfdCBub3cNCiAgIA0KICAgICAgICAgaWYgKCBpbmYt
PnBlcmlvZCA8IGluZi0+cGVyaW9kX29yaWcgKQ0KICAgICAgICAgew0KLSAgICAgICAgICAgIC8q
IFRoaXMgZG9tYWluIHJ1bnMgaW4gbGF0ZW5jeSBzY2FsaW5nIG9yIGJ1cnN0IG1vZGUuICovDQor
ICAgICAgICAgICAgLyogVGhpcyBkb21haW4gcnVucyBpbiBsYXRlbmN5IHNjYWxpbmcgb3IgYnVy
c3QgbW9kZSAqLw0KICAgICAgICAgICAgIGluZi0+cGVyaW9kICo9IDI7DQogICAgICAgICAgICAg
aW5mLT5zbGljZSAgKj0gMjsNCiAgICAgICAgICAgICBpZiAoIChpbmYtPnBlcmlvZCA+IGluZi0+
cGVyaW9kX29yaWcpIHx8DQogICAgICAgICAgICAgICAgICAoaW5mLT5zbGljZSA+IGluZi0+c2xp
Y2Vfb3JpZykgKQ0KICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLyogUmVzZXQgc2xp
Y2UgYW5kIHBlcmlvZC4gKi8NCisgICAgICAgICAgICAgICAgLyogUmVzZXQgc2xpY2UgYW5kIHBl
cmlvZCAqLw0KICAgICAgICAgICAgICAgICBpbmYtPnBlcmlvZCA9IGluZi0+cGVyaW9kX29yaWc7
DQogICAgICAgICAgICAgICAgIGluZi0+c2xpY2UgPSBpbmYtPnNsaWNlX29yaWc7DQogICAgICAg
ICAgICAgfQ0KICAgICAgICAgfQ0KIA0KLSAgICAgICAgLyogU2V0IG5leHQgZGVhZGxpbmUuICov
DQorICAgICAgICAvKiBTZXQgbmV4dCBkZWFkbGluZSAqLw0KICAgICAgICAgaW5mLT5kZWFkbF9h
YnMgKz0gaW5mLT5wZXJpb2Q7DQogICAgIH0NCiAgDQotICAgIC8qIEFkZCBhIHJ1bm5hYmxlIGRv
bWFpbiB0byB0aGUgd2FpdHF1ZXVlLiAqLw0KKyAgICAvKiBBZGQgYSBydW5uYWJsZSBkb21haW4g
dG8gdGhlIHdhaXRxdWV1ZSAqLw0KICAgICBpZiAoIHNlZGZfcnVubmFibGUoZCkgKQ0KICAgICB7
DQogICAgICAgICBfX2FkZF90b193YWl0cXVldWVfc29ydChkKTsNCiAgICAgfQ0KICAgICBlbHNl
DQogICAgIHsNCi0gICAgICAgIC8qIFdlIGhhdmUgYSBibG9ja2VkIHJlYWx0aW1lIHRhc2sgLT4g
cmVtb3ZlIGl0IGZyb20gZXhxcyB0b28uICovDQorICAgICAgICAvKiBXZSBoYXZlIGEgYmxvY2tl
ZCByZWFsdGltZSB0YXNrIC0+IHJlbW92ZSBpdCBmcm9tIGV4cXMgdG9vICovDQogICAgICAgICBp
ZiAoIGV4dHJhcV9vbihkLCBFWFRSQV9QRU5fUSkgKQ0KICAgICAgICAgICAgIGV4dHJhcV9kZWwo
ZCwgRVhUUkFfUEVOX1EpOw0KICAgICAgICAgaWYgKCBleHRyYXFfb24oZCwgRVhUUkFfVVRJTF9R
KSApDQpAQCAtNTIxLDczICs0NzUsNTkgQEAgc3RhdGljIHZvaWQgdXBkYXRlX3F1ZXVlcygNCiAg
ICAgc3RydWN0IGxpc3RfaGVhZCAgICAgKmN1ciwgKnRtcDsNCiAgICAgc3RydWN0IHNlZGZfdmNw
dV9pbmZvICpjdXJpbmY7DQogIA0KLSAgICBQUklOVCgzLCJVcGRhdGluZyB3YWl0cS4uXG4iKTsN
Ci0NCi0gICAgLyoNCi0gICAgICogQ2hlY2sgZm9yIHRoZSBmaXJzdCBlbGVtZW50cyBvZiB0aGUg
d2FpdHF1ZXVlLCB3aGV0aGVyIHRoZWlyDQorICAgIC8qIENoZWNrIGZvciB0aGUgZmlyc3QgZWxl
bWVudHMgb2YgdGhlIHdhaXRxdWV1ZSwgd2hldGhlciB0aGVpcg0KICAgICAgKiBuZXh0IHBlcmlv
ZCBoYXMgYWxyZWFkeSBzdGFydGVkLg0KICAgICAgKi8NCiAgICAgbGlzdF9mb3JfZWFjaF9zYWZl
ICggY3VyLCB0bXAsIHdhaXRxICkNCiAgICAgew0KICAgICAgICAgY3VyaW5mID0gbGlzdF9lbnRy
eShjdXIsIHN0cnVjdCBzZWRmX3ZjcHVfaW5mbywgbGlzdCk7DQotICAgICAgICBQUklOVCg0LCJc
dExvb2tpbmcgQCBkb20gJWkuJWlcbiIsDQotICAgICAgICAgICAgICBjdXJpbmYtPnZjcHUtPmRv
bWFpbi0+ZG9tYWluX2lkLCBjdXJpbmYtPnZjcHUtPnZjcHVfaWQpOw0KICAgICAgICAgaWYgKCBQ
RVJJT0RfQkVHSU4oY3VyaW5mKSA+IG5vdyApDQogICAgICAgICAgICAgYnJlYWs7DQogICAgICAg
ICBfX2RlbF9mcm9tX3F1ZXVlKGN1cmluZi0+dmNwdSk7DQogICAgICAgICBfX2FkZF90b19ydW5x
dWV1ZV9zb3J0KGN1cmluZi0+dmNwdSk7DQogICAgIH0NCiAgDQotICAgIFBSSU5UKDMsIlVwZGF0
aW5nIHJ1bnEuLlxuIik7DQotDQotICAgIC8qIFByb2Nlc3MgdGhlIHJ1bnEsIGZpbmQgZG9tYWlu
cyB0aGF0IGFyZSBvbiB0aGUgcnVucSB0aGF0IHNob3VsZG4ndC4gKi8NCisgICAgLyogUHJvY2Vz
cyB0aGUgcnVucSwgZmluZCBkb21haW5zIHRoYXQgYXJlIG9uIHRoZSBydW5xIHRoYXQgc2hvdWxk
bid0ICovDQogICAgIGxpc3RfZm9yX2VhY2hfc2FmZSAoIGN1ciwgdG1wLCBydW5xICkNCiAgICAg
ew0KICAgICAgICAgY3VyaW5mID0gbGlzdF9lbnRyeShjdXIsc3RydWN0IHNlZGZfdmNwdV9pbmZv
LGxpc3QpOw0KLSAgICAgICAgUFJJTlQoNCwiXHRMb29raW5nIEAgZG9tICVpLiVpXG4iLA0KLSAg
ICAgICAgICAgICAgY3VyaW5mLT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZCwgY3VyaW5mLT52Y3B1
LT52Y3B1X2lkKTsNCiANCiAgICAgICAgIGlmICggdW5saWtlbHkoY3VyaW5mLT5zbGljZSA9PSAw
KSApDQogICAgICAgICB7DQotICAgICAgICAgICAgLyogSWdub3JlIGRvbWFpbnMgd2l0aCBlbXB0
eSBzbGljZS4gKi8NCi0gICAgICAgICAgICBQUklOVCg0LCJcdFVwZGF0aW5nIHplcm8tc2xpY2Ug
ZG9tYWluICVpLiVpXG4iLA0KLSAgICAgICAgICAgICAgICAgIGN1cmluZi0+dmNwdS0+ZG9tYWlu
LT5kb21haW5faWQsDQotICAgICAgICAgICAgICAgICAgY3VyaW5mLT52Y3B1LT52Y3B1X2lkKTsN
CisgICAgICAgICAgICAvKiBJZ25vcmUgZG9tYWlucyB3aXRoIGVtcHR5IHNsaWNlICovDQogICAg
ICAgICAgICAgX19kZWxfZnJvbV9xdWV1ZShjdXJpbmYtPnZjcHUpOw0KIA0KLSAgICAgICAgICAg
IC8qIE1vdmUgdGhlbSB0byB0aGVpciBuZXh0IHBlcmlvZC4gKi8NCisgICAgICAgICAgICAvKiBN
b3ZlIHRoZW0gdG8gdGhlaXIgbmV4dCBwZXJpb2QgKi8NCiAgICAgICAgICAgICBjdXJpbmYtPmRl
YWRsX2FicyArPSBjdXJpbmYtPnBlcmlvZDsNCiANCi0gICAgICAgICAgICAvKiBFbnN1cmUgdGhh
dCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgcGVyaW9kIGlzIGluIHRoZSBmdXR1cmUuICovDQorICAg
ICAgICAgICAgLyogRW5zdXJlIHRoYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHBlcmlvZCBpcyBp
biB0aGUgZnV0dXJlICovDQogICAgICAgICAgICAgaWYgKCB1bmxpa2VseShQRVJJT0RfQkVHSU4o
Y3VyaW5mKSA8IG5vdykgKQ0KICAgICAgICAgICAgICAgICBjdXJpbmYtPmRlYWRsX2FicyArPSAN
CiAgICAgICAgICAgICAgICAgICAgIChESVZfVVAobm93IC0gUEVSSU9EX0JFR0lOKGN1cmluZiks
DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cmluZi0+cGVyaW9kKSkgKiBjdXJpbmYt
PnBlcmlvZDsNCiANCi0gICAgICAgICAgICAvKiBQdXQgdGhlbSBiYWNrIGludG8gdGhlIHF1ZXVl
LiAqLw0KKyAgICAgICAgICAgIC8qIFB1dCB0aGVtIGJhY2sgaW50byB0aGUgcXVldWUgKi8NCiAg
ICAgICAgICAgICBfX2FkZF90b193YWl0cXVldWVfc29ydChjdXJpbmYtPnZjcHUpOw0KICAgICAg
ICAgfQ0KICAgICAgICAgZWxzZSBpZiAoIHVubGlrZWx5KChjdXJpbmYtPmRlYWRsX2FicyA8IG5v
dykgfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VyaW5mLT5jcHV0aW1lID4gY3Vy
aW5mLT5zbGljZSkpICkNCiAgICAgICAgIHsNCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAg
ICAqIFdlIG1pc3NlZCB0aGUgZGVhZGxpbmUgb3IgdGhlIHNsaWNlIHdhcyBhbHJlYWR5IGZpbmlz
aGVkLg0KKyAgICAgICAgICAgIC8qIFdlIG1pc3NlZCB0aGUgZGVhZGxpbmUgb3IgdGhlIHNsaWNl
IHdhcyBhbHJlYWR5IGZpbmlzaGVkLg0KICAgICAgICAgICAgICAqIE1pZ2h0IGhhcGVuIGJlY2F1
c2Ugb2YgZG9tX2Fkai4NCiAgICAgICAgICAgICAgKi8NCi0gICAgICAgICAgICBQUklOVCg0LCJc
dERvbWFpbiAlaS4laSBleGNlZWRlZCBpdCdzIGRlYWRsaW5lLyINCi0gICAgICAgICAgICAgICAg
ICAic2xpY2UgKCUiUFJJdTY0IiAvICUiUFJJdTY0Iikgbm93OiAlIlBSSXU2NA0KLSAgICAgICAg
ICAgICAgICAgICIgY3B1dGltZTogJSJQUkl1NjQiXG4iLA0KLSAgICAgICAgICAgICAgICAgIGN1
cmluZi0+dmNwdS0+ZG9tYWluLT5kb21haW5faWQsDQotICAgICAgICAgICAgICAgICAgY3VyaW5m
LT52Y3B1LT52Y3B1X2lkLA0KLSAgICAgICAgICAgICAgICAgIGN1cmluZi0+ZGVhZGxfYWJzLCBj
dXJpbmYtPnNsaWNlLCBub3csDQotICAgICAgICAgICAgICAgICAgY3VyaW5mLT5jcHV0aW1lKTsN
CisgICAgICAgICAgICBwcmludGsoIlx0RG9tYWluICVpLiVpIGV4Y2VlZGVkIGl0J3MgZGVhZGxp
bmUvIg0KKyAgICAgICAgICAgICAgICAgICAic2xpY2UgKCUiUFJJdTY0IiAvICUiUFJJdTY0Iikg
bm93OiAlIlBSSXU2NA0KKyAgICAgICAgICAgICAgICAgICAiIGNwdXRpbWU6ICUiUFJJdTY0Ilxu
IiwNCisgICAgICAgICAgICAgICAgICAgY3VyaW5mLT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZCwN
CisgICAgICAgICAgICAgICAgICAgY3VyaW5mLT52Y3B1LT52Y3B1X2lkLA0KKyAgICAgICAgICAg
ICAgICAgICBjdXJpbmYtPmRlYWRsX2FicywgY3VyaW5mLT5zbGljZSwgbm93LA0KKyAgICAgICAg
ICAgICAgICAgICBjdXJpbmYtPmNwdXRpbWUpOw0KICAgICAgICAgICAgIF9fZGVsX2Zyb21fcXVl
dWUoY3VyaW5mLT52Y3B1KTsNCiANCi0gICAgICAgICAgICAvKiBDb21tb24gY2FzZTogd2UgbWlz
cyBvbmUgcGVyaW9kLiAqLw0KKyAgICAgICAgICAgIC8qIENvbW1vbiBjYXNlOiB3ZSBtaXNzIG9u
ZSBwZXJpb2QgKi8NCiAgICAgICAgICAgICBjdXJpbmYtPmRlYWRsX2FicyArPSBjdXJpbmYtPnBl
cmlvZDsNCiAgICANCi0gICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAqIElmIHdlIGFyZSBz
dGlsbCBiZWhpbmQ6IG1vZHVsbyBhcml0aG1ldGljLCBmb3JjZSBkZWFkbGluZQ0KKyAgICAgICAg
ICAgIC8qIElmIHdlIGFyZSBzdGlsbCBiZWhpbmQ6IG1vZHVsbyBhcml0aG1ldGljLCBmb3JjZSBk
ZWFkbGluZQ0KICAgICAgICAgICAgICAqIHRvIGJlIGluIGZ1dHVyZSBhbmQgYWxpZ25lZCB0byBw
ZXJpb2QgYm9yZGVycy4NCiAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICBpZiAoIHVubGlr
ZWx5KGN1cmluZi0+ZGVhZGxfYWJzIDwgbm93KSApDQpAQCAtNTk2LDcgKzUzNiw3IEBAIHN0YXRp
YyB2b2lkIHVwZGF0ZV9xdWV1ZXMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyaW5m
LT5wZXJpb2QpICogY3VyaW5mLT5wZXJpb2Q7DQogICAgICAgICAgICAgQVNTRVJUKGN1cmluZi0+
ZGVhZGxfYWJzID49IG5vdyk7DQogDQotICAgICAgICAgICAgLyogR2l2ZSBhIGZyZXNoIHNsaWNl
LiAqLw0KKyAgICAgICAgICAgIC8qIEdpdmUgYSBmcmVzaCBzbGljZSAqLw0KICAgICAgICAgICAg
IGN1cmluZi0+Y3B1dGltZSA9IDA7DQogICAgICAgICAgICAgaWYgKCBQRVJJT0RfQkVHSU4oY3Vy
aW5mKSA+IG5vdyApDQogICAgICAgICAgICAgICAgIF9fYWRkX3RvX3dhaXRxdWV1ZV9zb3J0KGN1
cmluZi0+dmNwdSk7DQpAQCAtNjA2LDE3ICs1NDYsMTYgQEAgc3RhdGljIHZvaWQgdXBkYXRlX3F1
ZXVlcygNCiAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICBicmVhazsNCiAgICAgfQ0KLQ0KLSAg
ICBQUklOVCgzLCJkb25lIHVwZGF0aW5nIHRoZSBxdWV1ZXNcbiIpOw0KIH0NCiANCiANCiAvKiBy
ZW1vdmVzIGEgZG9tYWluIGZyb20gdGhlIGhlYWQgb2YgdGhlIGFjY29yZGluZyBleHRyYVEgYW5k
DQotICAgcmVxdWV1ZXMgaXQgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb246DQotICAgICByb3VuZC1y
b2JpbiBleHRyYXRpbWU6IGVuZCBvZiBleHRyYVENCi0gICAgIHdlaWdodGVkIGV4dC46IGluc2Vy
dCBpbiBzb3J0ZWQgbGlzdCBieSBzY29yZQ0KLSAgIGlmIHRoZSBkb21haW4gaXMgYmxvY2tlZCAv
IGhhcyByZWdhaW5lZCBpdHMgc2hvcnQtYmxvY2stbG9zcw0KLSAgIHRpbWUgaXQgaXMgbm90IHB1
dCBvbiBhbnkgcXVldWUgKi8NCisgKiByZXF1ZXVlcyBpdCBhdCBhIHNwZWNpZmllZCBwb3NpdGlv
bjoNCisgKiAgIHJvdW5kLXJvYmluIGV4dHJhdGltZTogZW5kIG9mIGV4dHJhUQ0KKyAqICAgd2Vp
Z2h0ZWQgZXh0LjogaW5zZXJ0IGluIHNvcnRlZCBsaXN0IGJ5IHNjb3JlDQorICogaWYgdGhlIGRv
bWFpbiBpcyBibG9ja2VkIC8gaGFzIHJlZ2FpbmVkIGl0cyBzaG9ydC1ibG9jay1sb3NzDQorICog
dGltZSBpdCBpcyBub3QgcHV0IG9uIGFueSBxdWV1ZS4NCisgKi8NCiBzdGF0aWMgdm9pZCBkZXNj
aGVkX2V4dHJhX2RvbShzX3RpbWVfdCBub3csIHN0cnVjdCB2Y3B1ICpkKQ0KIHsNCiAgICAgc3Ry
dWN0IHNlZGZfdmNwdV9pbmZvICppbmYgPSBFRE9NX0lORk8oZCk7DQpAQCAtNjI1LDI5ICs1NjQs
MjUgQEAgc3RhdGljIHZvaWQgZGVzY2hlZF9leHRyYV9kb20oc190aW1lX3Qgbg0KIA0KICAgICBB
U1NFUlQoZXh0cmFxX29uKGQsIGkpKTsNCiANCi0gICAgLyogVW5zZXQgYWxsIHJ1bm5pbmcgZmxh
Z3MuICovDQorICAgIC8qIFVuc2V0IGFsbCBydW5uaW5nIGZsYWdzICovDQogICAgIGluZi0+c3Rh
dHVzICAmPSB+KEVYVFJBX1JVTl9QRU4gfCBFWFRSQV9SVU5fVVRJTCk7DQotICAgIC8qIEZyZXNo
IHNsaWNlIGZvciB0aGUgbmV4dCBydW4uICovDQorICAgIC8qIEZyZXNoIHNsaWNlIGZvciB0aGUg
bmV4dCBydW4gKi8NCiAgICAgaW5mLT5jcHV0aW1lID0gMDsNCi0gICAgLyogQWNjdW11bGF0ZSB0
b3RhbCBleHRyYXRpbWUuICovDQorICAgIC8qIEFjY3VtdWxhdGUgdG90YWwgZXh0cmF0aW1lICov
DQogICAgIGluZi0+ZXh0cmFfdGltZV90b3QgKz0gbm93IC0gaW5mLT5zY2hlZF9zdGFydF9hYnM7
DQogICAgIC8qIFJlbW92ZSBleHRyYWRvbWFpbiBmcm9tIGhlYWQgb2YgdGhlIHF1ZXVlLiAqLw0K
ICAgICBleHRyYXFfZGVsKGQsIGkpOw0KIA0KLSAgICAvKiBVcGRhdGUgdGhlIHNjb3JlLiAqLw0K
KyAgICAvKiBVcGRhdGUgdGhlIHNjb3JlICovDQogICAgIG9sZHNjb3JlID0gaW5mLT5zY29yZVtp
XTsNCiAgICAgaWYgKCBpID09IEVYVFJBX1BFTl9RICkNCiAgICAgew0KLSAgICAgICAgLypkb21h
aW4gd2FzIHJ1bm5pbmcgaW4gTDAgZXh0cmFxKi8NCi0gICAgICAgIC8qcmVkdWNlIGJsb2NrIGxv
c3QsIHByb2JhYmx5IG1vcmUgc29waGlzdGljYXRpb24gaGVyZSEqLw0KKyAgICAgICAgLyogRG9t
YWluIHdhcyBydW5uaW5nIGluIEwwIGV4dHJhcSAqLw0KKyAgICAgICAgLyogcmVkdWNlIGJsb2Nr
IGxvc3QsIHByb2JhYmx5IG1vcmUgc29waGlzdGljYXRpb24gaGVyZSEqLw0KICAgICAgICAgLypp
bmYtPnNob3J0X2Jsb2NrX2xvc3RfdG90IC09IEVYVFJBX1FVQU5UVU07Ki8NCiAgICAgICAgIGlu
Zi0+c2hvcnRfYmxvY2tfbG9zdF90b3QgLT0gbm93IC0gaW5mLT5zY2hlZF9zdGFydF9hYnM7DQot
ICAgICAgICBQUklOVCgzLCJEb21haW4gJWkuJWk6IFNob3J0X2Jsb2NrX2xvc3M6ICUiUFJJaTY0
IlxuIiwgDQotICAgICAgICAgICAgICBpbmYtPnZjcHUtPmRvbWFpbi0+ZG9tYWluX2lkLCBpbmYt
PnZjcHUtPnZjcHVfaWQsDQotICAgICAgICAgICAgICBpbmYtPnNob3J0X2Jsb2NrX2xvc3RfdG90
KTsNCiAjaWYgMA0KLSAgICAgICAgLyoNCi0gICAgICAgICAqIEtBRjogSWYgd2UgZG9uJ3QgZXhp
dCBzaG9ydC1ibG9ja2luZyBzdGF0ZSBhdCB0aGlzIHBvaW50DQorICAgICAgICAvKiBLQUY6IElm
IHdlIGRvbid0IGV4aXQgc2hvcnQtYmxvY2tpbmcgc3RhdGUgYXQgdGhpcyBwb2ludA0KICAgICAg
ICAgICogZG9tYWluMCBjYW4gc3RlYWwgYWxsIENQVSBmb3IgdXAgdG8gMTAgc2Vjb25kcyBiZWZv
cmUNCiAgICAgICAgICAqIHNjaGVkdWxpbmcgc2V0dGxlcyBkb3duICh3aGVuIGNvbXBldGluZyBh
Z2FpbnN0IGFub3RoZXINCiAgICAgICAgICAqIENQVS1ib3VuZCBkb21haW4pLiBEb2luZyB0aGlz
IHNlZW1zIHRvIG1ha2UgdGhpbmdzIGJlaGF2ZQ0KQEAgLTY1Niw1MSArNTkxLDU2IEBAIHN0YXRp
YyB2b2lkIGRlc2NoZWRfZXh0cmFfZG9tKHNfdGltZV90IG4NCiAgICAgICAgIGlmICggaW5mLT5z
aG9ydF9ibG9ja19sb3N0X3RvdCA8PSAwICkNCiAjZW5kaWYNCiAgICAgICAgIHsNCi0gICAgICAg
ICAgICBQUklOVCg0LCJEb21haW4gJWkuJWkgY29tcGVuc2F0ZWQgc2hvcnQgYmxvY2sgbG9zcyFc
biIsDQotICAgICAgICAgICAgICAgICAgaW5mLT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZCwgaW5m
LT52Y3B1LT52Y3B1X2lkKTsNCi0gICAgICAgICAgICAvKndlIGhhdmUgKG92ZXItKWNvbXBlbnNh
dGVkIG91ciBibG9jayBwZW5hbHR5Ki8NCisgICAgICAgICAgICAvKiBXZSBoYXZlIChvdmVyLSlj
b21wZW5zYXRlZCBvdXIgYmxvY2sgcGVuYWx0eSAqLw0KICAgICAgICAgICAgIGluZi0+c2hvcnRf
YmxvY2tfbG9zdF90b3QgPSAwOw0KLSAgICAgICAgICAgIC8qd2UgZG9uJ3Qgd2FudCBhIHBsYWNl
IG9uIHRoZSBwZW5hbHR5IHF1ZXVlIGFueW1vcmUhKi8NCisgICAgICAgICAgICAvKiBXZSBkb24n
dCB3YW50IGEgcGxhY2Ugb24gdGhlIHBlbmFsdHkgcXVldWUgYW55bW9yZSEgKi8NCiAgICAgICAg
ICAgICBpbmYtPnN0YXR1cyAmPSB+RVhUUkFfV0FOVF9QRU5fUTsNCiAgICAgICAgICAgICBnb3Rv
IGNoZWNrX2V4dHJhX3F1ZXVlczsNCiAgICAgICAgIH0NCiANCi0gICAgICAgIC8qd2UgaGF2ZSB0
byBnbyBhZ2FpbiBmb3IgYW5vdGhlciB0cnkgaW4gdGhlIGJsb2NrLWV4dHJhcSwNCi0gICAgICAg
ICAgdGhlIHNjb3JlIGlzIG5vdCB1c2VkIGluY3JlbWFudGFsbHkgaGVyZSwgYXMgdGhpcyBpcw0K
LSAgICAgICAgICBhbHJlYWR5IGRvbmUgYnkgcmVjYWxjdWxhdGluZyB0aGUgYmxvY2tfbG9zdCov
DQorICAgICAgICAvKiBXZSBoYXZlIHRvIGdvIGFnYWluIGZvciBhbm90aGVyIHRyeSBpbiB0aGUg
YmxvY2stZXh0cmFxLA0KKyAgICAgICAgICogdGhlIHNjb3JlIGlzIG5vdCB1c2VkIGluY3JlbWFu
dGFsbHkgaGVyZSwgYXMgdGhpcyBpcw0KKyAgICAgICAgICogYWxyZWFkeSBkb25lIGJ5IHJlY2Fs
Y3VsYXRpbmcgdGhlIGJsb2NrX2xvc3QNCisgICAgICAgICAqLw0KICAgICAgICAgaW5mLT5zY29y
ZVtFWFRSQV9QRU5fUV0gPSAoaW5mLT5wZXJpb2QgPDwgMTApIC8NCiAgICAgICAgICAgICBpbmYt
PnNob3J0X2Jsb2NrX2xvc3RfdG90Ow0KICAgICAgICAgb2xkc2NvcmUgPSAwOw0KICAgICB9DQog
ICAgIGVsc2UNCiAgICAgew0KLSAgICAgICAgLypkb21haW4gd2FzIHJ1bm5pbmcgaW4gTDEgZXh0
cmFxID0+IHNjb3JlIGlzIGludmVyc2Ugb2YNCi0gICAgICAgICAgdXRpbGl6YXRpb24gYW5kIGlz
IHVzZWQgc29tZXdoYXQgaW5jcmVtZW50YWwhKi8NCisgICAgICAgIC8qIERvbWFpbiB3YXMgcnVu
bmluZyBpbiBMMSBleHRyYXEgPT4gc2NvcmUgaXMgaW52ZXJzZSBvZg0KKyAgICAgICAgICogdXRp
bGl6YXRpb24gYW5kIGlzIHVzZWQgc29tZXdoYXQgaW5jcmVtZW50YWwhDQorICAgICAgICAgKi8N
CiAgICAgICAgIGlmICggIWluZi0+ZXh0cmF3ZWlnaHQgKQ0KLSAgICAgICAgICAgIC8qTkI6IHVz
ZSBmaXhlZCBwb2ludCBhcml0aG1ldGljIHdpdGggMTAgYml0cyovDQorICAgICAgICB7DQorICAg
ICAgICAgICAgLyogTkI6IHVzZSBmaXhlZCBwb2ludCBhcml0aG1ldGljIHdpdGggMTAgYml0cyAq
Lw0KICAgICAgICAgICAgIGluZi0+c2NvcmVbRVhUUkFfVVRJTF9RXSA9IChpbmYtPnBlcmlvZCA8
PCAxMCkgLw0KICAgICAgICAgICAgICAgICBpbmYtPnNsaWNlOw0KKyAgICAgICAgfQ0KICAgICAg
ICAgZWxzZQ0KLSAgICAgICAgICAgIC8qY29udmVyc2lvbiBiZXR3ZWVuIHJlYWx0aW1lIHV0aWxp
c2F0aW9uIGFuZCBleHRyYXdpZWdodDoNCi0gICAgICAgICAgICAgIGZ1bGwgKGllIDEwMCUpIHV0
aWxpemF0aW9uIGlzIGVxdWl2YWxlbnQgdG8gMTI4IGV4dHJhd2VpZ2h0Ki8NCisgICAgICAgIHsN
CisgICAgICAgICAgICAvKiBDb252ZXJzaW9uIGJldHdlZW4gcmVhbHRpbWUgdXRpbGlzYXRpb24g
YW5kIGV4dHJhd2llZ2h0Og0KKyAgICAgICAgICAgICAqIGZ1bGwgKGllIDEwMCUpIHV0aWxpemF0
aW9uIGlzIGVxdWl2YWxlbnQgdG8gMTI4IGV4dHJhd2VpZ2h0DQorICAgICAgICAgICAgICovDQog
ICAgICAgICAgICAgaW5mLT5zY29yZVtFWFRSQV9VVElMX1FdID0gKDE8PDE3KSAvIGluZi0+ZXh0
cmF3ZWlnaHQ7DQorICAgICAgICB9DQogICAgIH0NCiANCiAgY2hlY2tfZXh0cmFfcXVldWVzOg0K
LSAgICAvKiBBZGRpbmcgYSBydW5uYWJsZSBkb21haW4gdG8gdGhlIHJpZ2h0IHF1ZXVlIGFuZCBy
ZW1vdmluZyBibG9ja2VkIG9uZXMqLw0KKyAgICAvKiBBZGRpbmcgYSBydW5uYWJsZSBkb21haW4g
dG8gdGhlIHJpZ2h0IHF1ZXVlIGFuZCByZW1vdmluZyBibG9ja2VkIG9uZXMgKi8NCiAgICAgaWYg
KCBzZWRmX3J1bm5hYmxlKGQpICkNCiAgICAgew0KLSAgICAgICAgLyphZGQgYWNjb3JkaW5nIHRv
IHNjb3JlOiB3ZWlnaHRlZCByb3VuZCByb2JpbiovDQorICAgICAgICAvKiBBZGQgYWNjb3JkaW5n
IHRvIHNjb3JlOiB3ZWlnaHRlZCByb3VuZCByb2JpbiAqLw0KICAgICAgICAgaWYgKCgoaW5mLT5z
dGF0dXMgJiBFWFRSQV9BV0FSRSkgJiYgKGkgPT0gRVhUUkFfVVRJTF9RKSkgfHwNCiAgICAgICAg
ICAgICAoKGluZi0+c3RhdHVzICYgRVhUUkFfV0FOVF9QRU5fUSkgJiYgKGkgPT0gRVhUUkFfUEVO
X1EpKSkNCiAgICAgICAgICAgICBleHRyYXFfYWRkX3NvcnRfdXBkYXRlKGQsIGksIG9sZHNjb3Jl
KTsNCiAgICAgfQ0KICAgICBlbHNlDQogICAgIHsNCi0gICAgICAgIC8qcmVtb3ZlIHRoaXMgYmxv
Y2tlZCBkb21haW4gZnJvbSB0aGUgd2FpdHEhKi8NCisgICAgICAgIC8qIFJlbW92ZSB0aGlzIGJs
b2NrZWQgZG9tYWluIGZyb20gdGhlIHdhaXRxISAqLw0KICAgICAgICAgX19kZWxfZnJvbV9xdWV1
ZShkKTsNCi0gICAgICAgIC8qbWFrZSBzdXJlIHRoYXQgd2UgcmVtb3ZlIGEgYmxvY2tlZCBkb21h
aW4gZnJvbSB0aGUgb3RoZXINCi0gICAgICAgICAgZXh0cmFxIHRvbyovDQorICAgICAgICAvKiBN
YWtlIHN1cmUgdGhhdCB3ZSByZW1vdmUgYSBibG9ja2VkIGRvbWFpbiBmcm9tIHRoZSBvdGhlcg0K
KyAgICAgICAgICogZXh0cmFxIHRvby4gKi8NCiAgICAgICAgIGlmICggaSA9PSBFWFRSQV9QRU5f
USApDQogICAgICAgICB7DQogICAgICAgICAgICAgaWYgKCBleHRyYXFfb24oZCwgRVhUUkFfVVRJ
TF9RKSApDQpAQCAtNzMyLDggKzY3Miw5IEBAIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRm
X2RvX2V4dHJhX3MNCiANCiAgICAgaWYgKCAhbGlzdF9lbXB0eShleHRyYXFbRVhUUkFfUEVOX1Fd
KSApDQogICAgIHsNCi0gICAgICAgIC8qd2Ugc3RpbGwgaGF2ZSBlbGVtZW50cyBvbiB0aGUgbGV2
ZWwgMCBleHRyYXEgDQotICAgICAgICAgID0+IGxldCB0aG9zZSBydW4gZmlyc3QhKi8NCisgICAg
ICAgIC8qIFdlIHN0aWxsIGhhdmUgZWxlbWVudHMgb24gdGhlIGxldmVsIDAgZXh0cmFxDQorICAg
ICAgICAgKiA9PiBsZXQgdGhvc2UgcnVuIGZpcnN0IQ0KKyAgICAgICAgICovDQogICAgICAgICBy
dW5pbmYgICA9IGxpc3RfZW50cnkoZXh0cmFxW0VYVFJBX1BFTl9RXS0+bmV4dCwgDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlZGZfdmNwdV9pbmZvLCBleHRyYWxpc3Rb
RVhUUkFfUEVOX1FdKTsNCiAgICAgICAgIHJ1bmluZi0+c3RhdHVzIHw9IEVYVFJBX1JVTl9QRU47
DQpAQCAtNzQ3LDcgKzY4OCw3IEBAIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX2V4
dHJhX3MNCiAgICAgew0KICAgICAgICAgaWYgKCAhbGlzdF9lbXB0eShleHRyYXFbRVhUUkFfVVRJ
TF9RXSkgKQ0KICAgICAgICAgew0KLSAgICAgICAgICAgIC8qdXNlIGVsZW1lbnRzIGZyb20gdGhl
IG5vcm1hbCBleHRyYXF1ZXVlKi8NCisgICAgICAgICAgICAvKiBVc2UgZWxlbWVudHMgZnJvbSB0
aGUgbm9ybWFsIGV4dHJhcXVldWUgKi8NCiAgICAgICAgICAgICBydW5pbmYgICA9IGxpc3RfZW50
cnkoZXh0cmFxW0VYVFJBX1VUSUxfUV0tPm5leHQsDQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHN0cnVjdCBzZWRmX3ZjcHVfaW5mbywNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZXh0cmFsaXN0W0VYVFJBX1VUSUxfUV0pOw0KQEAgLTc3MywxMCArNzE0LDEx
IEBAIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX2V4dHJhX3MNCiANCiANCiAvKiBN
YWluIHNjaGVkdWxpbmcgZnVuY3Rpb24NCi0gICBSZWFzb25zIGZvciBjYWxsaW5nIHRoaXMgZnVu
Y3Rpb24gYXJlOg0KLSAgIC10aW1lc2xpY2UgZm9yIHRoZSBjdXJyZW50IHBlcmlvZCB1c2VkIHVw
DQotICAgLWRvbWFpbiBvbiB3YWl0cXVldWUgaGFzIHN0YXJ0ZWQgaXQncyBwZXJpb2QNCi0gICAt
YW5kIHZhcmlvdXMgb3RoZXJzIDspIGluIGdlbmVyYWw6IGRldGVybWluZSB3aGljaCBkb21haW4g
dG8gcnVuIG5leHQqLw0KKyAqIFJlYXNvbnMgZm9yIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhcmU6
DQorICogLXRpbWVzbGljZSBmb3IgdGhlIGN1cnJlbnQgcGVyaW9kIHVzZWQgdXANCisgKiAtZG9t
YWluIG9uIHdhaXRxdWV1ZSBoYXMgc3RhcnRlZCBpdCdzIHBlcmlvZA0KKyAqIC1hbmQgdmFyaW91
cyBvdGhlcnMgOykgaW4gZ2VuZXJhbDogZGV0ZXJtaW5lIHdoaWNoIGRvbWFpbiB0byBydW4gbmV4
dA0KKyAqLw0KIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX3NjaGVkdWxlKA0KICAg
ICBjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHNfdGltZV90IG5vdywgYm9vbF90IHRhc2ts
ZXRfd29ya19zY2hlZHVsZWQpDQogew0KQEAgLTc4OSwxMyArNzMxLDE0IEBAIHN0YXRpYyBzdHJ1
Y3QgdGFza19zbGljZSBzZWRmX2RvX3NjaGVkdWwNCiAgICAgc3RydWN0IHNlZGZfdmNwdV9pbmZv
ICpydW5pbmYsICp3YWl0aW5mOw0KICAgICBzdHJ1Y3QgdGFza19zbGljZSAgICAgIHJldDsNCiAN
Ci0gICAgLyppZGxlIHRhc2tzIGRvbid0IG5lZWQgYW55IG9mIHRoZSBmb2xsb3dpbmcgc3R1Ziov
DQorICAgIC8qIElkbGUgdGFza3MgZG9uJ3QgbmVlZCBhbnkgb2YgdGhlIGZvbGxvd2luZyBzdHVm
ICovDQogICAgIGlmICggaXNfaWRsZV92Y3B1KGN1cnJlbnQpICkNCiAgICAgICAgIGdvdG8gY2hl
Y2tfd2FpdHE7DQogIA0KLSAgICAvKiBjcmVhdGUgbG9jYWwgc3RhdGUgb2YgdGhlIHN0YXR1cyBv
ZiB0aGUgZG9tYWluLCBpbiBvcmRlciB0byBhdm9pZA0KLSAgICAgICBpbmNvbnNpc3RlbnQgc3Rh
dGUgZHVyaW5nIHNjaGVkdWxpbmcgZGVjaXNpb25zLCBiZWNhdXNlIGRhdGEgZm9yDQotICAgICAg
IHZjcHVfcnVubmFibGUgaXMgbm90IHByb3RlY3RlZCBieSB0aGUgc2NoZWR1bGluZyBsb2NrISov
DQorICAgIC8qIENyZWF0ZSBsb2NhbCBzdGF0ZSBvZiB0aGUgc3RhdHVzIG9mIHRoZSBkb21haW4s
IGluIG9yZGVyIHRvIGF2b2lkDQorICAgICAqIGluY29uc2lzdGVudCBzdGF0ZSBkdXJpbmcgc2No
ZWR1bGluZyBkZWNpc2lvbnMsIGJlY2F1c2UgZGF0YSBmb3INCisgICAgICogdmNwdV9ydW5uYWJs
ZSBpcyBub3QgcHJvdGVjdGVkIGJ5IHRoZSBzY2hlZHVsaW5nIGxvY2shDQorICAgICAqLw0KICAg
ICBpZiAoICF2Y3B1X3J1bm5hYmxlKGN1cnJlbnQpICkNCiAgICAgICAgIGluZi0+c3RhdHVzIHw9
IFNFREZfQVNMRUVQOw0KICANCkBAIC04MDQsNyArNzQ3LDcgQEAgc3RhdGljIHN0cnVjdCB0YXNr
X3NsaWNlIHNlZGZfZG9fc2NoZWR1bA0KIA0KICAgICBpZiAoIHVubGlrZWx5KGV4dHJhX3J1bnMo
aW5mKSkgKQ0KICAgICB7DQotICAgICAgICAvKnNwZWNpYWwgdHJlYXRtZW50IG9mIGRvbWFpbnMg
cnVubmluZyBpbiBleHRyYSB0aW1lKi8NCisgICAgICAgIC8qIFNwZWNpYWwgdHJlYXRtZW50IG9m
IGRvbWFpbnMgcnVubmluZyBpbiBleHRyYSB0aW1lICovDQogICAgICAgICBkZXNjaGVkX2V4dHJh
X2RvbShub3csIGN1cnJlbnQpOw0KICAgICB9DQogICAgIGVsc2UgDQpAQCAtODE0LDEwICs3NTcs
MTEgQEAgc3RhdGljIHN0cnVjdCB0YXNrX3NsaWNlIHNlZGZfZG9fc2NoZWR1bA0KICBjaGVja193
YWl0cToNCiAgICAgdXBkYXRlX3F1ZXVlcyhub3csIHJ1bnEsIHdhaXRxKTsNCiANCi0gICAgLypu
b3cgc2ltcGx5IHBpY2sgdGhlIGZpcnN0IGRvbWFpbiBmcm9tIHRoZSBydW5xdWV1ZSwgd2hpY2gg
aGFzIHRoZQ0KLSAgICAgIGVhcmxpZXN0IGRlYWRsaW5lLCBiZWNhdXNlIHRoZSBsaXN0IGlzIHNv
cnRlZCovDQotIA0KLSAgICAvKiBUYXNrbGV0IHdvcmsgKHdoaWNoIHJ1bnMgaW4gaWRsZSBWQ1BV
IGNvbnRleHQpIG92ZXJyaWRlcyBhbGwgZWxzZS4gKi8NCisgICAgLyogTm93IHNpbXBseSBwaWNr
IHRoZSBmaXJzdCBkb21haW4gZnJvbSB0aGUgcnVucXVldWUsIHdoaWNoIGhhcyB0aGUNCisgICAg
ICogZWFybGllc3QgZGVhZGxpbmUsIGJlY2F1c2UgdGhlIGxpc3QgaXMgc29ydGVkDQorICAgICAq
DQorICAgICAqIFRhc2tsZXQgd29yayAod2hpY2ggcnVucyBpbiBpZGxlIFZDUFUgY29udGV4dCkg
b3ZlcnJpZGVzIGFsbCBlbHNlLg0KKyAgICAgKi8NCiAgICAgaWYgKCB0YXNrbGV0X3dvcmtfc2No
ZWR1bGVkIHx8DQogICAgICAgICAgKGxpc3RfZW1wdHkocnVucSkgJiYgbGlzdF9lbXB0eSh3YWl0
cSkpIHx8DQogICAgICAgICAgdW5saWtlbHkoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBTRURGX0NQ
VU9OTElORShwZXJfY3B1KGNwdXBvb2wsIGNwdSkpKSkgKQ0KQEAgLTgzMyw5ICs3NzcsMTAgQEAg
c3RhdGljIHN0cnVjdCB0YXNrX3NsaWNlIHNlZGZfZG9fc2NoZWR1bA0KICAgICAgICAgew0KICAg
ICAgICAgICAgIHdhaXRpbmYgID0gbGlzdF9lbnRyeSh3YWl0cS0+bmV4dCwNCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlZGZfdmNwdV9pbmZvLGxpc3QpOw0KLSAg
ICAgICAgICAgIC8qcmVydW4gc2NoZWR1bGVyLCB3aGVuIHNjaGVkdWxlZCBkb21haW4gcmVhY2hl
cyBpdCdzDQotICAgICAgICAgICAgICBlbmQgb2Ygc2xpY2Ugb3IgdGhlIGZpcnN0IGRvbWFpbiBm
cm9tIHRoZSB3YWl0cXVldWUNCi0gICAgICAgICAgICAgIGdldHMgcmVhZHkqLw0KKyAgICAgICAg
ICAgIC8qIFJlcnVuIHNjaGVkdWxlciwgd2hlbiBzY2hlZHVsZWQgZG9tYWluIHJlYWNoZXMgaXQn
cw0KKyAgICAgICAgICAgICAqIGVuZCBvZiBzbGljZSBvciB0aGUgZmlyc3QgZG9tYWluIGZyb20g
dGhlIHdhaXRxdWV1ZQ0KKyAgICAgICAgICAgICAqIGdldHMgcmVhZHkuDQorICAgICAgICAgICAg
ICovDQogICAgICAgICAgICAgcmV0LnRpbWUgPSBNSU4obm93ICsgcnVuaW5mLT5zbGljZSAtIHJ1
bmluZi0+Y3B1dGltZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRVJJT0RfQkVHSU4o
d2FpdGluZikpIC0gbm93Ow0KICAgICAgICAgfQ0KQEAgLTg0NywxNCArNzkyLDE1IEBAIHN0YXRp
YyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX3NjaGVkdWwNCiAgICAgZWxzZQ0KICAgICB7DQog
ICAgICAgICB3YWl0aW5mICA9IGxpc3RfZW50cnkod2FpdHEtPm5leHQsc3RydWN0IHNlZGZfdmNw
dV9pbmZvLCBsaXN0KTsNCi0gICAgICAgIC8qd2UgY291bGQgbm90IGZpbmQgYW55IHN1aXRhYmxl
IGRvbWFpbiANCi0gICAgICAgICAgPT4gbG9vayBmb3IgZG9tYWlucyB0aGF0IGFyZSBhd2FyZSBv
ZiBleHRyYXRpbWUqLw0KKyAgICAgICAgLyogV2UgY291bGQgbm90IGZpbmQgYW55IHN1aXRhYmxl
IGRvbWFpbiANCisgICAgICAgICAqID0+IGxvb2sgZm9yIGRvbWFpbnMgdGhhdCBhcmUgYXdhcmUg
b2YgZXh0cmF0aW1lKi8NCiAgICAgICAgIHJldCA9IHNlZGZfZG9fZXh0cmFfc2NoZWR1bGUobm93
LCBQRVJJT0RfQkVHSU4od2FpdGluZiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGV4dHJhcSwgY3B1KTsNCiAgICAgfQ0KIA0KLSAgICAvKlRPRE86IERvIHNvbWV0aGlu
ZyBVU0VGVUwgd2hlbiB0aGlzIGhhcHBlbnMgYW5kIGZpbmQgb3V0LCB3aHkgaXQNCi0gICAgICBz
dGlsbCBjYW4gaGFwcGVuISEhKi8NCisgICAgLyogVE9ETzogRG8gc29tZXRoaW5nIFVTRUZVTCB3
aGVuIHRoaXMgaGFwcGVucyBhbmQgZmluZCBvdXQsIHdoeSBpdA0KKyAgICAgKiBzdGlsbCBjYW4g
aGFwcGVuISEhDQorICAgICAqLw0KICAgICBpZiAoIHJldC50aW1lIDwgMCkNCiAgICAgew0KICAg
ICAgICAgcHJpbnRrKCJPdWNoISBXZSBhcmUgc2VyaW91c2x5IEJFSElORCBzY2hlZHVsZSEgJSJQ
UklpNjQiXG4iLA0KQEAgLTg3NCw5ICs4MjAsNiBAQCBzdGF0aWMgc3RydWN0IHRhc2tfc2xpY2Ug
c2VkZl9kb19zY2hlZHVsDQogDQogc3RhdGljIHZvaWQgc2VkZl9zbGVlcChjb25zdCBzdHJ1Y3Qg
c2NoZWR1bGVyICpvcHMsIHN0cnVjdCB2Y3B1ICpkKQ0KIHsNCi0gICAgUFJJTlQoMiwic2VkZl9z
bGVlcCB3YXMgY2FsbGVkLCBkb21haW4taWQgJWkuJWlcbiIsDQotICAgICAgICAgIGQtPmRvbWFp
bi0+ZG9tYWluX2lkLCBkLT52Y3B1X2lkKTsNCi0gDQogICAgIGlmICggaXNfaWRsZV92Y3B1KGQp
ICkNCiAgICAgICAgIHJldHVybjsNCiANCkBAIC05NzIsMjcgKzkxNSwyOSBAQCBzdGF0aWMgdm9p
ZCBzZWRmX3NsZWVwKGNvbnN0IHN0cnVjdCBzY2hlDQogc3RhdGljIHZvaWQgdW5ibG9ja19zaG9y
dF9leHRyYV9zdXBwb3J0KA0KICAgICBzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8qIGluZiwgc190aW1l
X3Qgbm93KQ0KIHsNCi0gICAgLyp0aGlzIHVuYmxvY2tpbmcgc2NoZW1lIHRyaWVzIHRvIHN1cHBv
cnQgdGhlIGRvbWFpbiwgYnkgYXNzaWduaW5nIGl0DQotICAgIGEgcHJpb3JpdHkgaW4gZXh0cmF0
aW1lIGRpc3RyaWJ1dGlvbiBhY2NvcmRpbmcgdG8gdGhlIGxvc3Mgb2YgdGltZQ0KLSAgICBpbiB0
aGlzIHNsaWNlIGR1ZSB0byBibG9ja2luZyovDQorICAgIC8qIFRoaXMgdW5ibG9ja2luZyBzY2hl
bWUgdHJpZXMgdG8gc3VwcG9ydCB0aGUgZG9tYWluLCBieSBhc3NpZ25pbmcgaXQNCisgICAgICog
YSBwcmlvcml0eSBpbiBleHRyYXRpbWUgZGlzdHJpYnV0aW9uIGFjY29yZGluZyB0byB0aGUgbG9z
cyBvZiB0aW1lDQorICAgICAqIGluIHRoaXMgc2xpY2UgZHVlIHRvIGJsb2NraW5nDQorICAgICAq
Lw0KICAgICBzX3RpbWVfdCBwZW47DQogIA0KLSAgICAvKm5vIG1vcmUgcmVhbHRpbWUgZXhlY3V0
aW9uIGluIHRoaXMgcGVyaW9kISovDQorICAgIC8qIE5vIG1vcmUgcmVhbHRpbWUgZXhlY3V0aW9u
IGluIHRoaXMgcGVyaW9kISAqLw0KICAgICBpbmYtPmRlYWRsX2FicyArPSBpbmYtPnBlcmlvZDsN
CiAgICAgaWYgKCBsaWtlbHkoaW5mLT5ibG9ja19hYnMpICkNCiAgICAgew0KLSAgICAgICAgLy90
cmVhdCBibG9ja2VkIHRpbWUgYXMgY29uc3VtZWQgYnkgdGhlIGRvbWFpbiovDQorICAgICAgICAv
KiBUcmVhdCBibG9ja2VkIHRpbWUgYXMgY29uc3VtZWQgYnkgdGhlIGRvbWFpbiAqLw0KICAgICAg
ICAgLyppbmYtPmNwdXRpbWUgKz0gbm93IC0gaW5mLT5ibG9ja19hYnM7Ki8NCi0gICAgICAgIC8q
cGVuYWx0eSBpcyB0aW1lIHRoZSBkb21haW4gd291bGQgaGF2ZQ0KLSAgICAgICAgICBoYWQgaWYg
aXQgY29udGludWVkIHRvIHJ1biAqLw0KKyAgICAgICAgLyogUGVuYWx0eSBpcyB0aW1lIHRoZSBk
b21haW4gd291bGQgaGF2ZQ0KKyAgICAgICAgICogaGFkIGlmIGl0IGNvbnRpbnVlZCB0byBydW4u
DQorICAgICAgICAgKi8NCiAgICAgICAgIHBlbiA9IChpbmYtPnNsaWNlIC0gaW5mLT5jcHV0aW1l
KTsNCiAgICAgICAgIGlmICggcGVuIDwgMCApDQogICAgICAgICAgICAgcGVuID0gMDsNCi0gICAg
ICAgIC8qYWNjdW11bGF0ZSBhbGwgcGVuYWx0aWVzIG92ZXIgdGhlIHBlcmlvZHMqLw0KKyAgICAg
ICAgLyogQWNjdW11bGF0ZSBhbGwgcGVuYWx0aWVzIG92ZXIgdGhlIHBlcmlvZHMgKi8NCiAgICAg
ICAgIC8qaW5mLT5zaG9ydF9ibG9ja19sb3N0X3RvdCArPSBwZW47Ki8NCi0gICAgICAgIC8qc2V0
IHBlbmFsdHkgdG8gdGhlIGN1cnJlbnQgdmFsdWUqLw0KKyAgICAgICAgLyogU2V0IHBlbmFsdHkg
dG8gdGhlIGN1cnJlbnQgdmFsdWUgKi8NCiAgICAgICAgIGluZi0+c2hvcnRfYmxvY2tfbG9zdF90
b3QgPSBwZW47DQotICAgICAgICAvKm5vdCBzdXJlIHdoaWNoIG9uZSBpcyBiZXR0ZXIuLiBidXQg
c2VlbXMgdG8gd29yayB3ZWxsLi4uKi8NCisgICAgICAgIC8qIE5vdCBzdXJlIHdoaWNoIG9uZSBp
cyBiZXR0ZXIuLiBidXQgc2VlbXMgdG8gd29yayB3ZWxsLi4uICovDQogICANCiAgICAgICAgIGlm
ICggaW5mLT5zaG9ydF9ibG9ja19sb3N0X3RvdCApDQogICAgICAgICB7DQpAQCAtMTAwMiwyOCAr
OTQ3LDMwIEBAIHN0YXRpYyB2b2lkIHVuYmxvY2tfc2hvcnRfZXh0cmFfc3VwcG9ydCgNCiAgICAg
ICAgICAgICBpbmYtPnBlbl9leHRyYV9ibG9ja3MrKzsNCiAjZW5kaWYNCiAgICAgICAgICAgICBp
ZiAoIGV4dHJhcV9vbihpbmYtPnZjcHUsIEVYVFJBX1BFTl9RKSApDQotICAgICAgICAgICAgICAg
IC8qcmVtb3ZlIGRvbWFpbiBmb3IgcG9zc2libGUgcmVzb3J0aW5nISovDQorICAgICAgICAgICAg
ICAgIC8qIFJlbW92ZSBkb21haW4gZm9yIHBvc3NpYmxlIHJlc29ydGluZyEgKi8NCiAgICAgICAg
ICAgICAgICAgZXh0cmFxX2RlbChpbmYtPnZjcHUsIEVYVFJBX1BFTl9RKTsNCiAgICAgICAgICAg
ICBlbHNlDQotICAgICAgICAgICAgICAgIC8qcmVtZW1iZXIgdGhhdCB3ZSB3YW50IHRvIGJlIG9u
IHRoZSBwZW5hbHR5IHENCi0gICAgICAgICAgICAgICAgICBzbyB0aGF0IHdlIGNhbiBjb250aW51
ZSB3aGVuIHdlICh1bi0pYmxvY2sNCi0gICAgICAgICAgICAgICAgICBpbiBwZW5hbHR5LWV4dHJh
dGltZSovDQorICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoYXQgd2Ugd2FudCB0byBiZSBv
biB0aGUgcGVuYWx0eSBxDQorICAgICAgICAgICAgICAgICAqIHNvIHRoYXQgd2UgY2FuIGNvbnRp
bnVlIHdoZW4gd2UgKHVuLSlibG9jaw0KKyAgICAgICAgICAgICAgICAgKiBpbiBwZW5hbHR5LWV4
dHJhdGltZQ0KKyAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgaW5mLT5zdGF0
dXMgfD0gRVhUUkFfV0FOVF9QRU5fUTsNCiAgICANCi0gICAgICAgICAgICAvKihyZS0pYWRkIGRv
bWFpbiB0byB0aGUgcGVuYWx0eSBleHRyYXEqLw0KKyAgICAgICAgICAgIC8qIChyZS0pYWRkIGRv
bWFpbiB0byB0aGUgcGVuYWx0eSBleHRyYXEgKi8NCiAgICAgICAgICAgICBleHRyYXFfYWRkX3Nv
cnRfdXBkYXRlKGluZi0+dmNwdSwgRVhUUkFfUEVOX1EsIDApOw0KICAgICAgICAgfQ0KICAgICB9
DQogDQotICAgIC8qZ2l2ZSBpdCBhIGZyZXNoIHNsaWNlIGluIHRoZSBuZXh0IHBlcmlvZCEqLw0K
KyAgICAvKiBHaXZlIGl0IGEgZnJlc2ggc2xpY2UgaW4gdGhlIG5leHQgcGVyaW9kISAqLw0KICAg
ICBpbmYtPmNwdXRpbWUgPSAwOw0KIH0NCiANCiANCiBzdGF0aWMgdm9pZCB1bmJsb2NrX2xvbmdf
Y29uc19iKHN0cnVjdCBzZWRmX3ZjcHVfaW5mbyogaW5mLHNfdGltZV90IG5vdykNCiB7DQotICAg
IC8qQ29uc2VydmF0aXZlIDJiKi8NCi0gICAgLypUcmVhdCB0aGUgdW5ibG9ja2luZyB0aW1lIGFz
IGEgc3RhcnQgb2YgYSBuZXcgcGVyaW9kICovDQorICAgIC8qIENvbnNlcnZhdGl2ZSAyYiAqLw0K
Kw0KKyAgICAvKiBUcmVhdCB0aGUgdW5ibG9ja2luZyB0aW1lIGFzIGEgc3RhcnQgb2YgYSBuZXcg
cGVyaW9kICovDQogICAgIGluZi0+ZGVhZGxfYWJzID0gbm93ICsgaW5mLT5wZXJpb2Q7DQogICAg
IGluZi0+Y3B1dGltZSA9IDA7DQogfQ0KQEAgLTEwNDYsMTUgKzk5MywxNiBAQCBzdGF0aWMgaW5s
aW5lIGludCBnZXRfcnVuX3R5cGUoc3RydWN0IHZjDQogfQ0KIA0KIA0KLS8qQ29tcGFyZXMgdHdv
IGRvbWFpbnMgaW4gdGhlIHJlbGF0aW9uIG9mIHdoZXRoZXIgdGhlIG9uZSBpcyBhbGxvd2VkIHRv
DQotICBpbnRlcnJ1cHQgdGhlIG90aGVycyBleGVjdXRpb24uDQotICBJdCByZXR1cm5zIHRydWUg
KCE9MCkgaWYgYSBzd2l0Y2ggdG8gdGhlIG90aGVyIGRvbWFpbiBpcyBnb29kLg0KLSAgQ3VycmVu
dCBQcmlvcml0eSBzY2hlbWUgaXMgYXMgZm9sbG93czoNCi0gICBFREYgPiBMMCAocGVuYWx0eSBi
YXNlZCkgZXh0cmEtdGltZSA+IA0KLSAgIEwxICh1dGlsaXphdGlvbikgZXh0cmEtdGltZSA+IGlk
bGUtZG9tYWluDQotICBJbiB0aGUgc2FtZSBjbGFzcyBwcmlvcml0aWVzIGFyZSBhc3NpZ25lZCBh
cyBmb2xsb3dpbmc6DQotICAgRURGOiBlYXJseSBkZWFkbGluZSA+IGxhdGUgZGVhZGxpbmUNCi0g
ICBMMCBleHRyYS10aW1lOiBsb3dlciBzY29yZSA+IGhpZ2hlciBzY29yZSovDQorLyogQ29tcGFy
ZXMgdHdvIGRvbWFpbnMgaW4gdGhlIHJlbGF0aW9uIG9mIHdoZXRoZXIgdGhlIG9uZSBpcyBhbGxv
d2VkIHRvDQorICogaW50ZXJydXB0IHRoZSBvdGhlcnMgZXhlY3V0aW9uLg0KKyAqIEl0IHJldHVy
bnMgdHJ1ZSAoIT0wKSBpZiBhIHN3aXRjaCB0byB0aGUgb3RoZXIgZG9tYWluIGlzIGdvb2QuDQor
ICogQ3VycmVudCBQcmlvcml0eSBzY2hlbWUgaXMgYXMgZm9sbG93czoNCisgKiAgRURGID4gTDAg
KHBlbmFsdHkgYmFzZWQpIGV4dHJhLXRpbWUgPiANCisgKiAgTDEgKHV0aWxpemF0aW9uKSBleHRy
YS10aW1lID4gaWRsZS1kb21haW4NCisgKiBJbiB0aGUgc2FtZSBjbGFzcyBwcmlvcml0aWVzIGFy
ZSBhc3NpZ25lZCBhcyBmb2xsb3dpbmc6DQorICogIEVERjogZWFybHkgZGVhZGxpbmUgPiBsYXRl
IGRlYWRsaW5lDQorICogIEwwIGV4dHJhLXRpbWU6IGxvd2VyIHNjb3JlID4gaGlnaGVyIHNjb3Jl
DQorICovDQogc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX3N3aXRjaChzdHJ1Y3QgdmNwdSAqY3Vy
LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZjcHUgKm90aGVyLA0K
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc190aW1lX3Qgbm93KQ0KQEAgLTEwNjMs
MTkgKzEwMTEsMTkgQEAgc3RhdGljIGlubGluZSBpbnQgc2hvdWxkX3N3aXRjaChzdHJ1Y3Qgdg0K
ICAgICBjdXJfaW5mICAgPSBFRE9NX0lORk8oY3VyKTsNCiAgICAgb3RoZXJfaW5mID0gRURPTV9J
TkZPKG90aGVyKTsNCiAgDQotICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBtYWtlIGFu
IGVhcmxpZXIgc2NoZWR1bGluZyBkZWNpc2lvbi4gKi8NCisgICAgLyogQ2hlY2sgd2hldGhlciB3
ZSBuZWVkIHRvIG1ha2UgYW4gZWFybGllciBzY2hlZHVsaW5nIGRlY2lzaW9uICovDQogICAgIGlm
ICggUEVSSU9EX0JFR0lOKG90aGVyX2luZikgPCANCiAgICAgICAgICBDUFVfSU5GTyhvdGhlci0+
cHJvY2Vzc29yKS0+Y3VycmVudF9zbGljZV9leHBpcmVzICkNCiAgICAgICAgIHJldHVybiAxOw0K
IA0KLSAgICAvKiBObyB0aW1pbmctYmFzZWQgc3dpdGNoZXMgbmVlZCB0byBiZSB0YWtlbiBpbnRv
IGFjY291bnQgaGVyZS4gKi8NCisgICAgLyogTm8gdGltaW5nLWJhc2VkIHN3aXRjaGVzIG5lZWQg
dG8gYmUgdGFrZW4gaW50byBhY2NvdW50IGhlcmUgKi8NCiAgICAgc3dpdGNoICggZ2V0X3J1bl90
eXBlKGN1cikgKQ0KICAgICB7DQogICAgIGNhc2UgRE9NQUlOX0VERjoNCi0gICAgICAgIC8qIERv
IG5vdCBpbnRlcnJ1cHQgYSBydW5uaW5nIEVERiBkb21haW4uICovDQorICAgICAgICAvKiBEbyBu
b3QgaW50ZXJydXB0IGEgcnVubmluZyBFREYgZG9tYWluICovDQogICAgICAgICByZXR1cm4gMDsN
CiAgICAgY2FzZSBET01BSU5fRVhUUkFfUEVOOg0KLSAgICAgICAgLyogQ2hlY2sgd2hldGhlciB3
ZSBhbHNvIHdhbnQgdGhlIEwwIGV4LXEgd2l0aCBsb3dlciBzY29yZS4gKi8NCisgICAgICAgIC8q
IENoZWNrIHdoZXRoZXIgd2UgYWxzbyB3YW50IHRoZSBMMCBleC1xIHdpdGggbG93ZXIgc2NvcmUg
Ki8NCiAgICAgICAgIHJldHVybiAoKG90aGVyX2luZi0+c3RhdHVzICYgRVhUUkFfV0FOVF9QRU5f
USkgJiYNCiAgICAgICAgICAgICAgICAgKG90aGVyX2luZi0+c2NvcmVbRVhUUkFfUEVOX1FdIDwg
DQogICAgICAgICAgICAgICAgICBjdXJfaW5mLT5zY29yZVtFWFRSQV9QRU5fUV0pKTsNCkBAIC0x
MDk2LDE4ICsxMDQ0LDExIEBAIHN0YXRpYyB2b2lkIHNlZGZfd2FrZShjb25zdCBzdHJ1Y3Qgc2No
ZWQNCiAgICAgc190aW1lX3QgICAgICAgICAgICAgIG5vdyA9IE5PVygpOw0KICAgICBzdHJ1Y3Qg
c2VkZl92Y3B1X2luZm8qIGluZiA9IEVET01fSU5GTyhkKTsNCiANCi0gICAgUFJJTlQoMywgInNl
ZGZfd2FrZSB3YXMgY2FsbGVkLCBkb21haW4taWQgJWkuJWlcbiIsZC0+ZG9tYWluLT5kb21haW5f
aWQsDQotICAgICAgICAgIGQtPnZjcHVfaWQpOw0KLQ0KICAgICBpZiAoIHVubGlrZWx5KGlzX2lk
bGVfdmNwdShkKSkgKQ0KICAgICAgICAgcmV0dXJuOw0KICAgIA0KICAgICBpZiAoIHVubGlrZWx5
KF9fdGFza19vbl9xdWV1ZShkKSkgKQ0KLSAgICB7DQotICAgICAgICBQUklOVCgzLCJcdGRvbWFp
biAlaS4laSBpcyBhbHJlYWR5IGluIHNvbWUgcXVldWVcbiIsDQotICAgICAgICAgICAgICBkLT5k
b21haW4tPmRvbWFpbl9pZCwgZC0+dmNwdV9pZCk7DQogICAgICAgICByZXR1cm47DQotICAgIH0N
CiANCiAgICAgQVNTRVJUKCFzZWRmX3J1bm5hYmxlKGQpKTsNCiAgICAgaW5mLT5zdGF0dXMgJj0g
flNFREZfQVNMRUVQOw0KQEAgLTExMTYsMjggKzEwNTcsMjQgQEAgc3RhdGljIHZvaWQgc2VkZl93
YWtlKGNvbnN0IHN0cnVjdCBzY2hlZA0KICANCiAgICAgaWYgKCB1bmxpa2VseShpbmYtPmRlYWRs
X2FicyA9PSAwKSApDQogICAgIHsNCi0gICAgICAgIC8qaW5pdGlhbCBzZXR1cCBvZiB0aGUgZGVh
ZGxpbmUqLw0KKyAgICAgICAgLyogSW5pdGlhbCBzZXR1cCBvZiB0aGUgZGVhZGxpbmUgKi8NCiAg
ICAgICAgIGluZi0+ZGVhZGxfYWJzID0gbm93ICsgaW5mLT5zbGljZTsNCiAgICAgfQ0KICAgDQot
ICAgIFBSSU5UKDMsICJ3YWtpbmcgdXAgZG9tYWluICVpLiVpIChkZWFkbD0gJSJQUkl1NjQiIHBl
cmlvZD0gJSJQUkl1NjQNCi0gICAgICAgICAgIm5vdz0gJSJQUkl1NjQiKVxuIiwNCi0gICAgICAg
ICAgZC0+ZG9tYWluLT5kb21haW5faWQsIGQtPnZjcHVfaWQsIGluZi0+ZGVhZGxfYWJzLCBpbmYt
PnBlcmlvZCwgbm93KTsNCi0NCiAjaWZkZWYgU0VERl9TVEFUUyANCiAgICAgaW5mLT5ibG9ja190
b3QrKzsNCiAjZW5kaWYNCiANCiAgICAgaWYgKCB1bmxpa2VseShub3cgPCBQRVJJT0RfQkVHSU4o
aW5mKSkgKQ0KICAgICB7DQotICAgICAgICBQUklOVCg0LCJleHRyYXRpbWUgdW5ibG9ja1xuIik7
DQotICAgICAgICAvKiB1bmJsb2NraW5nIGluIGV4dHJhLXRpbWUhICovDQorICAgICAgICAvKiBV
bmJsb2NraW5nIGluIGV4dHJhLXRpbWUhICovDQogICAgICAgICBpZiAoIGluZi0+c3RhdHVzICYg
RVhUUkFfV0FOVF9QRU5fUSApDQogICAgICAgICB7DQotICAgICAgICAgICAgLyp3ZSBoYXZlIGEg
ZG9tYWluIHRoYXQgd2FudHMgY29tcGVuc2F0aW9uDQotICAgICAgICAgICAgICBmb3IgYmxvY2sg
cGVuYWx0eSBhbmQgZGlkIGp1c3QgYmxvY2sgaW4NCi0gICAgICAgICAgICAgIGl0cyBjb21wZW5z
YXRpb24gdGltZS4gR2l2ZSBpdCBhbm90aGVyDQotICAgICAgICAgICAgICBjaGFuY2UhKi8NCisg
ICAgICAgICAgICAvKiBXZSBoYXZlIGEgZG9tYWluIHRoYXQgd2FudHMgY29tcGVuc2F0aW9uDQor
ICAgICAgICAgICAgICogZm9yIGJsb2NrIHBlbmFsdHkgYW5kIGRpZCBqdXN0IGJsb2NrIGluDQor
ICAgICAgICAgICAgICogaXRzIGNvbXBlbnNhdGlvbiB0aW1lLiBHaXZlIGl0IGFub3RoZXINCisg
ICAgICAgICAgICAgKiBjaGFuY2UhDQorICAgICAgICAgICAgICovDQogICAgICAgICAgICAgZXh0
cmFxX2FkZF9zb3J0X3VwZGF0ZShkLCBFWFRSQV9QRU5fUSwgMCk7DQogICAgICAgICB9DQogICAg
ICAgICBleHRyYXFfY2hlY2tfYWRkX3VuYmxvY2tlZChkLCAwKTsNCkBAIC0xMTQ2LDggKzEwODMs
NyBAQCBzdGF0aWMgdm9pZCBzZWRmX3dha2UoY29uc3Qgc3RydWN0IHNjaGVkDQogICAgIHsgIA0K
ICAgICAgICAgaWYgKCBub3cgPCBpbmYtPmRlYWRsX2FicyApDQogICAgICAgICB7DQotICAgICAg
ICAgICAgUFJJTlQoNCwic2hvcnQgdW5ibG9ja2luZ1xuIik7DQotICAgICAgICAgICAgLypzaG9y
dCBibG9ja2luZyovDQorICAgICAgICAgICAgLyogU2hvcnQgYmxvY2tpbmcgKi8NCiAjaWZkZWYg
U0VERl9TVEFUUw0KICAgICAgICAgICAgIGluZi0+c2hvcnRfYmxvY2tfdG90Kys7DQogI2VuZGlm
DQpAQCAtMTE1Nyw4ICsxMDkzLDcgQEAgc3RhdGljIHZvaWQgc2VkZl93YWtlKGNvbnN0IHN0cnVj
dCBzY2hlZA0KICAgICAgICAgfQ0KICAgICAgICAgZWxzZQ0KICAgICAgICAgew0KLSAgICAgICAg
ICAgIFBSSU5UKDQsImxvbmcgdW5ibG9ja2luZ1xuIik7DQotICAgICAgICAgICAgLypsb25nIHVu
YmxvY2tpbmcqLw0KKyAgICAgICAgICAgIC8qIExvbmcgdW5ibG9ja2luZyAqLw0KICNpZmRlZiBT
RURGX1NUQVRTDQogICAgICAgICAgICAgaW5mLT5sb25nX2Jsb2NrX3RvdCsrOw0KICNlbmRpZg0K
QEAgLTExNjgsMjQgKzExMDMsMTMgQEAgc3RhdGljIHZvaWQgc2VkZl93YWtlKGNvbnN0IHN0cnVj
dCBzY2hlZA0KICAgICAgICAgfQ0KICAgICB9DQogDQotICAgIFBSSU5UKDMsICJ3b2tlIHVwIGRv
bWFpbiAlaS4laSAoZGVhZGw9ICUiUFJJdTY0IiBwZXJpb2Q9ICUiUFJJdTY0DQotICAgICAgICAg
ICJub3c9ICUiUFJJdTY0IilcbiIsDQotICAgICAgICAgIGQtPmRvbWFpbi0+ZG9tYWluX2lkLCBk
LT52Y3B1X2lkLCBpbmYtPmRlYWRsX2FicywNCi0gICAgICAgICAgaW5mLT5wZXJpb2QsIG5vdyk7
DQotDQogICAgIGlmICggUEVSSU9EX0JFR0lOKGluZikgPiBub3cgKQ0KLSAgICB7DQogICAgICAg
ICBfX2FkZF90b193YWl0cXVldWVfc29ydChkKTsNCi0gICAgICAgIFBSSU5UKDMsImFkZGVkIHRv
IHdhaXRxXG4iKTsNCi0gICAgfQ0KICAgICBlbHNlDQotICAgIHsNCiAgICAgICAgIF9fYWRkX3Rv
X3J1bnF1ZXVlX3NvcnQoZCk7DQotICAgICAgICBQUklOVCgzLCJhZGRlZCB0byBydW5xXG4iKTsN
Ci0gICAgfQ0KICANCiAjaWZkZWYgU0VERl9TVEFUUw0KLSAgICAvKmRvIHNvbWUgc3RhdGlzdGlj
cyBoZXJlLi4uKi8NCisgICAgLyogRG8gc29tZSBzdGF0aXN0aWNzIGhlcmUuLi4gKi8NCiAgICAg
aWYgKCBpbmYtPmJsb2NrX2FicyAhPSAwICkNCiAgICAgew0KICAgICAgICAgaW5mLT5ibG9ja190
aW1lX3RvdCArPSBub3cgLSBpbmYtPmJsb2NrX2FiczsNCkBAIC0xMTk0LDEyICsxMTE4LDEzIEBA
IHN0YXRpYyB2b2lkIHNlZGZfd2FrZShjb25zdCBzdHJ1Y3Qgc2NoZWQNCiAgICAgfQ0KICNlbmRp
Zg0KIA0KLSAgICAvKnNhbml0eSBjaGVjazogbWFrZSBzdXJlIGVhY2ggZXh0cmEtYXdhcmUgZG9t
YWluIElTIG9uIHRoZSB1dGlsLXEhKi8NCisgICAgLyogU2FuaXR5IGNoZWNrOiBtYWtlIHN1cmUg
ZWFjaCBleHRyYS1hd2FyZSBkb21haW4gSVMgb24gdGhlIHV0aWwtcSEgKi8NCiAgICAgQVNTRVJU
KElNUExZKGluZi0+c3RhdHVzICYgRVhUUkFfQVdBUkUsIGV4dHJhcV9vbihkLCBFWFRSQV9VVElM
X1EpKSk7DQogICAgIEFTU0VSVChfX3Rhc2tfb25fcXVldWUoZCkpOw0KLSAgICAvKmNoZWNrIHdo
ZXRoZXIgdGhlIGF3YWtlbmVkIHRhc2sgbmVlZHMgdG8gaW52b2tlIHRoZSBkb19zY2hlZHVsZQ0K
LSAgICAgIHJvdXRpbmUuIFRyeSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBydW5zIGJ1dDoNCi0gICAg
ICBTYXZlIGFwcHJveGltYXRpb246IEFsd2F5cyBzd2l0Y2ggdG8gc2NoZWR1bGVyISovDQorICAg
IC8qIENoZWNrIHdoZXRoZXIgdGhlIGF3YWtlbmVkIHRhc2sgbmVlZHMgdG8gaW52b2tlIHRoZSBk
b19zY2hlZHVsZQ0KKyAgICAgKiByb3V0aW5lLiBUcnkgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcnVu
cyBidXQ6DQorICAgICAqIFNhdmUgYXBwcm94aW1hdGlvbjogQWx3YXlzIHN3aXRjaCB0byBzY2hl
ZHVsZXIhDQorICAgICAqLw0KICAgICBBU1NFUlQoZC0+cHJvY2Vzc29yID49IDApOw0KICAgICBB
U1NFUlQoZC0+cHJvY2Vzc29yIDwgbnJfY3B1X2lkcyk7DQogICAgIEFTU0VSVChwZXJfY3B1KHNj
aGVkdWxlX2RhdGEsIGQtPnByb2Nlc3NvcikuY3Vycik7DQpAQCAtMTI0NCw3ICsxMTY5LDcgQEAg
c3RhdGljIHZvaWQgc2VkZl9kdW1wX2RvbWFpbihzdHJ1Y3QgdmNwdQ0KIH0NCiANCiANCi0vKiBk
dW1wcyBhbGwgZG9tYWlucyBvbiB0aGUgc3BlY2lmaWVkIGNwdSAqLw0KKy8qIER1bXBzIGFsbCBk
b21haW5zIG9uIHRoZSBzcGVjaWZpZWQgY3B1ICovDQogc3RhdGljIHZvaWQgc2VkZl9kdW1wX2Nw
dV9zdGF0ZShjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIGludCBpKQ0KIHsNCiAgICAgc3Ry
dWN0IGxpc3RfaGVhZCAgICAgICpsaXN0LCAqcXVldWUsICp0bXA7DQpAQCAtMTMxOSw3ICsxMjQ0
LDcgQEAgc3RhdGljIHZvaWQgc2VkZl9kdW1wX2NwdV9zdGF0ZShjb25zdCBzdA0KIH0NCiANCiAN
Ci0vKiBBZGp1c3RzIHBlcmlvZHMgYW5kIHNsaWNlcyBvZiB0aGUgZG9tYWlucyBhY2NvcmRpbmds
eSB0byB0aGVpciB3ZWlnaHRzLiAqLw0KKy8qIEFkanVzdHMgcGVyaW9kcyBhbmQgc2xpY2VzIG9m
IHRoZSBkb21haW5zIGFjY29yZGluZ2x5IHRvIHRoZWlyIHdlaWdodHMgKi8NCiBzdGF0aWMgaW50
IHNlZGZfYWRqdXN0X3dlaWdodHMoc3RydWN0IGNwdXBvb2wgKmMsIHN0cnVjdCB4ZW5fZG9tY3Rs
X3NjaGVkdWxlcl9vcCAqY21kKQ0KIHsNCiAgICAgc3RydWN0IHZjcHUgKnA7DQpAQCAtMTMzNSw3
ICsxMjYwLDcgQEAgc3RhdGljIGludCBzZWRmX2FkanVzdF93ZWlnaHRzKHN0cnVjdCBjcA0KICAg
ICAgICAgcmV0dXJuIC1FTk9NRU07DQogICAgIH0NCiANCi0gICAgLyogU3VtIGFjcm9zcyBhbGwg
d2VpZ2h0cy4gKi8NCisgICAgLyogU3VtIGFjcm9zcyBhbGwgd2VpZ2h0cyAqLw0KICAgICByY3Vf
cmVhZF9sb2NrKCZkb21saXN0X3JlYWRfbG9jayk7DQogICAgIGZvcl9lYWNoX2RvbWFpbl9pbl9j
cHVwb29sKCBkLCBjICkNCiAgICAgew0KQEAgLTEzNTAsMTEgKzEyNzUsMTMgQEAgc3RhdGljIGlu
dCBzZWRmX2FkanVzdF93ZWlnaHRzKHN0cnVjdCBjcA0KICAgICAgICAgICAgIH0NCiAgICAgICAg
ICAgICBlbHNlDQogICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvKmRvbid0IG1vZGlm
eSBkb21haW5zIHdobyBkb24ndCBoYXZlIGEgd2VpZ2h0LCBidXQgc3VtDQotICAgICAgICAgICAg
ICAgICAgdXAgdGhlIHRpbWUgdGhleSBuZWVkLCBwcm9qZWN0ZWQgdG8gYSBXRUlHSFRfUEVSSU9E
LA0KLSAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhpcyB0aW1lIGlzIG5vdCBnaXZlbiB0byB0
aGUgd2VpZ2h0LWRyaXZlbg0KLSAgICAgICAgICAgICAgICAgIGRvbWFpbnMqLw0KLSAgICAgICAg
ICAgICAgICAvKmNoZWNrIGZvciBvdmVyZmxvd3MqLw0KKyAgICAgICAgICAgICAgICAvKiBEb24n
dCBtb2RpZnkgZG9tYWlucyB3aG8gZG9uJ3QgaGF2ZSBhIHdlaWdodCwgYnV0IHN1bQ0KKyAgICAg
ICAgICAgICAgICAgKiB1cCB0aGUgdGltZSB0aGV5IG5lZWQsIHByb2plY3RlZCB0byBhIFdFSUdI
VF9QRVJJT0QsDQorICAgICAgICAgICAgICAgICAqIHNvIHRoYXQgdGhpcyB0aW1lIGlzIG5vdCBn
aXZlbiB0byB0aGUgd2VpZ2h0LWRyaXZlbg0KKyAgICAgICAgICAgICAgICAgKiAgZG9tYWlucw0K
KyAgICAgICAgICAgICAgICAgKi8NCisNCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIG92
ZXJmbG93cyAqLw0KICAgICAgICAgICAgICAgICBBU1NFUlQoKFdFSUdIVF9QRVJJT0QgPCBVTE9O
R19NQVgpIA0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgKEVET01fSU5GTyhwKS0+c2xpY2Vf
b3JpZyA8IFVMT05HX01BWCkpOw0KICAgICAgICAgICAgICAgICBzdW10W2NwdV0gKz0gDQpAQCAt
MTM2NSw3ICsxMjkyLDcgQEAgc3RhdGljIGludCBzZWRmX2FkanVzdF93ZWlnaHRzKHN0cnVjdCBj
cA0KICAgICB9DQogICAgIHJjdV9yZWFkX3VubG9jaygmZG9tbGlzdF9yZWFkX2xvY2spOw0KIA0K
LSAgICAvKiBBZGp1c3QgYWxsIHNsaWNlcyAoYW5kIHBlcmlvZHMpIHRvIHRoZSBuZXcgd2VpZ2h0
LiAqLw0KKyAgICAvKiBBZGp1c3QgYWxsIHNsaWNlcyAoYW5kIHBlcmlvZHMpIHRvIHRoZSBuZXcg
d2VpZ2h0ICovDQogICAgIHJjdV9yZWFkX2xvY2soJmRvbWxpc3RfcmVhZF9sb2NrKTsNCiAgICAg
Zm9yX2VhY2hfZG9tYWluX2luX2NwdXBvb2woIGQsIGMgKQ0KICAgICB7DQpAQCAtMTM5MywyMCAr
MTMyMCwxNSBAQCBzdGF0aWMgaW50IHNlZGZfYWRqdXN0X3dlaWdodHMoc3RydWN0IGNwDQogfQ0K
IA0KIA0KLS8qIHNldCBvciBmZXRjaCBkb21haW4gc2NoZWR1bGluZyBwYXJhbWV0ZXJzICovDQor
LyogU2V0IG9yIGZldGNoIGRvbWFpbiBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgKi8NCiBzdGF0aWMg
aW50IHNlZGZfYWRqdXN0KGNvbnN0IHN0cnVjdCBzY2hlZHVsZXIgKm9wcywgc3RydWN0IGRvbWFp
biAqcCwgc3RydWN0IHhlbl9kb21jdGxfc2NoZWR1bGVyX29wICpvcCkNCiB7DQogICAgIHN0cnVj
dCB2Y3B1ICp2Ow0KICAgICBpbnQgcmM7DQogDQotICAgIFBSSU5UKDIsInNlZGZfYWRqdXN0IHdh
cyBjYWxsZWQsIGRvbWFpbi1pZCAlaSBuZXcgcGVyaW9kICUiUFJJdTY0IiAiDQotICAgICAgICAg
ICJuZXcgc2xpY2UgJSJQUkl1NjQiXG5sYXRlbmN5ICUiUFJJdTY0IiBleHRyYTolc1xuIiwNCi0g
ICAgICAgICAgcC0+ZG9tYWluX2lkLCBvcC0+dS5zZWRmLnBlcmlvZCwgb3AtPnUuc2VkZi5zbGlj
ZSwNCi0gICAgICAgICAgb3AtPnUuc2VkZi5sYXRlbmN5LCAob3AtPnUuc2VkZi5leHRyYXRpbWUp
PyJ5ZXMiOiJubyIpOw0KLQ0KICAgICBpZiAoIG9wLT5jbWQgPT0gWEVOX0RPTUNUTF9TQ0hFRE9Q
X3B1dGluZm8gKQ0KICAgICB7DQotICAgICAgICAvKiBDaGVjayBmb3Igc2FuZSBwYXJhbWV0ZXJz
LiAqLw0KKyAgICAgICAgLyogQ2hlY2sgZm9yIHNhbmUgcGFyYW1ldGVycyAqLw0KICAgICAgICAg
aWYgKCAhb3AtPnUuc2VkZi5wZXJpb2QgJiYgIW9wLT51LnNlZGYud2VpZ2h0ICkNCiAgICAgICAg
ICAgICByZXR1cm4gLUVJTlZBTDsNCiAgICAgICAgIGlmICggb3AtPnUuc2VkZi53ZWlnaHQgKQ0K
QEAgLTE0MTQsNyArMTMzNiw3IEBAIHN0YXRpYyBpbnQgc2VkZl9hZGp1c3QoY29uc3Qgc3RydWN0
IHNjaGUNCiAgICAgICAgICAgICBpZiAoIChvcC0+dS5zZWRmLmV4dHJhdGltZSAmIEVYVFJBX0FX
QVJFKSAmJg0KICAgICAgICAgICAgICAgICAgKCFvcC0+dS5zZWRmLnBlcmlvZCkgKQ0KICAgICAg
ICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLyogV2VpZ2h0LWRyaXZlbiBkb21haW5zIHdpdGgg
ZXh0cmF0aW1lIG9ubHkuICovDQorICAgICAgICAgICAgICAgIC8qIFdlaWdodC1kcml2ZW4gZG9t
YWlucyB3aXRoIGV4dHJhdGltZSBvbmx5ICovDQogICAgICAgICAgICAgICAgIGZvcl9lYWNoX3Zj
cHUgKCBwLCB2ICkNCiAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgRURP
TV9JTkZPKHYpLT5leHRyYXdlaWdodCA9IG9wLT51LnNlZGYud2VpZ2h0Ow0KQEAgLTE0MjUsNyAr
MTM0Nyw3IEBAIHN0YXRpYyBpbnQgc2VkZl9hZGp1c3QoY29uc3Qgc3RydWN0IHNjaGUNCiAgICAg
ICAgICAgICB9DQogICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgIHsNCi0gICAgICAgICAg
ICAgICAgLyogV2VpZ2h0LWRyaXZlbiBkb21haW5zIHdpdGggcmVhbC10aW1lIGV4ZWN1dGlvbi4g
Ki8NCisgICAgICAgICAgICAgICAgLyogV2VpZ2h0LWRyaXZlbiBkb21haW5zIHdpdGggcmVhbC10
aW1lIGV4ZWN1dGlvbiAqLw0KICAgICAgICAgICAgICAgICBmb3JfZWFjaF92Y3B1ICggcCwgdiAp
DQogICAgICAgICAgICAgICAgICAgICBFRE9NX0lORk8odiktPndlaWdodCA9IG9wLT51LnNlZGYu
d2VpZ2h0Ow0KICAgICAgICAgICAgIH0NCkBAIC0xNDM1LDggKzEzNTcsNyBAQCBzdGF0aWMgaW50
IHNlZGZfYWRqdXN0KGNvbnN0IHN0cnVjdCBzY2hlDQogICAgICAgICAgICAgLyogVGltZS1kcml2
ZW4gZG9tYWlucy4gKi8NCiAgICAgICAgICAgICBmb3JfZWFjaF92Y3B1ICggcCwgdiApDQogICAg
ICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvKg0KLSAgICAgICAgICAgICAgICAgKiBTYW5p
dHkgY2hlY2tpbmc6IG5vdGUgdGhhdCBkaXNhYmxpbmcgZXh0cmEgd2VpZ2h0IHJlcXVpcmVzDQor
ICAgICAgICAgICAgICAgIC8qIFNhbml0eSBjaGVja2luZzogbm90ZSB0aGF0IGRpc2FibGluZyBl
eHRyYSB3ZWlnaHQgcmVxdWlyZXMNCiAgICAgICAgICAgICAgICAgICogdGhhdCB3ZSBzZXQgYSBu
b24temVybyBzbGljZS4NCiAgICAgICAgICAgICAgICAgICovDQogICAgICAgICAgICAgICAgIGlm
ICggKG9wLT51LnNlZGYucGVyaW9kID4gUEVSSU9EX01BWCkgfHwNCkBAIC0xNDc3LDcgKzEzOTgs
NiBAQCBzdGF0aWMgaW50IHNlZGZfYWRqdXN0KGNvbnN0IHN0cnVjdCBzY2hlDQogICAgICAgICBv
cC0+dS5zZWRmLndlaWdodCAgICA9IEVET01fSU5GTyhwLT52Y3B1WzBdKS0+d2VpZ2h0Ow0KICAg
ICB9DQogDQotICAgIFBSSU5UKDIsInNlZGZfYWRqdXN0X2ZpbmlzaGVkXG4iKTsNCiAgICAgcmV0
dXJuIDA7DQogfQ0KIA0K


--=-SQC3wUYrGGqGq8T7E3BQ--

--=-ByODJfHW+wcj4VSHJBM9
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk7xk7cACgkQk4XaBE3IOsTscACfeUsCDNw37zRR1IfIwxPK5lKK
/10An06jJC22XSm/UKSek9Fh+w8ihcr8
=7Rxx
-----END PGP SIGNATURE-----

--=-ByODJfHW+wcj4VSHJBM9--



--===============7346677379948124988==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============7346677379948124988==--



From xen-devel-bounces@lists.xensource.com Wed Dec 21 16:04:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 21 Dec 2011 16:04:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RdOe8-000192-1r; Wed, 21 Dec 2011 16:04:00 +0000
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xen.org with smtp (Exim 4.72)
	(envelope-from <raistlin@linux.it>) id 1RdOe6-00018l-8C
	for xen-devel@lists.xensource.com; Wed, 21 Dec 2011 16:03:59 +0000
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-13.tower-27.messagelabs.com!1324483403!53094887!1
X-Originating-IP: [193.205.80.99]
X-SpamReason: No, hits=1.1 required=7.0 tests=BODY_RANDOM_LONG,DIET_1
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10443 invoked from network); 21 Dec 2011 16:03:24 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-13.tower-27.messagelabs.com with SMTP;
	21 Dec 2011 16:03:24 -0000
Received: from [83.211.178.94] (account d.faggioli@sssup.it HELO
	[192.168.0.20]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 74086552; Wed, 21 Dec 2011 17:03:46 +0100
Message-ID: <1324483425.4366.43.camel@Abyss>
From: Dario Faggioli <raistlin@linux.it>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Wed, 21 Dec 2011 17:03:45 +0100
Face: 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
X-Mailer: Evolution 3.2.2 (3.2.2-1.fc16) 
Mime-Version: 1.0
Cc: George Dunlap <George.Dunlap@eu.citrix.com>, Keir Fraser <keir@xen.org>
Subject: [Xen-devel] [PATCHv2] sedf: remove useless tracing printk and
 harmonize comments style.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============2284887627372470128=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============2284887627372470128==
Content-Type: multipart/signed; micalg="pgp-sha1"; protocol="application/pgp-signature";
	boundary="=-oVXZhmqkWYbyP3+4MWM6"


--=-oVXZhmqkWYbyP3+4MWM6
Content-Type: multipart/mixed; boundary="=-DM3xwBkUsBWsFUckworM"


--=-DM3xwBkUsBWsFUckworM
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

sched_sedf.c used o have its own mechanism for producing tracing-alike
kind of information (domain block, wakeup, etc.). Nowadays, with an even
not so high number of pCPUs/vCPUs, just trying to enable this makes
the serial console completely unusable, produces tons of very hard to
parse and interpreet logging and can easily livelock Dom0. Moreover,
pretty much the same result this is struggling to get to, is better
achieved by enabling the scheduler-related tracing events, as
it is for the other schedulers (say, credit or credit2).

For all these reasons, this removes that machinery completely. While at
it, check in some cosmetics that harmonize the comments withim themself
and with the rest of the code base.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>

diff -r 51045a5ec6bc xen/common/sched_sedf.c
--- a/xen/common/sched_sedf.c	Wed Dec 21 14:49:01 2011 +0000
+++ b/xen/common/sched_sedf.c	Wed Dec 21 15:12:07 2011 +0000
@@ -13,14 +13,6 @@
 #include <xen/time.h>
 #include <xen/errno.h>
=20
-/*verbosity settings*/
-#define SEDFLEVEL 0
-#define PRINT(_f, _a...)                        \
-    do {                                        \
-        if ( (_f) <=3D SEDFLEVEL )                \
-            printk(_a );                        \
-    } while ( 0 )
-
 #define SEDF_CPUONLINE(_pool)                                             =
\
     (((_pool) =3D=3D NULL) ? &cpupool_free_cpus : (_pool)->cpu_valid)
=20
@@ -66,34 +58,35 @@ struct sedf_vcpu_info {
     struct list_head list;
     struct list_head extralist[2];
 =20
-    /*Parameters for EDF*/
-    s_time_t  period;  /*=3D(relative deadline)*/
-    s_time_t  slice;  /*=3Dworst case execution time*/
+    /* Parameters for EDF */
+    s_time_t  period;  /* =3D(relative deadline) */
+    s_time_t  slice;   /* =3Dworst case execution time */
 =20
-    /*Advaced Parameters*/
-    /*Latency Scaling*/
+    /* Advaced Parameters */
+
+    /* Latency Scaling */
     s_time_t  period_orig;
     s_time_t  slice_orig;
     s_time_t  latency;
 =20
-    /*status of domain*/
+    /* Status of domain */
     int       status;
-    /*weights for "Scheduling for beginners/ lazy/ etc." ;)*/
+    /* Weights for "Scheduling for beginners/ lazy/ etc." ;) */
     short     weight;
     short     extraweight;
-    /*Bookkeeping*/
+    /* Bookkeeping */
     s_time_t  deadl_abs;
     s_time_t  sched_start_abs;
     s_time_t  cputime;
-    /* times the domain un-/blocked */
+    /* Times the domain un-/blocked */
     s_time_t  block_abs;
     s_time_t  unblock_abs;
 =20
-    /*scores for {util, block penalty}-weighted extratime distribution*/
+    /* Scores for {util, block penalty}-weighted extratime distribution */
     int   score[2];
     s_time_t  short_block_lost_tot;
 =20
-    /*Statistics*/
+    /* Statistics */
     s_time_t  extra_time_tot;
=20
 #ifdef SEDF_STATS
@@ -158,18 +151,17 @@ static inline void extraq_del(struct vcp
 {
     struct list_head *list =3D EXTRALIST(d,i);
     ASSERT(extraq_on(d,i));
-    PRINT(3, "Removing domain %i.%i from L%i extraq\n",
-          d->domain->domain_id, d->vcpu_id, i);
     list_del(list);
     list->next =3D NULL;
     ASSERT(!extraq_on(d, i));
 }
=20
-/* adds a domain to the queue of processes which are aware of extra time. =
List
-   is sorted by score, where a lower score means higher priority for an ex=
tra
-   slice. It also updates the score, by simply subtracting a fixed value f=
rom
-   each entry, in order to avoid overflow. The algorithm works by simply
-   charging each domain that recieved extratime with an inverse of its wei=
ght.
+/*
+ * Adds a domain to the queue of processes which are aware of extra time. =
List
+ * is sorted by score, where a lower score means higher priority for an ex=
tra
+ * slice. It also updates the score, by simply subtracting a fixed value f=
rom
+ * each entry, in order to avoid overflow. The algorithm works by simply
+ * charging each domain that recieved extratime with an inverse of its wei=
ght.
  */=20
 static inline void extraq_add_sort_update(struct vcpu *d, int i, int sub)
 {
@@ -178,11 +170,6 @@ static inline void extraq_add_sort_updat
 =20
     ASSERT(!extraq_on(d,i));
=20
-    PRINT(3, "Adding domain %i.%i (score=3D %i, short_pen=3D %"PRIi64")"
-          " to L%i extraq\n",
-          d->domain->domain_id, d->vcpu_id, EDOM_INFO(d)->score[i],
-          EDOM_INFO(d)->short_block_lost_tot, i);
-
     /*
      * Iterate through all elements to find our "hole" and on our way
      * update all the other scores.
@@ -193,25 +180,18 @@ static inline void extraq_add_sort_updat
         curinf->score[i] -=3D sub;
         if ( EDOM_INFO(d)->score[i] < curinf->score[i] )
             break;
-        PRINT(4,"\tbehind domain %i.%i (score=3D %i)\n",
-              curinf->vcpu->domain->domain_id,
-              curinf->vcpu->vcpu_id, curinf->score[i]);
     }
=20
-    /* cur now contains the element, before which we'll enqueue. */
-    PRINT(3, "\tlist_add to %p\n", cur->prev);
+    /* cur now contains the element, before which we'll enqueue */
     list_add(EXTRALIST(d,i),cur->prev);
 =20
-    /* Continue updating the extraq. */
+    /* Continue updating the extraq */
     if ( (cur !=3D EXTRAQ(d->processor,i)) && sub )
     {
         for ( cur =3D cur->next; cur !=3D EXTRAQ(d->processor,i); cur =3D =
cur->next )
         {
             curinf =3D list_entry(cur,struct sedf_vcpu_info, extralist[i])=
;
             curinf->score[i] -=3D sub;
-            PRINT(4, "\tupdating domain %i.%i (score=3D %u)\n",
-                  curinf->vcpu->domain->domain_id,=20
-                  curinf->vcpu->vcpu_id, curinf->score[i]);
         }
     }
=20
@@ -221,29 +201,14 @@ static inline void extraq_check(struct v
 {
     if ( extraq_on(d, EXTRA_UTIL_Q) )
     {
-        PRINT(2,"Dom %i.%i is on L1 extraQ\n",
-              d->domain->domain_id, d->vcpu_id);
-
         if ( !(EDOM_INFO(d)->status & EXTRA_AWARE) &&
              !extra_runs(EDOM_INFO(d)) )
-        {
             extraq_del(d, EXTRA_UTIL_Q);
-            PRINT(2,"Removed dom %i.%i from L1 extraQ\n",
-                  d->domain->domain_id, d->vcpu_id);
-        }
     }
     else
     {
-        PRINT(2, "Dom %i.%i is NOT on L1 extraQ\n",
-              d->domain->domain_id,
-              d->vcpu_id);
-
         if ( (EDOM_INFO(d)->status & EXTRA_AWARE) && sedf_runnable(d) )
-        {
             extraq_add_sort_update(d, EXTRA_UTIL_Q, 0);
-            PRINT(2,"Added dom %i.%i to L1 extraQ\n",
-                  d->domain->domain_id, d->vcpu_id);
-        }
     }
 }
=20
@@ -252,7 +217,7 @@ static inline void extraq_check_add_unbl
     struct sedf_vcpu_info *inf =3D EDOM_INFO(d);
=20
     if ( inf->status & EXTRA_AWARE )
-        /* Put on the weighted extraq without updating any scores. */
+        /* Put on the weighted extraq without updating any scores */
         extraq_add_sort_update(d, EXTRA_UTIL_Q, 0);
 }
=20
@@ -265,8 +230,6 @@ static inline void __del_from_queue(stru
 {
     struct list_head *list =3D LIST(d);
     ASSERT(__task_on_queue(d));
-    PRINT(3,"Removing domain %i.%i (bop=3D %"PRIu64") from runq/waitq\n",
-          d->domain->domain_id, d->vcpu_id, PERIOD_BEGIN(EDOM_INFO(d)));
     list_del(list);
     list->next =3D NULL;
     ASSERT(!__task_on_queue(d));
@@ -279,13 +242,12 @@ static inline void list_insert_sort(
 {
     struct list_head     *cur;
=20
-    /* Iterate through all elements to find our "hole". */
+    /* Iterate through all elements to find our "hole" */
     list_for_each( cur, list )
         if ( comp(element, cur) < 0 )
             break;
=20
-    /* cur now contains the element, before which we'll enqueue. */
-    PRINT(3,"\tlist_add to %p\n",cur->prev);
+    /* cur now contains the element, before which we'll enqueue */
     list_add(element, cur->prev);
 }
=20
@@ -303,30 +265,28 @@ static int name##_comp(struct list_head*
         return 1;                                                       \
 }
=20
-/* adds a domain to the queue of processes which wait for the beginning of=
 the
-   next period; this list is therefore sortet by this time, which is simpl=
y
-   absol. deadline - period
+/*
+ * Adds a domain to the queue of processes which wait for the beginning of=
 the
+ * next period; this list is therefore sortet by this time, which is simpl=
y
+ * absol. deadline - period.
  */=20
 DOMAIN_COMPARER(waitq, list, PERIOD_BEGIN(d1), PERIOD_BEGIN(d2));
 static inline void __add_to_waitqueue_sort(struct vcpu *v)
 {
     ASSERT(!__task_on_queue(v));
-    PRINT(3,"Adding domain %i.%i (bop=3D %"PRIu64") to waitq\n",
-          v->domain->domain_id, v->vcpu_id, PERIOD_BEGIN(EDOM_INFO(v)));
     list_insert_sort(WAITQ(v->processor), LIST(v), waitq_comp);
     ASSERT(__task_on_queue(v));
 }
=20
-/* adds a domain to the queue of processes which have started their curren=
t
-   period and are runnable (i.e. not blocked, dieing,...). The first eleme=
nt
-   on this list is running on the processor, if the list is empty the idle
-   task will run. As we are implementing EDF, this list is sorted by deadl=
ines.
+/*
+ * Adds a domain to the queue of processes which have started their curren=
t
+ * period and are runnable (i.e. not blocked, dieing,...). The first eleme=
nt
+ * on this list is running on the processor, if the list is empty the idle
+ * task will run. As we are implementing EDF, this list is sorted by deadl=
ines.
  */=20
 DOMAIN_COMPARER(runq, list, d1->deadl_abs, d2->deadl_abs);
 static inline void __add_to_runqueue_sort(struct vcpu *v)
 {
-    PRINT(3,"Adding domain %i.%i (deadl=3D %"PRIu64") to runq\n",
-          v->domain->domain_id, v->vcpu_id, EDOM_INFO(v)->deadl_abs);
     list_insert_sort(RUNQ(v->processor), LIST(v), runq_comp);
 }
=20
@@ -453,10 +413,10 @@ static void desched_edf_dom(s_time_t now
 {
     struct sedf_vcpu_info* inf =3D EDOM_INFO(d);
=20
-    /* Current domain is running in real time mode. */
+    /* Current domain is running in real time mode */
     ASSERT(__task_on_queue(d));
=20
-    /* Update the domain's cputime. */
+    /* Update the domain's cputime */
     inf->cputime +=3D now - inf->sched_start_abs;
=20
     /*
@@ -467,7 +427,7 @@ static void desched_edf_dom(s_time_t now
         return;
  =20
     __del_from_queue(d);
- =20
+
     /*
      * Manage bookkeeping (i.e. calculate next deadline, memorise
      * overrun-time of slice) of finished domains.
@@ -478,30 +438,30 @@ static void desched_edf_dom(s_time_t now
  =20
         if ( inf->period < inf->period_orig )
         {
-            /* This domain runs in latency scaling or burst mode. */
+            /* This domain runs in latency scaling or burst mode */
             inf->period *=3D 2;
             inf->slice  *=3D 2;
             if ( (inf->period > inf->period_orig) ||
                  (inf->slice > inf->slice_orig) )
             {
-                /* Reset slice and period. */
+                /* Reset slice and period */
                 inf->period =3D inf->period_orig;
                 inf->slice =3D inf->slice_orig;
             }
         }
=20
-        /* Set next deadline. */
+        /* Set next deadline */
         inf->deadl_abs +=3D inf->period;
     }
 =20
-    /* Add a runnable domain to the waitqueue. */
+    /* Add a runnable domain to the waitqueue */
     if ( sedf_runnable(d) )
     {
         __add_to_waitqueue_sort(d);
     }
     else
     {
-        /* We have a blocked realtime task -> remove it from exqs too. */
+        /* We have a blocked realtime task -> remove it from exqs too */
         if ( extraq_on(d, EXTRA_PEN_Q) )
             extraq_del(d, EXTRA_PEN_Q);
         if ( extraq_on(d, EXTRA_UTIL_Q) )
@@ -521,8 +481,6 @@ static void update_queues(
     struct list_head     *cur, *tmp;
     struct sedf_vcpu_info *curinf;
 =20
-    PRINT(3,"Updating waitq..\n");
-
     /*
      * Check for the first elements of the waitqueue, whether their
      * next period has already started.
@@ -530,41 +488,32 @@ static void update_queues(
     list_for_each_safe ( cur, tmp, waitq )
     {
         curinf =3D list_entry(cur, struct sedf_vcpu_info, list);
-        PRINT(4,"\tLooking @ dom %i.%i\n",
-              curinf->vcpu->domain->domain_id, curinf->vcpu->vcpu_id);
         if ( PERIOD_BEGIN(curinf) > now )
             break;
         __del_from_queue(curinf->vcpu);
         __add_to_runqueue_sort(curinf->vcpu);
     }
 =20
-    PRINT(3,"Updating runq..\n");
-
-    /* Process the runq, find domains that are on the runq that shouldn't.=
 */
+    /* Process the runq, find domains that are on the runq that shouldn't =
*/
     list_for_each_safe ( cur, tmp, runq )
     {
         curinf =3D list_entry(cur,struct sedf_vcpu_info,list);
-        PRINT(4,"\tLooking @ dom %i.%i\n",
-              curinf->vcpu->domain->domain_id, curinf->vcpu->vcpu_id);
=20
         if ( unlikely(curinf->slice =3D=3D 0) )
         {
-            /* Ignore domains with empty slice. */
-            PRINT(4,"\tUpdating zero-slice domain %i.%i\n",
-                  curinf->vcpu->domain->domain_id,
-                  curinf->vcpu->vcpu_id);
+            /* Ignore domains with empty slice */
             __del_from_queue(curinf->vcpu);
=20
-            /* Move them to their next period. */
+            /* Move them to their next period */
             curinf->deadl_abs +=3D curinf->period;
=20
-            /* Ensure that the start of the next period is in the future. =
*/
+            /* Ensure that the start of the next period is in the future *=
/
             if ( unlikely(PERIOD_BEGIN(curinf) < now) )
                 curinf->deadl_abs +=3D=20
                     (DIV_UP(now - PERIOD_BEGIN(curinf),
                             curinf->period)) * curinf->period;
=20
-            /* Put them back into the queue. */
+            /* Put them back into the queue */
             __add_to_waitqueue_sort(curinf->vcpu);
         }
         else if ( unlikely((curinf->deadl_abs < now) ||
@@ -574,18 +523,18 @@ static void update_queues(
              * We missed the deadline or the slice was already finished.
              * Might hapen because of dom_adj.
              */
-            PRINT(4,"\tDomain %i.%i exceeded it's deadline/"
-                  "slice (%"PRIu64" / %"PRIu64") now: %"PRIu64
-                  " cputime: %"PRIu64"\n",
-                  curinf->vcpu->domain->domain_id,
-                  curinf->vcpu->vcpu_id,
-                  curinf->deadl_abs, curinf->slice, now,
-                  curinf->cputime);
+            printk("\tDomain %i.%i exceeded it's deadline/"
+                   "slice (%"PRIu64" / %"PRIu64") now: %"PRIu64
+                   " cputime: %"PRIu64"\n",
+                   curinf->vcpu->domain->domain_id,
+                   curinf->vcpu->vcpu_id,
+                   curinf->deadl_abs, curinf->slice, now,
+                   curinf->cputime);
             __del_from_queue(curinf->vcpu);
=20
-            /* Common case: we miss one period. */
+            /* Common case: we miss one period */
             curinf->deadl_abs +=3D curinf->period;
-  =20
+
             /*
              * If we are still behind: modulo arithmetic, force deadline
              * to be in future and aligned to period borders.
@@ -596,7 +545,7 @@ static void update_queues(
                            curinf->period) * curinf->period;
             ASSERT(curinf->deadl_abs >=3D now);
=20
-            /* Give a fresh slice. */
+            /* Give a fresh slice */
             curinf->cputime =3D 0;
             if ( PERIOD_BEGIN(curinf) > now )
                 __add_to_waitqueue_sort(curinf->vcpu);
@@ -606,17 +555,17 @@ static void update_queues(
         else
             break;
     }
-
-    PRINT(3,"done updating the queues\n");
 }
=20

-/* removes a domain from the head of the according extraQ and
-   requeues it at a specified position:
-     round-robin extratime: end of extraQ
-     weighted ext.: insert in sorted list by score
-   if the domain is blocked / has regained its short-block-loss
-   time it is not put on any queue */
+/*
+ * removes a domain from the head of the according extraQ and
+ * requeues it at a specified position:
+ *   round-robin extratime: end of extraQ
+ *   weighted ext.: insert in sorted list by score
+ * if the domain is blocked / has regained its short-block-loss
+ * time it is not put on any queue.
+ */
 static void desched_extra_dom(s_time_t now, struct vcpu *d)
 {
     struct sedf_vcpu_info *inf =3D EDOM_INFO(d);
@@ -625,29 +574,25 @@ static void desched_extra_dom(s_time_t n
=20
     ASSERT(extraq_on(d, i));
=20
-    /* Unset all running flags. */
+    /* Unset all running flags */
     inf->status  &=3D ~(EXTRA_RUN_PEN | EXTRA_RUN_UTIL);
-    /* Fresh slice for the next run. */
+    /* Fresh slice for the next run */
     inf->cputime =3D 0;
-    /* Accumulate total extratime. */
+    /* Accumulate total extratime */
     inf->extra_time_tot +=3D now - inf->sched_start_abs;
     /* Remove extradomain from head of the queue. */
     extraq_del(d, i);
=20
-    /* Update the score. */
+    /* Update the score */
     oldscore =3D inf->score[i];
     if ( i =3D=3D EXTRA_PEN_Q )
     {
-        /*domain was running in L0 extraq*/
-        /*reduce block lost, probably more sophistication here!*/
+        /* Domain was running in L0 extraq */
+        /* reduce block lost, probably more sophistication here!*/
         /*inf->short_block_lost_tot -=3D EXTRA_QUANTUM;*/
         inf->short_block_lost_tot -=3D now - inf->sched_start_abs;
-        PRINT(3,"Domain %i.%i: Short_block_loss: %"PRIi64"\n",=20
-              inf->vcpu->domain->domain_id, inf->vcpu->vcpu_id,
-              inf->short_block_lost_tot);
 #if 0
-        /*
-         * KAF: If we don't exit short-blocking state at this point
+        /* KAF: If we don't exit short-blocking state at this point
          * domain0 can steal all CPU for up to 10 seconds before
          * scheduling settles down (when competing against another
          * CPU-bound domain). Doing this seems to make things behave
@@ -656,51 +601,59 @@ static void desched_extra_dom(s_time_t n
         if ( inf->short_block_lost_tot <=3D 0 )
 #endif
         {
-            PRINT(4,"Domain %i.%i compensated short block loss!\n",
-                  inf->vcpu->domain->domain_id, inf->vcpu->vcpu_id);
-            /*we have (over-)compensated our block penalty*/
+            /* We have (over-)compensated our block penalty */
             inf->short_block_lost_tot =3D 0;
-            /*we don't want a place on the penalty queue anymore!*/
+            /* We don't want a place on the penalty queue anymore! */
             inf->status &=3D ~EXTRA_WANT_PEN_Q;
             goto check_extra_queues;
         }
=20
-        /*we have to go again for another try in the block-extraq,
-          the score is not used incremantally here, as this is
-          already done by recalculating the block_lost*/
+        /*
+         * We have to go again for another try in the block-extraq,
+         * the score is not used incremantally here, as this is
+         * already done by recalculating the block_lost
+         */
         inf->score[EXTRA_PEN_Q] =3D (inf->period << 10) /
             inf->short_block_lost_tot;
         oldscore =3D 0;
     }
     else
     {
-        /*domain was running in L1 extraq =3D> score is inverse of
-          utilization and is used somewhat incremental!*/
+        /*
+         * Domain was running in L1 extraq =3D> score is inverse of
+         * utilization and is used somewhat incremental!
+         */
         if ( !inf->extraweight )
-            /*NB: use fixed point arithmetic with 10 bits*/
+        {
+            /* NB: use fixed point arithmetic with 10 bits */
             inf->score[EXTRA_UTIL_Q] =3D (inf->period << 10) /
                 inf->slice;
+        }
         else
-            /*conversion between realtime utilisation and extrawieght:
-              full (ie 100%) utilization is equivalent to 128 extraweight*=
/
+        {
+            /*
+             * Conversion between realtime utilisation and extrawieght:
+             * full (ie 100%) utilization is equivalent to 128 extraweight
+             */
             inf->score[EXTRA_UTIL_Q] =3D (1<<17) / inf->extraweight;
+        }
     }
=20
  check_extra_queues:
-    /* Adding a runnable domain to the right queue and removing blocked on=
es*/
+    /* Adding a runnable domain to the right queue and removing blocked on=
es */
     if ( sedf_runnable(d) )
     {
-        /*add according to score: weighted round robin*/
+        /* Add according to score: weighted round robin */
         if (((inf->status & EXTRA_AWARE) && (i =3D=3D EXTRA_UTIL_Q)) ||
             ((inf->status & EXTRA_WANT_PEN_Q) && (i =3D=3D EXTRA_PEN_Q)))
             extraq_add_sort_update(d, i, oldscore);
     }
     else
     {
-        /*remove this blocked domain from the waitq!*/
+        /* Remove this blocked domain from the waitq! */
         __del_from_queue(d);
-        /*make sure that we remove a blocked domain from the other
-          extraq too*/
+        /* Make sure that we remove a blocked domain from the other
+         * extraq too. */
         if ( i =3D=3D EXTRA_PEN_Q )
         {
             if ( extraq_on(d, EXTRA_UTIL_Q) )
@@ -732,8 +685,10 @@ static struct task_slice sedf_do_extra_s
=20
     if ( !list_empty(extraq[EXTRA_PEN_Q]) )
     {
-        /*we still have elements on the level 0 extraq=20
-          =3D> let those run first!*/
+        /*
+         * We still have elements on the level 0 extraq
+         * =3D> let those run first!
+         */
         runinf   =3D list_entry(extraq[EXTRA_PEN_Q]->next,=20
                               struct sedf_vcpu_info, extralist[EXTRA_PEN_Q=
]);
         runinf->status |=3D EXTRA_RUN_PEN;
@@ -747,7 +702,7 @@ static struct task_slice sedf_do_extra_s
     {
         if ( !list_empty(extraq[EXTRA_UTIL_Q]) )
         {
-            /*use elements from the normal extraqueue*/
+            /* Use elements from the normal extraqueue */
             runinf   =3D list_entry(extraq[EXTRA_UTIL_Q]->next,
                                   struct sedf_vcpu_info,
                                   extralist[EXTRA_UTIL_Q]);
@@ -772,11 +727,13 @@ static struct task_slice sedf_do_extra_s
 }
=20

-/* Main scheduling function
-   Reasons for calling this function are:
-   -timeslice for the current period used up
-   -domain on waitqueue has started it's period
-   -and various others ;) in general: determine which domain to run next*/
+/*
+ * Main scheduling function
+ * Reasons for calling this function are:
+ * -timeslice for the current period used up
+ * -domain on waitqueue has started it's period
+ * -and various others ;) in general: determine which domain to run next
+ */
 static struct task_slice sedf_do_schedule(
     const struct scheduler *ops, s_time_t now, bool_t tasklet_work_schedul=
ed)
 {
@@ -789,13 +746,15 @@ static struct task_slice sedf_do_schedul
     struct sedf_vcpu_info *runinf, *waitinf;
     struct task_slice      ret;
=20
-    /*idle tasks don't need any of the following stuf*/
+    /* Idle tasks don't need any of the following stuf */
     if ( is_idle_vcpu(current) )
         goto check_waitq;
-=20
-    /* create local state of the status of the domain, in order to avoid
-       inconsistent state during scheduling decisions, because data for
-       vcpu_runnable is not protected by the scheduling lock!*/
+
+    /*
+     * Create local state of the status of the domain, in order to avoid
+     * inconsistent state during scheduling decisions, because data for
+     * vcpu_runnable is not protected by the scheduling lock!
+     */
     if ( !vcpu_runnable(current) )
         inf->status |=3D SEDF_ASLEEP;
 =20
@@ -804,7 +763,7 @@ static struct task_slice sedf_do_schedul
=20
     if ( unlikely(extra_runs(inf)) )
     {
-        /*special treatment of domains running in extra time*/
+        /* Special treatment of domains running in extra time */
         desched_extra_dom(now, current);
     }
     else=20
@@ -814,10 +773,12 @@ static struct task_slice sedf_do_schedul
  check_waitq:
     update_queues(now, runq, waitq);
=20
-    /*now simply pick the first domain from the runqueue, which has the
-      earliest deadline, because the list is sorted*/
-=20
-    /* Tasklet work (which runs in idle VCPU context) overrides all else. =
*/
+    /*
+     * Now simply pick the first domain from the runqueue, which has the
+     * earliest deadline, because the list is sorted
+     *
+     * Tasklet work (which runs in idle VCPU context) overrides all else.
+     */
     if ( tasklet_work_scheduled ||
          (list_empty(runq) && list_empty(waitq)) ||
          unlikely(!cpumask_test_cpu(cpu, SEDF_CPUONLINE(per_cpu(cpupool, c=
pu)))) )
@@ -833,9 +794,11 @@ static struct task_slice sedf_do_schedul
         {
             waitinf  =3D list_entry(waitq->next,
                                   struct sedf_vcpu_info,list);
-            /*rerun scheduler, when scheduled domain reaches it's
-              end of slice or the first domain from the waitqueue
-              gets ready*/
+            /*
+             * Rerun scheduler, when scheduled domain reaches it's
+             * end of slice or the first domain from the waitqueue
+             * gets ready.
+             */
             ret.time =3D MIN(now + runinf->slice - runinf->cputime,
                            PERIOD_BEGIN(waitinf)) - now;
         }
@@ -847,14 +810,18 @@ static struct task_slice sedf_do_schedul
     else
     {
         waitinf  =3D list_entry(waitq->next,struct sedf_vcpu_info, list);
-        /*we could not find any suitable domain=20
-          =3D> look for domains that are aware of extratime*/
+        /*
+         * We could not find any suitable domain=20
+         * =3D> look for domains that are aware of extratime
+         */
         ret =3D sedf_do_extra_schedule(now, PERIOD_BEGIN(waitinf),
                                      extraq, cpu);
     }
=20
-    /*TODO: Do something USEFUL when this happens and find out, why it
-      still can happen!!!*/
+    /*
+     * TODO: Do something USEFUL when this happens and find out, why it
+     * still can happen!!!
+     */
     if ( ret.time < 0)
     {
         printk("Ouch! We are seriously BEHIND schedule! %"PRIi64"\n",
@@ -874,9 +841,6 @@ static struct task_slice sedf_do_schedul
=20
 static void sedf_sleep(const struct scheduler *ops, struct vcpu *d)
 {
-    PRINT(2,"sedf_sleep was called, domain-id %i.%i\n",
-          d->domain->domain_id, d->vcpu_id);
-=20
     if ( is_idle_vcpu(d) )
         return;
=20
@@ -898,7 +862,8 @@ static void sedf_sleep(const struct sche
 }
=20

-/* This function wakes up a domain, i.e. moves them into the waitqueue
+/*
+ * This function wakes up a domain, i.e. moves them into the waitqueue
  * things to mention are: admission control is taking place nowhere at
  * the moment, so we can't be sure, whether it is safe to wake the domain
  * up at all. Anyway, even if it is safe (total cpu usage <=3D100%) there =
are
@@ -972,27 +937,31 @@ static void sedf_sleep(const struct sche
 static void unblock_short_extra_support(
     struct sedf_vcpu_info* inf, s_time_t now)
 {
-    /*this unblocking scheme tries to support the domain, by assigning it
-    a priority in extratime distribution according to the loss of time
-    in this slice due to blocking*/
+    /*
+     * This unblocking scheme tries to support the domain, by assigning it
+     * a priority in extratime distribution according to the loss of time
+     * in this slice due to blocking
+     */
     s_time_t pen;
 =20
-    /*no more realtime execution in this period!*/
+    /* No more realtime execution in this period! */
     inf->deadl_abs +=3D inf->period;
     if ( likely(inf->block_abs) )
     {
-        //treat blocked time as consumed by the domain*/
+        /* Treat blocked time as consumed by the domain */
         /*inf->cputime +=3D now - inf->block_abs;*/
-        /*penalty is time the domain would have
-          had if it continued to run */
+        /*
+         * Penalty is time the domain would have
+         * had if it continued to run.
+         */
         pen =3D (inf->slice - inf->cputime);
         if ( pen < 0 )
             pen =3D 0;
-        /*accumulate all penalties over the periods*/
+        /* Accumulate all penalties over the periods */
         /*inf->short_block_lost_tot +=3D pen;*/
-        /*set penalty to the current value*/
+        /* Set penalty to the current value */
         inf->short_block_lost_tot =3D pen;
-        /*not sure which one is better.. but seems to work well...*/
+        /* Not sure which one is better.. but seems to work well... */
  =20
         if ( inf->short_block_lost_tot )
         {
@@ -1002,28 +971,31 @@ static void unblock_short_extra_support(
             inf->pen_extra_blocks++;
 #endif
             if ( extraq_on(inf->vcpu, EXTRA_PEN_Q) )
-                /*remove domain for possible resorting!*/
+                /* Remove domain for possible resorting! */
                 extraq_del(inf->vcpu, EXTRA_PEN_Q);
             else
-                /*remember that we want to be on the penalty q
-                  so that we can continue when we (un-)block
-                  in penalty-extratime*/
+                /*
+                 * Remember that we want to be on the penalty q
+                 * so that we can continue when we (un-)block
+                 * in penalty-extratime
+                 */
                 inf->status |=3D EXTRA_WANT_PEN_Q;
   =20
-            /*(re-)add domain to the penalty extraq*/
+            /* (re-)add domain to the penalty extraq */
             extraq_add_sort_update(inf->vcpu, EXTRA_PEN_Q, 0);
         }
     }
=20
-    /*give it a fresh slice in the next period!*/
+    /* Give it a fresh slice in the next period! */
     inf->cputime =3D 0;
 }
=20

 static void unblock_long_cons_b(struct sedf_vcpu_info* inf,s_time_t now)
 {
-    /*Conservative 2b*/
-    /*Treat the unblocking time as a start of a new period */
+    /* Conservative 2b */
+
+    /* Treat the unblocking time as a start of a new period */
     inf->deadl_abs =3D now + inf->period;
     inf->cputime =3D 0;
 }
@@ -1046,15 +1018,17 @@ static inline int get_run_type(struct vc
 }
=20

-/*Compares two domains in the relation of whether the one is allowed to
-  interrupt the others execution.
-  It returns true (!=3D0) if a switch to the other domain is good.
-  Current Priority scheme is as follows:
-   EDF > L0 (penalty based) extra-time >=20
-   L1 (utilization) extra-time > idle-domain
-  In the same class priorities are assigned as following:
-   EDF: early deadline > late deadline
-   L0 extra-time: lower score > higher score*/
+/*
+ * Compares two domains in the relation of whether the one is allowed to
+ * interrupt the others execution.
+ * It returns true (!=3D0) if a switch to the other domain is good.
+ * Current Priority scheme is as follows:
+ *  EDF > L0 (penalty based) extra-time >=20
+ *  L1 (utilization) extra-time > idle-domain
+ * In the same class priorities are assigned as following:
+ *  EDF: early deadline > late deadline
+ *  L0 extra-time: lower score > higher score
+ */
 static inline int should_switch(struct vcpu *cur,
                                 struct vcpu *other,
                                 s_time_t now)
@@ -1063,26 +1037,25 @@ static inline int should_switch(struct v
     cur_inf   =3D EDOM_INFO(cur);
     other_inf =3D EDOM_INFO(other);
 =20
-    /* Check whether we need to make an earlier scheduling decision. */
+    /* Check whether we need to make an earlier scheduling decision */
     if ( PERIOD_BEGIN(other_inf) <=20
          CPU_INFO(other->processor)->current_slice_expires )
         return 1;
=20
-    /* No timing-based switches need to be taken into account here. */
+    /* No timing-based switches need to be taken into account here */
     switch ( get_run_type(cur) )
     {
     case DOMAIN_EDF:
-        /* Do not interrupt a running EDF domain. */
+        /* Do not interrupt a running EDF domain */
         return 0;
     case DOMAIN_EXTRA_PEN:
-        /* Check whether we also want the L0 ex-q with lower score. */
+        /* Check whether we also want the L0 ex-q with lower score */
         return ((other_inf->status & EXTRA_WANT_PEN_Q) &&
                 (other_inf->score[EXTRA_PEN_Q] <=20
                  cur_inf->score[EXTRA_PEN_Q]));
     case DOMAIN_EXTRA_UTIL:
         /* Check whether we want the L0 extraq. Don't
-         * switch if both domains want L1 extraq.
-         */
+         * switch if both domains want L1 extraq. */
         return !!(other_inf->status & EXTRA_WANT_PEN_Q);
     case DOMAIN_IDLE:
         return 1;
@@ -1096,18 +1069,11 @@ static void sedf_wake(const struct sched
     s_time_t              now =3D NOW();
     struct sedf_vcpu_info* inf =3D EDOM_INFO(d);
=20
-    PRINT(3, "sedf_wake was called, domain-id %i.%i\n",d->domain->domain_i=
d,
-          d->vcpu_id);
-
     if ( unlikely(is_idle_vcpu(d)) )
         return;
   =20
     if ( unlikely(__task_on_queue(d)) )
-    {
-        PRINT(3,"\tdomain %i.%i is already in some queue\n",
-              d->domain->domain_id, d->vcpu_id);
         return;
-    }
=20
     ASSERT(!sedf_runnable(d));
     inf->status &=3D ~SEDF_ASLEEP;
@@ -1116,28 +1082,25 @@ static void sedf_wake(const struct sched
 =20
     if ( unlikely(inf->deadl_abs =3D=3D 0) )
     {
-        /*initial setup of the deadline*/
+        /* Initial setup of the deadline */
         inf->deadl_abs =3D now + inf->slice;
     }
  =20
-    PRINT(3, "waking up domain %i.%i (deadl=3D %"PRIu64" period=3D %"PRIu6=
4
-          "now=3D %"PRIu64")\n",
-          d->domain->domain_id, d->vcpu_id, inf->deadl_abs, inf->period, n=
ow);
-
 #ifdef SEDF_STATS=20
     inf->block_tot++;
 #endif
=20
     if ( unlikely(now < PERIOD_BEGIN(inf)) )
     {
-        PRINT(4,"extratime unblock\n");
-        /* unblocking in extra-time! */
+        /* Unblocking in extra-time! */
         if ( inf->status & EXTRA_WANT_PEN_Q )
         {
-            /*we have a domain that wants compensation
-              for block penalty and did just block in
-              its compensation time. Give it another
-              chance!*/
+            /*
+             * We have a domain that wants compensation
+             * for block penalty and did just block in
+             * its compensation time. Give it another
+             * chance!
+             */
             extraq_add_sort_update(d, EXTRA_PEN_Q, 0);
         }
         extraq_check_add_unblocked(d, 0);
@@ -1146,8 +1109,7 @@ static void sedf_wake(const struct sched
     { =20
         if ( now < inf->deadl_abs )
         {
-            PRINT(4,"short unblocking\n");
-            /*short blocking*/
+            /* Short blocking */
 #ifdef SEDF_STATS
             inf->short_block_tot++;
 #endif
@@ -1157,8 +1119,7 @@ static void sedf_wake(const struct sched
         }
         else
         {
-            PRINT(4,"long unblocking\n");
-            /*long unblocking*/
+            /* Long unblocking */
 #ifdef SEDF_STATS
             inf->long_block_tot++;
 #endif
@@ -1168,24 +1129,13 @@ static void sedf_wake(const struct sched
         }
     }
=20
-    PRINT(3, "woke up domain %i.%i (deadl=3D %"PRIu64" period=3D %"PRIu64
-          "now=3D %"PRIu64")\n",
-          d->domain->domain_id, d->vcpu_id, inf->deadl_abs,
-          inf->period, now);
-
     if ( PERIOD_BEGIN(inf) > now )
-    {
         __add_to_waitqueue_sort(d);
-        PRINT(3,"added to waitq\n");
-    }
     else
-    {
         __add_to_runqueue_sort(d);
-        PRINT(3,"added to runq\n");
-    }
 =20
 #ifdef SEDF_STATS
-    /*do some statistics here...*/
+    /* Do some statistics here... */
     if ( inf->block_abs !=3D 0 )
     {
         inf->block_time_tot +=3D now - inf->block_abs;
@@ -1194,12 +1144,14 @@ static void sedf_wake(const struct sched
     }
 #endif
=20
-    /*sanity check: make sure each extra-aware domain IS on the util-q!*/
+    /* Sanity check: make sure each extra-aware domain IS on the util-q! *=
/
     ASSERT(IMPLY(inf->status & EXTRA_AWARE, extraq_on(d, EXTRA_UTIL_Q)));
     ASSERT(__task_on_queue(d));
-    /*check whether the awakened task needs to invoke the do_schedule
-      routine. Try to avoid unnecessary runs but:
-      Save approximation: Always switch to scheduler!*/
+    /*
+     * Check whether the awakened task needs to invoke the do_schedule
+     * routine. Try to avoid unnecessary runs but:
+     * Save approximation: Always switch to scheduler!
+     */
     ASSERT(d->processor >=3D 0);
     ASSERT(d->processor < nr_cpu_ids);
     ASSERT(per_cpu(schedule_data, d->processor).curr);
@@ -1244,7 +1196,7 @@ static void sedf_dump_domain(struct vcpu
 }
=20

-/* dumps all domains on the specified cpu */
+/* Dumps all domains on the specified cpu */
 static void sedf_dump_cpu_state(const struct scheduler *ops, int i)
 {
     struct list_head      *list, *queue, *tmp;
@@ -1319,7 +1271,7 @@ static void sedf_dump_cpu_state(const st
 }
=20

-/* Adjusts periods and slices of the domains accordingly to their weights.=
 */
+/* Adjusts periods and slices of the domains accordingly to their weights =
*/
 static int sedf_adjust_weights(struct cpupool *c, struct xen_domctl_schedu=
ler_op *cmd)
 {
     struct vcpu *p;
@@ -1335,7 +1287,7 @@ static int sedf_adjust_weights(struct cp
         return -ENOMEM;
     }
=20
-    /* Sum across all weights. */
+    /* Sum across all weights */
     rcu_read_lock(&domlist_read_lock);
     for_each_domain_in_cpupool( d, c )
     {
@@ -1350,11 +1302,14 @@ static int sedf_adjust_weights(struct cp
             }
             else
             {
-                /*don't modify domains who don't have a weight, but sum
-                  up the time they need, projected to a WEIGHT_PERIOD,
-                  so that this time is not given to the weight-driven
-                  domains*/
-                /*check for overflows*/
+                /*
+                 * Don't modify domains who don't have a weight, but sum
+                 * up the time they need, projected to a WEIGHT_PERIOD,
+                 * so that this time is not given to the weight-driven
+                 *  domains
+                 */
+
+                /* Check for overflows */
                 ASSERT((WEIGHT_PERIOD < ULONG_MAX)=20
                        && (EDOM_INFO(p)->slice_orig < ULONG_MAX));
                 sumt[cpu] +=3D=20
@@ -1365,7 +1320,7 @@ static int sedf_adjust_weights(struct cp
     }
     rcu_read_unlock(&domlist_read_lock);
=20
-    /* Adjust all slices (and periods) to the new weight. */
+    /* Adjust all slices (and periods) to the new weight */
     rcu_read_lock(&domlist_read_lock);
     for_each_domain_in_cpupool( d, c )
     {
@@ -1393,20 +1348,15 @@ static int sedf_adjust_weights(struct cp
 }
=20

-/* set or fetch domain scheduling parameters */
+/* Set or fetch domain scheduling parameters */
 static int sedf_adjust(const struct scheduler *ops, struct domain *p, stru=
ct xen_domctl_scheduler_op *op)
 {
     struct vcpu *v;
     int rc;
=20
-    PRINT(2,"sedf_adjust was called, domain-id %i new period %"PRIu64" "
-          "new slice %"PRIu64"\nlatency %"PRIu64" extra:%s\n",
-          p->domain_id, op->u.sedf.period, op->u.sedf.slice,
-          op->u.sedf.latency, (op->u.sedf.extratime)?"yes":"no");
-
     if ( op->cmd =3D=3D XEN_DOMCTL_SCHEDOP_putinfo )
     {
-        /* Check for sane parameters. */
+        /* Check for sane parameters */
         if ( !op->u.sedf.period && !op->u.sedf.weight )
             return -EINVAL;
         if ( op->u.sedf.weight )
@@ -1414,7 +1364,7 @@ static int sedf_adjust(const struct sche
             if ( (op->u.sedf.extratime & EXTRA_AWARE) &&
                  (!op->u.sedf.period) )
             {
-                /* Weight-driven domains with extratime only. */
+                /* Weight-driven domains with extratime only */
                 for_each_vcpu ( p, v )
                 {
                     EDOM_INFO(v)->extraweight =3D op->u.sedf.weight;
@@ -1425,7 +1375,7 @@ static int sedf_adjust(const struct sche
             }
             else
             {
-                /* Weight-driven domains with real-time execution. */
+                /* Weight-driven domains with real-time execution */
                 for_each_vcpu ( p, v )
                     EDOM_INFO(v)->weight =3D op->u.sedf.weight;
             }
@@ -1477,7 +1427,6 @@ static int sedf_adjust(const struct sche
         op->u.sedf.weight    =3D EDOM_INFO(p->vcpu[0])->weight;
     }
=20
-    PRINT(2,"sedf_adjust_finished\n");
     return 0;
 }
=20

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
-------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa (Italy)



--=-DM3xwBkUsBWsFUckworM
Content-Disposition: attachment; filename="sedf-debug-cleanup.patch"
Content-Type: text/x-patch; name="sedf-debug-cleanup.patch"; charset="UTF-8"
Content-Transfer-Encoding: base64

IyBIRyBjaGFuZ2VzZXQgcGF0Y2gNCiMgUGFyZW50IDUxMDQ1YTVlYzZiY2YxZTk3NDU4ZTRlNzQ3
ZDUyYmNjYjA3MzQ4YTQNCnNlZGY6IHJlbW92ZSB1c2VsZXNzIHRyYWNpbmcgcHJpbnRrIGFuZCBo
YXJtb25pemUgY29tbWVudHMgc3R5bGUuDQoNCnNjaGVkX3NlZGYuYyB1c2VkIG8gaGF2ZSBpdHMg
b3duIG1lY2hhbmlzbSBmb3IgcHJvZHVjaW5nIHRyYWNpbmctYWxpa2UNCmtpbmQgb2YgaW5mb3Jt
YXRpb24gKGRvbWFpbiBibG9jaywgd2FrZXVwLCBldGMuKS4gTm93YWRheXMsIHdpdGggYW4gZXZl
bg0Kbm90IHNvIGhpZ2ggbnVtYmVyIG9mIHBDUFVzL3ZDUFVzLCBqdXN0IHRyeWluZyB0byBlbmFi
bGUgdGhpcyBtYWtlcw0KdGhlIHNlcmlhbCBjb25zb2xlIGNvbXBsZXRlbHkgdW51c2FibGUsIHBy
b2R1Y2VzIHRvbnMgb2YgdmVyeSBoYXJkIHRvDQpwYXJzZSBhbmQgaW50ZXJwcmVldCBsb2dnaW5n
IGFuZCBjYW4gZWFzaWx5IGxpdmVsb2NrIERvbTAuIE1vcmVvdmVyLA0KcHJldHR5IG11Y2ggdGhl
IHNhbWUgcmVzdWx0IHRoaXMgaXMgc3RydWdnbGluZyB0byBnZXQgdG8sIGlzIGJldHRlcg0KYWNo
aWV2ZWQgYnkgZW5hYmxpbmcgdGhlIHNjaGVkdWxlci1yZWxhdGVkIHRyYWNpbmcgZXZlbnRzLCBh
cw0KaXQgaXMgZm9yIHRoZSBvdGhlciBzY2hlZHVsZXJzIChzYXksIGNyZWRpdCBvciBjcmVkaXQy
KS4NCg0KRm9yIGFsbCB0aGVzZSByZWFzb25zLCB0aGlzIHJlbW92ZXMgdGhhdCBtYWNoaW5lcnkg
Y29tcGxldGVseS4gV2hpbGUgYXQNCml0LCBjaGVjayBpbiBzb21lIGNvc21ldGljcyB0aGF0IGhh
cm1vbml6ZSB0aGUgY29tbWVudHMgd2l0aGltIHRoZW1zZWxmDQphbmQgd2l0aCB0aGUgcmVzdCBv
ZiB0aGUgY29kZSBiYXNlLg0KDQpTaWduZWQtb2ZmLWJ5OiBEYXJpbyBGYWdnaW9saSA8ZGFyaW8u
ZmFnZ2lvbGlAY2l0cml4LmNvbT4NCg0KZGlmZiAtciA1MTA0NWE1ZWM2YmMgeGVuL2NvbW1vbi9z
Y2hlZF9zZWRmLmMNCi0tLSBhL3hlbi9jb21tb24vc2NoZWRfc2VkZi5jCVdlZCBEZWMgMjEgMTQ6
NDk6MDEgMjAxMSArMDAwMA0KKysrIGIveGVuL2NvbW1vbi9zY2hlZF9zZWRmLmMJV2VkIERlYyAy
MSAxNToxMjowNyAyMDExICswMDAwDQpAQCAtMTMsMTQgKzEzLDYgQEANCiAjaW5jbHVkZSA8eGVu
L3RpbWUuaD4NCiAjaW5jbHVkZSA8eGVuL2Vycm5vLmg+DQogDQotLyp2ZXJib3NpdHkgc2V0dGlu
Z3MqLw0KLSNkZWZpbmUgU0VERkxFVkVMIDANCi0jZGVmaW5lIFBSSU5UKF9mLCBfYS4uLikgICAg
ICAgICAgICAgICAgICAgICAgICBcDQotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXA0KLSAgICAgICAgaWYgKCAoX2YpIDw9IFNFREZMRVZFTCApICAgICAg
ICAgICAgICAgIFwNCi0gICAgICAgICAgICBwcmludGsoX2EgKTsgICAgICAgICAgICAgICAgICAg
ICAgICBcDQotICAgIH0gd2hpbGUgKCAwICkNCi0NCiAjZGVmaW5lIFNFREZfQ1BVT05MSU5FKF9w
b29sKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICAg
KCgoX3Bvb2wpID09IE5VTEwpID8gJmNwdXBvb2xfZnJlZV9jcHVzIDogKF9wb29sKS0+Y3B1X3Zh
bGlkKQ0KIA0KQEAgLTY2LDM0ICs1OCwzNSBAQCBzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8gew0KICAg
ICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7DQogICAgIHN0cnVjdCBsaXN0X2hlYWQgZXh0cmFsaXN0
WzJdOw0KICANCi0gICAgLypQYXJhbWV0ZXJzIGZvciBFREYqLw0KLSAgICBzX3RpbWVfdCAgcGVy
aW9kOyAgLyo9KHJlbGF0aXZlIGRlYWRsaW5lKSovDQotICAgIHNfdGltZV90ICBzbGljZTsgIC8q
PXdvcnN0IGNhc2UgZXhlY3V0aW9uIHRpbWUqLw0KKyAgICAvKiBQYXJhbWV0ZXJzIGZvciBFREYg
Ki8NCisgICAgc190aW1lX3QgIHBlcmlvZDsgIC8qID0ocmVsYXRpdmUgZGVhZGxpbmUpICovDQor
ICAgIHNfdGltZV90ICBzbGljZTsgICAvKiA9d29yc3QgY2FzZSBleGVjdXRpb24gdGltZSAqLw0K
ICANCi0gICAgLypBZHZhY2VkIFBhcmFtZXRlcnMqLw0KLSAgICAvKkxhdGVuY3kgU2NhbGluZyov
DQorICAgIC8qIEFkdmFjZWQgUGFyYW1ldGVycyAqLw0KKw0KKyAgICAvKiBMYXRlbmN5IFNjYWxp
bmcgKi8NCiAgICAgc190aW1lX3QgIHBlcmlvZF9vcmlnOw0KICAgICBzX3RpbWVfdCAgc2xpY2Vf
b3JpZzsNCiAgICAgc190aW1lX3QgIGxhdGVuY3k7DQogIA0KLSAgICAvKnN0YXR1cyBvZiBkb21h
aW4qLw0KKyAgICAvKiBTdGF0dXMgb2YgZG9tYWluICovDQogICAgIGludCAgICAgICBzdGF0dXM7
DQotICAgIC8qd2VpZ2h0cyBmb3IgIlNjaGVkdWxpbmcgZm9yIGJlZ2lubmVycy8gbGF6eS8gZXRj
LiIgOykqLw0KKyAgICAvKiBXZWlnaHRzIGZvciAiU2NoZWR1bGluZyBmb3IgYmVnaW5uZXJzLyBs
YXp5LyBldGMuIiA7KSAqLw0KICAgICBzaG9ydCAgICAgd2VpZ2h0Ow0KICAgICBzaG9ydCAgICAg
ZXh0cmF3ZWlnaHQ7DQotICAgIC8qQm9va2tlZXBpbmcqLw0KKyAgICAvKiBCb29ra2VlcGluZyAq
Lw0KICAgICBzX3RpbWVfdCAgZGVhZGxfYWJzOw0KICAgICBzX3RpbWVfdCAgc2NoZWRfc3RhcnRf
YWJzOw0KICAgICBzX3RpbWVfdCAgY3B1dGltZTsNCi0gICAgLyogdGltZXMgdGhlIGRvbWFpbiB1
bi0vYmxvY2tlZCAqLw0KKyAgICAvKiBUaW1lcyB0aGUgZG9tYWluIHVuLS9ibG9ja2VkICovDQog
ICAgIHNfdGltZV90ICBibG9ja19hYnM7DQogICAgIHNfdGltZV90ICB1bmJsb2NrX2FiczsNCiAg
DQotICAgIC8qc2NvcmVzIGZvciB7dXRpbCwgYmxvY2sgcGVuYWx0eX0td2VpZ2h0ZWQgZXh0cmF0
aW1lIGRpc3RyaWJ1dGlvbiovDQorICAgIC8qIFNjb3JlcyBmb3Ige3V0aWwsIGJsb2NrIHBlbmFs
dHl9LXdlaWdodGVkIGV4dHJhdGltZSBkaXN0cmlidXRpb24gKi8NCiAgICAgaW50ICAgc2NvcmVb
Ml07DQogICAgIHNfdGltZV90ICBzaG9ydF9ibG9ja19sb3N0X3RvdDsNCiAgDQotICAgIC8qU3Rh
dGlzdGljcyovDQorICAgIC8qIFN0YXRpc3RpY3MgKi8NCiAgICAgc190aW1lX3QgIGV4dHJhX3Rp
bWVfdG90Ow0KIA0KICNpZmRlZiBTRURGX1NUQVRTDQpAQCAtMTU4LDE4ICsxNTEsMTcgQEAgc3Rh
dGljIGlubGluZSB2b2lkIGV4dHJhcV9kZWwoc3RydWN0IHZjcA0KIHsNCiAgICAgc3RydWN0IGxp
c3RfaGVhZCAqbGlzdCA9IEVYVFJBTElTVChkLGkpOw0KICAgICBBU1NFUlQoZXh0cmFxX29uKGQs
aSkpOw0KLSAgICBQUklOVCgzLCAiUmVtb3ZpbmcgZG9tYWluICVpLiVpIGZyb20gTCVpIGV4dHJh
cVxuIiwNCi0gICAgICAgICAgZC0+ZG9tYWluLT5kb21haW5faWQsIGQtPnZjcHVfaWQsIGkpOw0K
ICAgICBsaXN0X2RlbChsaXN0KTsNCiAgICAgbGlzdC0+bmV4dCA9IE5VTEw7DQogICAgIEFTU0VS
VCghZXh0cmFxX29uKGQsIGkpKTsNCiB9DQogDQotLyogYWRkcyBhIGRvbWFpbiB0byB0aGUgcXVl
dWUgb2YgcHJvY2Vzc2VzIHdoaWNoIGFyZSBhd2FyZSBvZiBleHRyYSB0aW1lLiBMaXN0DQotICAg
aXMgc29ydGVkIGJ5IHNjb3JlLCB3aGVyZSBhIGxvd2VyIHNjb3JlIG1lYW5zIGhpZ2hlciBwcmlv
cml0eSBmb3IgYW4gZXh0cmENCi0gICBzbGljZS4gSXQgYWxzbyB1cGRhdGVzIHRoZSBzY29yZSwg
Ynkgc2ltcGx5IHN1YnRyYWN0aW5nIGEgZml4ZWQgdmFsdWUgZnJvbQ0KLSAgIGVhY2ggZW50cnks
IGluIG9yZGVyIHRvIGF2b2lkIG92ZXJmbG93LiBUaGUgYWxnb3JpdGhtIHdvcmtzIGJ5IHNpbXBs
eQ0KLSAgIGNoYXJnaW5nIGVhY2ggZG9tYWluIHRoYXQgcmVjaWV2ZWQgZXh0cmF0aW1lIHdpdGgg
YW4gaW52ZXJzZSBvZiBpdHMgd2VpZ2h0Lg0KKy8qDQorICogQWRkcyBhIGRvbWFpbiB0byB0aGUg
cXVldWUgb2YgcHJvY2Vzc2VzIHdoaWNoIGFyZSBhd2FyZSBvZiBleHRyYSB0aW1lLiBMaXN0DQor
ICogaXMgc29ydGVkIGJ5IHNjb3JlLCB3aGVyZSBhIGxvd2VyIHNjb3JlIG1lYW5zIGhpZ2hlciBw
cmlvcml0eSBmb3IgYW4gZXh0cmENCisgKiBzbGljZS4gSXQgYWxzbyB1cGRhdGVzIHRoZSBzY29y
ZSwgYnkgc2ltcGx5IHN1YnRyYWN0aW5nIGEgZml4ZWQgdmFsdWUgZnJvbQ0KKyAqIGVhY2ggZW50
cnksIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJmbG93LiBUaGUgYWxnb3JpdGhtIHdvcmtzIGJ5IHNp
bXBseQ0KKyAqIGNoYXJnaW5nIGVhY2ggZG9tYWluIHRoYXQgcmVjaWV2ZWQgZXh0cmF0aW1lIHdp
dGggYW4gaW52ZXJzZSBvZiBpdHMgd2VpZ2h0Lg0KICAqLyANCiBzdGF0aWMgaW5saW5lIHZvaWQg
ZXh0cmFxX2FkZF9zb3J0X3VwZGF0ZShzdHJ1Y3QgdmNwdSAqZCwgaW50IGksIGludCBzdWIpDQog
ew0KQEAgLTE3OCwxMSArMTcwLDYgQEAgc3RhdGljIGlubGluZSB2b2lkIGV4dHJhcV9hZGRfc29y
dF91cGRhdA0KICANCiAgICAgQVNTRVJUKCFleHRyYXFfb24oZCxpKSk7DQogDQotICAgIFBSSU5U
KDMsICJBZGRpbmcgZG9tYWluICVpLiVpIChzY29yZT0gJWksIHNob3J0X3Blbj0gJSJQUklpNjQi
KSINCi0gICAgICAgICAgIiB0byBMJWkgZXh0cmFxXG4iLA0KLSAgICAgICAgICBkLT5kb21haW4t
PmRvbWFpbl9pZCwgZC0+dmNwdV9pZCwgRURPTV9JTkZPKGQpLT5zY29yZVtpXSwNCi0gICAgICAg
ICAgRURPTV9JTkZPKGQpLT5zaG9ydF9ibG9ja19sb3N0X3RvdCwgaSk7DQotDQogICAgIC8qDQog
ICAgICAqIEl0ZXJhdGUgdGhyb3VnaCBhbGwgZWxlbWVudHMgdG8gZmluZCBvdXIgImhvbGUiIGFu
ZCBvbiBvdXIgd2F5DQogICAgICAqIHVwZGF0ZSBhbGwgdGhlIG90aGVyIHNjb3Jlcy4NCkBAIC0x
OTMsMjUgKzE4MCwxOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZXh0cmFxX2FkZF9zb3J0X3VwZGF0
DQogICAgICAgICBjdXJpbmYtPnNjb3JlW2ldIC09IHN1YjsNCiAgICAgICAgIGlmICggRURPTV9J
TkZPKGQpLT5zY29yZVtpXSA8IGN1cmluZi0+c2NvcmVbaV0gKQ0KICAgICAgICAgICAgIGJyZWFr
Ow0KLSAgICAgICAgUFJJTlQoNCwiXHRiZWhpbmQgZG9tYWluICVpLiVpIChzY29yZT0gJWkpXG4i
LA0KLSAgICAgICAgICAgICAgY3VyaW5mLT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZCwNCi0gICAg
ICAgICAgICAgIGN1cmluZi0+dmNwdS0+dmNwdV9pZCwgY3VyaW5mLT5zY29yZVtpXSk7DQogICAg
IH0NCiANCi0gICAgLyogY3VyIG5vdyBjb250YWlucyB0aGUgZWxlbWVudCwgYmVmb3JlIHdoaWNo
IHdlJ2xsIGVucXVldWUuICovDQotICAgIFBSSU5UKDMsICJcdGxpc3RfYWRkIHRvICVwXG4iLCBj
dXItPnByZXYpOw0KKyAgICAvKiBjdXIgbm93IGNvbnRhaW5zIHRoZSBlbGVtZW50LCBiZWZvcmUg
d2hpY2ggd2UnbGwgZW5xdWV1ZSAqLw0KICAgICBsaXN0X2FkZChFWFRSQUxJU1QoZCxpKSxjdXIt
PnByZXYpOw0KICANCi0gICAgLyogQ29udGludWUgdXBkYXRpbmcgdGhlIGV4dHJhcS4gKi8NCisg
ICAgLyogQ29udGludWUgdXBkYXRpbmcgdGhlIGV4dHJhcSAqLw0KICAgICBpZiAoIChjdXIgIT0g
RVhUUkFRKGQtPnByb2Nlc3NvcixpKSkgJiYgc3ViICkNCiAgICAgew0KICAgICAgICAgZm9yICgg
Y3VyID0gY3VyLT5uZXh0OyBjdXIgIT0gRVhUUkFRKGQtPnByb2Nlc3NvcixpKTsgY3VyID0gY3Vy
LT5uZXh0ICkNCiAgICAgICAgIHsNCiAgICAgICAgICAgICBjdXJpbmYgPSBsaXN0X2VudHJ5KGN1
cixzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8sIGV4dHJhbGlzdFtpXSk7DQogICAgICAgICAgICAgY3Vy
aW5mLT5zY29yZVtpXSAtPSBzdWI7DQotICAgICAgICAgICAgUFJJTlQoNCwgIlx0dXBkYXRpbmcg
ZG9tYWluICVpLiVpIChzY29yZT0gJXUpXG4iLA0KLSAgICAgICAgICAgICAgICAgIGN1cmluZi0+
dmNwdS0+ZG9tYWluLT5kb21haW5faWQsIA0KLSAgICAgICAgICAgICAgICAgIGN1cmluZi0+dmNw
dS0+dmNwdV9pZCwgY3VyaW5mLT5zY29yZVtpXSk7DQogICAgICAgICB9DQogICAgIH0NCiANCkBA
IC0yMjEsMjkgKzIwMSwxNCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZXh0cmFxX2NoZWNrKHN0cnVj
dCB2DQogew0KICAgICBpZiAoIGV4dHJhcV9vbihkLCBFWFRSQV9VVElMX1EpICkNCiAgICAgew0K
LSAgICAgICAgUFJJTlQoMiwiRG9tICVpLiVpIGlzIG9uIEwxIGV4dHJhUVxuIiwNCi0gICAgICAg
ICAgICAgIGQtPmRvbWFpbi0+ZG9tYWluX2lkLCBkLT52Y3B1X2lkKTsNCi0NCiAgICAgICAgIGlm
ICggIShFRE9NX0lORk8oZCktPnN0YXR1cyAmIEVYVFJBX0FXQVJFKSAmJg0KICAgICAgICAgICAg
ICAhZXh0cmFfcnVucyhFRE9NX0lORk8oZCkpICkNCi0gICAgICAgIHsNCiAgICAgICAgICAgICBl
eHRyYXFfZGVsKGQsIEVYVFJBX1VUSUxfUSk7DQotICAgICAgICAgICAgUFJJTlQoMiwiUmVtb3Zl
ZCBkb20gJWkuJWkgZnJvbSBMMSBleHRyYVFcbiIsDQotICAgICAgICAgICAgICAgICAgZC0+ZG9t
YWluLT5kb21haW5faWQsIGQtPnZjcHVfaWQpOw0KLSAgICAgICAgfQ0KICAgICB9DQogICAgIGVs
c2UNCiAgICAgew0KLSAgICAgICAgUFJJTlQoMiwgIkRvbSAlaS4laSBpcyBOT1Qgb24gTDEgZXh0
cmFRXG4iLA0KLSAgICAgICAgICAgICAgZC0+ZG9tYWluLT5kb21haW5faWQsDQotICAgICAgICAg
ICAgICBkLT52Y3B1X2lkKTsNCi0NCiAgICAgICAgIGlmICggKEVET01fSU5GTyhkKS0+c3RhdHVz
ICYgRVhUUkFfQVdBUkUpICYmIHNlZGZfcnVubmFibGUoZCkgKQ0KLSAgICAgICAgew0KICAgICAg
ICAgICAgIGV4dHJhcV9hZGRfc29ydF91cGRhdGUoZCwgRVhUUkFfVVRJTF9RLCAwKTsNCi0gICAg
ICAgICAgICBQUklOVCgyLCJBZGRlZCBkb20gJWkuJWkgdG8gTDEgZXh0cmFRXG4iLA0KLSAgICAg
ICAgICAgICAgICAgIGQtPmRvbWFpbi0+ZG9tYWluX2lkLCBkLT52Y3B1X2lkKTsNCi0gICAgICAg
IH0NCiAgICAgfQ0KIH0NCiANCkBAIC0yNTIsNyArMjE3LDcgQEAgc3RhdGljIGlubGluZSB2b2lk
IGV4dHJhcV9jaGVja19hZGRfdW5ibA0KICAgICBzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8gKmluZiA9
IEVET01fSU5GTyhkKTsNCiANCiAgICAgaWYgKCBpbmYtPnN0YXR1cyAmIEVYVFJBX0FXQVJFICkN
Ci0gICAgICAgIC8qIFB1dCBvbiB0aGUgd2VpZ2h0ZWQgZXh0cmFxIHdpdGhvdXQgdXBkYXRpbmcg
YW55IHNjb3Jlcy4gKi8NCisgICAgICAgIC8qIFB1dCBvbiB0aGUgd2VpZ2h0ZWQgZXh0cmFxIHdp
dGhvdXQgdXBkYXRpbmcgYW55IHNjb3JlcyAqLw0KICAgICAgICAgZXh0cmFxX2FkZF9zb3J0X3Vw
ZGF0ZShkLCBFWFRSQV9VVElMX1EsIDApOw0KIH0NCiANCkBAIC0yNjUsOCArMjMwLDYgQEAgc3Rh
dGljIGlubGluZSB2b2lkIF9fZGVsX2Zyb21fcXVldWUoc3RydQ0KIHsNCiAgICAgc3RydWN0IGxp
c3RfaGVhZCAqbGlzdCA9IExJU1QoZCk7DQogICAgIEFTU0VSVChfX3Rhc2tfb25fcXVldWUoZCkp
Ow0KLSAgICBQUklOVCgzLCJSZW1vdmluZyBkb21haW4gJWkuJWkgKGJvcD0gJSJQUkl1NjQiKSBm
cm9tIHJ1bnEvd2FpdHFcbiIsDQotICAgICAgICAgIGQtPmRvbWFpbi0+ZG9tYWluX2lkLCBkLT52
Y3B1X2lkLCBQRVJJT0RfQkVHSU4oRURPTV9JTkZPKGQpKSk7DQogICAgIGxpc3RfZGVsKGxpc3Qp
Ow0KICAgICBsaXN0LT5uZXh0ID0gTlVMTDsNCiAgICAgQVNTRVJUKCFfX3Rhc2tfb25fcXVldWUo
ZCkpOw0KQEAgLTI3OSwxMyArMjQyLDEyIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2luc2Vy
dF9zb3J0KA0KIHsNCiAgICAgc3RydWN0IGxpc3RfaGVhZCAgICAgKmN1cjsNCiANCi0gICAgLyog
SXRlcmF0ZSB0aHJvdWdoIGFsbCBlbGVtZW50cyB0byBmaW5kIG91ciAiaG9sZSIuICovDQorICAg
IC8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgZWxlbWVudHMgdG8gZmluZCBvdXIgImhvbGUiICovDQog
ICAgIGxpc3RfZm9yX2VhY2goIGN1ciwgbGlzdCApDQogICAgICAgICBpZiAoIGNvbXAoZWxlbWVu
dCwgY3VyKSA8IDAgKQ0KICAgICAgICAgICAgIGJyZWFrOw0KIA0KLSAgICAvKiBjdXIgbm93IGNv
bnRhaW5zIHRoZSBlbGVtZW50LCBiZWZvcmUgd2hpY2ggd2UnbGwgZW5xdWV1ZS4gKi8NCi0gICAg
UFJJTlQoMywiXHRsaXN0X2FkZCB0byAlcFxuIixjdXItPnByZXYpOw0KKyAgICAvKiBjdXIgbm93
IGNvbnRhaW5zIHRoZSBlbGVtZW50LCBiZWZvcmUgd2hpY2ggd2UnbGwgZW5xdWV1ZSAqLw0KICAg
ICBsaXN0X2FkZChlbGVtZW50LCBjdXItPnByZXYpOw0KIH0NCiANCkBAIC0zMDMsMzAgKzI2NSwy
OCBAQCBzdGF0aWMgaW50IG5hbWUjI19jb21wKHN0cnVjdCBsaXN0X2hlYWQqDQogICAgICAgICBy
ZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXA0KIH0NCiANCi0vKiBhZGRzIGEgZG9tYWluIHRvIHRoZSBxdWV1ZSBvZiBwcm9jZXNz
ZXMgd2hpY2ggd2FpdCBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUNCi0gICBuZXh0IHBlcmlvZDsg
dGhpcyBsaXN0IGlzIHRoZXJlZm9yZSBzb3J0ZXQgYnkgdGhpcyB0aW1lLCB3aGljaCBpcyBzaW1w
bHkNCi0gICBhYnNvbC4gZGVhZGxpbmUgLSBwZXJpb2QNCisvKg0KKyAqIEFkZHMgYSBkb21haW4g
dG8gdGhlIHF1ZXVlIG9mIHByb2Nlc3NlcyB3aGljaCB3YWl0IGZvciB0aGUgYmVnaW5uaW5nIG9m
IHRoZQ0KKyAqIG5leHQgcGVyaW9kOyB0aGlzIGxpc3QgaXMgdGhlcmVmb3JlIHNvcnRldCBieSB0
aGlzIHRpbWUsIHdoaWNoIGlzIHNpbXBseQ0KKyAqIGFic29sLiBkZWFkbGluZSAtIHBlcmlvZC4N
CiAgKi8gDQogRE9NQUlOX0NPTVBBUkVSKHdhaXRxLCBsaXN0LCBQRVJJT0RfQkVHSU4oZDEpLCBQ
RVJJT0RfQkVHSU4oZDIpKTsNCiBzdGF0aWMgaW5saW5lIHZvaWQgX19hZGRfdG9fd2FpdHF1ZXVl
X3NvcnQoc3RydWN0IHZjcHUgKnYpDQogew0KICAgICBBU1NFUlQoIV9fdGFza19vbl9xdWV1ZSh2
KSk7DQotICAgIFBSSU5UKDMsIkFkZGluZyBkb21haW4gJWkuJWkgKGJvcD0gJSJQUkl1NjQiKSB0
byB3YWl0cVxuIiwNCi0gICAgICAgICAgdi0+ZG9tYWluLT5kb21haW5faWQsIHYtPnZjcHVfaWQs
IFBFUklPRF9CRUdJTihFRE9NX0lORk8odikpKTsNCiAgICAgbGlzdF9pbnNlcnRfc29ydChXQUlU
USh2LT5wcm9jZXNzb3IpLCBMSVNUKHYpLCB3YWl0cV9jb21wKTsNCiAgICAgQVNTRVJUKF9fdGFz
a19vbl9xdWV1ZSh2KSk7DQogfQ0KIA0KLS8qIGFkZHMgYSBkb21haW4gdG8gdGhlIHF1ZXVlIG9m
IHByb2Nlc3NlcyB3aGljaCBoYXZlIHN0YXJ0ZWQgdGhlaXIgY3VycmVudA0KLSAgIHBlcmlvZCBh
bmQgYXJlIHJ1bm5hYmxlIChpLmUuIG5vdCBibG9ja2VkLCBkaWVpbmcsLi4uKS4gVGhlIGZpcnN0
IGVsZW1lbnQNCi0gICBvbiB0aGlzIGxpc3QgaXMgcnVubmluZyBvbiB0aGUgcHJvY2Vzc29yLCBp
ZiB0aGUgbGlzdCBpcyBlbXB0eSB0aGUgaWRsZQ0KLSAgIHRhc2sgd2lsbCBydW4uIEFzIHdlIGFy
ZSBpbXBsZW1lbnRpbmcgRURGLCB0aGlzIGxpc3QgaXMgc29ydGVkIGJ5IGRlYWRsaW5lcy4NCisv
Kg0KKyAqIEFkZHMgYSBkb21haW4gdG8gdGhlIHF1ZXVlIG9mIHByb2Nlc3NlcyB3aGljaCBoYXZl
IHN0YXJ0ZWQgdGhlaXIgY3VycmVudA0KKyAqIHBlcmlvZCBhbmQgYXJlIHJ1bm5hYmxlIChpLmUu
IG5vdCBibG9ja2VkLCBkaWVpbmcsLi4uKS4gVGhlIGZpcnN0IGVsZW1lbnQNCisgKiBvbiB0aGlz
IGxpc3QgaXMgcnVubmluZyBvbiB0aGUgcHJvY2Vzc29yLCBpZiB0aGUgbGlzdCBpcyBlbXB0eSB0
aGUgaWRsZQ0KKyAqIHRhc2sgd2lsbCBydW4uIEFzIHdlIGFyZSBpbXBsZW1lbnRpbmcgRURGLCB0
aGlzIGxpc3QgaXMgc29ydGVkIGJ5IGRlYWRsaW5lcy4NCiAgKi8gDQogRE9NQUlOX0NPTVBBUkVS
KHJ1bnEsIGxpc3QsIGQxLT5kZWFkbF9hYnMsIGQyLT5kZWFkbF9hYnMpOw0KIHN0YXRpYyBpbmxp
bmUgdm9pZCBfX2FkZF90b19ydW5xdWV1ZV9zb3J0KHN0cnVjdCB2Y3B1ICp2KQ0KIHsNCi0gICAg
UFJJTlQoMywiQWRkaW5nIGRvbWFpbiAlaS4laSAoZGVhZGw9ICUiUFJJdTY0IikgdG8gcnVucVxu
IiwNCi0gICAgICAgICAgdi0+ZG9tYWluLT5kb21haW5faWQsIHYtPnZjcHVfaWQsIEVET01fSU5G
Tyh2KS0+ZGVhZGxfYWJzKTsNCiAgICAgbGlzdF9pbnNlcnRfc29ydChSVU5RKHYtPnByb2Nlc3Nv
ciksIExJU1QodiksIHJ1bnFfY29tcCk7DQogfQ0KIA0KQEAgLTQ1MywxMCArNDEzLDEwIEBAIHN0
YXRpYyB2b2lkIGRlc2NoZWRfZWRmX2RvbShzX3RpbWVfdCBub3cNCiB7DQogICAgIHN0cnVjdCBz
ZWRmX3ZjcHVfaW5mbyogaW5mID0gRURPTV9JTkZPKGQpOw0KIA0KLSAgICAvKiBDdXJyZW50IGRv
bWFpbiBpcyBydW5uaW5nIGluIHJlYWwgdGltZSBtb2RlLiAqLw0KKyAgICAvKiBDdXJyZW50IGRv
bWFpbiBpcyBydW5uaW5nIGluIHJlYWwgdGltZSBtb2RlICovDQogICAgIEFTU0VSVChfX3Rhc2tf
b25fcXVldWUoZCkpOw0KIA0KLSAgICAvKiBVcGRhdGUgdGhlIGRvbWFpbidzIGNwdXRpbWUuICov
DQorICAgIC8qIFVwZGF0ZSB0aGUgZG9tYWluJ3MgY3B1dGltZSAqLw0KICAgICBpbmYtPmNwdXRp
bWUgKz0gbm93IC0gaW5mLT5zY2hlZF9zdGFydF9hYnM7DQogDQogICAgIC8qDQpAQCAtNDY3LDcg
KzQyNyw3IEBAIHN0YXRpYyB2b2lkIGRlc2NoZWRfZWRmX2RvbShzX3RpbWVfdCBub3cNCiAgICAg
ICAgIHJldHVybjsNCiAgIA0KICAgICBfX2RlbF9mcm9tX3F1ZXVlKGQpOw0KLSAgDQorDQogICAg
IC8qDQogICAgICAqIE1hbmFnZSBib29ra2VlcGluZyAoaS5lLiBjYWxjdWxhdGUgbmV4dCBkZWFk
bGluZSwgbWVtb3Jpc2UNCiAgICAgICogb3ZlcnJ1bi10aW1lIG9mIHNsaWNlKSBvZiBmaW5pc2hl
ZCBkb21haW5zLg0KQEAgLTQ3OCwzMCArNDM4LDMwIEBAIHN0YXRpYyB2b2lkIGRlc2NoZWRfZWRm
X2RvbShzX3RpbWVfdCBub3cNCiAgIA0KICAgICAgICAgaWYgKCBpbmYtPnBlcmlvZCA8IGluZi0+
cGVyaW9kX29yaWcgKQ0KICAgICAgICAgew0KLSAgICAgICAgICAgIC8qIFRoaXMgZG9tYWluIHJ1
bnMgaW4gbGF0ZW5jeSBzY2FsaW5nIG9yIGJ1cnN0IG1vZGUuICovDQorICAgICAgICAgICAgLyog
VGhpcyBkb21haW4gcnVucyBpbiBsYXRlbmN5IHNjYWxpbmcgb3IgYnVyc3QgbW9kZSAqLw0KICAg
ICAgICAgICAgIGluZi0+cGVyaW9kICo9IDI7DQogICAgICAgICAgICAgaW5mLT5zbGljZSAgKj0g
MjsNCiAgICAgICAgICAgICBpZiAoIChpbmYtPnBlcmlvZCA+IGluZi0+cGVyaW9kX29yaWcpIHx8
DQogICAgICAgICAgICAgICAgICAoaW5mLT5zbGljZSA+IGluZi0+c2xpY2Vfb3JpZykgKQ0KICAg
ICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLyogUmVzZXQgc2xpY2UgYW5kIHBlcmlvZC4g
Ki8NCisgICAgICAgICAgICAgICAgLyogUmVzZXQgc2xpY2UgYW5kIHBlcmlvZCAqLw0KICAgICAg
ICAgICAgICAgICBpbmYtPnBlcmlvZCA9IGluZi0+cGVyaW9kX29yaWc7DQogICAgICAgICAgICAg
ICAgIGluZi0+c2xpY2UgPSBpbmYtPnNsaWNlX29yaWc7DQogICAgICAgICAgICAgfQ0KICAgICAg
ICAgfQ0KIA0KLSAgICAgICAgLyogU2V0IG5leHQgZGVhZGxpbmUuICovDQorICAgICAgICAvKiBT
ZXQgbmV4dCBkZWFkbGluZSAqLw0KICAgICAgICAgaW5mLT5kZWFkbF9hYnMgKz0gaW5mLT5wZXJp
b2Q7DQogICAgIH0NCiAgDQotICAgIC8qIEFkZCBhIHJ1bm5hYmxlIGRvbWFpbiB0byB0aGUgd2Fp
dHF1ZXVlLiAqLw0KKyAgICAvKiBBZGQgYSBydW5uYWJsZSBkb21haW4gdG8gdGhlIHdhaXRxdWV1
ZSAqLw0KICAgICBpZiAoIHNlZGZfcnVubmFibGUoZCkgKQ0KICAgICB7DQogICAgICAgICBfX2Fk
ZF90b193YWl0cXVldWVfc29ydChkKTsNCiAgICAgfQ0KICAgICBlbHNlDQogICAgIHsNCi0gICAg
ICAgIC8qIFdlIGhhdmUgYSBibG9ja2VkIHJlYWx0aW1lIHRhc2sgLT4gcmVtb3ZlIGl0IGZyb20g
ZXhxcyB0b28uICovDQorICAgICAgICAvKiBXZSBoYXZlIGEgYmxvY2tlZCByZWFsdGltZSB0YXNr
IC0+IHJlbW92ZSBpdCBmcm9tIGV4cXMgdG9vICovDQogICAgICAgICBpZiAoIGV4dHJhcV9vbihk
LCBFWFRSQV9QRU5fUSkgKQ0KICAgICAgICAgICAgIGV4dHJhcV9kZWwoZCwgRVhUUkFfUEVOX1Ep
Ow0KICAgICAgICAgaWYgKCBleHRyYXFfb24oZCwgRVhUUkFfVVRJTF9RKSApDQpAQCAtNTIxLDgg
KzQ4MSw2IEBAIHN0YXRpYyB2b2lkIHVwZGF0ZV9xdWV1ZXMoDQogICAgIHN0cnVjdCBsaXN0X2hl
YWQgICAgICpjdXIsICp0bXA7DQogICAgIHN0cnVjdCBzZWRmX3ZjcHVfaW5mbyAqY3VyaW5mOw0K
ICANCi0gICAgUFJJTlQoMywiVXBkYXRpbmcgd2FpdHEuLlxuIik7DQotDQogICAgIC8qDQogICAg
ICAqIENoZWNrIGZvciB0aGUgZmlyc3QgZWxlbWVudHMgb2YgdGhlIHdhaXRxdWV1ZSwgd2hldGhl
ciB0aGVpcg0KICAgICAgKiBuZXh0IHBlcmlvZCBoYXMgYWxyZWFkeSBzdGFydGVkLg0KQEAgLTUz
MCw0MSArNDg4LDMyIEBAIHN0YXRpYyB2b2lkIHVwZGF0ZV9xdWV1ZXMoDQogICAgIGxpc3RfZm9y
X2VhY2hfc2FmZSAoIGN1ciwgdG1wLCB3YWl0cSApDQogICAgIHsNCiAgICAgICAgIGN1cmluZiA9
IGxpc3RfZW50cnkoY3VyLCBzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8sIGxpc3QpOw0KLSAgICAgICAg
UFJJTlQoNCwiXHRMb29raW5nIEAgZG9tICVpLiVpXG4iLA0KLSAgICAgICAgICAgICAgY3VyaW5m
LT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZCwgY3VyaW5mLT52Y3B1LT52Y3B1X2lkKTsNCiAgICAg
ICAgIGlmICggUEVSSU9EX0JFR0lOKGN1cmluZikgPiBub3cgKQ0KICAgICAgICAgICAgIGJyZWFr
Ow0KICAgICAgICAgX19kZWxfZnJvbV9xdWV1ZShjdXJpbmYtPnZjcHUpOw0KICAgICAgICAgX19h
ZGRfdG9fcnVucXVldWVfc29ydChjdXJpbmYtPnZjcHUpOw0KICAgICB9DQogIA0KLSAgICBQUklO
VCgzLCJVcGRhdGluZyBydW5xLi5cbiIpOw0KLQ0KLSAgICAvKiBQcm9jZXNzIHRoZSBydW5xLCBm
aW5kIGRvbWFpbnMgdGhhdCBhcmUgb24gdGhlIHJ1bnEgdGhhdCBzaG91bGRuJ3QuICovDQorICAg
IC8qIFByb2Nlc3MgdGhlIHJ1bnEsIGZpbmQgZG9tYWlucyB0aGF0IGFyZSBvbiB0aGUgcnVucSB0
aGF0IHNob3VsZG4ndCAqLw0KICAgICBsaXN0X2Zvcl9lYWNoX3NhZmUgKCBjdXIsIHRtcCwgcnVu
cSApDQogICAgIHsNCiAgICAgICAgIGN1cmluZiA9IGxpc3RfZW50cnkoY3VyLHN0cnVjdCBzZWRm
X3ZjcHVfaW5mbyxsaXN0KTsNCi0gICAgICAgIFBSSU5UKDQsIlx0TG9va2luZyBAIGRvbSAlaS4l
aVxuIiwNCi0gICAgICAgICAgICAgIGN1cmluZi0+dmNwdS0+ZG9tYWluLT5kb21haW5faWQsIGN1
cmluZi0+dmNwdS0+dmNwdV9pZCk7DQogDQogICAgICAgICBpZiAoIHVubGlrZWx5KGN1cmluZi0+
c2xpY2UgPT0gMCkgKQ0KICAgICAgICAgew0KLSAgICAgICAgICAgIC8qIElnbm9yZSBkb21haW5z
IHdpdGggZW1wdHkgc2xpY2UuICovDQotICAgICAgICAgICAgUFJJTlQoNCwiXHRVcGRhdGluZyB6
ZXJvLXNsaWNlIGRvbWFpbiAlaS4laVxuIiwNCi0gICAgICAgICAgICAgICAgICBjdXJpbmYtPnZj
cHUtPmRvbWFpbi0+ZG9tYWluX2lkLA0KLSAgICAgICAgICAgICAgICAgIGN1cmluZi0+dmNwdS0+
dmNwdV9pZCk7DQorICAgICAgICAgICAgLyogSWdub3JlIGRvbWFpbnMgd2l0aCBlbXB0eSBzbGlj
ZSAqLw0KICAgICAgICAgICAgIF9fZGVsX2Zyb21fcXVldWUoY3VyaW5mLT52Y3B1KTsNCiANCi0g
ICAgICAgICAgICAvKiBNb3ZlIHRoZW0gdG8gdGhlaXIgbmV4dCBwZXJpb2QuICovDQorICAgICAg
ICAgICAgLyogTW92ZSB0aGVtIHRvIHRoZWlyIG5leHQgcGVyaW9kICovDQogICAgICAgICAgICAg
Y3VyaW5mLT5kZWFkbF9hYnMgKz0gY3VyaW5mLT5wZXJpb2Q7DQogDQotICAgICAgICAgICAgLyog
RW5zdXJlIHRoYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHBlcmlvZCBpcyBpbiB0aGUgZnV0dXJl
LiAqLw0KKyAgICAgICAgICAgIC8qIEVuc3VyZSB0aGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBw
ZXJpb2QgaXMgaW4gdGhlIGZ1dHVyZSAqLw0KICAgICAgICAgICAgIGlmICggdW5saWtlbHkoUEVS
SU9EX0JFR0lOKGN1cmluZikgPCBub3cpICkNCiAgICAgICAgICAgICAgICAgY3VyaW5mLT5kZWFk
bF9hYnMgKz0gDQogICAgICAgICAgICAgICAgICAgICAoRElWX1VQKG5vdyAtIFBFUklPRF9CRUdJ
TihjdXJpbmYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJpbmYtPnBlcmlvZCkp
ICogY3VyaW5mLT5wZXJpb2Q7DQogDQotICAgICAgICAgICAgLyogUHV0IHRoZW0gYmFjayBpbnRv
IHRoZSBxdWV1ZS4gKi8NCisgICAgICAgICAgICAvKiBQdXQgdGhlbSBiYWNrIGludG8gdGhlIHF1
ZXVlICovDQogICAgICAgICAgICAgX19hZGRfdG9fd2FpdHF1ZXVlX3NvcnQoY3VyaW5mLT52Y3B1
KTsNCiAgICAgICAgIH0NCiAgICAgICAgIGVsc2UgaWYgKCB1bmxpa2VseSgoY3VyaW5mLT5kZWFk
bF9hYnMgPCBub3cpIHx8DQpAQCAtNTc0LDE4ICs1MjMsMTggQEAgc3RhdGljIHZvaWQgdXBkYXRl
X3F1ZXVlcygNCiAgICAgICAgICAgICAgKiBXZSBtaXNzZWQgdGhlIGRlYWRsaW5lIG9yIHRoZSBz
bGljZSB3YXMgYWxyZWFkeSBmaW5pc2hlZC4NCiAgICAgICAgICAgICAgKiBNaWdodCBoYXBlbiBi
ZWNhdXNlIG9mIGRvbV9hZGouDQogICAgICAgICAgICAgICovDQotICAgICAgICAgICAgUFJJTlQo
NCwiXHREb21haW4gJWkuJWkgZXhjZWVkZWQgaXQncyBkZWFkbGluZS8iDQotICAgICAgICAgICAg
ICAgICAgInNsaWNlICglIlBSSXU2NCIgLyAlIlBSSXU2NCIpIG5vdzogJSJQUkl1NjQNCi0gICAg
ICAgICAgICAgICAgICAiIGNwdXRpbWU6ICUiUFJJdTY0IlxuIiwNCi0gICAgICAgICAgICAgICAg
ICBjdXJpbmYtPnZjcHUtPmRvbWFpbi0+ZG9tYWluX2lkLA0KLSAgICAgICAgICAgICAgICAgIGN1
cmluZi0+dmNwdS0+dmNwdV9pZCwNCi0gICAgICAgICAgICAgICAgICBjdXJpbmYtPmRlYWRsX2Fi
cywgY3VyaW5mLT5zbGljZSwgbm93LA0KLSAgICAgICAgICAgICAgICAgIGN1cmluZi0+Y3B1dGlt
ZSk7DQorICAgICAgICAgICAgcHJpbnRrKCJcdERvbWFpbiAlaS4laSBleGNlZWRlZCBpdCdzIGRl
YWRsaW5lLyINCisgICAgICAgICAgICAgICAgICAgInNsaWNlICglIlBSSXU2NCIgLyAlIlBSSXU2
NCIpIG5vdzogJSJQUkl1NjQNCisgICAgICAgICAgICAgICAgICAgIiBjcHV0aW1lOiAlIlBSSXU2
NCJcbiIsDQorICAgICAgICAgICAgICAgICAgIGN1cmluZi0+dmNwdS0+ZG9tYWluLT5kb21haW5f
aWQsDQorICAgICAgICAgICAgICAgICAgIGN1cmluZi0+dmNwdS0+dmNwdV9pZCwNCisgICAgICAg
ICAgICAgICAgICAgY3VyaW5mLT5kZWFkbF9hYnMsIGN1cmluZi0+c2xpY2UsIG5vdywNCisgICAg
ICAgICAgICAgICAgICAgY3VyaW5mLT5jcHV0aW1lKTsNCiAgICAgICAgICAgICBfX2RlbF9mcm9t
X3F1ZXVlKGN1cmluZi0+dmNwdSk7DQogDQotICAgICAgICAgICAgLyogQ29tbW9uIGNhc2U6IHdl
IG1pc3Mgb25lIHBlcmlvZC4gKi8NCisgICAgICAgICAgICAvKiBDb21tb24gY2FzZTogd2UgbWlz
cyBvbmUgcGVyaW9kICovDQogICAgICAgICAgICAgY3VyaW5mLT5kZWFkbF9hYnMgKz0gY3VyaW5m
LT5wZXJpb2Q7DQotICAgDQorDQogICAgICAgICAgICAgLyoNCiAgICAgICAgICAgICAgKiBJZiB3
ZSBhcmUgc3RpbGwgYmVoaW5kOiBtb2R1bG8gYXJpdGhtZXRpYywgZm9yY2UgZGVhZGxpbmUNCiAg
ICAgICAgICAgICAgKiB0byBiZSBpbiBmdXR1cmUgYW5kIGFsaWduZWQgdG8gcGVyaW9kIGJvcmRl
cnMuDQpAQCAtNTk2LDcgKzU0NSw3IEBAIHN0YXRpYyB2b2lkIHVwZGF0ZV9xdWV1ZXMoDQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY3VyaW5mLT5wZXJpb2QpICogY3VyaW5mLT5wZXJpb2Q7
DQogICAgICAgICAgICAgQVNTRVJUKGN1cmluZi0+ZGVhZGxfYWJzID49IG5vdyk7DQogDQotICAg
ICAgICAgICAgLyogR2l2ZSBhIGZyZXNoIHNsaWNlLiAqLw0KKyAgICAgICAgICAgIC8qIEdpdmUg
YSBmcmVzaCBzbGljZSAqLw0KICAgICAgICAgICAgIGN1cmluZi0+Y3B1dGltZSA9IDA7DQogICAg
ICAgICAgICAgaWYgKCBQRVJJT0RfQkVHSU4oY3VyaW5mKSA+IG5vdyApDQogICAgICAgICAgICAg
ICAgIF9fYWRkX3RvX3dhaXRxdWV1ZV9zb3J0KGN1cmluZi0+dmNwdSk7DQpAQCAtNjA2LDE3ICs1
NTUsMTcgQEAgc3RhdGljIHZvaWQgdXBkYXRlX3F1ZXVlcygNCiAgICAgICAgIGVsc2UNCiAgICAg
ICAgICAgICBicmVhazsNCiAgICAgfQ0KLQ0KLSAgICBQUklOVCgzLCJkb25lIHVwZGF0aW5nIHRo
ZSBxdWV1ZXNcbiIpOw0KIH0NCiANCiANCi0vKiByZW1vdmVzIGEgZG9tYWluIGZyb20gdGhlIGhl
YWQgb2YgdGhlIGFjY29yZGluZyBleHRyYVEgYW5kDQotICAgcmVxdWV1ZXMgaXQgYXQgYSBzcGVj
aWZpZWQgcG9zaXRpb246DQotICAgICByb3VuZC1yb2JpbiBleHRyYXRpbWU6IGVuZCBvZiBleHRy
YVENCi0gICAgIHdlaWdodGVkIGV4dC46IGluc2VydCBpbiBzb3J0ZWQgbGlzdCBieSBzY29yZQ0K
LSAgIGlmIHRoZSBkb21haW4gaXMgYmxvY2tlZCAvIGhhcyByZWdhaW5lZCBpdHMgc2hvcnQtYmxv
Y2stbG9zcw0KLSAgIHRpbWUgaXQgaXMgbm90IHB1dCBvbiBhbnkgcXVldWUgKi8NCisvKg0KKyAq
IHJlbW92ZXMgYSBkb21haW4gZnJvbSB0aGUgaGVhZCBvZiB0aGUgYWNjb3JkaW5nIGV4dHJhUSBh
bmQNCisgKiByZXF1ZXVlcyBpdCBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbjoNCisgKiAgIHJvdW5k
LXJvYmluIGV4dHJhdGltZTogZW5kIG9mIGV4dHJhUQ0KKyAqICAgd2VpZ2h0ZWQgZXh0LjogaW5z
ZXJ0IGluIHNvcnRlZCBsaXN0IGJ5IHNjb3JlDQorICogaWYgdGhlIGRvbWFpbiBpcyBibG9ja2Vk
IC8gaGFzIHJlZ2FpbmVkIGl0cyBzaG9ydC1ibG9jay1sb3NzDQorICogdGltZSBpdCBpcyBub3Qg
cHV0IG9uIGFueSBxdWV1ZS4NCisgKi8NCiBzdGF0aWMgdm9pZCBkZXNjaGVkX2V4dHJhX2RvbShz
X3RpbWVfdCBub3csIHN0cnVjdCB2Y3B1ICpkKQ0KIHsNCiAgICAgc3RydWN0IHNlZGZfdmNwdV9p
bmZvICppbmYgPSBFRE9NX0lORk8oZCk7DQpAQCAtNjI1LDI5ICs1NzQsMjUgQEAgc3RhdGljIHZv
aWQgZGVzY2hlZF9leHRyYV9kb20oc190aW1lX3Qgbg0KIA0KICAgICBBU1NFUlQoZXh0cmFxX29u
KGQsIGkpKTsNCiANCi0gICAgLyogVW5zZXQgYWxsIHJ1bm5pbmcgZmxhZ3MuICovDQorICAgIC8q
IFVuc2V0IGFsbCBydW5uaW5nIGZsYWdzICovDQogICAgIGluZi0+c3RhdHVzICAmPSB+KEVYVFJB
X1JVTl9QRU4gfCBFWFRSQV9SVU5fVVRJTCk7DQotICAgIC8qIEZyZXNoIHNsaWNlIGZvciB0aGUg
bmV4dCBydW4uICovDQorICAgIC8qIEZyZXNoIHNsaWNlIGZvciB0aGUgbmV4dCBydW4gKi8NCiAg
ICAgaW5mLT5jcHV0aW1lID0gMDsNCi0gICAgLyogQWNjdW11bGF0ZSB0b3RhbCBleHRyYXRpbWUu
ICovDQorICAgIC8qIEFjY3VtdWxhdGUgdG90YWwgZXh0cmF0aW1lICovDQogICAgIGluZi0+ZXh0
cmFfdGltZV90b3QgKz0gbm93IC0gaW5mLT5zY2hlZF9zdGFydF9hYnM7DQogICAgIC8qIFJlbW92
ZSBleHRyYWRvbWFpbiBmcm9tIGhlYWQgb2YgdGhlIHF1ZXVlLiAqLw0KICAgICBleHRyYXFfZGVs
KGQsIGkpOw0KIA0KLSAgICAvKiBVcGRhdGUgdGhlIHNjb3JlLiAqLw0KKyAgICAvKiBVcGRhdGUg
dGhlIHNjb3JlICovDQogICAgIG9sZHNjb3JlID0gaW5mLT5zY29yZVtpXTsNCiAgICAgaWYgKCBp
ID09IEVYVFJBX1BFTl9RICkNCiAgICAgew0KLSAgICAgICAgLypkb21haW4gd2FzIHJ1bm5pbmcg
aW4gTDAgZXh0cmFxKi8NCi0gICAgICAgIC8qcmVkdWNlIGJsb2NrIGxvc3QsIHByb2JhYmx5IG1v
cmUgc29waGlzdGljYXRpb24gaGVyZSEqLw0KKyAgICAgICAgLyogRG9tYWluIHdhcyBydW5uaW5n
IGluIEwwIGV4dHJhcSAqLw0KKyAgICAgICAgLyogcmVkdWNlIGJsb2NrIGxvc3QsIHByb2JhYmx5
IG1vcmUgc29waGlzdGljYXRpb24gaGVyZSEqLw0KICAgICAgICAgLyppbmYtPnNob3J0X2Jsb2Nr
X2xvc3RfdG90IC09IEVYVFJBX1FVQU5UVU07Ki8NCiAgICAgICAgIGluZi0+c2hvcnRfYmxvY2tf
bG9zdF90b3QgLT0gbm93IC0gaW5mLT5zY2hlZF9zdGFydF9hYnM7DQotICAgICAgICBQUklOVCgz
LCJEb21haW4gJWkuJWk6IFNob3J0X2Jsb2NrX2xvc3M6ICUiUFJJaTY0IlxuIiwgDQotICAgICAg
ICAgICAgICBpbmYtPnZjcHUtPmRvbWFpbi0+ZG9tYWluX2lkLCBpbmYtPnZjcHUtPnZjcHVfaWQs
DQotICAgICAgICAgICAgICBpbmYtPnNob3J0X2Jsb2NrX2xvc3RfdG90KTsNCiAjaWYgMA0KLSAg
ICAgICAgLyoNCi0gICAgICAgICAqIEtBRjogSWYgd2UgZG9uJ3QgZXhpdCBzaG9ydC1ibG9ja2lu
ZyBzdGF0ZSBhdCB0aGlzIHBvaW50DQorICAgICAgICAvKiBLQUY6IElmIHdlIGRvbid0IGV4aXQg
c2hvcnQtYmxvY2tpbmcgc3RhdGUgYXQgdGhpcyBwb2ludA0KICAgICAgICAgICogZG9tYWluMCBj
YW4gc3RlYWwgYWxsIENQVSBmb3IgdXAgdG8gMTAgc2Vjb25kcyBiZWZvcmUNCiAgICAgICAgICAq
IHNjaGVkdWxpbmcgc2V0dGxlcyBkb3duICh3aGVuIGNvbXBldGluZyBhZ2FpbnN0IGFub3RoZXIN
CiAgICAgICAgICAqIENQVS1ib3VuZCBkb21haW4pLiBEb2luZyB0aGlzIHNlZW1zIHRvIG1ha2Ug
dGhpbmdzIGJlaGF2ZQ0KQEAgLTY1Niw1MSArNjAxLDU5IEBAIHN0YXRpYyB2b2lkIGRlc2NoZWRf
ZXh0cmFfZG9tKHNfdGltZV90IG4NCiAgICAgICAgIGlmICggaW5mLT5zaG9ydF9ibG9ja19sb3N0
X3RvdCA8PSAwICkNCiAjZW5kaWYNCiAgICAgICAgIHsNCi0gICAgICAgICAgICBQUklOVCg0LCJE
b21haW4gJWkuJWkgY29tcGVuc2F0ZWQgc2hvcnQgYmxvY2sgbG9zcyFcbiIsDQotICAgICAgICAg
ICAgICAgICAgaW5mLT52Y3B1LT5kb21haW4tPmRvbWFpbl9pZCwgaW5mLT52Y3B1LT52Y3B1X2lk
KTsNCi0gICAgICAgICAgICAvKndlIGhhdmUgKG92ZXItKWNvbXBlbnNhdGVkIG91ciBibG9jayBw
ZW5hbHR5Ki8NCisgICAgICAgICAgICAvKiBXZSBoYXZlIChvdmVyLSljb21wZW5zYXRlZCBvdXIg
YmxvY2sgcGVuYWx0eSAqLw0KICAgICAgICAgICAgIGluZi0+c2hvcnRfYmxvY2tfbG9zdF90b3Qg
PSAwOw0KLSAgICAgICAgICAgIC8qd2UgZG9uJ3Qgd2FudCBhIHBsYWNlIG9uIHRoZSBwZW5hbHR5
IHF1ZXVlIGFueW1vcmUhKi8NCisgICAgICAgICAgICAvKiBXZSBkb24ndCB3YW50IGEgcGxhY2Ug
b24gdGhlIHBlbmFsdHkgcXVldWUgYW55bW9yZSEgKi8NCiAgICAgICAgICAgICBpbmYtPnN0YXR1
cyAmPSB+RVhUUkFfV0FOVF9QRU5fUTsNCiAgICAgICAgICAgICBnb3RvIGNoZWNrX2V4dHJhX3F1
ZXVlczsNCiAgICAgICAgIH0NCiANCi0gICAgICAgIC8qd2UgaGF2ZSB0byBnbyBhZ2FpbiBmb3Ig
YW5vdGhlciB0cnkgaW4gdGhlIGJsb2NrLWV4dHJhcSwNCi0gICAgICAgICAgdGhlIHNjb3JlIGlz
IG5vdCB1c2VkIGluY3JlbWFudGFsbHkgaGVyZSwgYXMgdGhpcyBpcw0KLSAgICAgICAgICBhbHJl
YWR5IGRvbmUgYnkgcmVjYWxjdWxhdGluZyB0aGUgYmxvY2tfbG9zdCovDQorICAgICAgICAvKg0K
KyAgICAgICAgICogV2UgaGF2ZSB0byBnbyBhZ2FpbiBmb3IgYW5vdGhlciB0cnkgaW4gdGhlIGJs
b2NrLWV4dHJhcSwNCisgICAgICAgICAqIHRoZSBzY29yZSBpcyBub3QgdXNlZCBpbmNyZW1hbnRh
bGx5IGhlcmUsIGFzIHRoaXMgaXMNCisgICAgICAgICAqIGFscmVhZHkgZG9uZSBieSByZWNhbGN1
bGF0aW5nIHRoZSBibG9ja19sb3N0DQorICAgICAgICAgKi8NCiAgICAgICAgIGluZi0+c2NvcmVb
RVhUUkFfUEVOX1FdID0gKGluZi0+cGVyaW9kIDw8IDEwKSAvDQogICAgICAgICAgICAgaW5mLT5z
aG9ydF9ibG9ja19sb3N0X3RvdDsNCiAgICAgICAgIG9sZHNjb3JlID0gMDsNCiAgICAgfQ0KICAg
ICBlbHNlDQogICAgIHsNCi0gICAgICAgIC8qZG9tYWluIHdhcyBydW5uaW5nIGluIEwxIGV4dHJh
cSA9PiBzY29yZSBpcyBpbnZlcnNlIG9mDQotICAgICAgICAgIHV0aWxpemF0aW9uIGFuZCBpcyB1
c2VkIHNvbWV3aGF0IGluY3JlbWVudGFsISovDQorICAgICAgICAvKg0KKyAgICAgICAgICogRG9t
YWluIHdhcyBydW5uaW5nIGluIEwxIGV4dHJhcSA9PiBzY29yZSBpcyBpbnZlcnNlIG9mDQorICAg
ICAgICAgKiB1dGlsaXphdGlvbiBhbmQgaXMgdXNlZCBzb21ld2hhdCBpbmNyZW1lbnRhbCENCisg
ICAgICAgICAqLw0KICAgICAgICAgaWYgKCAhaW5mLT5leHRyYXdlaWdodCApDQotICAgICAgICAg
ICAgLypOQjogdXNlIGZpeGVkIHBvaW50IGFyaXRobWV0aWMgd2l0aCAxMCBiaXRzKi8NCisgICAg
ICAgIHsNCisgICAgICAgICAgICAvKiBOQjogdXNlIGZpeGVkIHBvaW50IGFyaXRobWV0aWMgd2l0
aCAxMCBiaXRzICovDQogICAgICAgICAgICAgaW5mLT5zY29yZVtFWFRSQV9VVElMX1FdID0gKGlu
Zi0+cGVyaW9kIDw8IDEwKSAvDQogICAgICAgICAgICAgICAgIGluZi0+c2xpY2U7DQorICAgICAg
ICB9DQogICAgICAgICBlbHNlDQotICAgICAgICAgICAgLypjb252ZXJzaW9uIGJldHdlZW4gcmVh
bHRpbWUgdXRpbGlzYXRpb24gYW5kIGV4dHJhd2llZ2h0Og0KLSAgICAgICAgICAgICAgZnVsbCAo
aWUgMTAwJSkgdXRpbGl6YXRpb24gaXMgZXF1aXZhbGVudCB0byAxMjggZXh0cmF3ZWlnaHQqLw0K
KyAgICAgICAgew0KKyAgICAgICAgICAgIC8qDQorICAgICAgICAgICAgICogQ29udmVyc2lvbiBi
ZXR3ZWVuIHJlYWx0aW1lIHV0aWxpc2F0aW9uIGFuZCBleHRyYXdpZWdodDoNCisgICAgICAgICAg
ICAgKiBmdWxsIChpZSAxMDAlKSB1dGlsaXphdGlvbiBpcyBlcXVpdmFsZW50IHRvIDEyOCBleHRy
YXdlaWdodA0KKyAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgIGluZi0+c2NvcmVbRVhUUkFf
VVRJTF9RXSA9ICgxPDwxNykgLyBpbmYtPmV4dHJhd2VpZ2h0Ow0KKyAgICAgICAgfQ0KICAgICB9
DQogDQogIGNoZWNrX2V4dHJhX3F1ZXVlczoNCi0gICAgLyogQWRkaW5nIGEgcnVubmFibGUgZG9t
YWluIHRvIHRoZSByaWdodCBxdWV1ZSBhbmQgcmVtb3ZpbmcgYmxvY2tlZCBvbmVzKi8NCisgICAg
LyogQWRkaW5nIGEgcnVubmFibGUgZG9tYWluIHRvIHRoZSByaWdodCBxdWV1ZSBhbmQgcmVtb3Zp
bmcgYmxvY2tlZCBvbmVzICovDQogICAgIGlmICggc2VkZl9ydW5uYWJsZShkKSApDQogICAgIHsN
Ci0gICAgICAgIC8qYWRkIGFjY29yZGluZyB0byBzY29yZTogd2VpZ2h0ZWQgcm91bmQgcm9iaW4q
Lw0KKyAgICAgICAgLyogQWRkIGFjY29yZGluZyB0byBzY29yZTogd2VpZ2h0ZWQgcm91bmQgcm9i
aW4gKi8NCiAgICAgICAgIGlmICgoKGluZi0+c3RhdHVzICYgRVhUUkFfQVdBUkUpICYmIChpID09
IEVYVFJBX1VUSUxfUSkpIHx8DQogICAgICAgICAgICAgKChpbmYtPnN0YXR1cyAmIEVYVFJBX1dB
TlRfUEVOX1EpICYmIChpID09IEVYVFJBX1BFTl9RKSkpDQogICAgICAgICAgICAgZXh0cmFxX2Fk
ZF9zb3J0X3VwZGF0ZShkLCBpLCBvbGRzY29yZSk7DQogICAgIH0NCiAgICAgZWxzZQ0KICAgICB7
DQotICAgICAgICAvKnJlbW92ZSB0aGlzIGJsb2NrZWQgZG9tYWluIGZyb20gdGhlIHdhaXRxISov
DQorICAgICAgICAvKiBSZW1vdmUgdGhpcyBibG9ja2VkIGRvbWFpbiBmcm9tIHRoZSB3YWl0cSEg
Ki8NCiAgICAgICAgIF9fZGVsX2Zyb21fcXVldWUoZCk7DQotICAgICAgICAvKm1ha2Ugc3VyZSB0
aGF0IHdlIHJlbW92ZSBhIGJsb2NrZWQgZG9tYWluIGZyb20gdGhlIG90aGVyDQotICAgICAgICAg
IGV4dHJhcSB0b28qLw0KKyAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgcmVtb3ZlIGEgYmxv
Y2tlZCBkb21haW4gZnJvbSB0aGUgb3RoZXINCisgICAgICAgICAqIGV4dHJhcSB0b28uICovDQog
ICAgICAgICBpZiAoIGkgPT0gRVhUUkFfUEVOX1EgKQ0KICAgICAgICAgew0KICAgICAgICAgICAg
IGlmICggZXh0cmFxX29uKGQsIEVYVFJBX1VUSUxfUSkgKQ0KQEAgLTczMiw4ICs2ODUsMTAgQEAg
c3RhdGljIHN0cnVjdCB0YXNrX3NsaWNlIHNlZGZfZG9fZXh0cmFfcw0KIA0KICAgICBpZiAoICFs
aXN0X2VtcHR5KGV4dHJhcVtFWFRSQV9QRU5fUV0pICkNCiAgICAgew0KLSAgICAgICAgLyp3ZSBz
dGlsbCBoYXZlIGVsZW1lbnRzIG9uIHRoZSBsZXZlbCAwIGV4dHJhcSANCi0gICAgICAgICAgPT4g
bGV0IHRob3NlIHJ1biBmaXJzdCEqLw0KKyAgICAgICAgLyoNCisgICAgICAgICAqIFdlIHN0aWxs
IGhhdmUgZWxlbWVudHMgb24gdGhlIGxldmVsIDAgZXh0cmFxDQorICAgICAgICAgKiA9PiBsZXQg
dGhvc2UgcnVuIGZpcnN0IQ0KKyAgICAgICAgICovDQogICAgICAgICBydW5pbmYgICA9IGxpc3Rf
ZW50cnkoZXh0cmFxW0VYVFJBX1BFTl9RXS0+bmV4dCwgDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc3RydWN0IHNlZGZfdmNwdV9pbmZvLCBleHRyYWxpc3RbRVhUUkFfUEVOX1FdKTsN
CiAgICAgICAgIHJ1bmluZi0+c3RhdHVzIHw9IEVYVFJBX1JVTl9QRU47DQpAQCAtNzQ3LDcgKzcw
Miw3IEBAIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX2V4dHJhX3MNCiAgICAgew0K
ICAgICAgICAgaWYgKCAhbGlzdF9lbXB0eShleHRyYXFbRVhUUkFfVVRJTF9RXSkgKQ0KICAgICAg
ICAgew0KLSAgICAgICAgICAgIC8qdXNlIGVsZW1lbnRzIGZyb20gdGhlIG5vcm1hbCBleHRyYXF1
ZXVlKi8NCisgICAgICAgICAgICAvKiBVc2UgZWxlbWVudHMgZnJvbSB0aGUgbm9ybWFsIGV4dHJh
cXVldWUgKi8NCiAgICAgICAgICAgICBydW5pbmYgICA9IGxpc3RfZW50cnkoZXh0cmFxW0VYVFJB
X1VUSUxfUV0tPm5leHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVj
dCBzZWRmX3ZjcHVfaW5mbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0
cmFsaXN0W0VYVFJBX1VUSUxfUV0pOw0KQEAgLTc3MiwxMSArNzI3LDEzIEBAIHN0YXRpYyBzdHJ1
Y3QgdGFza19zbGljZSBzZWRmX2RvX2V4dHJhX3MNCiB9DQogDQogDQotLyogTWFpbiBzY2hlZHVs
aW5nIGZ1bmN0aW9uDQotICAgUmVhc29ucyBmb3IgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFyZToN
Ci0gICAtdGltZXNsaWNlIGZvciB0aGUgY3VycmVudCBwZXJpb2QgdXNlZCB1cA0KLSAgIC1kb21h
aW4gb24gd2FpdHF1ZXVlIGhhcyBzdGFydGVkIGl0J3MgcGVyaW9kDQotICAgLWFuZCB2YXJpb3Vz
IG90aGVycyA7KSBpbiBnZW5lcmFsOiBkZXRlcm1pbmUgd2hpY2ggZG9tYWluIHRvIHJ1biBuZXh0
Ki8NCisvKg0KKyAqIE1haW4gc2NoZWR1bGluZyBmdW5jdGlvbg0KKyAqIFJlYXNvbnMgZm9yIGNh
bGxpbmcgdGhpcyBmdW5jdGlvbiBhcmU6DQorICogLXRpbWVzbGljZSBmb3IgdGhlIGN1cnJlbnQg
cGVyaW9kIHVzZWQgdXANCisgKiAtZG9tYWluIG9uIHdhaXRxdWV1ZSBoYXMgc3RhcnRlZCBpdCdz
IHBlcmlvZA0KKyAqIC1hbmQgdmFyaW91cyBvdGhlcnMgOykgaW4gZ2VuZXJhbDogZGV0ZXJtaW5l
IHdoaWNoIGRvbWFpbiB0byBydW4gbmV4dA0KKyAqLw0KIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGlj
ZSBzZWRmX2RvX3NjaGVkdWxlKA0KICAgICBjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHNf
dGltZV90IG5vdywgYm9vbF90IHRhc2tsZXRfd29ya19zY2hlZHVsZWQpDQogew0KQEAgLTc4OSwx
MyArNzQ2LDE1IEBAIHN0YXRpYyBzdHJ1Y3QgdGFza19zbGljZSBzZWRmX2RvX3NjaGVkdWwNCiAg
ICAgc3RydWN0IHNlZGZfdmNwdV9pbmZvICpydW5pbmYsICp3YWl0aW5mOw0KICAgICBzdHJ1Y3Qg
dGFza19zbGljZSAgICAgIHJldDsNCiANCi0gICAgLyppZGxlIHRhc2tzIGRvbid0IG5lZWQgYW55
IG9mIHRoZSBmb2xsb3dpbmcgc3R1ZiovDQorICAgIC8qIElkbGUgdGFza3MgZG9uJ3QgbmVlZCBh
bnkgb2YgdGhlIGZvbGxvd2luZyBzdHVmICovDQogICAgIGlmICggaXNfaWRsZV92Y3B1KGN1cnJl
bnQpICkNCiAgICAgICAgIGdvdG8gY2hlY2tfd2FpdHE7DQotIA0KLSAgICAvKiBjcmVhdGUgbG9j
YWwgc3RhdGUgb2YgdGhlIHN0YXR1cyBvZiB0aGUgZG9tYWluLCBpbiBvcmRlciB0byBhdm9pZA0K
LSAgICAgICBpbmNvbnNpc3RlbnQgc3RhdGUgZHVyaW5nIHNjaGVkdWxpbmcgZGVjaXNpb25zLCBi
ZWNhdXNlIGRhdGEgZm9yDQotICAgICAgIHZjcHVfcnVubmFibGUgaXMgbm90IHByb3RlY3RlZCBi
eSB0aGUgc2NoZWR1bGluZyBsb2NrISovDQorDQorICAgIC8qDQorICAgICAqIENyZWF0ZSBsb2Nh
bCBzdGF0ZSBvZiB0aGUgc3RhdHVzIG9mIHRoZSBkb21haW4sIGluIG9yZGVyIHRvIGF2b2lkDQor
ICAgICAqIGluY29uc2lzdGVudCBzdGF0ZSBkdXJpbmcgc2NoZWR1bGluZyBkZWNpc2lvbnMsIGJl
Y2F1c2UgZGF0YSBmb3INCisgICAgICogdmNwdV9ydW5uYWJsZSBpcyBub3QgcHJvdGVjdGVkIGJ5
IHRoZSBzY2hlZHVsaW5nIGxvY2shDQorICAgICAqLw0KICAgICBpZiAoICF2Y3B1X3J1bm5hYmxl
KGN1cnJlbnQpICkNCiAgICAgICAgIGluZi0+c3RhdHVzIHw9IFNFREZfQVNMRUVQOw0KICANCkBA
IC04MDQsNyArNzYzLDcgQEAgc3RhdGljIHN0cnVjdCB0YXNrX3NsaWNlIHNlZGZfZG9fc2NoZWR1
bA0KIA0KICAgICBpZiAoIHVubGlrZWx5KGV4dHJhX3J1bnMoaW5mKSkgKQ0KICAgICB7DQotICAg
ICAgICAvKnNwZWNpYWwgdHJlYXRtZW50IG9mIGRvbWFpbnMgcnVubmluZyBpbiBleHRyYSB0aW1l
Ki8NCisgICAgICAgIC8qIFNwZWNpYWwgdHJlYXRtZW50IG9mIGRvbWFpbnMgcnVubmluZyBpbiBl
eHRyYSB0aW1lICovDQogICAgICAgICBkZXNjaGVkX2V4dHJhX2RvbShub3csIGN1cnJlbnQpOw0K
ICAgICB9DQogICAgIGVsc2UgDQpAQCAtODE0LDEwICs3NzMsMTIgQEAgc3RhdGljIHN0cnVjdCB0
YXNrX3NsaWNlIHNlZGZfZG9fc2NoZWR1bA0KICBjaGVja193YWl0cToNCiAgICAgdXBkYXRlX3F1
ZXVlcyhub3csIHJ1bnEsIHdhaXRxKTsNCiANCi0gICAgLypub3cgc2ltcGx5IHBpY2sgdGhlIGZp
cnN0IGRvbWFpbiBmcm9tIHRoZSBydW5xdWV1ZSwgd2hpY2ggaGFzIHRoZQ0KLSAgICAgIGVhcmxp
ZXN0IGRlYWRsaW5lLCBiZWNhdXNlIHRoZSBsaXN0IGlzIHNvcnRlZCovDQotIA0KLSAgICAvKiBU
YXNrbGV0IHdvcmsgKHdoaWNoIHJ1bnMgaW4gaWRsZSBWQ1BVIGNvbnRleHQpIG92ZXJyaWRlcyBh
bGwgZWxzZS4gKi8NCisgICAgLyoNCisgICAgICogTm93IHNpbXBseSBwaWNrIHRoZSBmaXJzdCBk
b21haW4gZnJvbSB0aGUgcnVucXVldWUsIHdoaWNoIGhhcyB0aGUNCisgICAgICogZWFybGllc3Qg
ZGVhZGxpbmUsIGJlY2F1c2UgdGhlIGxpc3QgaXMgc29ydGVkDQorICAgICAqDQorICAgICAqIFRh
c2tsZXQgd29yayAod2hpY2ggcnVucyBpbiBpZGxlIFZDUFUgY29udGV4dCkgb3ZlcnJpZGVzIGFs
bCBlbHNlLg0KKyAgICAgKi8NCiAgICAgaWYgKCB0YXNrbGV0X3dvcmtfc2NoZWR1bGVkIHx8DQog
ICAgICAgICAgKGxpc3RfZW1wdHkocnVucSkgJiYgbGlzdF9lbXB0eSh3YWl0cSkpIHx8DQogICAg
ICAgICAgdW5saWtlbHkoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBTRURGX0NQVU9OTElORShwZXJf
Y3B1KGNwdXBvb2wsIGNwdSkpKSkgKQ0KQEAgLTgzMyw5ICs3OTQsMTEgQEAgc3RhdGljIHN0cnVj
dCB0YXNrX3NsaWNlIHNlZGZfZG9fc2NoZWR1bA0KICAgICAgICAgew0KICAgICAgICAgICAgIHdh
aXRpbmYgID0gbGlzdF9lbnRyeSh3YWl0cS0+bmV4dCwNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc3RydWN0IHNlZGZfdmNwdV9pbmZvLGxpc3QpOw0KLSAgICAgICAgICAgIC8q
cmVydW4gc2NoZWR1bGVyLCB3aGVuIHNjaGVkdWxlZCBkb21haW4gcmVhY2hlcyBpdCdzDQotICAg
ICAgICAgICAgICBlbmQgb2Ygc2xpY2Ugb3IgdGhlIGZpcnN0IGRvbWFpbiBmcm9tIHRoZSB3YWl0
cXVldWUNCi0gICAgICAgICAgICAgIGdldHMgcmVhZHkqLw0KKyAgICAgICAgICAgIC8qDQorICAg
ICAgICAgICAgICogUmVydW4gc2NoZWR1bGVyLCB3aGVuIHNjaGVkdWxlZCBkb21haW4gcmVhY2hl
cyBpdCdzDQorICAgICAgICAgICAgICogZW5kIG9mIHNsaWNlIG9yIHRoZSBmaXJzdCBkb21haW4g
ZnJvbSB0aGUgd2FpdHF1ZXVlDQorICAgICAgICAgICAgICogZ2V0cyByZWFkeS4NCisgICAgICAg
ICAgICAgKi8NCiAgICAgICAgICAgICByZXQudGltZSA9IE1JTihub3cgKyBydW5pbmYtPnNsaWNl
IC0gcnVuaW5mLT5jcHV0aW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUklPRF9C
RUdJTih3YWl0aW5mKSkgLSBub3c7DQogICAgICAgICB9DQpAQCAtODQ3LDE0ICs4MTAsMTggQEAg
c3RhdGljIHN0cnVjdCB0YXNrX3NsaWNlIHNlZGZfZG9fc2NoZWR1bA0KICAgICBlbHNlDQogICAg
IHsNCiAgICAgICAgIHdhaXRpbmYgID0gbGlzdF9lbnRyeSh3YWl0cS0+bmV4dCxzdHJ1Y3Qgc2Vk
Zl92Y3B1X2luZm8sIGxpc3QpOw0KLSAgICAgICAgLyp3ZSBjb3VsZCBub3QgZmluZCBhbnkgc3Vp
dGFibGUgZG9tYWluIA0KLSAgICAgICAgICA9PiBsb29rIGZvciBkb21haW5zIHRoYXQgYXJlIGF3
YXJlIG9mIGV4dHJhdGltZSovDQorICAgICAgICAvKg0KKyAgICAgICAgICogV2UgY291bGQgbm90
IGZpbmQgYW55IHN1aXRhYmxlIGRvbWFpbiANCisgICAgICAgICAqID0+IGxvb2sgZm9yIGRvbWFp
bnMgdGhhdCBhcmUgYXdhcmUgb2YgZXh0cmF0aW1lDQorICAgICAgICAgKi8NCiAgICAgICAgIHJl
dCA9IHNlZGZfZG9fZXh0cmFfc2NoZWR1bGUobm93LCBQRVJJT0RfQkVHSU4od2FpdGluZiksDQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcSwgY3B1KTsNCiAgICAg
fQ0KIA0KLSAgICAvKlRPRE86IERvIHNvbWV0aGluZyBVU0VGVUwgd2hlbiB0aGlzIGhhcHBlbnMg
YW5kIGZpbmQgb3V0LCB3aHkgaXQNCi0gICAgICBzdGlsbCBjYW4gaGFwcGVuISEhKi8NCisgICAg
LyoNCisgICAgICogVE9ETzogRG8gc29tZXRoaW5nIFVTRUZVTCB3aGVuIHRoaXMgaGFwcGVucyBh
bmQgZmluZCBvdXQsIHdoeSBpdA0KKyAgICAgKiBzdGlsbCBjYW4gaGFwcGVuISEhDQorICAgICAq
Lw0KICAgICBpZiAoIHJldC50aW1lIDwgMCkNCiAgICAgew0KICAgICAgICAgcHJpbnRrKCJPdWNo
ISBXZSBhcmUgc2VyaW91c2x5IEJFSElORCBzY2hlZHVsZSEgJSJQUklpNjQiXG4iLA0KQEAgLTg3
NCw5ICs4NDEsNiBAQCBzdGF0aWMgc3RydWN0IHRhc2tfc2xpY2Ugc2VkZl9kb19zY2hlZHVsDQog
DQogc3RhdGljIHZvaWQgc2VkZl9zbGVlcChjb25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHN0
cnVjdCB2Y3B1ICpkKQ0KIHsNCi0gICAgUFJJTlQoMiwic2VkZl9zbGVlcCB3YXMgY2FsbGVkLCBk
b21haW4taWQgJWkuJWlcbiIsDQotICAgICAgICAgIGQtPmRvbWFpbi0+ZG9tYWluX2lkLCBkLT52
Y3B1X2lkKTsNCi0gDQogICAgIGlmICggaXNfaWRsZV92Y3B1KGQpICkNCiAgICAgICAgIHJldHVy
bjsNCiANCkBAIC04OTgsNyArODYyLDggQEAgc3RhdGljIHZvaWQgc2VkZl9zbGVlcChjb25zdCBz
dHJ1Y3Qgc2NoZQ0KIH0NCiANCiANCi0vKiBUaGlzIGZ1bmN0aW9uIHdha2VzIHVwIGEgZG9tYWlu
LCBpLmUuIG1vdmVzIHRoZW0gaW50byB0aGUgd2FpdHF1ZXVlDQorLyoNCisgKiBUaGlzIGZ1bmN0
aW9uIHdha2VzIHVwIGEgZG9tYWluLCBpLmUuIG1vdmVzIHRoZW0gaW50byB0aGUgd2FpdHF1ZXVl
DQogICogdGhpbmdzIHRvIG1lbnRpb24gYXJlOiBhZG1pc3Npb24gY29udHJvbCBpcyB0YWtpbmcg
cGxhY2Ugbm93aGVyZSBhdA0KICAqIHRoZSBtb21lbnQsIHNvIHdlIGNhbid0IGJlIHN1cmUsIHdo
ZXRoZXIgaXQgaXMgc2FmZSB0byB3YWtlIHRoZSBkb21haW4NCiAgKiB1cCBhdCBhbGwuIEFueXdh
eSwgZXZlbiBpZiBpdCBpcyBzYWZlICh0b3RhbCBjcHUgdXNhZ2UgPD0xMDAlKSB0aGVyZSBhcmUN
CkBAIC05NzIsMjcgKzkzNywzMSBAQCBzdGF0aWMgdm9pZCBzZWRmX3NsZWVwKGNvbnN0IHN0cnVj
dCBzY2hlDQogc3RhdGljIHZvaWQgdW5ibG9ja19zaG9ydF9leHRyYV9zdXBwb3J0KA0KICAgICBz
dHJ1Y3Qgc2VkZl92Y3B1X2luZm8qIGluZiwgc190aW1lX3Qgbm93KQ0KIHsNCi0gICAgLyp0aGlz
IHVuYmxvY2tpbmcgc2NoZW1lIHRyaWVzIHRvIHN1cHBvcnQgdGhlIGRvbWFpbiwgYnkgYXNzaWdu
aW5nIGl0DQotICAgIGEgcHJpb3JpdHkgaW4gZXh0cmF0aW1lIGRpc3RyaWJ1dGlvbiBhY2NvcmRp
bmcgdG8gdGhlIGxvc3Mgb2YgdGltZQ0KLSAgICBpbiB0aGlzIHNsaWNlIGR1ZSB0byBibG9ja2lu
ZyovDQorICAgIC8qDQorICAgICAqIFRoaXMgdW5ibG9ja2luZyBzY2hlbWUgdHJpZXMgdG8gc3Vw
cG9ydCB0aGUgZG9tYWluLCBieSBhc3NpZ25pbmcgaXQNCisgICAgICogYSBwcmlvcml0eSBpbiBl
eHRyYXRpbWUgZGlzdHJpYnV0aW9uIGFjY29yZGluZyB0byB0aGUgbG9zcyBvZiB0aW1lDQorICAg
ICAqIGluIHRoaXMgc2xpY2UgZHVlIHRvIGJsb2NraW5nDQorICAgICAqLw0KICAgICBzX3RpbWVf
dCBwZW47DQogIA0KLSAgICAvKm5vIG1vcmUgcmVhbHRpbWUgZXhlY3V0aW9uIGluIHRoaXMgcGVy
aW9kISovDQorICAgIC8qIE5vIG1vcmUgcmVhbHRpbWUgZXhlY3V0aW9uIGluIHRoaXMgcGVyaW9k
ISAqLw0KICAgICBpbmYtPmRlYWRsX2FicyArPSBpbmYtPnBlcmlvZDsNCiAgICAgaWYgKCBsaWtl
bHkoaW5mLT5ibG9ja19hYnMpICkNCiAgICAgew0KLSAgICAgICAgLy90cmVhdCBibG9ja2VkIHRp
bWUgYXMgY29uc3VtZWQgYnkgdGhlIGRvbWFpbiovDQorICAgICAgICAvKiBUcmVhdCBibG9ja2Vk
IHRpbWUgYXMgY29uc3VtZWQgYnkgdGhlIGRvbWFpbiAqLw0KICAgICAgICAgLyppbmYtPmNwdXRp
bWUgKz0gbm93IC0gaW5mLT5ibG9ja19hYnM7Ki8NCi0gICAgICAgIC8qcGVuYWx0eSBpcyB0aW1l
IHRoZSBkb21haW4gd291bGQgaGF2ZQ0KLSAgICAgICAgICBoYWQgaWYgaXQgY29udGludWVkIHRv
IHJ1biAqLw0KKyAgICAgICAgLyoNCisgICAgICAgICAqIFBlbmFsdHkgaXMgdGltZSB0aGUgZG9t
YWluIHdvdWxkIGhhdmUNCisgICAgICAgICAqIGhhZCBpZiBpdCBjb250aW51ZWQgdG8gcnVuLg0K
KyAgICAgICAgICovDQogICAgICAgICBwZW4gPSAoaW5mLT5zbGljZSAtIGluZi0+Y3B1dGltZSk7
DQogICAgICAgICBpZiAoIHBlbiA8IDAgKQ0KICAgICAgICAgICAgIHBlbiA9IDA7DQotICAgICAg
ICAvKmFjY3VtdWxhdGUgYWxsIHBlbmFsdGllcyBvdmVyIHRoZSBwZXJpb2RzKi8NCisgICAgICAg
IC8qIEFjY3VtdWxhdGUgYWxsIHBlbmFsdGllcyBvdmVyIHRoZSBwZXJpb2RzICovDQogICAgICAg
ICAvKmluZi0+c2hvcnRfYmxvY2tfbG9zdF90b3QgKz0gcGVuOyovDQotICAgICAgICAvKnNldCBw
ZW5hbHR5IHRvIHRoZSBjdXJyZW50IHZhbHVlKi8NCisgICAgICAgIC8qIFNldCBwZW5hbHR5IHRv
IHRoZSBjdXJyZW50IHZhbHVlICovDQogICAgICAgICBpbmYtPnNob3J0X2Jsb2NrX2xvc3RfdG90
ID0gcGVuOw0KLSAgICAgICAgLypub3Qgc3VyZSB3aGljaCBvbmUgaXMgYmV0dGVyLi4gYnV0IHNl
ZW1zIHRvIHdvcmsgd2VsbC4uLiovDQorICAgICAgICAvKiBOb3Qgc3VyZSB3aGljaCBvbmUgaXMg
YmV0dGVyLi4gYnV0IHNlZW1zIHRvIHdvcmsgd2VsbC4uLiAqLw0KICAgDQogICAgICAgICBpZiAo
IGluZi0+c2hvcnRfYmxvY2tfbG9zdF90b3QgKQ0KICAgICAgICAgew0KQEAgLTEwMDIsMjggKzk3
MSwzMSBAQCBzdGF0aWMgdm9pZCB1bmJsb2NrX3Nob3J0X2V4dHJhX3N1cHBvcnQoDQogICAgICAg
ICAgICAgaW5mLT5wZW5fZXh0cmFfYmxvY2tzKys7DQogI2VuZGlmDQogICAgICAgICAgICAgaWYg
KCBleHRyYXFfb24oaW5mLT52Y3B1LCBFWFRSQV9QRU5fUSkgKQ0KLSAgICAgICAgICAgICAgICAv
KnJlbW92ZSBkb21haW4gZm9yIHBvc3NpYmxlIHJlc29ydGluZyEqLw0KKyAgICAgICAgICAgICAg
ICAvKiBSZW1vdmUgZG9tYWluIGZvciBwb3NzaWJsZSByZXNvcnRpbmchICovDQogICAgICAgICAg
ICAgICAgIGV4dHJhcV9kZWwoaW5mLT52Y3B1LCBFWFRSQV9QRU5fUSk7DQogICAgICAgICAgICAg
ZWxzZQ0KLSAgICAgICAgICAgICAgICAvKnJlbWVtYmVyIHRoYXQgd2Ugd2FudCB0byBiZSBvbiB0
aGUgcGVuYWx0eSBxDQotICAgICAgICAgICAgICAgICAgc28gdGhhdCB3ZSBjYW4gY29udGludWUg
d2hlbiB3ZSAodW4tKWJsb2NrDQotICAgICAgICAgICAgICAgICAgaW4gcGVuYWx0eS1leHRyYXRp
bWUqLw0KKyAgICAgICAgICAgICAgICAvKg0KKyAgICAgICAgICAgICAgICAgKiBSZW1lbWJlciB0
aGF0IHdlIHdhbnQgdG8gYmUgb24gdGhlIHBlbmFsdHkgcQ0KKyAgICAgICAgICAgICAgICAgKiBz
byB0aGF0IHdlIGNhbiBjb250aW51ZSB3aGVuIHdlICh1bi0pYmxvY2sNCisgICAgICAgICAgICAg
ICAgICogaW4gcGVuYWx0eS1leHRyYXRpbWUNCisgICAgICAgICAgICAgICAgICovDQogICAgICAg
ICAgICAgICAgIGluZi0+c3RhdHVzIHw9IEVYVFJBX1dBTlRfUEVOX1E7DQogICAgDQotICAgICAg
ICAgICAgLyoocmUtKWFkZCBkb21haW4gdG8gdGhlIHBlbmFsdHkgZXh0cmFxKi8NCisgICAgICAg
ICAgICAvKiAocmUtKWFkZCBkb21haW4gdG8gdGhlIHBlbmFsdHkgZXh0cmFxICovDQogICAgICAg
ICAgICAgZXh0cmFxX2FkZF9zb3J0X3VwZGF0ZShpbmYtPnZjcHUsIEVYVFJBX1BFTl9RLCAwKTsN
CiAgICAgICAgIH0NCiAgICAgfQ0KIA0KLSAgICAvKmdpdmUgaXQgYSBmcmVzaCBzbGljZSBpbiB0
aGUgbmV4dCBwZXJpb2QhKi8NCisgICAgLyogR2l2ZSBpdCBhIGZyZXNoIHNsaWNlIGluIHRoZSBu
ZXh0IHBlcmlvZCEgKi8NCiAgICAgaW5mLT5jcHV0aW1lID0gMDsNCiB9DQogDQogDQogc3RhdGlj
IHZvaWQgdW5ibG9ja19sb25nX2NvbnNfYihzdHJ1Y3Qgc2VkZl92Y3B1X2luZm8qIGluZixzX3Rp
bWVfdCBub3cpDQogew0KLSAgICAvKkNvbnNlcnZhdGl2ZSAyYiovDQotICAgIC8qVHJlYXQgdGhl
IHVuYmxvY2tpbmcgdGltZSBhcyBhIHN0YXJ0IG9mIGEgbmV3IHBlcmlvZCAqLw0KKyAgICAvKiBD
b25zZXJ2YXRpdmUgMmIgKi8NCisNCisgICAgLyogVHJlYXQgdGhlIHVuYmxvY2tpbmcgdGltZSBh
cyBhIHN0YXJ0IG9mIGEgbmV3IHBlcmlvZCAqLw0KICAgICBpbmYtPmRlYWRsX2FicyA9IG5vdyAr
IGluZi0+cGVyaW9kOw0KICAgICBpbmYtPmNwdXRpbWUgPSAwOw0KIH0NCkBAIC0xMDQ2LDE1ICsx
MDE4LDE3IEBAIHN0YXRpYyBpbmxpbmUgaW50IGdldF9ydW5fdHlwZShzdHJ1Y3QgdmMNCiB9DQog
DQogDQotLypDb21wYXJlcyB0d28gZG9tYWlucyBpbiB0aGUgcmVsYXRpb24gb2Ygd2hldGhlciB0
aGUgb25lIGlzIGFsbG93ZWQgdG8NCi0gIGludGVycnVwdCB0aGUgb3RoZXJzIGV4ZWN1dGlvbi4N
Ci0gIEl0IHJldHVybnMgdHJ1ZSAoIT0wKSBpZiBhIHN3aXRjaCB0byB0aGUgb3RoZXIgZG9tYWlu
IGlzIGdvb2QuDQotICBDdXJyZW50IFByaW9yaXR5IHNjaGVtZSBpcyBhcyBmb2xsb3dzOg0KLSAg
IEVERiA+IEwwIChwZW5hbHR5IGJhc2VkKSBleHRyYS10aW1lID4gDQotICAgTDEgKHV0aWxpemF0
aW9uKSBleHRyYS10aW1lID4gaWRsZS1kb21haW4NCi0gIEluIHRoZSBzYW1lIGNsYXNzIHByaW9y
aXRpZXMgYXJlIGFzc2lnbmVkIGFzIGZvbGxvd2luZzoNCi0gICBFREY6IGVhcmx5IGRlYWRsaW5l
ID4gbGF0ZSBkZWFkbGluZQ0KLSAgIEwwIGV4dHJhLXRpbWU6IGxvd2VyIHNjb3JlID4gaGlnaGVy
IHNjb3JlKi8NCisvKg0KKyAqIENvbXBhcmVzIHR3byBkb21haW5zIGluIHRoZSByZWxhdGlvbiBv
ZiB3aGV0aGVyIHRoZSBvbmUgaXMgYWxsb3dlZCB0bw0KKyAqIGludGVycnVwdCB0aGUgb3RoZXJz
IGV4ZWN1dGlvbi4NCisgKiBJdCByZXR1cm5zIHRydWUgKCE9MCkgaWYgYSBzd2l0Y2ggdG8gdGhl
IG90aGVyIGRvbWFpbiBpcyBnb29kLg0KKyAqIEN1cnJlbnQgUHJpb3JpdHkgc2NoZW1lIGlzIGFz
IGZvbGxvd3M6DQorICogIEVERiA+IEwwIChwZW5hbHR5IGJhc2VkKSBleHRyYS10aW1lID4gDQor
ICogIEwxICh1dGlsaXphdGlvbikgZXh0cmEtdGltZSA+IGlkbGUtZG9tYWluDQorICogSW4gdGhl
IHNhbWUgY2xhc3MgcHJpb3JpdGllcyBhcmUgYXNzaWduZWQgYXMgZm9sbG93aW5nOg0KKyAqICBF
REY6IGVhcmx5IGRlYWRsaW5lID4gbGF0ZSBkZWFkbGluZQ0KKyAqICBMMCBleHRyYS10aW1lOiBs
b3dlciBzY29yZSA+IGhpZ2hlciBzY29yZQ0KKyAqLw0KIHN0YXRpYyBpbmxpbmUgaW50IHNob3Vs
ZF9zd2l0Y2goc3RydWN0IHZjcHUgKmN1ciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHN0cnVjdCB2Y3B1ICpvdGhlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNfdGltZV90IG5vdykNCkBAIC0xMDYzLDI2ICsxMDM3LDI1IEBAIHN0YXRpYyBpbmxpbmUgaW50
IHNob3VsZF9zd2l0Y2goc3RydWN0IHYNCiAgICAgY3VyX2luZiAgID0gRURPTV9JTkZPKGN1cik7
DQogICAgIG90aGVyX2luZiA9IEVET01fSU5GTyhvdGhlcik7DQogIA0KLSAgICAvKiBDaGVjayB3
aGV0aGVyIHdlIG5lZWQgdG8gbWFrZSBhbiBlYXJsaWVyIHNjaGVkdWxpbmcgZGVjaXNpb24uICov
DQorICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBtYWtlIGFuIGVhcmxpZXIgc2NoZWR1
bGluZyBkZWNpc2lvbiAqLw0KICAgICBpZiAoIFBFUklPRF9CRUdJTihvdGhlcl9pbmYpIDwgDQog
ICAgICAgICAgQ1BVX0lORk8ob3RoZXItPnByb2Nlc3NvciktPmN1cnJlbnRfc2xpY2VfZXhwaXJl
cyApDQogICAgICAgICByZXR1cm4gMTsNCiANCi0gICAgLyogTm8gdGltaW5nLWJhc2VkIHN3aXRj
aGVzIG5lZWQgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IGhlcmUuICovDQorICAgIC8qIE5vIHRp
bWluZy1iYXNlZCBzd2l0Y2hlcyBuZWVkIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBoZXJlICov
DQogICAgIHN3aXRjaCAoIGdldF9ydW5fdHlwZShjdXIpICkNCiAgICAgew0KICAgICBjYXNlIERP
TUFJTl9FREY6DQotICAgICAgICAvKiBEbyBub3QgaW50ZXJydXB0IGEgcnVubmluZyBFREYgZG9t
YWluLiAqLw0KKyAgICAgICAgLyogRG8gbm90IGludGVycnVwdCBhIHJ1bm5pbmcgRURGIGRvbWFp
biAqLw0KICAgICAgICAgcmV0dXJuIDA7DQogICAgIGNhc2UgRE9NQUlOX0VYVFJBX1BFTjoNCi0g
ICAgICAgIC8qIENoZWNrIHdoZXRoZXIgd2UgYWxzbyB3YW50IHRoZSBMMCBleC1xIHdpdGggbG93
ZXIgc2NvcmUuICovDQorICAgICAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGFsc28gd2FudCB0aGUg
TDAgZXgtcSB3aXRoIGxvd2VyIHNjb3JlICovDQogICAgICAgICByZXR1cm4gKChvdGhlcl9pbmYt
PnN0YXR1cyAmIEVYVFJBX1dBTlRfUEVOX1EpICYmDQogICAgICAgICAgICAgICAgIChvdGhlcl9p
bmYtPnNjb3JlW0VYVFJBX1BFTl9RXSA8IA0KICAgICAgICAgICAgICAgICAgY3VyX2luZi0+c2Nv
cmVbRVhUUkFfUEVOX1FdKSk7DQogICAgIGNhc2UgRE9NQUlOX0VYVFJBX1VUSUw6DQogICAgICAg
ICAvKiBDaGVjayB3aGV0aGVyIHdlIHdhbnQgdGhlIEwwIGV4dHJhcS4gRG9uJ3QNCi0gICAgICAg
ICAqIHN3aXRjaCBpZiBib3RoIGRvbWFpbnMgd2FudCBMMSBleHRyYXEuDQotICAgICAgICAgKi8N
CisgICAgICAgICAqIHN3aXRjaCBpZiBib3RoIGRvbWFpbnMgd2FudCBMMSBleHRyYXEuICovDQog
ICAgICAgICByZXR1cm4gISEob3RoZXJfaW5mLT5zdGF0dXMgJiBFWFRSQV9XQU5UX1BFTl9RKTsN
CiAgICAgY2FzZSBET01BSU5fSURMRToNCiAgICAgICAgIHJldHVybiAxOw0KQEAgLTEwOTYsMTgg
KzEwNjksMTEgQEAgc3RhdGljIHZvaWQgc2VkZl93YWtlKGNvbnN0IHN0cnVjdCBzY2hlZA0KICAg
ICBzX3RpbWVfdCAgICAgICAgICAgICAgbm93ID0gTk9XKCk7DQogICAgIHN0cnVjdCBzZWRmX3Zj
cHVfaW5mbyogaW5mID0gRURPTV9JTkZPKGQpOw0KIA0KLSAgICBQUklOVCgzLCAic2VkZl93YWtl
IHdhcyBjYWxsZWQsIGRvbWFpbi1pZCAlaS4laVxuIixkLT5kb21haW4tPmRvbWFpbl9pZCwNCi0g
ICAgICAgICAgZC0+dmNwdV9pZCk7DQotDQogICAgIGlmICggdW5saWtlbHkoaXNfaWRsZV92Y3B1
KGQpKSApDQogICAgICAgICByZXR1cm47DQogICAgDQogICAgIGlmICggdW5saWtlbHkoX190YXNr
X29uX3F1ZXVlKGQpKSApDQotICAgIHsNCi0gICAgICAgIFBSSU5UKDMsIlx0ZG9tYWluICVpLiVp
IGlzIGFscmVhZHkgaW4gc29tZSBxdWV1ZVxuIiwNCi0gICAgICAgICAgICAgIGQtPmRvbWFpbi0+
ZG9tYWluX2lkLCBkLT52Y3B1X2lkKTsNCiAgICAgICAgIHJldHVybjsNCi0gICAgfQ0KIA0KICAg
ICBBU1NFUlQoIXNlZGZfcnVubmFibGUoZCkpOw0KICAgICBpbmYtPnN0YXR1cyAmPSB+U0VERl9B
U0xFRVA7DQpAQCAtMTExNiwyOCArMTA4MiwyNSBAQCBzdGF0aWMgdm9pZCBzZWRmX3dha2UoY29u
c3Qgc3RydWN0IHNjaGVkDQogIA0KICAgICBpZiAoIHVubGlrZWx5KGluZi0+ZGVhZGxfYWJzID09
IDApICkNCiAgICAgew0KLSAgICAgICAgLyppbml0aWFsIHNldHVwIG9mIHRoZSBkZWFkbGluZSov
DQorICAgICAgICAvKiBJbml0aWFsIHNldHVwIG9mIHRoZSBkZWFkbGluZSAqLw0KICAgICAgICAg
aW5mLT5kZWFkbF9hYnMgPSBub3cgKyBpbmYtPnNsaWNlOw0KICAgICB9DQogICANCi0gICAgUFJJ
TlQoMywgIndha2luZyB1cCBkb21haW4gJWkuJWkgKGRlYWRsPSAlIlBSSXU2NCIgcGVyaW9kPSAl
IlBSSXU2NA0KLSAgICAgICAgICAibm93PSAlIlBSSXU2NCIpXG4iLA0KLSAgICAgICAgICBkLT5k
b21haW4tPmRvbWFpbl9pZCwgZC0+dmNwdV9pZCwgaW5mLT5kZWFkbF9hYnMsIGluZi0+cGVyaW9k
LCBub3cpOw0KLQ0KICNpZmRlZiBTRURGX1NUQVRTIA0KICAgICBpbmYtPmJsb2NrX3RvdCsrOw0K
ICNlbmRpZg0KIA0KICAgICBpZiAoIHVubGlrZWx5KG5vdyA8IFBFUklPRF9CRUdJTihpbmYpKSAp
DQogICAgIHsNCi0gICAgICAgIFBSSU5UKDQsImV4dHJhdGltZSB1bmJsb2NrXG4iKTsNCi0gICAg
ICAgIC8qIHVuYmxvY2tpbmcgaW4gZXh0cmEtdGltZSEgKi8NCisgICAgICAgIC8qIFVuYmxvY2tp
bmcgaW4gZXh0cmEtdGltZSEgKi8NCiAgICAgICAgIGlmICggaW5mLT5zdGF0dXMgJiBFWFRSQV9X
QU5UX1BFTl9RICkNCiAgICAgICAgIHsNCi0gICAgICAgICAgICAvKndlIGhhdmUgYSBkb21haW4g
dGhhdCB3YW50cyBjb21wZW5zYXRpb24NCi0gICAgICAgICAgICAgIGZvciBibG9jayBwZW5hbHR5
IGFuZCBkaWQganVzdCBibG9jayBpbg0KLSAgICAgICAgICAgICAgaXRzIGNvbXBlbnNhdGlvbiB0
aW1lLiBHaXZlIGl0IGFub3RoZXINCi0gICAgICAgICAgICAgIGNoYW5jZSEqLw0KKyAgICAgICAg
ICAgIC8qDQorICAgICAgICAgICAgICogV2UgaGF2ZSBhIGRvbWFpbiB0aGF0IHdhbnRzIGNvbXBl
bnNhdGlvbg0KKyAgICAgICAgICAgICAqIGZvciBibG9jayBwZW5hbHR5IGFuZCBkaWQganVzdCBi
bG9jayBpbg0KKyAgICAgICAgICAgICAqIGl0cyBjb21wZW5zYXRpb24gdGltZS4gR2l2ZSBpdCBh
bm90aGVyDQorICAgICAgICAgICAgICogY2hhbmNlIQ0KKyAgICAgICAgICAgICAqLw0KICAgICAg
ICAgICAgIGV4dHJhcV9hZGRfc29ydF91cGRhdGUoZCwgRVhUUkFfUEVOX1EsIDApOw0KICAgICAg
ICAgfQ0KICAgICAgICAgZXh0cmFxX2NoZWNrX2FkZF91bmJsb2NrZWQoZCwgMCk7DQpAQCAtMTE0
Niw4ICsxMTA5LDcgQEAgc3RhdGljIHZvaWQgc2VkZl93YWtlKGNvbnN0IHN0cnVjdCBzY2hlZA0K
ICAgICB7ICANCiAgICAgICAgIGlmICggbm93IDwgaW5mLT5kZWFkbF9hYnMgKQ0KICAgICAgICAg
ew0KLSAgICAgICAgICAgIFBSSU5UKDQsInNob3J0IHVuYmxvY2tpbmdcbiIpOw0KLSAgICAgICAg
ICAgIC8qc2hvcnQgYmxvY2tpbmcqLw0KKyAgICAgICAgICAgIC8qIFNob3J0IGJsb2NraW5nICov
DQogI2lmZGVmIFNFREZfU1RBVFMNCiAgICAgICAgICAgICBpbmYtPnNob3J0X2Jsb2NrX3RvdCsr
Ow0KICNlbmRpZg0KQEAgLTExNTcsOCArMTExOSw3IEBAIHN0YXRpYyB2b2lkIHNlZGZfd2FrZShj
b25zdCBzdHJ1Y3Qgc2NoZWQNCiAgICAgICAgIH0NCiAgICAgICAgIGVsc2UNCiAgICAgICAgIHsN
Ci0gICAgICAgICAgICBQUklOVCg0LCJsb25nIHVuYmxvY2tpbmdcbiIpOw0KLSAgICAgICAgICAg
IC8qbG9uZyB1bmJsb2NraW5nKi8NCisgICAgICAgICAgICAvKiBMb25nIHVuYmxvY2tpbmcgKi8N
CiAjaWZkZWYgU0VERl9TVEFUUw0KICAgICAgICAgICAgIGluZi0+bG9uZ19ibG9ja190b3QrKzsN
CiAjZW5kaWYNCkBAIC0xMTY4LDI0ICsxMTI5LDEzIEBAIHN0YXRpYyB2b2lkIHNlZGZfd2FrZShj
b25zdCBzdHJ1Y3Qgc2NoZWQNCiAgICAgICAgIH0NCiAgICAgfQ0KIA0KLSAgICBQUklOVCgzLCAi
d29rZSB1cCBkb21haW4gJWkuJWkgKGRlYWRsPSAlIlBSSXU2NCIgcGVyaW9kPSAlIlBSSXU2NA0K
LSAgICAgICAgICAibm93PSAlIlBSSXU2NCIpXG4iLA0KLSAgICAgICAgICBkLT5kb21haW4tPmRv
bWFpbl9pZCwgZC0+dmNwdV9pZCwgaW5mLT5kZWFkbF9hYnMsDQotICAgICAgICAgIGluZi0+cGVy
aW9kLCBub3cpOw0KLQ0KICAgICBpZiAoIFBFUklPRF9CRUdJTihpbmYpID4gbm93ICkNCi0gICAg
ew0KICAgICAgICAgX19hZGRfdG9fd2FpdHF1ZXVlX3NvcnQoZCk7DQotICAgICAgICBQUklOVCgz
LCJhZGRlZCB0byB3YWl0cVxuIik7DQotICAgIH0NCiAgICAgZWxzZQ0KLSAgICB7DQogICAgICAg
ICBfX2FkZF90b19ydW5xdWV1ZV9zb3J0KGQpOw0KLSAgICAgICAgUFJJTlQoMywiYWRkZWQgdG8g
cnVucVxuIik7DQotICAgIH0NCiAgDQogI2lmZGVmIFNFREZfU1RBVFMNCi0gICAgLypkbyBzb21l
IHN0YXRpc3RpY3MgaGVyZS4uLiovDQorICAgIC8qIERvIHNvbWUgc3RhdGlzdGljcyBoZXJlLi4u
ICovDQogICAgIGlmICggaW5mLT5ibG9ja19hYnMgIT0gMCApDQogICAgIHsNCiAgICAgICAgIGlu
Zi0+YmxvY2tfdGltZV90b3QgKz0gbm93IC0gaW5mLT5ibG9ja19hYnM7DQpAQCAtMTE5NCwxMiAr
MTE0NCwxNCBAQCBzdGF0aWMgdm9pZCBzZWRmX3dha2UoY29uc3Qgc3RydWN0IHNjaGVkDQogICAg
IH0NCiAjZW5kaWYNCiANCi0gICAgLypzYW5pdHkgY2hlY2s6IG1ha2Ugc3VyZSBlYWNoIGV4dHJh
LWF3YXJlIGRvbWFpbiBJUyBvbiB0aGUgdXRpbC1xISovDQorICAgIC8qIFNhbml0eSBjaGVjazog
bWFrZSBzdXJlIGVhY2ggZXh0cmEtYXdhcmUgZG9tYWluIElTIG9uIHRoZSB1dGlsLXEhICovDQog
ICAgIEFTU0VSVChJTVBMWShpbmYtPnN0YXR1cyAmIEVYVFJBX0FXQVJFLCBleHRyYXFfb24oZCwg
RVhUUkFfVVRJTF9RKSkpOw0KICAgICBBU1NFUlQoX190YXNrX29uX3F1ZXVlKGQpKTsNCi0gICAg
LypjaGVjayB3aGV0aGVyIHRoZSBhd2FrZW5lZCB0YXNrIG5lZWRzIHRvIGludm9rZSB0aGUgZG9f
c2NoZWR1bGUNCi0gICAgICByb3V0aW5lLiBUcnkgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcnVucyBi
dXQ6DQotICAgICAgU2F2ZSBhcHByb3hpbWF0aW9uOiBBbHdheXMgc3dpdGNoIHRvIHNjaGVkdWxl
ciEqLw0KKyAgICAvKg0KKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBhd2FrZW5lZCB0YXNrIG5l
ZWRzIHRvIGludm9rZSB0aGUgZG9fc2NoZWR1bGUNCisgICAgICogcm91dGluZS4gVHJ5IHRvIGF2
b2lkIHVubmVjZXNzYXJ5IHJ1bnMgYnV0Og0KKyAgICAgKiBTYXZlIGFwcHJveGltYXRpb246IEFs
d2F5cyBzd2l0Y2ggdG8gc2NoZWR1bGVyIQ0KKyAgICAgKi8NCiAgICAgQVNTRVJUKGQtPnByb2Nl
c3NvciA+PSAwKTsNCiAgICAgQVNTRVJUKGQtPnByb2Nlc3NvciA8IG5yX2NwdV9pZHMpOw0KICAg
ICBBU1NFUlQocGVyX2NwdShzY2hlZHVsZV9kYXRhLCBkLT5wcm9jZXNzb3IpLmN1cnIpOw0KQEAg
LTEyNDQsNyArMTE5Niw3IEBAIHN0YXRpYyB2b2lkIHNlZGZfZHVtcF9kb21haW4oc3RydWN0IHZj
cHUNCiB9DQogDQogDQotLyogZHVtcHMgYWxsIGRvbWFpbnMgb24gdGhlIHNwZWNpZmllZCBjcHUg
Ki8NCisvKiBEdW1wcyBhbGwgZG9tYWlucyBvbiB0aGUgc3BlY2lmaWVkIGNwdSAqLw0KIHN0YXRp
YyB2b2lkIHNlZGZfZHVtcF9jcHVfc3RhdGUoY29uc3Qgc3RydWN0IHNjaGVkdWxlciAqb3BzLCBp
bnQgaSkNCiB7DQogICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgICAqbGlzdCwgKnF1ZXVlLCAqdG1w
Ow0KQEAgLTEzMTksNyArMTI3MSw3IEBAIHN0YXRpYyB2b2lkIHNlZGZfZHVtcF9jcHVfc3RhdGUo
Y29uc3Qgc3QNCiB9DQogDQogDQotLyogQWRqdXN0cyBwZXJpb2RzIGFuZCBzbGljZXMgb2YgdGhl
IGRvbWFpbnMgYWNjb3JkaW5nbHkgdG8gdGhlaXIgd2VpZ2h0cy4gKi8NCisvKiBBZGp1c3RzIHBl
cmlvZHMgYW5kIHNsaWNlcyBvZiB0aGUgZG9tYWlucyBhY2NvcmRpbmdseSB0byB0aGVpciB3ZWln
aHRzICovDQogc3RhdGljIGludCBzZWRmX2FkanVzdF93ZWlnaHRzKHN0cnVjdCBjcHVwb29sICpj
LCBzdHJ1Y3QgeGVuX2RvbWN0bF9zY2hlZHVsZXJfb3AgKmNtZCkNCiB7DQogICAgIHN0cnVjdCB2
Y3B1ICpwOw0KQEAgLTEzMzUsNyArMTI4Nyw3IEBAIHN0YXRpYyBpbnQgc2VkZl9hZGp1c3Rfd2Vp
Z2h0cyhzdHJ1Y3QgY3ANCiAgICAgICAgIHJldHVybiAtRU5PTUVNOw0KICAgICB9DQogDQotICAg
IC8qIFN1bSBhY3Jvc3MgYWxsIHdlaWdodHMuICovDQorICAgIC8qIFN1bSBhY3Jvc3MgYWxsIHdl
aWdodHMgKi8NCiAgICAgcmN1X3JlYWRfbG9jaygmZG9tbGlzdF9yZWFkX2xvY2spOw0KICAgICBm
b3JfZWFjaF9kb21haW5faW5fY3B1cG9vbCggZCwgYyApDQogICAgIHsNCkBAIC0xMzUwLDExICsx
MzAyLDE0IEBAIHN0YXRpYyBpbnQgc2VkZl9hZGp1c3Rfd2VpZ2h0cyhzdHJ1Y3QgY3ANCiAgICAg
ICAgICAgICB9DQogICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgIHsNCi0gICAgICAgICAg
ICAgICAgLypkb24ndCBtb2RpZnkgZG9tYWlucyB3aG8gZG9uJ3QgaGF2ZSBhIHdlaWdodCwgYnV0
IHN1bQ0KLSAgICAgICAgICAgICAgICAgIHVwIHRoZSB0aW1lIHRoZXkgbmVlZCwgcHJvamVjdGVk
IHRvIGEgV0VJR0hUX1BFUklPRCwNCi0gICAgICAgICAgICAgICAgICBzbyB0aGF0IHRoaXMgdGlt
ZSBpcyBub3QgZ2l2ZW4gdG8gdGhlIHdlaWdodC1kcml2ZW4NCi0gICAgICAgICAgICAgICAgICBk
b21haW5zKi8NCi0gICAgICAgICAgICAgICAgLypjaGVjayBmb3Igb3ZlcmZsb3dzKi8NCisgICAg
ICAgICAgICAgICAgLyoNCisgICAgICAgICAgICAgICAgICogRG9uJ3QgbW9kaWZ5IGRvbWFpbnMg
d2hvIGRvbid0IGhhdmUgYSB3ZWlnaHQsIGJ1dCBzdW0NCisgICAgICAgICAgICAgICAgICogdXAg
dGhlIHRpbWUgdGhleSBuZWVkLCBwcm9qZWN0ZWQgdG8gYSBXRUlHSFRfUEVSSU9ELA0KKyAgICAg
ICAgICAgICAgICAgKiBzbyB0aGF0IHRoaXMgdGltZSBpcyBub3QgZ2l2ZW4gdG8gdGhlIHdlaWdo
dC1kcml2ZW4NCisgICAgICAgICAgICAgICAgICogIGRvbWFpbnMNCisgICAgICAgICAgICAgICAg
ICovDQorDQorICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvd3MgKi8NCiAgICAg
ICAgICAgICAgICAgQVNTRVJUKChXRUlHSFRfUEVSSU9EIDwgVUxPTkdfTUFYKSANCiAgICAgICAg
ICAgICAgICAgICAgICAgICYmIChFRE9NX0lORk8ocCktPnNsaWNlX29yaWcgPCBVTE9OR19NQVgp
KTsNCiAgICAgICAgICAgICAgICAgc3VtdFtjcHVdICs9IA0KQEAgLTEzNjUsNyArMTMyMCw3IEBA
IHN0YXRpYyBpbnQgc2VkZl9hZGp1c3Rfd2VpZ2h0cyhzdHJ1Y3QgY3ANCiAgICAgfQ0KICAgICBy
Y3VfcmVhZF91bmxvY2soJmRvbWxpc3RfcmVhZF9sb2NrKTsNCiANCi0gICAgLyogQWRqdXN0IGFs
bCBzbGljZXMgKGFuZCBwZXJpb2RzKSB0byB0aGUgbmV3IHdlaWdodC4gKi8NCisgICAgLyogQWRq
dXN0IGFsbCBzbGljZXMgKGFuZCBwZXJpb2RzKSB0byB0aGUgbmV3IHdlaWdodCAqLw0KICAgICBy
Y3VfcmVhZF9sb2NrKCZkb21saXN0X3JlYWRfbG9jayk7DQogICAgIGZvcl9lYWNoX2RvbWFpbl9p
bl9jcHVwb29sKCBkLCBjICkNCiAgICAgew0KQEAgLTEzOTMsMjAgKzEzNDgsMTUgQEAgc3RhdGlj
IGludCBzZWRmX2FkanVzdF93ZWlnaHRzKHN0cnVjdCBjcA0KIH0NCiANCiANCi0vKiBzZXQgb3Ig
ZmV0Y2ggZG9tYWluIHNjaGVkdWxpbmcgcGFyYW1ldGVycyAqLw0KKy8qIFNldCBvciBmZXRjaCBk
b21haW4gc2NoZWR1bGluZyBwYXJhbWV0ZXJzICovDQogc3RhdGljIGludCBzZWRmX2FkanVzdChj
b25zdCBzdHJ1Y3Qgc2NoZWR1bGVyICpvcHMsIHN0cnVjdCBkb21haW4gKnAsIHN0cnVjdCB4ZW5f
ZG9tY3RsX3NjaGVkdWxlcl9vcCAqb3ApDQogew0KICAgICBzdHJ1Y3QgdmNwdSAqdjsNCiAgICAg
aW50IHJjOw0KIA0KLSAgICBQUklOVCgyLCJzZWRmX2FkanVzdCB3YXMgY2FsbGVkLCBkb21haW4t
aWQgJWkgbmV3IHBlcmlvZCAlIlBSSXU2NCIgIg0KLSAgICAgICAgICAibmV3IHNsaWNlICUiUFJJ
dTY0IlxubGF0ZW5jeSAlIlBSSXU2NCIgZXh0cmE6JXNcbiIsDQotICAgICAgICAgIHAtPmRvbWFp
bl9pZCwgb3AtPnUuc2VkZi5wZXJpb2QsIG9wLT51LnNlZGYuc2xpY2UsDQotICAgICAgICAgIG9w
LT51LnNlZGYubGF0ZW5jeSwgKG9wLT51LnNlZGYuZXh0cmF0aW1lKT8ieWVzIjoibm8iKTsNCi0N
CiAgICAgaWYgKCBvcC0+Y21kID09IFhFTl9ET01DVExfU0NIRURPUF9wdXRpbmZvICkNCiAgICAg
ew0KLSAgICAgICAgLyogQ2hlY2sgZm9yIHNhbmUgcGFyYW1ldGVycy4gKi8NCisgICAgICAgIC8q
IENoZWNrIGZvciBzYW5lIHBhcmFtZXRlcnMgKi8NCiAgICAgICAgIGlmICggIW9wLT51LnNlZGYu
cGVyaW9kICYmICFvcC0+dS5zZWRmLndlaWdodCApDQogICAgICAgICAgICAgcmV0dXJuIC1FSU5W
QUw7DQogICAgICAgICBpZiAoIG9wLT51LnNlZGYud2VpZ2h0ICkNCkBAIC0xNDE0LDcgKzEzNjQs
NyBAQCBzdGF0aWMgaW50IHNlZGZfYWRqdXN0KGNvbnN0IHN0cnVjdCBzY2hlDQogICAgICAgICAg
ICAgaWYgKCAob3AtPnUuc2VkZi5leHRyYXRpbWUgJiBFWFRSQV9BV0FSRSkgJiYNCiAgICAgICAg
ICAgICAgICAgICghb3AtPnUuc2VkZi5wZXJpb2QpICkNCiAgICAgICAgICAgICB7DQotICAgICAg
ICAgICAgICAgIC8qIFdlaWdodC1kcml2ZW4gZG9tYWlucyB3aXRoIGV4dHJhdGltZSBvbmx5LiAq
Lw0KKyAgICAgICAgICAgICAgICAvKiBXZWlnaHQtZHJpdmVuIGRvbWFpbnMgd2l0aCBleHRyYXRp
bWUgb25seSAqLw0KICAgICAgICAgICAgICAgICBmb3JfZWFjaF92Y3B1ICggcCwgdiApDQogICAg
ICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgIEVET01fSU5GTyh2KS0+ZXh0cmF3
ZWlnaHQgPSBvcC0+dS5zZWRmLndlaWdodDsNCkBAIC0xNDI1LDcgKzEzNzUsNyBAQCBzdGF0aWMg
aW50IHNlZGZfYWRqdXN0KGNvbnN0IHN0cnVjdCBzY2hlDQogICAgICAgICAgICAgfQ0KICAgICAg
ICAgICAgIGVsc2UNCiAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8qIFdlaWdodC1k
cml2ZW4gZG9tYWlucyB3aXRoIHJlYWwtdGltZSBleGVjdXRpb24uICovDQorICAgICAgICAgICAg
ICAgIC8qIFdlaWdodC1kcml2ZW4gZG9tYWlucyB3aXRoIHJlYWwtdGltZSBleGVjdXRpb24gKi8N
CiAgICAgICAgICAgICAgICAgZm9yX2VhY2hfdmNwdSAoIHAsIHYgKQ0KICAgICAgICAgICAgICAg
ICAgICAgRURPTV9JTkZPKHYpLT53ZWlnaHQgPSBvcC0+dS5zZWRmLndlaWdodDsNCiAgICAgICAg
ICAgICB9DQpAQCAtMTQ3Nyw3ICsxNDI3LDYgQEAgc3RhdGljIGludCBzZWRmX2FkanVzdChjb25z
dCBzdHJ1Y3Qgc2NoZQ0KICAgICAgICAgb3AtPnUuc2VkZi53ZWlnaHQgICAgPSBFRE9NX0lORk8o
cC0+dmNwdVswXSktPndlaWdodDsNCiAgICAgfQ0KIA0KLSAgICBQUklOVCgyLCJzZWRmX2FkanVz
dF9maW5pc2hlZFxuIik7DQogICAgIHJldHVybiAwOw0KIH0NCiANCm==


--=-DM3xwBkUsBWsFUckworM--

--=-oVXZhmqkWYbyP3+4MWM6
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk7yA2EACgkQk4XaBE3IOsQjHgCgokeOKmICEG21IO9eF+nOwRTE
4HYAoJlFaHcaHVJZC2nqIqROHfizcSkc
=ZkFV
-----END PGP SIGNATURE-----

--=-oVXZhmqkWYbyP3+4MWM6--



--===============2284887627372470128==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--===============2284887627372470128==--



From xen-devel-bounces@lists.xensource.com Wed Dec 21 19:12:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 21 Dec 2011 19:12:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RdRaI-0004xk-RH; Wed, 21 Dec 2011 19:12:14 +0000
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xen.org with smtp (Exim 4.72)
	(envelope-from <rdunlap@xenotime.net>) id 1RdRaH-0004xb-5R
	for xen-devel@lists.xensource.com; Wed, 21 Dec 2011 19:12:13 +0000
X-Env-Sender: rdunlap@xenotime.net
X-Msg-Ref: server-15.tower-27.messagelabs.com!1324494709!59863081!1
X-Originating-IP: [67.222.38.55]
X-SpamReason: No, hits=3.5 required=7.0 tests=sa_preprocessor: 
	QmFkIElQOiA2Ny4yMjIuMzguNTUgPT4gMzQ1NDc=\n,sa_preprocessor: 
	QmFkIElQOiA2Ny4yMjIuMzguNTUgPT4gMzQ1NDc=\n, UNIQUE_WORDS,
	UPPERCASE_75_100
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3821 invoked from network); 21 Dec 2011 19:11:49 -0000
Received: from oproxy5-pub.bluehost.com (HELO oproxy5-pub.bluehost.com)
	(67.222.38.55) by server-15.tower-27.messagelabs.com with SMTP;
	21 Dec 2011 19:11:49 -0000
Received: (qmail 17191 invoked by uid 0); 21 Dec 2011 19:12:07 -0000
Received: from unknown (HELO box742.bluehost.com) (66.147.244.242)
	by cpoproxy2.bluehost.com with SMTP; 21 Dec 2011 19:11:16 -0000
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=xenotime.net;
	s=default; 
	h=Content-Type:In-Reply-To:References:Subject:CC:To:MIME-Version:From:Date:Message-ID;
	bh=fbYDPNJosMkGaF7Z7n0ecB8B+bPYvArZweGnLIn+TSg=; 
	b=AKtvYlXzLHgBynPNakbFzklcQKjje1SrYRIy1uwRA5Fp3/xKTXNoua56XGeZdTn5YpCFnZFimYKFL+4FjhpMMfiJcqaULSyi1bN9DhW8VAvXKBbVhwc++FRXWqzNHeiG;
Received: from static-50-53-38-135.bvtn.or.frontiernet.net ([50.53.38.135]
	helo=[192.168.1.3])
	by box742.bluehost.com with esmtpsa (TLSv1:AES256-SHA:256)
	(Exim 4.76) (envelope-from <rdunlap@xenotime.net>)
	id 1RdRZM-0004oA-59; Wed, 21 Dec 2011 12:11:16 -0700
Message-ID: <4EF23D67.9050602@xenotime.net>
Date: Wed, 21 Dec 2011 12:11:19 -0800
From: Randy Dunlap <rdunlap@xenotime.net>
Organization: YPO4
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.15) Gecko/20110323 Thunderbird/3.1.9
MIME-Version: 1.0
To: Stephen Rothwell <sfr@canb.auug.org.au>
References: <20111221174733.9ba0861e762e8d96844b060b@canb.auug.org.au>
In-Reply-To: <20111221174733.9ba0861e762e8d96844b060b@canb.auug.org.au>
Content-Type: multipart/mixed; boundary="------------070407000708080709040807"
X-Identified-User: {1807:box742.bluehost.com:xenotime:xenotime.net}
	{sentby:smtp auth 50.53.38.135 authed with
	rdunlap@xenotime.net}
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	linux-next@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] linux-next: Tree for Dec 21 (xen)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--------------070407000708080709040807
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

On 12/20/2011 10:47 PM, Stephen Rothwell wrote:
> Hi all,
> 
> Changes since 20111220:


drivers/xen/xenbus/xenbus_dev_backend.c:74:2: error: implicit declaration of function 'xen_initial_domain'

Full randconfig file is attached.

-- 
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***

--------------070407000708080709040807
Content-Type: text/plain;
 name="config-xenbus"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="config-xenbus"

#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 3.2.0-rc6 Kernel Configuration
#
CONFIG_64BIT=y
# CONFIG_X86_32 is not set
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_ARCH_CLOCKSOURCE_DATA=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
CONFIG_ZONE_DMA=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_GPIO=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_DEFAULT_IDLE=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ZONE_DMA32=y
CONFIG_AUDIT_ARCH=y
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11"
# CONFIG_KTIME_SCALAR is not set
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_CONSTRUCTORS=y
CONFIG_HAVE_IRQ_WORK=y
CONFIG_IRQ_WORK=y

#
# General setup
#
CONFIG_EXPERIMENTAL=y
CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_CROSS_COMPILE=""
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
# CONFIG_KERNEL_GZIP is not set
# CONFIG_KERNEL_BZIP2 is not set
CONFIG_KERNEL_LZMA=y
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_FHANDLE=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
# CONFIG_AUDIT is not set
CONFIG_HAVE_GENERIC_HARDIRQS=y

#
# IRQ subsystem
#
CONFIG_GENERIC_HARDIRQS=y
CONFIG_HAVE_SPARSE_IRQ=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_IRQ_SHOW=y
CONFIG_GENERIC_IRQ_CHIP=y
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_SPARSE_IRQ=y

#
# RCU Subsystem
#
CONFIG_TINY_PREEMPT_RCU=y
CONFIG_PREEMPT_RCU=y
CONFIG_RCU_TRACE=y
# CONFIG_TREE_RCU_TRACE is not set
# CONFIG_RCU_BOOST is not set
# CONFIG_IKCONFIG is not set
CONFIG_LOG_BUF_SHIFT=17
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
# CONFIG_CGROUP_DEVICE is not set
CONFIG_CPUSETS=y
# CONFIG_PROC_PID_CPUSET is not set
# CONFIG_CGROUP_CPUACCT is not set
CONFIG_RESOURCE_COUNTERS=y
# CONFIG_CGROUP_MEM_RES_CTLR is not set
CONFIG_CGROUP_PERF=y
# CONFIG_CGROUP_SCHED is not set
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
# CONFIG_CHECKPOINT_RESTORE is not set
CONFIG_NAMESPACES=y
# CONFIG_UTS_NS is not set
CONFIG_IPC_NS=y
# CONFIG_USER_NS is not set
# CONFIG_PID_NS is not set
CONFIG_NET_NS=y
# CONFIG_SCHED_AUTOGROUP is not set
# CONFIG_SYSFS_DEPRECATED is not set
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
# CONFIG_EXPERT is not set
CONFIG_UID16=y
# CONFIG_SYSCTL_SYSCALL is not set
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
CONFIG_HAVE_PCSPKR_PLATFORM=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
# CONFIG_EMBEDDED is not set
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_USE_VMALLOC=y

#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
# CONFIG_PERF_COUNTERS is not set
CONFIG_DEBUG_PERF_USE_VMALLOC=y
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_PCI_QUIRKS=y
CONFIG_SLUB_DEBUG=y
CONFIG_COMPAT_BRK=y
# CONFIG_SLAB is not set
CONFIG_SLUB=y
# CONFIG_PROFILING is not set
CONFIG_TRACEPOINTS=y
CONFIG_HAVE_OPROFILE=y
CONFIG_OPROFILE_NMI_TIMER=y
# CONFIG_JUMP_LABEL is not set
CONFIG_UPROBES=y
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_ATTRS=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_DMA_API_DEBUG=y
CONFIG_HAVE_HW_BREAKPOINT=y
CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
CONFIG_HAVE_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_HAVE_ARCH_JUMP_LABEL=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
CONFIG_HAVE_CMPXCHG_LOCAL=y
CONFIG_HAVE_CMPXCHG_DOUBLE=y

#
# GCOV-based kernel profiling
#
CONFIG_GCOV_KERNEL=y
# CONFIG_GCOV_PROFILE_ALL is not set
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0
# CONFIG_MODULES is not set
CONFIG_BLOCK=y
CONFIG_BLK_DEV_BSG=y
CONFIG_BLK_DEV_BSGLIB=y
# CONFIG_BLK_DEV_INTEGRITY is not set
# CONFIG_BLK_DEV_THROTTLING is not set
CONFIG_BLOCK_COMPAT=y

#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_DEADLINE=y
# CONFIG_IOSCHED_CFQ is not set
# CONFIG_DEFAULT_DEADLINE is not set
CONFIG_DEFAULT_NOOP=y
CONFIG_DEFAULT_IOSCHED="noop"
CONFIG_PREEMPT_NOTIFIERS=y
# CONFIG_INLINE_SPIN_TRYLOCK is not set
# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
# CONFIG_INLINE_SPIN_LOCK is not set
# CONFIG_INLINE_SPIN_LOCK_BH is not set
# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
# CONFIG_INLINE_SPIN_UNLOCK is not set
# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
# CONFIG_INLINE_READ_TRYLOCK is not set
# CONFIG_INLINE_READ_LOCK is not set
# CONFIG_INLINE_READ_LOCK_BH is not set
# CONFIG_INLINE_READ_LOCK_IRQ is not set
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
# CONFIG_INLINE_READ_UNLOCK is not set
# CONFIG_INLINE_READ_UNLOCK_BH is not set
# CONFIG_INLINE_READ_UNLOCK_IRQ is not set
# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
# CONFIG_INLINE_WRITE_TRYLOCK is not set
# CONFIG_INLINE_WRITE_LOCK is not set
# CONFIG_INLINE_WRITE_LOCK_BH is not set
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
# CONFIG_INLINE_WRITE_UNLOCK is not set
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
# CONFIG_MUTEX_SPIN_ON_OWNER is not set
CONFIG_FREEZER=y

#
# Processor type and features
#
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
# CONFIG_SMP is not set
CONFIG_X86_MPPARSE=y
CONFIG_X86_EXTENDED_PLATFORM=y
CONFIG_X86_VSMP=y
# CONFIG_SCHED_OMIT_FRAME_POINTER is not set
# CONFIG_KVMTOOL_TEST_ENABLE is not set
CONFIG_PARAVIRT_GUEST=y
# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
CONFIG_XEN=y
CONFIG_XEN_DOM0=y
CONFIG_XEN_PRIVILEGED_GUEST=y
CONFIG_XEN_PVHVM=y
CONFIG_XEN_MAX_DOMAIN_MEMORY=500
CONFIG_XEN_SAVE_RESTORE=y
# CONFIG_XEN_DEBUG_FS is not set
# CONFIG_KVM_CLOCK is not set
# CONFIG_KVM_GUEST is not set
CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_CLOCK=y
CONFIG_PARAVIRT_DEBUG=y
CONFIG_NO_BOOTMEM=y
CONFIG_MEMTEST=y
# CONFIG_MK8 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
# CONFIG_MATOM is not set
CONFIG_GENERIC_CPU=y
CONFIG_X86_INTERNODE_CACHE_SHIFT=12
CONFIG_X86_CMPXCHG=y
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_X86_XADD=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_TSC=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_CENTAUR=y
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_DMI=y
CONFIG_GART_IOMMU=y
CONFIG_CALGARY_IOMMU=y
# CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT is not set
CONFIG_SWIOTLB=y
CONFIG_IOMMU_HELPER=y
CONFIG_NR_CPUS=1
# CONFIG_IRQ_TIME_ACCOUNTING is not set
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y
CONFIG_PREEMPT_COUNT=y
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
# CONFIG_X86_MCE is not set
# CONFIG_I8K is not set
# CONFIG_MICROCODE is not set
CONFIG_X86_MSR=y
# CONFIG_X86_CPUID is not set
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_DIRECT_GBPAGES=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_PROC_KCORE_TEXT=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_HAVE_MEMORY_PRESENT=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
CONFIG_ARCH_DISCARD_MEMBLOCK=y
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_SPLIT_PTLOCK_CPUS=999999
CONFIG_COMPACTION=y
CONFIG_MIGRATION=y
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_MMU_NOTIFIER=y
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_TRANSPARENT_HUGEPAGE=y
# CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
CONFIG_NEED_PER_CPU_KM=y
CONFIG_CLEANCACHE=y
CONFIG_FRONTSWAP=y
CONFIG_X86_CHECK_BIOS_CORRUPTION=y
CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
CONFIG_X86_RESERVE_LOW=64
CONFIG_MTRR=y
CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0
CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
CONFIG_X86_PAT=y
CONFIG_ARCH_USES_PG_UNCACHED=y
CONFIG_ARCH_RANDOM=y
CONFIG_EFI=y
CONFIG_EFI_STUB=y
CONFIG_SECCOMP=y
# CONFIG_CC_STACKPROTECTOR is not set
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_SCHED_HRTICK=y
# CONFIG_KEXEC is not set
# CONFIG_CRASH_DUMP is not set
CONFIG_PHYSICAL_START=0x1000000
CONFIG_RELOCATABLE=y
CONFIG_PHYSICAL_ALIGN=0x1000000
CONFIG_COMPAT_VDSO=y
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE=""
# CONFIG_CMDLINE_OVERRIDE is not set
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y

#
# Power management and ACPI options
#
CONFIG_ARCH_HIBERNATION_HEADER=y
# CONFIG_SUSPEND is not set
CONFIG_HIBERNATE_CALLBACKS=y
CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION=""
CONFIG_PM_SLEEP=y
# CONFIG_PM_RUNTIME is not set
CONFIG_PM=y
CONFIG_PM_DEBUG=y
# CONFIG_PM_ADVANCED_DEBUG is not set
CONFIG_CAN_PM_TRACE=y
# CONFIG_PM_TRACE_RTC is not set
CONFIG_ACPI=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_PROCFS=y
# CONFIG_ACPI_PROCFS_POWER is not set
# CONFIG_ACPI_EC_DEBUGFS is not set
CONFIG_ACPI_PROC_EVENT=y
# CONFIG_ACPI_AC is not set
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_VIDEO=y
CONFIG_ACPI_FAN=y
CONFIG_ACPI_DOCK=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_PROCESSOR_AGGREGATOR=y
# CONFIG_ACPI_THERMAL is not set
# CONFIG_ACPI_CUSTOM_DSDT is not set
CONFIG_ACPI_BLACKLIST_YEAR=0
# CONFIG_ACPI_DEBUG is not set
# CONFIG_ACPI_PCI_SLOT is not set
CONFIG_X86_PM_TIMER=y
# CONFIG_ACPI_CONTAINER is not set
CONFIG_ACPI_SBS=y
CONFIG_ACPI_HED=y
CONFIG_ACPI_CUSTOM_METHOD=y
CONFIG_ACPI_APEI=y
# CONFIG_ACPI_APEI_GHES is not set
# CONFIG_ACPI_APEI_PCIEAER is not set
CONFIG_ACPI_APEI_EINJ=y
# CONFIG_ACPI_APEI_ERST_DEBUG is not set
# CONFIG_SFI is not set

#
# CPU Frequency scaling
#
# CONFIG_CPU_FREQ is not set
CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_INTEL_IDLE is not set

#
# Memory power savings
#
# CONFIG_I7300_IDLE is not set

#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_XEN=y
CONFIG_PCI_DOMAINS=y
# CONFIG_PCI_CNB20LE_QUIRK is not set
CONFIG_PCIEPORTBUS=y
# CONFIG_HOTPLUG_PCI_PCIE is not set
CONFIG_PCIEAER=y
CONFIG_PCIE_ECRC=y
# CONFIG_PCIEAER_INJECT is not set
CONFIG_PCIEASPM=y
CONFIG_PCIEASPM_DEBUG=y
CONFIG_ARCH_SUPPORTS_MSI=y
# CONFIG_PCI_MSI is not set
# CONFIG_PCI_DEBUG is not set
# CONFIG_PCI_STUB is not set
CONFIG_XEN_PCIDEV_FRONTEND=y
# CONFIG_HT_IRQ is not set
CONFIG_PCI_ATS=y
CONFIG_PCI_IOV=y
# CONFIG_PCI_PRI is not set
# CONFIG_PCI_PASID is not set
CONFIG_PCI_IOAPIC=y
CONFIG_PCI_LABEL=y
CONFIG_ISA_DMA_API=y
CONFIG_AMD_NB=y
CONFIG_PCCARD=y
# CONFIG_PCMCIA is not set
CONFIG_CARDBUS=y

#
# PC-card bridges
#
CONFIG_YENTA=y
CONFIG_YENTA_O2=y
CONFIG_YENTA_RICOH=y
CONFIG_YENTA_TI=y
CONFIG_YENTA_ENE_TUNE=y
CONFIG_YENTA_TOSHIBA=y
CONFIG_HOTPLUG_PCI=y
# CONFIG_HOTPLUG_PCI_FAKE is not set
# CONFIG_HOTPLUG_PCI_ACPI is not set
# CONFIG_HOTPLUG_PCI_CPCI is not set
# CONFIG_HOTPLUG_PCI_SHPC is not set
CONFIG_RAPIDIO=y
# CONFIG_RAPIDIO_TSI721 is not set
CONFIG_RAPIDIO_DISC_TIMEOUT=30
# CONFIG_RAPIDIO_ENABLE_RX_TX_PORTS is not set
CONFIG_RAPIDIO_DEBUG=y
# CONFIG_RAPIDIO_TSI57X is not set
# CONFIG_RAPIDIO_CPS_XX is not set
CONFIG_RAPIDIO_TSI568=y
# CONFIG_RAPIDIO_CPS_GEN2 is not set
# CONFIG_RAPIDIO_TSI500 is not set

#
# Executable file formats / Emulations
#
# CONFIG_BINFMT_ELF is not set
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
# CONFIG_HAVE_AOUT is not set
# CONFIG_BINFMT_MISC is not set
CONFIG_IA32_EMULATION=y
# CONFIG_IA32_AOUT is not set
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_KEYS_COMPAT=y
CONFIG_HAVE_TEXT_POKE_SMP=y
CONFIG_NET=y
CONFIG_COMPAT_NETLINK_MESSAGES=y

#
# Networking options
#
# CONFIG_PACKET is not set
CONFIG_UNIX=y
# CONFIG_UNIX_DIAG is not set
CONFIG_XFRM=y
CONFIG_XFRM_SUB_POLICY=y
CONFIG_XFRM_MIGRATE=y
CONFIG_NET_KEY=y
CONFIG_NET_KEY_MIGRATE=y
# CONFIG_INET is not set
CONFIG_NETWORK_SECMARK=y
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
CONFIG_NETFILTER=y
CONFIG_NETFILTER_DEBUG=y
# CONFIG_NETFILTER_ADVANCED is not set
CONFIG_ATM=y
CONFIG_ATM_LANE=y
# CONFIG_BRIDGE is not set
CONFIG_NET_DSA=y
CONFIG_NET_DSA_TAG_DSA=y
CONFIG_NET_DSA_TAG_EDSA=y
CONFIG_NET_DSA_TAG_TRAILER=y
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
CONFIG_LLC=y
CONFIG_LLC2=y
CONFIG_IPX=y
CONFIG_IPX_INTERN=y
# CONFIG_ATALK is not set
CONFIG_X25=y
# CONFIG_LAPB is not set
# CONFIG_WAN_ROUTER is not set
CONFIG_PHONET=y
# CONFIG_IEEE802154 is not set
CONFIG_NET_SCHED=y

#
# Queueing/Scheduling
#
# CONFIG_NET_SCH_CBQ is not set
CONFIG_NET_SCH_HTB=y
CONFIG_NET_SCH_HFSC=y
CONFIG_NET_SCH_ATM=y
# CONFIG_NET_SCH_PRIO is not set
# CONFIG_NET_SCH_MULTIQ is not set
CONFIG_NET_SCH_RED=y
CONFIG_NET_SCH_SFB=y
CONFIG_NET_SCH_SFQ=y
# CONFIG_NET_SCH_TEQL is not set
CONFIG_NET_SCH_TBF=y
# CONFIG_NET_SCH_GRED is not set
# CONFIG_NET_SCH_DSMARK is not set
# CONFIG_NET_SCH_NETEM is not set
CONFIG_NET_SCH_DRR=y
# CONFIG_NET_SCH_MQPRIO is not set
# CONFIG_NET_SCH_CHOKE is not set
CONFIG_NET_SCH_QFQ=y

#
# Classification
#
CONFIG_NET_CLS=y
# CONFIG_NET_CLS_BASIC is not set
# CONFIG_NET_CLS_TCINDEX is not set
CONFIG_NET_CLS_FW=y
# CONFIG_NET_CLS_U32 is not set
# CONFIG_NET_CLS_RSVP is not set
# CONFIG_NET_CLS_RSVP6 is not set
CONFIG_NET_CLS_FLOW=y
CONFIG_NET_CLS_CGROUP=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
# CONFIG_NET_EMATCH_CMP is not set
CONFIG_NET_EMATCH_NBYTE=y
# CONFIG_NET_EMATCH_U32 is not set
CONFIG_NET_EMATCH_META=y
CONFIG_NET_EMATCH_TEXT=y
# CONFIG_NET_CLS_ACT is not set
CONFIG_NET_CLS_IND=y
CONFIG_NET_SCH_FIFO=y
# CONFIG_DCB is not set
# CONFIG_DNS_RESOLVER is not set
# CONFIG_BATMAN_ADV is not set
CONFIG_OPENVSWITCH=y
CONFIG_NETPRIO_CGROUP=y
CONFIG_BQL=y
CONFIG_HAVE_BPF_JIT=y

#
# Network testing
#
CONFIG_NET_PKTGEN=y
# CONFIG_HAMRADIO is not set
# CONFIG_CAN is not set
CONFIG_IRDA=y

#
# IrDA protocols
#
CONFIG_IRLAN=y
# CONFIG_IRCOMM is not set
CONFIG_IRDA_ULTRA=y

#
# IrDA options
#
# CONFIG_IRDA_CACHE_LAST_LSAP is not set
# CONFIG_IRDA_FAST_RR is not set
CONFIG_IRDA_DEBUG=y

#
# Infrared-port device drivers
#

#
# SIR device drivers
#
# CONFIG_IRTTY_SIR is not set

#
# Dongle support
#

#
# FIR device drivers
#
# CONFIG_NSC_FIR is not set
# CONFIG_WINBOND_FIR is not set
CONFIG_SMC_IRCC_FIR=y
CONFIG_ALI_FIR=y
CONFIG_VLSI_FIR=y
# CONFIG_VIA_FIR is not set
# CONFIG_BT is not set
CONFIG_WIRELESS=y
CONFIG_WIRELESS_EXT=y
CONFIG_WEXT_CORE=y
CONFIG_WEXT_PROC=y
CONFIG_WEXT_SPY=y
CONFIG_WEXT_PRIV=y
# CONFIG_CFG80211 is not set
CONFIG_WIRELESS_EXT_SYSFS=y
# CONFIG_LIB80211 is not set

#
# CFG80211 needs to be enabled for MAC80211
#
CONFIG_WIMAX=y
CONFIG_WIMAX_DEBUG_LEVEL=8
# CONFIG_RFKILL is not set
CONFIG_RFKILL_REGULATOR=y
CONFIG_NET_9P=y
# CONFIG_NET_9P_VIRTIO is not set
CONFIG_NET_9P_DEBUG=y
# CONFIG_CAIF is not set
# CONFIG_NFC is not set

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_UEVENT_HELPER_PATH=""
# CONFIG_DEVTMPFS is not set
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
CONFIG_FIRMWARE_IN_KERNEL=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set
CONFIG_SYS_HYPERVISOR=y
CONFIG_REGMAP=y
CONFIG_REGMAP_I2C=y
CONFIG_REGMAP_SPI=y
CONFIG_REGMAP_IRQ=y
CONFIG_CONNECTOR=y
# CONFIG_PROC_EVENTS is not set
CONFIG_MTD=y
# CONFIG_MTD_REDBOOT_PARTS is not set
CONFIG_MTD_CMDLINE_PARTS=y
# CONFIG_MTD_AR7_PARTS is not set

#
# User Modules And Translation Layers
#
# CONFIG_MTD_CHAR is not set
CONFIG_HAVE_MTD_OTP=y
CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y
CONFIG_FTL=y
CONFIG_NFTL=y
# CONFIG_NFTL_RW is not set
CONFIG_INFTL=y
CONFIG_RFD_FTL=y
CONFIG_SSFDC=y
# CONFIG_SM_FTL is not set
CONFIG_MTD_OOPS=y
CONFIG_MTD_SWAP=y

#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=y
CONFIG_MTD_JEDECPROBE=y
CONFIG_MTD_GEN_PROBE=y
CONFIG_MTD_CFI_ADV_OPTIONS=y
# CONFIG_MTD_CFI_NOSWAP is not set
CONFIG_MTD_CFI_BE_BYTE_SWAP=y
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
CONFIG_MTD_CFI_GEOMETRY=y
# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
CONFIG_MTD_MAP_BANK_WIDTH_2=y
# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
CONFIG_MTD_MAP_BANK_WIDTH_16=y
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
CONFIG_MTD_CFI_I4=y
# CONFIG_MTD_CFI_I8 is not set
CONFIG_MTD_OTP=y
CONFIG_MTD_CFI_INTELEXT=y
CONFIG_MTD_CFI_AMDSTD=y
# CONFIG_MTD_CFI_STAA is not set
CONFIG_MTD_CFI_UTIL=y
CONFIG_MTD_RAM=y
CONFIG_MTD_ROM=y
CONFIG_MTD_ABSENT=y

#
# Mapping drivers for chip access
#
CONFIG_MTD_COMPLEX_MAPPINGS=y
# CONFIG_MTD_PHYSMAP is not set
CONFIG_MTD_SC520CDP=y
# CONFIG_MTD_NETSC520 is not set
CONFIG_MTD_TS5500=y
CONFIG_MTD_SBC_GXX=y
# CONFIG_MTD_AMD76XROM is not set
CONFIG_MTD_ICHXROM=y
# CONFIG_MTD_ESB2ROM is not set
CONFIG_MTD_CK804XROM=y
CONFIG_MTD_SCB2_FLASH=y
# CONFIG_MTD_NETtel is not set
CONFIG_MTD_L440GX=y
# CONFIG_MTD_PCI is not set
CONFIG_MTD_GPIO_ADDR=y
# CONFIG_MTD_INTEL_VR_NOR is not set
CONFIG_MTD_PLATRAM=y
CONFIG_MTD_LATCH_ADDR=y

#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
CONFIG_MTD_DATAFLASH=y
# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
# CONFIG_MTD_DATAFLASH_OTP is not set
# CONFIG_MTD_M25P80 is not set
# CONFIG_MTD_SST25L is not set
CONFIG_MTD_SLRAM=y
# CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLOCK2MTD is not set

#
# Disk-On-Chip Device Drivers
#
CONFIG_MTD_DOC2000=y
CONFIG_MTD_DOC2001=y
CONFIG_MTD_DOC2001PLUS=y
CONFIG_MTD_DOCG3=y
CONFIG_BCH_CONST_M=14
CONFIG_BCH_CONST_T=4
CONFIG_MTD_DOCPROBE=y
CONFIG_MTD_DOCECC=y
# CONFIG_MTD_DOCPROBE_ADVANCED is not set
CONFIG_MTD_DOCPROBE_ADDRESS=0x0
CONFIG_MTD_NAND_ECC=y
# CONFIG_MTD_NAND_ECC_SMC is not set
CONFIG_MTD_NAND=y
CONFIG_MTD_NAND_VERIFY_WRITE=y
CONFIG_MTD_NAND_BCH=y
CONFIG_MTD_NAND_ECC_BCH=y
# CONFIG_MTD_SM_COMMON is not set
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_DENALI=y
CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xFF108018
CONFIG_MTD_NAND_IDS=y
# CONFIG_MTD_NAND_RICOH is not set
# CONFIG_MTD_NAND_DISKONCHIP is not set
# CONFIG_MTD_NAND_CAFE is not set
CONFIG_MTD_NAND_NANDSIM=y
CONFIG_MTD_NAND_PLATFORM=y
CONFIG_MTD_ONENAND=y
# CONFIG_MTD_ONENAND_VERIFY_WRITE is not set
CONFIG_MTD_ONENAND_GENERIC=y
CONFIG_MTD_ONENAND_OTP=y
CONFIG_MTD_ONENAND_2X_PROGRAM=y
# CONFIG_MTD_ONENAND_SIM is not set

#
# LPDDR flash memory drivers
#
CONFIG_MTD_LPDDR=y
CONFIG_MTD_QINFO_PROBE=y
CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_RESERVE=1
CONFIG_MTD_UBI_GLUEBI=y
# CONFIG_MTD_UBI_DEBUG is not set
# CONFIG_PARPORT is not set
CONFIG_PNP=y
# CONFIG_PNP_DEBUG_MESSAGES is not set

#
# Protocols
#
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
CONFIG_BLK_DEV_UMEM=y
# CONFIG_BLK_DEV_COW_COMMON is not set
# CONFIG_BLK_DEV_LOOP is not set

#
# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
#
CONFIG_BLK_DEV_NBD=y
CONFIG_BLK_DEV_OSD=y
CONFIG_BLK_DEV_SX8=y
# CONFIG_BLK_DEV_RAM is not set
CONFIG_CDROM_PKTCDVD=y
CONFIG_CDROM_PKTCDVD_BUFFERS=8
CONFIG_CDROM_PKTCDVD_WCACHE=y
# CONFIG_ATA_OVER_ETH is not set
CONFIG_XEN_BLKDEV_FRONTEND=y
# CONFIG_XEN_BLKDEV_BACKEND is not set
# CONFIG_VIRTIO_BLK is not set
CONFIG_BLK_DEV_HD=y
# CONFIG_SENSORS_LIS3LV02D is not set
# CONFIG_MISC_DEVICES is not set
CONFIG_HAVE_IDE=y
CONFIG_IDE=y

#
# Please see Documentation/ide/ide.txt for help/info on IDE drives
#
CONFIG_IDE_XFER_MODE=y
CONFIG_IDE_TIMINGS=y
CONFIG_BLK_DEV_IDE_SATA=y
# CONFIG_IDE_GD is not set
CONFIG_BLK_DEV_DELKIN=y
# CONFIG_BLK_DEV_IDECD is not set
# CONFIG_BLK_DEV_IDETAPE is not set
CONFIG_BLK_DEV_IDEACPI=y
# CONFIG_IDE_TASK_IOCTL is not set
# CONFIG_IDE_PROC_FS is not set

#
# IDE chipset support/bugfixes
#
# CONFIG_IDE_GENERIC is not set
# CONFIG_BLK_DEV_PLATFORM is not set
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_IDEPNP is not set
CONFIG_BLK_DEV_IDEDMA_SFF=y

#
# PCI IDE chipsets support
#
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_IDEPCI_PCIBUS_ORDER=y
# CONFIG_BLK_DEV_OFFBOARD is not set
# CONFIG_BLK_DEV_GENERIC is not set
# CONFIG_BLK_DEV_OPTI621 is not set
# CONFIG_BLK_DEV_RZ1000 is not set
CONFIG_BLK_DEV_IDEDMA_PCI=y
CONFIG_BLK_DEV_AEC62XX=y
# CONFIG_BLK_DEV_ALI15X3 is not set
# CONFIG_BLK_DEV_AMD74XX is not set
CONFIG_BLK_DEV_ATIIXP=y
CONFIG_BLK_DEV_CMD64X=y
CONFIG_BLK_DEV_TRIFLEX=y
# CONFIG_BLK_DEV_CS5520 is not set
CONFIG_BLK_DEV_CS5530=y
CONFIG_BLK_DEV_HPT366=y
# CONFIG_BLK_DEV_JMICRON is not set
# CONFIG_BLK_DEV_SC1200 is not set
# CONFIG_BLK_DEV_PIIX is not set
CONFIG_BLK_DEV_IT8172=y
CONFIG_BLK_DEV_IT8213=y
# CONFIG_BLK_DEV_IT821X is not set
# CONFIG_BLK_DEV_NS87415 is not set
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
CONFIG_BLK_DEV_PDC202XX_NEW=y
CONFIG_BLK_DEV_SVWKS=y
# CONFIG_BLK_DEV_SIIMAGE is not set
# CONFIG_BLK_DEV_SIS5513 is not set
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_BLK_DEV_TC86C001 is not set
CONFIG_BLK_DEV_IDEDMA=y

#
# SCSI device support
#
CONFIG_SCSI_MOD=y
CONFIG_RAID_ATTRS=y
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
# CONFIG_SCSI_TGT is not set
CONFIG_SCSI_NETLINK=y
# CONFIG_SCSI_PROC_FS is not set

#
# SCSI support type (disk, tape, CD-ROM)
#
# CONFIG_BLK_DEV_SD is not set
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
# CONFIG_BLK_DEV_SR is not set
CONFIG_CHR_DEV_SG=y
# CONFIG_CHR_DEV_SCH is not set
# CONFIG_SCSI_MULTI_LUN is not set
# CONFIG_SCSI_CONSTANTS is not set
# CONFIG_SCSI_LOGGING is not set
# CONFIG_SCSI_SCAN_ASYNC is not set

#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=y
CONFIG_SCSI_FC_ATTRS=y
CONFIG_SCSI_ISCSI_ATTRS=y
CONFIG_SCSI_SAS_ATTRS=y
CONFIG_SCSI_SAS_LIBSAS=y
CONFIG_SCSI_SAS_HOST_SMP=y
CONFIG_SCSI_SRP_ATTRS=y
CONFIG_SCSI_LOWLEVEL=y
CONFIG_ISCSI_BOOT_SYSFS=y
# CONFIG_SCSI_BNX2_ISCSI is not set
CONFIG_SCSI_BNX2X_FCOE=y
CONFIG_BE2ISCSI=y
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
CONFIG_SCSI_HPSA=y
CONFIG_SCSI_3W_9XXX=y
CONFIG_SCSI_3W_SAS=y
# CONFIG_SCSI_ACARD is not set
CONFIG_SCSI_AACRAID=y
# CONFIG_SCSI_AIC7XXX is not set
CONFIG_SCSI_AIC7XXX_OLD=y
CONFIG_SCSI_AIC79XX=y
CONFIG_AIC79XX_CMDS_PER_DEVICE=32
CONFIG_AIC79XX_RESET_DELAY_MS=5000
CONFIG_AIC79XX_DEBUG_ENABLE=y
CONFIG_AIC79XX_DEBUG_MASK=0
CONFIG_AIC79XX_REG_PRETTY_PRINT=y
CONFIG_SCSI_AIC94XX=y
CONFIG_AIC94XX_DEBUG=y
CONFIG_SCSI_MVSAS=y
# CONFIG_SCSI_MVSAS_DEBUG is not set
CONFIG_SCSI_MVSAS_TASKLET=y
CONFIG_SCSI_MVUMI=y
CONFIG_SCSI_DPT_I2O=y
CONFIG_SCSI_ADVANSYS=y
CONFIG_SCSI_ARCMSR=y
CONFIG_MEGARAID_NEWGEN=y
CONFIG_MEGARAID_MM=y
# CONFIG_MEGARAID_MAILBOX is not set
# CONFIG_MEGARAID_LEGACY is not set
# CONFIG_MEGARAID_SAS is not set
CONFIG_SCSI_MPT2SAS=y
CONFIG_SCSI_MPT2SAS_MAX_SGE=128
CONFIG_SCSI_MPT2SAS_LOGGING=y
# CONFIG_SCSI_HPTIOP is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_VMWARE_PVSCSI is not set
CONFIG_LIBFC=y
CONFIG_LIBFCOE=y
CONFIG_FCOE=y
CONFIG_FCOE_FNIC=y
# CONFIG_SCSI_DMX3191D is not set
CONFIG_SCSI_EATA=y
# CONFIG_SCSI_EATA_TAGGED_QUEUE is not set
CONFIG_SCSI_EATA_LINKED_COMMANDS=y
CONFIG_SCSI_EATA_MAX_TAGS=16
CONFIG_SCSI_FUTURE_DOMAIN=y
# CONFIG_SCSI_GDTH is not set
CONFIG_SCSI_ISCI=y
# CONFIG_SCSI_IPS is not set
CONFIG_SCSI_INITIO=y
# CONFIG_SCSI_INIA100 is not set
# CONFIG_SCSI_STEX is not set
CONFIG_SCSI_SYM53C8XX_2=y
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
# CONFIG_SCSI_SYM53C8XX_MMIO is not set
# CONFIG_SCSI_QLOGIC_1280 is not set
CONFIG_SCSI_QLA_FC=y
# CONFIG_SCSI_QLA_ISCSI is not set
CONFIG_SCSI_LPFC=y
# CONFIG_SCSI_LPFC_DEBUG_FS is not set
# CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_DC390T is not set
# CONFIG_SCSI_DEBUG is not set
CONFIG_SCSI_PMCRAID=y
# CONFIG_SCSI_PM8001 is not set
# CONFIG_SCSI_SRP is not set
CONFIG_SCSI_BFA_FC=y
CONFIG_SCSI_DH=y
# CONFIG_SCSI_DH_RDAC is not set
# CONFIG_SCSI_DH_HP_SW is not set
# CONFIG_SCSI_DH_EMC is not set
# CONFIG_SCSI_DH_ALUA is not set
CONFIG_SCSI_OSD_INITIATOR=y
CONFIG_SCSI_OSD_ULD=y
CONFIG_SCSI_OSD_DPRINT_SENSE=1
# CONFIG_SCSI_OSD_DEBUG is not set
# CONFIG_ATA is not set
CONFIG_MD=y
# CONFIG_BLK_DEV_MD is not set
# CONFIG_BLK_DEV_DM is not set
CONFIG_TARGET_CORE=y
CONFIG_TCM_IBLOCK=y
# CONFIG_TCM_FILEIO is not set
CONFIG_TCM_PSCSI=y
CONFIG_LOOPBACK_TARGET=y
CONFIG_TCM_FC=y
CONFIG_ISCSI_TARGET=y
# CONFIG_FUSION is not set

#
# IEEE 1394 (FireWire) support
#
CONFIG_FIREWIRE=y
CONFIG_FIREWIRE_OHCI=y
CONFIG_FIREWIRE_OHCI_DEBUG=y
CONFIG_FIREWIRE_SBP2=y
# CONFIG_FIREWIRE_NOSY is not set
# CONFIG_I2O is not set
CONFIG_MACINTOSH_DRIVERS=y
# CONFIG_MAC_EMUMOUSEBTN is not set
CONFIG_NETDEVICES=y
CONFIG_NET_CORE=y
# CONFIG_DUMMY is not set
# CONFIG_EQUALIZER is not set
# CONFIG_NET_FC is not set
CONFIG_MII=y
# CONFIG_NET_TEAM is not set
CONFIG_MACVLAN=y
CONFIG_MACVTAP=y
# CONFIG_NETCONSOLE is not set
# CONFIG_NETPOLL is not set
# CONFIG_NET_POLL_CONTROLLER is not set
# CONFIG_RIONET is not set
CONFIG_TUN=y
# CONFIG_VETH is not set
CONFIG_VIRTIO_NET=y
# CONFIG_ARCNET is not set
# CONFIG_ATM_DRIVERS is not set

#
# CAIF transport drivers
#

#
# Distributed Switch Architecture drivers
#
CONFIG_NET_DSA_MV88E6XXX=y
CONFIG_NET_DSA_MV88E6060=y
CONFIG_NET_DSA_MV88E6XXX_NEED_PPU=y
CONFIG_NET_DSA_MV88E6131=y
CONFIG_NET_DSA_MV88E6123_61_65=y
CONFIG_ETHERNET=y
CONFIG_MDIO=y
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_NET_VENDOR_ADAPTEC is not set
# CONFIG_NET_VENDOR_ALTEON is not set
CONFIG_NET_VENDOR_AMD=y
# CONFIG_AMD8111_ETH is not set
# CONFIG_PCNET32 is not set
CONFIG_NET_VENDOR_ATHEROS=y
# CONFIG_ATL2 is not set
CONFIG_ATL1=y
CONFIG_ATL1E=y
# CONFIG_ATL1C is not set
CONFIG_NET_VENDOR_BROADCOM=y
# CONFIG_B44 is not set
CONFIG_BNX2=y
CONFIG_CNIC=y
# CONFIG_TIGON3 is not set
CONFIG_BNX2X=y
# CONFIG_NET_VENDOR_BROCADE is not set
CONFIG_NET_CALXEDA_XGMAC=y
CONFIG_NET_VENDOR_CHELSIO=y
# CONFIG_CHELSIO_T1 is not set
# CONFIG_CHELSIO_T4 is not set
# CONFIG_CHELSIO_T4VF is not set
CONFIG_DNET=y
CONFIG_NET_VENDOR_DEC=y
CONFIG_NET_TULIP=y
# CONFIG_DE2104X is not set
CONFIG_TULIP=y
# CONFIG_TULIP_MWI is not set
CONFIG_TULIP_MMIO=y
CONFIG_TULIP_NAPI=y
# CONFIG_TULIP_NAPI_HW_MITIGATION is not set
# CONFIG_DE4X5 is not set
CONFIG_WINBOND_840=y
CONFIG_DM9102=y
CONFIG_ULI526X=y
# CONFIG_PCMCIA_XIRCOM is not set
# CONFIG_NET_VENDOR_DLINK is not set
# CONFIG_NET_VENDOR_EXAR is not set
CONFIG_NET_VENDOR_HP=y
CONFIG_HP100=y
# CONFIG_NET_VENDOR_INTEL is not set
# CONFIG_IP1000 is not set
CONFIG_JME=y
CONFIG_NET_VENDOR_MARVELL=y
# CONFIG_SKGE is not set
# CONFIG_SKY2 is not set
# CONFIG_NET_VENDOR_MICREL is not set
# CONFIG_NET_VENDOR_MICROCHIP is not set
# CONFIG_FEALNX is not set
# CONFIG_NET_VENDOR_NATSEMI is not set
# CONFIG_NET_VENDOR_NVIDIA is not set
CONFIG_NET_VENDOR_OKI=y
# CONFIG_PCH_GBE is not set
CONFIG_ETHOC=y
# CONFIG_NET_PACKET_ENGINE is not set
# CONFIG_NET_VENDOR_QLOGIC is not set
CONFIG_NET_VENDOR_REALTEK=y
CONFIG_8139CP=y
# CONFIG_8139TOO is not set
# CONFIG_R8169 is not set
# CONFIG_NET_VENDOR_RDC is not set
CONFIG_NET_VENDOR_SEEQ=y
CONFIG_SEEQ8005=y
CONFIG_NET_VENDOR_SILAN=y
# CONFIG_SC92031 is not set
# CONFIG_NET_VENDOR_SIS is not set
# CONFIG_NET_VENDOR_SMSC is not set
CONFIG_NET_VENDOR_STMICRO=y
CONFIG_STMMAC_ETH=y
CONFIG_STMMAC_DEBUG_FS=y
CONFIG_STMMAC_DA=y
CONFIG_STMMAC_RING=y
# CONFIG_STMMAC_CHAINED is not set
CONFIG_NET_VENDOR_SUN=y
CONFIG_HAPPYMEAL=y
# CONFIG_SUNGEM is not set
CONFIG_CASSINI=y
# CONFIG_NIU is not set
# CONFIG_NET_VENDOR_TEHUTI is not set
CONFIG_NET_VENDOR_TI=y
# CONFIG_TLAN is not set
CONFIG_NET_VENDOR_VIA=y
# CONFIG_VIA_RHINE is not set
# CONFIG_VIA_VELOCITY is not set
CONFIG_FDDI=y
# CONFIG_DEFXX is not set
CONFIG_SKFP=y
CONFIG_NET_SB1000=y
CONFIG_PHYLIB=y

#
# MII PHY device drivers
#
# CONFIG_MARVELL_PHY is not set
# CONFIG_DAVICOM_PHY is not set
CONFIG_QSEMI_PHY=y
CONFIG_LXT_PHY=y
CONFIG_CICADA_PHY=y
CONFIG_VITESSE_PHY=y
# CONFIG_SMSC_PHY is not set
CONFIG_BROADCOM_PHY=y
CONFIG_ICPLUS_PHY=y
CONFIG_REALTEK_PHY=y
# CONFIG_NATIONAL_PHY is not set
# CONFIG_STE10XP is not set
CONFIG_LSI_ET1011C_PHY=y
# CONFIG_MICREL_PHY is not set
CONFIG_FIXED_PHY=y
CONFIG_MDIO_BITBANG=y
CONFIG_MDIO_GPIO=y
CONFIG_MICREL_KS8995MA=y
# CONFIG_PPP is not set
CONFIG_SLIP=y
# CONFIG_SLIP_COMPRESSED is not set
CONFIG_SLIP_SMART=y
CONFIG_SLIP_MODE_SLIP6=y
CONFIG_TR=y
# CONFIG_IBMOL is not set
CONFIG_3C359=y
# CONFIG_TMS380TR is not set
CONFIG_WLAN=y
# CONFIG_AIRO is not set
# CONFIG_ATMEL is not set
CONFIG_PRISM54=y
# CONFIG_HOSTAP is not set

#
# WiMAX Wireless Broadband devices
#

#
# Enable USB support to see WiMAX USB drivers
#

#
# Enable MMC support to see WiMAX SDIO drivers
#
CONFIG_WAN=y
CONFIG_LANMEDIA=y
CONFIG_HDLC=y
CONFIG_HDLC_RAW=y
# CONFIG_HDLC_RAW_ETH is not set
# CONFIG_HDLC_CISCO is not set
# CONFIG_HDLC_FR is not set
CONFIG_HDLC_PPP=y

#
# X.25/LAPB support is disabled
#
CONFIG_PCI200SYN=y
# CONFIG_WANXL is not set
CONFIG_PC300TOO=y
CONFIG_FARSYNC=y
CONFIG_DLCI=y
CONFIG_DLCI_MAX=8
# CONFIG_SBNI is not set
# CONFIG_XEN_NETDEV_FRONTEND is not set
CONFIG_XEN_NETDEV_BACKEND=y
CONFIG_ISDN=y
CONFIG_ISDN_I4L=y
# CONFIG_ISDN_AUDIO is not set
CONFIG_ISDN_X25=y

#
# ISDN feature submodules
#
# CONFIG_ISDN_DRV_LOOP is not set
# CONFIG_ISDN_DIVERSION is not set

#
# ISDN4Linux hardware drivers
#

#
# Passive cards
#
# CONFIG_ISDN_DRV_HISAX is not set

#
# Active cards
#
# CONFIG_ISDN_CAPI is not set
CONFIG_ISDN_DRV_GIGASET=y
CONFIG_GIGASET_I4L=y
# CONFIG_GIGASET_DUMMYLL is not set
CONFIG_GIGASET_M101=y
# CONFIG_GIGASET_DEBUG is not set
CONFIG_MISDN=y
CONFIG_MISDN_DSP=y
# CONFIG_MISDN_L1OIP is not set

#
# mISDN hardware drivers
#
CONFIG_MISDN_HFCPCI=y
# CONFIG_MISDN_HFCMULTI is not set
CONFIG_MISDN_AVMFRITZ=y
# CONFIG_MISDN_SPEEDFAX is not set
# CONFIG_MISDN_INFINEON is not set
CONFIG_MISDN_W6692=y
CONFIG_MISDN_NETJET=y
CONFIG_MISDN_IPAC=y
CONFIG_ISDN_HDLC=y
# CONFIG_PHONE is not set

#
# Input device support
#
CONFIG_INPUT=y
# CONFIG_INPUT_FF_MEMLESS is not set
CONFIG_INPUT_POLLDEV=y
CONFIG_INPUT_SPARSEKMAP=y

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_INPUT_JOYDEV=y
# CONFIG_INPUT_EVDEV is not set
CONFIG_INPUT_EVBUG=y

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ADP5588 is not set
CONFIG_KEYBOARD_ADP5589=y
CONFIG_KEYBOARD_ATKBD=y
CONFIG_KEYBOARD_QT1070=y
# CONFIG_KEYBOARD_QT2160 is not set
CONFIG_KEYBOARD_LKKBD=y
# CONFIG_KEYBOARD_GPIO is not set
# CONFIG_KEYBOARD_GPIO_POLLED is not set
CONFIG_KEYBOARD_TCA6416=y
# CONFIG_KEYBOARD_TCA8418 is not set
CONFIG_KEYBOARD_MATRIX=y
CONFIG_KEYBOARD_LM8323=y
# CONFIG_KEYBOARD_MAX7359 is not set
CONFIG_KEYBOARD_MCS=y
CONFIG_KEYBOARD_MPR121=y
CONFIG_KEYBOARD_NEWTON=y
CONFIG_KEYBOARD_OPENCORES=y
# CONFIG_KEYBOARD_STOWAWAY is not set
CONFIG_KEYBOARD_SUNKBD=y
# CONFIG_KEYBOARD_TC3589X is not set
CONFIG_KEYBOARD_XTKBD=y
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
CONFIG_MOUSE_PS2_ELANTECH=y
# CONFIG_MOUSE_PS2_SENTELIC is not set
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
CONFIG_MOUSE_SERIAL=y
CONFIG_MOUSE_VSXXXAA=y
# CONFIG_MOUSE_GPIO is not set
CONFIG_MOUSE_SYNAPTICS_I2C=y
# CONFIG_INPUT_JOYSTICK is not set
CONFIG_INPUT_TABLET=y
# CONFIG_INPUT_TOUCHSCREEN is not set
CONFIG_INPUT_MISC=y
CONFIG_INPUT_88PM860X_ONKEY=y
# CONFIG_INPUT_AD714X is not set
CONFIG_INPUT_BMA150=y
# CONFIG_INPUT_PCSPKR is not set
# CONFIG_INPUT_MMA8450 is not set
CONFIG_INPUT_MPU3050=y
# CONFIG_INPUT_APANEL is not set
# CONFIG_INPUT_GP2A is not set
CONFIG_INPUT_GPIO_TILT_POLLED=y
CONFIG_INPUT_ATLAS_BTNS=y
# CONFIG_INPUT_KXTJ9 is not set
# CONFIG_INPUT_UINPUT is not set
# CONFIG_INPUT_PCF8574 is not set
CONFIG_INPUT_GPIO_ROTARY_ENCODER=y
# CONFIG_INPUT_WM831X_ON is not set
# CONFIG_INPUT_PCAP is not set
CONFIG_INPUT_ADXL34X=y
CONFIG_INPUT_ADXL34X_I2C=y
CONFIG_INPUT_ADXL34X_SPI=y
# CONFIG_INPUT_CMA3000 is not set

#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=y
CONFIG_SERIO_CT82C710=y
CONFIG_SERIO_PCIPS2=y
CONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set
CONFIG_SERIO_ALTERA_PS2=y
# CONFIG_SERIO_PS2MULT is not set
CONFIG_GAMEPORT=y
# CONFIG_GAMEPORT_NS558 is not set
CONFIG_GAMEPORT_L4=y
CONFIG_GAMEPORT_EMU10K1=y
# CONFIG_GAMEPORT_FM801 is not set

#
# Character devices
#
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_VT_CONSOLE_SLEEP=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
CONFIG_UNIX98_PTYS=y
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_ROCKETPORT is not set
# CONFIG_CYCLADES is not set
CONFIG_MOXA_INTELLIO=y
# CONFIG_MOXA_SMARTIO is not set
CONFIG_SYNCLINK=y
# CONFIG_SYNCLINKMP is not set
# CONFIG_SYNCLINK_GT is not set
CONFIG_NOZOMI=y
# CONFIG_ISI is not set
# CONFIG_N_HDLC is not set
# CONFIG_N_GSM is not set
# CONFIG_TRACE_ROUTER is not set
CONFIG_TRACE_SINK=y
# CONFIG_DEVKMEM is not set
# CONFIG_STALDRV is not set

#
# Serial drivers
#
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_CONSOLE is not set
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_PNP=y
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
# CONFIG_SERIAL_8250_EXTENDED is not set

#
# Non-8250 serial port support
#
CONFIG_SERIAL_MAX3100=y
# CONFIG_SERIAL_MAX3107 is not set
# CONFIG_SERIAL_MFD_HSU is not set
# CONFIG_SERIAL_UARTLITE is not set
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_CONSOLE_POLL=y
# CONFIG_SERIAL_JSM is not set
CONFIG_SERIAL_TIMBERDALE=y
# CONFIG_SERIAL_ALTERA_JTAGUART is not set
CONFIG_SERIAL_ALTERA_UART=y
CONFIG_SERIAL_ALTERA_UART_MAXPORTS=4
CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200
# CONFIG_SERIAL_ALTERA_UART_CONSOLE is not set
CONFIG_SERIAL_IFX6X60=y
CONFIG_SERIAL_PCH_UART=y
# CONFIG_SERIAL_PCH_UART_CONSOLE is not set
CONFIG_SERIAL_XILINX_PS_UART=y
CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
CONFIG_HVC_DRIVER=y
CONFIG_HVC_IRQ=y
CONFIG_HVC_XEN=y
# CONFIG_VIRTIO_CONSOLE is not set
# CONFIG_IPMI_HANDLER is not set
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_TIMERIOMEM=y
# CONFIG_HW_RANDOM_INTEL is not set
CONFIG_HW_RANDOM_AMD=y
# CONFIG_HW_RANDOM_VIA is not set
# CONFIG_HW_RANDOM_VIRTIO is not set
CONFIG_NVRAM=y
CONFIG_R3964=y
# CONFIG_APPLICOM is not set
CONFIG_MWAVE=y
# CONFIG_RAW_DRIVER is not set
# CONFIG_HPET is not set
# CONFIG_HANGCHECK_TIMER is not set
# CONFIG_TCG_TPM is not set
CONFIG_TELCLOCK=y
CONFIG_DEVPORT=y
CONFIG_RAMOOPS=y
CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y
# CONFIG_I2C_COMPAT is not set
# CONFIG_I2C_CHARDEV is not set
# CONFIG_I2C_MUX is not set
CONFIG_I2C_HELPER_AUTO=y
CONFIG_I2C_SMBUS=y
CONFIG_I2C_ALGOBIT=y

#
# I2C Hardware Bus support
#

#
# PC SMBus host controller drivers
#
CONFIG_I2C_ALI1535=y
# CONFIG_I2C_ALI1563 is not set
CONFIG_I2C_ALI15X3=y
CONFIG_I2C_AMD756=y
# CONFIG_I2C_AMD756_S4882 is not set
# CONFIG_I2C_AMD8111 is not set
# CONFIG_I2C_I801 is not set
# CONFIG_I2C_ISCH is not set
# CONFIG_I2C_PIIX4 is not set
CONFIG_I2C_NFORCE2=y
# CONFIG_I2C_NFORCE2_S4985 is not set
# CONFIG_I2C_SIS5595 is not set
CONFIG_I2C_SIS630=y
# CONFIG_I2C_SIS96X is not set
CONFIG_I2C_VIA=y
CONFIG_I2C_VIAPRO=y

#
# ACPI drivers
#
CONFIG_I2C_SCMI=y

#
# I2C system bus drivers (mostly embedded / system-on-chip)
#
# CONFIG_I2C_DESIGNWARE_PCI is not set
CONFIG_I2C_GPIO=y
CONFIG_I2C_INTEL_MID=y
# CONFIG_I2C_OCORES is not set
# CONFIG_I2C_PCA_PLATFORM is not set
# CONFIG_I2C_PXA_PCI is not set
# CONFIG_I2C_SIMTEC is not set
CONFIG_I2C_XILINX=y
# CONFIG_I2C_EG20T is not set

#
# External I2C/SMBus adapter drivers
#
CONFIG_I2C_PARPORT_LIGHT=y
CONFIG_I2C_TAOS_EVM=y

#
# Other I2C/SMBus bus drivers
#
CONFIG_I2C_DEBUG_CORE=y
# CONFIG_I2C_DEBUG_ALGO is not set
CONFIG_I2C_DEBUG_BUS=y
CONFIG_SPI=y
CONFIG_SPI_DEBUG=y
CONFIG_SPI_MASTER=y

#
# SPI Master Controller Drivers
#
# CONFIG_SPI_ALTERA is not set
CONFIG_SPI_BITBANG=y
CONFIG_SPI_GPIO=y
# CONFIG_SPI_OC_TINY is not set
# CONFIG_SPI_PXA2XX_PCI is not set
CONFIG_SPI_TOPCLIFF_PCH=y
CONFIG_SPI_XILINX=y
# CONFIG_SPI_DESIGNWARE is not set

#
# SPI Protocol Masters
#
CONFIG_SPI_SPIDEV=y
CONFIG_SPI_TLE62X0=y
CONFIG_HSI=y
CONFIG_HSI_BOARDINFO=y

#
# HSI clients
#
# CONFIG_HSI_CHAR is not set

#
# PPS support
#
CONFIG_PPS=y
CONFIG_PPS_DEBUG=y

#
# PPS clients support
#
CONFIG_PPS_CLIENT_KTIMER=y
# CONFIG_PPS_CLIENT_LDISC is not set
# CONFIG_PPS_CLIENT_GPIO is not set

#
# PPS generators support
#

#
# PTP clock support
#
CONFIG_PTP_1588_CLOCK=y

#
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
#
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_GPIOLIB=y
CONFIG_DEBUG_GPIO=y
CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_MAX730X=y

#
# Memory mapped GPIO drivers:
#
# CONFIG_GPIO_GENERIC_PLATFORM is not set
CONFIG_GPIO_IT8761E=y
CONFIG_GPIO_SCH=y
CONFIG_GPIO_VX855=y

#
# I2C GPIO expanders:
#
CONFIG_GPIO_MAX7300=y
CONFIG_GPIO_MAX732X=y
# CONFIG_GPIO_MAX732X_IRQ is not set
CONFIG_GPIO_PCA953X=y
# CONFIG_GPIO_PCA953X_IRQ is not set
# CONFIG_GPIO_PCF857X is not set
# CONFIG_GPIO_SX150X is not set
CONFIG_GPIO_TC3589X=y
# CONFIG_GPIO_WM831X is not set
CONFIG_GPIO_WM8350=y
# CONFIG_GPIO_WM8994 is not set
CONFIG_GPIO_ADP5588=y
CONFIG_GPIO_ADP5588_IRQ=y

#
# PCI GPIO expanders:
#
# CONFIG_GPIO_BT8XX is not set
CONFIG_GPIO_LANGWELL=y
CONFIG_GPIO_PCH=y
CONFIG_GPIO_ML_IOH=y
CONFIG_GPIO_TIMBERDALE=y
CONFIG_GPIO_RDC321X=y

#
# SPI GPIO expanders:
#
# CONFIG_GPIO_MAX7301 is not set
# CONFIG_GPIO_MCP23S08 is not set
CONFIG_GPIO_MC33880=y
CONFIG_GPIO_74X164=y

#
# AC97 GPIO expanders:
#

#
# MODULbus GPIO expanders:
#
CONFIG_GPIO_TPS65910=y
# CONFIG_W1 is not set
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
CONFIG_PDA_POWER=y
# CONFIG_WM831X_BACKUP is not set
CONFIG_WM831X_POWER=y
# CONFIG_WM8350_POWER is not set
CONFIG_TEST_POWER=y
# CONFIG_BATTERY_DS2780 is not set
CONFIG_BATTERY_DS2782=y
CONFIG_BATTERY_BQ20Z75=y
# CONFIG_BATTERY_BQ27x00 is not set
CONFIG_BATTERY_MAX17040=y
# CONFIG_BATTERY_MAX17042 is not set
# CONFIG_CHARGER_MAX8903 is not set
CONFIG_CHARGER_GPIO=y
CONFIG_CHARGER_MAX8998=y
CONFIG_HWMON=y
CONFIG_HWMON_VID=y
CONFIG_HWMON_DEBUG_CHIP=y

#
# Native drivers
#
# CONFIG_SENSORS_ABITUGURU is not set
# CONFIG_SENSORS_ABITUGURU3 is not set
CONFIG_SENSORS_AD7314=y
CONFIG_SENSORS_AD7414=y
CONFIG_SENSORS_AD7418=y
CONFIG_SENSORS_ADCXX=y
# CONFIG_SENSORS_ADM1021 is not set
# CONFIG_SENSORS_ADM1025 is not set
CONFIG_SENSORS_ADM1026=y
CONFIG_SENSORS_ADM1029=y
CONFIG_SENSORS_ADM1031=y
# CONFIG_SENSORS_ADM9240 is not set
CONFIG_SENSORS_ADT7411=y
CONFIG_SENSORS_ADT7462=y
CONFIG_SENSORS_ADT7470=y
CONFIG_SENSORS_ADT7475=y
# CONFIG_SENSORS_ASC7621 is not set
# CONFIG_SENSORS_K8TEMP is not set
CONFIG_SENSORS_K10TEMP=y
# CONFIG_SENSORS_FAM15H_POWER is not set
CONFIG_SENSORS_ASB100=y
# CONFIG_SENSORS_ATXP1 is not set
CONFIG_SENSORS_DS620=y
CONFIG_SENSORS_DS1621=y
CONFIG_SENSORS_I5K_AMB=y
CONFIG_SENSORS_F71805F=y
# CONFIG_SENSORS_F71882FG is not set
CONFIG_SENSORS_F75375S=y
CONFIG_SENSORS_FSCHMD=y
CONFIG_SENSORS_G760A=y
# CONFIG_SENSORS_GL518SM is not set
# CONFIG_SENSORS_GL520SM is not set
CONFIG_SENSORS_GPIO_FAN=y
CONFIG_SENSORS_CORETEMP=y
CONFIG_SENSORS_IT87=y
CONFIG_SENSORS_JC42=y
CONFIG_SENSORS_LINEAGE=y
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM70 is not set
CONFIG_SENSORS_LM73=y
# CONFIG_SENSORS_LM75 is not set
CONFIG_SENSORS_LM77=y
CONFIG_SENSORS_LM78=y
CONFIG_SENSORS_LM80=y
# CONFIG_SENSORS_LM83 is not set
CONFIG_SENSORS_LM85=y
CONFIG_SENSORS_LM87=y
# CONFIG_SENSORS_LM90 is not set
# CONFIG_SENSORS_LM92 is not set
CONFIG_SENSORS_LM93=y
CONFIG_SENSORS_LTC4151=y
# CONFIG_SENSORS_LTC4215 is not set
CONFIG_SENSORS_LTC4245=y
# CONFIG_SENSORS_LTC4261 is not set
# CONFIG_SENSORS_LM95241 is not set
# CONFIG_SENSORS_LM95245 is not set
# CONFIG_SENSORS_MAX1111 is not set
# CONFIG_SENSORS_MAX16065 is not set
CONFIG_SENSORS_MAX1619=y
CONFIG_SENSORS_MAX1668=y
CONFIG_SENSORS_MAX6639=y
CONFIG_SENSORS_MAX6642=y
# CONFIG_SENSORS_MAX6650 is not set
# CONFIG_SENSORS_NTC_THERMISTOR is not set
CONFIG_SENSORS_PC87360=y
# CONFIG_SENSORS_PC87427 is not set
CONFIG_SENSORS_PCF8591=y
CONFIG_PMBUS=y
CONFIG_SENSORS_PMBUS=y
# CONFIG_SENSORS_ADM1275 is not set
# CONFIG_SENSORS_LM25066 is not set
# CONFIG_SENSORS_LTC2978 is not set
# CONFIG_SENSORS_MAX16064 is not set
# CONFIG_SENSORS_MAX34440 is not set
# CONFIG_SENSORS_MAX8688 is not set
# CONFIG_SENSORS_UCD9000 is not set
# CONFIG_SENSORS_UCD9200 is not set
CONFIG_SENSORS_ZL6100=y
# CONFIG_SENSORS_SHT15 is not set
# CONFIG_SENSORS_SHT21 is not set
CONFIG_SENSORS_SIS5595=y
# CONFIG_SENSORS_SMM665 is not set
CONFIG_SENSORS_DME1737=y
# CONFIG_SENSORS_EMC1403 is not set
# CONFIG_SENSORS_EMC2103 is not set
# CONFIG_SENSORS_EMC6W201 is not set
CONFIG_SENSORS_SMSC47M1=y
CONFIG_SENSORS_SMSC47M192=y
# CONFIG_SENSORS_SMSC47B397 is not set
# CONFIG_SENSORS_SCH56XX_COMMON is not set
# CONFIG_SENSORS_SCH5627 is not set
# CONFIG_SENSORS_SCH5636 is not set
# CONFIG_SENSORS_ADS1015 is not set
# CONFIG_SENSORS_ADS7828 is not set
CONFIG_SENSORS_ADS7871=y
CONFIG_SENSORS_AMC6821=y
# CONFIG_SENSORS_THMC50 is not set
# CONFIG_SENSORS_TMP102 is not set
# CONFIG_SENSORS_TMP401 is not set
CONFIG_SENSORS_TMP421=y
# CONFIG_SENSORS_VIA_CPUTEMP is not set
CONFIG_SENSORS_VIA686A=y
CONFIG_SENSORS_VT1211=y
# CONFIG_SENSORS_VT8231 is not set
CONFIG_SENSORS_W83781D=y
# CONFIG_SENSORS_W83791D is not set
# CONFIG_SENSORS_W83792D is not set
CONFIG_SENSORS_W83793=y
CONFIG_SENSORS_W83795=y
CONFIG_SENSORS_W83795_FANCTRL=y
CONFIG_SENSORS_W83L785TS=y
CONFIG_SENSORS_W83L786NG=y
CONFIG_SENSORS_W83627HF=y
# CONFIG_SENSORS_W83627EHF is not set
CONFIG_SENSORS_WM831X=y
CONFIG_SENSORS_WM8350=y
CONFIG_SENSORS_APPLESMC=y

#
# ACPI drivers
#
# CONFIG_SENSORS_ACPI_POWER is not set
CONFIG_SENSORS_ATK0110=y
CONFIG_THERMAL=y
CONFIG_THERMAL_HWMON=y
# CONFIG_WATCHDOG is not set
CONFIG_SSB_POSSIBLE=y

#
# Sonics Silicon Backplane
#
# CONFIG_SSB is not set
CONFIG_BCMA_POSSIBLE=y

#
# Broadcom specific AMBA
#
# CONFIG_BCMA is not set

#
# Multifunction device drivers
#
CONFIG_MFD_CORE=y
CONFIG_MFD_88PM860X=y
CONFIG_MFD_SM501=y
# CONFIG_MFD_SM501_GPIO is not set
CONFIG_HTC_PASIC3=y
CONFIG_HTC_I2CPLD=y
CONFIG_TPS6105X=y
CONFIG_TPS65010=y
# CONFIG_TPS6507X is not set
CONFIG_MFD_TPS6586X=y
CONFIG_MFD_TPS65910=y
# CONFIG_MFD_TPS65912_I2C is not set
# CONFIG_MFD_TPS65912_SPI is not set
# CONFIG_TWL4030_CORE is not set
# CONFIG_MFD_STMPE is not set
CONFIG_MFD_TC3589X=y
# CONFIG_MFD_TMIO is not set
# CONFIG_PMIC_DA903X is not set
CONFIG_PMIC_DA9052=y
CONFIG_MFD_DA9052_SPI=y
CONFIG_MFD_DA9052_I2C=y
# CONFIG_PMIC_ADP5520 is not set
# CONFIG_MFD_MAX8925 is not set
# CONFIG_MFD_MAX8997 is not set
CONFIG_MFD_MAX8998=y
# CONFIG_MFD_WM8400 is not set
CONFIG_MFD_WM831X=y
CONFIG_MFD_WM831X_I2C=y
CONFIG_MFD_WM831X_SPI=y
CONFIG_MFD_WM8350=y
CONFIG_MFD_WM8350_I2C=y
CONFIG_MFD_WM8994=y
# CONFIG_MFD_PCF50633 is not set
# CONFIG_MFD_MC13XXX is not set
# CONFIG_ABX500_CORE is not set
CONFIG_EZX_PCAP=y
# CONFIG_MFD_CS5535 is not set
CONFIG_MFD_TIMBERDALE=y
CONFIG_LPC_SCH=y
CONFIG_MFD_RDC321X=y
# CONFIG_MFD_JANZ_CMODIO is not set
CONFIG_MFD_VX855=y
CONFIG_MFD_WL1273_CORE=y
# CONFIG_MFD_AAT2870_CORE is not set
CONFIG_REGULATOR=y
CONFIG_REGULATOR_DEBUG=y
CONFIG_REGULATOR_DUMMY=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_VIRTUAL_CONSUMER=y
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
CONFIG_REGULATOR_GPIO=y
CONFIG_REGULATOR_BQ24022=y
# CONFIG_REGULATOR_MAX1586 is not set
# CONFIG_REGULATOR_MAX8649 is not set
# CONFIG_REGULATOR_MAX8660 is not set
CONFIG_REGULATOR_MAX8952=y
CONFIG_REGULATOR_MAX8998=y
CONFIG_REGULATOR_WM831X=y
CONFIG_REGULATOR_WM8350=y
# CONFIG_REGULATOR_WM8994 is not set
# CONFIG_REGULATOR_DA9052 is not set
# CONFIG_REGULATOR_LP3971 is not set
# CONFIG_REGULATOR_LP3972 is not set
CONFIG_REGULATOR_PCAP=y
# CONFIG_REGULATOR_TPS6105X is not set
CONFIG_REGULATOR_TPS65023=y
# CONFIG_REGULATOR_TPS6507X is not set
# CONFIG_REGULATOR_88PM8607 is not set
CONFIG_REGULATOR_ISL6271A=y
CONFIG_REGULATOR_AD5398=y
# CONFIG_REGULATOR_TPS6586X is not set
CONFIG_REGULATOR_TPS6524X=y
CONFIG_REGULATOR_TPS65910=y
# CONFIG_MEDIA_SUPPORT is not set

#
# Graphics support
#
CONFIG_AGP=y
CONFIG_AGP_AMD64=y
CONFIG_AGP_INTEL=y
CONFIG_AGP_SIS=y
CONFIG_AGP_VIA=y
CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_VGA_SWITCHEROO=y
CONFIG_DRM=y
CONFIG_DRM_KMS_HELPER=y
CONFIG_DRM_TTM=y
CONFIG_DRM_TDFX=y
# CONFIG_DRM_R128 is not set
CONFIG_DRM_RADEON=y
# CONFIG_DRM_RADEON_KMS is not set
CONFIG_DRM_I915=y
CONFIG_DRM_I915_KMS=y
# CONFIG_DRM_MGA is not set
# CONFIG_DRM_SIS is not set
CONFIG_DRM_VIA=y
CONFIG_DRM_SAVAGE=y
# CONFIG_DRM_VMWGFX is not set
# CONFIG_DRM_GMA500 is not set
# CONFIG_STUB_POULSBO is not set
CONFIG_VGASTATE=y
CONFIG_VIDEO_OUTPUT_CONTROL=y
CONFIG_FB=y
# CONFIG_FIRMWARE_EDID is not set
# CONFIG_FB_DDC is not set
CONFIG_FB_BOOT_VESA_SUPPORT=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
CONFIG_FB_SYS_FILLRECT=y
CONFIG_FB_SYS_COPYAREA=y
CONFIG_FB_SYS_IMAGEBLIT=y
# CONFIG_FB_FOREIGN_ENDIAN is not set
CONFIG_FB_SYS_FOPS=y
# CONFIG_FB_WMT_GE_ROPS is not set
CONFIG_FB_DEFERRED_IO=y
CONFIG_FB_SVGALIB=y
# CONFIG_FB_MACMODES is not set
# CONFIG_FB_BACKLIGHT is not set
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y

#
# Frame buffer hardware drivers
#
CONFIG_FB_CIRRUS=y
CONFIG_FB_PM2=y
CONFIG_FB_PM2_FIFO_DISCONNECT=y
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ARC is not set
CONFIG_FB_ASILIANT=y
CONFIG_FB_IMSTT=y
# CONFIG_FB_VGA16 is not set
CONFIG_FB_UVESA=y
CONFIG_FB_VESA=y
# CONFIG_FB_EFI is not set
# CONFIG_FB_N411 is not set
CONFIG_FB_HGA=y
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
CONFIG_FB_LE80578=y
# CONFIG_FB_CARILLO_RANCH is not set
# CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON is not set
# CONFIG_FB_ATY128 is not set
CONFIG_FB_ATY=y
# CONFIG_FB_ATY_CT is not set
CONFIG_FB_ATY_GX=y
# CONFIG_FB_ATY_BACKLIGHT is not set
# CONFIG_FB_S3 is not set
CONFIG_FB_SAVAGE=y
# CONFIG_FB_SAVAGE_I2C is not set
# CONFIG_FB_SAVAGE_ACCEL is not set
CONFIG_FB_SIS=y
CONFIG_FB_SIS_300=y
# CONFIG_FB_SIS_315 is not set
CONFIG_FB_VIA=y
# CONFIG_FB_VIA_DIRECT_PROCFS is not set
CONFIG_FB_VIA_X_COMPATIBILITY=y
CONFIG_FB_NEOMAGIC=y
# CONFIG_FB_KYRO is not set
CONFIG_FB_3DFX=y
# CONFIG_FB_3DFX_ACCEL is not set
# CONFIG_FB_3DFX_I2C is not set
CONFIG_FB_VOODOO1=y
CONFIG_FB_VT8623=y
CONFIG_FB_TRIDENT=y
CONFIG_FB_ARK=y
CONFIG_FB_PM3=y
CONFIG_FB_CARMINE=y
# CONFIG_FB_CARMINE_DRAM_EVAL is not set
CONFIG_CARMINE_DRAM_CUSTOM=y
# CONFIG_FB_GEODE is not set
# CONFIG_FB_TMIO is not set
# CONFIG_FB_SM501 is not set
# CONFIG_FB_VIRTUAL is not set
# CONFIG_XEN_FBDEV_FRONTEND is not set
# CONFIG_FB_METRONOME is not set
CONFIG_FB_MB862XX=y
CONFIG_FB_MB862XX_PCI_GDC=y
# CONFIG_FB_MB862XX_I2C is not set
CONFIG_FB_BROADSHEET=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
# CONFIG_LCD_CLASS_DEVICE is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
# CONFIG_BACKLIGHT_GENERIC is not set
# CONFIG_BACKLIGHT_PROGEAR is not set
# CONFIG_BACKLIGHT_APPLE is not set
CONFIG_BACKLIGHT_SAHARA=y
CONFIG_BACKLIGHT_WM831X=y
CONFIG_BACKLIGHT_ADP8860=y
CONFIG_BACKLIGHT_ADP8870=y
# CONFIG_BACKLIGHT_88PM860X is not set

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
CONFIG_VGACON_SOFT_SCROLLBACK=y
CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
CONFIG_LOGO=y
CONFIG_LOGO_LINUX_MONO=y
# CONFIG_LOGO_LINUX_VGA16 is not set
CONFIG_LOGO_LINUX_CLUT224=y
# CONFIG_SOUND is not set
CONFIG_HID_SUPPORT=y
# CONFIG_HID is not set
CONFIG_HID_PID=y
# CONFIG_USB_SUPPORT is not set
CONFIG_UWB=y
CONFIG_UWB_WHCI=y
# CONFIG_MMC is not set
CONFIG_MEMSTICK=y
# CONFIG_MEMSTICK_DEBUG is not set

#
# MemoryStick drivers
#
# CONFIG_MEMSTICK_UNSAFE_RESUME is not set
# CONFIG_MSPRO_BLOCK is not set

#
# MemoryStick Host Controller Drivers
#
# CONFIG_MEMSTICK_TIFM_MS is not set
CONFIG_MEMSTICK_JMICRON_38X=y
CONFIG_MEMSTICK_R592=y
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y

#
# LED drivers
#
CONFIG_LEDS_88PM860X=y
CONFIG_LEDS_LM3530=y
CONFIG_LEDS_PCA9532=y
CONFIG_LEDS_PCA9532_GPIO=y
# CONFIG_LEDS_GPIO is not set
# CONFIG_LEDS_LP3944 is not set
# CONFIG_LEDS_LP5521 is not set
CONFIG_LEDS_LP5523=y
# CONFIG_LEDS_CLEVO_MAIL is not set
# CONFIG_LEDS_PCA955X is not set
CONFIG_LEDS_WM831X_STATUS=y
CONFIG_LEDS_WM8350=y
# CONFIG_LEDS_DAC124S085 is not set
CONFIG_LEDS_REGULATOR=y
CONFIG_LEDS_BD2802=y
CONFIG_LEDS_INTEL_SS4200=y
# CONFIG_LEDS_LT3593 is not set
CONFIG_LEDS_TCA6507=y
# CONFIG_LEDS_TRIGGERS is not set

#
# LED Triggers
#
CONFIG_ACCESSIBILITY=y
CONFIG_A11Y_BRAILLE_CONSOLE=y
# CONFIG_INFINIBAND is not set
# CONFIG_EDAC is not set
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
# CONFIG_RTC_HCTOSYS is not set
CONFIG_RTC_DEBUG=y

#
# RTC interfaces
#
CONFIG_RTC_INTF_SYSFS=y
# CONFIG_RTC_INTF_PROC is not set
# CONFIG_RTC_INTF_DEV is not set
CONFIG_RTC_DRV_TEST=y

#
# I2C RTC drivers
#
CONFIG_RTC_DRV_88PM860X=y
CONFIG_RTC_DRV_DS1307=y
CONFIG_RTC_DRV_DS1374=y
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_DS3232 is not set
CONFIG_RTC_DRV_MAX6900=y
CONFIG_RTC_DRV_MAX8998=y
# CONFIG_RTC_DRV_RS5C372 is not set
CONFIG_RTC_DRV_ISL1208=y
# CONFIG_RTC_DRV_ISL12022 is not set
CONFIG_RTC_DRV_X1205=y
CONFIG_RTC_DRV_PCF8563=y
# CONFIG_RTC_DRV_PCF8583 is not set
CONFIG_RTC_DRV_M41T80=y
# CONFIG_RTC_DRV_M41T80_WDT is not set
CONFIG_RTC_DRV_BQ32K=y
CONFIG_RTC_DRV_S35390A=y
# CONFIG_RTC_DRV_FM3130 is not set
# CONFIG_RTC_DRV_RX8581 is not set
# CONFIG_RTC_DRV_RX8025 is not set
# CONFIG_RTC_DRV_EM3027 is not set
# CONFIG_RTC_DRV_RV3029C2 is not set

#
# SPI RTC drivers
#
# CONFIG_RTC_DRV_M41T93 is not set
# CONFIG_RTC_DRV_M41T94 is not set
# CONFIG_RTC_DRV_DS1305 is not set
CONFIG_RTC_DRV_DS1390=y
CONFIG_RTC_DRV_MAX6902=y
# CONFIG_RTC_DRV_R9701 is not set
# CONFIG_RTC_DRV_RS5C348 is not set
CONFIG_RTC_DRV_DS3234=y
CONFIG_RTC_DRV_PCF2123=y

#
# Platform RTC drivers
#
CONFIG_RTC_DRV_CMOS=y
# CONFIG_RTC_DRV_DS1286 is not set
CONFIG_RTC_DRV_DS1511=y
CONFIG_RTC_DRV_DS1553=y
# CONFIG_RTC_DRV_DS1742 is not set
CONFIG_RTC_DRV_STK17TA8=y
CONFIG_RTC_DRV_M48T86=y
CONFIG_RTC_DRV_M48T35=y
CONFIG_RTC_DRV_M48T59=y
# CONFIG_RTC_DRV_MSM6242 is not set
# CONFIG_RTC_DRV_BQ4802 is not set
CONFIG_RTC_DRV_RP5C01=y
CONFIG_RTC_DRV_V3020=y
CONFIG_RTC_DRV_WM831X=y
# CONFIG_RTC_DRV_WM8350 is not set

#
# on-CPU RTC drivers
#
CONFIG_RTC_DRV_PCAP=y
CONFIG_DMADEVICES=y
CONFIG_DMADEVICES_DEBUG=y
# CONFIG_DMADEVICES_VDEBUG is not set

#
# DMA Devices
#
# CONFIG_INTEL_MID_DMAC is not set
# CONFIG_INTEL_IOATDMA is not set
# CONFIG_TIMB_DMA is not set
# CONFIG_PCH_DMA is not set
# CONFIG_AUXDISPLAY is not set
CONFIG_UIO=y
# CONFIG_UIO_CIF is not set
CONFIG_UIO_PDRV=y
# CONFIG_UIO_PDRV_GENIRQ is not set
CONFIG_UIO_AEC=y
CONFIG_UIO_SERCOS3=y
CONFIG_UIO_PCI_GENERIC=y
CONFIG_UIO_NETX=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_RING=y

#
# Virtio drivers
#
# CONFIG_VIRTIO_PCI is not set
# CONFIG_VIRTIO_BALLOON is not set
CONFIG_VIRTIO_MMIO=y

#
# Microsoft Hyper-V guest support
#
# CONFIG_HYPERV is not set

#
# Xen driver support
#
# CONFIG_XEN_BALLOON is not set
# CONFIG_XEN_DEV_EVTCHN is not set
CONFIG_XEN_BACKEND=y
# CONFIG_XENFS is not set
CONFIG_XEN_SYS_HYPERVISOR=y
CONFIG_XEN_XENBUS_FRONTEND=y
CONFIG_XEN_GNTDEV=y
# CONFIG_XEN_GRANT_DEV_ALLOC is not set
CONFIG_SWIOTLB_XEN=y
CONFIG_XEN_TMEM=y
# CONFIG_XEN_PCIDEV_BACKEND is not set
CONFIG_XEN_PRIVCMD=y
# CONFIG_STAGING is not set
CONFIG_X86_PLATFORM_DEVICES=y
# CONFIG_ACERHDF is not set
CONFIG_DELL_LAPTOP=y
# CONFIG_FUJITSU_LAPTOP is not set
# CONFIG_HP_ACCEL is not set
CONFIG_PANASONIC_LAPTOP=y
# CONFIG_THINKPAD_ACPI is not set
# CONFIG_SENSORS_HDAPS is not set
CONFIG_EEEPC_LAPTOP=y
# CONFIG_ACPI_WMI is not set
CONFIG_ACPI_ASUS=y
# CONFIG_TOPSTAR_LAPTOP is not set
# CONFIG_ACPI_TOSHIBA is not set
CONFIG_TOSHIBA_BT_RFKILL=y
CONFIG_ACPI_CMPC=y
# CONFIG_INTEL_IPS is not set
CONFIG_IBM_RTL=y
# CONFIG_XO15_EBOOK is not set
CONFIG_SAMSUNG_Q10=y

#
# Hardware Spinlock drivers
#
CONFIG_CLKEVT_I8253=y
CONFIG_I8253_LOCK=y
CONFIG_CLKBLD_I8253=y
CONFIG_IOMMU_SUPPORT=y
# CONFIG_AMD_IOMMU is not set
CONFIG_VIRT_DRIVERS=y
# CONFIG_PM_DEVFREQ is not set
# CONFIG_XSHM is not set

#
# Firmware Drivers
#
# CONFIG_EDD is not set
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_EFI_VARS=y
# CONFIG_DELL_RBU is not set
CONFIG_DCDBAS=y
# CONFIG_DMIID is not set
# CONFIG_DMI_SYSFS is not set
CONFIG_ISCSI_IBFT_FIND=y
# CONFIG_ISCSI_IBFT is not set
CONFIG_GOOGLE_FIRMWARE=y

#
# Google Firmware Drivers
#
CONFIG_GOOGLE_SMI=y
# CONFIG_GOOGLE_MEMCONSOLE is not set

#
# File systems
#
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
# CONFIG_EXT2_FS_SECURITY is not set
CONFIG_EXT2_FS_XIP=y
# CONFIG_EXT3_FS is not set
# CONFIG_EXT4_FS is not set
CONFIG_FS_XIP=y
CONFIG_FS_MBCACHE=y
# CONFIG_REISERFS_FS is not set
# CONFIG_JFS_FS is not set
CONFIG_XFS_FS=y
CONFIG_XFS_QUOTA=y
CONFIG_XFS_POSIX_ACL=y
# CONFIG_XFS_RT is not set
CONFIG_XFS_DEBUG=y
# CONFIG_GFS2_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_BTRFS_FS is not set
# CONFIG_NILFS2_FS is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_EXPORTFS=y
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
# CONFIG_INOTIFY_USER is not set
# CONFIG_FANOTIFY is not set
CONFIG_QUOTA=y
# CONFIG_QUOTA_NETLINK_INTERFACE is not set
# CONFIG_PRINT_QUOTA_WARNING is not set
CONFIG_QUOTA_DEBUG=y
CONFIG_QUOTA_TREE=y
CONFIG_QFMT_V1=y
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y
CONFIG_QUOTACTL_COMPAT=y
CONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not set

#
# Caches
#
# CONFIG_FSCACHE is not set

#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
# CONFIG_ZISOFS is not set
CONFIG_UDF_FS=y
CONFIG_UDF_NLS=y

#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
CONFIG_NTFS_FS=y
# CONFIG_NTFS_DEBUG is not set
CONFIG_NTFS_RW=y

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
# CONFIG_TMPFS_POSIX_ACL is not set
# CONFIG_TMPFS_XATTR is not set
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set
CONFIG_CONFIGFS_FS=y
CONFIG_MISC_FILESYSTEMS=y
# CONFIG_ADFS_FS is not set
CONFIG_AFFS_FS=y
CONFIG_ECRYPT_FS=y
CONFIG_HFS_FS=y
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_JFFS2_FS is not set
CONFIG_UBIFS_FS=y
# CONFIG_UBIFS_FS_XATTR is not set
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_UBIFS_FS_DEBUG=y
# CONFIG_LOGFS is not set
CONFIG_CRAMFS=y
# CONFIG_SQUASHFS is not set
# CONFIG_VXFS_FS is not set
CONFIG_MINIX_FS=y
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set
CONFIG_QNX4FS_FS=y
# CONFIG_ROMFS_FS is not set
CONFIG_PSTORE=y
# CONFIG_SYSV_FS is not set
CONFIG_UFS_FS=y
CONFIG_UFS_FS_WRITE=y
CONFIG_UFS_DEBUG=y
CONFIG_ORE=y
CONFIG_EXOFS_FS=y
CONFIG_EXOFS_DEBUG=y
# CONFIG_NETWORK_FILESYSTEMS is not set

#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
CONFIG_ACORN_PARTITION=y
CONFIG_ACORN_PARTITION_CUMANA=y
# CONFIG_ACORN_PARTITION_EESOX is not set
# CONFIG_ACORN_PARTITION_ICS is not set
CONFIG_ACORN_PARTITION_ADFS=y
CONFIG_ACORN_PARTITION_POWERTEC=y
# CONFIG_ACORN_PARTITION_RISCIX is not set
CONFIG_OSF_PARTITION=y
CONFIG_AMIGA_PARTITION=y
CONFIG_ATARI_PARTITION=y
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
# CONFIG_BSD_DISKLABEL is not set
CONFIG_MINIX_SUBPARTITION=y
# CONFIG_SOLARIS_X86_PARTITION is not set
CONFIG_UNIXWARE_DISKLABEL=y
# CONFIG_LDM_PARTITION is not set
CONFIG_SGI_PARTITION=y
# CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set
CONFIG_KARMA_PARTITION=y
CONFIG_EFI_PARTITION=y
# CONFIG_SYSV68_PARTITION is not set
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_CODEPAGE_437 is not set
CONFIG_NLS_CODEPAGE_737=y
CONFIG_NLS_CODEPAGE_775=y
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
CONFIG_NLS_CODEPAGE_857=y
CONFIG_NLS_CODEPAGE_860=y
CONFIG_NLS_CODEPAGE_861=y
CONFIG_NLS_CODEPAGE_862=y
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
CONFIG_NLS_CODEPAGE_866=y
CONFIG_NLS_CODEPAGE_869=y
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
CONFIG_NLS_ISO8859_8=y
# CONFIG_NLS_CODEPAGE_1250 is not set
CONFIG_NLS_CODEPAGE_1251=y
# CONFIG_NLS_ASCII is not set
# CONFIG_NLS_ISO8859_1 is not set
CONFIG_NLS_ISO8859_2=y
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
CONFIG_NLS_ISO8859_5=y
CONFIG_NLS_ISO8859_6=y
CONFIG_NLS_ISO8859_7=y
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
CONFIG_NLS_ISO8859_15=y
CONFIG_NLS_KOI8_R=y
# CONFIG_NLS_KOI8_U is not set
CONFIG_NLS_UTF8=y

#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_PRINTK_TIME=y
CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
CONFIG_ENABLE_WARN_DEPRECATED=y
CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=2048
CONFIG_MAGIC_SYSRQ=y
CONFIG_STRIP_ASM_SYMS=y
CONFIG_UNUSED_SYMBOLS=y
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
CONFIG_DEBUG_SECTION_MISMATCH=y
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
# CONFIG_LOCKUP_DETECTOR is not set
# CONFIG_HARDLOCKUP_DETECTOR is not set
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
CONFIG_SCHED_DEBUG=y
CONFIG_SCHEDSTATS=y
# CONFIG_TIMER_STATS is not set
CONFIG_DEBUG_OBJECTS=y
CONFIG_DEBUG_OBJECTS_SELFTEST=y
CONFIG_DEBUG_OBJECTS_FREE=y
# CONFIG_DEBUG_OBJECTS_TIMERS is not set
# CONFIG_DEBUG_OBJECTS_WORK is not set
# CONFIG_DEBUG_OBJECTS_RCU_HEAD is not set
# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
# CONFIG_SLUB_DEBUG_ON is not set
# CONFIG_SLUB_STATS is not set
# CONFIG_DEBUG_KMEMLEAK is not set
CONFIG_DEBUG_PREEMPT=y
CONFIG_DEBUG_RT_MUTEXES=y
CONFIG_DEBUG_PI_LIST=y
# CONFIG_RT_MUTEX_TESTER is not set
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_PROVE_LOCKING is not set
CONFIG_SPARSE_RCU_POINTER=y
# CONFIG_LOCK_STAT is not set
CONFIG_TRACE_IRQFLAGS=y
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
CONFIG_DEBUG_LOCKING_API_SELFTESTS=y
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_STACK_USAGE is not set
CONFIG_DEBUG_KOBJECT=y
CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_VIRTUAL is not set
CONFIG_DEBUG_WRITECOUNT=y
CONFIG_DEBUG_MEMORY_INIT=y
CONFIG_DEBUG_LIST=y
CONFIG_TEST_LIST_SORT=y
CONFIG_DEBUG_SG=y
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set
CONFIG_ARCH_WANT_FRAME_POINTERS=y
CONFIG_FRAME_POINTER=y
# CONFIG_BOOT_PRINTK_DELAY is not set
CONFIG_RCU_TORTURE_TEST=y
# CONFIG_RCU_TORTURE_TEST_RUNNABLE is not set
CONFIG_BACKTRACE_SELF_TEST=y
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
CONFIG_LKDTM=y
CONFIG_FAULT_INJECTION=y
# CONFIG_FAILSLAB is not set
# CONFIG_FAIL_PAGE_ALLOC is not set
CONFIG_FAIL_MAKE_REQUEST=y
CONFIG_FAIL_IO_TIMEOUT=y
CONFIG_FAULT_INJECTION_DEBUG_FS=y
# CONFIG_LATENCYTOP is not set
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
# CONFIG_DEBUG_PAGEALLOC is not set
CONFIG_USER_STACKTRACE_SUPPORT=y
CONFIG_NOP_TRACER=y
CONFIG_HAVE_FTRACE_NMI_ENTER=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_TRACER_MAX_TRACE=y
CONFIG_RING_BUFFER=y
CONFIG_FTRACE_NMI_ENTER=y
CONFIG_EVENT_TRACING=y
CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_RING_BUFFER_ALLOW_SWAP=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
# CONFIG_FUNCTION_GRAPH_TRACER is not set
CONFIG_IRQSOFF_TRACER=y
CONFIG_PREEMPT_TRACER=y
CONFIG_SCHED_TRACER=y
# CONFIG_FTRACE_SYSCALLS is not set
CONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
# CONFIG_PROFILE_ALL_BRANCHES is not set
# CONFIG_STACK_TRACER is not set
# CONFIG_BLK_DEV_IO_TRACE is not set
CONFIG_UPROBE_EVENT=y
CONFIG_PROBE_EVENTS=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_FUNCTION_PROFILER=y
CONFIG_FTRACE_MCOUNT_RECORD=y
# CONFIG_FTRACE_STARTUP_TEST is not set
# CONFIG_MMIOTRACE is not set
# CONFIG_RING_BUFFER_BENCHMARK is not set
CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
# CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set
CONFIG_DYNAMIC_DEBUG=y
CONFIG_DMA_API_DEBUG=y
CONFIG_ATOMIC64_SELFTEST=y
CONFIG_SAMPLES=y
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
# CONFIG_KGDB_TESTS is not set
# CONFIG_KGDB_LOW_LEVEL_TRAP is not set
# CONFIG_KGDB_KDB is not set
CONFIG_HAVE_ARCH_KMEMCHECK=y
CONFIG_TEST_KSTRTOX=y
# CONFIG_STRICT_DEVMEM is not set
CONFIG_X86_VERBOSE_BOOTUP=y
CONFIG_EARLY_PRINTK=y
# CONFIG_EARLY_PRINTK_DBGP is not set
CONFIG_DEBUG_STACKOVERFLOW=y
CONFIG_X86_PTDUMP=y
CONFIG_DEBUG_RODATA=y
CONFIG_DEBUG_RODATA_TEST=y
CONFIG_IOMMU_DEBUG=y
# CONFIG_IOMMU_STRESS is not set
CONFIG_IOMMU_LEAK=y
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IO_DELAY_TYPE_NONE=3
# CONFIG_IO_DELAY_0X80 is not set
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
CONFIG_IO_DELAY_NONE=y
CONFIG_DEFAULT_IO_DELAY_TYPE=3
CONFIG_DEBUG_BOOT_PARAMS=y
CONFIG_CPA_DEBUG=y
CONFIG_OPTIMIZE_INLINING=y
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
CONFIG_DEBUG_NMI_SELFTEST=y

#
# Security options
#
CONFIG_KEYS=y
CONFIG_ENCRYPTED_KEYS=y
# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
# CONFIG_SECURITY_DMESG_RESTRICT is not set
# CONFIG_SECURITY is not set
CONFIG_SECURITYFS=y
CONFIG_DEFAULT_SECURITY_DAC=y
CONFIG_DEFAULT_SECURITY=""
CONFIG_XOR_BLOCKS=y
CONFIG_ASYNC_CORE=y
CONFIG_ASYNC_XOR=y
CONFIG_CRYPTO=y

#
# Crypto core or helper
#
# CONFIG_CRYPTO_FIPS is not set
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ALGAPI2=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_AEAD2=y
CONFIG_CRYPTO_BLKCIPHER=y
CONFIG_CRYPTO_BLKCIPHER2=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_HASH2=y
CONFIG_CRYPTO_RNG=y
CONFIG_CRYPTO_RNG2=y
CONFIG_CRYPTO_PCOMP2=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
# CONFIG_CRYPTO_USER is not set
# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
CONFIG_CRYPTO_GF128MUL=y
CONFIG_CRYPTO_NULL=y
CONFIG_CRYPTO_WORKQUEUE=y
CONFIG_CRYPTO_CRYPTD=y
CONFIG_CRYPTO_AUTHENC=y

#
# Authenticated Encryption with Associated Data
#
# CONFIG_CRYPTO_CCM is not set
# CONFIG_CRYPTO_GCM is not set
CONFIG_CRYPTO_SEQIV=y

#
# Block modes
#
CONFIG_CRYPTO_CBC=y
# CONFIG_CRYPTO_CTR is not set
# CONFIG_CRYPTO_CTS is not set
CONFIG_CRYPTO_ECB=y
CONFIG_CRYPTO_LRW=y
CONFIG_CRYPTO_PCBC=y
CONFIG_CRYPTO_XTS=y

#
# Hash modes
#
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_XCBC=y
CONFIG_CRYPTO_VMAC=y

#
# Digest
#
CONFIG_CRYPTO_CRC32C=y
CONFIG_CRYPTO_CRC32C_INTEL=y
CONFIG_CRYPTO_GHASH=y
# CONFIG_CRYPTO_MD4 is not set
CONFIG_CRYPTO_MD5=y
# CONFIG_CRYPTO_MICHAEL_MIC is not set
CONFIG_CRYPTO_RMD128=y
CONFIG_CRYPTO_RMD160=y
CONFIG_CRYPTO_RMD256=y
# CONFIG_CRYPTO_RMD320 is not set
CONFIG_CRYPTO_SHA1=y
# CONFIG_CRYPTO_SHA1_SSSE3 is not set
CONFIG_CRYPTO_SHA256=y
CONFIG_CRYPTO_SHA512=y
CONFIG_CRYPTO_TGR192=y
CONFIG_CRYPTO_WP512=y
# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set

#
# Ciphers
#
CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_AES_X86_64=y
# CONFIG_CRYPTO_AES_NI_INTEL is not set
CONFIG_CRYPTO_ANUBIS=y
# CONFIG_CRYPTO_ARC4 is not set
CONFIG_CRYPTO_BLOWFISH=y
CONFIG_CRYPTO_BLOWFISH_COMMON=y
CONFIG_CRYPTO_BLOWFISH_X86_64=y
CONFIG_CRYPTO_CAMELLIA=y
# CONFIG_CRYPTO_CAST5 is not set
CONFIG_CRYPTO_CAST6=y
CONFIG_CRYPTO_DES=y
CONFIG_CRYPTO_FCRYPT=y
# CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_SALSA20 is not set
# CONFIG_CRYPTO_SALSA20_X86_64 is not set
# CONFIG_CRYPTO_SEED is not set
CONFIG_CRYPTO_SERPENT=y
CONFIG_CRYPTO_SERPENT_SSE2_X86_64=y
CONFIG_CRYPTO_TEA=y
# CONFIG_CRYPTO_TWOFISH is not set
CONFIG_CRYPTO_TWOFISH_COMMON=y
CONFIG_CRYPTO_TWOFISH_X86_64=y
# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set

#
# Compression
#
CONFIG_CRYPTO_DEFLATE=y
# CONFIG_CRYPTO_ZLIB is not set
CONFIG_CRYPTO_LZO=y

#
# Random Number Generation
#
CONFIG_CRYPTO_ANSI_CPRNG=y
CONFIG_CRYPTO_USER_API=y
CONFIG_CRYPTO_USER_API_HASH=y
CONFIG_CRYPTO_USER_API_SKCIPHER=y
CONFIG_CRYPTO_HW=y
CONFIG_CRYPTO_DEV_PADLOCK=y
# CONFIG_CRYPTO_DEV_PADLOCK_AES is not set
# CONFIG_CRYPTO_DEV_PADLOCK_SHA is not set
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_KVM_INTEL=y
# CONFIG_KVM_AMD is not set
# CONFIG_KVM_MMU_AUDIT is not set
CONFIG_VHOST_NET=y
CONFIG_BINARY_PRINTF=y

#
# Library routines
#
CONFIG_BITREVERSE=y
CONFIG_GENERIC_FIND_FIRST_BIT=y
CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_GENERIC_IOMAP=y
CONFIG_CRC_CCITT=y
CONFIG_CRC16=y
CONFIG_CRC_T10DIF=y
CONFIG_CRC_ITU_T=y
CONFIG_CRC32=y
CONFIG_CRC7=y
CONFIG_LIBCRC32C=y
CONFIG_CRC8=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
CONFIG_XZ_DEC_POWERPC=y
CONFIG_XZ_DEC_IA64=y
CONFIG_XZ_DEC_ARM=y
CONFIG_XZ_DEC_ARMTHUMB=y
CONFIG_XZ_DEC_SPARC=y
CONFIG_XZ_DEC_BCJ=y
# CONFIG_XZ_DEC_TEST is not set
CONFIG_DECOMPRESS_GZIP=y
CONFIG_DECOMPRESS_BZIP2=y
CONFIG_DECOMPRESS_LZMA=y
CONFIG_DECOMPRESS_XZ=y
CONFIG_DECOMPRESS_LZO=y
CONFIG_BCH=y
CONFIG_BCH_CONST_PARAMS=y
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=y
CONFIG_TEXTSEARCH_BM=y
CONFIG_TEXTSEARCH_FSM=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
CONFIG_CHECK_SIGNATURE=y
CONFIG_DQL=y
CONFIG_NLATTR=y
CONFIG_AVERAGE=y
# CONFIG_CORDIC is not set
CONFIG_MPILIB=y
CONFIG_MPILIB_EXTRA=y
# CONFIG_DIGSIG is not set

--------------070407000708080709040807
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

--------------070407000708080709040807--


From xen-devel-bounces@lists.xensource.com Wed Dec 21 19:32:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Wed, 21 Dec 2011 19:32:19 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-devel-bounces@lists.xensource.com>)
	id 1RdRtC-0005Py-8X; Wed, 21 Dec 2011 19:31:46 +0000
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <konrad.wilk@oracle.com>) id 1RdRtB-0005Pt-6H
	for xen-devel@lists.xensource.com; Wed, 21 Dec 2011 19:31:45 +0000
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1324495897!7909588!1
X-Originating-IP: [148.87.113.117]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogMTQ4Ljg3LjExMy4xMTcgPT4gNDU0NTUw\n
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12911 invoked from network); 21 Dec 2011 19:31:38 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Dec 2011 19:31:38 -0000
Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	pBLJVOqx020427
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 21 Dec 2011 19:31:24 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	pBLJVMwe003822
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 21 Dec 2011 19:31:23 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	pBLJVMdw022430; Wed, 21 Dec 2011 13:31:22 -0600
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 21 Dec 2011 11:31:22 -0800
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D24AA416F3; Wed, 21 Dec 2011 14:30:21 -0500 (EST)
Date: Wed, 21 Dec 2011 14:30:21 -0500
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Randy Dunlap <rdunlap@xenotime.net>
Message-ID: <20111221193021.GA19671@phenom.dumpdata.com>
References: <20111221174733.9ba0861e762e8d96844b060b@canb.auug.org.au>
	<4EF23D67.9050602@xenotime.net>
MIME-Version: 1.0
Content-Disposition: inline
In-Reply-To: <4EF23D67.9050602@xenotime.net>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090205.4EF23410.0033,ss=1,re=-6.500,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stephen Rothwell <sfr@canb.auug.org.au>,
	linux-next@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>
Subject: Re: [Xen-devel] linux-next: Tree for Dec 21 (xen)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Dec 21, 2011 at 12:11:19PM -0800, Randy Dunlap wrote:
> On 12/20/2011 10:47 PM, Stephen Rothwell wrote:
> > Hi all,
> > 
> > Changes since 20111220:
> 
> 
> drivers/xen/xenbus/xenbus_dev_backend.c:74:2: error: implicit declaration of function 'xen_initial_domain'

Fixed. But I am still not sure what CONFIG_* + header magic is 
is triggering this.

Last time I thought it was the combination of !PCI, !ACPI, and
CONFIG_XEN_XENBUS=m (and the other xen drivers turned to m as well).

But that is not the case here.

Thanks for reporting. Will disect this some more.
> 
> Full randconfig file is attached.
> 
> -- 
> ~Randy
> *** Remember to use Documentation/SubmitChecklist when testing your code ***

> #
> # Automatically generated file; DO NOT EDIT.
> # Linux/x86_64 3.2.0-rc6 Kernel Configuration
> #
> CONFIG_64BIT=y
> # CONFIG_X86_32 is not set
> CONFIG_X86_64=y
> CONFIG_X86=y
> CONFIG_INSTRUCTION_DECODER=y
> CONFIG_OUTPUT_FORMAT="elf64-x86-64"
> CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
> CONFIG_GENERIC_CMOS_UPDATE=y
> CONFIG_CLOCKSOURCE_WATCHDOG=y
> CONFIG_GENERIC_CLOCKEVENTS=y
> CONFIG_ARCH_CLOCKSOURCE_DATA=y
> CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
> CONFIG_LOCKDEP_SUPPORT=y
> CONFIG_STACKTRACE_SUPPORT=y
> CONFIG_HAVE_LATENCYTOP_SUPPORT=y
> CONFIG_MMU=y
> CONFIG_ZONE_DMA=y
> CONFIG_NEED_DMA_MAP_STATE=y
> CONFIG_NEED_SG_DMA_LENGTH=y
> CONFIG_GENERIC_ISA_DMA=y
> CONFIG_GENERIC_BUG=y
> CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
> CONFIG_GENERIC_HWEIGHT=y
> CONFIG_GENERIC_GPIO=y
> CONFIG_ARCH_MAY_HAVE_PC_FDC=y
> # CONFIG_RWSEM_GENERIC_SPINLOCK is not set
> CONFIG_RWSEM_XCHGADD_ALGORITHM=y
> CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
> CONFIG_GENERIC_CALIBRATE_DELAY=y
> CONFIG_GENERIC_TIME_VSYSCALL=y
> CONFIG_ARCH_HAS_CPU_RELAX=y
> CONFIG_ARCH_HAS_DEFAULT_IDLE=y
> CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
> CONFIG_HAVE_SETUP_PER_CPU_AREA=y
> CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
> CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
> CONFIG_ARCH_HIBERNATION_POSSIBLE=y
> CONFIG_ARCH_SUSPEND_POSSIBLE=y
> CONFIG_ZONE_DMA32=y
> CONFIG_AUDIT_ARCH=y
> CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
> CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
> CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11"
> # CONFIG_KTIME_SCALAR is not set
> CONFIG_ARCH_SUPPORTS_UPROBES=y
> CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
> CONFIG_CONSTRUCTORS=y
> CONFIG_HAVE_IRQ_WORK=y
> CONFIG_IRQ_WORK=y
> 
> #
> # General setup
> #
> CONFIG_EXPERIMENTAL=y
> CONFIG_BROKEN_ON_SMP=y
> CONFIG_INIT_ENV_ARG_LIMIT=32
> CONFIG_CROSS_COMPILE=""
> CONFIG_LOCALVERSION=""
> # CONFIG_LOCALVERSION_AUTO is not set
> CONFIG_HAVE_KERNEL_GZIP=y
> CONFIG_HAVE_KERNEL_BZIP2=y
> CONFIG_HAVE_KERNEL_LZMA=y
> CONFIG_HAVE_KERNEL_XZ=y
> CONFIG_HAVE_KERNEL_LZO=y
> # CONFIG_KERNEL_GZIP is not set
> # CONFIG_KERNEL_BZIP2 is not set
> CONFIG_KERNEL_LZMA=y
> # CONFIG_KERNEL_XZ is not set
> # CONFIG_KERNEL_LZO is not set
> CONFIG_DEFAULT_HOSTNAME="(none)"
> CONFIG_SWAP=y
> CONFIG_SYSVIPC=y
> CONFIG_SYSVIPC_SYSCTL=y
> CONFIG_POSIX_MQUEUE=y
> CONFIG_POSIX_MQUEUE_SYSCTL=y
> # CONFIG_BSD_PROCESS_ACCT is not set
> CONFIG_FHANDLE=y
> CONFIG_TASKSTATS=y
> CONFIG_TASK_DELAY_ACCT=y
> CONFIG_TASK_XACCT=y
> CONFIG_TASK_IO_ACCOUNTING=y
> # CONFIG_AUDIT is not set
> CONFIG_HAVE_GENERIC_HARDIRQS=y
> 
> #
> # IRQ subsystem
> #
> CONFIG_GENERIC_HARDIRQS=y
> CONFIG_HAVE_SPARSE_IRQ=y
> CONFIG_GENERIC_IRQ_PROBE=y
> CONFIG_GENERIC_IRQ_SHOW=y
> CONFIG_GENERIC_IRQ_CHIP=y
> CONFIG_IRQ_FORCED_THREADING=y
> CONFIG_SPARSE_IRQ=y
> 
> #
> # RCU Subsystem
> #
> CONFIG_TINY_PREEMPT_RCU=y
> CONFIG_PREEMPT_RCU=y
> CONFIG_RCU_TRACE=y
> # CONFIG_TREE_RCU_TRACE is not set
> # CONFIG_RCU_BOOST is not set
> # CONFIG_IKCONFIG is not set
> CONFIG_LOG_BUF_SHIFT=17
> CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
> CONFIG_CGROUPS=y
> # CONFIG_CGROUP_DEBUG is not set
> CONFIG_CGROUP_FREEZER=y
> # CONFIG_CGROUP_DEVICE is not set
> CONFIG_CPUSETS=y
> # CONFIG_PROC_PID_CPUSET is not set
> # CONFIG_CGROUP_CPUACCT is not set
> CONFIG_RESOURCE_COUNTERS=y
> # CONFIG_CGROUP_MEM_RES_CTLR is not set
> CONFIG_CGROUP_PERF=y
> # CONFIG_CGROUP_SCHED is not set
> CONFIG_BLK_CGROUP=y
> # CONFIG_DEBUG_BLK_CGROUP is not set
> # CONFIG_CHECKPOINT_RESTORE is not set
> CONFIG_NAMESPACES=y
> # CONFIG_UTS_NS is not set
> CONFIG_IPC_NS=y
> # CONFIG_USER_NS is not set
> # CONFIG_PID_NS is not set
> CONFIG_NET_NS=y
> # CONFIG_SCHED_AUTOGROUP is not set
> # CONFIG_SYSFS_DEPRECATED is not set
> CONFIG_RELAY=y
> CONFIG_BLK_DEV_INITRD=y
> CONFIG_INITRAMFS_SOURCE=""
> CONFIG_RD_GZIP=y
> CONFIG_RD_BZIP2=y
> CONFIG_RD_LZMA=y
> CONFIG_RD_XZ=y
> CONFIG_RD_LZO=y
> # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
> CONFIG_SYSCTL=y
> CONFIG_ANON_INODES=y
> # CONFIG_EXPERT is not set
> CONFIG_UID16=y
> # CONFIG_SYSCTL_SYSCALL is not set
> CONFIG_KALLSYMS=y
> CONFIG_KALLSYMS_ALL=y
> CONFIG_HOTPLUG=y
> CONFIG_PRINTK=y
> CONFIG_BUG=y
> CONFIG_ELF_CORE=y
> CONFIG_PCSPKR_PLATFORM=y
> CONFIG_HAVE_PCSPKR_PLATFORM=y
> CONFIG_BASE_FULL=y
> CONFIG_FUTEX=y
> CONFIG_EPOLL=y
> CONFIG_SIGNALFD=y
> CONFIG_TIMERFD=y
> CONFIG_EVENTFD=y
> CONFIG_SHMEM=y
> CONFIG_AIO=y
> # CONFIG_EMBEDDED is not set
> CONFIG_HAVE_PERF_EVENTS=y
> CONFIG_PERF_USE_VMALLOC=y
> 
> #
> # Kernel Performance Events And Counters
> #
> CONFIG_PERF_EVENTS=y
> # CONFIG_PERF_COUNTERS is not set
> CONFIG_DEBUG_PERF_USE_VMALLOC=y
> CONFIG_VM_EVENT_COUNTERS=y
> CONFIG_PCI_QUIRKS=y
> CONFIG_SLUB_DEBUG=y
> CONFIG_COMPAT_BRK=y
> # CONFIG_SLAB is not set
> CONFIG_SLUB=y
> # CONFIG_PROFILING is not set
> CONFIG_TRACEPOINTS=y
> CONFIG_HAVE_OPROFILE=y
> CONFIG_OPROFILE_NMI_TIMER=y
> # CONFIG_JUMP_LABEL is not set
> CONFIG_UPROBES=y
> CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
> CONFIG_USER_RETURN_NOTIFIER=y
> CONFIG_HAVE_IOREMAP_PROT=y
> CONFIG_HAVE_KPROBES=y
> CONFIG_HAVE_KRETPROBES=y
> CONFIG_HAVE_OPTPROBES=y
> CONFIG_HAVE_ARCH_TRACEHOOK=y
> CONFIG_HAVE_DMA_ATTRS=y
> CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
> CONFIG_HAVE_DMA_API_DEBUG=y
> CONFIG_HAVE_HW_BREAKPOINT=y
> CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
> CONFIG_HAVE_USER_RETURN_NOTIFIER=y
> CONFIG_HAVE_PERF_EVENTS_NMI=y
> CONFIG_HAVE_ARCH_JUMP_LABEL=y
> CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
> CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
> CONFIG_HAVE_CMPXCHG_LOCAL=y
> CONFIG_HAVE_CMPXCHG_DOUBLE=y
> 
> #
> # GCOV-based kernel profiling
> #
> CONFIG_GCOV_KERNEL=y
> # CONFIG_GCOV_PROFILE_ALL is not set
> # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
> CONFIG_SLABINFO=y
> CONFIG_RT_MUTEXES=y
> CONFIG_BASE_SMALL=0
> # CONFIG_MODULES is not set
> CONFIG_BLOCK=y
> CONFIG_BLK_DEV_BSG=y
> CONFIG_BLK_DEV_BSGLIB=y
> # CONFIG_BLK_DEV_INTEGRITY is not set
> # CONFIG_BLK_DEV_THROTTLING is not set
> CONFIG_BLOCK_COMPAT=y
> 
> #
> # IO Schedulers
> #
> CONFIG_IOSCHED_NOOP=y
> CONFIG_IOSCHED_DEADLINE=y
> # CONFIG_IOSCHED_CFQ is not set
> # CONFIG_DEFAULT_DEADLINE is not set
> CONFIG_DEFAULT_NOOP=y
> CONFIG_DEFAULT_IOSCHED="noop"
> CONFIG_PREEMPT_NOTIFIERS=y
> # CONFIG_INLINE_SPIN_TRYLOCK is not set
> # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
> # CONFIG_INLINE_SPIN_LOCK is not set
> # CONFIG_INLINE_SPIN_LOCK_BH is not set
> # CONFIG_INLINE_SPIN_LOCK_IRQ is not set
> # CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
> # CONFIG_INLINE_SPIN_UNLOCK is not set
> # CONFIG_INLINE_SPIN_UNLOCK_BH is not set
> # CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
> # CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
> # CONFIG_INLINE_READ_TRYLOCK is not set
> # CONFIG_INLINE_READ_LOCK is not set
> # CONFIG_INLINE_READ_LOCK_BH is not set
> # CONFIG_INLINE_READ_LOCK_IRQ is not set
> # CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
> # CONFIG_INLINE_READ_UNLOCK is not set
> # CONFIG_INLINE_READ_UNLOCK_BH is not set
> # CONFIG_INLINE_READ_UNLOCK_IRQ is not set
> # CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
> # CONFIG_INLINE_WRITE_TRYLOCK is not set
> # CONFIG_INLINE_WRITE_LOCK is not set
> # CONFIG_INLINE_WRITE_LOCK_BH is not set
> # CONFIG_INLINE_WRITE_LOCK_IRQ is not set
> # CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
> # CONFIG_INLINE_WRITE_UNLOCK is not set
> # CONFIG_INLINE_WRITE_UNLOCK_BH is not set
> # CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
> # CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
> # CONFIG_MUTEX_SPIN_ON_OWNER is not set
> CONFIG_FREEZER=y
> 
> #
> # Processor type and features
> #
> CONFIG_TICK_ONESHOT=y
> CONFIG_NO_HZ=y
> CONFIG_HIGH_RES_TIMERS=y
> CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
> CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
> # CONFIG_SMP is not set
> CONFIG_X86_MPPARSE=y
> CONFIG_X86_EXTENDED_PLATFORM=y
> CONFIG_X86_VSMP=y
> # CONFIG_SCHED_OMIT_FRAME_POINTER is not set
> # CONFIG_KVMTOOL_TEST_ENABLE is not set
> CONFIG_PARAVIRT_GUEST=y
> # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
> CONFIG_XEN=y
> CONFIG_XEN_DOM0=y
> CONFIG_XEN_PRIVILEGED_GUEST=y
> CONFIG_XEN_PVHVM=y
> CONFIG_XEN_MAX_DOMAIN_MEMORY=500
> CONFIG_XEN_SAVE_RESTORE=y
> # CONFIG_XEN_DEBUG_FS is not set
> # CONFIG_KVM_CLOCK is not set
> # CONFIG_KVM_GUEST is not set
> CONFIG_PARAVIRT=y
> CONFIG_PARAVIRT_CLOCK=y
> CONFIG_PARAVIRT_DEBUG=y
> CONFIG_NO_BOOTMEM=y
> CONFIG_MEMTEST=y
> # CONFIG_MK8 is not set
> # CONFIG_MPSC is not set
> # CONFIG_MCORE2 is not set
> # CONFIG_MATOM is not set
> CONFIG_GENERIC_CPU=y
> CONFIG_X86_INTERNODE_CACHE_SHIFT=12
> CONFIG_X86_CMPXCHG=y
> CONFIG_X86_L1_CACHE_SHIFT=6
> CONFIG_X86_XADD=y
> CONFIG_X86_WP_WORKS_OK=y
> CONFIG_X86_TSC=y
> CONFIG_X86_CMPXCHG64=y
> CONFIG_X86_CMOV=y
> CONFIG_X86_MINIMUM_CPU_FAMILY=64
> CONFIG_X86_DEBUGCTLMSR=y
> CONFIG_CPU_SUP_INTEL=y
> CONFIG_CPU_SUP_AMD=y
> CONFIG_CPU_SUP_CENTAUR=y
> CONFIG_HPET_TIMER=y
> CONFIG_HPET_EMULATE_RTC=y
> CONFIG_DMI=y
> CONFIG_GART_IOMMU=y
> CONFIG_CALGARY_IOMMU=y
> # CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT is not set
> CONFIG_SWIOTLB=y
> CONFIG_IOMMU_HELPER=y
> CONFIG_NR_CPUS=1
> # CONFIG_IRQ_TIME_ACCOUNTING is not set
> # CONFIG_PREEMPT_NONE is not set
> # CONFIG_PREEMPT_VOLUNTARY is not set
> CONFIG_PREEMPT=y
> CONFIG_PREEMPT_COUNT=y
> CONFIG_X86_LOCAL_APIC=y
> CONFIG_X86_IO_APIC=y
> CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
> # CONFIG_X86_MCE is not set
> # CONFIG_I8K is not set
> # CONFIG_MICROCODE is not set
> CONFIG_X86_MSR=y
> # CONFIG_X86_CPUID is not set
> CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
> CONFIG_ARCH_DMA_ADDR_T_64BIT=y
> CONFIG_DIRECT_GBPAGES=y
> CONFIG_ARCH_SPARSEMEM_ENABLE=y
> CONFIG_ARCH_SPARSEMEM_DEFAULT=y
> CONFIG_ARCH_SELECT_MEMORY_MODEL=y
> CONFIG_ARCH_PROC_KCORE_TEXT=y
> CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
> CONFIG_SELECT_MEMORY_MODEL=y
> CONFIG_SPARSEMEM_MANUAL=y
> CONFIG_SPARSEMEM=y
> CONFIG_HAVE_MEMORY_PRESENT=y
> CONFIG_SPARSEMEM_EXTREME=y
> CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
> CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
> CONFIG_SPARSEMEM_VMEMMAP=y
> CONFIG_HAVE_MEMBLOCK=y
> CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
> CONFIG_ARCH_DISCARD_MEMBLOCK=y
> # CONFIG_MEMORY_HOTPLUG is not set
> CONFIG_PAGEFLAGS_EXTENDED=y
> CONFIG_SPLIT_PTLOCK_CPUS=999999
> CONFIG_COMPACTION=y
> CONFIG_MIGRATION=y
> CONFIG_PHYS_ADDR_T_64BIT=y
> CONFIG_ZONE_DMA_FLAG=1
> CONFIG_BOUNCE=y
> CONFIG_VIRT_TO_BUS=y
> CONFIG_MMU_NOTIFIER=y
> CONFIG_KSM=y
> CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
> CONFIG_TRANSPARENT_HUGEPAGE=y
> # CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set
> CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
> CONFIG_NEED_PER_CPU_KM=y
> CONFIG_CLEANCACHE=y
> CONFIG_FRONTSWAP=y
> CONFIG_X86_CHECK_BIOS_CORRUPTION=y
> CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
> CONFIG_X86_RESERVE_LOW=64
> CONFIG_MTRR=y
> CONFIG_MTRR_SANITIZER=y
> CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0
> CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
> CONFIG_X86_PAT=y
> CONFIG_ARCH_USES_PG_UNCACHED=y
> CONFIG_ARCH_RANDOM=y
> CONFIG_EFI=y
> CONFIG_EFI_STUB=y
> CONFIG_SECCOMP=y
> # CONFIG_CC_STACKPROTECTOR is not set
> # CONFIG_HZ_100 is not set
> CONFIG_HZ_250=y
> # CONFIG_HZ_300 is not set
> # CONFIG_HZ_1000 is not set
> CONFIG_HZ=250
> CONFIG_SCHED_HRTICK=y
> # CONFIG_KEXEC is not set
> # CONFIG_CRASH_DUMP is not set
> CONFIG_PHYSICAL_START=0x1000000
> CONFIG_RELOCATABLE=y
> CONFIG_PHYSICAL_ALIGN=0x1000000
> CONFIG_COMPAT_VDSO=y
> CONFIG_CMDLINE_BOOL=y
> CONFIG_CMDLINE=""
> # CONFIG_CMDLINE_OVERRIDE is not set
> CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
> 
> #
> # Power management and ACPI options
> #
> CONFIG_ARCH_HIBERNATION_HEADER=y
> # CONFIG_SUSPEND is not set
> CONFIG_HIBERNATE_CALLBACKS=y
> CONFIG_HIBERNATION=y
> CONFIG_PM_STD_PARTITION=""
> CONFIG_PM_SLEEP=y
> # CONFIG_PM_RUNTIME is not set
> CONFIG_PM=y
> CONFIG_PM_DEBUG=y
> # CONFIG_PM_ADVANCED_DEBUG is not set
> CONFIG_CAN_PM_TRACE=y
> # CONFIG_PM_TRACE_RTC is not set
> CONFIG_ACPI=y
> CONFIG_ACPI_SLEEP=y
> CONFIG_ACPI_PROCFS=y
> # CONFIG_ACPI_PROCFS_POWER is not set
> # CONFIG_ACPI_EC_DEBUGFS is not set
> CONFIG_ACPI_PROC_EVENT=y
> # CONFIG_ACPI_AC is not set
> CONFIG_ACPI_BATTERY=y
> CONFIG_ACPI_BUTTON=y
> CONFIG_ACPI_VIDEO=y
> CONFIG_ACPI_FAN=y
> CONFIG_ACPI_DOCK=y
> CONFIG_ACPI_PROCESSOR=y
> CONFIG_ACPI_PROCESSOR_AGGREGATOR=y
> # CONFIG_ACPI_THERMAL is not set
> # CONFIG_ACPI_CUSTOM_DSDT is not set
> CONFIG_ACPI_BLACKLIST_YEAR=0
> # CONFIG_ACPI_DEBUG is not set
> # CONFIG_ACPI_PCI_SLOT is not set
> CONFIG_X86_PM_TIMER=y
> # CONFIG_ACPI_CONTAINER is not set
> CONFIG_ACPI_SBS=y
> CONFIG_ACPI_HED=y
> CONFIG_ACPI_CUSTOM_METHOD=y
> CONFIG_ACPI_APEI=y
> # CONFIG_ACPI_APEI_GHES is not set
> # CONFIG_ACPI_APEI_PCIEAER is not set
> CONFIG_ACPI_APEI_EINJ=y
> # CONFIG_ACPI_APEI_ERST_DEBUG is not set
> # CONFIG_SFI is not set
> 
> #
> # CPU Frequency scaling
> #
> # CONFIG_CPU_FREQ is not set
> CONFIG_CPU_IDLE=y
> CONFIG_CPU_IDLE_GOV_LADDER=y
> CONFIG_CPU_IDLE_GOV_MENU=y
> # CONFIG_INTEL_IDLE is not set
> 
> #
> # Memory power savings
> #
> # CONFIG_I7300_IDLE is not set
> 
> #
> # Bus options (PCI etc.)
> #
> CONFIG_PCI=y
> CONFIG_PCI_DIRECT=y
> CONFIG_PCI_MMCONFIG=y
> CONFIG_PCI_XEN=y
> CONFIG_PCI_DOMAINS=y
> # CONFIG_PCI_CNB20LE_QUIRK is not set
> CONFIG_PCIEPORTBUS=y
> # CONFIG_HOTPLUG_PCI_PCIE is not set
> CONFIG_PCIEAER=y
> CONFIG_PCIE_ECRC=y
> # CONFIG_PCIEAER_INJECT is not set
> CONFIG_PCIEASPM=y
> CONFIG_PCIEASPM_DEBUG=y
> CONFIG_ARCH_SUPPORTS_MSI=y
> # CONFIG_PCI_MSI is not set
> # CONFIG_PCI_DEBUG is not set
> # CONFIG_PCI_STUB is not set
> CONFIG_XEN_PCIDEV_FRONTEND=y
> # CONFIG_HT_IRQ is not set
> CONFIG_PCI_ATS=y
> CONFIG_PCI_IOV=y
> # CONFIG_PCI_PRI is not set
> # CONFIG_PCI_PASID is not set
> CONFIG_PCI_IOAPIC=y
> CONFIG_PCI_LABEL=y
> CONFIG_ISA_DMA_API=y
> CONFIG_AMD_NB=y
> CONFIG_PCCARD=y
> # CONFIG_PCMCIA is not set
> CONFIG_CARDBUS=y
> 
> #
> # PC-card bridges
> #
> CONFIG_YENTA=y
> CONFIG_YENTA_O2=y
> CONFIG_YENTA_RICOH=y
> CONFIG_YENTA_TI=y
> CONFIG_YENTA_ENE_TUNE=y
> CONFIG_YENTA_TOSHIBA=y
> CONFIG_HOTPLUG_PCI=y
> # CONFIG_HOTPLUG_PCI_FAKE is not set
> # CONFIG_HOTPLUG_PCI_ACPI is not set
> # CONFIG_HOTPLUG_PCI_CPCI is not set
> # CONFIG_HOTPLUG_PCI_SHPC is not set
> CONFIG_RAPIDIO=y
> # CONFIG_RAPIDIO_TSI721 is not set
> CONFIG_RAPIDIO_DISC_TIMEOUT=30
> # CONFIG_RAPIDIO_ENABLE_RX_TX_PORTS is not set
> CONFIG_RAPIDIO_DEBUG=y
> # CONFIG_RAPIDIO_TSI57X is not set
> # CONFIG_RAPIDIO_CPS_XX is not set
> CONFIG_RAPIDIO_TSI568=y
> # CONFIG_RAPIDIO_CPS_GEN2 is not set
> # CONFIG_RAPIDIO_TSI500 is not set
> 
> #
> # Executable file formats / Emulations
> #
> # CONFIG_BINFMT_ELF is not set
> CONFIG_COMPAT_BINFMT_ELF=y
> CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
> # CONFIG_HAVE_AOUT is not set
> # CONFIG_BINFMT_MISC is not set
> CONFIG_IA32_EMULATION=y
> # CONFIG_IA32_AOUT is not set
> CONFIG_COMPAT=y
> CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
> CONFIG_SYSVIPC_COMPAT=y
> CONFIG_KEYS_COMPAT=y
> CONFIG_HAVE_TEXT_POKE_SMP=y
> CONFIG_NET=y
> CONFIG_COMPAT_NETLINK_MESSAGES=y
> 
> #
> # Networking options
> #
> # CONFIG_PACKET is not set
> CONFIG_UNIX=y
> # CONFIG_UNIX_DIAG is not set
> CONFIG_XFRM=y
> CONFIG_XFRM_SUB_POLICY=y
> CONFIG_XFRM_MIGRATE=y
> CONFIG_NET_KEY=y
> CONFIG_NET_KEY_MIGRATE=y
> # CONFIG_INET is not set
> CONFIG_NETWORK_SECMARK=y
> # CONFIG_NETWORK_PHY_TIMESTAMPING is not set
> CONFIG_NETFILTER=y
> CONFIG_NETFILTER_DEBUG=y
> # CONFIG_NETFILTER_ADVANCED is not set
> CONFIG_ATM=y
> CONFIG_ATM_LANE=y
> # CONFIG_BRIDGE is not set
> CONFIG_NET_DSA=y
> CONFIG_NET_DSA_TAG_DSA=y
> CONFIG_NET_DSA_TAG_EDSA=y
> CONFIG_NET_DSA_TAG_TRAILER=y
> # CONFIG_VLAN_8021Q is not set
> # CONFIG_DECNET is not set
> CONFIG_LLC=y
> CONFIG_LLC2=y
> CONFIG_IPX=y
> CONFIG_IPX_INTERN=y
> # CONFIG_ATALK is not set
> CONFIG_X25=y
> # CONFIG_LAPB is not set
> # CONFIG_WAN_ROUTER is not set
> CONFIG_PHONET=y
> # CONFIG_IEEE802154 is not set
> CONFIG_NET_SCHED=y
> 
> #
> # Queueing/Scheduling
> #
> # CONFIG_NET_SCH_CBQ is not set
> CONFIG_NET_SCH_HTB=y
> CONFIG_NET_SCH_HFSC=y
> CONFIG_NET_SCH_ATM=y
> # CONFIG_NET_SCH_PRIO is not set
> # CONFIG_NET_SCH_MULTIQ is not set
> CONFIG_NET_SCH_RED=y
> CONFIG_NET_SCH_SFB=y
> CONFIG_NET_SCH_SFQ=y
> # CONFIG_NET_SCH_TEQL is not set
> CONFIG_NET_SCH_TBF=y
> # CONFIG_NET_SCH_GRED is not set
> # CONFIG_NET_SCH_DSMARK is not set
> # CONFIG_NET_SCH_NETEM is not set
> CONFIG_NET_SCH_DRR=y
> # CONFIG_NET_SCH_MQPRIO is not set
> # CONFIG_NET_SCH_CHOKE is not set
> CONFIG_NET_SCH_QFQ=y
> 
> #
> # Classification
> #
> CONFIG_NET_CLS=y
> # CONFIG_NET_CLS_BASIC is not set
> # CONFIG_NET_CLS_TCINDEX is not set
> CONFIG_NET_CLS_FW=y
> # CONFIG_NET_CLS_U32 is not set
> # CONFIG_NET_CLS_RSVP is not set
> # CONFIG_NET_CLS_RSVP6 is not set
> CONFIG_NET_CLS_FLOW=y
> CONFIG_NET_CLS_CGROUP=y
> CONFIG_NET_EMATCH=y
> CONFIG_NET_EMATCH_STACK=32
> # CONFIG_NET_EMATCH_CMP is not set
> CONFIG_NET_EMATCH_NBYTE=y
> # CONFIG_NET_EMATCH_U32 is not set
> CONFIG_NET_EMATCH_META=y
> CONFIG_NET_EMATCH_TEXT=y
> # CONFIG_NET_CLS_ACT is not set
> CONFIG_NET_CLS_IND=y
> CONFIG_NET_SCH_FIFO=y
> # CONFIG_DCB is not set
> # CONFIG_DNS_RESOLVER is not set
> # CONFIG_BATMAN_ADV is not set
> CONFIG_OPENVSWITCH=y
> CONFIG_NETPRIO_CGROUP=y
> CONFIG_BQL=y
> CONFIG_HAVE_BPF_JIT=y
> 
> #
> # Network testing
> #
> CONFIG_NET_PKTGEN=y
> # CONFIG_HAMRADIO is not set
> # CONFIG_CAN is not set
> CONFIG_IRDA=y
> 
> #
> # IrDA protocols
> #
> CONFIG_IRLAN=y
> # CONFIG_IRCOMM is not set
> CONFIG_IRDA_ULTRA=y
> 
> #
> # IrDA options
> #
> # CONFIG_IRDA_CACHE_LAST_LSAP is not set
> # CONFIG_IRDA_FAST_RR is not set
> CONFIG_IRDA_DEBUG=y
> 
> #
> # Infrared-port device drivers
> #
> 
> #
> # SIR device drivers
> #
> # CONFIG_IRTTY_SIR is not set
> 
> #
> # Dongle support
> #
> 
> #
> # FIR device drivers
> #
> # CONFIG_NSC_FIR is not set
> # CONFIG_WINBOND_FIR is not set
> CONFIG_SMC_IRCC_FIR=y
> CONFIG_ALI_FIR=y
> CONFIG_VLSI_FIR=y
> # CONFIG_VIA_FIR is not set
> # CONFIG_BT is not set
> CONFIG_WIRELESS=y
> CONFIG_WIRELESS_EXT=y
> CONFIG_WEXT_CORE=y
> CONFIG_WEXT_PROC=y
> CONFIG_WEXT_SPY=y
> CONFIG_WEXT_PRIV=y
> # CONFIG_CFG80211 is not set
> CONFIG_WIRELESS_EXT_SYSFS=y
> # CONFIG_LIB80211 is not set
> 
> #
> # CFG80211 needs to be enabled for MAC80211
> #
> CONFIG_WIMAX=y
> CONFIG_WIMAX_DEBUG_LEVEL=8
> # CONFIG_RFKILL is not set
> CONFIG_RFKILL_REGULATOR=y
> CONFIG_NET_9P=y
> # CONFIG_NET_9P_VIRTIO is not set
> CONFIG_NET_9P_DEBUG=y
> # CONFIG_CAIF is not set
> # CONFIG_NFC is not set
> 
> #
> # Device Drivers
> #
> 
> #
> # Generic Driver Options
> #
> CONFIG_UEVENT_HELPER_PATH=""
> # CONFIG_DEVTMPFS is not set
> CONFIG_STANDALONE=y
> CONFIG_PREVENT_FIRMWARE_BUILD=y
> CONFIG_FW_LOADER=y
> CONFIG_FIRMWARE_IN_KERNEL=y
> CONFIG_EXTRA_FIRMWARE=""
> # CONFIG_DEBUG_DRIVER is not set
> # CONFIG_DEBUG_DEVRES is not set
> CONFIG_SYS_HYPERVISOR=y
> CONFIG_REGMAP=y
> CONFIG_REGMAP_I2C=y
> CONFIG_REGMAP_SPI=y
> CONFIG_REGMAP_IRQ=y
> CONFIG_CONNECTOR=y
> # CONFIG_PROC_EVENTS is not set
> CONFIG_MTD=y
> # CONFIG_MTD_REDBOOT_PARTS is not set
> CONFIG_MTD_CMDLINE_PARTS=y
> # CONFIG_MTD_AR7_PARTS is not set
> 
> #
> # User Modules And Translation Layers
> #
> # CONFIG_MTD_CHAR is not set
> CONFIG_HAVE_MTD_OTP=y
> CONFIG_MTD_BLKDEVS=y
> CONFIG_MTD_BLOCK=y
> CONFIG_FTL=y
> CONFIG_NFTL=y
> # CONFIG_NFTL_RW is not set
> CONFIG_INFTL=y
> CONFIG_RFD_FTL=y
> CONFIG_SSFDC=y
> # CONFIG_SM_FTL is not set
> CONFIG_MTD_OOPS=y
> CONFIG_MTD_SWAP=y
> 
> #
> # RAM/ROM/Flash chip drivers
> #
> CONFIG_MTD_CFI=y
> CONFIG_MTD_JEDECPROBE=y
> CONFIG_MTD_GEN_PROBE=y
> CONFIG_MTD_CFI_ADV_OPTIONS=y
> # CONFIG_MTD_CFI_NOSWAP is not set
> CONFIG_MTD_CFI_BE_BYTE_SWAP=y
> # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
> CONFIG_MTD_CFI_GEOMETRY=y
> # CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
> CONFIG_MTD_MAP_BANK_WIDTH_2=y
> # CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
> # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
> CONFIG_MTD_MAP_BANK_WIDTH_16=y
> # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
> CONFIG_MTD_CFI_I1=y
> CONFIG_MTD_CFI_I2=y
> CONFIG_MTD_CFI_I4=y
> # CONFIG_MTD_CFI_I8 is not set
> CONFIG_MTD_OTP=y
> CONFIG_MTD_CFI_INTELEXT=y
> CONFIG_MTD_CFI_AMDSTD=y
> # CONFIG_MTD_CFI_STAA is not set
> CONFIG_MTD_CFI_UTIL=y
> CONFIG_MTD_RAM=y
> CONFIG_MTD_ROM=y
> CONFIG_MTD_ABSENT=y
> 
> #
> # Mapping drivers for chip access
> #
> CONFIG_MTD_COMPLEX_MAPPINGS=y
> # CONFIG_MTD_PHYSMAP is not set
> CONFIG_MTD_SC520CDP=y
> # CONFIG_MTD_NETSC520 is not set
> CONFIG_MTD_TS5500=y
> CONFIG_MTD_SBC_GXX=y
> # CONFIG_MTD_AMD76XROM is not set
> CONFIG_MTD_ICHXROM=y
> # CONFIG_MTD_ESB2ROM is not set
> CONFIG_MTD_CK804XROM=y
> CONFIG_MTD_SCB2_FLASH=y
> # CONFIG_MTD_NETtel is not set
> CONFIG_MTD_L440GX=y
> # CONFIG_MTD_PCI is not set
> CONFIG_MTD_GPIO_ADDR=y
> # CONFIG_MTD_INTEL_VR_NOR is not set
> CONFIG_MTD_PLATRAM=y
> CONFIG_MTD_LATCH_ADDR=y
> 
> #
> # Self-contained MTD device drivers
> #
> # CONFIG_MTD_PMC551 is not set
> CONFIG_MTD_DATAFLASH=y
> # CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
> # CONFIG_MTD_DATAFLASH_OTP is not set
> # CONFIG_MTD_M25P80 is not set
> # CONFIG_MTD_SST25L is not set
> CONFIG_MTD_SLRAM=y
> # CONFIG_MTD_PHRAM is not set
> # CONFIG_MTD_MTDRAM is not set
> # CONFIG_MTD_BLOCK2MTD is not set
> 
> #
> # Disk-On-Chip Device Drivers
> #
> CONFIG_MTD_DOC2000=y
> CONFIG_MTD_DOC2001=y
> CONFIG_MTD_DOC2001PLUS=y
> CONFIG_MTD_DOCG3=y
> CONFIG_BCH_CONST_M=14
> CONFIG_BCH_CONST_T=4
> CONFIG_MTD_DOCPROBE=y
> CONFIG_MTD_DOCECC=y
> # CONFIG_MTD_DOCPROBE_ADVANCED is not set
> CONFIG_MTD_DOCPROBE_ADDRESS=0x0
> CONFIG_MTD_NAND_ECC=y
> # CONFIG_MTD_NAND_ECC_SMC is not set
> CONFIG_MTD_NAND=y
> CONFIG_MTD_NAND_VERIFY_WRITE=y
> CONFIG_MTD_NAND_BCH=y
> CONFIG_MTD_NAND_ECC_BCH=y
> # CONFIG_MTD_SM_COMMON is not set
> # CONFIG_MTD_NAND_MUSEUM_IDS is not set
> CONFIG_MTD_NAND_DENALI=y
> CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xFF108018
> CONFIG_MTD_NAND_IDS=y
> # CONFIG_MTD_NAND_RICOH is not set
> # CONFIG_MTD_NAND_DISKONCHIP is not set
> # CONFIG_MTD_NAND_CAFE is not set
> CONFIG_MTD_NAND_NANDSIM=y
> CONFIG_MTD_NAND_PLATFORM=y
> CONFIG_MTD_ONENAND=y
> # CONFIG_MTD_ONENAND_VERIFY_WRITE is not set
> CONFIG_MTD_ONENAND_GENERIC=y
> CONFIG_MTD_ONENAND_OTP=y
> CONFIG_MTD_ONENAND_2X_PROGRAM=y
> # CONFIG_MTD_ONENAND_SIM is not set
> 
> #
> # LPDDR flash memory drivers
> #
> CONFIG_MTD_LPDDR=y
> CONFIG_MTD_QINFO_PROBE=y
> CONFIG_MTD_UBI=y
> CONFIG_MTD_UBI_WL_THRESHOLD=4096
> CONFIG_MTD_UBI_BEB_RESERVE=1
> CONFIG_MTD_UBI_GLUEBI=y
> # CONFIG_MTD_UBI_DEBUG is not set
> # CONFIG_PARPORT is not set
> CONFIG_PNP=y
> # CONFIG_PNP_DEBUG_MESSAGES is not set
> 
> #
> # Protocols
> #
> CONFIG_PNPACPI=y
> CONFIG_BLK_DEV=y
> # CONFIG_BLK_DEV_FD is not set
> # CONFIG_BLK_CPQ_DA is not set
> # CONFIG_BLK_CPQ_CISS_DA is not set
> # CONFIG_BLK_DEV_DAC960 is not set
> CONFIG_BLK_DEV_UMEM=y
> # CONFIG_BLK_DEV_COW_COMMON is not set
> # CONFIG_BLK_DEV_LOOP is not set
> 
> #
> # DRBD disabled because PROC_FS, INET or CONNECTOR not selected
> #
> CONFIG_BLK_DEV_NBD=y
> CONFIG_BLK_DEV_OSD=y
> CONFIG_BLK_DEV_SX8=y
> # CONFIG_BLK_DEV_RAM is not set
> CONFIG_CDROM_PKTCDVD=y
> CONFIG_CDROM_PKTCDVD_BUFFERS=8
> CONFIG_CDROM_PKTCDVD_WCACHE=y
> # CONFIG_ATA_OVER_ETH is not set
> CONFIG_XEN_BLKDEV_FRONTEND=y
> # CONFIG_XEN_BLKDEV_BACKEND is not set
> # CONFIG_VIRTIO_BLK is not set
> CONFIG_BLK_DEV_HD=y
> # CONFIG_SENSORS_LIS3LV02D is not set
> # CONFIG_MISC_DEVICES is not set
> CONFIG_HAVE_IDE=y
> CONFIG_IDE=y
> 
> #
> # Please see Documentation/ide/ide.txt for help/info on IDE drives
> #
> CONFIG_IDE_XFER_MODE=y
> CONFIG_IDE_TIMINGS=y
> CONFIG_BLK_DEV_IDE_SATA=y
> # CONFIG_IDE_GD is not set
> CONFIG_BLK_DEV_DELKIN=y
> # CONFIG_BLK_DEV_IDECD is not set
> # CONFIG_BLK_DEV_IDETAPE is not set
> CONFIG_BLK_DEV_IDEACPI=y
> # CONFIG_IDE_TASK_IOCTL is not set
> # CONFIG_IDE_PROC_FS is not set
> 
> #
> # IDE chipset support/bugfixes
> #
> # CONFIG_IDE_GENERIC is not set
> # CONFIG_BLK_DEV_PLATFORM is not set
> # CONFIG_BLK_DEV_CMD640 is not set
> # CONFIG_BLK_DEV_IDEPNP is not set
> CONFIG_BLK_DEV_IDEDMA_SFF=y
> 
> #
> # PCI IDE chipsets support
> #
> CONFIG_BLK_DEV_IDEPCI=y
> CONFIG_IDEPCI_PCIBUS_ORDER=y
> # CONFIG_BLK_DEV_OFFBOARD is not set
> # CONFIG_BLK_DEV_GENERIC is not set
> # CONFIG_BLK_DEV_OPTI621 is not set
> # CONFIG_BLK_DEV_RZ1000 is not set
> CONFIG_BLK_DEV_IDEDMA_PCI=y
> CONFIG_BLK_DEV_AEC62XX=y
> # CONFIG_BLK_DEV_ALI15X3 is not set
> # CONFIG_BLK_DEV_AMD74XX is not set
> CONFIG_BLK_DEV_ATIIXP=y
> CONFIG_BLK_DEV_CMD64X=y
> CONFIG_BLK_DEV_TRIFLEX=y
> # CONFIG_BLK_DEV_CS5520 is not set
> CONFIG_BLK_DEV_CS5530=y
> CONFIG_BLK_DEV_HPT366=y
> # CONFIG_BLK_DEV_JMICRON is not set
> # CONFIG_BLK_DEV_SC1200 is not set
> # CONFIG_BLK_DEV_PIIX is not set
> CONFIG_BLK_DEV_IT8172=y
> CONFIG_BLK_DEV_IT8213=y
> # CONFIG_BLK_DEV_IT821X is not set
> # CONFIG_BLK_DEV_NS87415 is not set
> # CONFIG_BLK_DEV_PDC202XX_OLD is not set
> CONFIG_BLK_DEV_PDC202XX_NEW=y
> CONFIG_BLK_DEV_SVWKS=y
> # CONFIG_BLK_DEV_SIIMAGE is not set
> # CONFIG_BLK_DEV_SIS5513 is not set
> # CONFIG_BLK_DEV_SLC90E66 is not set
> # CONFIG_BLK_DEV_TRM290 is not set
> # CONFIG_BLK_DEV_VIA82CXXX is not set
> # CONFIG_BLK_DEV_TC86C001 is not set
> CONFIG_BLK_DEV_IDEDMA=y
> 
> #
> # SCSI device support
> #
> CONFIG_SCSI_MOD=y
> CONFIG_RAID_ATTRS=y
> CONFIG_SCSI=y
> CONFIG_SCSI_DMA=y
> # CONFIG_SCSI_TGT is not set
> CONFIG_SCSI_NETLINK=y
> # CONFIG_SCSI_PROC_FS is not set
> 
> #
> # SCSI support type (disk, tape, CD-ROM)
> #
> # CONFIG_BLK_DEV_SD is not set
> # CONFIG_CHR_DEV_ST is not set
> # CONFIG_CHR_DEV_OSST is not set
> # CONFIG_BLK_DEV_SR is not set
> CONFIG_CHR_DEV_SG=y
> # CONFIG_CHR_DEV_SCH is not set
> # CONFIG_SCSI_MULTI_LUN is not set
> # CONFIG_SCSI_CONSTANTS is not set
> # CONFIG_SCSI_LOGGING is not set
> # CONFIG_SCSI_SCAN_ASYNC is not set
> 
> #
> # SCSI Transports
> #
> CONFIG_SCSI_SPI_ATTRS=y
> CONFIG_SCSI_FC_ATTRS=y
> CONFIG_SCSI_ISCSI_ATTRS=y
> CONFIG_SCSI_SAS_ATTRS=y
> CONFIG_SCSI_SAS_LIBSAS=y
> CONFIG_SCSI_SAS_HOST_SMP=y
> CONFIG_SCSI_SRP_ATTRS=y
> CONFIG_SCSI_LOWLEVEL=y
> CONFIG_ISCSI_BOOT_SYSFS=y
> # CONFIG_SCSI_BNX2_ISCSI is not set
> CONFIG_SCSI_BNX2X_FCOE=y
> CONFIG_BE2ISCSI=y
> # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
> CONFIG_SCSI_HPSA=y
> CONFIG_SCSI_3W_9XXX=y
> CONFIG_SCSI_3W_SAS=y
> # CONFIG_SCSI_ACARD is not set
> CONFIG_SCSI_AACRAID=y
> # CONFIG_SCSI_AIC7XXX is not set
> CONFIG_SCSI_AIC7XXX_OLD=y
> CONFIG_SCSI_AIC79XX=y
> CONFIG_AIC79XX_CMDS_PER_DEVICE=32
> CONFIG_AIC79XX_RESET_DELAY_MS=5000
> CONFIG_AIC79XX_DEBUG_ENABLE=y
> CONFIG_AIC79XX_DEBUG_MASK=0
> CONFIG_AIC79XX_REG_PRETTY_PRINT=y
> CONFIG_SCSI_AIC94XX=y
> CONFIG_AIC94XX_DEBUG=y
> CONFIG_SCSI_MVSAS=y
> # CONFIG_SCSI_MVSAS_DEBUG is not set
> CONFIG_SCSI_MVSAS_TASKLET=y
> CONFIG_SCSI_MVUMI=y
> CONFIG_SCSI_DPT_I2O=y
> CONFIG_SCSI_ADVANSYS=y
> CONFIG_SCSI_ARCMSR=y
> CONFIG_MEGARAID_NEWGEN=y
> CONFIG_MEGARAID_MM=y
> # CONFIG_MEGARAID_MAILBOX is not set
> # CONFIG_MEGARAID_LEGACY is not set
> # CONFIG_MEGARAID_SAS is not set
> CONFIG_SCSI_MPT2SAS=y
> CONFIG_SCSI_MPT2SAS_MAX_SGE=128
> CONFIG_SCSI_MPT2SAS_LOGGING=y
> # CONFIG_SCSI_HPTIOP is not set
> # CONFIG_SCSI_BUSLOGIC is not set
> # CONFIG_VMWARE_PVSCSI is not set
> CONFIG_LIBFC=y
> CONFIG_LIBFCOE=y
> CONFIG_FCOE=y
> CONFIG_FCOE_FNIC=y
> # CONFIG_SCSI_DMX3191D is not set
> CONFIG_SCSI_EATA=y
> # CONFIG_SCSI_EATA_TAGGED_QUEUE is not set
> CONFIG_SCSI_EATA_LINKED_COMMANDS=y
> CONFIG_SCSI_EATA_MAX_TAGS=16
> CONFIG_SCSI_FUTURE_DOMAIN=y
> # CONFIG_SCSI_GDTH is not set
> CONFIG_SCSI_ISCI=y
> # CONFIG_SCSI_IPS is not set
> CONFIG_SCSI_INITIO=y
> # CONFIG_SCSI_INIA100 is not set
> # CONFIG_SCSI_STEX is not set
> CONFIG_SCSI_SYM53C8XX_2=y
> CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
> CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
> CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
> # CONFIG_SCSI_SYM53C8XX_MMIO is not set
> # CONFIG_SCSI_QLOGIC_1280 is not set
> CONFIG_SCSI_QLA_FC=y
> # CONFIG_SCSI_QLA_ISCSI is not set
> CONFIG_SCSI_LPFC=y
> # CONFIG_SCSI_LPFC_DEBUG_FS is not set
> # CONFIG_SCSI_DC395x is not set
> # CONFIG_SCSI_DC390T is not set
> # CONFIG_SCSI_DEBUG is not set
> CONFIG_SCSI_PMCRAID=y
> # CONFIG_SCSI_PM8001 is not set
> # CONFIG_SCSI_SRP is not set
> CONFIG_SCSI_BFA_FC=y
> CONFIG_SCSI_DH=y
> # CONFIG_SCSI_DH_RDAC is not set
> # CONFIG_SCSI_DH_HP_SW is not set
> # CONFIG_SCSI_DH_EMC is not set
> # CONFIG_SCSI_DH_ALUA is not set
> CONFIG_SCSI_OSD_INITIATOR=y
> CONFIG_SCSI_OSD_ULD=y
> CONFIG_SCSI_OSD_DPRINT_SENSE=1
> # CONFIG_SCSI_OSD_DEBUG is not set
> # CONFIG_ATA is not set
> CONFIG_MD=y
> # CONFIG_BLK_DEV_MD is not set
> # CONFIG_BLK_DEV_DM is not set
> CONFIG_TARGET_CORE=y
> CONFIG_TCM_IBLOCK=y
> # CONFIG_TCM_FILEIO is not set
> CONFIG_TCM_PSCSI=y
> CONFIG_LOOPBACK_TARGET=y
> CONFIG_TCM_FC=y
> CONFIG_ISCSI_TARGET=y
> # CONFIG_FUSION is not set
> 
> #
> # IEEE 1394 (FireWire) support
> #
> CONFIG_FIREWIRE=y
> CONFIG_FIREWIRE_OHCI=y
> CONFIG_FIREWIRE_OHCI_DEBUG=y
> CONFIG_FIREWIRE_SBP2=y
> # CONFIG_FIREWIRE_NOSY is not set
> # CONFIG_I2O is not set
> CONFIG_MACINTOSH_DRIVERS=y
> # CONFIG_MAC_EMUMOUSEBTN is not set
> CONFIG_NETDEVICES=y
> CONFIG_NET_CORE=y
> # CONFIG_DUMMY is not set
> # CONFIG_EQUALIZER is not set
> # CONFIG_NET_FC is not set
> CONFIG_MII=y
> # CONFIG_NET_TEAM is not set
> CONFIG_MACVLAN=y
> CONFIG_MACVTAP=y
> # CONFIG_NETCONSOLE is not set
> # CONFIG_NETPOLL is not set
> # CONFIG_NET_POLL_CONTROLLER is not set
> # CONFIG_RIONET is not set
> CONFIG_TUN=y
> # CONFIG_VETH is not set
> CONFIG_VIRTIO_NET=y
> # CONFIG_ARCNET is not set
> # CONFIG_ATM_DRIVERS is not set
> 
> #
> # CAIF transport drivers
> #
> 
> #
> # Distributed Switch Architecture drivers
> #
> CONFIG_NET_DSA_MV88E6XXX=y
> CONFIG_NET_DSA_MV88E6060=y
> CONFIG_NET_DSA_MV88E6XXX_NEED_PPU=y
> CONFIG_NET_DSA_MV88E6131=y
> CONFIG_NET_DSA_MV88E6123_61_65=y
> CONFIG_ETHERNET=y
> CONFIG_MDIO=y
> # CONFIG_NET_VENDOR_3COM is not set
> # CONFIG_NET_VENDOR_ADAPTEC is not set
> # CONFIG_NET_VENDOR_ALTEON is not set
> CONFIG_NET_VENDOR_AMD=y
> # CONFIG_AMD8111_ETH is not set
> # CONFIG_PCNET32 is not set
> CONFIG_NET_VENDOR_ATHEROS=y
> # CONFIG_ATL2 is not set
> CONFIG_ATL1=y
> CONFIG_ATL1E=y
> # CONFIG_ATL1C is not set
> CONFIG_NET_VENDOR_BROADCOM=y
> # CONFIG_B44 is not set
> CONFIG_BNX2=y
> CONFIG_CNIC=y
> # CONFIG_TIGON3 is not set
> CONFIG_BNX2X=y
> # CONFIG_NET_VENDOR_BROCADE is not set
> CONFIG_NET_CALXEDA_XGMAC=y
> CONFIG_NET_VENDOR_CHELSIO=y
> # CONFIG_CHELSIO_T1 is not set
> # CONFIG_CHELSIO_T4 is not set
> # CONFIG_CHELSIO_T4VF is not set
> CONFIG_DNET=y
> CONFIG_NET_VENDOR_DEC=y
> CONFIG_NET_TULIP=y
> # CONFIG_DE2104X is not set
> CONFIG_TULIP=y
> # CONFIG_TULIP_MWI is not set
> CONFIG_TULIP_MMIO=y
> CONFIG_TULIP_NAPI=y
> # CONFIG_TULIP_NAPI_HW_MITIGATION is not set
> # CONFIG_DE4X5 is not set
> CONFIG_WINBOND_840=y
> CONFIG_DM9102=y
> CONFIG_ULI526X=y
> # CONFIG_PCMCIA_XIRCOM is not set
> # CONFIG_NET_VENDOR_DLINK is not set
> # CONFIG_NET_VENDOR_EXAR is not set
> CONFIG_NET_VENDOR_HP=y
> CONFIG_HP100=y
> # CONFIG_NET_VENDOR_INTEL is not set
> # CONFIG_IP1000 is not set
> CONFIG_JME=y
> CONFIG_NET_VENDOR_MARVELL=y
> # CONFIG_SKGE is not set
> # CONFIG_SKY2 is not set
> # CONFIG_NET_VENDOR_MICREL is not set
> # CONFIG_NET_VENDOR_MICROCHIP is not set
> # CONFIG_FEALNX is not set
> # CONFIG_NET_VENDOR_NATSEMI is not set
> # CONFIG_NET_VENDOR_NVIDIA is not set
> CONFIG_NET_VENDOR_OKI=y
> # CONFIG_PCH_GBE is not set
> CONFIG_ETHOC=y
> # CONFIG_NET_PACKET_ENGINE is not set
> # CONFIG_NET_VENDOR_QLOGIC is not set
> CONFIG_NET_VENDOR_REALTEK=y
> CONFIG_8139CP=y
> # CONFIG_8139TOO is not set
> # CONFIG_R8169 is not set
> # CONFIG_NET_VENDOR_RDC is not set
> CONFIG_NET_VENDOR_SEEQ=y
> CONFIG_SEEQ8005=y
> CONFIG_NET_VENDOR_SILAN=y
> # CONFIG_SC92031 is not set
> # CONFIG_NET_VENDOR_SIS is not set
> # CONFIG_NET_VENDOR_SMSC is not set
> CONFIG_NET_VENDOR_STMICRO=y
> CONFIG_STMMAC_ETH=y
> CONFIG_STMMAC_DEBUG_FS=y
> CONFIG_STMMAC_DA=y
> CONFIG_STMMAC_RING=y
> # CONFIG_STMMAC_CHAINED is not set
> CONFIG_NET_VENDOR_SUN=y
> CONFIG_HAPPYMEAL=y
> # CONFIG_SUNGEM is not set
> CONFIG_CASSINI=y
> # CONFIG_NIU is not set
> # CONFIG_NET_VENDOR_TEHUTI is not set
> CONFIG_NET_VENDOR_TI=y
> # CONFIG_TLAN is not set
> CONFIG_NET_VENDOR_VIA=y
> # CONFIG_VIA_RHINE is not set
> # CONFIG_VIA_VELOCITY is not set
> CONFIG_FDDI=y
> # CONFIG_DEFXX is not set
> CONFIG_SKFP=y
> CONFIG_NET_SB1000=y
> CONFIG_PHYLIB=y
> 
> #
> # MII PHY device drivers
> #
> # CONFIG_MARVELL_PHY is not set
> # CONFIG_DAVICOM_PHY is not set
> CONFIG_QSEMI_PHY=y
> CONFIG_LXT_PHY=y
> CONFIG_CICADA_PHY=y
> CONFIG_VITESSE_PHY=y
> # CONFIG_SMSC_PHY is not set
> CONFIG_BROADCOM_PHY=y
> CONFIG_ICPLUS_PHY=y
> CONFIG_REALTEK_PHY=y
> # CONFIG_NATIONAL_PHY is not set
> # CONFIG_STE10XP is not set
> CONFIG_LSI_ET1011C_PHY=y
> # CONFIG_MICREL_PHY is not set
> CONFIG_FIXED_PHY=y
> CONFIG_MDIO_BITBANG=y
> CONFIG_MDIO_GPIO=y
> CONFIG_MICREL_KS8995MA=y
> # CONFIG_PPP is not set
> CONFIG_SLIP=y
> # CONFIG_SLIP_COMPRESSED is not set
> CONFIG_SLIP_SMART=y
> CONFIG_SLIP_MODE_SLIP6=y
> CONFIG_TR=y
> # CONFIG_IBMOL is not set
> CONFIG_3C359=y
> # CONFIG_TMS380TR is not set
> CONFIG_WLAN=y
> # CONFIG_AIRO is not set
> # CONFIG_ATMEL is not set
> CONFIG_PRISM54=y
> # CONFIG_HOSTAP is not set
> 
> #
> # WiMAX Wireless Broadband devices
> #
> 
> #
> # Enable USB support to see WiMAX USB drivers
> #
> 
> #
> # Enable MMC support to see WiMAX SDIO drivers
> #
> CONFIG_WAN=y
> CONFIG_LANMEDIA=y
> CONFIG_HDLC=y
> CONFIG_HDLC_RAW=y
> # CONFIG_HDLC_RAW_ETH is not set
> # CONFIG_HDLC_CISCO is not set
> # CONFIG_HDLC_FR is not set
> CONFIG_HDLC_PPP=y
> 
> #
> # X.25/LAPB support is disabled
> #
> CONFIG_PCI200SYN=y
> # CONFIG_WANXL is not set
> CONFIG_PC300TOO=y
> CONFIG_FARSYNC=y
> CONFIG_DLCI=y
> CONFIG_DLCI_MAX=8
> # CONFIG_SBNI is not set
> # CONFIG_XEN_NETDEV_FRONTEND is not set
> CONFIG_XEN_NETDEV_BACKEND=y
> CONFIG_ISDN=y
> CONFIG_ISDN_I4L=y
> # CONFIG_ISDN_AUDIO is not set
> CONFIG_ISDN_X25=y
> 
> #
> # ISDN feature submodules
> #
> # CONFIG_ISDN_DRV_LOOP is not set
> # CONFIG_ISDN_DIVERSION is not set
> 
> #
> # ISDN4Linux hardware drivers
> #
> 
> #
> # Passive cards
> #
> # CONFIG_ISDN_DRV_HISAX is not set
> 
> #
> # Active cards
> #
> # CONFIG_ISDN_CAPI is not set
> CONFIG_ISDN_DRV_GIGASET=y
> CONFIG_GIGASET_I4L=y
> # CONFIG_GIGASET_DUMMYLL is not set
> CONFIG_GIGASET_M101=y
> # CONFIG_GIGASET_DEBUG is not set
> CONFIG_MISDN=y
> CONFIG_MISDN_DSP=y
> # CONFIG_MISDN_L1OIP is not set
> 
> #
> # mISDN hardware drivers
> #
> CONFIG_MISDN_HFCPCI=y
> # CONFIG_MISDN_HFCMULTI is not set
> CONFIG_MISDN_AVMFRITZ=y
> # CONFIG_MISDN_SPEEDFAX is not set
> # CONFIG_MISDN_INFINEON is not set
> CONFIG_MISDN_W6692=y
> CONFIG_MISDN_NETJET=y
> CONFIG_MISDN_IPAC=y
> CONFIG_ISDN_HDLC=y
> # CONFIG_PHONE is not set
> 
> #
> # Input device support
> #
> CONFIG_INPUT=y
> # CONFIG_INPUT_FF_MEMLESS is not set
> CONFIG_INPUT_POLLDEV=y
> CONFIG_INPUT_SPARSEKMAP=y
> 
> #
> # Userland interfaces
> #
> CONFIG_INPUT_MOUSEDEV=y
> CONFIG_INPUT_MOUSEDEV_PSAUX=y
> CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
> CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
> CONFIG_INPUT_JOYDEV=y
> # CONFIG_INPUT_EVDEV is not set
> CONFIG_INPUT_EVBUG=y
> 
> #
> # Input Device Drivers
> #
> CONFIG_INPUT_KEYBOARD=y
> # CONFIG_KEYBOARD_ADP5588 is not set
> CONFIG_KEYBOARD_ADP5589=y
> CONFIG_KEYBOARD_ATKBD=y
> CONFIG_KEYBOARD_QT1070=y
> # CONFIG_KEYBOARD_QT2160 is not set
> CONFIG_KEYBOARD_LKKBD=y
> # CONFIG_KEYBOARD_GPIO is not set
> # CONFIG_KEYBOARD_GPIO_POLLED is not set
> CONFIG_KEYBOARD_TCA6416=y
> # CONFIG_KEYBOARD_TCA8418 is not set
> CONFIG_KEYBOARD_MATRIX=y
> CONFIG_KEYBOARD_LM8323=y
> # CONFIG_KEYBOARD_MAX7359 is not set
> CONFIG_KEYBOARD_MCS=y
> CONFIG_KEYBOARD_MPR121=y
> CONFIG_KEYBOARD_NEWTON=y
> CONFIG_KEYBOARD_OPENCORES=y
> # CONFIG_KEYBOARD_STOWAWAY is not set
> CONFIG_KEYBOARD_SUNKBD=y
> # CONFIG_KEYBOARD_TC3589X is not set
> CONFIG_KEYBOARD_XTKBD=y
> CONFIG_INPUT_MOUSE=y
> CONFIG_MOUSE_PS2=y
> CONFIG_MOUSE_PS2_ALPS=y
> CONFIG_MOUSE_PS2_LOGIPS2PP=y
> CONFIG_MOUSE_PS2_SYNAPTICS=y
> CONFIG_MOUSE_PS2_LIFEBOOK=y
> CONFIG_MOUSE_PS2_TRACKPOINT=y
> CONFIG_MOUSE_PS2_ELANTECH=y
> # CONFIG_MOUSE_PS2_SENTELIC is not set
> # CONFIG_MOUSE_PS2_TOUCHKIT is not set
> CONFIG_MOUSE_SERIAL=y
> CONFIG_MOUSE_VSXXXAA=y
> # CONFIG_MOUSE_GPIO is not set
> CONFIG_MOUSE_SYNAPTICS_I2C=y
> # CONFIG_INPUT_JOYSTICK is not set
> CONFIG_INPUT_TABLET=y
> # CONFIG_INPUT_TOUCHSCREEN is not set
> CONFIG_INPUT_MISC=y
> CONFIG_INPUT_88PM860X_ONKEY=y
> # CONFIG_INPUT_AD714X is not set
> CONFIG_INPUT_BMA150=y
> # CONFIG_INPUT_PCSPKR is not set
> # CONFIG_INPUT_MMA8450 is not set
> CONFIG_INPUT_MPU3050=y
> # CONFIG_INPUT_APANEL is not set
> # CONFIG_INPUT_GP2A is not set
> CONFIG_INPUT_GPIO_TILT_POLLED=y
> CONFIG_INPUT_ATLAS_BTNS=y
> # CONFIG_INPUT_KXTJ9 is not set
> # CONFIG_INPUT_UINPUT is not set
> # CONFIG_INPUT_PCF8574 is not set
> CONFIG_INPUT_GPIO_ROTARY_ENCODER=y
> # CONFIG_INPUT_WM831X_ON is not set
> # CONFIG_INPUT_PCAP is not set
> CONFIG_INPUT_ADXL34X=y
> CONFIG_INPUT_ADXL34X_I2C=y
> CONFIG_INPUT_ADXL34X_SPI=y
> # CONFIG_INPUT_CMA3000 is not set
> 
> #
> # Hardware I/O ports
> #
> CONFIG_SERIO=y
> CONFIG_SERIO_I8042=y
> CONFIG_SERIO_SERPORT=y
> CONFIG_SERIO_CT82C710=y
> CONFIG_SERIO_PCIPS2=y
> CONFIG_SERIO_LIBPS2=y
> # CONFIG_SERIO_RAW is not set
> CONFIG_SERIO_ALTERA_PS2=y
> # CONFIG_SERIO_PS2MULT is not set
> CONFIG_GAMEPORT=y
> # CONFIG_GAMEPORT_NS558 is not set
> CONFIG_GAMEPORT_L4=y
> CONFIG_GAMEPORT_EMU10K1=y
> # CONFIG_GAMEPORT_FM801 is not set
> 
> #
> # Character devices
> #
> CONFIG_VT=y
> CONFIG_CONSOLE_TRANSLATIONS=y
> CONFIG_VT_CONSOLE=y
> CONFIG_VT_CONSOLE_SLEEP=y
> CONFIG_HW_CONSOLE=y
> # CONFIG_VT_HW_CONSOLE_BINDING is not set
> CONFIG_UNIX98_PTYS=y
> CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
> CONFIG_LEGACY_PTYS=y
> CONFIG_LEGACY_PTY_COUNT=256
> CONFIG_SERIAL_NONSTANDARD=y
> # CONFIG_ROCKETPORT is not set
> # CONFIG_CYCLADES is not set
> CONFIG_MOXA_INTELLIO=y
> # CONFIG_MOXA_SMARTIO is not set
> CONFIG_SYNCLINK=y
> # CONFIG_SYNCLINKMP is not set
> # CONFIG_SYNCLINK_GT is not set
> CONFIG_NOZOMI=y
> # CONFIG_ISI is not set
> # CONFIG_N_HDLC is not set
> # CONFIG_N_GSM is not set
> # CONFIG_TRACE_ROUTER is not set
> CONFIG_TRACE_SINK=y
> # CONFIG_DEVKMEM is not set
> # CONFIG_STALDRV is not set
> 
> #
> # Serial drivers
> #
> CONFIG_SERIAL_8250=y
> # CONFIG_SERIAL_8250_CONSOLE is not set
> CONFIG_FIX_EARLYCON_MEM=y
> CONFIG_SERIAL_8250_PCI=y
> CONFIG_SERIAL_8250_PNP=y
> CONFIG_SERIAL_8250_NR_UARTS=4
> CONFIG_SERIAL_8250_RUNTIME_UARTS=4
> # CONFIG_SERIAL_8250_EXTENDED is not set
> 
> #
> # Non-8250 serial port support
> #
> CONFIG_SERIAL_MAX3100=y
> # CONFIG_SERIAL_MAX3107 is not set
> # CONFIG_SERIAL_MFD_HSU is not set
> # CONFIG_SERIAL_UARTLITE is not set
> CONFIG_SERIAL_CORE=y
> CONFIG_SERIAL_CORE_CONSOLE=y
> CONFIG_CONSOLE_POLL=y
> # CONFIG_SERIAL_JSM is not set
> CONFIG_SERIAL_TIMBERDALE=y
> # CONFIG_SERIAL_ALTERA_JTAGUART is not set
> CONFIG_SERIAL_ALTERA_UART=y
> CONFIG_SERIAL_ALTERA_UART_MAXPORTS=4
> CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200
> # CONFIG_SERIAL_ALTERA_UART_CONSOLE is not set
> CONFIG_SERIAL_IFX6X60=y
> CONFIG_SERIAL_PCH_UART=y
> # CONFIG_SERIAL_PCH_UART_CONSOLE is not set
> CONFIG_SERIAL_XILINX_PS_UART=y
> CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
> CONFIG_HVC_DRIVER=y
> CONFIG_HVC_IRQ=y
> CONFIG_HVC_XEN=y
> # CONFIG_VIRTIO_CONSOLE is not set
> # CONFIG_IPMI_HANDLER is not set
> CONFIG_HW_RANDOM=y
> CONFIG_HW_RANDOM_TIMERIOMEM=y
> # CONFIG_HW_RANDOM_INTEL is not set
> CONFIG_HW_RANDOM_AMD=y
> # CONFIG_HW_RANDOM_VIA is not set
> # CONFIG_HW_RANDOM_VIRTIO is not set
> CONFIG_NVRAM=y
> CONFIG_R3964=y
> # CONFIG_APPLICOM is not set
> CONFIG_MWAVE=y
> # CONFIG_RAW_DRIVER is not set
> # CONFIG_HPET is not set
> # CONFIG_HANGCHECK_TIMER is not set
> # CONFIG_TCG_TPM is not set
> CONFIG_TELCLOCK=y
> CONFIG_DEVPORT=y
> CONFIG_RAMOOPS=y
> CONFIG_I2C=y
> CONFIG_I2C_BOARDINFO=y
> # CONFIG_I2C_COMPAT is not set
> # CONFIG_I2C_CHARDEV is not set
> # CONFIG_I2C_MUX is not set
> CONFIG_I2C_HELPER_AUTO=y
> CONFIG_I2C_SMBUS=y
> CONFIG_I2C_ALGOBIT=y
> 
> #
> # I2C Hardware Bus support
> #
> 
> #
> # PC SMBus host controller drivers
> #
> CONFIG_I2C_ALI1535=y
> # CONFIG_I2C_ALI1563 is not set
> CONFIG_I2C_ALI15X3=y
> CONFIG_I2C_AMD756=y
> # CONFIG_I2C_AMD756_S4882 is not set
> # CONFIG_I2C_AMD8111 is not set
> # CONFIG_I2C_I801 is not set
> # CONFIG_I2C_ISCH is not set
> # CONFIG_I2C_PIIX4 is not set
> CONFIG_I2C_NFORCE2=y
> # CONFIG_I2C_NFORCE2_S4985 is not set
> # CONFIG_I2C_SIS5595 is not set
> CONFIG_I2C_SIS630=y
> # CONFIG_I2C_SIS96X is not set
> CONFIG_I2C_VIA=y
> CONFIG_I2C_VIAPRO=y
> 
> #
> # ACPI drivers
> #
> CONFIG_I2C_SCMI=y
> 
> #
> # I2C system bus drivers (mostly embedded / system-on-chip)
> #
> # CONFIG_I2C_DESIGNWARE_PCI is not set
> CONFIG_I2C_GPIO=y
> CONFIG_I2C_INTEL_MID=y
> # CONFIG_I2C_OCORES is not set
> # CONFIG_I2C_PCA_PLATFORM is not set
> # CONFIG_I2C_PXA_PCI is not set
> # CONFIG_I2C_SIMTEC is not set
> CONFIG_I2C_XILINX=y
> # CONFIG_I2C_EG20T is not set
> 
> #
> # External I2C/SMBus adapter drivers
> #
> CONFIG_I2C_PARPORT_LIGHT=y
> CONFIG_I2C_TAOS_EVM=y
> 
> #
> # Other I2C/SMBus bus drivers
> #
> CONFIG_I2C_DEBUG_CORE=y
> # CONFIG_I2C_DEBUG_ALGO is not set
> CONFIG_I2C_DEBUG_BUS=y
> CONFIG_SPI=y
> CONFIG_SPI_DEBUG=y
> CONFIG_SPI_MASTER=y
> 
> #
> # SPI Master Controller Drivers
> #
> # CONFIG_SPI_ALTERA is not set
> CONFIG_SPI_BITBANG=y
> CONFIG_SPI_GPIO=y
> # CONFIG_SPI_OC_TINY is not set
> # CONFIG_SPI_PXA2XX_PCI is not set
> CONFIG_SPI_TOPCLIFF_PCH=y
> CONFIG_SPI_XILINX=y
> # CONFIG_SPI_DESIGNWARE is not set
> 
> #
> # SPI Protocol Masters
> #
> CONFIG_SPI_SPIDEV=y
> CONFIG_SPI_TLE62X0=y
> CONFIG_HSI=y
> CONFIG_HSI_BOARDINFO=y
> 
> #
> # HSI clients
> #
> # CONFIG_HSI_CHAR is not set
> 
> #
> # PPS support
> #
> CONFIG_PPS=y
> CONFIG_PPS_DEBUG=y
> 
> #
> # PPS clients support
> #
> CONFIG_PPS_CLIENT_KTIMER=y
> # CONFIG_PPS_CLIENT_LDISC is not set
> # CONFIG_PPS_CLIENT_GPIO is not set
> 
> #
> # PPS generators support
> #
> 
> #
> # PTP clock support
> #
> CONFIG_PTP_1588_CLOCK=y
> 
> #
> # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
> #
> CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
> CONFIG_GPIOLIB=y
> CONFIG_DEBUG_GPIO=y
> CONFIG_GPIO_SYSFS=y
> CONFIG_GPIO_MAX730X=y
> 
> #
> # Memory mapped GPIO drivers:
> #
> # CONFIG_GPIO_GENERIC_PLATFORM is not set
> CONFIG_GPIO_IT8761E=y
> CONFIG_GPIO_SCH=y
> CONFIG_GPIO_VX855=y
> 
> #
> # I2C GPIO expanders:
> #
> CONFIG_GPIO_MAX7300=y
> CONFIG_GPIO_MAX732X=y
> # CONFIG_GPIO_MAX732X_IRQ is not set
> CONFIG_GPIO_PCA953X=y
> # CONFIG_GPIO_PCA953X_IRQ is not set
> # CONFIG_GPIO_PCF857X is not set
> # CONFIG_GPIO_SX150X is not set
> CONFIG_GPIO_TC3589X=y
> # CONFIG_GPIO_WM831X is not set
> CONFIG_GPIO_WM8350=y
> # CONFIG_GPIO_WM8994 is not set
> CONFIG_GPIO_ADP5588=y
> CONFIG_GPIO_ADP5588_IRQ=y
> 
> #
> # PCI GPIO expanders:
> #
> # CONFIG_GPIO_BT8XX is not set
> CONFIG_GPIO_LANGWELL=y
> CONFIG_GPIO_PCH=y
> CONFIG_GPIO_ML_IOH=y
> CONFIG_GPIO_TIMBERDALE=y
> CONFIG_GPIO_RDC321X=y
> 
> #
> # SPI GPIO expanders:
> #
> # CONFIG_GPIO_MAX7301 is not set
> # CONFIG_GPIO_MCP23S08 is not set
> CONFIG_GPIO_MC33880=y
> CONFIG_GPIO_74X164=y
> 
> #
> # AC97 GPIO expanders:
> #
> 
> #
> # MODULbus GPIO expanders:
> #
> CONFIG_GPIO_TPS65910=y
> # CONFIG_W1 is not set
> CONFIG_POWER_SUPPLY=y
> # CONFIG_POWER_SUPPLY_DEBUG is not set
> CONFIG_PDA_POWER=y
> # CONFIG_WM831X_BACKUP is not set
> CONFIG_WM831X_POWER=y
> # CONFIG_WM8350_POWER is not set
> CONFIG_TEST_POWER=y
> # CONFIG_BATTERY_DS2780 is not set
> CONFIG_BATTERY_DS2782=y
> CONFIG_BATTERY_BQ20Z75=y
> # CONFIG_BATTERY_BQ27x00 is not set
> CONFIG_BATTERY_MAX17040=y
> # CONFIG_BATTERY_MAX17042 is not set
> # CONFIG_CHARGER_MAX8903 is not set
> CONFIG_CHARGER_GPIO=y
> CONFIG_CHARGER_MAX8998=y
> CONFIG_HWMON=y
> CONFIG_HWMON_VID=y
> CONFIG_HWMON_DEBUG_CHIP=y
> 
> #
> # Native drivers
> #
> # CONFIG_SENSORS_ABITUGURU is not set
> # CONFIG_SENSORS_ABITUGURU3 is not set
> CONFIG_SENSORS_AD7314=y
> CONFIG_SENSORS_AD7414=y
> CONFIG_SENSORS_AD7418=y
> CONFIG_SENSORS_ADCXX=y
> # CONFIG_SENSORS_ADM1021 is not set
> # CONFIG_SENSORS_ADM1025 is not set
> CONFIG_SENSORS_ADM1026=y
> CONFIG_SENSORS_ADM1029=y
> CONFIG_SENSORS_ADM1031=y
> # CONFIG_SENSORS_ADM9240 is not set
> CONFIG_SENSORS_ADT7411=y
> CONFIG_SENSORS_ADT7462=y
> CONFIG_SENSORS_ADT7470=y
> CONFIG_SENSORS_ADT7475=y
> # CONFIG_SENSORS_ASC7621 is not set
> # CONFIG_SENSORS_K8TEMP is not set
> CONFIG_SENSORS_K10TEMP=y
> # CONFIG_SENSORS_FAM15H_POWER is not set
> CONFIG_SENSORS_ASB100=y
> # CONFIG_SENSORS_ATXP1 is not set
> CONFIG_SENSORS_DS620=y
> CONFIG_SENSORS_DS1621=y
> CONFIG_SENSORS_I5K_AMB=y
> CONFIG_SENSORS_F71805F=y
> # CONFIG_SENSORS_F71882FG is not set
> CONFIG_SENSORS_F75375S=y
> CONFIG_SENSORS_FSCHMD=y
> CONFIG_SENSORS_G760A=y
> # CONFIG_SENSORS_GL518SM is not set
> # CONFIG_SENSORS_GL520SM is not set
> CONFIG_SENSORS_GPIO_FAN=y
> CONFIG_SENSORS_CORETEMP=y
> CONFIG_SENSORS_IT87=y
> CONFIG_SENSORS_JC42=y
> CONFIG_SENSORS_LINEAGE=y
> # CONFIG_SENSORS_LM63 is not set
> # CONFIG_SENSORS_LM70 is not set
> CONFIG_SENSORS_LM73=y
> # CONFIG_SENSORS_LM75 is not set
> CONFIG_SENSORS_LM77=y
> CONFIG_SENSORS_LM78=y
> CONFIG_SENSORS_LM80=y
> # CONFIG_SENSORS_LM83 is not set
> CONFIG_SENSORS_LM85=y
> CONFIG_SENSORS_LM87=y
> # CONFIG_SENSORS_LM90 is not set
> # CONFIG_SENSORS_LM92 is not set
> CONFIG_SENSORS_LM93=y
> CONFIG_SENSORS_LTC4151=y
> # CONFIG_SENSORS_LTC4215 is not set
> CONFIG_SENSORS_LTC4245=y
> # CONFIG_SENSORS_LTC4261 is not set
> # CONFIG_SENSORS_LM95241 is not set
> # CONFIG_SENSORS_LM95245 is not set
> # CONFIG_SENSORS_MAX1111 is not set
> # CONFIG_SENSORS_MAX16065 is not set
> CONFIG_SENSORS_MAX1619=y
> CONFIG_SENSORS_MAX1668=y
> CONFIG_SENSORS_MAX6639=y
> CONFIG_SENSORS_MAX6642=y
> # CONFIG_SENSORS_MAX6650 is not set
> # CONFIG_SENSORS_NTC_THERMISTOR is not set
> CONFIG_SENSORS_PC87360=y
> # CONFIG_SENSORS_PC87427 is not set
> CONFIG_SENSORS_PCF8591=y
> CONFIG_PMBUS=y
> CONFIG_SENSORS_PMBUS=y
> # CONFIG_SENSORS_ADM1275 is not set
> # CONFIG_SENSORS_LM25066 is not set
> # CONFIG_SENSORS_LTC2978 is not set
> # CONFIG_SENSORS_MAX16064 is not set
> # CONFIG_SENSORS_MAX34440 is not set
> # CONFIG_SENSORS_MAX8688 is not set
> # CONFIG_SENSORS_UCD9000 is not set
> # CONFIG_SENSORS_UCD9200 is not set
> CONFIG_SENSORS_ZL6100=y
> # CONFIG_SENSORS_SHT15 is not set
> # CONFIG_SENSORS_SHT21 is not set
> CONFIG_SENSORS_SIS5595=y
> # CONFIG_SENSORS_SMM665 is not set
> CONFIG_SENSORS_DME1737=y
> # CONFIG_SENSORS_EMC1403 is not set
> # CONFIG_SENSORS_EMC2103 is not set
> # CONFIG_SENSORS_EMC6W201 is not set
> CONFIG_SENSORS_SMSC47M1=y
> CONFIG_SENSORS_SMSC47M192=y
> # CONFIG_SENSORS_SMSC47B397 is not set
> # CONFIG_SENSORS_SCH56XX_COMMON is not set
> # CONFIG_SENSORS_SCH5627 is not set
> # CONFIG_SENSORS_SCH5636 is not set
> # CONFIG_SENSORS_ADS1015 is not set
> # CONFIG_SENSORS_ADS7828 is not set
> CONFIG_SENSORS_ADS7871=y
> CONFIG_SENSORS_AMC6821=y
> # CONFIG_SENSORS_THMC50 is not set
> # CONFIG_SENSORS_TMP102 is not set
> # CONFIG_SENSORS_TMP401 is not set
> CONFIG_SENSORS_TMP421=y
> # CONFIG_SENSORS_VIA_CPUTEMP is not set
> CONFIG_SENSORS_VIA686A=y
> CONFIG_SENSORS_VT1211=y
> # CONFIG_SENSORS_VT8231 is not set
> CONFIG_SENSORS_W83781D=y
> # CONFIG_SENSORS_W83791D is not set
> # CONFIG_SENSORS_W83792D is not set
> CONFIG_SENSORS_W83793=y
> CONFIG_SENSORS_W83795=y
> CONFIG_SENSORS_W83795_FANCTRL=y
> CONFIG_SENSORS_W83L785TS=y
> CONFIG_SENSORS_W83L786NG=y
> CONFIG_SENSORS_W83627HF=y
> # CONFIG_SENSORS_W83627EHF is not set
> CONFIG_SENSORS_WM831X=y
> CONFIG_SENSORS_WM8350=y
> CONFIG_SENSORS_APPLESMC=y
> 
> #
> # ACPI drivers
> #
> # CONFIG_SENSORS_ACPI_POWER is not set
> CONFIG_SENSORS_ATK0110=y
> CONFIG_THERMAL=y
> CONFIG_THERMAL_HWMON=y
> # CONFIG_WATCHDOG is not set
> CONFIG_SSB_POSSIBLE=y
> 
> #
> # Sonics Silicon Backplane
> #
> # CONFIG_SSB is not set
> CONFIG_BCMA_POSSIBLE=y
> 
> #
> # Broadcom specific AMBA
> #
> # CONFIG_BCMA is not set
> 
> #
> # Multifunction device drivers
> #
> CONFIG_MFD_CORE=y
> CONFIG_MFD_88PM860X=y
> CONFIG_MFD_SM501=y
> # CONFIG_MFD_SM501_GPIO is not set
> CONFIG_HTC_PASIC3=y
> CONFIG_HTC_I2CPLD=y
> CONFIG_TPS6105X=y
> CONFIG_TPS65010=y
> # CONFIG_TPS6507X is not set
> CONFIG_MFD_TPS6586X=y
> CONFIG_MFD_TPS65910=y
> # CONFIG_MFD_TPS65912_I2C is not set
> # CONFIG_MFD_TPS65912_SPI is not set
> # CONFIG_TWL4030_CORE is not set
> # CONFIG_MFD_STMPE is not set
> CONFIG_MFD_TC3589X=y
> # CONFIG_MFD_TMIO is not set
> # CONFIG_PMIC_DA903X is not set
> CONFIG_PMIC_DA9052=y
> CONFIG_MFD_DA9052_SPI=y
> CONFIG_MFD_DA9052_I2C=y
> # CONFIG_PMIC_ADP5520 is not set
> # CONFIG_MFD_MAX8925 is not set
> # CONFIG_MFD_MAX8997 is not set
> CONFIG_MFD_MAX8998=y
> # CONFIG_MFD_WM8400 is not set
> CONFIG_MFD_WM831X=y
> CONFIG_MFD_WM831X_I2C=y
> CONFIG_MFD_WM831X_SPI=y
> CONFIG_MFD_WM8350=y
> CONFIG_MFD_WM8350_I2C=y
> CONFIG_MFD_WM8994=y
> # CONFIG_MFD_PCF50633 is not set
> # CONFIG_MFD_MC13XXX is not set
> # CONFIG_ABX500_CORE is not set
> CONFIG_EZX_PCAP=y
> # CONFIG_MFD_CS5535 is not set
> CONFIG_MFD_TIMBERDALE=y
> CONFIG_LPC_SCH=y
> CONFIG_MFD_RDC321X=y
> # CONFIG_MFD_JANZ_CMODIO is not set
> CONFIG_MFD_VX855=y
> CONFIG_MFD_WL1273_CORE=y
> # CONFIG_MFD_AAT2870_CORE is not set
> CONFIG_REGULATOR=y
> CONFIG_REGULATOR_DEBUG=y
> CONFIG_REGULATOR_DUMMY=y
> CONFIG_REGULATOR_FIXED_VOLTAGE=y
> CONFIG_REGULATOR_VIRTUAL_CONSUMER=y
> # CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
> CONFIG_REGULATOR_GPIO=y
> CONFIG_REGULATOR_BQ24022=y
> # CONFIG_REGULATOR_MAX1586 is not set
> # CONFIG_REGULATOR_MAX8649 is not set
> # CONFIG_REGULATOR_MAX8660 is not set
> CONFIG_REGULATOR_MAX8952=y
> CONFIG_REGULATOR_MAX8998=y
> CONFIG_REGULATOR_WM831X=y
> CONFIG_REGULATOR_WM8350=y
> # CONFIG_REGULATOR_WM8994 is not set
> # CONFIG_REGULATOR_DA9052 is not set
> # CONFIG_REGULATOR_LP3971 is not set
> # CONFIG_REGULATOR_LP3972 is not set
> CONFIG_REGULATOR_PCAP=y
> # CONFIG_REGULATOR_TPS6105X is not set
> CONFIG_REGULATOR_TPS65023=y
> # CONFIG_REGULATOR_TPS6507X is not set
> # CONFIG_REGULATOR_88PM8607 is not set
> CONFIG_REGULATOR_ISL6271A=y
> CONFIG_REGULATOR_AD5398=y
> # CONFIG_REGULATOR_TPS6586X is not set
> CONFIG_REGULATOR_TPS6524X=y
> CONFIG_REGULATOR_TPS65910=y
> # CONFIG_MEDIA_SUPPORT is not set
> 
> #
> # Graphics support
> #
> CONFIG_AGP=y
> CONFIG_AGP_AMD64=y
> CONFIG_AGP_INTEL=y
> CONFIG_AGP_SIS=y
> CONFIG_AGP_VIA=y
> CONFIG_VGA_ARB=y
> CONFIG_VGA_ARB_MAX_GPUS=16
> CONFIG_VGA_SWITCHEROO=y
> CONFIG_DRM=y
> CONFIG_DRM_KMS_HELPER=y
> CONFIG_DRM_TTM=y
> CONFIG_DRM_TDFX=y
> # CONFIG_DRM_R128 is not set
> CONFIG_DRM_RADEON=y
> # CONFIG_DRM_RADEON_KMS is not set
> CONFIG_DRM_I915=y
> CONFIG_DRM_I915_KMS=y
> # CONFIG_DRM_MGA is not set
> # CONFIG_DRM_SIS is not set
> CONFIG_DRM_VIA=y
> CONFIG_DRM_SAVAGE=y
> # CONFIG_DRM_VMWGFX is not set
> # CONFIG_DRM_GMA500 is not set
> # CONFIG_STUB_POULSBO is not set
> CONFIG_VGASTATE=y
> CONFIG_VIDEO_OUTPUT_CONTROL=y
> CONFIG_FB=y
> # CONFIG_FIRMWARE_EDID is not set
> # CONFIG_FB_DDC is not set
> CONFIG_FB_BOOT_VESA_SUPPORT=y
> CONFIG_FB_CFB_FILLRECT=y
> CONFIG_FB_CFB_COPYAREA=y
> CONFIG_FB_CFB_IMAGEBLIT=y
> # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
> CONFIG_FB_SYS_FILLRECT=y
> CONFIG_FB_SYS_COPYAREA=y
> CONFIG_FB_SYS_IMAGEBLIT=y
> # CONFIG_FB_FOREIGN_ENDIAN is not set
> CONFIG_FB_SYS_FOPS=y
> # CONFIG_FB_WMT_GE_ROPS is not set
> CONFIG_FB_DEFERRED_IO=y
> CONFIG_FB_SVGALIB=y
> # CONFIG_FB_MACMODES is not set
> # CONFIG_FB_BACKLIGHT is not set
> CONFIG_FB_MODE_HELPERS=y
> CONFIG_FB_TILEBLITTING=y
> 
> #
> # Frame buffer hardware drivers
> #
> CONFIG_FB_CIRRUS=y
> CONFIG_FB_PM2=y
> CONFIG_FB_PM2_FIFO_DISCONNECT=y
> # CONFIG_FB_CYBER2000 is not set
> # CONFIG_FB_ARC is not set
> CONFIG_FB_ASILIANT=y
> CONFIG_FB_IMSTT=y
> # CONFIG_FB_VGA16 is not set
> CONFIG_FB_UVESA=y
> CONFIG_FB_VESA=y
> # CONFIG_FB_EFI is not set
> # CONFIG_FB_N411 is not set
> CONFIG_FB_HGA=y
> # CONFIG_FB_S1D13XXX is not set
> # CONFIG_FB_NVIDIA is not set
> # CONFIG_FB_RIVA is not set
> CONFIG_FB_LE80578=y
> # CONFIG_FB_CARILLO_RANCH is not set
> # CONFIG_FB_MATROX is not set
> # CONFIG_FB_RADEON is not set
> # CONFIG_FB_ATY128 is not set
> CONFIG_FB_ATY=y
> # CONFIG_FB_ATY_CT is not set
> CONFIG_FB_ATY_GX=y
> # CONFIG_FB_ATY_BACKLIGHT is not set
> # CONFIG_FB_S3 is not set
> CONFIG_FB_SAVAGE=y
> # CONFIG_FB_SAVAGE_I2C is not set
> # CONFIG_FB_SAVAGE_ACCEL is not set
> CONFIG_FB_SIS=y
> CONFIG_FB_SIS_300=y
> # CONFIG_FB_SIS_315 is not set
> CONFIG_FB_VIA=y
> # CONFIG_FB_VIA_DIRECT_PROCFS is not set
> CONFIG_FB_VIA_X_COMPATIBILITY=y
> CONFIG_FB_NEOMAGIC=y
> # CONFIG_FB_KYRO is not set
> CONFIG_FB_3DFX=y
> # CONFIG_FB_3DFX_ACCEL is not set
> # CONFIG_FB_3DFX_I2C is not set
> CONFIG_FB_VOODOO1=y
> CONFIG_FB_VT8623=y
> CONFIG_FB_TRIDENT=y
> CONFIG_FB_ARK=y
> CONFIG_FB_PM3=y
> CONFIG_FB_CARMINE=y
> # CONFIG_FB_CARMINE_DRAM_EVAL is not set
> CONFIG_CARMINE_DRAM_CUSTOM=y
> # CONFIG_FB_GEODE is not set
> # CONFIG_FB_TMIO is not set
> # CONFIG_FB_SM501 is not set
> # CONFIG_FB_VIRTUAL is not set
> # CONFIG_XEN_FBDEV_FRONTEND is not set
> # CONFIG_FB_METRONOME is not set
> CONFIG_FB_MB862XX=y
> CONFIG_FB_MB862XX_PCI_GDC=y
> # CONFIG_FB_MB862XX_I2C is not set
> CONFIG_FB_BROADSHEET=y
> CONFIG_BACKLIGHT_LCD_SUPPORT=y
> # CONFIG_LCD_CLASS_DEVICE is not set
> CONFIG_BACKLIGHT_CLASS_DEVICE=y
> # CONFIG_BACKLIGHT_GENERIC is not set
> # CONFIG_BACKLIGHT_PROGEAR is not set
> # CONFIG_BACKLIGHT_APPLE is not set
> CONFIG_BACKLIGHT_SAHARA=y
> CONFIG_BACKLIGHT_WM831X=y
> CONFIG_BACKLIGHT_ADP8860=y
> CONFIG_BACKLIGHT_ADP8870=y
> # CONFIG_BACKLIGHT_88PM860X is not set
> 
> #
> # Console display driver support
> #
> CONFIG_VGA_CONSOLE=y
> CONFIG_VGACON_SOFT_SCROLLBACK=y
> CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
> CONFIG_DUMMY_CONSOLE=y
> CONFIG_FRAMEBUFFER_CONSOLE=y
> CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
> CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
> # CONFIG_FONTS is not set
> CONFIG_FONT_8x8=y
> CONFIG_FONT_8x16=y
> CONFIG_LOGO=y
> CONFIG_LOGO_LINUX_MONO=y
> # CONFIG_LOGO_LINUX_VGA16 is not set
> CONFIG_LOGO_LINUX_CLUT224=y
> # CONFIG_SOUND is not set
> CONFIG_HID_SUPPORT=y
> # CONFIG_HID is not set
> CONFIG_HID_PID=y
> # CONFIG_USB_SUPPORT is not set
> CONFIG_UWB=y
> CONFIG_UWB_WHCI=y
> # CONFIG_MMC is not set
> CONFIG_MEMSTICK=y
> # CONFIG_MEMSTICK_DEBUG is not set
> 
> #
> # MemoryStick drivers
> #
> # CONFIG_MEMSTICK_UNSAFE_RESUME is not set
> # CONFIG_MSPRO_BLOCK is not set
> 
> #
> # MemoryStick Host Controller Drivers
> #
> # CONFIG_MEMSTICK_TIFM_MS is not set
> CONFIG_MEMSTICK_JMICRON_38X=y
> CONFIG_MEMSTICK_R592=y
> CONFIG_NEW_LEDS=y
> CONFIG_LEDS_CLASS=y
> 
> #
> # LED drivers
> #
> CONFIG_LEDS_88PM860X=y
> CONFIG_LEDS_LM3530=y
> CONFIG_LEDS_PCA9532=y
> CONFIG_LEDS_PCA9532_GPIO=y
> # CONFIG_LEDS_GPIO is not set
> # CONFIG_LEDS_LP3944 is not set
> # CONFIG_LEDS_LP5521 is not set
> CONFIG_LEDS_LP5523=y
> # CONFIG_LEDS_CLEVO_MAIL is not set
> # CONFIG_LEDS_PCA955X is not set
> CONFIG_LEDS_WM831X_STATUS=y
> CONFIG_LEDS_WM8350=y
> # CONFIG_LEDS_DAC124S085 is not set
> CONFIG_LEDS_REGULATOR=y
> CONFIG_LEDS_BD2802=y
> CONFIG_LEDS_INTEL_SS4200=y
> # CONFIG_LEDS_LT3593 is not set
> CONFIG_LEDS_TCA6507=y
> # CONFIG_LEDS_TRIGGERS is not set
> 
> #
> # LED Triggers
> #
> CONFIG_ACCESSIBILITY=y
> CONFIG_A11Y_BRAILLE_CONSOLE=y
> # CONFIG_INFINIBAND is not set
> # CONFIG_EDAC is not set
> CONFIG_RTC_LIB=y
> CONFIG_RTC_CLASS=y
> # CONFIG_RTC_HCTOSYS is not set
> CONFIG_RTC_DEBUG=y
> 
> #
> # RTC interfaces
> #
> CONFIG_RTC_INTF_SYSFS=y
> # CONFIG_RTC_INTF_PROC is not set
> # CONFIG_RTC_INTF_DEV is not set
> CONFIG_RTC_DRV_TEST=y
> 
> #
> # I2C RTC drivers
> #
> CONFIG_RTC_DRV_88PM860X=y
> CONFIG_RTC_DRV_DS1307=y
> CONFIG_RTC_DRV_DS1374=y
> # CONFIG_RTC_DRV_DS1672 is not set
> # CONFIG_RTC_DRV_DS3232 is not set
> CONFIG_RTC_DRV_MAX6900=y
> CONFIG_RTC_DRV_MAX8998=y
> # CONFIG_RTC_DRV_RS5C372 is not set
> CONFIG_RTC_DRV_ISL1208=y
> # CONFIG_RTC_DRV_ISL12022 is not set
> CONFIG_RTC_DRV_X1205=y
> CONFIG_RTC_DRV_PCF8563=y
> # CONFIG_RTC_DRV_PCF8583 is not set
> CONFIG_RTC_DRV_M41T80=y
> # CONFIG_RTC_DRV_M41T80_WDT is not set
> CONFIG_RTC_DRV_BQ32K=y
> CONFIG_RTC_DRV_S35390A=y
> # CONFIG_RTC_DRV_FM3130 is not set
> # CONFIG_RTC_DRV_RX8581 is not set
> # CONFIG_RTC_DRV_RX8025 is not set
> # CONFIG_RTC_DRV_EM3027 is not set
> # CONFIG_RTC_DRV_RV3029C2 is not set
> 
> #
> # SPI RTC drivers
> #
> # CONFIG_RTC_DRV_M41T93 is not set
> # CONFIG_RTC_DRV_M41T94 is not set
> # CONFIG_RTC_DRV_DS1305 is not set
> CONFIG_RTC_DRV_DS1390=y
> CONFIG_RTC_DRV_MAX6902=y
> # CONFIG_RTC_DRV_R9701 is not set
> # CONFIG_RTC_DRV_RS5C348 is not set
> CONFIG_RTC_DRV_DS3234=y
> CONFIG_RTC_DRV_PCF2123=y
> 
> #
> # Platform RTC drivers
> #
> CONFIG_RTC_DRV_CMOS=y
> # CONFIG_RTC_DRV_DS1286 is not set
> CONFIG_RTC_DRV_DS1511=y
> CONFIG_RTC_DRV_DS1553=y
> # CONFIG_RTC_DRV_DS1742 is not set
> CONFIG_RTC_DRV_STK17TA8=y
> CONFIG_RTC_DRV_M48T86=y
> CONFIG_RTC_DRV_M48T35=y
> CONFIG_RTC_DRV_M48T59=y
> # CONFIG_RTC_DRV_MSM6242 is not set
> # CONFIG_RTC_DRV_BQ4802 is not set
> CONFIG_RTC_DRV_RP5C01=y
> CONFIG_RTC_DRV_V3020=y
> CONFIG_RTC_DRV_WM831X=y
> # CONFIG_RTC_DRV_WM8350 is not set
> 
> #
> # on-CPU RTC drivers
> #
> CONFIG_RTC_DRV_PCAP=y
> CONFIG_DMADEVICES=y
> CONFIG_DMADEVICES_DEBUG=y
> # CONFIG_DMADEVICES_VDEBUG is not set
> 
> #
> # DMA Devices
> #
> # CONFIG_INTEL_MID_DMAC is not set
> # CONFIG_INTEL_IOATDMA is not set
> # CONFIG_TIMB_DMA is not set
> # CONFIG_PCH_DMA is not set
> # CONFIG_AUXDISPLAY is not set
> CONFIG_UIO=y
> # CONFIG_UIO_CIF is not set
> CONFIG_UIO_PDRV=y
> # CONFIG_UIO_PDRV_GENIRQ is not set
> CONFIG_UIO_AEC=y
> CONFIG_UIO_SERCOS3=y
> CONFIG_UIO_PCI_GENERIC=y
> CONFIG_UIO_NETX=y
> CONFIG_VIRTIO=y
> CONFIG_VIRTIO_RING=y
> 
> #
> # Virtio drivers
> #
> # CONFIG_VIRTIO_PCI is not set
> # CONFIG_VIRTIO_BALLOON is not set
> CONFIG_VIRTIO_MMIO=y
> 
> #
> # Microsoft Hyper-V guest support
> #
> # CONFIG_HYPERV is not set
> 
> #
> # Xen driver support
> #
> # CONFIG_XEN_BALLOON is not set
> # CONFIG_XEN_DEV_EVTCHN is not set
> CONFIG_XEN_BACKEND=y
> # CONFIG_XENFS is not set
> CONFIG_XEN_SYS_HYPERVISOR=y
> CONFIG_XEN_XENBUS_FRONTEND=y
> CONFIG_XEN_GNTDEV=y
> # CONFIG_XEN_GRANT_DEV_ALLOC is not set
> CONFIG_SWIOTLB_XEN=y
> CONFIG_XEN_TMEM=y
> # CONFIG_XEN_PCIDEV_BACKEND is not set
> CONFIG_XEN_PRIVCMD=y
> # CONFIG_STAGING is not set
> CONFIG_X86_PLATFORM_DEVICES=y
> # CONFIG_ACERHDF is not set
> CONFIG_DELL_LAPTOP=y
> # CONFIG_FUJITSU_LAPTOP is not set
> # CONFIG_HP_ACCEL is not set
> CONFIG_PANASONIC_LAPTOP=y
> # CONFIG_THINKPAD_ACPI is not set
> # CONFIG_SENSORS_HDAPS is not set
> CONFIG_EEEPC_LAPTOP=y
> # CONFIG_ACPI_WMI is not set
> CONFIG_ACPI_ASUS=y
> # CONFIG_TOPSTAR_LAPTOP is not set
> # CONFIG_ACPI_TOSHIBA is not set
> CONFIG_TOSHIBA_BT_RFKILL=y
> CONFIG_ACPI_CMPC=y
> # CONFIG_INTEL_IPS is not set
> CONFIG_IBM_RTL=y
> # CONFIG_XO15_EBOOK is not set
> CONFIG_SAMSUNG_Q10=y
> 
> #
> # Hardware Spinlock drivers
> #
> CONFIG_CLKEVT_I8253=y
> CONFIG_I8253_LOCK=y
> CONFIG_CLKBLD_I8253=y
> CONFIG_IOMMU_SUPPORT=y
> # CONFIG_AMD_IOMMU is not set
> CONFIG_VIRT_DRIVERS=y
> # CONFIG_PM_DEVFREQ is not set
> # CONFIG_XSHM is not set
> 
> #
> # Firmware Drivers
> #
> # CONFIG_EDD is not set
> CONFIG_FIRMWARE_MEMMAP=y
> CONFIG_EFI_VARS=y
> # CONFIG_DELL_RBU is not set
> CONFIG_DCDBAS=y
> # CONFIG_DMIID is not set
> # CONFIG_DMI_SYSFS is not set
> CONFIG_ISCSI_IBFT_FIND=y
> # CONFIG_ISCSI_IBFT is not set
> CONFIG_GOOGLE_FIRMWARE=y
> 
> #
> # Google Firmware Drivers
> #
> CONFIG_GOOGLE_SMI=y
> # CONFIG_GOOGLE_MEMCONSOLE is not set
> 
> #
> # File systems
> #
> CONFIG_EXT2_FS=y
> CONFIG_EXT2_FS_XATTR=y
> CONFIG_EXT2_FS_POSIX_ACL=y
> # CONFIG_EXT2_FS_SECURITY is not set
> CONFIG_EXT2_FS_XIP=y
> # CONFIG_EXT3_FS is not set
> # CONFIG_EXT4_FS is not set
> CONFIG_FS_XIP=y
> CONFIG_FS_MBCACHE=y
> # CONFIG_REISERFS_FS is not set
> # CONFIG_JFS_FS is not set
> CONFIG_XFS_FS=y
> CONFIG_XFS_QUOTA=y
> CONFIG_XFS_POSIX_ACL=y
> # CONFIG_XFS_RT is not set
> CONFIG_XFS_DEBUG=y
> # CONFIG_GFS2_FS is not set
> # CONFIG_OCFS2_FS is not set
> # CONFIG_BTRFS_FS is not set
> # CONFIG_NILFS2_FS is not set
> CONFIG_FS_POSIX_ACL=y
> CONFIG_EXPORTFS=y
> CONFIG_FILE_LOCKING=y
> CONFIG_FSNOTIFY=y
> CONFIG_DNOTIFY=y
> # CONFIG_INOTIFY_USER is not set
> # CONFIG_FANOTIFY is not set
> CONFIG_QUOTA=y
> # CONFIG_QUOTA_NETLINK_INTERFACE is not set
> # CONFIG_PRINT_QUOTA_WARNING is not set
> CONFIG_QUOTA_DEBUG=y
> CONFIG_QUOTA_TREE=y
> CONFIG_QFMT_V1=y
> CONFIG_QFMT_V2=y
> CONFIG_QUOTACTL=y
> CONFIG_QUOTACTL_COMPAT=y
> CONFIG_AUTOFS4_FS=y
> # CONFIG_FUSE_FS is not set
> 
> #
> # Caches
> #
> # CONFIG_FSCACHE is not set
> 
> #
> # CD-ROM/DVD Filesystems
> #
> CONFIG_ISO9660_FS=y
> CONFIG_JOLIET=y
> # CONFIG_ZISOFS is not set
> CONFIG_UDF_FS=y
> CONFIG_UDF_NLS=y
> 
> #
> # DOS/FAT/NT Filesystems
> #
> CONFIG_FAT_FS=y
> CONFIG_MSDOS_FS=y
> CONFIG_VFAT_FS=y
> CONFIG_FAT_DEFAULT_CODEPAGE=437
> CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
> CONFIG_NTFS_FS=y
> # CONFIG_NTFS_DEBUG is not set
> CONFIG_NTFS_RW=y
> 
> #
> # Pseudo filesystems
> #
> CONFIG_PROC_FS=y
> CONFIG_PROC_KCORE=y
> CONFIG_PROC_SYSCTL=y
> CONFIG_PROC_PAGE_MONITOR=y
> CONFIG_SYSFS=y
> CONFIG_TMPFS=y
> # CONFIG_TMPFS_POSIX_ACL is not set
> # CONFIG_TMPFS_XATTR is not set
> # CONFIG_HUGETLBFS is not set
> # CONFIG_HUGETLB_PAGE is not set
> CONFIG_CONFIGFS_FS=y
> CONFIG_MISC_FILESYSTEMS=y
> # CONFIG_ADFS_FS is not set
> CONFIG_AFFS_FS=y
> CONFIG_ECRYPT_FS=y
> CONFIG_HFS_FS=y
> # CONFIG_HFSPLUS_FS is not set
> # CONFIG_BEFS_FS is not set
> # CONFIG_BFS_FS is not set
> # CONFIG_EFS_FS is not set
> # CONFIG_JFFS2_FS is not set
> CONFIG_UBIFS_FS=y
> # CONFIG_UBIFS_FS_XATTR is not set
> # CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
> CONFIG_UBIFS_FS_LZO=y
> CONFIG_UBIFS_FS_ZLIB=y
> CONFIG_UBIFS_FS_DEBUG=y
> # CONFIG_LOGFS is not set
> CONFIG_CRAMFS=y
> # CONFIG_SQUASHFS is not set
> # CONFIG_VXFS_FS is not set
> CONFIG_MINIX_FS=y
> # CONFIG_OMFS_FS is not set
> # CONFIG_HPFS_FS is not set
> CONFIG_QNX4FS_FS=y
> # CONFIG_ROMFS_FS is not set
> CONFIG_PSTORE=y
> # CONFIG_SYSV_FS is not set
> CONFIG_UFS_FS=y
> CONFIG_UFS_FS_WRITE=y
> CONFIG_UFS_DEBUG=y
> CONFIG_ORE=y
> CONFIG_EXOFS_FS=y
> CONFIG_EXOFS_DEBUG=y
> # CONFIG_NETWORK_FILESYSTEMS is not set
> 
> #
> # Partition Types
> #
> CONFIG_PARTITION_ADVANCED=y
> CONFIG_ACORN_PARTITION=y
> CONFIG_ACORN_PARTITION_CUMANA=y
> # CONFIG_ACORN_PARTITION_EESOX is not set
> # CONFIG_ACORN_PARTITION_ICS is not set
> CONFIG_ACORN_PARTITION_ADFS=y
> CONFIG_ACORN_PARTITION_POWERTEC=y
> # CONFIG_ACORN_PARTITION_RISCIX is not set
> CONFIG_OSF_PARTITION=y
> CONFIG_AMIGA_PARTITION=y
> CONFIG_ATARI_PARTITION=y
> CONFIG_MAC_PARTITION=y
> CONFIG_MSDOS_PARTITION=y
> # CONFIG_BSD_DISKLABEL is not set
> CONFIG_MINIX_SUBPARTITION=y
> # CONFIG_SOLARIS_X86_PARTITION is not set
> CONFIG_UNIXWARE_DISKLABEL=y
> # CONFIG_LDM_PARTITION is not set
> CONFIG_SGI_PARTITION=y
> # CONFIG_ULTRIX_PARTITION is not set
> # CONFIG_SUN_PARTITION is not set
> CONFIG_KARMA_PARTITION=y
> CONFIG_EFI_PARTITION=y
> # CONFIG_SYSV68_PARTITION is not set
> CONFIG_NLS=y
> CONFIG_NLS_DEFAULT="iso8859-1"
> # CONFIG_NLS_CODEPAGE_437 is not set
> CONFIG_NLS_CODEPAGE_737=y
> CONFIG_NLS_CODEPAGE_775=y
> # CONFIG_NLS_CODEPAGE_850 is not set
> # CONFIG_NLS_CODEPAGE_852 is not set
> # CONFIG_NLS_CODEPAGE_855 is not set
> CONFIG_NLS_CODEPAGE_857=y
> CONFIG_NLS_CODEPAGE_860=y
> CONFIG_NLS_CODEPAGE_861=y
> CONFIG_NLS_CODEPAGE_862=y
> # CONFIG_NLS_CODEPAGE_863 is not set
> # CONFIG_NLS_CODEPAGE_864 is not set
> # CONFIG_NLS_CODEPAGE_865 is not set
> CONFIG_NLS_CODEPAGE_866=y
> CONFIG_NLS_CODEPAGE_869=y
> # CONFIG_NLS_CODEPAGE_936 is not set
> # CONFIG_NLS_CODEPAGE_950 is not set
> # CONFIG_NLS_CODEPAGE_932 is not set
> # CONFIG_NLS_CODEPAGE_949 is not set
> # CONFIG_NLS_CODEPAGE_874 is not set
> CONFIG_NLS_ISO8859_8=y
> # CONFIG_NLS_CODEPAGE_1250 is not set
> CONFIG_NLS_CODEPAGE_1251=y
> # CONFIG_NLS_ASCII is not set
> # CONFIG_NLS_ISO8859_1 is not set
> CONFIG_NLS_ISO8859_2=y
> # CONFIG_NLS_ISO8859_3 is not set
> # CONFIG_NLS_ISO8859_4 is not set
> CONFIG_NLS_ISO8859_5=y
> CONFIG_NLS_ISO8859_6=y
> CONFIG_NLS_ISO8859_7=y
> # CONFIG_NLS_ISO8859_9 is not set
> # CONFIG_NLS_ISO8859_13 is not set
> # CONFIG_NLS_ISO8859_14 is not set
> CONFIG_NLS_ISO8859_15=y
> CONFIG_NLS_KOI8_R=y
> # CONFIG_NLS_KOI8_U is not set
> CONFIG_NLS_UTF8=y
> 
> #
> # Kernel hacking
> #
> CONFIG_TRACE_IRQFLAGS_SUPPORT=y
> CONFIG_PRINTK_TIME=y
> CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
> CONFIG_ENABLE_WARN_DEPRECATED=y
> CONFIG_ENABLE_MUST_CHECK=y
> CONFIG_FRAME_WARN=2048
> CONFIG_MAGIC_SYSRQ=y
> CONFIG_STRIP_ASM_SYMS=y
> CONFIG_UNUSED_SYMBOLS=y
> CONFIG_DEBUG_FS=y
> # CONFIG_HEADERS_CHECK is not set
> CONFIG_DEBUG_SECTION_MISMATCH=y
> CONFIG_DEBUG_KERNEL=y
> # CONFIG_DEBUG_SHIRQ is not set
> # CONFIG_LOCKUP_DETECTOR is not set
> # CONFIG_HARDLOCKUP_DETECTOR is not set
> CONFIG_DETECT_HUNG_TASK=y
> CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
> # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
> CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
> CONFIG_SCHED_DEBUG=y
> CONFIG_SCHEDSTATS=y
> # CONFIG_TIMER_STATS is not set
> CONFIG_DEBUG_OBJECTS=y
> CONFIG_DEBUG_OBJECTS_SELFTEST=y
> CONFIG_DEBUG_OBJECTS_FREE=y
> # CONFIG_DEBUG_OBJECTS_TIMERS is not set
> # CONFIG_DEBUG_OBJECTS_WORK is not set
> # CONFIG_DEBUG_OBJECTS_RCU_HEAD is not set
> # CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set
> CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
> # CONFIG_SLUB_DEBUG_ON is not set
> # CONFIG_SLUB_STATS is not set
> # CONFIG_DEBUG_KMEMLEAK is not set
> CONFIG_DEBUG_PREEMPT=y
> CONFIG_DEBUG_RT_MUTEXES=y
> CONFIG_DEBUG_PI_LIST=y
> # CONFIG_RT_MUTEX_TESTER is not set
> CONFIG_DEBUG_SPINLOCK=y
> CONFIG_DEBUG_MUTEXES=y
> # CONFIG_DEBUG_LOCK_ALLOC is not set
> # CONFIG_PROVE_LOCKING is not set
> CONFIG_SPARSE_RCU_POINTER=y
> # CONFIG_LOCK_STAT is not set
> CONFIG_TRACE_IRQFLAGS=y
> # CONFIG_DEBUG_ATOMIC_SLEEP is not set
> CONFIG_DEBUG_LOCKING_API_SELFTESTS=y
> CONFIG_STACKTRACE=y
> # CONFIG_DEBUG_STACK_USAGE is not set
> CONFIG_DEBUG_KOBJECT=y
> CONFIG_DEBUG_BUGVERBOSE=y
> # CONFIG_DEBUG_INFO is not set
> # CONFIG_DEBUG_VM is not set
> # CONFIG_DEBUG_VIRTUAL is not set
> CONFIG_DEBUG_WRITECOUNT=y
> CONFIG_DEBUG_MEMORY_INIT=y
> CONFIG_DEBUG_LIST=y
> CONFIG_TEST_LIST_SORT=y
> CONFIG_DEBUG_SG=y
> # CONFIG_DEBUG_NOTIFIERS is not set
> # CONFIG_DEBUG_CREDENTIALS is not set
> CONFIG_ARCH_WANT_FRAME_POINTERS=y
> CONFIG_FRAME_POINTER=y
> # CONFIG_BOOT_PRINTK_DELAY is not set
> CONFIG_RCU_TORTURE_TEST=y
> # CONFIG_RCU_TORTURE_TEST_RUNNABLE is not set
> CONFIG_BACKTRACE_SELF_TEST=y
> # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
> # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
> CONFIG_LKDTM=y
> CONFIG_FAULT_INJECTION=y
> # CONFIG_FAILSLAB is not set
> # CONFIG_FAIL_PAGE_ALLOC is not set
> CONFIG_FAIL_MAKE_REQUEST=y
> CONFIG_FAIL_IO_TIMEOUT=y
> CONFIG_FAULT_INJECTION_DEBUG_FS=y
> # CONFIG_LATENCYTOP is not set
> # CONFIG_SYSCTL_SYSCALL_CHECK is not set
> # CONFIG_DEBUG_PAGEALLOC is not set
> CONFIG_USER_STACKTRACE_SUPPORT=y
> CONFIG_NOP_TRACER=y
> CONFIG_HAVE_FTRACE_NMI_ENTER=y
> CONFIG_HAVE_FUNCTION_TRACER=y
> CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
> CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
> CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
> CONFIG_HAVE_DYNAMIC_FTRACE=y
> CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
> CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
> CONFIG_HAVE_C_RECORDMCOUNT=y
> CONFIG_TRACER_MAX_TRACE=y
> CONFIG_RING_BUFFER=y
> CONFIG_FTRACE_NMI_ENTER=y
> CONFIG_EVENT_TRACING=y
> CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
> CONFIG_CONTEXT_SWITCH_TRACER=y
> CONFIG_RING_BUFFER_ALLOW_SWAP=y
> CONFIG_TRACING=y
> CONFIG_GENERIC_TRACER=y
> CONFIG_TRACING_SUPPORT=y
> CONFIG_FTRACE=y
> CONFIG_FUNCTION_TRACER=y
> # CONFIG_FUNCTION_GRAPH_TRACER is not set
> CONFIG_IRQSOFF_TRACER=y
> CONFIG_PREEMPT_TRACER=y
> CONFIG_SCHED_TRACER=y
> # CONFIG_FTRACE_SYSCALLS is not set
> CONFIG_BRANCH_PROFILE_NONE=y
> # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
> # CONFIG_PROFILE_ALL_BRANCHES is not set
> # CONFIG_STACK_TRACER is not set
> # CONFIG_BLK_DEV_IO_TRACE is not set
> CONFIG_UPROBE_EVENT=y
> CONFIG_PROBE_EVENTS=y
> CONFIG_DYNAMIC_FTRACE=y
> CONFIG_FUNCTION_PROFILER=y
> CONFIG_FTRACE_MCOUNT_RECORD=y
> # CONFIG_FTRACE_STARTUP_TEST is not set
> # CONFIG_MMIOTRACE is not set
> # CONFIG_RING_BUFFER_BENCHMARK is not set
> CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
> # CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set
> CONFIG_DYNAMIC_DEBUG=y
> CONFIG_DMA_API_DEBUG=y
> CONFIG_ATOMIC64_SELFTEST=y
> CONFIG_SAMPLES=y
> CONFIG_HAVE_ARCH_KGDB=y
> CONFIG_KGDB=y
> CONFIG_KGDB_SERIAL_CONSOLE=y
> # CONFIG_KGDB_TESTS is not set
> # CONFIG_KGDB_LOW_LEVEL_TRAP is not set
> # CONFIG_KGDB_KDB is not set
> CONFIG_HAVE_ARCH_KMEMCHECK=y
> CONFIG_TEST_KSTRTOX=y
> # CONFIG_STRICT_DEVMEM is not set
> CONFIG_X86_VERBOSE_BOOTUP=y
> CONFIG_EARLY_PRINTK=y
> # CONFIG_EARLY_PRINTK_DBGP is not set
> CONFIG_DEBUG_STACKOVERFLOW=y
> CONFIG_X86_PTDUMP=y
> CONFIG_DEBUG_RODATA=y
> CONFIG_DEBUG_RODATA_TEST=y
> CONFIG_IOMMU_DEBUG=y
> # CONFIG_IOMMU_STRESS is not set
> CONFIG_IOMMU_LEAK=y
> CONFIG_HAVE_MMIOTRACE_SUPPORT=y
> CONFIG_IO_DELAY_TYPE_0X80=0
> CONFIG_IO_DELAY_TYPE_0XED=1
> CONFIG_IO_DELAY_TYPE_UDELAY=2
> CONFIG_IO_DELAY_TYPE_NONE=3
> # CONFIG_IO_DELAY_0X80 is not set
> # CONFIG_IO_DELAY_0XED is not set
> # CONFIG_IO_DELAY_UDELAY is not set
> CONFIG_IO_DELAY_NONE=y
> CONFIG_DEFAULT_IO_DELAY_TYPE=3
> CONFIG_DEBUG_BOOT_PARAMS=y
> CONFIG_CPA_DEBUG=y
> CONFIG_OPTIMIZE_INLINING=y
> # CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
> CONFIG_DEBUG_NMI_SELFTEST=y
> 
> #
> # Security options
> #
> CONFIG_KEYS=y
> CONFIG_ENCRYPTED_KEYS=y
> # CONFIG_KEYS_DEBUG_PROC_KEYS is not set
> # CONFIG_SECURITY_DMESG_RESTRICT is not set
> # CONFIG_SECURITY is not set
> CONFIG_SECURITYFS=y
> CONFIG_DEFAULT_SECURITY_DAC=y
> CONFIG_DEFAULT_SECURITY=""
> CONFIG_XOR_BLOCKS=y
> CONFIG_ASYNC_CORE=y
> CONFIG_ASYNC_XOR=y
> CONFIG_CRYPTO=y
> 
> #
> # Crypto core or helper
> #
> # CONFIG_CRYPTO_FIPS is not set
> CONFIG_CRYPTO_ALGAPI=y
> CONFIG_CRYPTO_ALGAPI2=y
> CONFIG_CRYPTO_AEAD=y
> CONFIG_CRYPTO_AEAD2=y
> CONFIG_CRYPTO_BLKCIPHER=y
> CONFIG_CRYPTO_BLKCIPHER2=y
> CONFIG_CRYPTO_HASH=y
> CONFIG_CRYPTO_HASH2=y
> CONFIG_CRYPTO_RNG=y
> CONFIG_CRYPTO_RNG2=y
> CONFIG_CRYPTO_PCOMP2=y
> CONFIG_CRYPTO_MANAGER=y
> CONFIG_CRYPTO_MANAGER2=y
> # CONFIG_CRYPTO_USER is not set
> # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
> CONFIG_CRYPTO_GF128MUL=y
> CONFIG_CRYPTO_NULL=y
> CONFIG_CRYPTO_WORKQUEUE=y
> CONFIG_CRYPTO_CRYPTD=y
> CONFIG_CRYPTO_AUTHENC=y
> 
> #
> # Authenticated Encryption with Associated Data
> #
> # CONFIG_CRYPTO_CCM is not set
> # CONFIG_CRYPTO_GCM is not set
> CONFIG_CRYPTO_SEQIV=y
> 
> #
> # Block modes
> #
> CONFIG_CRYPTO_CBC=y
> # CONFIG_CRYPTO_CTR is not set
> # CONFIG_CRYPTO_CTS is not set
> CONFIG_CRYPTO_ECB=y
> CONFIG_CRYPTO_LRW=y
> CONFIG_CRYPTO_PCBC=y
> CONFIG_CRYPTO_XTS=y
> 
> #
> # Hash modes
> #
> CONFIG_CRYPTO_HMAC=y
> CONFIG_CRYPTO_XCBC=y
> CONFIG_CRYPTO_VMAC=y
> 
> #
> # Digest
> #
> CONFIG_CRYPTO_CRC32C=y
> CONFIG_CRYPTO_CRC32C_INTEL=y
> CONFIG_CRYPTO_GHASH=y
> # CONFIG_CRYPTO_MD4 is not set
> CONFIG_CRYPTO_MD5=y
> # CONFIG_CRYPTO_MICHAEL_MIC is not set
> CONFIG_CRYPTO_RMD128=y
> CONFIG_CRYPTO_RMD160=y
> CONFIG_CRYPTO_RMD256=y
> # CONFIG_CRYPTO_RMD320 is not set
> CONFIG_CRYPTO_SHA1=y
> # CONFIG_CRYPTO_SHA1_SSSE3 is not set
> CONFIG_CRYPTO_SHA256=y
> CONFIG_CRYPTO_SHA512=y
> CONFIG_CRYPTO_TGR192=y
> CONFIG_CRYPTO_WP512=y
> # CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set
> 
> #
> # Ciphers
> #
> CONFIG_CRYPTO_AES=y
> CONFIG_CRYPTO_AES_X86_64=y
> # CONFIG_CRYPTO_AES_NI_INTEL is not set
> CONFIG_CRYPTO_ANUBIS=y
> # CONFIG_CRYPTO_ARC4 is not set
> CONFIG_CRYPTO_BLOWFISH=y
> CONFIG_CRYPTO_BLOWFISH_COMMON=y
> CONFIG_CRYPTO_BLOWFISH_X86_64=y
> CONFIG_CRYPTO_CAMELLIA=y
> # CONFIG_CRYPTO_CAST5 is not set
> CONFIG_CRYPTO_CAST6=y
> CONFIG_CRYPTO_DES=y
> CONFIG_CRYPTO_FCRYPT=y
> # CONFIG_CRYPTO_KHAZAD is not set
> # CONFIG_CRYPTO_SALSA20 is not set
> # CONFIG_CRYPTO_SALSA20_X86_64 is not set
> # CONFIG_CRYPTO_SEED is not set
> CONFIG_CRYPTO_SERPENT=y
> CONFIG_CRYPTO_SERPENT_SSE2_X86_64=y
> CONFIG_CRYPTO_TEA=y
> # CONFIG_CRYPTO_TWOFISH is not set
> CONFIG_CRYPTO_TWOFISH_COMMON=y
> CONFIG_CRYPTO_TWOFISH_X86_64=y
> # CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set
> 
> #
> # Compression
> #
> CONFIG_CRYPTO_DEFLATE=y
> # CONFIG_CRYPTO_ZLIB is not set
> CONFIG_CRYPTO_LZO=y
> 
> #
> # Random Number Generation
> #
> CONFIG_CRYPTO_ANSI_CPRNG=y
> CONFIG_CRYPTO_USER_API=y
> CONFIG_CRYPTO_USER_API_HASH=y
> CONFIG_CRYPTO_USER_API_SKCIPHER=y
> CONFIG_CRYPTO_HW=y
> CONFIG_CRYPTO_DEV_PADLOCK=y
> # CONFIG_CRYPTO_DEV_PADLOCK_AES is not set
> # CONFIG_CRYPTO_DEV_PADLOCK_SHA is not set
> CONFIG_HAVE_KVM=y
> CONFIG_HAVE_KVM_IRQCHIP=y
> CONFIG_HAVE_KVM_EVENTFD=y
> CONFIG_KVM_APIC_ARCHITECTURE=y
> CONFIG_KVM_MMIO=y
> CONFIG_KVM_ASYNC_PF=y
> CONFIG_VIRTUALIZATION=y
> CONFIG_KVM=y
> CONFIG_KVM_INTEL=y
> # CONFIG_KVM_AMD is not set
> # CONFIG_KVM_MMU_AUDIT is not set
> CONFIG_VHOST_NET=y
> CONFIG_BINARY_PRINTF=y
> 
> #
> # Library routines
> #
> CONFIG_BITREVERSE=y
> CONFIG_GENERIC_FIND_FIRST_BIT=y
> CONFIG_GENERIC_PCI_IOMAP=y
> CONFIG_GENERIC_IOMAP=y
> CONFIG_CRC_CCITT=y
> CONFIG_CRC16=y
> CONFIG_CRC_T10DIF=y
> CONFIG_CRC_ITU_T=y
> CONFIG_CRC32=y
> CONFIG_CRC7=y
> CONFIG_LIBCRC32C=y
> CONFIG_CRC8=y
> CONFIG_ZLIB_INFLATE=y
> CONFIG_ZLIB_DEFLATE=y
> CONFIG_LZO_COMPRESS=y
> CONFIG_LZO_DECOMPRESS=y
> CONFIG_XZ_DEC=y
> CONFIG_XZ_DEC_X86=y
> CONFIG_XZ_DEC_POWERPC=y
> CONFIG_XZ_DEC_IA64=y
> CONFIG_XZ_DEC_ARM=y
> CONFIG_XZ_DEC_ARMTHUMB=y
> CONFIG_XZ_DEC_SPARC=y
> CONFIG_XZ_DEC_BCJ=y
> # CONFIG_XZ_DEC_TEST is not set
> CONFIG_DECOMPRESS_GZIP=y
> CONFIG_DECOMPRESS_BZIP2=y
> CONFIG_DECOMPRESS_LZMA=y
> CONFIG_DECOMPRESS_XZ=y
> CONFIG_DECOMPRESS_LZO=y
> CONFIG_BCH=y
> CONFIG_BCH_CONST_PARAMS=y
> CONFIG_TEXTSEARCH=y
> CONFIG_TEXTSEARCH_KMP=y
> CONFIG_TEXTSEARCH_BM=y
> CONFIG_TEXTSEARCH_FSM=y
> CONFIG_HAS_IOMEM=y
> CONFIG_HAS_IOPORT=y
> CONFIG_HAS_DMA=y
> CONFIG_CHECK_SIGNATURE=y
> CONFIG_DQL=y
> CONFIG_NLATTR=y
> CONFIG_AVERAGE=y
> # CONFIG_CORDIC is not set
> CONFIG_MPILIB=y
> CONFIG_MPILIB_EXTRA=y
> # CONFIG_DIGSIG is not set


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-users-bounces@lists.xensource.com Fri Dec 30 11:24:46 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Fri, 30 Dec 2011 11:24:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-users-bounces@lists.xensource.com>)
	id 1RgaYY-00030Y-O8; Fri, 30 Dec 2011 11:23:26 +0000
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabian.zimmermann@z-technologies.de>)
	id 1RgaYW-00030G-8d
	for xen-users@lists.xensource.com; Fri, 30 Dec 2011 11:23:25 +0000
X-Env-Sender: fabian.zimmermann@z-technologies.de
X-Msg-Ref: server-11.tower-174.messagelabs.com!1325244191!7303619!1
X-Originating-IP: [209.85.216.171]
X-SpamReason: No, hits=0.8 required=7.0 tests=BODY_RANDOM_LONG,
  RCVD_BY_IP
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31878 invoked from network); 30 Dec 2011 11:23:12 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Dec 2011 11:23:12 -0000
Received: by qcsc20 with SMTP id c20so100421220qcs.30
	for <xen-users@lists.xensource.com>;
	Fri, 30 Dec 2011 03:23:11 -0800 (PST)
MIME-Version: 1.0
Received: by 10.229.106.152 with SMTP id x24mr14354755qco.2.1325244190923;
	Fri, 30 Dec 2011 03:23:10 -0800 (PST)
Received: by 10.229.83.210 with HTTP; Fri, 30 Dec 2011 03:23:10 -0800 (PST)
X-Originating-IP: [188.193.203.2]
In-Reply-To: <CAGCZ820dS2VJ0GE3MiZW3cZ_c-g=e4G1gtC976RZoBuB8tPocA@mail.gmail.com>
References: <CAGCZ821mxYKANLGhQ+A51d95kU+oBOmET4Q4RPbKp8K6-jfkNw@mail.gmail.com>
	<CAFivhPnywxUPBt+todTvWb70JWPH4D3VMr_CXvs_o9XSTpB3_Q@mail.gmail.com>
	<CAGCZ821z-_NdQtupF1ayy2q1N=bmzVUqoM0BPeG_PYJRtUvQ7g@mail.gmail.com>
	<CAGnmK4y5XxNxArtdk+=N-t+JQyS5rwoXEOrVYn6g+THhRBQmZg@mail.gmail.com>
	<CAGCZ820dS2VJ0GE3MiZW3cZ_c-g=e4G1gtC976RZoBuB8tPocA@mail.gmail.com>
Date: Fri, 30 Dec 2011 12:23:10 +0100
X-Google-Sender-Auth: coNzFeOO7nedKv-mXE4rehBZO0A
Message-ID: <CAGCZ822KReLPEVzcP4FmoMZOSdMr-NUi-St_W7PB-WNtsw0FUw@mail.gmail.com>
From: Fabian Zimmermann <xenusers@z-technologies.de>
To: xen-users@lists.xensource.com
Content-Type: multipart/mixed; boundary=0022158c0eed3d9c4704b54d7560
Subject: Re: [Xen-users] Xen is 37x slower in processing a loop
X-BeenThere: xen-users@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen user discussion <xen-users.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-users@lists.xensource.com>
List-Help: <mailto:xen-users-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-users>,
	<mailto:xen-users-request@lists.xensource.com?subject=subscribe>
Sender: xen-users-bounces@lists.xensource.com
Errors-To: xen-users-bounces@lists.xensource.com

--0022158c0eed3d9c4704b54d7560
Content-Type: text/plain; charset=UTF-8

Hello,

here my dmesg-logs. Maybe somebody is able to give me a hint?

Thanks a lot,

Fabian Zimmermann

--0022158c0eed3d9c4704b54d7560
Content-Type: text/plain; charset=US-ASCII; name="dmesg.2011-12-30.txt"
Content-Disposition: attachment; filename="dmesg.2011-12-30.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gwt44s7t0

WyAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1c2V0ClsgICAgMC4w
MDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdQpbICAgIDAuMDAwMDAwXSBMaW51
eCB2ZXJzaW9uIDIuNi4zMi01LXhlbi1hbWQ2NCAoRGViaWFuIDIuNi4zMi00MCkgKGRhbm5mQGRl
Ymlhbi5vcmcpIChnY2MgdmVyc2lvbiA0LjMuNSAoRGViaWFuIDQuMy41LTQpICkgIzEgU01QIEZy
aSBEZWMgMjMgMjM6MDk6NTkgVVRDIDIwMTEKWyAgICAwLjAwMDAwMF0gQ29tbWFuZCBsaW5lOiBw
bGFjZWhvbGRlciByb290PS9kZXYvbWFwcGVyL3ZnYmx1ZS1ibHVlcm9vdCBybwpbICAgIDAuMDAw
MDAwXSBLRVJORUwgc3VwcG9ydGVkIGNwdXM6ClsgICAgMC4wMDAwMDBdICAgSW50ZWwgR2VudWlu
ZUludGVsClsgICAgMC4wMDAwMDBdICAgQU1EIEF1dGhlbnRpY0FNRApbICAgIDAuMDAwMDAwXSAg
IENlbnRhdXIgQ2VudGF1ckhhdWxzClsgICAgMC4wMDAwMDBdIHJlbGVhc2VkIDAgcGFnZXMgb2Yg
dW51c2VkIG1lbW9yeQpbICAgIDAuMDAwMDAwXSBCSU9TLXByb3ZpZGVkIHBoeXNpY2FsIFJBTSBt
YXA6ClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDAwMDlm
MDAwICh1c2FibGUpClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwMDAwOWYwMDAgLSAwMDAw
MDAwMDAwMTAwMDAwIChyZXNlcnZlZCkKWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDAwMDEw
MDAwMCAtIDAwMDAwMDAwNDAwMDAwMDAgKHVzYWJsZSkKWyAgICAwLjAwMDAwMF0gIFhlbjogMDAw
MDAwMDBkZWZiMDAwMCAtIDAwMDAwMDAwZGVmYzAwMDAgKEFDUEkgZGF0YSkKWyAgICAwLjAwMDAw
MF0gIFhlbjogMDAwMDAwMDBkZWZjMDAwMCAtIDAwMDAwMDAwZGVmZjAwMDAgKEFDUEkgTlZTKQpb
ICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAwMDAwMGRlZmYwMDAwIC0gMDAwMDAwMDBkZjAwMDAwMCAo
cmVzZXJ2ZWQpClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwZmVjMDAwMDAgLSAwMDAwMDAw
MGZlYzAxMDAwIChyZXNlcnZlZCkKWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDBmZWUwMDAw
MCAtIDAwMDAwMDAwZmVmMDAwMDAgKHJlc2VydmVkKQpbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAw
MDAwMGZmZjgwMDAwIC0gMDAwMDAwMDEwMDAwMDAwMCAocmVzZXJ2ZWQpClsgICAgMC4wMDAwMDBd
IERNSSBwcmVzZW50LgpbICAgIDAuMDAwMDAwXSBBTUkgQklPUyBkZXRlY3RlZDogQklPUyBtYXkg
Y29ycnVwdCBsb3cgUkFNLCB3b3JraW5nIGFyb3VuZCBpdC4KWyAgICAwLjAwMDAwMF0gZTgyMCB1
cGRhdGUgcmFuZ2U6IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDAwMDEwMDAwICh1c2FibGUp
ID09PiAocmVzZXJ2ZWQpClsgICAgMC4wMDAwMDBdIGxhc3RfcGZuID0gMHg0MDAwMCBtYXhfYXJj
aF9wZm4gPSAweDQwMDAwMDAwMApbICAgIDAuMDAwMDAwXSB4ODYgUEFUIGVuYWJsZWQ6IGNwdSAw
LCBvbGQgMHg1MDEwMDA3MDQwNiwgbmV3IDB4NzAxMDYwMDA3MDEwNgpbICAgIDAuMDAwMDAwXSBp
bml0aWFsIG1lbW9yeSBtYXBwZWQgOiAwIC0gMjAwMDAwMDAKWyAgICAwLjAwMDAwMF0gaW5pdF9t
ZW1vcnlfbWFwcGluZzogMDAwMDAwMDAwMDAwMDAwMC0wMDAwMDAwMDQwMDAwMDAwClsgICAgMC4w
MDAwMDBdICAwMDAwMDAwMDAwIC0gMDA0MDAwMDAwMCBwYWdlIDRrClsgICAgMC4wMDAwMDBdIGtl
cm5lbCBkaXJlY3QgbWFwcGluZyB0YWJsZXMgdXAgdG8gNDAwMDAwMDAgQCAxMDAwMDAtMzAyMDAw
ClsgICAgMC4wMDAwMDBdIFJBTURJU0s6IDAxNmI4MDAwIC0gMDMyZmQ2MDAKWyAgICAwLjAwMDAw
MF0gQUNQSTogUlNEUCAwMDAwMDAwMDAwMGZhNTIwIDAwMDE0ICh2MDAgQUNQSUFNKQpbICAgIDAu
MDAwMDAwXSBBQ1BJOiBSU0RUIDAwMDAwMDAwZGVmYjAwMDAgMDAwNDQgKHYwMSBBX01fSSAgT0VN
UlNEVCAgMDgwMDEwMDUgTVNGVCAwMDAwMDA5NykKWyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUCAw
MDAwMDAwMGRlZmIwMjAwIDAwMDg0ICh2MDIgQV9NX0kgIE9FTUZBQ1AgIDEyMDAwNjAxIE1TRlQg
MDAwMDAwOTcpClsgICAgMC4wMDAwMDBdIEFDUEk6IERTRFQgMDAwMDAwMDBkZWZiMDQ2MCAwNDkz
QiAodjAxICBBUzM4MiBBUzM4MjAwOSAwMDAwMDAwOSBJTlRMIDIwMDUxMTE3KQpbICAgIDAuMDAw
MDAwXSBBQ1BJOiBGQUNTIDAwMDAwMDAwZGVmYzAwMDAgMDAwNDAKWyAgICAwLjAwMDAwMF0gQUNQ
STogQVBJQyAwMDAwMDAwMGRlZmIwMzkwIDAwMDkwICh2MDEgQV9NX0kgIE9FTUFQSUMgIDA4MDAx
MDA1IE1TRlQgMDAwMDAwOTcpClsgICAgMC4wMDAwMDBdIEFDUEk6IE1DRkcgMDAwMDAwMDBkZWZi
MDQyMCAwMDAzQyAodjAxIEFfTV9JICBPRU1NQ0ZHICAwODAwMTAwNSBNU0ZUIDAwMDAwMDk3KQpb
ICAgIDAuMDAwMDAwXSBBQ1BJOiBPRU1CIDAwMDAwMDAwZGVmYzAwNDAgMDAwNjEgKHYwMSBBX01f
SSAgQU1JX09FTSAgMDgwMDEwMDUgTVNGVCAwMDAwMDA5NykKWyAgICAwLjAwMDAwMF0gQUNQSTog
U1JBVCAwMDAwMDAwMGRlZmI0ZGEwIDAwMEU4ICh2MDMgQU1EICAgIEZBTV9GXzEwIDAwMDAwMDAy
IEFNRCAgMDAwMDAwMDEpClsgICAgMC4wMDAwMDBdIEFDUEk6IEFBRlQgMDAwMDAwMDBkZWZiNGU5
MCAwMDAyNyAodjAxIEFfTV9JICBPRU1BQUZUICAwODAwMTAwNSBNU0ZUIDAwMDAwMDk3KQpbICAg
IDAuMDAwMDAwXSBBQ1BJOiBIUEVUIDAwMDAwMDAwZGVmYjRlYzAgMDAwMzggKHYwMSBBX01fSSAg
T0VNSFBFVDAgMDgwMDEwMDUgTVNGVCAwMDAwMDA5NykKWyAgICAwLjAwMDAwMF0gQUNQSTogU1NE
VCAwMDAwMDAwMGRlZmI0ZjAwIDAwODhDICh2MDEgQSBNIEkgIFBPV0VSTk9XIDAwMDAwMDAxIEFN
RCAgMDAwMDAwMDEpClsgICAgMC4wMDAwMDBdIEFDUEk6IExvY2FsIEFQSUMgYWRkcmVzcyAweGZl
ZTAwMDAwClsgICAgMC4wMDAwMDBdIFNjYW5uaW5nIE5VTUEgdG9wb2xvZ3kgaW4gTm9ydGhicmlk
Z2UgMjQKWyAgICAwLjAwMDAwMF0gTm8gTlVNQSBjb25maWd1cmF0aW9uIGZvdW5kClsgICAgMC4w
MDAwMDBdIEZha2luZyBhIG5vZGUgYXQgMDAwMDAwMDAwMDAwMDAwMC0wMDAwMDAwMDQwMDAwMDAw
ClsgICAgMC4wMDAwMDBdIEJvb3RtZW0gc2V0dXAgbm9kZSAwIDAwMDAwMDAwMDAwMDAwMDAtMDAw
MDAwMDA0MDAwMDAwMApbICAgIDAuMDAwMDAwXSAgIE5PREVfREFUQSBbMDAwMDAwMDAwMDAxMDAw
MCAtIDAwMDAwMDAwMDAwMTdmZmZdClsgICAgMC4wMDAwMDBdICAgYm9vdG1hcCBbMDAwMDAwMDAw
MDAxODAwMCAtICAwMDAwMDAwMDAwMDFmZmZmXSBwYWdlcyA4ClsgICAgMC4wMDAwMDBdICg4IGVh
cmx5IHJlc2VydmF0aW9ucykgPT0+IGJvb3RtZW0gWzAwMDAwMDAwMDAgLSAwMDQwMDAwMDAwXQpb
ICAgIDAuMDAwMDAwXSAgICMwIFswMDAwMDAwMDAwIC0gMDAwMDAwMTAwMF0gICBCSU9TIGRhdGEg
cGFnZSA9PT4gWzAwMDAwMDAwMDAgLSAwMDAwMDAxMDAwXQpbICAgIDAuMDAwMDAwXSAgICMxIFsw
MDAzNGZmMDAwIC0gMDAwMzUxZTAwMF0gICBYRU4gUEFHRVRBQkxFUyA9PT4gWzAwMDM0ZmYwMDAg
LSAwMDAzNTFlMDAwXQpbICAgIDAuMDAwMDAwXSAgICMyIFswMDAwMDA2MDAwIC0gMDAwMDAwODAw
MF0gICAgICAgVFJBTVBPTElORSA9PT4gWzAwMDAwMDYwMDAgLSAwMDAwMDA4MDAwXQpbICAgIDAu
MDAwMDAwXSAgICMzIFswMDAxMDAwMDAwIC0gMDAwMTY5N2IxNF0gICAgVEVYVCBEQVRBIEJTUyA9
PT4gWzAwMDEwMDAwMDAgLSAwMDAxNjk3YjE0XQpbICAgIDAuMDAwMDAwXSAgICM0IFswMDAxNmI4
MDAwIC0gMDAwMzJmZDYwMF0gICAgICAgICAgUkFNRElTSyA9PT4gWzAwMDE2YjgwMDAgLSAwMDAz
MmZkNjAwXQpbICAgIDAuMDAwMDAwXSAgICM1IFswMDAzMmZlMDAwIC0gMDAwMzRmZjAwMF0gICBY
RU4gU1RBUlQgSU5GTyA9PT4gWzAwMDMyZmUwMDAgLSAwMDAzNGZmMDAwXQpbICAgIDAuMDAwMDAw
XSAgICM2IFswMDAxNjk4MDAwIC0gMDAwMTY5ODEyZl0gICAgICAgICAgICAgIEJSSyA9PT4gWzAw
MDE2OTgwMDAgLSAwMDAxNjk4MTJmXQpbICAgIDAuMDAwMDAwXSAgICM3IFswMDAwMTAwMDAwIC0g
MDAwMDJlMDAwMF0gICAgICAgICAgUEdUQUJMRSA9PT4gWzAwMDAxMDAwMDAgLSAwMDAwMmUwMDAw
XQpbICAgIDAuMDAwMDAwXSBmb3VuZCBTTVAgTVAtdGFibGUgYXQgW2ZmZmY4ODAwMDAwZmY3ODBd
IGZmNzgwClsgICAgMC4wMDAwMDBdIFpvbmUgUEZOIHJhbmdlczoKWyAgICAwLjAwMDAwMF0gICBE
TUEgICAgICAweDAwMDAwMDEwIC0+IDB4MDAwMDEwMDAKWyAgICAwLjAwMDAwMF0gICBETUEzMiAg
ICAweDAwMDAxMDAwIC0+IDB4MDAxMDAwMDAKWyAgICAwLjAwMDAwMF0gICBOb3JtYWwgICAweDAw
MTAwMDAwIC0+IDB4MDAxMDAwMDAKWyAgICAwLjAwMDAwMF0gTW92YWJsZSB6b25lIHN0YXJ0IFBG
TiBmb3IgZWFjaCBub2RlClsgICAgMC4wMDAwMDBdIGVhcmx5X25vZGVfbWFwWzJdIGFjdGl2ZSBQ
Rk4gcmFuZ2VzClsgICAgMC4wMDAwMDBdICAgICAwOiAweDAwMDAwMDEwIC0+IDB4MDAwMDAwOWYK
WyAgICAwLjAwMDAwMF0gICAgIDA6IDB4MDAwMDAxMDAgLT4gMHgwMDA0MDAwMApbICAgIDAuMDAw
MDAwXSBPbiBub2RlIDAgdG90YWxwYWdlczogMjYyMDMxClsgICAgMC4wMDAwMDBdICAgRE1BIHpv
bmU6IDU2IHBhZ2VzIHVzZWQgZm9yIG1lbW1hcApbICAgIDAuMDAwMDAwXSAgIERNQSB6b25lOiA0
ODMgcGFnZXMgcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0gICBETUEgem9uZTogMzQ0NCBwYWdlcywg
TElGTyBiYXRjaDowClsgICAgMC4wMDAwMDBdICAgRE1BMzIgem9uZTogMzUyOCBwYWdlcyB1c2Vk
IGZvciBtZW1tYXAKWyAgICAwLjAwMDAwMF0gICBETUEzMiB6b25lOiAyNTQ1MjAgcGFnZXMsIExJ
Rk8gYmF0Y2g6MzEKWyAgICAwLjAwMDAwMF0gQUNQSTogUE0tVGltZXIgSU8gUG9ydDogMHg1MDgK
WyAgICAwLjAwMDAwMF0gQUNQSTogTG9jYWwgQVBJQyBhZGRyZXNzIDB4ZmVlMDAwMDAKWyAgICAw
LjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMV0gbGFwaWNfaWRbMHgwMF0gZW5hYmxl
ZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMl0gbGFwaWNfaWRbMHgw
MV0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwM10gbGFw
aWNfaWRbMHgwMl0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRb
MHgwNF0gbGFwaWNfaWRbMHgwM10gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMg
KGFjcGlfaWRbMHgwNV0gbGFwaWNfaWRbMHg4NF0gZGlzYWJsZWQpClsgICAgMC4wMDAwMDBdIEFD
UEk6IExBUElDIChhY3BpX2lkWzB4MDZdIGxhcGljX2lkWzB4ODVdIGRpc2FibGVkKQpbICAgIDAu
MDAwMDAwXSBBQ1BJOiBJT0FQSUMgKGlkWzB4MDRdIGFkZHJlc3NbMHhmZWMwMDAwMF0gZ3NpX2Jh
c2VbMF0pClsgICAgMC4wMDAwMDBdIElPQVBJQ1swXTogYXBpY19pZCA0LCB2ZXJzaW9uIDAsIGFk
ZHJlc3MgMHhmZWMwMDAwMCwgR1NJIDAtMApbICAgIDAuMDAwMDAwXSBBQ1BJOiBJTlRfU1JDX09W
UiAoYnVzIDAgYnVzX2lycSAwIGdsb2JhbF9pcnEgMiBkZmwgZGZsKQpbICAgIDAuMDAwMDAwXSBF
UlJPUjogVW5hYmxlIHRvIGxvY2F0ZSBJT0FQSUMgZm9yIEdTSSAyClsgICAgMC4wMDAwMDBdIEFD
UEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDkgZ2xvYmFsX2lycSA5IGhpZ2ggbGV2ZWwp
ClsgICAgMC4wMDAwMDBdIEVSUk9SOiBVbmFibGUgdG8gbG9jYXRlIElPQVBJQyBmb3IgR1NJIDkK
WyAgICAwLjAwMDAwMF0gQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEgMTQgZ2xvYmFs
X2lycSAxNCBoaWdoIGVkZ2UpClsgICAgMC4wMDAwMDBdIEVSUk9SOiBVbmFibGUgdG8gbG9jYXRl
IElPQVBJQyBmb3IgR1NJIDE0ClsgICAgMC4wMDAwMDBdIEFDUEk6IElOVF9TUkNfT1ZSIChidXMg
MCBidXNfaXJxIDE1IGdsb2JhbF9pcnEgMTUgaGlnaCBlZGdlKQpbICAgIDAuMDAwMDAwXSBFUlJP
UjogVW5hYmxlIHRvIGxvY2F0ZSBJT0FQSUMgZm9yIEdTSSAxNQpbICAgIDAuMDAwMDAwXSBVc2lu
ZyBBQ1BJIChNQURUKSBmb3IgU01QIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KWyAgICAwLjAw
MDAwMF0gQUNQSTogSFBFVCBpZDogMHgxMGRlODIwMSBiYXNlOiAweGZlZDAwMDAwClsgICAgMC4w
MDAwMDBdIFNNUDogQWxsb3dpbmcgMSBDUFVzLCAwIGhvdHBsdWcgQ1BVcwpbICAgIDAuMDAwMDAw
XSBucl9pcnFzX2dzaTogMjU2ClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBt
ZW1vcnk6IDAwMDAwMDAwMDAwOWYwMDAgLSAwMDAwMDAwMDAwMTAwMDAwClsgICAgMC4wMDAwMDBd
IEFsbG9jYXRpbmcgUENJIHJlc291cmNlcyBzdGFydGluZyBhdCA0MDAwMDAwMCAoZ2FwOiA0MDAw
MDAwMDo5ZWZiMDAwMCkKWyAgICAwLjAwMDAwMF0gQm9vdGluZyBwYXJhdmlydHVhbGl6ZWQga2Vy
bmVsIG9uIFhlbgpbICAgIDAuMDAwMDAwXSBYZW4gdmVyc2lvbjogNC4xLjIgKHByZXNlcnZlLUFE
KSAoZG9tMCkKWyAgICAwLjAwMDAwMF0gTlJfQ1BVUzo1MTIgbnJfY3B1bWFza19iaXRzOjUxMiBu
cl9jcHVfaWRzOjEgbnJfbm9kZV9pZHM6MQpbICAgIDAuMDAwMDAwXSBQRVJDUFU6IEVtYmVkZGVk
IDMwIHBhZ2VzL2NwdSBAZmZmZjg4MDAwMzU1NDAwMCBzOTAzMjggcjgxOTIgZDI0MzYwIHUxMjI4
ODAKWyAgICAwLjAwMDAwMF0gcGNwdS1hbGxvYzogczkwMzI4IHI4MTkyIGQyNDM2MCB1MTIyODgw
IGFsbG9jPTMwKjQwOTYKWyAgICAwLjAwMDAwMF0gcGNwdS1hbGxvYzogWzBdIDAgClsgICAgMC4w
MDAwMDBdIHRyeWluZyB0byBtYXAgdmNwdV9pbmZvIDAgYXQgZmZmZjg4MDAwMzU1ZjAyMCwgbWZu
IDQxMTkxOSwgb2Zmc2V0IDMyClsgICAgMC4wMDAwMDBdIGNwdSAwIHVzaW5nIHZjcHVfaW5mbyBh
dCBmZmZmODgwMDAzNTVmMDIwClsgICAgMC4wMDAwMDBdIFhlbjogdXNpbmcgdmNwdV9pbmZvIHBs
YWNlbWVudApbICAgIDAuMDAwMDAwXSBCdWlsdCAxIHpvbmVsaXN0cyBpbiBOb2RlIG9yZGVyLCBt
b2JpbGl0eSBncm91cGluZyBvbi4gIFRvdGFsIHBhZ2VzOiAyNTc5NjQKWyAgICAwLjAwMDAwMF0g
UG9saWN5IHpvbmU6IERNQTMyClsgICAgMC4wMDAwMDBdIEtlcm5lbCBjb21tYW5kIGxpbmU6IHBs
YWNlaG9sZGVyIHJvb3Q9L2Rldi9tYXBwZXIvdmdibHVlLWJsdWVyb290IHJvClsgICAgMC4wMDAw
MDBdIFBJRCBoYXNoIHRhYmxlIGVudHJpZXM6IDQwOTYgKG9yZGVyOiAzLCAzMjc2OCBieXRlcykK
WyAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIENQVSMwClsgICAgMC4wMDAwMDBdIERNQTogUGxh
Y2luZyA2NE1CIHNvZnR3YXJlIElPIFRMQiBiZXR3ZWVuIGZmZmY4ODAwMDQ3MjgwMDAgLSBmZmZm
ODgwMDA4NzI4MDAwClsgICAgMC4wMDAwMDBdIERNQTogc29mdHdhcmUgSU8gVExCIGF0IHBoeXMg
MHg0NzI4MDAwIC0gMHg4NzI4MDAwClsgICAgMC4wMDAwMDBdIHhlbl9zd2lvdGxiX2ZpeHVwOiBi
dWY9ZmZmZjg4MDAwNDcyODAwMCBzaXplPTY3MTA4ODY0ClsgICAgMC4wMDAwMDBdIHhlbl9zd2lv
dGxiX2ZpeHVwOiBidWY9ZmZmZjg4MDAwODc4ODAwMCBzaXplPTMyNzY4ClsgICAgMC4wMDAwMDBd
IE1lbW9yeTogOTI3NTY4ay8xMDQ4NTc2ayBhdmFpbGFibGUgKDMxNTFrIGtlcm5lbCBjb2RlLCA0
NTJrIGFic2VudCwgMTIwNTU2ayByZXNlcnZlZCwgMTg5N2sgZGF0YSwgNjA0ayBpbml0KQpbICAg
IDAuMDAwMDAwXSBTTFVCOiBHZW5zbGFicz0xNCwgSFdhbGlnbj02NCwgT3JkZXI9MC0zLCBNaW5P
YmplY3RzPTAsIENQVXM9MSwgTm9kZXM9MQpbICAgIDAuMDAwMDAwXSBIaWVyYXJjaGljYWwgUkNV
IGltcGxlbWVudGF0aW9uLgpbICAgIDAuMDAwMDAwXSBOUl9JUlFTOjQzNTIgbnJfaXJxczo1MTIK
WyAgICAwLjAwMDAwMF0geGVuOiAtLT4gaXJxPTAKWyAgICAwLjAwMDAwMF0geGVuOiAtLT4gaXJx
PTEKWyAgICAwLjAwMDAwMF0geGVuOiAtLT4gaXJxPTIKWyAgICAwLjAwMDAwMF0geGVuOiAtLT4g
aXJxPTMKWyAgICAwLjAwMDAwMF0geGVuOiAtLT4gaXJxPTQKWyAgICAwLjAwMDAwMF0geGVuOiAt
LT4gaXJxPTUKWyAgICAwLjAwMDAwMF0geGVuOiAtLT4gaXJxPTYKWyAgICAwLjAwMDAwMF0geGVu
OiAtLT4gaXJxPTcKWyAgICAwLjAwMDAwMF0geGVuOiAtLT4gaXJxPTgKWyAgICAwLjAwMDAwMF0g
eGVuOiAtLT4gaXJxPTkKWyAgICAwLjAwMDAwMF0geGVuOiAtLT4gaXJxPTEwClsgICAgMC4wMDAw
MDBdIHhlbjogLS0+IGlycT0xMQpbICAgIDAuMDAwMDAwXSB4ZW46IC0tPiBpcnE9MTIKWyAgICAw
LjAwMDAwMF0geGVuOiAtLT4gaXJxPTEzClsgICAgMC4wMDAwMDBdIHhlbjogLS0+IGlycT0xNApb
ICAgIDAuMDAwMDAwXSB4ZW46IC0tPiBpcnE9MTUKWyAgICAwLjAwMDAwMF0gQUNQSTogSU5UX1NS
Q19PVlIgKGJ1cyAwIGJ1c19pcnEgMCBnbG9iYWxfaXJxIDIgZGZsIGRmbCkKWyAgICAwLjAwMDAw
MF0gQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEgOSBnbG9iYWxfaXJxIDkgaGlnaCBs
ZXZlbCkKWyAgICAwLjAwMDAwMF0geGVuOiBzY2kgb3ZlcnJpZGU6IHNvdXJjZV9pcnE9OSBnbG9i
YWxfaXJxPTkgdHJpZ2dlcj1jIHBvbGFyaXR5PTEKWyAgICAwLjAwMDAwMF0geGVuOiByZWdpc3Rl
cmluZyBnc2kgOSB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMApbICAgIDAuMDAwMDAwXSB4ZW5fYWxs
b2NhdGVfcGlycTogcmV0dXJuaW5nIGlycSA5IGZvciBnc2kgOQpbICAgIDAuMDAwMDAwXSB4ZW46
IC0tPiBpcnE9OQpbICAgIDAuMDAwMDAwXSB4ZW46IGFjcGkgc2NpIDkKWyAgICAwLjAwMDAwMF0g
QUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEgMTQgZ2xvYmFsX2lycSAxNCBoaWdoIGVk
Z2UpClsgICAgMC4wMDAwMDBdIEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDE1IGds
b2JhbF9pcnEgMTUgaGlnaCBlZGdlKQpbICAgIDAuMDAwMDAwXSBDb25zb2xlOiBjb2xvdXIgVkdB
KyA4MHgyNQpbICAgIDAuMDAwMDAwXSBjb25zb2xlIFt0dHkwXSBlbmFibGVkClsgICAgMC4wMDAw
MDBdIFhlbjogdXNpbmcgdmNwdW9wIHRpbWVyIGludGVyZmFjZQpbICAgIDAuMDAwMDAwXSBpbnN0
YWxsaW5nIFhlbiB0aW1lciBmb3IgQ1BVIDAKWyAgICAwLjAwMDAwMF0gICBhbGxvYyBpcnFfZGVz
YyBmb3IgNTExIG9uIG5vZGUgLTEKWyAgICAwLjAwMDAwMF0gICBhbGxvYyBrc3RhdF9pcnFzIG9u
IG5vZGUgLTEKWyAgICAwLjAwMDAwMF0gRGV0ZWN0ZWQgMTczNDgxMi40NDcgTUh6IHByb2Nlc3Nv
ci4KWyAgICAwLjAwNDAwMF0gQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcCAoc2tpcHBlZCksIHZhbHVl
IGNhbGN1bGF0ZWQgdXNpbmcgdGltZXIgZnJlcXVlbmN5Li4gNDgyMS45NyBCb2dvTUlQUyAobHBq
PTk2NDM5NDQpClsgICAgMC4wMDQyMzddIFNlY3VyaXR5IEZyYW1ld29yayBpbml0aWFsaXplZApb
ICAgIDAuMDA0ODcyXSBTRUxpbnV4OiAgRGlzYWJsZWQgYXQgYm9vdC4KWyAgICAwLjAxODYxMl0g
RGVudHJ5IGNhY2hlIGhhc2ggdGFibGUgZW50cmllczogMTMxMDcyIChvcmRlcjogOCwgMTA0ODU3
NiBieXRlcykKWyAgICAwLjAyNDQyOF0gSW5vZGUtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiA2
NTUzNiAob3JkZXI6IDcsIDUyNDI4OCBieXRlcykKWyAgICAwLjAyNTI3NF0gTW91bnQtY2FjaGUg
aGFzaCB0YWJsZSBlbnRyaWVzOiAyNTYKWyAgICAwLjAyNzg0OF0gSW5pdGlhbGl6aW5nIGNncm91
cCBzdWJzeXMgbnMKWyAgICAwLjAyODAwMV0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1
YWNjdApbICAgIDAuMDI4MDAxXSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBkZXZpY2VzClsg
ICAgMC4wMjgwMDFdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGZyZWV6ZXIKWyAgICAwLjAy
ODAwMV0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgbmV0X2NscwpbICAgIDAuMDI4NDU4XSBD
UFU6IEwxIEkgQ2FjaGU6IDY0SyAoNjQgYnl0ZXMvbGluZSksIEQgY2FjaGUgNjRLICg2NCBieXRl
cy9saW5lKQpbICAgIDAuMDI5MTEzXSBDUFU6IEwyIENhY2hlOiA1MTJLICg2NCBieXRlcy9saW5l
KQpbICAgIDAuMDI5NzYwXSBDUFUgMC8weDAgLT4gTm9kZSAwClsgICAgMC4wMzA0MzBdIHRzZWc6
IDAwMDAwMDAwMDAKWyAgICAwLjAzMDUwN10gQ1BVOiBQaHlzaWNhbCBQcm9jZXNzb3IgSUQ6IDAK
WyAgICAwLjAzMTE0Nl0gQ1BVOiBQcm9jZXNzb3IgQ29yZSBJRDogMApbICAgIDAuMDMxODIwXSBt
Y2U6IENQVSBzdXBwb3J0cyA2IE1DRSBiYW5rcwpbICAgIDAuMDMyNjU1XSBQZXJmb3JtYW5jZSBF
dmVudHM6IEFNRCBQTVUgZHJpdmVyLgpbICAgIDAuMDMzODUxXSAtLS0tLS0tLS0tLS1bIGN1dCBo
ZXJlIF0tLS0tLS0tLS0tLS0KWyAgICAwLjAzNDQ5Ml0gV0FSTklORzogYXQgL3RtcC9idWlsZGQv
bGludXgtMi42LTIuNi4zMi9kZWJpYW4vYnVpbGQvc291cmNlX2FtZDY0X3hlbi9hcmNoL3g4Ni94
ZW4vZW5saWdodGVuLmM6NzI2IGluaXRfaHdfcGVyZl9ldmVudHMrMHgzMmQvMHgzY2QoKQpbICAg
IDAuMDM1MTk4XSBIYXJkd2FyZSBuYW1lOiBUbyBCZSBGaWxsZWQgQnkgTy5FLk0uClsgICAgMC4w
MzU4MzldIE1vZHVsZXMgbGlua2VkIGluOgpbICAgIDAuMDM2MDAxXSBQaWQ6IDAsIGNvbW06IHN3
YXBwZXIgTm90IHRhaW50ZWQgMi42LjMyLTUteGVuLWFtZDY0ICMxClsgICAgMC4wMzYwMDFdIENh
bGwgVHJhY2U6ClsgICAgMC4wMzYwMDFdICBbPGZmZmZmZmZmODE1MGYyYjY+XSA/IGluaXRfaHdf
cGVyZl9ldmVudHMrMHgzMmQvMHgzY2QKWyAgICAwLjAzNjAwMV0gIFs8ZmZmZmZmZmY4MTUwZjJi
Nj5dID8gaW5pdF9od19wZXJmX2V2ZW50cysweDMyZC8weDNjZApbICAgIDAuMDM2MDAxXSAgWzxm
ZmZmZmZmZjgxMDRlZjhjPl0gPyB3YXJuX3Nsb3dwYXRoX2NvbW1vbisweDc3LzB4YTMKWyAgICAw
LjAzNjAwMV0gIFs8ZmZmZmZmZmY4MTUwZjJiNj5dID8gaW5pdF9od19wZXJmX2V2ZW50cysweDMy
ZC8weDNjZApbICAgIDAuMDM2MDAxXSAgWzxmZmZmZmZmZjgxMzA0Yzg1Pl0gPyBpZGVudGlmeV9j
cHUrMHgyZjcvMHgzMDAKWyAgICAwLjAzNjAwMV0gIFs8ZmZmZmZmZmY4MTAwZWNkZj5dID8geGVu
X3Jlc3RvcmVfZmxfZGlyZWN0X2VuZCsweDAvMHgxClsgICAgMC4wMzYwMDFdICBbPGZmZmZmZmZm
ODEwZTg0YWQ+XSA/IGttZW1fY2FjaGVfYWxsb2MrMHg4Yy8weGYwClsgICAgMC4wMzYwMDFdICBb
PGZmZmZmZmZmODE1MGVkZDA+XSA/IGlkZW50aWZ5X2Jvb3RfY3B1KzB4MTUvMHgzZQpbICAgIDAu
MDM2MDAxXSAgWzxmZmZmZmZmZjgxNTBlZjY0Pl0gPyBjaGVja19idWdzKzB4OS8weDJlClsgICAg
MC4wMzYwMDFdICBbPGZmZmZmZmZmODE1MDdjY2U+XSA/IHN0YXJ0X2tlcm5lbCsweDNjZC8weDNl
OApbICAgIDAuMDM2MDAxXSAgWzxmZmZmZmZmZjgxNTA5YzkzPl0gPyB4ZW5fc3RhcnRfa2VybmVs
KzB4NTg2LzB4NThhClsgICAgMC4wMzYwMDFdIC0tLVsgZW5kIHRyYWNlIGE3OTE5ZTdmMTdjMGE3
MjUgXS0tLQpbICAgIDAuMDM2MDAxXSAuLi4gdmVyc2lvbjogICAgICAgICAgICAgICAgMApbICAg
IDAuMDM2MDAxXSAuLi4gYml0IHdpZHRoOiAgICAgICAgICAgICAgNDgKWyAgICAwLjAzNjAwMV0g
Li4uIGdlbmVyaWMgcmVnaXN0ZXJzOiAgICAgIDQKWyAgICAwLjAzNjAwMV0gLi4uIHZhbHVlIG1h
c2s6ICAgICAgICAgICAgIDAwMDBmZmZmZmZmZmZmZmYKWyAgICAwLjAzNjAwMV0gLi4uIG1heCBw
ZXJpb2Q6ICAgICAgICAgICAgIDAwMDA3ZmZmZmZmZmZmZmYKWyAgICAwLjAzNjAwMV0gLi4uIGZp
eGVkLXB1cnBvc2UgZXZlbnRzOiAgIDAKWyAgICAwLjAzNjAwMV0gLi4uIGV2ZW50IG1hc2s6ICAg
ICAgICAgICAgIDAwMDAwMDAwMDAwMDAwMGYKWyAgICAwLjAzNjAwMV0gU01QIGFsdGVybmF0aXZl
czogc3dpdGNoaW5nIHRvIFVQIGNvZGUKWyAgICAwLjAzNjAwMV0gRnJlZWluZyBTTVAgYWx0ZXJu
YXRpdmVzOiAyOGsgZnJlZWQKWyAgICAwLjAzNjAwMV0gQUNQSTogQ29yZSByZXZpc2lvbiAyMDA5
MDkwMwpbICAgIDAuMTQ3NzQ1XSAgIGFsbG9jIGlycV9kZXNjIGZvciA1MTAgb24gbm9kZSAtMQpb
ICAgIDAuMTQ3Nzg4XSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAtMQpbICAgIDAuMTQ3ODkx
XSAgIGFsbG9jIGlycV9kZXNjIGZvciA1MDkgb24gbm9kZSAtMQpbICAgIDAuMTQ3OTMyXSAgIGFs
bG9jIGtzdGF0X2lycXMgb24gbm9kZSAtMQpbICAgIDAuMTQ4MDAxXSAgIGFsbG9jIGlycV9kZXNj
IGZvciA1MDggb24gbm9kZSAtMQpbICAgIDAuMTQ4MDAxXSAgIGFsbG9jIGtzdGF0X2lycXMgb24g
bm9kZSAtMQpbICAgIDAuMTQ4MTEwXSAgIGFsbG9jIGlycV9kZXNjIGZvciA1MDcgb24gbm9kZSAt
MQpbICAgIDAuMTQ4MTUyXSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAtMQpbICAgIDAuMTQ5
ODY4XSBCcm91Z2h0IHVwIDEgQ1BVcwpbICAgIDAuMTUwNTUxXSBDUFUwIGF0dGFjaGluZyBOVUxM
IHNjaGVkLWRvbWFpbi4KWyAgICAwLjE1MjM1Nl0gZGV2dG1wZnM6IGluaXRpYWxpemVkClsgICAg
MC4xNjEyOThdIEdyYW50IHRhYmxlIGluaXRpYWxpemVkClsgICAgMC4xNjE5MzddIHJlZ3VsYXRv
cjogY29yZSB2ZXJzaW9uIDAuNQpbICAgIDAuMTYzMTA0XSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9j
b2wgZmFtaWx5IDE2ClsgICAgMC4xNjQ1ODddICAgYWxsb2MgaXJxX2Rlc2MgZm9yIDUwNiBvbiBu
b2RlIC0xClsgICAgMC4xNjQ2MjhdICAgYWxsb2Mga3N0YXRfaXJxcyBvbiBub2RlIC0xClsgICAg
MC4xNjY4ODJdIG5vZGUgMCBsaW5rIDA6IGlvIHBvcnQgWzEwMDAsIGZmZmZmZl0KWyAgICAwLjE2
NzA2OF0gVE9NOiAwMDAwMDAwMGUwMDAwMDAwIGFrYSAzNTg0TQpbICAgIDAuMTY3NzIwXSBGYW0g
MTBoIG1tY29uZiBbZmMwMDAwMDAsIGZkZmZmZmZmXQpbICAgIDAuMTY3ODQ2XSBub2RlIDAgbGlu
ayAwOiBtbWlvIFtmYzAwMDAwMCwgZmRmZmZmZmZdID09PiBub25lClsgICAgMC4xNjc5OThdIG5v
ZGUgMCBsaW5rIDA6IG1taW8gW2UwMDAwMDAwLCBmYmZmZmZmZl0KWyAgICAwLjE2ODEzNV0gbm9k
ZSAwIGxpbmsgMDogbW1pbyBbZmUwMDAwMDAsIGZlMGJmZmZmXQpbICAgIDAuMTY4NDIxXSBub2Rl
IDAgbGluayAwOiBtbWlvIFthMDAwMCwgYmZmZmZdClsgICAgMC4xNjg1NjRdIFRPTTI6IDAwMDAw
MDA0MjAwMDAwMDAgYWthIDE2ODk2TQpbICAgIDAuMTY5MjAyXSBidXM6IFswMCwwN10gb24gbm9k
ZSAwIGxpbmsgMApbICAgIDAuMTY5MjQwXSBidXM6IDAwIGluZGV4IDAgaW8gcG9ydDogWzAsIGZm
ZmZdClsgICAgMC4xNjkyNzhdIGJ1czogMDAgaW5kZXggMSBtbWlvOiBbZTAwMDAwMDAsIGZiZmZm
ZmZmXQpbICAgIDAuMTY5MzE2XSBidXM6IDAwIGluZGV4IDIgbW1pbzogW2ZlMDAwMDAwLCBmZmZm
ZmZmZl0KWyAgICAwLjE2OTM1M10gYnVzOiAwMCBpbmRleCAzIG1taW86IFthMDAwMCwgYmZmZmZd
ClsgICAgMC4xNjkzOTBdIGJ1czogMDAgaW5kZXggNCBtbWlvOiBbNDIwMDAwMDAwLCBmY2ZmZmZm
ZmZmXQpbICAgIDAuMTY5NjU4XSBBQ1BJOiBidXMgdHlwZSBwY2kgcmVnaXN0ZXJlZApbICAgIDAu
MTcwNDkwXSBzeW5jIGNwdSAwIGdldCByZXN1bHQgMSBtYXhfaWQgMwpbICAgIDAuMTcwNjQ5XSBz
eW5jIGNwdSAxIGdldCByZXN1bHQgMSBtYXhfaWQgMwpbICAgIDAuMTcwODA4XSBzeW5jIGNwdSAy
IGdldCByZXN1bHQgMSBtYXhfaWQgMwpbICAgIDAuMTcwOTY2XSBzeW5jIGNwdSAzIGdldCByZXN1
bHQgMSBtYXhfaWQgMwpbICAgIDAuMTcxMDEwXSAgIGFsbG9jIGlycV9kZXNjIGZvciA1MDUgb24g
bm9kZSAtMQpbICAgIDAuMTcxMDUzXSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAtMQpbICAg
IDAuMTcyMDAxXSBQQ0k6IE1DRkcgY29uZmlndXJhdGlvbiAwOiBiYXNlIGZjMDAwMDAwIHNlZ21l
bnQgMCBidXNlcyAwIC0gMzEKWyAgICAwLjE3MjAwMV0gUENJOiBOb3QgdXNpbmcgTU1DT05GSUcu
ClsgICAgMC4xNzIwMDFdIFBDSTogVXNpbmcgY29uZmlndXJhdGlvbiB0eXBlIDEgZm9yIGJhc2Ug
YWNjZXNzClsgICAgMC4xNzIwMDFdIFBDSTogVXNpbmcgY29uZmlndXJhdGlvbiB0eXBlIDEgZm9y
IGV4dGVuZGVkIGFjY2VzcwpbICAgIDAuMTc5NDI4XSBiaW86IGNyZWF0ZSBzbGFiIDxiaW8tMD4g
YXQgMApbICAgIDAuMjIzMDU4XSBFUlJPUjogVW5hYmxlIHRvIGxvY2F0ZSBJT0FQSUMgZm9yIEdT
SSA5ClsgICAgMC4yMjM5ODJdIEFDUEk6IEVDOiBMb29rIHVwIEVDIGluIERTRFQKWyAgICAwLjMy
NTg3MF0gQUNQSTogRXhlY3V0ZWQgMSBibG9ja3Mgb2YgbW9kdWxlLWxldmVsIGV4ZWN1dGFibGUg
QU1MIGNvZGUKWyAgICAwLjUwNTU3NF0gQUNQSTogSW50ZXJwcmV0ZXIgZW5hYmxlZApbICAgIDAu
NTA4MDAyXSBBQ1BJOiAoc3VwcG9ydHMgUzAgUzEgUzQgUzUpClsgICAgMC41MDgwMDJdIEFDUEk6
IFVzaW5nIElPQVBJQyBmb3IgaW50ZXJydXB0IHJvdXRpbmcKWyAgICAwLjUwODYxNl0gUENJOiBN
Q0ZHIGNvbmZpZ3VyYXRpb24gMDogYmFzZSBmYzAwMDAwMCBzZWdtZW50IDAgYnVzZXMgMCAtIDMx
ClsgICAgMC42MTAyMzBdIFBDSTogTUNGRyBhcmVhIGF0IGZjMDAwMDAwIHJlc2VydmVkIGluIEFD
UEkgbW90aGVyYm9hcmQgcmVzb3VyY2VzClsgICAgMC42ODAwMDJdIFBDSTogVXNpbmcgTU1DT05G
SUcgYXQgZmMwMDAwMDAgLSBmZGZmZmZmZgpbICAgIDAuOTIwNzE2XSBBQ1BJIFdhcm5pbmc6IElu
Y29ycmVjdCBjaGVja3N1bSBpbiB0YWJsZSBbT0VNQl0gLSA3Miwgc2hvdWxkIGJlIDZEICgyMDA5
MDkwMy90YnV0aWxzLTMxNCkKWyAgICAwLjkyODI1N10gQUNQSTogTm8gZG9jayBkZXZpY2VzIGZv
dW5kLgpbICAgIDAuOTMwNTg1XSBBQ1BJOiBQQ0kgUm9vdCBCcmlkZ2UgW1BDSTBdICgwMDAwOjAw
KQpbICAgIDAuOTMyMDAzXSBwY2kgMDAwMDowMDowMS4wOiByZWcgMTAgaW8gcG9ydDogWzB4OTAw
LTB4OWZmXQpbICAgIDAuOTMzMjYyXSBwY2kgMDAwMDowMDowMS4xOiByZWcgMTAgaW8gcG9ydDog
WzB4ZGMwMC0weGRjM2ZdClsgICAgMC45MzQyMDldIHBjaSAwMDAwOjAwOjAxLjE6IHJlZyAyMCBp
byBwb3J0OiBbMHg2MDAtMHg2M2ZdClsgICAgMC45MzQ0NzJdIHBjaSAwMDAwOjAwOjAxLjE6IHJl
ZyAyNCBpbyBwb3J0OiBbMHg3MDAtMHg3M2ZdClsgICAgMC45MzU1NjBdIHBjaSAwMDAwOjAwOjAx
LjE6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDNob3QgRDNjb2xkClsgICAgMC45MzYwMDNdIHBjaSAw
MDAwOjAwOjAxLjE6IFBNRSMgZGlzYWJsZWQKWyAgICAwLjkzNjAwM10gcGNpIDAwMDA6MDA6MDIu
MDogcmVnIDEwIDMyYml0IG1taW86IFsweGZiZWZmMDAwLTB4ZmJlZmZmZmZdClsgICAgMC45MzYw
MDNdIHBjaSAwMDAwOjAwOjAyLjA6IHN1cHBvcnRzIEQxIEQyClsgICAgMC45MzYwMDNdIHBjaSAw
MDAwOjAwOjAyLjA6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDEgRDIgRDNob3QgRDNjb2xkClsg
ICAgMC45MzYwMDNdIHBjaSAwMDAwOjAwOjAyLjA6IFBNRSMgZGlzYWJsZWQKWyAgICAwLjkzNjAw
M10gcGNpIDAwMDA6MDA6MDIuMTogcmVnIDEwIDMyYml0IG1taW86IFsweGZiZWZlYzAwLTB4ZmJl
ZmVjZmZdClsgICAgMC45MzYwMDNdIHBjaSAwMDAwOjAwOjAyLjE6IHN1cHBvcnRzIEQxIEQyClsg
ICAgMC45MzYwMDNdIHBjaSAwMDAwOjAwOjAyLjE6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDEg
RDIgRDNob3QgRDNjb2xkClsgICAgMC45MzYwMDNdIHBjaSAwMDAwOjAwOjAyLjE6IFBNRSMgZGlz
YWJsZWQKWyAgICAwLjkzNjAwM10gcGNpIDAwMDA6MDA6MDUuMDogcmVnIDEwIDMyYml0IG1taW86
IFsweGZiZWY4MDAwLTB4ZmJlZmJmZmZdClsgICAgMC45MzYwMDNdIHBjaSAwMDAwOjAwOjA1LjA6
IFBNRSMgc3VwcG9ydGVkIGZyb20gRDNob3QgRDNjb2xkClsgICAgMC45MzYwMDNdIHBjaSAwMDAw
OjAwOjA1LjA6IFBNRSMgZGlzYWJsZWQKWyAgICAwLjkzNjAwM10gcGNpIDAwMDA6MDA6MDcuMDog
cmVnIDEwIDMyYml0IG1taW86IFsweGZiZWZkMDAwLTB4ZmJlZmRmZmZdClsgICAgMC45MzYwMDNd
IHBjaSAwMDAwOjAwOjA3LjA6IHJlZyAxNCBpbyBwb3J0OiBbMHhkNDgwLTB4ZDQ4N10KWyAgICAw
LjkzNjAwM10gcGNpIDAwMDA6MDA6MDcuMDogc3VwcG9ydHMgRDEgRDIKWyAgICAwLjkzNjAwM10g
cGNpIDAwMDA6MDA6MDcuMDogUE1FIyBzdXBwb3J0ZWQgZnJvbSBEMCBEMSBEMiBEM2hvdCBEM2Nv
bGQKWyAgICAwLjkzNjAwM10gcGNpIDAwMDA6MDA6MDcuMDogUE1FIyBkaXNhYmxlZApbICAgIDAu
OTM2MDAzXSBwY2kgMDAwMDowMDowOS4wOiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQxIEQyIEQz
aG90IEQzY29sZApbICAgIDAuOTM2MDAzXSBwY2kgMDAwMDowMDowOS4wOiBQTUUjIGRpc2FibGVk
ClsgICAgMC45NDAwMDNdIHBjaSAwMDAwOjAwOjBiLjA6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAg
RDEgRDIgRDNob3QgRDNjb2xkClsgICAgMC45NDAwMDNdIHBjaSAwMDAwOjAwOjBiLjA6IFBNRSMg
ZGlzYWJsZWQKWyAgICAwLjk0MDAwM10gcGNpIDAwMDA6MDA6MGMuMDogUE1FIyBzdXBwb3J0ZWQg
ZnJvbSBEMCBEMSBEMiBEM2hvdCBEM2NvbGQKWyAgICAwLjk0MDAwM10gcGNpIDAwMDA6MDA6MGMu
MDogUE1FIyBkaXNhYmxlZApbICAgIDAuOTQwMDAzXSBwY2kgMDAwMDowMDowZC4wOiByZWcgMTAg
MzJiaXQgbW1pbzogWzB4ZmEwMDAwMDAtMHhmYWZmZmZmZl0KWyAgICAwLjk0MDAwM10gcGNpIDAw
MDA6MDA6MGQuMDogcmVnIDE0IDY0Yml0IG1taW8gcHJlZjogWzB4ZTAwMDAwMDAtMHhlZmZmZmZm
Zl0KWyAgICAwLjk0MDAwM10gcGNpIDAwMDA6MDA6MGQuMDogcmVnIDFjIDY0Yml0IG1taW86IFsw
eGY5MDAwMDAwLTB4ZjlmZmZmZmZdClsgICAgMC45NDAwMDNdIHBjaSAwMDAwOjAwOjBkLjA6IHJl
ZyAzMCAzMmJpdCBtbWlvIHByZWY6IFsweGZiZWMwMDAwLTB4ZmJlZGZmZmZdClsgICAgMC45NDAw
MDNdIHBjaSAwMDAwOjAwOjA0LjA6IHRyYW5zcGFyZW50IGJyaWRnZQpbICAgIDAuOTQxNjU1XSBw
Y2kgMDAwMDowMzowMC4wOiByZWcgMTAgNjRiaXQgbW1pbyBwcmVmOiBbMHhmNjAwMDAwMC0weGY3
ZmZmZmZmXQpbICAgIDAuOTQyMTQ3XSBwY2kgMDAwMDowMzowMC4wOiByZWcgMTggNjRiaXQgbW1p
bzogWzB4ZmJmZmYwMDAtMHhmYmZmZmZmZl0KWyAgICAwLjk0MjQxMV0gcGNpIDAwMDA6MDM6MDAu
MDogcmVnIDIwIGlvIHBvcnQ6IFsweGU4MDAtMHhlOGZmXQpbICAgIDAuOTQyOTAzXSBwY2kgMDAw
MDowMzowMC4wOiByZWcgMzAgMzJiaXQgbW1pbyBwcmVmOiBbMHhmYmZjMDAwMC0weGZiZmRmZmZm
XQpbICAgIDAuOTQ0MDAzXSBwY2kgMDAwMDowMzowMC4wOiBzdXBwb3J0cyBEMSBEMgpbICAgIDAu
OTQ0MDAzXSBwY2kgMDAwMDowMDowYi4wOiBicmlkZ2UgaW8gcG9ydDogWzB4ZTAwMC0weGVmZmZd
ClsgICAgMC45NDQwMDNdIHBjaSAwMDAwOjAwOjBiLjA6IGJyaWRnZSAzMmJpdCBtbWlvOiBbMHhm
YmYwMDAwMC0weGZiZmZmZmZmXQpbICAgIDAuOTQ0MDAzXSBwY2kgMDAwMDowMDowYi4wOiBicmlk
Z2UgNjRiaXQgbW1pbyBwcmVmOiBbMHhmNjAwMDAwMC0weGY3ZmZmZmZmXQpbICAgIDAuOTQ3NjAz
XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgVGFibGUgW1xfU0JfLlBDSTAuX1BSVF0KWyAg
ICAwLjk1NTA1OV0gQUNQSTogUENJIEludGVycnVwdCBSb3V0aW5nIFRhYmxlIFtcX1NCXy5QQ0kw
LlAwUDEuX1BSVF0KWyAgICAwLjk1ODI1MF0gQUNQSTogUENJIEludGVycnVwdCBSb3V0aW5nIFRh
YmxlIFtcX1NCXy5QQ0kwLkJSMTAuX1BSVF0KWyAgICAwLjk2MDIxNF0gQUNQSTogUENJIEludGVy
cnVwdCBSb3V0aW5nIFRhYmxlIFtcX1NCXy5QQ0kwLkJSMTEuX1BSVF0KWyAgICAwLjk2MjE1N10g
QUNQSTogUENJIEludGVycnVwdCBSb3V0aW5nIFRhYmxlIFtcX1NCXy5QQ0kwLkJSMTIuX1BSVF0K
WyAgICAxLjU1NjgwMF0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktBXSAoSVJRcyAxNiAx
NyAxOCAxOSkgKjAsIGRpc2FibGVkLgpbICAgIDEuNTYzMzU1XSBBQ1BJOiBQQ0kgSW50ZXJydXB0
IExpbmsgW0xOS0JdIChJUlFzIDE2IDE3IDE4IDE5KSAqMCwgZGlzYWJsZWQuClsgICAgMS41Njcw
MzJdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5LQ10gKElSUXMgMTYgMTcgMTggMTkpICow
LCBkaXNhYmxlZC4KWyAgICAxLjU3MTAwOF0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktE
XSAoSVJRcyAxNiAxNyAxOCAxOSkgKjAsIGRpc2FibGVkLgpbICAgIDEuNTc1MDI2XSBBQ1BJOiBQ
Q0kgSW50ZXJydXB0IExpbmsgW0xORUFdIChJUlFzIDE2IDE3IDE4IDE5KSAqMCwgZGlzYWJsZWQu
ClsgICAgMS41Nzg5NjZdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5FQl0gKElSUXMgMTYg
MTcgMTggMTkpICo1ClsgICAgMS41ODI5ODFdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5F
Q10gKElSUXMgMTYgMTcgMTggMTkpICowLCBkaXNhYmxlZC4KWyAgICAxLjU4NzAyM10gQUNQSTog
UENJIEludGVycnVwdCBMaW5rIFtMTkVEXSAoSVJRcyAxNiAxNyAxOCAxOSkgKjAsIGRpc2FibGVk
LgpbICAgIDEuNTkwOTg1XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xVQjBdIChJUlFzIDIw
IDIxIDIyIDIzKSAqNQpbICAgIDEuNTk0OTM4XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xV
QjJdIChJUlFzIDIwIDIxIDIyIDIzKSAqMTQKWyAgICAxLjU5OTAwNF0gQUNQSTogUENJIEludGVy
cnVwdCBMaW5rIFtMTUFDXSAoSVJRcyAyMCAyMSAyMiAyMykgKjExClsgICAgMS42MDMwMTZdIEFD
UEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTEFaQV0gKElSUXMgMjAgMjEgMjIgMjMpICoxMApbICAg
IDEuNjA3MDI3XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xBQ0ldIChJUlFzIDIwIDIxIDIy
IDIzKSAqMCwgZGlzYWJsZWQuClsgICAgMS42MTA5NjJdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGlu
ayBbTE1DOV0gKElSUXMgMjAgMjEgMjIgMjMpICoxMApbICAgIDEuNjE1MDA4XSBBQ1BJOiBQQ0kg
SW50ZXJydXB0IExpbmsgW0xTTUJdIChJUlFzIDIwIDIxIDIyIDIzKSAqMTEKWyAgICAxLjYxOTAw
M10gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMUE1VXSAoSVJRcyAyMCAyMSAyMiAyMykgKjAs
IGRpc2FibGVkLgpbICAgIDEuNjIzMDIzXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xTQTBd
IChJUlFzIDIwIDIxIDIyIDIzKSAqMCwgZGlzYWJsZWQuClsgICAgMS42MjcwMjNdIEFDUEk6IFBD
SSBJbnRlcnJ1cHQgTGluayBbTFNBMV0gKElSUXMgMjAgMjEgMjIgMjMpICowLCBkaXNhYmxlZC4K
WyAgICAxLjYzNDI2MF0gQUNQSSBXYXJuaW5nIGZvciBcX1NCXy5MQVRBLl9DUlM6IFJldHVybiB0
eXBlIG1pc21hdGNoIC0gZm91bmQgSW50ZWdlciwgZXhwZWN0ZWQgQnVmZmVyICgyMDA5MDkwMy9u
c3ByZWRlZi0xMDA2KQpbICAgIDEuNjM2MDA1XSBBQ1BJIEVycm9yICh1dGV2YWwtMDMwNyk6IFJl
dHVybiBvYmplY3QgdHlwZSBpcyBpbmNvcnJlY3QgW1xfU0JfLkxBVEEuX0NSU10gKE5vZGUgZmZm
Zjg4MDAzZmRjMmFlMCksIEFFX1RZUEUKWyAgICAxLjYzNjAwNV0gQUNQSSBFcnJvcjogVHlwZSBy
ZXR1cm5lZCBmcm9tIF9DUlMgd2FzIGluY29ycmVjdDogSW50ZWdlciwgZXhwZWN0ZWQgQnR5cGVz
OiA0ICgyMDA5MDkwMy91dGV2YWwtMzEzKQpbICAgIDEuNjM2MDA1XSBBQ1BJIEV4Y2VwdGlvbjog
QUVfVFlQRSwgRXZhbHVhdGluZyBfQ1JTICgyMDA5MDkwMy9wY2lfbGluay0yODIpClsgICAgMS42
MzYwMDVdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTEFUQV0gKElSUXMgMjAgMjEgMjIgMjMp
ICowLCBkaXNhYmxlZC4KWyAgICAxLjYzNjYyN10geGVuX2JhbGxvb246IEluaXRpYWxpc2luZyBi
YWxsb29uIGRyaXZlciB3aXRoIHBhZ2Ugb3JkZXIgMC4KWyAgICAxLjYzODAzMl0gdmdhYXJiOiBk
ZXZpY2UgYWRkZWQ6IFBDSTowMDAwOjAwOjBkLjAsZGVjb2Rlcz1pbyttZW0sb3ducz1pbyttZW0s
bG9ja3M9bm9uZQpbICAgIDEuNjM4ODI0XSB2Z2FhcmI6IGxvYWRlZApbICAgIDEuNjQwNjA3XSBQ
Q0k6IFVzaW5nIEFDUEkgZm9yIElSUSByb3V0aW5nClsgICAgMS42NDU2MTldIFN3aXRjaGluZyB0
byBjbG9ja3NvdXJjZSB4ZW4KWyAgICAxLjY2ODczMl0gcG5wOiBQblAgQUNQSSBpbml0ClsgICAg
MS42Njk0MjZdIEFDUEk6IGJ1cyB0eXBlIHBucCByZWdpc3RlcmVkClsgICAgMS42NzQyNDNdIHhl
bjogcmVnaXN0ZXJpbmcgZ3NpIDggdHJpZ2dlcmluZyAxIHBvbGFyaXR5IDAKWyAgICAxLjY3NDI4
MF0geGVuX2FsbG9jYXRlX3BpcnE6IHJldHVybmluZyBpcnEgOCBmb3IgZ3NpIDgKWyAgICAxLjY3
NDkxMl0geGVuOiAtLT4gaXJxPTgKWyAgICAxLjY3NjQyNl0geGVuOiByZWdpc3RlcmluZyBnc2kg
MTMgdHJpZ2dlcmluZyAxIHBvbGFyaXR5IDAKWyAgICAxLjY3NjQ2NF0geGVuX2FsbG9jYXRlX3Bp
cnE6IHJldHVybmluZyBpcnEgMTMgZm9yIGdzaSAxMwpbICAgIDEuNjc3MTAzXSB4ZW46IC0tPiBp
cnE9MTMKWyAgICAxLjY5ODYzMl0geGVuOiByZWdpc3RlcmluZyBnc2kgNyB0cmlnZ2VyaW5nIDEg
cG9sYXJpdHkgMApbICAgIDEuNjk4NjY5XSB4ZW5fYWxsb2NhdGVfcGlycTogcmV0dXJuaW5nIGly
cSA3IGZvciBnc2kgNwpbICAgIDEuNjk5MzA2XSB4ZW46IC0tPiBpcnE9NwpbICAgIDEuNzI3MTMx
XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAxIHRyaWdnZXJpbmcgMSBwb2xhcml0eSAwClsgICAgMS43
MjcxNjldIHhlbl9hbGxvY2F0ZV9waXJxOiByZXR1cm5pbmcgaXJxIDEgZm9yIGdzaSAxClsgICAg
MS43Mjc4MDhdIHhlbjogLS0+IGlycT0xClsgICAgMS43NDAyNTRdIHhlbjogcmVnaXN0ZXJpbmcg
Z3NpIDQgdHJpZ2dlcmluZyAxIHBvbGFyaXR5IDAKWyAgICAxLjc0MDI5Ml0geGVuX2FsbG9jYXRl
X3BpcnE6IHJldHVybmluZyBpcnEgNCBmb3IgZ3NpIDQKWyAgICAxLjc0MDkzNV0geGVuOiAtLT4g
aXJxPTQKWyAgICAxLjc2NDExNV0gcG5wOiBQblAgQUNQSTogZm91bmQgMTMgZGV2aWNlcwpbICAg
IDEuNzY0MTE1XSBBQ1BJOiBBQ1BJIGJ1cyB0eXBlIHBucCB1bnJlZ2lzdGVyZWQKWyAgICAxLjc2
Njc3OF0gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHg0ZDAtMHg0ZDEgaGFzIGJlZW4gcmVz
ZXJ2ZWQKWyAgICAxLjc2NzQyM10gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHg1MDAtMHg1
N2YgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAxLjc2ODA4NF0gc3lzdGVtIDAwOjA2OiBpb3BvcnQg
cmFuZ2UgMHg1ODAtMHg1ZmYgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAxLjc2ODc2NF0gc3lzdGVt
IDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHg4MDAtMHg4N2YgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAx
Ljc2OTQwNl0gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHg4ODAtMHg4ZmYgaGFzIGJlZW4g
cmVzZXJ2ZWQKWyAgICAxLjc3MDE3N10gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHhkMDAt
MHhkN2YgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAxLjc3MDgyNV0gc3lzdGVtIDAwOjA2OiBpb3Bv
cnQgcmFuZ2UgMHhkODAtMHhkZmYgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAxLjc3MTQ3Nl0gc3lz
dGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHgxMTAwLTB4MTE3ZiBoYXMgYmVlbiByZXNlcnZlZApb
ICAgIDEuNzcyMTM2XSBzeXN0ZW0gMDA6MDY6IGlvcG9ydCByYW5nZSAweDExODAtMHgxMWZmIGhh
cyBiZWVuIHJlc2VydmVkClsgICAgMS43NzI4MDFdIHN5c3RlbSAwMDowNjogaW9tZW0gcmFuZ2Ug
MHhmZWM4MDAwMC0weDFmZDkzZmZmZiBjb3VsZCBub3QgYmUgcmVzZXJ2ZWQKWyAgICAxLjc3MzUw
MV0gc3lzdGVtIDAwOjA2OiBpb21lbSByYW5nZSAweGZlZmUwMDAwLTB4ZmVmZTAxZmYgaGFzIGJl
ZW4gcmVzZXJ2ZWQKWyAgICAxLjc3NDA3OF0gc3lzdGVtIDAwOjA2OiBpb21lbSByYW5nZSAweGZl
ZmUxMDAwLTB4ZmVmZTFmZmYgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAxLjc3NDA3OF0gc3lzdGVt
IDAwOjA2OiBpb21lbSByYW5nZSAweGZlZTAxMDAwLTB4ZmVlZmZmZmYgaGFzIGJlZW4gcmVzZXJ2
ZWQKWyAgICAxLjc3NTY0M10gc3lzdGVtIDAwOjA3OiBpb21lbSByYW5nZSAweGZlYzAwMDAwLTB4
ZmVjMDBmZmYgY291bGQgbm90IGJlIHJlc2VydmVkClsgICAgMS43NzYzNzBdIHN5c3RlbSAwMDow
NzogaW9tZW0gcmFuZ2UgMHhmZWUwMDAwMC0weGZlZTAwZmZmIGhhcyBiZWVuIHJlc2VydmVkClsg
ICAgMS43NzcxNjhdIHN5c3RlbSAwMDowYTogaW9wb3J0IHJhbmdlIDB4MjgwLTB4MjhmIGhhcyBi
ZWVuIHJlc2VydmVkClsgICAgMS43Nzc4MjVdIHN5c3RlbSAwMDowYTogaW9wb3J0IHJhbmdlIDB4
MjkwLTB4MjlmIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMS43Nzg1MzNdIHN5c3RlbSAwMDowYjog
aW9tZW0gcmFuZ2UgMHhmYzAwMDAwMC0weGZkZmZmZmZmIGhhcyBiZWVuIHJlc2VydmVkClsgICAg
MS43NzkyOTNdIHN5c3RlbSAwMDowYzogaW9tZW0gcmFuZ2UgMHgwLTB4OWZmZmYgY291bGQgbm90
IGJlIHJlc2VydmVkClsgICAgMS43Nzk5NTZdIHN5c3RlbSAwMDowYzogaW9tZW0gcmFuZ2UgMHhl
MDAwMC0weGZmZmZmIGNvdWxkIG5vdCBiZSByZXNlcnZlZApbICAgIDEuNzgwNjIzXSBzeXN0ZW0g
MDA6MGM6IGlvbWVtIHJhbmdlIDB4MTAwMDAwLTB4ZGZmZmZmZmYgY291bGQgbm90IGJlIHJlc2Vy
dmVkClsgICAgMS43ODEwNDhdIHN5c3RlbSAwMDowYzogaW9tZW0gcmFuZ2UgMHhmZjM4MDAwMC0w
eGZmZmZmZmZmIGNvdWxkIG5vdCBiZSByZXNlcnZlZApbICAgIDIuMDQ2OTI0XSBQTS1UaW1lciBm
YWlsZWQgY29uc2lzdGVuY3kgY2hlY2sgICgweDB4ZmZmZmZmKSAtIGFib3J0aW5nLgpbICAgIDIu
MDQ4MTE0XSBwY2kgMDAwMDowMDowNC4wOiBQQ0kgYnJpZGdlLCBzZWNvbmRhcnkgYnVzIDAwMDA6
MDEKWyAgICAyLjA0ODExNF0gcGNpIDAwMDA6MDA6MDQuMDogICBJTyB3aW5kb3c6IGRpc2FibGVk
ClsgICAgMi4wNDgxMTRdIHBjaSAwMDAwOjAwOjA0LjA6ICAgTUVNIHdpbmRvdzogZGlzYWJsZWQK
WyAgICAyLjA0ODExNF0gcGNpIDAwMDA6MDA6MDQuMDogICBQUkVGRVRDSCB3aW5kb3c6IGRpc2Fi
bGVkClsgICAgMi4wNDgxMTRdIHBjaSAwMDAwOjAwOjA5LjA6IFBDSSBicmlkZ2UsIHNlY29uZGFy
eSBidXMgMDAwMDowMgpbICAgIDIuMDQ4MTE0XSBwY2kgMDAwMDowMDowOS4wOiAgIElPIHdpbmRv
dzogZGlzYWJsZWQKWyAgICAyLjA0ODExNF0gcGNpIDAwMDA6MDA6MDkuMDogICBNRU0gd2luZG93
OiBkaXNhYmxlZApbICAgIDIuMDQ4MTE0XSBwY2kgMDAwMDowMDowOS4wOiAgIFBSRUZFVENIIHdp
bmRvdzogZGlzYWJsZWQKWyAgICAyLjA0ODExNF0gcGNpIDAwMDA6MDA6MGIuMDogUENJIGJyaWRn
ZSwgc2Vjb25kYXJ5IGJ1cyAwMDAwOjAzClsgICAgMi4wNDgxMTRdIHBjaSAwMDAwOjAwOjBiLjA6
ICAgSU8gd2luZG93OiAweGUwMDAtMHhlZmZmClsgICAgMi4wNDgxMTRdIHBjaSAwMDAwOjAwOjBi
LjA6ICAgTUVNIHdpbmRvdzogMHhmYmYwMDAwMC0weGZiZmZmZmZmClsgICAgMi4wNDgxMTRdIHBj
aSAwMDAwOjAwOjBiLjA6ICAgUFJFRkVUQ0ggd2luZG93OiAweDAwMDAwMGY2MDAwMDAwLTB4MDAw
MDAwZjdmZmZmZmYKWyAgICAyLjA0ODExNF0gcGNpIDAwMDA6MDA6MGMuMDogUENJIGJyaWRnZSwg
c2Vjb25kYXJ5IGJ1cyAwMDAwOjA0ClsgICAgMi4wNDgxMTRdIHBjaSAwMDAwOjAwOjBjLjA6ICAg
SU8gd2luZG93OiBkaXNhYmxlZApbICAgIDIuMDQ4MTE0XSBwY2kgMDAwMDowMDowYy4wOiAgIE1F
TSB3aW5kb3c6IGRpc2FibGVkClsgICAgMi4wNDgxMTRdIHBjaSAwMDAwOjAwOjBjLjA6ICAgUFJF
RkVUQ0ggd2luZG93OiBkaXNhYmxlZApbICAgIDIuMDQ4MTE0XSBwY2kgMDAwMDowMDowNC4wOiBz
ZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICAyLjA0ODExNF0gcGNpIDAwMDA6MDA6MDku
MDogc2V0dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0ClsgICAgMi4wNDgxMTRdIHBjaSAwMDAwOjAw
OjBiLjA6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApbICAgIDIuMDQ4MTE0XSBwY2kgMDAw
MDowMDowYy4wOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICAyLjA0ODExNF0gcGNp
X2J1cyAwMDAwOjAwOiByZXNvdXJjZSAwIGlvOiAgWzB4MDAtMHhmZmZmXQpbICAgIDIuMDQ4MTE0
XSBwY2lfYnVzIDAwMDA6MDA6IHJlc291cmNlIDEgbWVtOiBbMHgwMDAwMDAtMHhmZmZmZmZmZmZm
ZmZmZmZmXQpbICAgIDIuMDQ4MTE0XSBwY2lfYnVzIDAwMDA6MDE6IHJlc291cmNlIDMgaW86ICBb
MHgwMC0weGZmZmZdClsgICAgMi4wNDgxMTRdIHBjaV9idXMgMDAwMDowMTogcmVzb3VyY2UgNCBt
ZW06IFsweDAwMDAwMC0weGZmZmZmZmZmZmZmZmZmZmZdClsgICAgMi4wNDgxMTRdIHBjaV9idXMg
MDAwMDowMzogcmVzb3VyY2UgMCBpbzogIFsweGUwMDAtMHhlZmZmXQpbICAgIDIuMDQ4MTE0XSBw
Y2lfYnVzIDAwMDA6MDM6IHJlc291cmNlIDEgbWVtOiBbMHhmYmYwMDAwMC0weGZiZmZmZmZmXQpb
ICAgIDIuMDQ4MTE0XSBwY2lfYnVzIDAwMDA6MDM6IHJlc291cmNlIDIgcHJlZiBtZW0gWzB4ZjYw
MDAwMDAtMHhmN2ZmZmZmZl0KWyAgICAyLjA0ODExNF0gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29s
IGZhbWlseSAyClsgICAgMi4wNjcxMTZdIElQIHJvdXRlIGNhY2hlIGhhc2ggdGFibGUgZW50cmll
czogMzI3NjggKG9yZGVyOiA2LCAyNjIxNDQgYnl0ZXMpClsgICAgMi4wODk2NTZdIFRDUCBlc3Rh
Ymxpc2hlZCBoYXNoIHRhYmxlIGVudHJpZXM6IDEzMTA3MiAob3JkZXI6IDksIDIwOTcxNTIgYnl0
ZXMpClsgICAgMi4xMDA5NjddIFRDUCBiaW5kIGhhc2ggdGFibGUgZW50cmllczogNjU1MzYgKG9y
ZGVyOiA4LCAxMDQ4NTc2IGJ5dGVzKQpbICAgIDIuMTAxOTk3XSBUQ1A6IEhhc2ggdGFibGVzIGNv
bmZpZ3VyZWQgKGVzdGFibGlzaGVkIDEzMTA3MiBiaW5kIDY1NTM2KQpbICAgIDIuMTAyNjM3XSBU
Q1AgcmVubyByZWdpc3RlcmVkClsgICAgMi4xMDM4MjddIE5FVDogUmVnaXN0ZXJlZCBwcm90b2Nv
bCBmYW1pbHkgMQpbICAgIDIuMTg3NDMwXSBwY2kgMDAwMDowMDowMC4wOiBGb3VuZCBlbmFibGVk
IEhUIE1TSSBNYXBwaW5nClsgICAgMi4xODgxODZdIHBjaSAwMDAwOjAwOjAwLjA6IEZvdW5kIGVu
YWJsZWQgSFQgTVNJIE1hcHBpbmcKWyAgICAyLjE4ODE4Nl0gcGNpIDAwMDA6MDA6MDAuMDogRm91
bmQgZW5hYmxlZCBIVCBNU0kgTWFwcGluZwpbICAgIDIuMTg4MTg2XSBwY2kgMDAwMDowMDowMC4w
OiBGb3VuZCBlbmFibGVkIEhUIE1TSSBNYXBwaW5nClsgICAgMi4xODgxODZdIHBjaSAwMDAwOjAw
OjAwLjA6IEZvdW5kIGVuYWJsZWQgSFQgTVNJIE1hcHBpbmcKWyAgICAyLjE4ODE4Nl0gcGNpIDAw
MDA6MDA6MDAuMDogRm91bmQgZW5hYmxlZCBIVCBNU0kgTWFwcGluZwpbICAgIDIuMTg4MTg2XSBw
Y2kgMDAwMDowMDowZC4wOiBCb290IHZpZGVvIGRldmljZQpbICAgIDIuMTg4MTg2XSBVbnBhY2tp
bmcgaW5pdHJhbWZzLi4uClsgICAgMi40MjE4MzZdIEZyZWVpbmcgaW5pdHJkIG1lbW9yeTogMjg5
NDlrIGZyZWVkClsgICAgMi40ODAzNTZdIFBDSS1ETUE6IFVzaW5nIHNvZnR3YXJlIGJvdW5jZSBi
dWZmZXJpbmcgZm9yIElPIChTV0lPVExCKQpbICAgIDIuNDgxMDQ0XSBETUE6IFBsYWNpbmcgNjRN
QiBzb2Z0d2FyZSBJTyBUTEIgYmV0d2VlbiBmZmZmODgwMDA0NzI4MDAwIC0gZmZmZjg4MDAwODcy
ODAwMApbICAgIDIuNDgxNzU3XSBETUE6IHNvZnR3YXJlIElPIFRMQiBhdCBwaHlzIDB4NDcyODAw
MCAtIDB4ODcyODAwMApbICAgIDIuNDg3NTA0XSBhdWRpdDogaW5pdGlhbGl6aW5nIG5ldGxpbmsg
c29ja2V0IChkaXNhYmxlZCkKWyAgICAyLjQ4ODMxMV0gdHlwZT0yMDAwIGF1ZGl0KDEzMjUyNDE3
NTIuMjQyOjEpOiBpbml0aWFsaXplZApbICAgIDIuNDkyODQ2XSBIdWdlVExCIHJlZ2lzdGVyZWQg
MiBNQiBwYWdlIHNpemUsIHByZS1hbGxvY2F0ZWQgMCBwYWdlcwpbICAgIDIuNTExMzg5XSBWRlM6
IERpc2sgcXVvdGFzIGRxdW90XzYuNS4yClsgICAgMi41MTI0NjhdIERxdW90LWNhY2hlIGhhc2gg
dGFibGUgZW50cmllczogNTEyIChvcmRlciAwLCA0MDk2IGJ5dGVzKQpbICAgIDIuNTE0MTQ0XSBt
c2dtbmkgaGFzIGJlZW4gc2V0IHRvIDE4NjgKWyAgICAyLjUxNzUxMV0gYWxnOiBObyB0ZXN0IGZv
ciBzdGRybmcgKGtybmcpClsgICAgMi41MTg3MjNdIEJsb2NrIGxheWVyIFNDU0kgZ2VuZXJpYyAo
YnNnKSBkcml2ZXIgdmVyc2lvbiAwLjQgbG9hZGVkIChtYWpvciAyNTMpClsgICAgMi41MTk0MjZd
IGlvIHNjaGVkdWxlciBub29wIHJlZ2lzdGVyZWQKWyAgICAyLjUyMDA4NF0gaW8gc2NoZWR1bGVy
IGFudGljaXBhdG9yeSByZWdpc3RlcmVkClsgICAgMi41MjAxMTNdIGlvIHNjaGVkdWxlciBkZWFk
bGluZSByZWdpc3RlcmVkClsgICAgMi41MjI0ODNdIGlvIHNjaGVkdWxlciBjZnEgcmVnaXN0ZXJl
ZCAoZGVmYXVsdCkKWyAgICAyLjUyODExMl0gICBhbGxvYyBpcnFfZGVzYyBmb3IgNTA0IG9uIG5v
ZGUgLTEKWyAgICAyLjUyODExMl0gICBhbGxvYyBrc3RhdF9pcnFzIG9uIG5vZGUgLTEKWyAgICAy
LjUyOTkwNV0gcGNpZXBvcnQgMDAwMDowMDowOS4wOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8g
NjQKWyAgICAyLjUzNjg1NV0gICBhbGxvYyBpcnFfZGVzYyBmb3IgNTAzIG9uIG5vZGUgLTEKWyAg
ICAyLjUzNjg1NV0gICBhbGxvYyBrc3RhdF9pcnFzIG9uIG5vZGUgLTEKWyAgICAyLjUzODQ1Ml0g
cGNpZXBvcnQgMDAwMDowMDowYi4wOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICAy
LjU0NTM0N10gICBhbGxvYyBpcnFfZGVzYyBmb3IgNTAyIG9uIG5vZGUgLTEKWyAgICAyLjU0NTM0
N10gICBhbGxvYyBrc3RhdF9pcnFzIG9uIG5vZGUgLTEKWyAgICAyLjU0Njk2OF0gcGNpZXBvcnQg
MDAwMDowMDowYy4wOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICAyLjYzODEzM10g
cmVnaXN0ZXJpbmcgbmV0YmFjawpbICAgIDIuNjM5MzIzXSAgIGFsbG9jIGlycV9kZXNjIGZvciA1
MDEgb24gbm9kZSAtMQpbICAgIDIuNjM5MzY1XSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAt
MQpbICAgIDIuNjUzOTMwXSAgIGFsbG9jIGlycV9kZXNjIGZvciA1MDAgb24gbm9kZSAtMQpbICAg
IDIuNjUzOTcxXSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAtMQpbICAgIDIuNjU2NDU5XSBM
aW51eCBhZ3BnYXJ0IGludGVyZmFjZSB2MC4xMDMKWyAgICAyLjY1NzQ1OV0gU2VyaWFsOiA4MjUw
LzE2NTUwIGRyaXZlciwgNCBwb3J0cywgSVJRIHNoYXJpbmcgZW5hYmxlZApbICAgIDIuNjU5Njgy
XSBzZXJpYWw4MjUwOiB0dHlTMCBhdCBJL08gMHgzZjggKGlycSA9IDQpIGlzIGEgMTY1NTBBClsg
ICAgMi42NjI5MTRdIDAwOjA5OiB0dHlTMCBhdCBJL08gMHgzZjggKGlycSA9IDQpIGlzIGEgMTY1
NTBBClsgICAgMi42NjQ1NDddIGlucHV0OiBNYWNpbnRvc2ggbW91c2UgYnV0dG9uIGVtdWxhdGlv
biBhcyAvZGV2aWNlcy92aXJ0dWFsL2lucHV0L2lucHV0MApbICAgIDIuNjY1NTg0XSBQTlA6IFBT
LzIgQ29udHJvbGxlciBbUE5QMDMwMzpQUzJLXSBhdCAweDYwLDB4NjQgaXJxIDEKWyAgICAyLjY2
NjIyMl0gUE5QOiBQUy8yIGFwcGVhcnMgdG8gaGF2ZSBBVVggcG9ydCBkaXNhYmxlZCwgaWYgdGhp
cyBpcyBpbmNvcnJlY3QgcGxlYXNlIGJvb3Qgd2l0aCBpODA0Mi5ub3BucApbICAgIDIuNjY4MTEy
XSBzZXJpbzogaTgwNDIgS0JEIHBvcnQgYXQgMHg2MCwweDY0IGlycSAxClsgICAgMi42NzA0MTdd
IG1pY2U6IFBTLzIgbW91c2UgZGV2aWNlIGNvbW1vbiBmb3IgYWxsIG1pY2UKWyAgICAyLjY3MTgw
N10gcnRjX2Ntb3MgMDA6MDI6IFJUQyBjYW4gd2FrZSBmcm9tIFM0ClsgICAgMi42NzI3ODFdIHJ0
Y19jbW9zIDAwOjAyOiBydGMgY29yZTogcmVnaXN0ZXJlZCBydGNfY21vcyBhcyBydGMwClsgICAg
Mi42NzM4NDJdIHJ0YzA6IGFsYXJtcyB1cCB0byBvbmUgeWVhciwgeTNrLCAxMTQgYnl0ZXMgbnZy
YW0KWyAgICAyLjY3NDg5M10gY3B1aWRsZTogdXNpbmcgZ292ZXJub3IgbGFkZGVyClsgICAgMi42
NzU1NTZdIGNwdWlkbGU6IHVzaW5nIGdvdmVybm9yIG1lbnUKWyAgICAyLjY3NjI1MF0gTm8gaUJG
VCBkZXRlY3RlZC4KWyAgICAyLjY3Nzc1M10gVENQIGN1YmljIHJlZ2lzdGVyZWQKWyAgICAyLjY3
OTg3NF0gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAxMApbICAgIDIuNjg2NTMxXSBN
b2JpbGUgSVB2NgpbICAgIDIuNjg3MTYzXSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5
IDE3ClsgICAgMi42ODg2MDJdIFBNOiBSZXN1bWUgZnJvbSBkaXNrIGZhaWxlZC4KWyAgICAyLjY4
ODcyNl0gcmVnaXN0ZXJlZCB0YXNrc3RhdHMgdmVyc2lvbiAxClsgICAgMi43MDIwNzRdIHJ0Y19j
bW9zIDAwOjAyOiBzZXR0aW5nIHN5c3RlbSBjbG9jayB0byAyMDExLTEyLTMwIDEwOjQyOjMzIFVU
QyAoMTMyNTI0MTc1MykKWyAgICAyLjcwMzI1OF0gSW5pdGFsaXppbmcgbmV0d29yayBkcm9wIG1v
bml0b3Igc2VydmljZQpbICAgIDIuNzA0MTI5XSBGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5
OiA2MDRrIGZyZWVkClsgICAgMi43MDUzODJdIFdyaXRlIHByb3RlY3RpbmcgdGhlIGtlcm5lbCBy
ZWFkLW9ubHkgZGF0YTogNDMyMGsKWyAgICAyLjgwOTE0N10gaW5wdXQ6IEFUIFRyYW5zbGF0ZWQg
U2V0IDIga2V5Ym9hcmQgYXMgL2RldmljZXMvcGxhdGZvcm0vaTgwNDIvc2VyaW8wL2lucHV0L2lu
cHV0MQpbICAgIDQuMjI5OTQ0XSB1ZGV2WzcyXTogc3RhcnRpbmcgdmVyc2lvbiAxNjQKWyAgICA2
LjI2NDg3NF0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciB1c2Jmcwpb
ICAgIDYuMjY1NTQ4XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIGh1
YgpbICAgIDYuMzYxOTYyXSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBkZXZpY2UgZHJpdmVyIHVz
YgpbICAgIDYuNjY3NTE2XSBlaGNpX2hjZDogVVNCIDIuMCAnRW5oYW5jZWQnIEhvc3QgQ29udHJv
bGxlciAoRUhDSSkgRHJpdmVyClsgICAgNi45NjExNDJdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGlu
ayBbTFVCMl0gZW5hYmxlZCBhdCBJUlEgMjMKWyAgICA2Ljk2MTc3OF0geGVuOiByZWdpc3Rlcmlu
ZyBnc2kgMjMgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDEKWyAgICA2Ljk2MTgyNV0gICBhbGxvYyBp
cnFfZGVzYyBmb3IgMjMgb24gbm9kZSAtMQpbICAgIDYuOTYxODY2XSAgIGFsbG9jIGtzdGF0X2ly
cXMgb24gbm9kZSAtMQpbICAgIDYuOTYxOTQwXSB4ZW46IC0tPiBpcnE9MjMKWyAgICA2Ljk2MjA0
M10gZWhjaV9oY2QgMDAwMDowMDowMi4xOiBQQ0kgSU5UIEIgLT4gTGlua1tMVUIyXSAtPiBHU0kg
MjMgKGxldmVsLCBsb3cpIC0+IElSUSAyMwpbICAgIDYuOTYyOTMyXSBlaGNpX2hjZCAwMDAwOjAw
OjAyLjE6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApbICAgIDYuOTYzMDExXSBlaGNpX2hj
ZCAwMDAwOjAwOjAyLjE6IEVIQ0kgSG9zdCBDb250cm9sbGVyClsgICAgNy4wMDg0NDhdIGVoY2lf
aGNkIDAwMDA6MDA6MDIuMTogbmV3IFVTQiBidXMgcmVnaXN0ZXJlZCwgYXNzaWduZWQgYnVzIG51
bWJlciAxClsgICAgNy4wMTAxMjNdIGVoY2lfaGNkIDAwMDA6MDA6MDIuMTogZGVidWcgcG9ydCAx
ClsgICAgNy4wMTA5ODddIGVoY2lfaGNkIDAwMDA6MDA6MDIuMTogY2FjaGUgbGluZSBzaXplIG9m
IDY0IGlzIG5vdCBzdXBwb3J0ZWQKWyAgICA3LjAxMTI1N10gZWhjaV9oY2QgMDAwMDowMDowMi4x
OiBpcnEgMjMsIGlvIG1lbSAweGZiZWZlYzAwClsgICAgNy4xMjgzMTNdIGVoY2lfaGNkIDAwMDA6
MDA6MDIuMTogVVNCIDIuMCBzdGFydGVkLCBFSENJIDEuMDAKWyAgICA3LjEyOTM5Ml0gdXNiIHVz
YjE6IE5ldyBVU0IgZGV2aWNlIGZvdW5kLCBpZFZlbmRvcj0xZDZiLCBpZFByb2R1Y3Q9MDAwMgpb
ICAgIDcuMTMwMDU3XSB1c2IgdXNiMTogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPTMsIFBy
b2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTEKWyAgICA3LjEzMDc2MF0gdXNiIHVzYjE6IFByb2R1Y3Q6
IEVIQ0kgSG9zdCBDb250cm9sbGVyClsgICAgNy4xMzEzOTVdIHVzYiB1c2IxOiBNYW51ZmFjdHVy
ZXI6IExpbnV4IDIuNi4zMi01LXhlbi1hbWQ2NCBlaGNpX2hjZApbICAgIDcuMTMyMDMzXSB1c2Ig
dXNiMTogU2VyaWFsTnVtYmVyOiAwMDAwOjAwOjAyLjEKWyAgICA3LjIxNjgxN10gdXNiIHVzYjE6
IGNvbmZpZ3VyYXRpb24gIzEgY2hvc2VuIGZyb20gMSBjaG9pY2UKWyAgICA3LjIxNzcyN10gaHVi
IDEtMDoxLjA6IFVTQiBodWIgZm91bmQKWyAgICA3LjI1NjI5MF0gaHViIDEtMDoxLjA6IDEwIHBv
cnRzIGRldGVjdGVkClsgICAgNy4zNjQzNjVdIG9oY2lfaGNkOiBVU0IgMS4xICdPcGVuJyBIb3N0
IENvbnRyb2xsZXIgKE9IQ0kpIERyaXZlcgpbICAgIDcuNDg3NjM0XSBBQ1BJOiBQQ0kgSW50ZXJy
dXB0IExpbmsgW0xVQjBdIGVuYWJsZWQgYXQgSVJRIDIyClsgICAgNy40ODgxMjRdIHhlbjogcmVn
aXN0ZXJpbmcgZ3NpIDIyIHRyaWdnZXJpbmcgMCBwb2xhcml0eSAxClsgICAgNy40ODgxMjRdICAg
YWxsb2MgaXJxX2Rlc2MgZm9yIDIyIG9uIG5vZGUgLTEKWyAgICA3LjQ4ODEyNF0gICBhbGxvYyBr
c3RhdF9pcnFzIG9uIG5vZGUgLTEKWyAgICA3LjQ4ODY5N10geGVuOiAtLT4gaXJxPTIyClsgICAg
Ny40ODg4MDJdIG9oY2lfaGNkIDAwMDA6MDA6MDIuMDogUENJIElOVCBBIC0+IExpbmtbTFVCMF0g
LT4gR1NJIDIyIChsZXZlbCwgbG93KSAtPiBJUlEgMjIKWyAgICA3LjU1OTc5Ml0gb2hjaV9oY2Qg
MDAwMDowMDowMi4wOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICA3LjU1OTg4NV0g
b2hjaV9oY2QgMDAwMDowMDowMi4wOiBPSENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDcuNTYwMTM2
XSBvaGNpX2hjZCAwMDAwOjAwOjAyLjA6IG5ldyBVU0IgYnVzIHJlZ2lzdGVyZWQsIGFzc2lnbmVk
IGJ1cyBudW1iZXIgMgpbICAgIDcuNTYwMTM2XSBvaGNpX2hjZCAwMDAwOjAwOjAyLjA6IGlycSAy
MiwgaW8gbWVtIDB4ZmJlZmYwMDAKWyAgICA3LjU5MDg1OV0gdXNiIDEtMjogbmV3IGhpZ2ggc3Bl
ZWQgVVNCIGRldmljZSB1c2luZyBlaGNpX2hjZCBhbmQgYWRkcmVzcyAyClsgICAgNy42MTk4MzVd
IHVzYiB1c2IyOiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9MWQ2YiwgaWRQcm9kdWN0
PTAwMDEKWyAgICA3LjYyMDQ5Nl0gdXNiIHVzYjI6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1m
cj0zLCBQcm9kdWN0PTIsIFNlcmlhbE51bWJlcj0xClsgICAgNy42MjA2MjZdIHVzYiB1c2IyOiBQ
cm9kdWN0OiBPSENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDcuNjIwNjI2XSB1c2IgdXNiMjogTWFu
dWZhY3R1cmVyOiBMaW51eCAyLjYuMzItNS14ZW4tYW1kNjQgb2hjaV9oY2QKWyAgICA3LjYyMDYy
Nl0gdXNiIHVzYjI6IFNlcmlhbE51bWJlcjogMDAwMDowMDowMi4wClsgICAgNy43MDIxMTNdIHVz
YiB1c2IyOiBjb25maWd1cmF0aW9uICMxIGNob3NlbiBmcm9tIDEgY2hvaWNlClsgICAgNy43MDMw
OThdIGh1YiAyLTA6MS4wOiBVU0IgaHViIGZvdW5kClsgICAgNy43MDQwMTddIGh1YiAyLTA6MS4w
OiAxMCBwb3J0cyBkZXRlY3RlZApbICAgIDcuNzI1Mzc1XSB1c2IgMS0yOiBOZXcgVVNCIGRldmlj
ZSBmb3VuZCwgaWRWZW5kb3I9MDQwOSwgaWRQcm9kdWN0PTAwNWEKWyAgICA3LjcyNjAxMl0gdXNi
IDEtMjogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPTAsIFByb2R1Y3Q9MCwgU2VyaWFsTnVt
YmVyPTAKWyAgICA3LjcyNzExNl0gdXNiIDEtMjogY29uZmlndXJhdGlvbiAjMSBjaG9zZW4gZnJv
bSAxIGNob2ljZQpbICAgIDcuNzYyMDM0XSBodWIgMS0yOjEuMDogVVNCIGh1YiBmb3VuZApbICAg
IDcuNzc4MTQ3XSBodWIgMS0yOjEuMDogNCBwb3J0cyBkZXRlY3RlZApbICAgIDcuNzkzNTQyXSBm
b3JjZWRldGg6IFJldmVyc2UgRW5naW5lZXJlZCBuRm9yY2UgZXRoZXJuZXQgZHJpdmVyLiBWZXJz
aW9uIDAuNjQuClsgICAgNy44MTE5MDVdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE1BQ10g
ZW5hYmxlZCBhdCBJUlEgMjEKWyAgICA3LjgxMjUwN10geGVuOiByZWdpc3RlcmluZyBnc2kgMjEg
dHJpZ2dlcmluZyAwIHBvbGFyaXR5IDEKWyAgICA3LjgxMjUwN10gICBhbGxvYyBpcnFfZGVzYyBm
b3IgMjEgb24gbm9kZSAtMQpbICAgIDcuODEyNTA3XSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9k
ZSAtMQpbICAgIDcuODEyODc0XSB4ZW46IC0tPiBpcnE9MjEKWyAgICA3LjgxMjk3N10gZm9yY2Vk
ZXRoIDAwMDA6MDA6MDcuMDogUENJIElOVCBBIC0+IExpbmtbTE1BQ10gLT4gR1NJIDIxIChsZXZl
bCwgbG93KSAtPiBJUlEgMjEKWyAgICA3LjgxMzc5Ml0gZm9yY2VkZXRoIDAwMDA6MDA6MDcuMDog
c2V0dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0ClsgICAgNy45NTIwMjVdIGZvcmNlZGV0aCAwMDAw
OjAwOjA3LjA6IGlmbmFtZSBldGgwLCBQSFkgT1VJIDB4NzMyIEAgMywgYWRkciAwMDoyNToyMjo3
Mzo0YjpjZApbICAgIDcuOTUyNzEwXSBmb3JjZWRldGggMDAwMDowMDowNy4wOiBoaWdoZG1hIHB3
cmN0bCBtZ210IGdiaXQgbG5rdGltIG1zaSBkZXNjLXYzClsgICAgNy45NjYxOThdIFNDU0kgc3Vi
c3lzdGVtIGluaXRpYWxpemVkClsgICAgOC4wOTY3ODddIHVzYiAxLTIuMTogbmV3IGhpZ2ggc3Bl
ZWQgVVNCIGRldmljZSB1c2luZyBlaGNpX2hjZCBhbmQgYWRkcmVzcyAzClsgICAgOC4xMjQ1MjRd
IDN3YXJlIDkwMDAgU3RvcmFnZSBDb250cm9sbGVyIGRldmljZSBkcml2ZXIgZm9yIExpbnV4IHYy
LjI2LjAyLjAxMi4KWyAgICA4LjIyMzYyNF0gdXNiIDEtMi4xOiBOZXcgVVNCIGRldmljZSBmb3Vu
ZCwgaWRWZW5kb3I9MTRkZCwgaWRQcm9kdWN0PTAwMDIKWyAgICA4LjIyNDE4MV0gdXNiIDEtMi4x
OiBOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9MSwgUHJvZHVjdD0yLCBTZXJpYWxOdW1iZXI9
MwpbICAgIDguMjI0MTgxXSB1c2IgMS0yLjE6IFByb2R1Y3Q6IE11bHRpZGV2aWNlClsgICAgOC4y
MjQxODFdIHVzYiAxLTIuMTogTWFudWZhY3R1cmVyOiBQZXBwZXJjb24gQUcKWyAgICA4LjIyNDE4
MV0gdXNiIDEtMi4xOiBTZXJpYWxOdW1iZXI6IDg3M0I0OUUxNEMyNjUwRjc5MTEyNzVBRDNFMTQy
QjExClsgICAgOC4yMjk4NzldIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5FQl0gZW5hYmxl
ZCBhdCBJUlEgMTkKWyAgICA4LjIzMDUxNV0geGVuOiByZWdpc3RlcmluZyBnc2kgMTkgdHJpZ2dl
cmluZyAwIHBvbGFyaXR5IDEKWyAgICA4LjIzMDU2Ml0gICBhbGxvYyBpcnFfZGVzYyBmb3IgMTkg
b24gbm9kZSAtMQpbICAgIDguMjMwNjA0XSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAtMQpb
ICAgIDguMjMwNjc3XSB4ZW46IC0tPiBpcnE9MTkKWyAgICA4LjIzMDc4MV0gM3ctOXh4eCAwMDAw
OjAzOjAwLjA6IFBDSSBJTlQgQSAtPiBMaW5rW0xORUJdIC0+IEdTSSAxOSAobGV2ZWwsIGxvdykg
LT4gSVJRIDE5ClsgICAgOC4yMzE2MDJdIDN3LTl4eHggMDAwMDowMzowMC4wOiBzZXR0aW5nIGxh
dGVuY3kgdGltZXIgdG8gNjQKWyAgICA4LjI0NDY1Ml0gdXNiIDEtMi4xOiBjb25maWd1cmF0aW9u
ICMxIGNob3NlbiBmcm9tIDEgY2hvaWNlClsgICAgOC41NTMwNjNdIHNjc2kwIDogM3dhcmUgOTAw
MCBTdG9yYWdlIENvbnRyb2xsZXIKWyAgICA4LjU1NDIwM10gM3ctOXh4eDogc2NzaTA6IEZvdW5k
IGEgM3dhcmUgOTAwMCBTdG9yYWdlIENvbnRyb2xsZXIgYXQgMHhmYmZmZjAwMCwgSVJROiAxOS4K
WyAgICA4LjkwNTc2OF0gM3ctOXh4eDogc2NzaTA6IEZpcm13YXJlIEZFOVggNC4wOC4wMC4wMDYs
IEJJT1MgQkU5WCA0LjA4LjAwLjAwMSwgUG9ydHM6IDIuClsgICAgOC45MzI0MDFdIHNjc2kgMDow
OjA6MDogRGlyZWN0LUFjY2VzcyAgICAgQU1DQyAgICAgOTY1MFNFLTJMUCBESVNLICA0LjA4IFBR
OiAwIEFOU0k6IDUKWyAgIDEzLjM0MTIyNV0gc2QgMDowOjA6MDogW3NkYV0gMTk1MzEwMzg3MiA1
MTItYnl0ZSBsb2dpY2FsIGJsb2NrczogKDk5OSBHQi85MzEgR2lCKQpbICAgMTMuNDM3MTA2XSBz
ZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBQcm90ZWN0IGlzIG9mZgpbICAgMTMuNDM3NzQzXSBzZCAw
OjA6MDowOiBbc2RhXSBNb2RlIFNlbnNlOiAyMyAwMCAwMCAwMApbICAgMTMuNDk4OTkyXSBzZCAw
OjA6MDowOiBbc2RhXSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwg
ZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUEKWyAgIDEzLjY2MDk1NF0gIHNkYTogc2RhMSBzZGEy
IHNkYTMKWyAgIDEzLjczMjM0Ml0gc2QgMDowOjA6MDogW3NkYV0gQXR0YWNoZWQgU0NTSSBkaXNr
ClsgICAxNC42ODEwMjddIEluaXRpYWxpemluZyBVU0IgTWFzcyBTdG9yYWdlIGRyaXZlci4uLgpb
ICAgMTQuNzAwMjA0XSBzY3NpMSA6IFNDU0kgZW11bGF0aW9uIGZvciBVU0IgTWFzcyBTdG9yYWdl
IGRldmljZXMKWyAgIDE0LjcxMTQ4NF0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNl
IGRyaXZlciB1c2Itc3RvcmFnZQpbICAgMTQuNzEzOTEyXSB1c2Itc3RvcmFnZTogZGV2aWNlIGZv
dW5kIGF0IDMKWyAgIDE0LjcxMzk0OV0gdXNiLXN0b3JhZ2U6IHdhaXRpbmcgZm9yIGRldmljZSB0
byBzZXR0bGUgYmVmb3JlIHNjYW5uaW5nClsgICAxNC43MTQxNDhdIFVTQiBNYXNzIFN0b3JhZ2Ug
c3VwcG9ydCByZWdpc3RlcmVkLgpbICAgMTQuODAzMDE0XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5l
dyBpbnRlcmZhY2UgZHJpdmVyIGhpZGRldgpbICAgMTQuODI1NDY3XSBpbnB1dDogUGVwcGVyY29u
IEFHIE11bHRpZGV2aWNlIGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowMi4xL3VzYjEv
MS0yLzEtMi4xLzEtMi4xOjEuMS9pbnB1dC9pbnB1dDIKWyAgIDE0LjgyNzAxNV0gZ2VuZXJpYy11
c2IgMDAwMzoxNEREOjAwMDIuMDAwMTogaW5wdXQsaGlkcmF3MDogVVNCIEhJRCB2MS4wMSBLZXli
b2FyZCBbUGVwcGVyY29uIEFHIE11bHRpZGV2aWNlXSBvbiB1c2ItMDAwMDowMDowMi4xLTIuMS9p
bnB1dDEKWyAgIDE0Ljg4OTk3Ml0gaW5wdXQ6IFBlcHBlcmNvbiBBRyBNdWx0aWRldmljZSBhcyAv
ZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDIuMS91c2IxLzEtMi8xLTIuMS8xLTIuMToxLjIv
aW5wdXQvaW5wdXQzClsgICAxNC45MjkzNzddIGdlbmVyaWMtdXNiIDAwMDM6MTRERDowMDAyLjAw
MDI6IGlucHV0LGhpZHJhdzE6IFVTQiBISUQgdjEuMDEgTW91c2UgW1BlcHBlcmNvbiBBRyBNdWx0
aWRldmljZV0gb24gdXNiLTAwMDA6MDA6MDIuMS0yLjEvaW5wdXQyClsgICAxNC45MzAzMTBdIHVz
YmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgdXNiaGlkClsgICAxNC45MzMz
NDZdIHVzYmhpZDogdjIuNjpVU0IgSElEIGNvcmUgZHJpdmVyClsgICAxNi40NTE1NzldIGRldmlj
ZS1tYXBwZXI6IHVldmVudDogdmVyc2lvbiAxLjAuMwpbICAgMTYuNDU5Njg2XSBkZXZpY2UtbWFw
cGVyOiBpb2N0bDogNC4xNS4wLWlvY3RsICgyMDA5LTA0LTAxKSBpbml0aWFsaXNlZDogZG0tZGV2
ZWxAcmVkaGF0LmNvbQpbICAgMTguMzA4NzA1XSBram91cm5hbGQgc3RhcnRpbmcuICBDb21taXQg
aW50ZXJ2YWwgNSBzZWNvbmRzClsgICAxOC4zMDk0NzBdIEVYVDMtZnM6IG1vdW50ZWQgZmlsZXN5
c3RlbSB3aXRoIG9yZGVyZWQgZGF0YSBtb2RlLgpbICAgMTkuNzM1NDEwXSB1c2Itc3RvcmFnZTog
ZGV2aWNlIHNjYW4gY29tcGxldGUKWyAgIDE5Ljc0MTQ5NV0gc2NzaSAxOjA6MDowOiBDRC1ST00g
ICAgICAgICAgICBQZXBwZXJDICBWaXJ0dWFsIERpc2MgMSAgIDAuMDEgUFE6IDAgQU5TSTogMwpb
ICAgMTkuOTQ1MDk1XSBzcjA6IHNjc2ktMSBkcml2ZQpbICAgMTkuOTQ1NzU3XSBVbmlmb3JtIENE
LVJPTSBkcml2ZXIgUmV2aXNpb246IDMuMjAKWyAgIDE5Ljk0OTk2OF0gc3IgMTowOjA6MDogQXR0
YWNoZWQgc2NzaSBDRC1ST00gc3IwClsgICAyMC4zMDExNTFdIHNkIDA6MDowOjA6IEF0dGFjaGVk
IHNjc2kgZ2VuZXJpYyBzZzAgdHlwZSAwClsgICAyMC4zMjEyODZdIHNyIDE6MDowOjA6IEF0dGFj
aGVkIHNjc2kgZ2VuZXJpYyBzZzEgdHlwZSA1ClsgICAyNi45Mjk3NDldIHVkZXZbMzUzXTogc3Rh
cnRpbmcgdmVyc2lvbiAxNjQKWyAgIDI5LjI0MDgzN10gaTJjIGkyYy0wOiBuRm9yY2UyIFNNQnVz
IGFkYXB0ZXIgYXQgMHg2MDAKWyAgIDI5LjI0MTY3OV0gaTJjIGkyYy0xOiBuRm9yY2UyIFNNQnVz
IGFkYXB0ZXIgYXQgMHg3MDAKWyAgIDI5LjU5ODkwN10gcHJvY2Vzc29yIExOWENQVTowMDogcmVn
aXN0ZXJlZCBhcyBjb29saW5nX2RldmljZTAKWyAgIDMwLjY1MzM5NV0gaW5wdXQ6IFBvd2VyIEJ1
dHRvbiBhcyAvZGV2aWNlcy9MTlhTWVNUTTowMC9MTlhTWUJVUzowMC9QTlAwQzBDOjAwL2lucHV0
L2lucHV0NApbICAgMzAuNjU0MTcyXSBBQ1BJOiBQb3dlciBCdXR0b24gW1BXUkJdClsgICAzMC42
NTUzODldIGlucHV0OiBQb3dlciBCdXR0b24gYXMgL2RldmljZXMvTE5YU1lTVE06MDAvTE5YUFdS
Qk46MDAvaW5wdXQvaW5wdXQ1ClsgICAzMC42NTYxMTZdIEFDUEk6IFBvd2VyIEJ1dHRvbiBbUFdS
Rl0KWyAgIDMxLjkwNDM1Nl0gRURBQyBNQzogVmVyOiAyLjEuMCBEZWMgMjMgMjAxMQpbICAgMzIu
MjE4NjgyXSBbZHJtXSBJbml0aWFsaXplZCBkcm0gMS4xLjAgMjAwNjA4MTAKWyAgIDMyLjI1ODQ4
N10gRURBQyBhbWQ2NF9lZGFjOiAgVmVyOiAzLjIuMCBEZWMgMjMgMjAxMQpbICAgMzIuMjY5NzUy
XSBFREFDIGFtZDY0OiBUaGlzIG5vZGUgcmVwb3J0cyB0aGF0IE1lbW9yeSBFQ0MgaXMgY3VycmVu
dGx5IGRpc2FibGVkLCBzZXQgRjN4NDRbMjJdICgwMDAwOjAwOjE4LjMpLgpbICAgMzIuMjcwNDg5
XSBFREFDIGFtZDY0OiBFQ0MgZGlzYWJsZWQgaW4gdGhlIEJJT1Mgb3Igbm8gRUNDIGNhcGFiaWxp
dHksIG1vZHVsZSB3aWxsIG5vdCBsb2FkLgpbICAgMzIuMjcwNDk2XSAgRWl0aGVyIGVuYWJsZSBF
Q0MgY2hlY2tpbmcgb3IgZm9yY2UgbW9kdWxlIGxvYWRpbmcgYnkgc2V0dGluZyAnZWNjX2VuYWJs
ZV9vdmVycmlkZScuClsgICAzMi4yNzA1MDJdICAoTm90ZSB0aGF0IHVzZSBvZiB0aGUgb3ZlcnJp
ZGUgbWF5IGNhdXNlIHVua25vd24gc2lkZSBlZmZlY3RzLikKWyAgIDMyLjI3MjgxNV0gYW1kNjRf
ZWRhYzogcHJvYmUgb2YgMDAwMDowMDoxOC4yIGZhaWxlZCB3aXRoIGVycm9yIC0yMgpbICAgMzIu
OTI1OTk1XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xNQzldIGVuYWJsZWQgYXQgSVJRIDIw
ClsgICAzMi45MjY2MzFdIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDIwIHRyaWdnZXJpbmcgMCBwb2xh
cml0eSAxClsgICAzMi45MjY2NzhdICAgYWxsb2MgaXJxX2Rlc2MgZm9yIDIwIG9uIG5vZGUgLTEK
WyAgIDMyLjkyNjcyMF0gICBhbGxvYyBrc3RhdF9pcnFzIG9uIG5vZGUgLTEKWyAgIDMyLjkyNjc5
NF0geGVuOiAtLT4gaXJxPTIwClsgICAzMi45MjY4OTZdIG5vdXZlYXUgMDAwMDowMDowZC4wOiBQ
Q0kgSU5UIEEgLT4gTGlua1tMTUM5XSAtPiBHU0kgMjAgKGxldmVsLCBsb3cpIC0+IElSUSAyMApb
ICAgMzIuOTI3NzEzXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogc2V0dGluZyBsYXRlbmN5IHRpbWVy
IHRvIDY0ClsgICAzMy4xNjU5NThdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBmYWlsZWQg
dG8gZXZhbHVhdGUgX0RTTTogNQpbICAgMzQuODc2MTY2XSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6
MGQuMDogRGV0ZWN0ZWQgYW4gTlY0MCBnZW5lcmF0aW9uIGNhcmQgKDB4MDRjMDAwYTIpClsgICAz
Ni45NTc5MjJdIGlucHV0OiBQQyBTcGVha2VyIGFzIC9kZXZpY2VzL3BsYXRmb3JtL3Bjc3Brci9p
bnB1dC9pbnB1dDYKWyAgIDM3Ljc5MzU0MF0gRXJyb3I6IERyaXZlciAncGNzcGtyJyBpcyBhbHJl
YWR5IHJlZ2lzdGVyZWQsIGFib3J0aW5nLi4uClsgICAzOS41ODgxNDRdIFtkcm1dIG5vdXZlYXUg
MDAwMDowMDowZC4wOiBBdHRlbXB0aW5nIHRvIGxvYWQgQklPUyBpbWFnZSBmcm9tIFBST00KWyAg
IDM5LjU4ODE0NF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IC4uLiBCSU9TIHNpZ25hdHVy
ZSBub3QgZm91bmQKWyAgIDM5LjU4ODE0NF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IEF0
dGVtcHRpbmcgdG8gbG9hZCBCSU9TIGltYWdlIGZyb20gUFJBTUlOClsgICAzOS42NDM5NzddIFtk
cm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiAuLi4gYXBwZWFycyB0byBiZSB2YWxpZApbICAgMzku
NjQ0MTEwXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogQklUIEJJT1MgZm91bmQKWyAgIDM5
LjY0NDExMF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IEJpb3MgdmVyc2lvbiAwNS42MS4z
Mi4yOApbICAgMzkuNjQ0MTEwXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogQklUIHRhYmxl
ICdkJyBub3QgZm91bmQKWyAgIDM5LjY0NDExMF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6
IEZvdW5kIERpc3BsYXkgQ29uZmlndXJhdGlvbiBCbG9jayB2ZXJzaW9uIDMuMApbICAgMzkuNjQ0
MTEwXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogRENCIGNvbm5lY3RvciB0YWJsZTogVkhF
UiAweDMwIDUgMTAgMgpbICAgMzkuNjQ0MTEwXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDog
ICAwOiAweDAwMDAwMDAwOiB0eXBlIDB4MDAgaWR4IDAgdGFnIDB4ZmYKWyAgIDM5LjY0NDExMF0g
W2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6ICAgMTogMHgwMDAwMTEzMTogdHlwZSAweDMxIGlk
eCAxIHRhZyAweDA3ClsgICAzOS42NDQxMTBdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiAg
IDI6IDB4MDAwMDAxMTA6IHR5cGUgMHgxMCBpZHggMSB0YWcgMHhmZgpbICAgMzkuNjQ0MTEwXSBb
ZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogICAzOiAweDAwMDAwMTExOiB0eXBlIDB4MTEgaWR4
IDEgdGFnIDB4ZmYKWyAgIDM5LjY0NDExMF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6ICAg
NDogMHgwMDAwMDExMzogdHlwZSAweDEzIGlkeCAxIHRhZyAweGZmClsgICAzOS42NDQxMTBdIFtk
cm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBSYXcgRENCIGVudHJ5IDA6IDAxMDAwMzEwIDAwMDAw
MDIzClsgICAzOS42NDQxMTBdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBSYXcgRENCIGVu
dHJ5IDE6IDAwMTEwMjA0IDk0MmIwMDAzClsgICAzOS42NDQxMTBdIFtkcm1dIG5vdXZlYXUgMDAw
MDowMDowZC4wOiBQYXJzaW5nIFZCSU9TIGluaXQgdGFibGUgMCBhdCBvZmZzZXQgMHhEOUM5Clsg
ICAzOS42NDQxMTBdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiA9PT09PT09IG1pc2FsaWdu
ZWQgcmVnIDB4MDA2MDA4MUQgPT09PT09PQpbICAgMzkuNjQ0MTEwXSBbZHJtXSBub3V2ZWF1IDAw
MDA6MDA6MGQuMDogPT09PT09PSBtaXNhbGlnbmVkIHJlZyAweDAwNjAwODFEID09PT09PT0KWyAg
IDM5LjY0NDExMF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IFBhcnNpbmcgVkJJT1MgaW5p
dCB0YWJsZSAxIGF0IG9mZnNldCAweERCMTcKWyAgIDM5LjY0NDExMF0gW2RybV0gbm91dmVhdSAw
MDAwOjAwOjBkLjA6IFBhcnNpbmcgVkJJT1MgaW5pdCB0YWJsZSAyIGF0IG9mZnNldCAweERCMTgK
WyAgIDM5LjY0NDExMF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IFBhcnNpbmcgVkJJT1Mg
aW5pdCB0YWJsZSAzIGF0IG9mZnNldCAweERDOUEKWyAgIDM5LjY0NDExMF0gW2RybV0gbm91dmVh
dSAwMDAwOjAwOjBkLjA6IFBhcnNpbmcgVkJJT1MgaW5pdCB0YWJsZSA0IGF0IG9mZnNldCAweERD
RTMKWyAgIDM5LjcwMDg2NF0gcGFycG9ydF9wYyAwMDowNTogcmVwb3J0ZWQgYnkgUGx1ZyBhbmQg
UGxheSBBQ1BJClsgICAzOS43MDI0MTNdIHBhcnBvcnQwOiBQQy1zdHlsZSBhdCAweDM3OCAoMHg3
NzgpLCBpcnEgNyBbUENTUFAsVFJJU1RBVEVdClsgICA0Mi43Mzg1MThdIFtUVE1dIFpvbmUgIGtl
cm5lbDogQXZhaWxhYmxlIGdyYXBoaWNzIG1lbW9yeTogNTIyNjcwIGtpQi4KWyAgIDQyLjczOTIw
MF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IDE2IE1pQiBWUkFNClsgICA0My4wMjM2MDRd
IFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiA2NCBNaUIgR0FSVCAoYXBlcnR1cmUpClsgICA0
My4wNzI3NTFdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBBbGxvY2F0aW5nIEZJRk8gbnVt
YmVyIDAKWyAgIDQzLjA4ODA4N10gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IG5vdXZlYXVf
Y2hhbm5lbF9hbGxvYzogaW5pdGlhbGlzZWQgRklGTyAwClsgICA0My4wODgwODddIFtkcm1dIG5v
dXZlYXUgMDAwMDowMDowZC4wOiBJbml0aWFsIENSVENfT1dORVIgaXMgMApbICAgNDMuMDg4MDg3
XSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogU2F2aW5nIFZHQSBmb250cwpbICAgNDQuMTU4
NDgyXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogRENCIHR5cGUgNCBub3Qga25vd24KWyAg
IDQ0LjE1OTEyNl0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IERldGVjdGVkIGEgVkdBIGNv
bm5lY3RvcgpbICAgNDQuMjM3NDk0XSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogU2V0dGlu
ZyBkcG1zIG1vZGUgMyBvbiB2Z2EgZW5jb2RlciAob3V0cHV0IDApClsgICA0NC41Mjg1NDJdIFtk
cm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBMb2FkIGRldGVjdGVkIG9uIG91dHB1dCBBClsgICA0
NC42MjQ0NDNdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBhbGxvY2F0ZWQgMTAyNHg3Njgg
ZmI6IDB4NDkwMDAsIGJvIGZmZmY4ODAwM2Q4ZjUyMDAKWyAgIDQ0LjY5OTIwN10gW2RybV0gbm91
dmVhdSAwMDAwOjAwOjBkLjA6IFNldHRpbmcgZHBtcyBtb2RlIDAgb24gdmdhIGVuY29kZXIgKG91
dHB1dCAwKQpbICAgNDQuNjk5MjQzXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogT3V0cHV0
IFZHQS0xIGlzIHJ1bm5pbmcgb24gQ1JUQyAwIHVzaW5nIG91dHB1dCBBClsgICA0NC43MDQ0MDZd
IENvbnNvbGU6IHN3aXRjaGluZyB0byBjb2xvdXIgZnJhbWUgYnVmZmVyIGRldmljZSAxMjh4NDgK
WyAgIDQ0LjcxMDg4MV0gZmIwOiBub3V2ZWF1ZmIgZnJhbWUgYnVmZmVyIGRldmljZQpbICAgNDQu
NzEwOTc1XSByZWdpc3RlcmVkIHBhbmljIG5vdGlmaWVyClsgICA0NC43MTEwOThdIFtkcm1dIElu
aXRpYWxpemVkIG5vdXZlYXUgMC4wLjE1IDIwMDkwNDIwIGZvciAwMDAwOjAwOjBkLjAgb24gbWlu
b3IgMApbICAgNDQuNzMwODA4XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xBWkFdIGVuYWJs
ZWQgYXQgSVJRIDIzClsgICA0NC43MzA4ODBdIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDIzIHRyaWdn
ZXJpbmcgMCBwb2xhcml0eSAxClsgICA0NC43MzA5MjBdIHhlbl9hbGxvY2F0ZV9waXJxOiByZXR1
cm5pbmcgaXJxIDIzIGZvciBnc2kgMjMKWyAgIDQ0LjczMDk4M10geGVuOiAtLT4gaXJxPTIzClsg
ICA0NC43MzEwNTBdIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6MjMKWyAgIDQ0LjczMTEwN10gSERB
IEludGVsIDAwMDA6MDA6MDUuMDogUENJIElOVCBCIC0+IExpbmtbTEFaQV0gLT4gR1NJIDIzIChs
ZXZlbCwgbG93KSAtPiBJUlEgMjMKWyAgIDQ0LjczMTE5OV0gaGRhX2ludGVsOiBEaXNhYmxlIE1T
SSBmb3IgTnZpZGlhIGNoaXBzZXQKWyAgIDQ0LjczMTc0M10gSERBIEludGVsIDAwMDA6MDA6MDUu
MDogc2V0dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0ClsgICA1Mi4zNTUzMjBdIEFkZGluZyAxMjg1
MTJrIHN3YXAgb24gL2Rldi9zZGEyLiAgUHJpb3JpdHk6LTEgZXh0ZW50czoxIGFjcm9zczoxMjg1
MTJrIApbICAgNTMuODk5MjQ4XSBFWFQzIEZTIG9uIGRtLTAsIGludGVybmFsIGpvdXJuYWwKWyAg
IDU3LjIyNjQ0MV0gbG9vcDogbW9kdWxlIGxvYWRlZApbICAgNTkuMzk2NTI2XSBFdmVudC1jaGFu
bmVsIGRldmljZSBpbnN0YWxsZWQuClsgICA2MS4zNDQ3MTddIGJsa3RhcF9kZXZpY2VfaW5pdDog
YmxrdGFwIGRldmljZSBtYWpvciAyNTMKWyAgIDYxLjM0NDgxOF0gYmxrdGFwX3JpbmdfaW5pdDog
YmxrdGFwIHJpbmcgbWFqb3I6IDI1MApbICAxNDkuNTgyMzEyXSBram91cm5hbGQgc3RhcnRpbmcu
ICBDb21taXQgaW50ZXJ2YWwgNSBzZWNvbmRzClsgIDE0OS41ODQ0NTZdIEVYVDMgRlMgb24gc2Rh
MSwgaW50ZXJuYWwgam91cm5hbApbICAxNDkuNTg2MTA2XSBFWFQzLWZzOiBtb3VudGVkIGZpbGVz
eXN0ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZS4KWyAgMTQ5LjYzNDc5Nl0ga2pvdXJuYWxkIHN0
YXJ0aW5nLiAgQ29tbWl0IGludGVydmFsIDUgc2Vjb25kcwpbICAxNDkuNjM2NzgyXSBFWFQzLWZz
IHdhcm5pbmc6IGNoZWNrdGltZSByZWFjaGVkLCBydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRl
ZApbICAxNDkuNjM5MDMwXSBFWFQzIEZTIG9uIGRtLTIsIGludGVybmFsIGpvdXJuYWwKWyAgMTQ5
LjY0MDYyMl0gRVhUMy1mczogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggb3JkZXJlZCBkYXRhIG1v
ZGUuClsgIDE0OS42ODcxNzNdIGtqb3VybmFsZCBzdGFydGluZy4gIENvbW1pdCBpbnRlcnZhbCA1
IHNlY29uZHMKWyAgMTQ5LjY5MDAxMV0gRVhUMy1mcyB3YXJuaW5nOiBjaGVja3RpbWUgcmVhY2hl
ZCwgcnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQKWyAgMTQ5LjY5MzI4NV0gRVhUMyBGUyBv
biBkbS0xMywgaW50ZXJuYWwgam91cm5hbApbICAxNDkuNjk1ODUyXSBFWFQzLWZzOiBtb3VudGVk
IGZpbGVzeXN0ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZS4KWyAgMTQ5Ljc0MjA2NV0ga2pvdXJu
YWxkIHN0YXJ0aW5nLiAgQ29tbWl0IGludGVydmFsIDUgc2Vjb25kcwpbICAxNDkuNzQ0ODUwXSBF
WFQzLWZzIHdhcm5pbmc6IGNoZWNrdGltZSByZWFjaGVkLCBydW5uaW5nIGUyZnNjayBpcyByZWNv
bW1lbmRlZApbICAxNDkuNzQ4MDQ4XSBFWFQzIEZTIG9uIGRtLTYsIGludGVybmFsIGpvdXJuYWwK
WyAgMTQ5Ljc0ODY5M10gRVhUMy1mczogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggb3JkZXJlZCBk
YXRhIG1vZGUuClsgIDE0OS45Mjc2MjJdIElTTyA5NjYwIEV4dGVuc2lvbnM6IE1pY3Jvc29mdCBK
b2xpZXQgTGV2ZWwgMwpbICAxNDkuOTkwODI5XSBJU08gOTY2MCBFeHRlbnNpb25zOiBSUklQXzE5
OTFBClsgIDE1OC45NzE0MjBdICAgYWxsb2MgaXJxX2Rlc2MgZm9yIDQ5OSBvbiBub2RlIC0xClsg
IDE1OC45NzE0NjRdICAgYWxsb2Mga3N0YXRfaXJxcyBvbiBub2RlIC0xClsgIDE2OS40NjgxMzVd
IGV0aDA6IG5vIElQdjYgcm91dGVycyBwcmVzZW50ClsgIDE5Ni4zMjY2OTZdICAgYWxsb2MgaXJx
X2Rlc2MgZm9yIDQ5OCBvbiBub2RlIC0xClsgIDE5Ni4zMjY3NDFdICAgYWxsb2Mga3N0YXRfaXJx
cyBvbiBub2RlIC0xClsgIDE5Ni4zMzY4ODJdICAgYWxsb2MgaXJxX2Rlc2MgZm9yIDQ5NyBvbiBu
b2RlIC0xClsgIDE5Ni4zMzY5MjZdICAgYWxsb2Mga3N0YXRfaXJxcyBvbiBub2RlIC0xClsgIDE5
Ni4zNTczOTNdIFhFTkJVUzogVW5hYmxlIHRvIHJlYWQgY3B1IHN0YXRlClsgIDIwNi4wMjU2NTRd
IEJyaWRnZSBmaXJld2FsbGluZyByZWdpc3RlcmVkClsgIDIxNy40MTA3NTldIGRldmljZSBwZXRo
MCBlbnRlcmVkIHByb21pc2N1b3VzIG1vZGUKWyAgMjE4LjM1NTk1OF0gZXRoMDogcG9ydCAxKHBl
dGgwKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlClsgIDIyNi45OTA1NjldIHBldGgwOiBubyBJ
UHY2IHJvdXRlcnMgcHJlc2VudApbICAyMjguNTAwNTMwXSBldGgwOiBubyBJUHY2IHJvdXRlcnMg
cHJlc2VudApbICAzMDIuNDY3OTc3XSAgIGFsbG9jIGlycV9kZXNjIGZvciA0OTYgb24gbm9kZSAt
MQpbICAzMDIuNDY4MDIyXSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAtMQpbICAzMDkuMjAy
NTA0XSAgIGFsbG9jIGlycV9kZXNjIGZvciA0OTUgb24gbm9kZSAtMQpbICAzMDkuMjAyNTQ4XSAg
IGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAtMQpbICAzMjMuMjI2MTI4XSBkZXZpY2Ugc2NwMSBl
bnRlcmVkIHByb21pc2N1b3VzIG1vZGUKWyAgMzIzLjcwMzYzNV0gZXRoMDogcG9ydCAyKHNjcDEp
IGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUKWyAgMzI0LjM3NzE0Ml0gaXBfdGFibGVzOiAoQykg
MjAwMC0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0KWyAgMzM0LjYwMDE4OF0gc2NwMTogbm8gSVB2
NiByb3V0ZXJzIHByZXNlbnQK
--0022158c0eed3d9c4704b54d7560
Content-Type: text/plain; charset=US-ASCII; name="xm.dmesg.2011-12-30.txt"
Content-Disposition: attachment; filename="xm.dmesg.2011-12-30.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gwt453rl1

IF9fICBfXyAgICAgICAgICAgIF8gIF8gICAgXyAgIF9fX18gIAogXCBcLyAvX19fIF8gX18gICB8
IHx8IHwgIC8gfCB8X19fIFwgCiAgXCAgLy8gXyBcICdfIFwgIHwgfHwgfF8gfCB8ICAgX18pIHwK
ICAvICBcICBfXy8gfCB8IHwgfF9fICAgX3x8IHxfIC8gX18vIAogL18vXF9cX19ffF98IHxffCAg
ICB8X3woXylfKF8pX19fX198CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
KFhFTikgWGVuIHZlcnNpb24gNC4xLjIgKHJvb3RAei10ZWNobm9sb2dpZXMuZGUpIChnY2MgdmVy
c2lvbiA0LjQuNSAoRGViaWFuIDQuNC41LTgpICkgRnJpIERlYyAzMCAxMjo1NToyMCBDRVQgMjAx
MQooWEVOKSBMYXRlc3QgQ2hhbmdlU2V0OiB1bmF2YWlsYWJsZQooWEVOKSBCb290bG9hZGVyOiBH
UlVCIDEuOTgrMjAxMDA4MDQtMTQrc3F1ZWV6ZTEKKFhFTikgQ29tbWFuZCBsaW5lOiBwbGFjZWhv
bGRlciBkb20wX21lbT0xMDI0bSBkb20wX21heF92Y3B1cz0xIGRvbTBfdmNwdXNfcGluCihYRU4p
IFZpZGVvIGluZm9ybWF0aW9uOgooWEVOKSAgVkdBIGlzIHRleHQgbW9kZSA4MHgyNSwgZm9udCA4
eDE2CihYRU4pICBWQkUvRERDIG1ldGhvZHM6IG5vbmU7IEVESUQgdHJhbnNmZXIgdGltZTogMCBz
ZWNvbmRzCihYRU4pICBFRElEIGluZm8gbm90IHJldHJpZXZlZCBiZWNhdXNlIG5vIEREQyByZXRy
aWV2YWwgbWV0aG9kIGRldGVjdGVkCihYRU4pIERpc2MgaW5mb3JtYXRpb246CihYRU4pICBGb3Vu
ZCAxIE1CUiBzaWduYXR1cmVzCihYRU4pICBGb3VuZCAxIEVERCBpbmZvcm1hdGlvbiBzdHJ1Y3R1
cmVzCihYRU4pIFhlbi1lODIwIFJBTSBtYXA6CihYRU4pICAwMDAwMDAwMDAwMDAwMDAwIC0gMDAw
MDAwMDAwMDA5ZjAwMCAodXNhYmxlKQooWEVOKSAgMDAwMDAwMDAwMDA5ZjAwMCAtIDAwMDAwMDAw
MDAwYTAwMDAgKHJlc2VydmVkKQooWEVOKSAgMDAwMDAwMDAwMDBlNzAwMCAtIDAwMDAwMDAwMDAx
MDAwMDAgKHJlc2VydmVkKQooWEVOKSAgMDAwMDAwMDAwMDEwMDAwMCAtIDAwMDAwMDAwZGVmYjAw
MDAgKHVzYWJsZSkKKFhFTikgIDAwMDAwMDAwZGVmYjAwMDAgLSAwMDAwMDAwMGRlZmMwMDAwIChB
Q1BJIGRhdGEpCihYRU4pICAwMDAwMDAwMGRlZmMwMDAwIC0gMDAwMDAwMDBkZWZmMDAwMCAoQUNQ
SSBOVlMpCihYRU4pICAwMDAwMDAwMGRlZmYwMDAwIC0gMDAwMDAwMDBkZjAwMDAwMCAocmVzZXJ2
ZWQpCihYRU4pICAwMDAwMDAwMGZlYzAwMDAwIC0gMDAwMDAwMDBmZWMwMTAwMCAocmVzZXJ2ZWQp
CihYRU4pICAwMDAwMDAwMGZlZTAwMDAwIC0gMDAwMDAwMDBmZWYwMDAwMCAocmVzZXJ2ZWQpCihY
RU4pICAwMDAwMDAwMGZmZjgwMDAwIC0gMDAwMDAwMDEwMDAwMDAwMCAocmVzZXJ2ZWQpCihYRU4p
ICAwMDAwMDAwMTAwMDAwMDAwIC0gMDAwMDAwMDQyMDAwMDAwMCAodXNhYmxlKQooWEVOKSBBQ1BJ
OiBSU0RQIDAwMEZBNTIwLCAwMDE0IChyMCBBQ1BJQU0pCihYRU4pIEFDUEk6IFJTRFQgREVGQjAw
MDAsIDAwNDQgKHIxIEFfTV9JICBPRU1SU0RUICAgODAwMTAwNSBNU0ZUICAgICAgIDk3KQooWEVO
KSBBQ1BJOiBGQUNQIERFRkIwMjAwLCAwMDg0IChyMiBBX01fSSAgT0VNRkFDUCAgMTIwMDA2MDEg
TVNGVCAgICAgICA5NykKKFhFTikgQUNQSTogRFNEVCBERUZCMDQ2MCwgNDkzQiAocjEgIEFTMzgy
IEFTMzgyMDA5ICAgICAgICA5IElOVEwgMjAwNTExMTcpCihYRU4pIEFDUEk6IEZBQ1MgREVGQzAw
MDAsIDAwNDAKKFhFTikgQUNQSTogQVBJQyBERUZCMDM5MCwgMDA5MCAocjEgQV9NX0kgIE9FTUFQ
SUMgICA4MDAxMDA1IE1TRlQgICAgICAgOTcpCihYRU4pIEFDUEk6IE1DRkcgREVGQjA0MjAsIDAw
M0MgKHIxIEFfTV9JICBPRU1NQ0ZHICAgODAwMTAwNSBNU0ZUICAgICAgIDk3KQooWEVOKSBBQ1BJ
OiBPRU1CIERFRkMwMDQwLCAwMDYxIChyMSBBX01fSSAgQU1JX09FTSAgIDgwMDEwMDUgTVNGVCAg
ICAgICA5NykKKFhFTikgQUNQSTogU1JBVCBERUZCNERBMCwgMDBFOCAocjMgQU1EICAgIEZBTV9G
XzEwICAgICAgICAyIEFNRCAgICAgICAgIDEpCihYRU4pIEFDUEk6IEFBRlQgREVGQjRFOTAsIDAw
MjcgKHIxIEFfTV9JICBPRU1BQUZUICAgODAwMTAwNSBNU0ZUICAgICAgIDk3KQooWEVOKSBBQ1BJ
OiBIUEVUIERFRkI0RUMwLCAwMDM4IChyMSBBX01fSSAgT0VNSFBFVDAgIDgwMDEwMDUgTVNGVCAg
ICAgICA5NykKKFhFTikgQUNQSTogU1NEVCBERUZCNEYwMCwgMDg4QyAocjEgQSBNIEkgIFBPV0VS
Tk9XICAgICAgICAxIEFNRCAgICAgICAgIDEpCihYRU4pIFN5c3RlbSBSQU06IDE2MzY3TUIgKDE2
NzYwMTI0a0IpCihYRU4pIERvbWFpbiBoZWFwIGluaXRpYWxpc2VkCihYRU4pIFByb2Nlc3NvciAj
MCAwOjUgQVBJQyB2ZXJzaW9uIDE2CihYRU4pIFByb2Nlc3NvciAjMSAwOjUgQVBJQyB2ZXJzaW9u
IDE2CihYRU4pIFByb2Nlc3NvciAjMiAwOjUgQVBJQyB2ZXJzaW9uIDE2CihYRU4pIFByb2Nlc3Nv
ciAjMyAwOjUgQVBJQyB2ZXJzaW9uIDE2CihYRU4pIElPQVBJQ1swXTogYXBpY19pZCA0LCB2ZXJz
aW9uIDE3LCBhZGRyZXNzIDB4ZmVjMDAwMDAsIEdTSSAwLTIzCihYRU4pIEVuYWJsaW5nIEFQSUMg
bW9kZTogIEZsYXQuICBVc2luZyAxIEkvTyBBUElDcwooWEVOKSBUYWJsZSBpcyBub3QgZm91bmQh
CihYRU4pIFVzaW5nIHNjaGVkdWxlcjogU01QIENyZWRpdCBTY2hlZHVsZXIgKGNyZWRpdCkKKFhF
TikgRGV0ZWN0ZWQgMjQxMC45ODYgTUh6IHByb2Nlc3Nvci4KKFhFTikgSW5pdGluZyBtZW1vcnkg
c2hhcmluZy4KKFhFTikgQU1ELVZpOiBJT01NVSBub3QgZm91bmQhCihYRU4pIEkvTyB2aXJ0dWFs
aXNhdGlvbiBkaXNhYmxlZAooWEVOKSBFTkFCTElORyBJTy1BUElDIElSUXMKKFhFTikgIC0+IFVz
aW5nIG5ldyBBQ0sgbWV0aG9kCihYRU4pIFBsYXRmb3JtIHRpbWVyIGlzIDI1LjAwME1IeiBIUEVU
CihYRU4pIEFsbG9jYXRlZCBjb25zb2xlIHJpbmcgb2YgMTYgS2lCLgooWEVOKSBIVk06IEFTSURz
IGVuYWJsZWQuCihYRU4pIFNWTTogU3VwcG9ydGVkIGFkdmFuY2VkIGZlYXR1cmVzOgooWEVOKSAg
LSBOZXN0ZWQgUGFnZSBUYWJsZXMgKE5QVCkKKFhFTikgIC0gTGFzdCBCcmFuY2ggUmVjb3JkIChM
QlIpIFZpcnR1YWxpc2F0aW9uCihYRU4pICAtIE5leHQtUklQIFNhdmVkIG9uICNWTUVYSVQKKFhF
TikgSFZNOiBTVk0gZW5hYmxlZAooWEVOKSBIVk06IEhhcmR3YXJlIEFzc2lzdGVkIFBhZ2luZyBk
ZXRlY3RlZC4KKFhFTikgQnJvdWdodCB1cCA0IENQVXMKKFhFTikgWGVub3Byb2ZpbGU6IEZhaWxl
ZCB0byBzZXR1cCBJQlMgTFZUIG9mZnNldCwgSUJTQ1RMID0gMHhmZmZmZmZmZgooWEVOKSAqKiog
TE9BRElORyBET01BSU4gMCAqKioKKFhFTikgIFhlbiAga2VybmVsOiA2NC1iaXQsIGxzYiwgY29t
cGF0MzIKKFhFTikgIERvbTAga2VybmVsOiA2NC1iaXQsIFBBRSwgbHNiLCBwYWRkciAweDEwMDAw
MDAgLT4gMHgxNmI4MDAwCihYRU4pIFBIWVNJQ0FMIE1FTU9SWSBBUlJBTkdFTUVOVDoKKFhFTikg
IERvbTAgYWxsb2MuOiAgIDAwMDAwMDA0MTAwMDAwMDAtPjAwMDAwMDA0MTIwMDAwMDAgKDI0Njcx
NCBwYWdlcyB0byBiZSBhbGxvY2F0ZWQpCihYRU4pICBJbml0LiByYW1kaXNrOiAwMDAwMDAwNDFl
M2JhMDAwLT4wMDAwMDAwNDFmZmZmNjAwCihYRU4pIFZJUlRVQUwgTUVNT1JZIEFSUkFOR0VNRU5U
OgooWEVOKSAgTG9hZGVkIGtlcm5lbDogZmZmZmZmZmY4MTAwMDAwMC0+ZmZmZmZmZmY4MTZiODAw
MAooWEVOKSAgSW5pdC4gcmFtZGlzazogZmZmZmZmZmY4MTZiODAwMC0+ZmZmZmZmZmY4MzJmZDYw
MAooWEVOKSAgUGh5cy1NYWNoIG1hcDogZmZmZmZmZmY4MzJmZTAwMC0+ZmZmZmZmZmY4MzRmZTAw
MAooWEVOKSAgU3RhcnQgaW5mbzogICAgZmZmZmZmZmY4MzRmZTAwMC0+ZmZmZmZmZmY4MzRmZTRi
NAooWEVOKSAgUGFnZSB0YWJsZXM6ICAgZmZmZmZmZmY4MzRmZjAwMC0+ZmZmZmZmZmY4MzUxZTAw
MAooWEVOKSAgQm9vdCBzdGFjazogICAgZmZmZmZmZmY4MzUxZTAwMC0+ZmZmZmZmZmY4MzUxZjAw
MAooWEVOKSAgVE9UQUw6ICAgICAgICAgZmZmZmZmZmY4MDAwMDAwMC0+ZmZmZmZmZmY4MzgwMDAw
MAooWEVOKSAgRU5UUlkgQUREUkVTUzogZmZmZmZmZmY4MTUwNzIwMAooWEVOKSBEb20wIGhhcyBt
YXhpbXVtIDEgVkNQVXMKKFhFTikgU2NydWJiaW5nIEZyZWUgUkFNOiAuLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLi4uLi4uZG9uZS4KKFhFTikgWGVuIHRyYWNlIGJ1ZmZlcnM6IGRpc2Fi
bGVkCihYRU4pIFN0ZC4gTG9nbGV2ZWw6IEVycm9ycyBhbmQgd2FybmluZ3MKKFhFTikgR3Vlc3Qg
TG9nbGV2ZWw6IE5vdGhpbmcgKFJhdGUtbGltaXRlZDogRXJyb3JzIGFuZCB3YXJuaW5ncykKKFhF
TikgWGVuIGlzIHJlbGlucXVpc2hpbmcgVkdBIGNvbnNvbGUuCihYRU4pICoqKiBTZXJpYWwgaW5w
dXQgLT4gRE9NMCAodHlwZSAnQ1RSTC1hJyB0aHJlZSB0aW1lcyB0byBzd2l0Y2ggaW5wdXQgdG8g
WGVuKQooWEVOKSBGcmVlZCAyMjBrQiBpbml0IG1lbW9yeS4KKFhFTikgdHJhcHMuYzoyNDMyOmQw
IERvbWFpbiBhdHRlbXB0ZWQgV1JNU1IgMDAwMDAwMDBjMDAxMDAwNCBmcm9tIDB4MDAwMDAwOGQz
ZGI5ZmI1NyB0byAweDAwMDAwMDAwMDAwMDAwMDAuCihYRU4pIHRyYXBzLmM6MjQzMjpkMCBEb21h
aW4gYXR0ZW1wdGVkIFdSTVNSIDAwMDAwMDAwYzAwMTAwMDAgZnJvbSAweDAwMDAwMDAwMDAwMzAw
NzYgdG8gMHgwMDAwMDAwMDAwNDMwMDc2Lgo=
--0022158c0eed3d9c4704b54d7560
Content-Type: text/plain; charset=US-ASCII; name="dmesg.2011-12-30.plain-amd64.txt"
Content-Disposition: attachment; filename="dmesg.2011-12-30.plain-amd64.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gwt4562r2

WyAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1c2V0ClsgICAgMC4w
MDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdQpbICAgIDAuMDAwMDAwXSBMaW51
eCB2ZXJzaW9uIDIuNi4zMi01LWFtZDY0IChEZWJpYW4gMi42LjMyLTQwKSAoZGFubmZAZGViaWFu
Lm9yZykgKGdjYyB2ZXJzaW9uIDQuMy41IChEZWJpYW4gNC4zLjUtNCkgKSAjMSBTTVAgRnJpIERl
YyAyMyAyMDowOTo1NyBVVEMgMjAxMQpbICAgIDAuMDAwMDAwXSBDb21tYW5kIGxpbmU6IEJPT1Rf
SU1BR0U9L3ZtbGludXotMi42LjMyLTUtYW1kNjQgcm9vdD0vZGV2L21hcHBlci92Z2JsdWUtYmx1
ZXJvb3Qgcm8gcXVpZXQKWyAgICAwLjAwMDAwMF0gS0VSTkVMIHN1cHBvcnRlZCBjcHVzOgpbICAg
IDAuMDAwMDAwXSAgIEludGVsIEdlbnVpbmVJbnRlbApbICAgIDAuMDAwMDAwXSAgIEFNRCBBdXRo
ZW50aWNBTUQKWyAgICAwLjAwMDAwMF0gICBDZW50YXVyIENlbnRhdXJIYXVscwpbICAgIDAuMDAw
MDAwXSBCSU9TLXByb3ZpZGVkIHBoeXNpY2FsIFJBTSBtYXA6ClsgICAgMC4wMDAwMDBdICBCSU9T
LWU4MjA6IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDAwMDlmMDAwICh1c2FibGUpClsgICAg
MC4wMDAwMDBdICBCSU9TLWU4MjA6IDAwMDAwMDAwMDAwOWYwMDAgLSAwMDAwMDAwMDAwMGEwMDAw
IChyZXNlcnZlZCkKWyAgICAwLjAwMDAwMF0gIEJJT1MtZTgyMDogMDAwMDAwMDAwMDBlNzAwMCAt
IDAwMDAwMDAwMDAxMDAwMDAgKHJlc2VydmVkKQpbICAgIDAuMDAwMDAwXSAgQklPUy1lODIwOiAw
MDAwMDAwMDAwMTAwMDAwIC0gMDAwMDAwMDBkZWZiMDAwMCAodXNhYmxlKQpbICAgIDAuMDAwMDAw
XSAgQklPUy1lODIwOiAwMDAwMDAwMGRlZmIwMDAwIC0gMDAwMDAwMDBkZWZjMDAwMCAoQUNQSSBk
YXRhKQpbICAgIDAuMDAwMDAwXSAgQklPUy1lODIwOiAwMDAwMDAwMGRlZmMwMDAwIC0gMDAwMDAw
MDBkZWZmMDAwMCAoQUNQSSBOVlMpClsgICAgMC4wMDAwMDBdICBCSU9TLWU4MjA6IDAwMDAwMDAw
ZGVmZjAwMDAgLSAwMDAwMDAwMGRmMDAwMDAwIChyZXNlcnZlZCkKWyAgICAwLjAwMDAwMF0gIEJJ
T1MtZTgyMDogMDAwMDAwMDBmZWMwMDAwMCAtIDAwMDAwMDAwZmVjMDEwMDAgKHJlc2VydmVkKQpb
ICAgIDAuMDAwMDAwXSAgQklPUy1lODIwOiAwMDAwMDAwMGZlZTAwMDAwIC0gMDAwMDAwMDBmZWYw
MDAwMCAocmVzZXJ2ZWQpClsgICAgMC4wMDAwMDBdICBCSU9TLWU4MjA6IDAwMDAwMDAwZmZmODAw
MDAgLSAwMDAwMDAwMTAwMDAwMDAwIChyZXNlcnZlZCkKWyAgICAwLjAwMDAwMF0gIEJJT1MtZTgy
MDogMDAwMDAwMDEwMDAwMDAwMCAtIDAwMDAwMDA0MjAwMDAwMDAgKHVzYWJsZSkKWyAgICAwLjAw
MDAwMF0gRE1JIHByZXNlbnQuClsgICAgMC4wMDAwMDBdIEFNSSBCSU9TIGRldGVjdGVkOiBCSU9T
IG1heSBjb3JydXB0IGxvdyBSQU0sIHdvcmtpbmcgYXJvdW5kIGl0LgpbICAgIDAuMDAwMDAwXSBl
ODIwIHVwZGF0ZSByYW5nZTogMDAwMDAwMDAwMDAwMDAwMCAtIDAwMDAwMDAwMDAwMTAwMDAgKHVz
YWJsZSkgPT0+IChyZXNlcnZlZCkKWyAgICAwLjAwMDAwMF0gbGFzdF9wZm4gPSAweDQyMDAwMCBt
YXhfYXJjaF9wZm4gPSAweDQwMDAwMDAwMApbICAgIDAuMDAwMDAwXSBNVFJSIGRlZmF1bHQgdHlw
ZTogdW5jYWNoYWJsZQpbICAgIDAuMDAwMDAwXSBNVFJSIGZpeGVkIHJhbmdlcyBlbmFibGVkOgpb
ICAgIDAuMDAwMDAwXSAgIDAwMDAwLTlGRkZGIHdyaXRlLWJhY2sKWyAgICAwLjAwMDAwMF0gICBB
MDAwMC1FRkZGRiB1bmNhY2hhYmxlClsgICAgMC4wMDAwMDBdICAgRjAwMDAtRkZGRkYgd3JpdGUt
cHJvdGVjdApbICAgIDAuMDAwMDAwXSBNVFJSIHZhcmlhYmxlIHJhbmdlcyBlbmFibGVkOgpbICAg
IDAuMDAwMDAwXSAgIDAgYmFzZSAwMDAwMDAwMDAwMDAgbWFzayBGRkZGODAwMDAwMDAgd3JpdGUt
YmFjawpbICAgIDAuMDAwMDAwXSAgIDEgYmFzZSAwMDAwODAwMDAwMDAgbWFzayBGRkZGQzAwMDAw
MDAgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSAgIDIgYmFzZSAwMDAwQzAwMDAwMDAgbWFzayBG
RkZGRjAwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSAgIDMgYmFzZSAwMDAwRDAwMDAw
MDAgbWFzayBGRkZGRjgwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSAgIDQgYmFzZSAw
MDAwRDgwMDAwMDAgbWFzayBGRkZGRkMwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSAg
IDUgYmFzZSAwMDAwREMwMDAwMDAgbWFzayBGRkZGRkUwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAu
MDAwMDAwXSAgIDYgZGlzYWJsZWQKWyAgICAwLjAwMDAwMF0gICA3IGRpc2FibGVkClsgICAgMC4w
MDAwMDBdIFRPTTI6IDAwMDAwMDA0MjAwMDAwMDAgYWthIDE2ODk2TQpbICAgIDAuMDAwMDAwXSB4
ODYgUEFUIGVuYWJsZWQ6IGNwdSAwLCBvbGQgMHg3MDQwNjAwMDcwNDA2LCBuZXcgMHg3MDEwNjAw
MDcwMTA2ClsgICAgMC4wMDAwMDBdIGU4MjAgdXBkYXRlIHJhbmdlOiAwMDAwMDAwMGRlMDAwMDAw
IC0gMDAwMDAwMDEwMDAwMDAwMCAodXNhYmxlKSA9PT4gKHJlc2VydmVkKQpbICAgIDAuMDAwMDAw
XSBXQVJOSU5HOiBCSU9TIGJ1ZzogQ1BVIE1UUlJzIGRvbid0IGNvdmVyIGFsbCBvZiBtZW1vcnks
IGxvc2luZyAxNU1CIG9mIFJBTS4KWyAgICAwLjAwMDAwMF0gLS0tLS0tLS0tLS0tWyBjdXQgaGVy
ZSBdLS0tLS0tLS0tLS0tClsgICAgMC4wMDAwMDBdIFdBUk5JTkc6IGF0IC90bXAvYnVpbGRkL2xp
bnV4LTIuNi0yLjYuMzIvZGViaWFuL2J1aWxkL3NvdXJjZV9hbWQ2NF9ub25lL2FyY2gveDg2L2tl
cm5lbC9jcHUvbXRyci9jbGVhbnVwLmM6MTA5MiBtdHJyX3RyaW1fdW5jYWNoZWRfbWVtb3J5KzB4
MmU2LzB4MzExKCkKWyAgICAwLjAwMDAwMF0gSGFyZHdhcmUgbmFtZTogVG8gQmUgRmlsbGVkIEJ5
IE8uRS5NLgpbICAgIDAuMDAwMDAwXSBNb2R1bGVzIGxpbmtlZCBpbjoKWyAgICAwLjAwMDAwMF0g
UGlkOiAwLCBjb21tOiBzd2FwcGVyIE5vdCB0YWludGVkIDIuNi4zMi01LWFtZDY0ICMxClsgICAg
MC4wMDAwMDBdIENhbGwgVHJhY2U6ClsgICAgMC4wMDAwMDBdICBbPGZmZmZmZmZmODE0ZjkzMzA+
XSA/IG10cnJfdHJpbV91bmNhY2hlZF9tZW1vcnkrMHgyZTYvMHgzMTEKWyAgICAwLjAwMDAwMF0g
IFs8ZmZmZmZmZmY4MTRmOTMzMD5dID8gbXRycl90cmltX3VuY2FjaGVkX21lbW9yeSsweDJlNi8w
eDMxMQpbICAgIDAuMDAwMDAwXSAgWzxmZmZmZmZmZjgxMDRkZjljPl0gPyB3YXJuX3Nsb3dwYXRo
X2NvbW1vbisweDc3LzB4YTMKWyAgICAwLjAwMDAwMF0gIFs8ZmZmZmZmZmY4MTRmOTMzMD5dID8g
bXRycl90cmltX3VuY2FjaGVkX21lbW9yeSsweDJlNi8weDMxMQpbICAgIDAuMDAwMDAwXSAgWzxm
ZmZmZmZmZjgxNGY4MDc4Pl0gPyBtdHJyX2JwX2luaXQrMHgxYjEvMHgxZDQKWyAgICAwLjAwMDAw
MF0gIFs8ZmZmZmZmZmY4MTRmNDE4ND5dID8gc2V0dXBfYXJjaCsweDQzZi8weDlkMApbICAgIDAu
MDAwMDAwXSAgWzxmZmZmZmZmZjgxMWY3N2JhPl0gPyBleHRyYWN0X2VudHJvcHkrMHg2YS8weDEy
NQpbICAgIDAuMDAwMDAwXSAgWzxmZmZmZmZmZjgxNGYwMTQwPl0gPyBlYXJseV9pZHRfaGFuZGxl
cisweDAvMHg3MQpbICAgIDAuMDAwMDAwXSAgWzxmZmZmZmZmZjgxNGYwOWRjPl0gPyBzdGFydF9r
ZXJuZWwrMHhkYi8weDNlOApbICAgIDAuMDAwMDAwXSAgWzxmZmZmZmZmZjgxNGYwM2I3Pl0gPyB4
ODZfNjRfc3RhcnRfa2VybmVsKzB4ZjkvMHgxMDYKWyAgICAwLjAwMDAwMF0gLS0tWyBlbmQgdHJh
Y2UgYTc5MTllN2YxN2MwYTcyNSBdLS0tClsgICAgMC4wMDAwMDBdIHVwZGF0ZSBlODIwIGZvciBt
dHJyClsgICAgMC4wMDAwMDBdIG1vZGlmaWVkIHBoeXNpY2FsIFJBTSBtYXA6ClsgICAgMC4wMDAw
MDBdICBtb2RpZmllZDogMDAwMDAwMDAwMDAwMDAwMCAtIDAwMDAwMDAwMDAwMTAwMDAgKHJlc2Vy
dmVkKQpbICAgIDAuMDAwMDAwXSAgbW9kaWZpZWQ6IDAwMDAwMDAwMDAwMTAwMDAgLSAwMDAwMDAw
MDAwMDlmMDAwICh1c2FibGUpClsgICAgMC4wMDAwMDBdICBtb2RpZmllZDogMDAwMDAwMDAwMDA5
ZjAwMCAtIDAwMDAwMDAwMDAwYTAwMDAgKHJlc2VydmVkKQpbICAgIDAuMDAwMDAwXSAgbW9kaWZp
ZWQ6IDAwMDAwMDAwMDAwZTcwMDAgLSAwMDAwMDAwMDAwMTAwMDAwIChyZXNlcnZlZCkKWyAgICAw
LjAwMDAwMF0gIG1vZGlmaWVkOiAwMDAwMDAwMDAwMTAwMDAwIC0gMDAwMDAwMDBkZTAwMDAwMCAo
dXNhYmxlKQpbICAgIDAuMDAwMDAwXSAgbW9kaWZpZWQ6IDAwMDAwMDAwZGUwMDAwMDAgLSAwMDAw
MDAwMGRlZmIwMDAwIChyZXNlcnZlZCkKWyAgICAwLjAwMDAwMF0gIG1vZGlmaWVkOiAwMDAwMDAw
MGRlZmIwMDAwIC0gMDAwMDAwMDBkZWZjMDAwMCAoQUNQSSBkYXRhKQpbICAgIDAuMDAwMDAwXSAg
bW9kaWZpZWQ6IDAwMDAwMDAwZGVmYzAwMDAgLSAwMDAwMDAwMGRlZmYwMDAwIChBQ1BJIE5WUykK
WyAgICAwLjAwMDAwMF0gIG1vZGlmaWVkOiAwMDAwMDAwMGRlZmYwMDAwIC0gMDAwMDAwMDBkZjAw
MDAwMCAocmVzZXJ2ZWQpClsgICAgMC4wMDAwMDBdICBtb2RpZmllZDogMDAwMDAwMDBmZWMwMDAw
MCAtIDAwMDAwMDAwZmVjMDEwMDAgKHJlc2VydmVkKQpbICAgIDAuMDAwMDAwXSAgbW9kaWZpZWQ6
IDAwMDAwMDAwZmVlMDAwMDAgLSAwMDAwMDAwMGZlZjAwMDAwIChyZXNlcnZlZCkKWyAgICAwLjAw
MDAwMF0gIG1vZGlmaWVkOiAwMDAwMDAwMGZmZjgwMDAwIC0gMDAwMDAwMDEwMDAwMDAwMCAocmVz
ZXJ2ZWQpClsgICAgMC4wMDAwMDBdICBtb2RpZmllZDogMDAwMDAwMDEwMDAwMDAwMCAtIDAwMDAw
MDA0MjAwMDAwMDAgKHVzYWJsZSkKWyAgICAwLjAwMDAwMF0gbGFzdF9wZm4gPSAweDQyMDAwMCBt
YXhfYXJjaF9wZm4gPSAweDQwMDAwMDAwMApbICAgIDAuMDAwMDAwXSBsYXN0X3BmbiA9IDB4ZGUw
MDAgbWF4X2FyY2hfcGZuID0gMHg0MDAwMDAwMDAKWyAgICAwLjAwMDAwMF0gaW5pdGlhbCBtZW1v
cnkgbWFwcGVkIDogMCAtIDIwMDAwMDAwClsgICAgMC4wMDAwMDBdIFVzaW5nIEdCIHBhZ2VzIGZv
ciBkaXJlY3QgbWFwcGluZwpbICAgIDAuMDAwMDAwXSBpbml0X21lbW9yeV9tYXBwaW5nOiAwMDAw
MDAwMDAwMDAwMDAwLTAwMDAwMDAwZGUwMDAwMDAKWyAgICAwLjAwMDAwMF0gIDAwMDAwMDAwMDAg
LSAwMGMwMDAwMDAwIHBhZ2UgMUcKWyAgICAwLjAwMDAwMF0gIDAwYzAwMDAwMDAgLSAwMGRlMDAw
MDAwIHBhZ2UgMk0KWyAgICAwLjAwMDAwMF0ga2VybmVsIGRpcmVjdCBtYXBwaW5nIHRhYmxlcyB1
cCB0byBkZTAwMDAwMCBAIDEwMDAwLTEyMDAwClsgICAgMC4wMDAwMDBdIGluaXRfbWVtb3J5X21h
cHBpbmc6IDAwMDAwMDAxMDAwMDAwMDAtMDAwMDAwMDQyMDAwMDAwMApbICAgIDAuMDAwMDAwXSAg
MDEwMDAwMDAwMCAtIDA0MDAwMDAwMDAgcGFnZSAxRwpbICAgIDAuMDAwMDAwXSAgMDQwMDAwMDAw
MCAtIDA0MjAwMDAwMDAgcGFnZSAyTQpbICAgIDAuMDAwMDAwXSBrZXJuZWwgZGlyZWN0IG1hcHBp
bmcgdGFibGVzIHVwIHRvIDQyMDAwMDAwMCBAIDExMDAwLTEzMDAwClsgICAgMC4wMDAwMDBdIFJB
TURJU0s6IDM3NjM1MDAwIC0gMzdmZWY2YmMKWyAgICAwLjAwMDAwMF0gQUNQSTogUlNEUCAwMDAw
MDAwMDAwMGZhNTIwIDAwMDE0ICh2MDAgQUNQSUFNKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBSU0RU
IDAwMDAwMDAwZGVmYjAwMDAgMDAwNDQgKHYwMSBBX01fSSAgT0VNUlNEVCAgMDgwMDEwMDUgTVNG
VCAwMDAwMDA5NykKWyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUCAwMDAwMDAwMGRlZmIwMjAwIDAw
MDg0ICh2MDIgQV9NX0kgIE9FTUZBQ1AgIDEyMDAwNjAxIE1TRlQgMDAwMDAwOTcpClsgICAgMC4w
MDAwMDBdIEFDUEk6IERTRFQgMDAwMDAwMDBkZWZiMDQ2MCAwNDkzQiAodjAxICBBUzM4MiBBUzM4
MjAwOSAwMDAwMDAwOSBJTlRMIDIwMDUxMTE3KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBGQUNTIDAw
MDAwMDAwZGVmYzAwMDAgMDAwNDAKWyAgICAwLjAwMDAwMF0gQUNQSTogQVBJQyAwMDAwMDAwMGRl
ZmIwMzkwIDAwMDkwICh2MDEgQV9NX0kgIE9FTUFQSUMgIDA4MDAxMDA1IE1TRlQgMDAwMDAwOTcp
ClsgICAgMC4wMDAwMDBdIEFDUEk6IE1DRkcgMDAwMDAwMDBkZWZiMDQyMCAwMDAzQyAodjAxIEFf
TV9JICBPRU1NQ0ZHICAwODAwMTAwNSBNU0ZUIDAwMDAwMDk3KQpbICAgIDAuMDAwMDAwXSBBQ1BJ
OiBPRU1CIDAwMDAwMDAwZGVmYzAwNDAgMDAwNjEgKHYwMSBBX01fSSAgQU1JX09FTSAgMDgwMDEw
MDUgTVNGVCAwMDAwMDA5NykKWyAgICAwLjAwMDAwMF0gQUNQSTogU1JBVCAwMDAwMDAwMGRlZmI0
ZGEwIDAwMEU4ICh2MDMgQU1EICAgIEZBTV9GXzEwIDAwMDAwMDAyIEFNRCAgMDAwMDAwMDEpClsg
ICAgMC4wMDAwMDBdIEFDUEk6IEFBRlQgMDAwMDAwMDBkZWZiNGU5MCAwMDAyNyAodjAxIEFfTV9J
ICBPRU1BQUZUICAwODAwMTAwNSBNU0ZUIDAwMDAwMDk3KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBI
UEVUIDAwMDAwMDAwZGVmYjRlYzAgMDAwMzggKHYwMSBBX01fSSAgT0VNSFBFVDAgMDgwMDEwMDUg
TVNGVCAwMDAwMDA5NykKWyAgICAwLjAwMDAwMF0gQUNQSTogU1NEVCAwMDAwMDAwMGRlZmI0ZjAw
IDAwODhDICh2MDEgQSBNIEkgIFBPV0VSTk9XIDAwMDAwMDAxIEFNRCAgMDAwMDAwMDEpClsgICAg
MC4wMDAwMDBdIEFDUEk6IExvY2FsIEFQSUMgYWRkcmVzcyAweGZlZTAwMDAwClsgICAgMC4wMDAw
MDBdIFNSQVQ6IFBYTSAwIC0+IEFQSUMgMCAtPiBOb2RlIDAKWyAgICAwLjAwMDAwMF0gU1JBVDog
UFhNIDAgLT4gQVBJQyAxIC0+IE5vZGUgMApbICAgIDAuMDAwMDAwXSBTUkFUOiBQWE0gMCAtPiBB
UElDIDIgLT4gTm9kZSAwClsgICAgMC4wMDAwMDBdIFNSQVQ6IFBYTSAwIC0+IEFQSUMgMyAtPiBO
b2RlIDAKWyAgICAwLjAwMDAwMF0gU1JBVDogTm9kZSAwIFBYTSAwIDAtYTAwMDAKWyAgICAwLjAw
MDAwMF0gU1JBVDogTm9kZSAwIFBYTSAwIDEwMDAwMC1lMDAwMDAwMApbICAgIDAuMDAwMDAwXSBT
UkFUOiBOb2RlIDAgUFhNIDAgMTAwMDAwMDAwLTQyMDAwMDAwMApbICAgIDAuMDAwMDAwXSBOVU1B
OiBBbGxvY2F0ZWQgbWVtbm9kZW1hcCBmcm9tIDEyMDAwIC0gMWE0NDAKWyAgICAwLjAwMDAwMF0g
TlVNQTogVXNpbmcgMjAgZm9yIHRoZSBoYXNoIHNoaWZ0LgpbICAgIDAuMDAwMDAwXSBCb290bWVt
IHNldHVwIG5vZGUgMCAwMDAwMDAwMDAwMDAwMDAwLTAwMDAwMDA0MjAwMDAwMDAKWyAgICAwLjAw
MDAwMF0gICBOT0RFX0RBVEEgWzAwMDAwMDAwMDAwMWE0NDAgLSAwMDAwMDAwMDAwMDIyNDNmXQpb
ICAgIDAuMDAwMDAwXSAgIGJvb3RtYXAgWzAwMDAwMDAwMDAxMDAwMDAgLSAgMDAwMDAwMDAwMDE4
M2ZmZl0gcGFnZXMgODQKWyAgICAwLjAwMDAwMF0gKDkgZWFybHkgcmVzZXJ2YXRpb25zKSA9PT4g
Ym9vdG1lbSBbMDAwMDAwMDAwMCAtIDA0MjAwMDAwMDBdClsgICAgMC4wMDAwMDBdICAgIzAgWzAw
MDAwMDAwMDAgLSAwMDAwMDAxMDAwXSAgIEJJT1MgZGF0YSBwYWdlID09PiBbMDAwMDAwMDAwMCAt
IDAwMDAwMDEwMDBdClsgICAgMC4wMDAwMDBdICAgIzEgWzAwMDAwMDYwMDAgLSAwMDAwMDA4MDAw
XSAgICAgICBUUkFNUE9MSU5FID09PiBbMDAwMDAwNjAwMCAtIDAwMDAwMDgwMDBdClsgICAgMC4w
MDAwMDBdICAgIzIgWzAwMDEwMDAwMDAgLSAwMDAxNjg4NTk0XSAgICBURVhUIERBVEEgQlNTID09
PiBbMDAwMTAwMDAwMCAtIDAwMDE2ODg1OTRdClsgICAgMC4wMDAwMDBdICAgIzMgWzAwMzc2MzUw
MDAgLSAwMDM3ZmVmNmJjXSAgICAgICAgICBSQU1ESVNLID09PiBbMDAzNzYzNTAwMCAtIDAwMzdm
ZWY2YmNdClsgICAgMC4wMDAwMDBdICAgIzQgWzAwMDAwOWYwMDAgLSAwMDAwMTAwMDAwXSAgICBC
SU9TIHJlc2VydmVkID09PiBbMDAwMDA5ZjAwMCAtIDAwMDAxMDAwMDBdClsgICAgMC4wMDAwMDBd
ICAgIzUgWzAwMDE2ODkwMDAgLSAwMDAxNjg5MTJmXSAgICAgICAgICAgICAgQlJLID09PiBbMDAw
MTY4OTAwMCAtIDAwMDE2ODkxMmZdClsgICAgMC4wMDAwMDBdICAgIzYgWzAwMDAwMTAwMDAgLSAw
MDAwMDExMDAwXSAgICAgICAgICBQR1RBQkxFID09PiBbMDAwMDAxMDAwMCAtIDAwMDAwMTEwMDBd
ClsgICAgMC4wMDAwMDBdICAgIzcgWzAwMDAwMTEwMDAgLSAwMDAwMDEyMDAwXSAgICAgICAgICBQ
R1RBQkxFID09PiBbMDAwMDAxMTAwMCAtIDAwMDAwMTIwMDBdClsgICAgMC4wMDAwMDBdICAgIzgg
WzAwMDAwMTIwMDAgLSAwMDAwMDFhNDQwXSAgICAgICBNRU1OT0RFTUFQID09PiBbMDAwMDAxMjAw
MCAtIDAwMDAwMWE0NDBdClsgICAgMC4wMDAwMDBdIGZvdW5kIFNNUCBNUC10YWJsZSBhdCBbZmZm
Zjg4MDAwMDBmZjc4MF0gZmY3ODAKWyAgICAwLjAwMDAwMF0gIFtmZmZmZWEwMDAwMDAwMDAwLWZm
ZmZlYTAwMGU3ZmZmZmZdIFBNRCAtPiBbZmZmZjg4MDAwMTgwMDAwMC1mZmZmODgwMDBmOWZmZmZm
XSBvbiBub2RlIDAKWyAgICAwLjAwMDAwMF0gWm9uZSBQRk4gcmFuZ2VzOgpbICAgIDAuMDAwMDAw
XSAgIERNQSAgICAgIDB4MDAwMDAwMTAgLT4gMHgwMDAwMTAwMApbICAgIDAuMDAwMDAwXSAgIERN
QTMyICAgIDB4MDAwMDEwMDAgLT4gMHgwMDEwMDAwMApbICAgIDAuMDAwMDAwXSAgIE5vcm1hbCAg
IDB4MDAxMDAwMDAgLT4gMHgwMDQyMDAwMApbICAgIDAuMDAwMDAwXSBNb3ZhYmxlIHpvbmUgc3Rh
cnQgUEZOIGZvciBlYWNoIG5vZGUKWyAgICAwLjAwMDAwMF0gZWFybHlfbm9kZV9tYXBbM10gYWN0
aXZlIFBGTiByYW5nZXMKWyAgICAwLjAwMDAwMF0gICAgIDA6IDB4MDAwMDAwMTAgLT4gMHgwMDAw
MDA5ZgpbICAgIDAuMDAwMDAwXSAgICAgMDogMHgwMDAwMDEwMCAtPiAweDAwMGRlMDAwClsgICAg
MC4wMDAwMDBdICAgICAwOiAweDAwMTAwMDAwIC0+IDB4MDA0MjAwMDAKWyAgICAwLjAwMDAwMF0g
T24gbm9kZSAwIHRvdGFscGFnZXM6IDQxODU5OTkKWyAgICAwLjAwMDAwMF0gICBETUEgem9uZTog
NTYgcGFnZXMgdXNlZCBmb3IgbWVtbWFwClsgICAgMC4wMDAwMDBdICAgRE1BIHpvbmU6IDExMCBw
YWdlcyByZXNlcnZlZApbICAgIDAuMDAwMDAwXSAgIERNQSB6b25lOiAzODE3IHBhZ2VzLCBMSUZP
IGJhdGNoOjAKWyAgICAwLjAwMDAwMF0gICBETUEzMiB6b25lOiAxNDI4MCBwYWdlcyB1c2VkIGZv
ciBtZW1tYXAKWyAgICAwLjAwMDAwMF0gICBETUEzMiB6b25lOiA4OTA5MzYgcGFnZXMsIExJRk8g
YmF0Y2g6MzEKWyAgICAwLjAwMDAwMF0gICBOb3JtYWwgem9uZTogNDQ4MDAgcGFnZXMgdXNlZCBm
b3IgbWVtbWFwClsgICAgMC4wMDAwMDBdICAgTm9ybWFsIHpvbmU6IDMyMzIwMDAgcGFnZXMsIExJ
Rk8gYmF0Y2g6MzEKWyAgICAwLjAwMDAwMF0gQUNQSTogUE0tVGltZXIgSU8gUG9ydDogMHg1MDgK
WyAgICAwLjAwMDAwMF0gQUNQSTogTG9jYWwgQVBJQyBhZGRyZXNzIDB4ZmVlMDAwMDAKWyAgICAw
LjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMV0gbGFwaWNfaWRbMHgwMF0gZW5hYmxl
ZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMl0gbGFwaWNfaWRbMHgw
MV0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwM10gbGFw
aWNfaWRbMHgwMl0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRb
MHgwNF0gbGFwaWNfaWRbMHgwM10gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMg
KGFjcGlfaWRbMHgwNV0gbGFwaWNfaWRbMHg4NF0gZGlzYWJsZWQpClsgICAgMC4wMDAwMDBdIEFD
UEk6IExBUElDIChhY3BpX2lkWzB4MDZdIGxhcGljX2lkWzB4ODVdIGRpc2FibGVkKQpbICAgIDAu
MDAwMDAwXSBBQ1BJOiBJT0FQSUMgKGlkWzB4MDRdIGFkZHJlc3NbMHhmZWMwMDAwMF0gZ3NpX2Jh
c2VbMF0pClsgICAgMC4wMDAwMDBdIElPQVBJQ1swXTogYXBpY19pZCA0LCB2ZXJzaW9uIDE3LCBh
ZGRyZXNzIDB4ZmVjMDAwMDAsIEdTSSAwLTIzClsgICAgMC4wMDAwMDBdIEFDUEk6IElOVF9TUkNf
T1ZSIChidXMgMCBidXNfaXJxIDAgZ2xvYmFsX2lycSAyIGRmbCBkZmwpClsgICAgMC4wMDAwMDBd
IEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDkgZ2xvYmFsX2lycSA5IGhpZ2ggbGV2
ZWwpClsgICAgMC4wMDAwMDBdIEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDE0IGds
b2JhbF9pcnEgMTQgaGlnaCBlZGdlKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJTlRfU1JDX09WUiAo
YnVzIDAgYnVzX2lycSAxNSBnbG9iYWxfaXJxIDE1IGhpZ2ggZWRnZSkKWyAgICAwLjAwMDAwMF0g
QUNQSTogSVJRMCB1c2VkIGJ5IG92ZXJyaWRlLgpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJUlEyIHVz
ZWQgYnkgb3ZlcnJpZGUuClsgICAgMC4wMDAwMDBdIEFDUEk6IElSUTkgdXNlZCBieSBvdmVycmlk
ZS4KWyAgICAwLjAwMDAwMF0gQUNQSTogSVJRMTQgdXNlZCBieSBvdmVycmlkZS4KWyAgICAwLjAw
MDAwMF0gQUNQSTogSVJRMTUgdXNlZCBieSBvdmVycmlkZS4KWyAgICAwLjAwMDAwMF0gVXNpbmcg
QUNQSSAoTUFEVCkgZm9yIFNNUCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uClsgICAgMC4wMDAw
MDBdIEFDUEk6IEhQRVQgaWQ6IDB4MTBkZTgyMDEgYmFzZTogMHhmZWQwMDAwMApbICAgIDAuMDAw
MDAwXSBTTVA6IEFsbG93aW5nIDYgQ1BVcywgMiBob3RwbHVnIENQVXMKWyAgICAwLjAwMDAwMF0g
bnJfaXJxc19nc2k6IDI0ClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1v
cnk6IDAwMDAwMDAwMDAwOWYwMDAgLSAwMDAwMDAwMDAwMGEwMDAwClsgICAgMC4wMDAwMDBdIFBN
OiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwMDAwYTAwMDAgLSAwMDAwMDAwMDAw
MGU3MDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAw
MDAwMDAwZTcwMDAgLSAwMDAwMDAwMDAwMTAwMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3Rl
cmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZGUwMDAwMDAgLSAwMDAwMDAwMGRlZmIwMDAwClsg
ICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZGVmYjAw
MDAgLSAwMDAwMDAwMGRlZmMwMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2
ZSBtZW1vcnk6IDAwMDAwMDAwZGVmYzAwMDAgLSAwMDAwMDAwMGRlZmYwMDAwClsgICAgMC4wMDAw
MDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZGVmZjAwMDAgLSAwMDAw
MDAwMGRmMDAwMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6
IDAwMDAwMDAwZGYwMDAwMDAgLSAwMDAwMDAwMGZlYzAwMDAwClsgICAgMC4wMDAwMDBdIFBNOiBS
ZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZmVjMDAwMDAgLSAwMDAwMDAwMGZlYzAx
MDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAw
ZmVjMDEwMDAgLSAwMDAwMDAwMGZlZTAwMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVk
IG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZmVlMDAwMDAgLSAwMDAwMDAwMGZlZjAwMDAwClsgICAg
MC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IDAwMDAwMDAwZmVmMDAwMDAg
LSAwMDAwMDAwMGZmZjgwMDAwClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBt
ZW1vcnk6IDAwMDAwMDAwZmZmODAwMDAgLSAwMDAwMDAwMTAwMDAwMDAwClsgICAgMC4wMDAwMDBd
IEFsbG9jYXRpbmcgUENJIHJlc291cmNlcyBzdGFydGluZyBhdCBkZjAwMDAwMCAoZ2FwOiBkZjAw
MDAwMDoxZmMwMDAwMCkKWyAgICAwLjAwMDAwMF0gQm9vdGluZyBwYXJhdmlydHVhbGl6ZWQga2Vy
bmVsIG9uIGJhcmUgaGFyZHdhcmUKWyAgICAwLjAwMDAwMF0gTlJfQ1BVUzo1MTIgbnJfY3B1bWFz
a19iaXRzOjUxMiBucl9jcHVfaWRzOjYgbnJfbm9kZV9pZHM6MQpbICAgIDAuMDAwMDAwXSBQRVJD
UFU6IEVtYmVkZGVkIDMwIHBhZ2VzL2NwdSBAZmZmZjg4MDAwZmMwMDAwMCBzOTAzMjggcjgxOTIg
ZDI0MzYwIHUyNjIxNDQKWyAgICAwLjAwMDAwMF0gcGNwdS1hbGxvYzogczkwMzI4IHI4MTkyIGQy
NDM2MCB1MjYyMTQ0IGFsbG9jPTEqMjA5NzE1MgpbICAgIDAuMDAwMDAwXSBwY3B1LWFsbG9jOiBb
MF0gMCAxIDIgMyA0IDUgLSAtIApbICAgIDAuMDAwMDAwXSBCdWlsdCAxIHpvbmVsaXN0cyBpbiBa
b25lIG9yZGVyLCBtb2JpbGl0eSBncm91cGluZyBvbi4gIFRvdGFsIHBhZ2VzOiA0MTI2NzUzClsg
ICAgMC4wMDAwMDBdIFBvbGljeSB6b25lOiBOb3JtYWwKWyAgICAwLjAwMDAwMF0gS2VybmVsIGNv
bW1hbmQgbGluZTogQk9PVF9JTUFHRT0vdm1saW51ei0yLjYuMzItNS1hbWQ2NCByb290PS9kZXYv
bWFwcGVyL3ZnYmx1ZS1ibHVlcm9vdCBybyBxdWlldApbICAgIDAuMDAwMDAwXSBQSUQgaGFzaCB0
YWJsZSBlbnRyaWVzOiA0MDk2IChvcmRlcjogMywgMzI3NjggYnl0ZXMpClsgICAgMC4wMDAwMDBd
IEluaXRpYWxpemluZyBDUFUjMApbICAgIDAuMDAwMDAwXSBDaGVja2luZyBhcGVydHVyZS4uLgpb
ICAgIDAuMDAwMDAwXSBObyBBR1AgYnJpZGdlIGZvdW5kClsgICAgMC4wMDAwMDBdIE5vZGUgMDog
YXBlcnR1cmUgQCBjMjc0MDAwMDAwIHNpemUgMzIgTUIKWyAgICAwLjAwMDAwMF0gQXBlcnR1cmUg
YmV5b25kIDRHQi4gSWdub3JpbmcuClsgICAgMC4wMDAwMDBdIFlvdXIgQklPUyBkb2Vzbid0IGxl
YXZlIGEgYXBlcnR1cmUgbWVtb3J5IGhvbGUKWyAgICAwLjAwMDAwMF0gUGxlYXNlIGVuYWJsZSB0
aGUgSU9NTVUgb3B0aW9uIGluIHRoZSBCSU9TIHNldHVwClsgICAgMC4wMDAwMDBdIFRoaXMgY29z
dHMgeW91IDY0IE1CIG9mIFJBTQpbICAgIDAuMDAwMDAwXSBNYXBwaW5nIGFwZXJ0dXJlIG92ZXIg
NjU1MzYgS0Igb2YgUkFNIEAgMjAwMDAwMDAKWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQg
bm9zYXZlIG1lbW9yeTogMDAwMDAwMDAyMDAwMDAwMCAtIDAwMDAwMDAwMjQwMDAwMDAKWyAgICAw
LjAwMDAwMF0gTWVtb3J5OiAxNjQyOTIwMGsvMTczMDE1MDRrIGF2YWlsYWJsZSAoMzA4Mmsga2Vy
bmVsIGNvZGUsIDU1NzUwOGsgYWJzZW50LCAzMTQ3OTZrIHJlc2VydmVkLCAxODczayBkYXRhLCA1
OTZrIGluaXQpClsgICAgMC4wMDAwMDBdIFNMVUI6IEdlbnNsYWJzPTE0LCBIV2FsaWduPTY0LCBP
cmRlcj0wLTMsIE1pbk9iamVjdHM9MCwgQ1BVcz02LCBOb2Rlcz0xClsgICAgMC4wMDAwMDBdIEhp
ZXJhcmNoaWNhbCBSQ1UgaW1wbGVtZW50YXRpb24uClsgICAgMC4wMDAwMDBdIE5SX0lSUVM6NDM1
MiBucl9pcnFzOjQ1NgpbICAgIDAuMDAwMDAwXSBzcHVyaW91cyA4MjU5QSBpbnRlcnJ1cHQ6IElS
UTcuClsgICAgMC4wMDAwMDBdIENvbnNvbGU6IGNvbG91ciBWR0ErIDgweDI1ClsgICAgMC4wMDAw
MDBdIGNvbnNvbGUgW3R0eTBdIGVuYWJsZWQKWyAgICAwLjAwMDAwMF0gaHBldCBjbG9ja2V2ZW50
IHJlZ2lzdGVyZWQKWyAgICAwLjAwMDAwMF0gRmFzdCBUU0MgY2FsaWJyYXRpb24gdXNpbmcgUElU
ClsgICAgMC4wMDAwMDBdIERldGVjdGVkIDI0MTEuMTg1IE1IeiBwcm9jZXNzb3IuClsgICAgMC4w
MDgwMDVdIENhbGlicmF0aW5nIGRlbGF5IGxvb3AgKHNraXBwZWQpLCB2YWx1ZSBjYWxjdWxhdGVk
IHVzaW5nIHRpbWVyIGZyZXF1ZW5jeS4uIDQ4MjIuMzYgQm9nb01JUFMgKGxwaj05NjQ0NzI4KQpb
ICAgIDAuMDA4MDIzXSBTZWN1cml0eSBGcmFtZXdvcmsgaW5pdGlhbGl6ZWQKWyAgICAwLjAwODAy
OF0gU0VMaW51eDogIERpc2FibGVkIGF0IGJvb3QuClsgICAgMC4wMTIxNzFdIERlbnRyeSBjYWNo
ZSBoYXNoIHRhYmxlIGVudHJpZXM6IDIwOTcxNTIgKG9yZGVyOiAxMiwgMTY3NzcyMTYgYnl0ZXMp
ClsgICAgMC4wMTgxNzNdIElub2RlLWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogMTA0ODU3NiAo
b3JkZXI6IDExLCA4Mzg4NjA4IGJ5dGVzKQpbICAgIDAuMDIxMjgzXSBNb3VudC1jYWNoZSBoYXNo
IHRhYmxlIGVudHJpZXM6IDI1NgpbICAgIDAuMDIxNDAyXSBJbml0aWFsaXppbmcgY2dyb3VwIHN1
YnN5cyBucwpbICAgIDAuMDIxNDA1XSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBjcHVhY2N0
ClsgICAgMC4wMjE0MDhdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGRldmljZXMKWyAgICAw
LjAyMTQxMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgZnJlZXplcgpbICAgIDAuMDIxNDEy
XSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBuZXRfY2xzClsgICAgMC4wMjE0MzJdIENQVTog
TDEgSSBDYWNoZTogNjRLICg2NCBieXRlcy9saW5lKSwgRCBjYWNoZSA2NEsgKDY0IGJ5dGVzL2xp
bmUpClsgICAgMC4wMjE0MzRdIENQVTogTDIgQ2FjaGU6IDUxMksgKDY0IGJ5dGVzL2xpbmUpClsg
ICAgMC4wMjE0MzZdIENQVSAwLzB4MCAtPiBOb2RlIDAKWyAgICAwLjAyMTQ0MF0gdHNlZzogMDAw
MDAwMDAwMApbICAgIDAuMDIxNDUxXSBDUFU6IFBoeXNpY2FsIFByb2Nlc3NvciBJRDogMApbICAg
IDAuMDIxNDUzXSBDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAwClsgICAgMC4wMjE0NTVdIG1jZTog
Q1BVIHN1cHBvcnRzIDYgTUNFIGJhbmtzClsgICAgMC4wMjE0NjRdIFBlcmZvcm1hbmNlIEV2ZW50
czogQU1EIFBNVSBkcml2ZXIuClsgICAgMC4wMjE0NjhdIC4uLiB2ZXJzaW9uOiAgICAgICAgICAg
ICAgICAwClsgICAgMC4wMjE0NjldIC4uLiBiaXQgd2lkdGg6ICAgICAgICAgICAgICA0OApbICAg
IDAuMDIxNDcxXSAuLi4gZ2VuZXJpYyByZWdpc3RlcnM6ICAgICAgNApbICAgIDAuMDIxNDcyXSAu
Li4gdmFsdWUgbWFzazogICAgICAgICAgICAgMDAwMGZmZmZmZmZmZmZmZgpbICAgIDAuMDIxNDc0
XSAuLi4gbWF4IHBlcmlvZDogICAgICAgICAgICAgMDAwMDdmZmZmZmZmZmZmZgpbICAgIDAuMDIx
NDc1XSAuLi4gZml4ZWQtcHVycG9zZSBldmVudHM6ICAgMApbICAgIDAuMDIxNDc2XSAuLi4gZXZl
bnQgbWFzazogICAgICAgICAgICAgMDAwMDAwMDAwMDAwMDAwZgpbICAgIDAuMDIyMTIwXSBBQ1BJ
OiBDb3JlIHJldmlzaW9uIDIwMDkwOTAzClsgICAgMC4wMjc3MjJdIFNldHRpbmcgQVBJQyByb3V0
aW5nIHRvIGZsYXQKWyAgICAwLjAyODE5OF0gLi5USU1FUjogdmVjdG9yPTB4MzAgYXBpYzE9MCBw
aW4xPTIgYXBpYzI9LTEgcGluMj0tMQpbICAgIDAuMDY3ODg1XSBDUFUwOiBBTUQgQXRobG9uKHRt
KSBJSSBYNCA2MTBlIFByb2Nlc3NvciBzdGVwcGluZyAwMwpbICAgIDAuMDY4MDAxXSBCb290aW5n
IHByb2Nlc3NvciAxIEFQSUMgMHgxIGlwIDB4NjAwMApbICAgIDAuMDEyMDAwXSBJbml0aWFsaXpp
bmcgQ1BVIzEKWyAgICAwLjAxMjAwMF0gQ1BVOiBMMSBJIENhY2hlOiA2NEsgKDY0IGJ5dGVzL2xp
bmUpLCBEIGNhY2hlIDY0SyAoNjQgYnl0ZXMvbGluZSkKWyAgICAwLjAxMjAwMF0gQ1BVOiBMMiBD
YWNoZTogNTEySyAoNjQgYnl0ZXMvbGluZSkKWyAgICAwLjAxMjAwMF0gQ1BVIDEvMHgxIC0+IE5v
ZGUgMApbICAgIDAuMDEyMDAwXSBDUFU6IFBoeXNpY2FsIFByb2Nlc3NvciBJRDogMApbICAgIDAu
MDEyMDAwXSBDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAxClsgICAgMC4xNTIxMDZdIENQVTE6IEFN
RCBBdGhsb24odG0pIElJIFg0IDYxMGUgUHJvY2Vzc29yIHN0ZXBwaW5nIDAzClsgICAgMC4xNTIx
MTRdIGNoZWNraW5nIFRTQyBzeW5jaHJvbml6YXRpb24gW0NQVSMwIC0+IENQVSMxXTogcGFzc2Vk
LgpbICAgIDAuMTU2MDYyXSBCb290aW5nIHByb2Nlc3NvciAyIEFQSUMgMHgyIGlwIDB4NjAwMApb
ICAgIDAuMDEyMDAwXSBJbml0aWFsaXppbmcgQ1BVIzIKWyAgICAwLjAxMjAwMF0gQ1BVOiBMMSBJ
IENhY2hlOiA2NEsgKDY0IGJ5dGVzL2xpbmUpLCBEIGNhY2hlIDY0SyAoNjQgYnl0ZXMvbGluZSkK
WyAgICAwLjAxMjAwMF0gQ1BVOiBMMiBDYWNoZTogNTEySyAoNjQgYnl0ZXMvbGluZSkKWyAgICAw
LjAxMjAwMF0gQ1BVIDIvMHgyIC0+IE5vZGUgMApbICAgIDAuMDEyMDAwXSBDUFU6IFBoeXNpY2Fs
IFByb2Nlc3NvciBJRDogMApbICAgIDAuMDEyMDAwXSBDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAy
ClsgICAgMC4yNDQwNTBdIENQVTI6IEFNRCBBdGhsb24odG0pIElJIFg0IDYxMGUgUHJvY2Vzc29y
IHN0ZXBwaW5nIDAzClsgICAgMC4yNDQwNTZdIGNoZWNraW5nIFRTQyBzeW5jaHJvbml6YXRpb24g
W0NQVSMwIC0+IENQVSMyXTogcGFzc2VkLgpbICAgIDAuMjQ4MDU2XSBCb290aW5nIHByb2Nlc3Nv
ciAzIEFQSUMgMHgzIGlwIDB4NjAwMApbICAgIDAuMDEyMDAwXSBJbml0aWFsaXppbmcgQ1BVIzMK
WyAgICAwLjAxMjAwMF0gQ1BVOiBMMSBJIENhY2hlOiA2NEsgKDY0IGJ5dGVzL2xpbmUpLCBEIGNh
Y2hlIDY0SyAoNjQgYnl0ZXMvbGluZSkKWyAgICAwLjAxMjAwMF0gQ1BVOiBMMiBDYWNoZTogNTEy
SyAoNjQgYnl0ZXMvbGluZSkKWyAgICAwLjAxMjAwMF0gQ1BVIDMvMHgzIC0+IE5vZGUgMApbICAg
IDAuMDEyMDAwXSBDUFU6IFBoeXNpY2FsIFByb2Nlc3NvciBJRDogMApbICAgIDAuMDEyMDAwXSBD
UFU6IFByb2Nlc3NvciBDb3JlIElEOiAzClsgICAgMC4zMzYwOThdIENQVTM6IEFNRCBBdGhsb24o
dG0pIElJIFg0IDYxMGUgUHJvY2Vzc29yIHN0ZXBwaW5nIDAzClsgICAgMC4zMzYxMDRdIGNoZWNr
aW5nIFRTQyBzeW5jaHJvbml6YXRpb24gW0NQVSMwIC0+IENQVSMzXTogcGFzc2VkLgpbICAgIDAu
MzQwMDEzXSBCcm91Z2h0IHVwIDQgQ1BVcwpbICAgIDAuMzQwMDE1XSBUb3RhbCBvZiA0IHByb2Nl
c3NvcnMgYWN0aXZhdGVkICgxOTI4OC4zNyBCb2dvTUlQUykuClsgICAgMC4zNDA1MjJdIENQVTAg
YXR0YWNoaW5nIHNjaGVkLWRvbWFpbjoKWyAgICAwLjM0MDUyNl0gIGRvbWFpbiAwOiBzcGFuIDAt
MyBsZXZlbCBNQwpbICAgIDAuMzQwNTI4XSAgIGdyb3VwczogZ3JvdXAgZmZmZjg4MDAwZmMwZmJm
MCBjcHVzIDAgZ3JvdXAgZmZmZjg4MDAwZmM0ZmJmMCBjcHVzIDEgZ3JvdXAgZmZmZjg4MDAwZmM4
ZmJmMCBjcHVzIDIgZ3JvdXAgZmZmZjg4MDAwZmNjZmJmMCBjcHVzIDMKWyAgICAwLjM0MDUzN10g
Q1BVMSBhdHRhY2hpbmcgc2NoZWQtZG9tYWluOgpbICAgIDAuMzQwNTM5XSAgZG9tYWluIDA6IHNw
YW4gMC0zIGxldmVsIE1DClsgICAgMC4zNDA1NDFdICAgZ3JvdXBzOiBncm91cCBmZmZmODgwMDBm
YzRmYmYwIGNwdXMgMSBncm91cCBmZmZmODgwMDBmYzhmYmYwIGNwdXMgMiBncm91cCBmZmZmODgw
MDBmY2NmYmYwIGNwdXMgMyBncm91cCBmZmZmODgwMDBmYzBmYmYwIGNwdXMgMApbICAgIDAuMzQw
NTQ3XSBDUFUyIGF0dGFjaGluZyBzY2hlZC1kb21haW46ClsgICAgMC4zNDA1NDldICBkb21haW4g
MDogc3BhbiAwLTMgbGV2ZWwgTUMKWyAgICAwLjM0MDU1MV0gICBncm91cHM6IGdyb3VwIGZmZmY4
ODAwMGZjOGZiZjAgY3B1cyAyIGdyb3VwIGZmZmY4ODAwMGZjY2ZiZjAgY3B1cyAzIGdyb3VwIGZm
ZmY4ODAwMGZjMGZiZjAgY3B1cyAwIGdyb3VwIGZmZmY4ODAwMGZjNGZiZjAgY3B1cyAxClsgICAg
MC4zNDA1NTddIENQVTMgYXR0YWNoaW5nIHNjaGVkLWRvbWFpbjoKWyAgICAwLjM0MDU1OF0gIGRv
bWFpbiAwOiBzcGFuIDAtMyBsZXZlbCBNQwpbICAgIDAuMzQwNTYwXSAgIGdyb3VwczogZ3JvdXAg
ZmZmZjg4MDAwZmNjZmJmMCBjcHVzIDMgZ3JvdXAgZmZmZjg4MDAwZmMwZmJmMCBjcHVzIDAgZ3Jv
dXAgZmZmZjg4MDAwZmM0ZmJmMCBjcHVzIDEgZ3JvdXAgZmZmZjg4MDAwZmM4ZmJmMCBjcHVzIDIK
WyAgICAwLjM0MDY1Nl0gZGV2dG1wZnM6IGluaXRpYWxpemVkClsgICAgMC4zNDQ0MzldIHJlZ3Vs
YXRvcjogY29yZSB2ZXJzaW9uIDAuNQpbICAgIDAuMzQ0NDM5XSBORVQ6IFJlZ2lzdGVyZWQgcHJv
dG9jb2wgZmFtaWx5IDE2ClsgICAgMC4zNDQ0MzldIG5vZGUgMCBsaW5rIDA6IGlvIHBvcnQgWzEw
MDAsIGZmZmZmZl0KWyAgICAwLjM0NDQzOV0gVE9NOiAwMDAwMDAwMGUwMDAwMDAwIGFrYSAzNTg0
TQpbICAgIDAuMzQ0NDM5XSBGYW0gMTBoIG1tY29uZiBbZmMwMDAwMDAsIGZkZmZmZmZmXQpbICAg
IDAuMzQ0NDM5XSBub2RlIDAgbGluayAwOiBtbWlvIFtmYzAwMDAwMCwgZmRmZmZmZmZdID09PiBu
b25lClsgICAgMC4zNDQ0MzldIG5vZGUgMCBsaW5rIDA6IG1taW8gW2UwMDAwMDAwLCBmYmZmZmZm
Zl0KWyAgICAwLjM0NDQzOV0gbm9kZSAwIGxpbmsgMDogbW1pbyBbZmUwMDAwMDAsIGZlMGJmZmZm
XQpbICAgIDAuMzQ0NDM5XSBub2RlIDAgbGluayAwOiBtbWlvIFthMDAwMCwgYmZmZmZdClsgICAg
MC4zNDQ0MzldIFRPTTI6IDAwMDAwMDA0MjAwMDAwMDAgYWthIDE2ODk2TQpbICAgIDAuMzQ0NDM5
XSBidXM6IFswMCwwN10gb24gbm9kZSAwIGxpbmsgMApbICAgIDAuMzQ0NDM5XSBidXM6IDAwIGlu
ZGV4IDAgaW8gcG9ydDogWzAsIGZmZmZdClsgICAgMC4zNDQ0MzldIGJ1czogMDAgaW5kZXggMSBt
bWlvOiBbZTAwMDAwMDAsIGZiZmZmZmZmXQpbICAgIDAuMzQ0NDM5XSBidXM6IDAwIGluZGV4IDIg
bW1pbzogW2ZlMDAwMDAwLCBmZmZmZmZmZl0KWyAgICAwLjM0NDQzOV0gYnVzOiAwMCBpbmRleCAz
IG1taW86IFthMDAwMCwgYmZmZmZdClsgICAgMC4zNDQ0MzldIGJ1czogMDAgaW5kZXggNCBtbWlv
OiBbNDIwMDAwMDAwLCBmY2ZmZmZmZmZmXQpbICAgIDAuMzQ0NDM5XSBBQ1BJOiBidXMgdHlwZSBw
Y2kgcmVnaXN0ZXJlZApbICAgIDAuMzQ0NDM5XSBQQ0k6IE1DRkcgY29uZmlndXJhdGlvbiAwOiBi
YXNlIGZjMDAwMDAwIHNlZ21lbnQgMCBidXNlcyAwIC0gMzEKWyAgICAwLjM0NDQzOV0gUENJOiBO
b3QgdXNpbmcgTU1DT05GSUcuClsgICAgMC4zNDQ0MzldIFBDSTogVXNpbmcgY29uZmlndXJhdGlv
biB0eXBlIDEgZm9yIGJhc2UgYWNjZXNzClsgICAgMC4zNDQ0MzldIFBDSTogVXNpbmcgY29uZmln
dXJhdGlvbiB0eXBlIDEgZm9yIGV4dGVuZGVkIGFjY2VzcwpbICAgIDAuMzQ0OTA1XSBiaW86IGNy
ZWF0ZSBzbGFiIDxiaW8tMD4gYXQgMApbICAgIDAuMzQ0OTA1XSBBQ1BJOiBFQzogTG9vayB1cCBF
QyBpbiBEU0RUClsgICAgMC4zNDk5MjNdIEFDUEk6IEV4ZWN1dGVkIDEgYmxvY2tzIG9mIG1vZHVs
ZS1sZXZlbCBleGVjdXRhYmxlIEFNTCBjb2RlClsgICAgMC4zNTQ3MzhdIEFDUEk6IEludGVycHJl
dGVyIGVuYWJsZWQKWyAgICAwLjM1NDc0MV0gQUNQSTogKHN1cHBvcnRzIFMwIFMxIFM0IFM1KQpb
ICAgIDAuMzU0NzU3XSBBQ1BJOiBVc2luZyBJT0FQSUMgZm9yIGludGVycnVwdCByb3V0aW5nClsg
ICAgMC4zNTQ4MDJdIFBDSTogTUNGRyBjb25maWd1cmF0aW9uIDA6IGJhc2UgZmMwMDAwMDAgc2Vn
bWVudCAwIGJ1c2VzIDAgLSAzMQpbICAgIDAuMzU5MzI5XSBQQ0k6IE1DRkcgYXJlYSBhdCBmYzAw
MDAwMCByZXNlcnZlZCBpbiBBQ1BJIG1vdGhlcmJvYXJkIHJlc291cmNlcwpbICAgIDAuMzYwMzI4
XSBQQ0k6IFVzaW5nIE1NQ09ORklHIGF0IGZjMDAwMDAwIC0gZmRmZmZmZmYKWyAgICAwLjM2ODc3
M10gQUNQSSBXYXJuaW5nOiBJbmNvcnJlY3QgY2hlY2tzdW0gaW4gdGFibGUgW09FTUJdIC0gNzIs
IHNob3VsZCBiZSA2RCAoMjAwOTA5MDMvdGJ1dGlscy0zMTQpClsgICAgMC4zNjg4OTJdIEFDUEk6
IE5vIGRvY2sgZGV2aWNlcyBmb3VuZC4KWyAgICAwLjM2ODk5N10gQUNQSTogUENJIFJvb3QgQnJp
ZGdlIFtQQ0kwXSAoMDAwMDowMCkKWyAgICAwLjM2OTE2NV0gcGNpIDAwMDA6MDA6MDEuMDogcmVn
IDEwIGlvIHBvcnQ6IFsweDkwMC0weDlmZl0KWyAgICAwLjM2OTIwMV0gcGNpIDAwMDA6MDA6MDEu
MTogcmVnIDEwIGlvIHBvcnQ6IFsweGRjMDAtMHhkYzNmXQpbICAgIDAuMzY5MjExXSBwY2kgMDAw
MDowMDowMS4xOiByZWcgMjAgaW8gcG9ydDogWzB4NjAwLTB4NjNmXQpbICAgIDAuMzY5MjE1XSBw
Y2kgMDAwMDowMDowMS4xOiByZWcgMjQgaW8gcG9ydDogWzB4NzAwLTB4NzNmXQpbICAgIDAuMzY5
MjMzXSBwY2kgMDAwMDowMDowMS4xOiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQzaG90IEQzY29sZApb
ICAgIDAuMzY5MjM4XSBwY2kgMDAwMDowMDowMS4xOiBQTUUjIGRpc2FibGVkClsgICAgMC4zNjky
ODJdIHBjaSAwMDAwOjAwOjAyLjA6IHJlZyAxMCAzMmJpdCBtbWlvOiBbMHhmYmVmZjAwMC0weGZi
ZWZmZmZmXQpbICAgIDAuMzY5MzAyXSBwY2kgMDAwMDowMDowMi4wOiBzdXBwb3J0cyBEMSBEMgpb
ICAgIDAuMzY5MzA0XSBwY2kgMDAwMDowMDowMi4wOiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQx
IEQyIEQzaG90IEQzY29sZApbICAgIDAuMzY5MzA3XSBwY2kgMDAwMDowMDowMi4wOiBQTUUjIGRp
c2FibGVkClsgICAgMC4zNjkzMjddIHBjaSAwMDAwOjAwOjAyLjE6IHJlZyAxMCAzMmJpdCBtbWlv
OiBbMHhmYmVmZWMwMC0weGZiZWZlY2ZmXQpbICAgIDAuMzY5MzUxXSBwY2kgMDAwMDowMDowMi4x
OiBzdXBwb3J0cyBEMSBEMgpbICAgIDAuMzY5MzUzXSBwY2kgMDAwMDowMDowMi4xOiBQTUUjIHN1
cHBvcnRlZCBmcm9tIEQwIEQxIEQyIEQzaG90IEQzY29sZApbICAgIDAuMzY5MzU2XSBwY2kgMDAw
MDowMDowMi4xOiBQTUUjIGRpc2FibGVkClsgICAgMC4zNjk0MTJdIHBjaSAwMDAwOjAwOjA1LjA6
IHJlZyAxMCAzMmJpdCBtbWlvOiBbMHhmYmVmODAwMC0weGZiZWZiZmZmXQpbICAgIDAuMzY5NDM2
XSBwY2kgMDAwMDowMDowNS4wOiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQzaG90IEQzY29sZApbICAg
IDAuMzY5NDM4XSBwY2kgMDAwMDowMDowNS4wOiBQTUUjIGRpc2FibGVkClsgICAgMC4zNjk0Njdd
IHBjaSAwMDAwOjAwOjA3LjA6IHJlZyAxMCAzMmJpdCBtbWlvOiBbMHhmYmVmZDAwMC0weGZiZWZk
ZmZmXQpbICAgIDAuMzY5NDcxXSBwY2kgMDAwMDowMDowNy4wOiByZWcgMTQgaW8gcG9ydDogWzB4
ZDQ4MC0weGQ0ODddClsgICAgMC4zNjk0OTBdIHBjaSAwMDAwOjAwOjA3LjA6IHN1cHBvcnRzIEQx
IEQyClsgICAgMC4zNjk0OTJdIHBjaSAwMDAwOjAwOjA3LjA6IFBNRSMgc3VwcG9ydGVkIGZyb20g
RDAgRDEgRDIgRDNob3QgRDNjb2xkClsgICAgMC4zNjk0OTVdIHBjaSAwMDAwOjAwOjA3LjA6IFBN
RSMgZGlzYWJsZWQKWyAgICAwLjM2OTUyN10gcGNpIDAwMDA6MDA6MDkuMDogUE1FIyBzdXBwb3J0
ZWQgZnJvbSBEMCBEMSBEMiBEM2hvdCBEM2NvbGQKWyAgICAwLjM2OTUyOV0gcGNpIDAwMDA6MDA6
MDkuMDogUE1FIyBkaXNhYmxlZApbICAgIDAuMzY5NTYxXSBwY2kgMDAwMDowMDowYi4wOiBQTUUj
IHN1cHBvcnRlZCBmcm9tIEQwIEQxIEQyIEQzaG90IEQzY29sZApbICAgIDAuMzY5NTYzXSBwY2kg
MDAwMDowMDowYi4wOiBQTUUjIGRpc2FibGVkClsgICAgMC4zNjk1OTNdIHBjaSAwMDAwOjAwOjBj
LjA6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDEgRDIgRDNob3QgRDNjb2xkClsgICAgMC4zNjk1
OTVdIHBjaSAwMDAwOjAwOjBjLjA6IFBNRSMgZGlzYWJsZWQKWyAgICAwLjM2OTYxMF0gcGNpIDAw
MDA6MDA6MGQuMDogcmVnIDEwIDMyYml0IG1taW86IFsweGZhMDAwMDAwLTB4ZmFmZmZmZmZdClsg
ICAgMC4zNjk2MTVdIHBjaSAwMDAwOjAwOjBkLjA6IHJlZyAxNCA2NGJpdCBtbWlvIHByZWY6IFsw
eGUwMDAwMDAwLTB4ZWZmZmZmZmZdClsgICAgMC4zNjk2MTldIHBjaSAwMDAwOjAwOjBkLjA6IHJl
ZyAxYyA2NGJpdCBtbWlvOiBbMHhmOTAwMDAwMC0weGY5ZmZmZmZmXQpbICAgIDAuMzY5NjIzXSBw
Y2kgMDAwMDowMDowZC4wOiByZWcgMzAgMzJiaXQgbW1pbyBwcmVmOiBbMHhmYmVjMDAwMC0weGZi
ZWRmZmZmXQpbICAgIDAuMzY5NzMxXSBwY2kgMDAwMDowMDowNC4wOiB0cmFuc3BhcmVudCBicmlk
Z2UKWyAgICAwLjM2OTc5Ml0gcGNpIDAwMDA6MDM6MDAuMDogcmVnIDEwIDY0Yml0IG1taW8gcHJl
ZjogWzB4ZjYwMDAwMDAtMHhmN2ZmZmZmZl0KWyAgICAwLjM2OTgwMF0gcGNpIDAwMDA6MDM6MDAu
MDogcmVnIDE4IDY0Yml0IG1taW86IFsweGZiZmZmMDAwLTB4ZmJmZmZmZmZdClsgICAgMC4zNjk4
MDVdIHBjaSAwMDAwOjAzOjAwLjA6IHJlZyAyMCBpbyBwb3J0OiBbMHhlODAwLTB4ZThmZl0KWyAg
ICAwLjM2OTgxM10gcGNpIDAwMDA6MDM6MDAuMDogcmVnIDMwIDMyYml0IG1taW8gcHJlZjogWzB4
ZmJmYzAwMDAtMHhmYmZkZmZmZl0KWyAgICAwLjM2OTgzMF0gcGNpIDAwMDA6MDM6MDAuMDogc3Vw
cG9ydHMgRDEgRDIKWyAgICAwLjM3NjA3NV0gcGNpIDAwMDA6MDA6MGIuMDogYnJpZGdlIGlvIHBv
cnQ6IFsweGUwMDAtMHhlZmZmXQpbICAgIDAuMzc2MDc5XSBwY2kgMDAwMDowMDowYi4wOiBicmlk
Z2UgMzJiaXQgbW1pbzogWzB4ZmJmMDAwMDAtMHhmYmZmZmZmZl0KWyAgICAwLjM3NjA4M10gcGNp
IDAwMDA6MDA6MGIuMDogYnJpZGdlIDY0Yml0IG1taW8gcHJlZjogWzB4ZjYwMDAwMDAtMHhmN2Zm
ZmZmZl0KWyAgICAwLjM3NjEzOF0gQUNQSTogUENJIEludGVycnVwdCBSb3V0aW5nIFRhYmxlIFtc
X1NCXy5QQ0kwLl9QUlRdClsgICAgMC4zNzYzMjBdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgUm91dGlu
ZyBUYWJsZSBbXF9TQl8uUENJMC5QMFAxLl9QUlRdClsgICAgMC4zNzYzOTRdIEFDUEk6IFBDSSBJ
bnRlcnJ1cHQgUm91dGluZyBUYWJsZSBbXF9TQl8uUENJMC5CUjEwLl9QUlRdClsgICAgMC4zNzY0
NDZdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSBbXF9TQl8uUENJMC5CUjExLl9Q
UlRdClsgICAgMC4zNzY0OThdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgUm91dGluZyBUYWJsZSBbXF9T
Ql8uUENJMC5CUjEyLl9QUlRdClsgICAgMC40MDI4MDRdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGlu
ayBbTE5LQV0gKElSUXMgMTYgMTcgMTggMTkpICowLCBkaXNhYmxlZC4KWyAgICAwLjQwMjk3MV0g
QUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktCXSAoSVJRcyAxNiAxNyAxOCAxOSkgKjAsIGRp
c2FibGVkLgpbICAgIDAuNDAzMTM1XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xOS0NdIChJ
UlFzIDE2IDE3IDE4IDE5KSAqMCwgZGlzYWJsZWQuClsgICAgMC40MDMyOThdIEFDUEk6IFBDSSBJ
bnRlcnJ1cHQgTGluayBbTE5LRF0gKElSUXMgMTYgMTcgMTggMTkpICowLCBkaXNhYmxlZC4KWyAg
ICAwLjQwMzQ2MF0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTkVBXSAoSVJRcyAxNiAxNyAx
OCAxOSkgKjAsIGRpc2FibGVkLgpbICAgIDAuNDAzNjIxXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExp
bmsgW0xORUJdIChJUlFzIDE2IDE3IDE4IDE5KSAqNQpbICAgIDAuNDAzNzgxXSBBQ1BJOiBQQ0kg
SW50ZXJydXB0IExpbmsgW0xORUNdIChJUlFzIDE2IDE3IDE4IDE5KSAqMCwgZGlzYWJsZWQuClsg
ICAgMC40MDM5NDNdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5FRF0gKElSUXMgMTYgMTcg
MTggMTkpICowLCBkaXNhYmxlZC4KWyAgICAwLjQwNDExN10gQUNQSTogUENJIEludGVycnVwdCBM
aW5rIFtMVUIwXSAoSVJRcyAyMCAyMSAyMiAyMykgKjUKWyAgICAwLjQwNDI3OV0gQUNQSTogUENJ
IEludGVycnVwdCBMaW5rIFtMVUIyXSAoSVJRcyAyMCAyMSAyMiAyMykgKjE0ClsgICAgMC40MDQ0
NDBdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE1BQ10gKElSUXMgMjAgMjEgMjIgMjMpICox
MQpbICAgIDAuNDA0NjAxXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xBWkFdIChJUlFzIDIw
IDIxIDIyIDIzKSAqMTAKWyAgICAwLjQwNDc2M10gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtM
QUNJXSAoSVJRcyAyMCAyMSAyMiAyMykgKjAsIGRpc2FibGVkLgpbICAgIDAuNDA0OTI0XSBBQ1BJ
OiBQQ0kgSW50ZXJydXB0IExpbmsgW0xNQzldIChJUlFzIDIwIDIxIDIyIDIzKSAqMTAKWyAgICAw
LjQwNTA4Nl0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMU01CXSAoSVJRcyAyMCAyMSAyMiAy
MykgKjExClsgICAgMC40MDUyNDddIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTFBNVV0gKElS
UXMgMjAgMjEgMjIgMjMpICowLCBkaXNhYmxlZC4KWyAgICAwLjQwNTQxMF0gQUNQSTogUENJIElu
dGVycnVwdCBMaW5rIFtMU0EwXSAoSVJRcyAyMCAyMSAyMiAyMykgKjAsIGRpc2FibGVkLgpbICAg
IDAuNDA1NTcxXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xTQTFdIChJUlFzIDIwIDIxIDIy
IDIzKSAqMCwgZGlzYWJsZWQuClsgICAgMC40MDU5OTJdIEFDUEkgV2FybmluZyBmb3IgXF9TQl8u
TEFUQS5fQ1JTOiBSZXR1cm4gdHlwZSBtaXNtYXRjaCAtIGZvdW5kIEludGVnZXIsIGV4cGVjdGVk
IEJ1ZmZlciAoMjAwOTA5MDMvbnNwcmVkZWYtMTAwNikKWyAgICAwLjQwNTk5N10gQUNQSSBFcnJv
ciAodXRldmFsLTAzMDcpOiBSZXR1cm4gb2JqZWN0IHR5cGUgaXMgaW5jb3JyZWN0IFtcX1NCXy5M
QVRBLl9DUlNdIChOb2RlIGZmZmY4ODA0MWU0M2ZiMDApLCBBRV9UWVBFClsgICAgMC40MDYwMDNd
IEFDUEkgRXJyb3I6IFR5cGUgcmV0dXJuZWQgZnJvbSBfQ1JTIHdhcyBpbmNvcnJlY3Q6IEludGVn
ZXIsIGV4cGVjdGVkIEJ0eXBlczogNCAoMjAwOTA5MDMvdXRldmFsLTMxMykKWyAgICAwLjQwNjAw
N10gQUNQSSBFeGNlcHRpb246IEFFX1RZUEUsIEV2YWx1YXRpbmcgX0NSUyAoMjAwOTA5MDMvcGNp
X2xpbmstMjgyKQpbICAgIDAuNDA2MDEwXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xBVEFd
IChJUlFzIDIwIDIxIDIyIDIzKSAqMCwgZGlzYWJsZWQuClsgICAgMC40MDYwOTddIHZnYWFyYjog
ZGV2aWNlIGFkZGVkOiBQQ0k6MDAwMDowMDowZC4wLGRlY29kZXM9aW8rbWVtLG93bnM9aW8rbWVt
LGxvY2tzPW5vbmUKWyAgICAwLjQwNjEwMV0gdmdhYXJiOiBsb2FkZWQKWyAgICAwLjQwNjEyMV0g
UENJOiBVc2luZyBBQ1BJIGZvciBJUlEgcm91dGluZwpbICAgIDAuNDA2MTIxXSBIUEVUOiAzIHRp
bWVycyBpbiB0b3RhbCwgMCB0aW1lcnMgd2lsbCBiZSB1c2VkIGZvciBwZXItY3B1IHRpbWVyClsg
ICAgMC40MDYxMjFdIGhwZXQwOiBhdCBNTUlPIDB4ZmVkMDAwMDAsIElSUXMgMiwgOCwgMzEKWyAg
ICAwLjQwNjEyMV0gaHBldDA6IDMgY29tcGFyYXRvcnMsIDMyLWJpdCAyNS4wMDAwMDAgTUh6IGNv
dW50ZXIKWyAgICAwLjQxNjAzMl0gU3dpdGNoaW5nIHRvIGNsb2Nrc291cmNlIHRzYwpbICAgIDAu
NDE2ODY1XSBwbnA6IFBuUCBBQ1BJIGluaXQKWyAgICAwLjQxNjg4M10gQUNQSTogYnVzIHR5cGUg
cG5wIHJlZ2lzdGVyZWQKWyAgICAwLjQyMTYzMV0gcG5wOiBQblAgQUNQSTogZm91bmQgMTMgZGV2
aWNlcwpbICAgIDAuNDIxNjMyXSBBQ1BJOiBBQ1BJIGJ1cyB0eXBlIHBucCB1bnJlZ2lzdGVyZWQK
WyAgICAwLjQyMTY0M10gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHg0ZDAtMHg0ZDEgaGFz
IGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjQyMTY0Nl0gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2Ug
MHg1MDAtMHg1N2YgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjQyMTY0OF0gc3lzdGVtIDAwOjA2
OiBpb3BvcnQgcmFuZ2UgMHg1ODAtMHg1ZmYgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjQyMTY1
MV0gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHg4MDAtMHg4N2YgaGFzIGJlZW4gcmVzZXJ2
ZWQKWyAgICAwLjQyMTY1M10gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHg4ODAtMHg4ZmYg
aGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjQyMTY1Nl0gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFu
Z2UgMHhkMDAtMHhkN2YgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjQyMTY1OF0gc3lzdGVtIDAw
OjA2OiBpb3BvcnQgcmFuZ2UgMHhkODAtMHhkZmYgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjQy
MTY2MV0gc3lzdGVtIDAwOjA2OiBpb3BvcnQgcmFuZ2UgMHgxMTAwLTB4MTE3ZiBoYXMgYmVlbiBy
ZXNlcnZlZApbICAgIDAuNDIxNjYzXSBzeXN0ZW0gMDA6MDY6IGlvcG9ydCByYW5nZSAweDExODAt
MHgxMWZmIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMC40MjE2NjddIHN5c3RlbSAwMDowNjogaW9t
ZW0gcmFuZ2UgMHhmZWM4MDAwMC0weDFmZDkzZmZmZiBjb3VsZCBub3QgYmUgcmVzZXJ2ZWQKWyAg
ICAwLjQyMTY3MF0gc3lzdGVtIDAwOjA2OiBpb21lbSByYW5nZSAweGZlZmUwMDAwLTB4ZmVmZTAx
ZmYgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjQyMTY3Ml0gc3lzdGVtIDAwOjA2OiBpb21lbSBy
YW5nZSAweGZlZmUxMDAwLTB4ZmVmZTFmZmYgaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjQyMTY3
NV0gc3lzdGVtIDAwOjA2OiBpb21lbSByYW5nZSAweGZlZTAxMDAwLTB4ZmVlZmZmZmYgaGFzIGJl
ZW4gcmVzZXJ2ZWQKWyAgICAwLjQyMTY3OV0gc3lzdGVtIDAwOjA3OiBpb21lbSByYW5nZSAweGZl
YzAwMDAwLTB4ZmVjMDBmZmYgY291bGQgbm90IGJlIHJlc2VydmVkClsgICAgMC40MjE2ODJdIHN5
c3RlbSAwMDowNzogaW9tZW0gcmFuZ2UgMHhmZWUwMDAwMC0weGZlZTAwZmZmIGhhcyBiZWVuIHJl
c2VydmVkClsgICAgMC40MjE2ODddIHN5c3RlbSAwMDowYTogaW9wb3J0IHJhbmdlIDB4MjgwLTB4
MjhmIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMC40MjE2ODldIHN5c3RlbSAwMDowYTogaW9wb3J0
IHJhbmdlIDB4MjkwLTB4MjlmIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMC40MjE2OTNdIHN5c3Rl
bSAwMDowYjogaW9tZW0gcmFuZ2UgMHhmYzAwMDAwMC0weGZkZmZmZmZmIGhhcyBiZWVuIHJlc2Vy
dmVkClsgICAgMC40MjE2OThdIHN5c3RlbSAwMDowYzogaW9tZW0gcmFuZ2UgMHgwLTB4OWZmZmYg
Y291bGQgbm90IGJlIHJlc2VydmVkClsgICAgMC40MjE3MDBdIHN5c3RlbSAwMDowYzogaW9tZW0g
cmFuZ2UgMHhlMDAwMC0weGZmZmZmIGNvdWxkIG5vdCBiZSByZXNlcnZlZApbICAgIDAuNDIxNzAz
XSBzeXN0ZW0gMDA6MGM6IGlvbWVtIHJhbmdlIDB4MTAwMDAwLTB4ZGZmZmZmZmYgY291bGQgbm90
IGJlIHJlc2VydmVkClsgICAgMC40MjE3MDVdIHN5c3RlbSAwMDowYzogaW9tZW0gcmFuZ2UgMHhm
ZjM4MDAwMC0weGZmZmZmZmZmIGNvdWxkIG5vdCBiZSByZXNlcnZlZApbICAgIDAuNDI2Njc2XSBw
Y2kgMDAwMDowMDowNC4wOiBQQ0kgYnJpZGdlLCBzZWNvbmRhcnkgYnVzIDAwMDA6MDEKWyAgICAw
LjQyNjY3OV0gcGNpIDAwMDA6MDA6MDQuMDogICBJTyB3aW5kb3c6IGRpc2FibGVkClsgICAgMC40
MjY2ODFdIHBjaSAwMDAwOjAwOjA0LjA6ICAgTUVNIHdpbmRvdzogZGlzYWJsZWQKWyAgICAwLjQy
NjY4NF0gcGNpIDAwMDA6MDA6MDQuMDogICBQUkVGRVRDSCB3aW5kb3c6IGRpc2FibGVkClsgICAg
MC40MjY2ODddIHBjaSAwMDAwOjAwOjA5LjA6IFBDSSBicmlkZ2UsIHNlY29uZGFyeSBidXMgMDAw
MDowMgpbICAgIDAuNDI2Njg4XSBwY2kgMDAwMDowMDowOS4wOiAgIElPIHdpbmRvdzogZGlzYWJs
ZWQKWyAgICAwLjQyNjY5MV0gcGNpIDAwMDA6MDA6MDkuMDogICBNRU0gd2luZG93OiBkaXNhYmxl
ZApbICAgIDAuNDI2NjkyXSBwY2kgMDAwMDowMDowOS4wOiAgIFBSRUZFVENIIHdpbmRvdzogZGlz
YWJsZWQKWyAgICAwLjQyNjY5NV0gcGNpIDAwMDA6MDA6MGIuMDogUENJIGJyaWRnZSwgc2Vjb25k
YXJ5IGJ1cyAwMDAwOjAzClsgICAgMC40MjY2OTddIHBjaSAwMDAwOjAwOjBiLjA6ICAgSU8gd2lu
ZG93OiAweGUwMDAtMHhlZmZmClsgICAgMC40MjY3MDBdIHBjaSAwMDAwOjAwOjBiLjA6ICAgTUVN
IHdpbmRvdzogMHhmYmYwMDAwMC0weGZiZmZmZmZmClsgICAgMC40MjY3MDNdIHBjaSAwMDAwOjAw
OjBiLjA6ICAgUFJFRkVUQ0ggd2luZG93OiAweDAwMDAwMGY2MDAwMDAwLTB4MDAwMDAwZjdmZmZm
ZmYKWyAgICAwLjQyNjcwNl0gcGNpIDAwMDA6MDA6MGMuMDogUENJIGJyaWRnZSwgc2Vjb25kYXJ5
IGJ1cyAwMDAwOjA0ClsgICAgMC40MjY3MDddIHBjaSAwMDAwOjAwOjBjLjA6ICAgSU8gd2luZG93
OiBkaXNhYmxlZApbICAgIDAuNDI2NzA5XSBwY2kgMDAwMDowMDowYy4wOiAgIE1FTSB3aW5kb3c6
IGRpc2FibGVkClsgICAgMC40MjY3MTFdIHBjaSAwMDAwOjAwOjBjLjA6ICAgUFJFRkVUQ0ggd2lu
ZG93OiBkaXNhYmxlZApbICAgIDAuNDI2NzE5XSBwY2kgMDAwMDowMDowNC4wOiBzZXR0aW5nIGxh
dGVuY3kgdGltZXIgdG8gNjQKWyAgICAwLjQyNjcyM10gcGNpIDAwMDA6MDA6MDkuMDogc2V0dGlu
ZyBsYXRlbmN5IHRpbWVyIHRvIDY0ClsgICAgMC40MjY3MjddIHBjaSAwMDAwOjAwOjBiLjA6IHNl
dHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApbICAgIDAuNDI2NzMwXSBwY2kgMDAwMDowMDowYy4w
OiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICAwLjQyNjczNF0gcGNpX2J1cyAwMDAw
OjAwOiByZXNvdXJjZSAwIGlvOiAgWzB4MDAtMHhmZmZmXQpbICAgIDAuNDI2NzM2XSBwY2lfYnVz
IDAwMDA6MDA6IHJlc291cmNlIDEgbWVtOiBbMHgwMDAwMDAtMHhmZmZmZmZmZmZmZmZmZmZmXQpb
ICAgIDAuNDI2NzM4XSBwY2lfYnVzIDAwMDA6MDE6IHJlc291cmNlIDMgaW86ICBbMHgwMC0weGZm
ZmZdClsgICAgMC40MjY3NDBdIHBjaV9idXMgMDAwMDowMTogcmVzb3VyY2UgNCBtZW06IFsweDAw
MDAwMC0weGZmZmZmZmZmZmZmZmZmZmZdClsgICAgMC40MjY3NDJdIHBjaV9idXMgMDAwMDowMzog
cmVzb3VyY2UgMCBpbzogIFsweGUwMDAtMHhlZmZmXQpbICAgIDAuNDI2NzQ0XSBwY2lfYnVzIDAw
MDA6MDM6IHJlc291cmNlIDEgbWVtOiBbMHhmYmYwMDAwMC0weGZiZmZmZmZmXQpbICAgIDAuNDI2
NzQ2XSBwY2lfYnVzIDAwMDA6MDM6IHJlc291cmNlIDIgcHJlZiBtZW0gWzB4ZjYwMDAwMDAtMHhm
N2ZmZmZmZl0KWyAgICAwLjQyNjc4MV0gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAy
ClsgICAgMC40MjcxMTldIElQIHJvdXRlIGNhY2hlIGhhc2ggdGFibGUgZW50cmllczogNTI0Mjg4
IChvcmRlcjogMTAsIDQxOTQzMDQgYnl0ZXMpClsgICAgMC40MjkxNzVdIFRDUCBlc3RhYmxpc2hl
ZCBoYXNoIHRhYmxlIGVudHJpZXM6IDUyNDI4OCAob3JkZXI6IDExLCA4Mzg4NjA4IGJ5dGVzKQpb
ICAgIDAuNDMyMTI3XSBUQ1AgYmluZCBoYXNoIHRhYmxlIGVudHJpZXM6IDY1NTM2IChvcmRlcjog
OCwgMTA0ODU3NiBieXRlcykKWyAgICAwLjQzMjQ3OF0gVENQOiBIYXNoIHRhYmxlcyBjb25maWd1
cmVkIChlc3RhYmxpc2hlZCA1MjQyODggYmluZCA2NTUzNikKWyAgICAwLjQzMjQ4MV0gVENQIHJl
bm8gcmVnaXN0ZXJlZApbICAgIDAuNDMyNTgxXSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFt
aWx5IDEKWyAgICAwLjUxOTYzMF0gcGNpIDAwMDA6MDA6MDAuMDogRm91bmQgZW5hYmxlZCBIVCBN
U0kgTWFwcGluZwpbICAgIDAuNTE5Njc3XSBwY2kgMDAwMDowMDowMC4wOiBGb3VuZCBlbmFibGVk
IEhUIE1TSSBNYXBwaW5nClsgICAgMC41MTk3MjZdIHBjaSAwMDAwOjAwOjAwLjA6IEZvdW5kIGVu
YWJsZWQgSFQgTVNJIE1hcHBpbmcKWyAgICAwLjUxOTc3N10gcGNpIDAwMDA6MDA6MDAuMDogRm91
bmQgZW5hYmxlZCBIVCBNU0kgTWFwcGluZwpbICAgIDAuNTE5ODMyXSBwY2kgMDAwMDowMDowMC4w
OiBGb3VuZCBlbmFibGVkIEhUIE1TSSBNYXBwaW5nClsgICAgMC41MTk4ODldIHBjaSAwMDAwOjAw
OjAwLjA6IEZvdW5kIGVuYWJsZWQgSFQgTVNJIE1hcHBpbmcKWyAgICAwLjUxOTg5NF0gcGNpIDAw
MDA6MDA6MGQuMDogQm9vdCB2aWRlbyBkZXZpY2UKWyAgICAwLjUxOTk0OV0gVW5wYWNraW5nIGlu
aXRyYW1mcy4uLgpbICAgIDAuNzExOTI1XSBGcmVlaW5nIGluaXRyZCBtZW1vcnk6IDk5NjFrIGZy
ZWVkClsgICAgMC43MTYwNjldIFBDSS1ETUE6IERpc2FibGluZyBBR1AuClsgICAgMC43MTYxNzld
IFBDSS1ETUE6IGFwZXJ0dXJlIGJhc2UgQCAyMDAwMDAwMCBzaXplIDY1NTM2IEtCClsgICAgMC43
MTYxODBdIFBDSS1ETUE6IHVzaW5nIEdBUlQgSU9NTVUuClsgICAgMC43MTYxODRdIFBDSS1ETUE6
IFJlc2VydmluZyA2NE1CIG9mIElPTU1VIGFyZWEgaW4gdGhlIEFHUCBhcGVydHVyZQpbICAgIDAu
NzE3NzA5XSBhdWRpdDogaW5pdGlhbGl6aW5nIG5ldGxpbmsgc29ja2V0IChkaXNhYmxlZCkKWyAg
ICAwLjcxNzcyNV0gdHlwZT0yMDAwIGF1ZGl0KDEzMjUyNDU0MjguNzE1OjEpOiBpbml0aWFsaXpl
ZApbICAgIDAuNzIxMjExXSBIdWdlVExCIHJlZ2lzdGVyZWQgMiBNQiBwYWdlIHNpemUsIHByZS1h
bGxvY2F0ZWQgMCBwYWdlcwpbICAgIDAuNzIyNTg2XSBWRlM6IERpc2sgcXVvdGFzIGRxdW90XzYu
NS4yClsgICAgMC43MjI2NzldIERxdW90LWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogNTEyIChv
cmRlciAwLCA0MDk2IGJ5dGVzKQpbICAgIDAuNzIyNzUyXSBtc2dtbmkgaGFzIGJlZW4gc2V0IHRv
IDMyMTA3ClsgICAgMC43MjMwNzVdIGFsZzogTm8gdGVzdCBmb3Igc3Rkcm5nIChrcm5nKQpbICAg
IDAuNzIzMTQxXSBCbG9jayBsYXllciBTQ1NJIGdlbmVyaWMgKGJzZykgZHJpdmVyIHZlcnNpb24g
MC40IGxvYWRlZCAobWFqb3IgMjUzKQpbICAgIDAuNzIzMTQ1XSBpbyBzY2hlZHVsZXIgbm9vcCBy
ZWdpc3RlcmVkClsgICAgMC43MjMxNDZdIGlvIHNjaGVkdWxlciBhbnRpY2lwYXRvcnkgcmVnaXN0
ZXJlZApbICAgIDAuNzIzMTQ4XSBpbyBzY2hlZHVsZXIgZGVhZGxpbmUgcmVnaXN0ZXJlZApbICAg
IDAuNzIzMTk3XSBpbyBzY2hlZHVsZXIgY2ZxIHJlZ2lzdGVyZWQgKGRlZmF1bHQpClsgICAgMC43
MjMzNjddICAgYWxsb2MgaXJxX2Rlc2MgZm9yIDI0IG9uIG5vZGUgMApbICAgIDAuNzIzMzcwXSAg
IGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAwClsgICAgMC43MjMzNzldIHBjaWVwb3J0IDAwMDA6
MDA6MDkuMDogaXJxIDI0IGZvciBNU0kvTVNJLVgKWyAgICAwLjcyMzM4M10gcGNpZXBvcnQgMDAw
MDowMDowOS4wOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICAwLjcyMzU1N10gICBh
bGxvYyBpcnFfZGVzYyBmb3IgMjUgb24gbm9kZSAwClsgICAgMC43MjM1NThdICAgYWxsb2Mga3N0
YXRfaXJxcyBvbiBub2RlIDAKWyAgICAwLjcyMzU2M10gcGNpZXBvcnQgMDAwMDowMDowYi4wOiBp
cnEgMjUgZm9yIE1TSS9NU0ktWApbICAgIDAuNzIzNTY2XSBwY2llcG9ydCAwMDAwOjAwOjBiLjA6
IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApbICAgIDAuNzIzNjg4XSAgIGFsbG9jIGlycV9k
ZXNjIGZvciAyNiBvbiBub2RlIDAKWyAgICAwLjcyMzY5MF0gICBhbGxvYyBrc3RhdF9pcnFzIG9u
IG5vZGUgMApbICAgIDAuNzIzNjk1XSBwY2llcG9ydCAwMDAwOjAwOjBjLjA6IGlycSAyNiBmb3Ig
TVNJL01TSS1YClsgICAgMC43MjM2OThdIHBjaWVwb3J0IDAwMDA6MDA6MGMuMDogc2V0dGluZyBs
YXRlbmN5IHRpbWVyIHRvIDY0ClsgICAgMC43MjQ3NDVdIExpbnV4IGFncGdhcnQgaW50ZXJmYWNl
IHYwLjEwMwpbICAgIDAuNzI0Nzc2XSBTZXJpYWw6IDgyNTAvMTY1NTAgZHJpdmVyLCA0IHBvcnRz
LCBJUlEgc2hhcmluZyBlbmFibGVkClsgICAgMC43MjQ4NjBdIHNlcmlhbDgyNTA6IHR0eVMwIGF0
IEkvTyAweDNmOCAoaXJxID0gNCkgaXMgYSAxNjU1MEEKWyAgICAwLjcyNTExMF0gMDA6MDk6IHR0
eVMwIGF0IEkvTyAweDNmOCAoaXJxID0gNCkgaXMgYSAxNjU1MEEKWyAgICAwLjcyNTIyN10gaW5w
dXQ6IE1hY2ludG9zaCBtb3VzZSBidXR0b24gZW11bGF0aW9uIGFzIC9kZXZpY2VzL3ZpcnR1YWwv
aW5wdXQvaW5wdXQwClsgICAgMC43MjUyNjddIFBOUDogUFMvMiBDb250cm9sbGVyIFtQTlAwMzAz
OlBTMktdIGF0IDB4NjAsMHg2NCBpcnEgMQpbICAgIDAuNzI1MjY4XSBQTlA6IFBTLzIgYXBwZWFy
cyB0byBoYXZlIEFVWCBwb3J0IGRpc2FibGVkLCBpZiB0aGlzIGlzIGluY29ycmVjdCBwbGVhc2Ug
Ym9vdCB3aXRoIGk4MDQyLm5vcG5wClsgICAgMC43MjU3NjRdIHNlcmlvOiBpODA0MiBLQkQgcG9y
dCBhdCAweDYwLDB4NjQgaXJxIDEKWyAgICAwLjcyNTg1M10gbWljZTogUFMvMiBtb3VzZSBkZXZp
Y2UgY29tbW9uIGZvciBhbGwgbWljZQpbICAgIDAuNzI1ODkyXSBydGNfY21vcyAwMDowMjogUlRD
IGNhbiB3YWtlIGZyb20gUzQKWyAgICAwLjcyNTkyMV0gcnRjX2Ntb3MgMDA6MDI6IHJ0YyBjb3Jl
OiByZWdpc3RlcmVkIHJ0Y19jbW9zIGFzIHJ0YzAKWyAgICAwLjcyNTk1OF0gcnRjMDogYWxhcm1z
IHVwIHRvIG9uZSB5ZWFyLCB5M2ssIDExNCBieXRlcyBudnJhbSwgaHBldCBpcnFzClsgICAgMC43
MjU5NjZdIGNwdWlkbGU6IHVzaW5nIGdvdmVybm9yIGxhZGRlcgpbICAgIDAuNzI1OTY5XSBjcHVp
ZGxlOiB1c2luZyBnb3Zlcm5vciBtZW51ClsgICAgMC43MjU5NzNdIE5vIGlCRlQgZGV0ZWN0ZWQu
ClsgICAgMC43MjYyNThdIFRDUCBjdWJpYyByZWdpc3RlcmVkClsgICAgMC43MjYzNDVdIE5FVDog
UmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMTAKWyAgICAwLjcyNjk3OF0gTW9iaWxlIElQdjYK
WyAgICAwLjcyNjk4MF0gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAxNwpbICAgIDAu
NzI3MDU1XSBQTTogUmVzdW1lIGZyb20gZGlzayBmYWlsZWQuClsgICAgMC43MjcwNjRdIHJlZ2lz
dGVyZWQgdGFza3N0YXRzIHZlcnNpb24gMQpbICAgIDAuNzI3MzM5XSBydGNfY21vcyAwMDowMjog
c2V0dGluZyBzeXN0ZW0gY2xvY2sgdG8gMjAxMS0xMi0zMCAxMTo0Mzo0OSBVVEMgKDEzMjUyNDU0
MjkpClsgICAgMC43MjczNzhdIEluaXRhbGl6aW5nIG5ldHdvcmsgZHJvcCBtb25pdG9yIHNlcnZp
Y2UKWyAgICAwLjcyNzQwNV0gRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogNTk2ayBmcmVl
ZApbICAgIDAuNzI3NjAxXSBXcml0ZSBwcm90ZWN0aW5nIHRoZSBrZXJuZWwgcmVhZC1vbmx5IGRh
dGE6IDQyMjBrClsgICAgMC43NDU4NjRdIHVkZXZbOThdOiBzdGFydGluZyB2ZXJzaW9uIDE2NApb
ICAgIDAuNzUzOTMwXSBpbnB1dDogQVQgVHJhbnNsYXRlZCBTZXQgMiBrZXlib2FyZCBhcyAvZGV2
aWNlcy9wbGF0Zm9ybS9pODA0Mi9zZXJpbzAvaW5wdXQvaW5wdXQxClsgICAgMC43ODc3MjZdIHVz
YmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgdXNiZnMKWyAgICAwLjc4Nzc1
Ml0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBodWIKWyAgICAwLjc4
NzkzMl0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgZGV2aWNlIGRyaXZlciB1c2IKWyAgICAwLjc4
ODk1Nl0gZm9yY2VkZXRoOiBSZXZlcnNlIEVuZ2luZWVyZWQgbkZvcmNlIGV0aGVybmV0IGRyaXZl
ci4gVmVyc2lvbiAwLjY0LgpbICAgIDAuNzg5MjUwXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsg
W0xNQUNdIGVuYWJsZWQgYXQgSVJRIDIzClsgICAgMC43ODkyNTVdICAgYWxsb2MgaXJxX2Rlc2Mg
Zm9yIDIzIG9uIG5vZGUgMApbICAgIDAuNzg5MjU3XSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9k
ZSAwClsgICAgMC43ODkyNjldIGZvcmNlZGV0aCAwMDAwOjAwOjA3LjA6IFBDSSBJTlQgQSAtPiBM
aW5rW0xNQUNdIC0+IEdTSSAyMyAobGV2ZWwsIGxvdykgLT4gSVJRIDIzClsgICAgMC43ODkyNzNd
IGZvcmNlZGV0aCAwMDAwOjAwOjA3LjA6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApbICAg
IDAuNzkzNjE0XSBTQ1NJIHN1YnN5c3RlbSBpbml0aWFsaXplZApbICAgIDAuNzk0OTQ3XSBlaGNp
X2hjZDogVVNCIDIuMCAnRW5oYW5jZWQnIEhvc3QgQ29udHJvbGxlciAoRUhDSSkgRHJpdmVyClsg
ICAgMC43OTYyMDVdIDN3YXJlIDkwMDAgU3RvcmFnZSBDb250cm9sbGVyIGRldmljZSBkcml2ZXIg
Zm9yIExpbnV4IHYyLjI2LjAyLjAxMi4KWyAgICAwLjc5NjYzMl0gQUNQSTogUENJIEludGVycnVw
dCBMaW5rIFtMTkVCXSBlbmFibGVkIGF0IElSUSAxOQpbICAgIDAuNzk2NjM4XSAgIGFsbG9jIGly
cV9kZXNjIGZvciAxOSBvbiBub2RlIDAKWyAgICAwLjc5NjYzOV0gICBhbGxvYyBrc3RhdF9pcnFz
IG9uIG5vZGUgMApbICAgIDAuNzk2NjUwXSAzdy05eHh4IDAwMDA6MDM6MDAuMDogUENJIElOVCBB
IC0+IExpbmtbTE5FQl0gLT4gR1NJIDE5IChsZXZlbCwgbG93KSAtPiBJUlEgMTkKWyAgICAwLjc5
NjY1NV0gM3ctOXh4eCAwMDAwOjAzOjAwLjA6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApb
ICAgIDAuODUyNzQ1XSBmb3JjZWRldGggMDAwMDowMDowNy4wOiBpZm5hbWUgZXRoMCwgUEhZIE9V
SSAweDczMiBAIDMsIGFkZHIgMDA6MjU6MjI6NzM6NGI6Y2QKWyAgICAwLjg1Mjc0OV0gZm9yY2Vk
ZXRoIDAwMDA6MDA6MDcuMDogaGlnaGRtYSBwd3JjdGwgbWdtdCBnYml0IGxua3RpbSBtc2kgZGVz
Yy12MwpbICAgIDAuODUzMTY4XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xVQjJdIGVuYWJs
ZWQgYXQgSVJRIDIyClsgICAgMC44NTMxNzNdICAgYWxsb2MgaXJxX2Rlc2MgZm9yIDIyIG9uIG5v
ZGUgMApbICAgIDAuODUzMTc1XSAgIGFsbG9jIGtzdGF0X2lycXMgb24gbm9kZSAwClsgICAgMC44
NTMxODddIGVoY2lfaGNkIDAwMDA6MDA6MDIuMTogUENJIElOVCBCIC0+IExpbmtbTFVCMl0gLT4g
R1NJIDIyIChsZXZlbCwgbG93KSAtPiBJUlEgMjIKWyAgICAwLjg1MzIzN10gZWhjaV9oY2QgMDAw
MDowMDowMi4xOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAgICAwLjg1MzIzOV0gZWhj
aV9oY2QgMDAwMDowMDowMi4xOiBFSENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDAuODUzMjY4XSBl
aGNpX2hjZCAwMDAwOjAwOjAyLjE6IG5ldyBVU0IgYnVzIHJlZ2lzdGVyZWQsIGFzc2lnbmVkIGJ1
cyBudW1iZXIgMQpbICAgIDAuODUzMjk4XSBlaGNpX2hjZCAwMDAwOjAwOjAyLjE6IGRlYnVnIHBv
cnQgMQpbICAgIDAuODUzMzA2XSBlaGNpX2hjZCAwMDAwOjAwOjAyLjE6IGNhY2hlIGxpbmUgc2l6
ZSBvZiA2NCBpcyBub3Qgc3VwcG9ydGVkClsgICAgMC44NTMzMjVdIGVoY2lfaGNkIDAwMDA6MDA6
MDIuMTogaXJxIDIyLCBpbyBtZW0gMHhmYmVmZWMwMApbICAgIDAuODYzNTAxXSBlaGNpX2hjZCAw
MDAwOjAwOjAyLjE6IFVTQiAyLjAgc3RhcnRlZCwgRUhDSSAxLjAwClsgICAgMC44NjM1MzldIHVz
YiB1c2IxOiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9MWQ2YiwgaWRQcm9kdWN0PTAw
MDIKWyAgICAwLjg2MzU0Ml0gdXNiIHVzYjE6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0z
LCBQcm9kdWN0PTIsIFNlcmlhbE51bWJlcj0xClsgICAgMC44NjM1NDRdIHVzYiB1c2IxOiBQcm9k
dWN0OiBFSENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDAuODYzNTQ2XSB1c2IgdXNiMTogTWFudWZh
Y3R1cmVyOiBMaW51eCAyLjYuMzItNS1hbWQ2NCBlaGNpX2hjZApbICAgIDAuODYzNTQ3XSB1c2Ig
dXNiMTogU2VyaWFsTnVtYmVyOiAwMDAwOjAwOjAyLjEKWyAgICAwLjg2MzY0NV0gdXNiIHVzYjE6
IGNvbmZpZ3VyYXRpb24gIzEgY2hvc2VuIGZyb20gMSBjaG9pY2UKWyAgICAwLjg2MzY3MF0gaHVi
IDEtMDoxLjA6IFVTQiBodWIgZm91bmQKWyAgICAwLjg2MzY3OF0gaHViIDEtMDoxLjA6IDEwIHBv
cnRzIGRldGVjdGVkClsgICAgMC44ODg5MjFdIG9oY2lfaGNkOiBVU0IgMS4xICdPcGVuJyBIb3N0
IENvbnRyb2xsZXIgKE9IQ0kpIERyaXZlcgpbICAgIDAuODg5MzI0XSBBQ1BJOiBQQ0kgSW50ZXJy
dXB0IExpbmsgW0xVQjBdIGVuYWJsZWQgYXQgSVJRIDIxClsgICAgMC44ODkzMzBdICAgYWxsb2Mg
aXJxX2Rlc2MgZm9yIDIxIG9uIG5vZGUgMApbICAgIDAuODg5MzMxXSAgIGFsbG9jIGtzdGF0X2ly
cXMgb24gbm9kZSAwClsgICAgMC44ODkzNDJdIG9oY2lfaGNkIDAwMDA6MDA6MDIuMDogUENJIElO
VCBBIC0+IExpbmtbTFVCMF0gLT4gR1NJIDIxIChsZXZlbCwgbG93KSAtPiBJUlEgMjEKWyAgICAw
Ljg4OTM5N10gb2hjaV9oY2QgMDAwMDowMDowMi4wOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8g
NjQKWyAgICAwLjg4OTQwMF0gb2hjaV9oY2QgMDAwMDowMDowMi4wOiBPSENJIEhvc3QgQ29udHJv
bGxlcgpbICAgIDAuODg5NDE5XSBvaGNpX2hjZCAwMDAwOjAwOjAyLjA6IG5ldyBVU0IgYnVzIHJl
Z2lzdGVyZWQsIGFzc2lnbmVkIGJ1cyBudW1iZXIgMgpbICAgIDAuODg5NDQ5XSBvaGNpX2hjZCAw
MDAwOjAwOjAyLjA6IGlycSAyMSwgaW8gbWVtIDB4ZmJlZmYwMDAKWyAgICAwLjk0NTQ5OV0gdXNi
IHVzYjI6IE5ldyBVU0IgZGV2aWNlIGZvdW5kLCBpZFZlbmRvcj0xZDZiLCBpZFByb2R1Y3Q9MDAw
MQpbICAgIDAuOTQ1NTAyXSB1c2IgdXNiMjogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPTMs
IFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTEKWyAgICAwLjk0NTUwNF0gdXNiIHVzYjI6IFByb2R1
Y3Q6IE9IQ0kgSG9zdCBDb250cm9sbGVyClsgICAgMC45NDU1MDZdIHVzYiB1c2IyOiBNYW51ZmFj
dHVyZXI6IExpbnV4IDIuNi4zMi01LWFtZDY0IG9oY2lfaGNkClsgICAgMC45NDU1MDddIHVzYiB1
c2IyOiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MDIuMApbICAgIDAuOTQ1NjAyXSB1c2IgdXNiMjog
Y29uZmlndXJhdGlvbiAjMSBjaG9zZW4gZnJvbSAxIGNob2ljZQpbICAgIDAuOTQ1NjI5XSBodWIg
Mi0wOjEuMDogVVNCIGh1YiBmb3VuZApbICAgIDAuOTQ1NjM5XSBodWIgMi0wOjEuMDogMTAgcG9y
dHMgZGV0ZWN0ZWQKWyAgICAxLjAxOTQ4NV0gc2NzaTAgOiAzd2FyZSA5MDAwIFN0b3JhZ2UgQ29u
dHJvbGxlcgpbICAgIDEuMDE5NTkyXSAzdy05eHh4OiBzY3NpMDogRm91bmQgYSAzd2FyZSA5MDAw
IFN0b3JhZ2UgQ29udHJvbGxlciBhdCAweGZiZmZmMDAwLCBJUlE6IDE5LgpbICAgIDEuMTYwMDM2
XSB1c2IgMS0yOiBuZXcgaGlnaCBzcGVlZCBVU0IgZGV2aWNlIHVzaW5nIGVoY2lfaGNkIGFuZCBh
ZGRyZXNzIDIKWyAgICAxLjI5MjQ2NV0gdXNiIDEtMjogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlk
VmVuZG9yPTA0MDksIGlkUHJvZHVjdD0wMDVhClsgICAgMS4yOTI0NjldIHVzYiAxLTI6IE5ldyBV
U0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0wLCBQcm9kdWN0PTAsIFNlcmlhbE51bWJlcj0wClsgICAg
MS4yOTI1NjJdIHVzYiAxLTI6IGNvbmZpZ3VyYXRpb24gIzEgY2hvc2VuIGZyb20gMSBjaG9pY2UK
WyAgICAxLjI5Mjc3NV0gaHViIDEtMjoxLjA6IFVTQiBodWIgZm91bmQKWyAgICAxLjI5Mjk2Ml0g
aHViIDEtMjoxLjA6IDQgcG9ydHMgZGV0ZWN0ZWQKWyAgICAxLjM0NDAzNl0gM3ctOXh4eDogc2Nz
aTA6IEZpcm13YXJlIEZFOVggNC4wOC4wMC4wMDYsIEJJT1MgQkU5WCA0LjA4LjAwLjAwMSwgUG9y
dHM6IDIuClsgICAgMS4zNDQ2MDFdIHNjc2kgMDowOjA6MDogRGlyZWN0LUFjY2VzcyAgICAgQU1D
QyAgICAgOTY1MFNFLTJMUCBESVNLICA0LjA4IFBROiAwIEFOU0k6IDUKWyAgICAxLjM1OTI0MF0g
c2QgMDowOjA6MDogW3NkYV0gMTk1MzEwMzg3MiA1MTItYnl0ZSBsb2dpY2FsIGJsb2NrczogKDk5
OSBHQi85MzEgR2lCKQpbICAgIDEuMzU5ODYwXSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBQcm90
ZWN0IGlzIG9mZgpbICAgIDEuMzU5ODY0XSBzZCAwOjA6MDowOiBbc2RhXSBNb2RlIFNlbnNlOiAy
MyAwMCAwMCAwMApbICAgIDEuMzYwMjc2XSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBjYWNoZTog
ZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUEK
WyAgICAxLjM2MTg4N10gIHNkYTogc2RhMSBzZGEyIHNkYTMKWyAgICAxLjM4NjgzNl0gc2QgMDow
OjA6MDogW3NkYV0gQXR0YWNoZWQgU0NTSSBkaXNrClsgICAgMS41NDI0NzddIGRldmljZS1tYXBw
ZXI6IHVldmVudDogdmVyc2lvbiAxLjAuMwpbICAgIDEuNTQyNjI5XSBkZXZpY2UtbWFwcGVyOiBp
b2N0bDogNC4xNS4wLWlvY3RsICgyMDA5LTA0LTAxKSBpbml0aWFsaXNlZDogZG0tZGV2ZWxAcmVk
aGF0LmNvbQpbICAgIDEuNTgxMTkxXSB1c2IgMS0yLjE6IG5ldyBoaWdoIHNwZWVkIFVTQiBkZXZp
Y2UgdXNpbmcgZWhjaV9oY2QgYW5kIGFkZHJlc3MgMwpbICAgIDEuNjIwNDcwXSBram91cm5hbGQg
c3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgNSBzZWNvbmRzClsgICAgMS42MjA0ODRdIEVYVDMt
ZnM6IG1vdW50ZWQgZmlsZXN5c3RlbSB3aXRoIG9yZGVyZWQgZGF0YSBtb2RlLgpbICAgIDEuNjkw
MDUxXSB1c2IgMS0yLjE6IE5ldyBVU0IgZGV2aWNlIGZvdW5kLCBpZFZlbmRvcj0xNGRkLCBpZFBy
b2R1Y3Q9MDAwMgpbICAgIDEuNjkwMDU0XSB1c2IgMS0yLjE6IE5ldyBVU0IgZGV2aWNlIHN0cmlu
Z3M6IE1mcj0xLCBQcm9kdWN0PTIsIFNlcmlhbE51bWJlcj0zClsgICAgMS42OTAwNTddIHVzYiAx
LTIuMTogUHJvZHVjdDogTXVsdGlkZXZpY2UKWyAgICAxLjY5MDA1OF0gdXNiIDEtMi4xOiBNYW51
ZmFjdHVyZXI6IFBlcHBlcmNvbiBBRwpbICAgIDEuNjkwMDYwXSB1c2IgMS0yLjE6IFNlcmlhbE51
bWJlcjogODczQjQ5RTE0QzI2NTBGNzkxMTI3NUFEM0UxNDJCMTEKWyAgICAxLjY5MDE0N10gdXNi
IDEtMi4xOiBjb25maWd1cmF0aW9uICMxIGNob3NlbiBmcm9tIDEgY2hvaWNlClsgICAgMi41NTU3
NDVdIHVkZXZbMzc0XTogc3RhcnRpbmcgdmVyc2lvbiAxNjQKWyAgICAyLjgzMjY3NV0gaTJjIGky
Yy0wOiBuRm9yY2UyIFNNQnVzIGFkYXB0ZXIgYXQgMHg2MDAKWyAgICAyLjgzMjY5MF0gaTJjIGky
Yy0xOiBuRm9yY2UyIFNNQnVzIGFkYXB0ZXIgYXQgMHg3MDAKWyAgICAyLjgzMjk4NV0gaW5wdXQ6
IFBDIFNwZWFrZXIgYXMgL2RldmljZXMvcGxhdGZvcm0vcGNzcGtyL2lucHV0L2lucHV0MgpbICAg
IDIuODQzNDY5XSBpbnB1dDogUG93ZXIgQnV0dG9uIGFzIC9kZXZpY2VzL0xOWFNZU1RNOjAwL0xO
WFNZQlVTOjAwL1BOUDBDMEM6MDAvaW5wdXQvaW5wdXQzClsgICAgMi44NDM1MjBdIEFDUEk6IFBv
d2VyIEJ1dHRvbiBbUFdSQl0KWyAgICAyLjg0MzU4M10gaW5wdXQ6IFBvd2VyIEJ1dHRvbiBhcyAv
ZGV2aWNlcy9MTlhTWVNUTTowMC9MTlhQV1JCTjowMC9pbnB1dC9pbnB1dDQKWyAgICAyLjg0MzYx
M10gQUNQSTogUG93ZXIgQnV0dG9uIFtQV1JGXQpbICAgIDIuOTg1MTY1XSBwcm9jZXNzb3IgTE5Y
Q1BVOjAwOiByZWdpc3RlcmVkIGFzIGNvb2xpbmdfZGV2aWNlMApbICAgIDIuOTg1MjAwXSBwcm9j
ZXNzb3IgTE5YQ1BVOjAxOiByZWdpc3RlcmVkIGFzIGNvb2xpbmdfZGV2aWNlMQpbICAgIDIuOTg1
MjMwXSBwcm9jZXNzb3IgTE5YQ1BVOjAyOiByZWdpc3RlcmVkIGFzIGNvb2xpbmdfZGV2aWNlMgpb
ICAgIDIuOTg1MjY1XSBwcm9jZXNzb3IgTE5YQ1BVOjAzOiByZWdpc3RlcmVkIGFzIGNvb2xpbmdf
ZGV2aWNlMwpbICAgIDMuMjU4NDY1XSBbZHJtXSBJbml0aWFsaXplZCBkcm0gMS4xLjAgMjAwNjA4
MTAKWyAgICAzLjI2NzEyNF0gSW5pdGlhbGl6aW5nIFVTQiBNYXNzIFN0b3JhZ2UgZHJpdmVyLi4u
ClsgICAgMy4yNjczMjNdIHNjc2kxIDogU0NTSSBlbXVsYXRpb24gZm9yIFVTQiBNYXNzIFN0b3Jh
Z2UgZGV2aWNlcwpbICAgIDMuMjY3NDA2XSB1c2Itc3RvcmFnZTogZGV2aWNlIGZvdW5kIGF0IDMK
WyAgICAzLjI2NzQwOF0gdXNiLXN0b3JhZ2U6IHdhaXRpbmcgZm9yIGRldmljZSB0byBzZXR0bGUg
YmVmb3JlIHNjYW5uaW5nClsgICAgMy4yNjc0NDddIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGlu
dGVyZmFjZSBkcml2ZXIgdXNiLXN0b3JhZ2UKWyAgICAzLjI2NzQ1MV0gVVNCIE1hc3MgU3RvcmFn
ZSBzdXBwb3J0IHJlZ2lzdGVyZWQuClsgICAgMy4yOTEyMzFdIEVEQUMgTUM6IFZlcjogMi4xLjAg
RGVjIDIzIDIwMTEKWyAgICAzLjI5MjU4MV0gRXJyb3I6IERyaXZlciAncGNzcGtyJyBpcyBhbHJl
YWR5IHJlZ2lzdGVyZWQsIGFib3J0aW5nLi4uClsgICAgMy4zMDkzNzhdIHVzYmNvcmU6IHJlZ2lz
dGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgaGlkZGV2ClsgICAgMy4zMTAzMTRdIGlucHV0OiBQ
ZXBwZXJjb24gQUcgTXVsdGlkZXZpY2UgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAy
LjEvdXNiMS8xLTIvMS0yLjEvMS0yLjE6MS4xL2lucHV0L2lucHV0NQpbICAgIDMuMzEwMzk1XSBn
ZW5lcmljLXVzYiAwMDAzOjE0REQ6MDAwMi4wMDAxOiBpbnB1dCxoaWRyYXcwOiBVU0IgSElEIHYx
LjAxIEtleWJvYXJkIFtQZXBwZXJjb24gQUcgTXVsdGlkZXZpY2VdIG9uIHVzYi0wMDAwOjAwOjAy
LjEtMi4xL2lucHV0MQpbICAgIDMuMzExMzMyXSBpbnB1dDogUGVwcGVyY29uIEFHIE11bHRpZGV2
aWNlIGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowMi4xL3VzYjEvMS0yLzEtMi4xLzEt
Mi4xOjEuMi9pbnB1dC9pbnB1dDYKWyAgICAzLjMxMTQxNl0gZ2VuZXJpYy11c2IgMDAwMzoxNERE
OjAwMDIuMDAwMjogaW5wdXQsaGlkcmF3MTogVVNCIEhJRCB2MS4wMSBNb3VzZSBbUGVwcGVyY29u
IEFHIE11bHRpZGV2aWNlXSBvbiB1c2ItMDAwMDowMDowMi4xLTIuMS9pbnB1dDIKWyAgICAzLjMx
MTQ0Ml0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciB1c2JoaWQKWyAg
ICAzLjMxMTQ0NV0gdXNiaGlkOiB2Mi42OlVTQiBISUQgY29yZSBkcml2ZXIKWyAgICAzLjM1Mzk4
OV0gcGFycG9ydF9wYyAwMDowNTogcmVwb3J0ZWQgYnkgUGx1ZyBhbmQgUGxheSBBQ1BJClsgICAg
My4zNTQwNDJdIHBhcnBvcnQwOiBQQy1zdHlsZSBhdCAweDM3OCAoMHg3NzgpLCBpcnEgNyBbUENT
UFAsVFJJU1RBVEVdClsgICAgMy4zNTUxNzVdIEVEQUMgYW1kNjRfZWRhYzogIFZlcjogMy4yLjAg
RGVjIDIzIDIwMTEKWyAgICAzLjM1NTMwNF0gRURBQyBhbWQ2NDogVGhpcyBub2RlIHJlcG9ydHMg
dGhhdCBNZW1vcnkgRUNDIGlzIGN1cnJlbnRseSBkaXNhYmxlZCwgc2V0IEYzeDQ0WzIyXSAoMDAw
MDowMDoxOC4zKS4KWyAgICAzLjM1NTMyMV0gRURBQyBhbWQ2NDogRUNDIGRpc2FibGVkIGluIHRo
ZSBCSU9TIG9yIG5vIEVDQyBjYXBhYmlsaXR5LCBtb2R1bGUgd2lsbCBub3QgbG9hZC4KWyAgICAz
LjM1NTMyMl0gIEVpdGhlciBlbmFibGUgRUNDIGNoZWNraW5nIG9yIGZvcmNlIG1vZHVsZSBsb2Fk
aW5nIGJ5IHNldHRpbmcgJ2VjY19lbmFibGVfb3ZlcnJpZGUnLgpbICAgIDMuMzU1MzI0XSAgKE5v
dGUgdGhhdCB1c2Ugb2YgdGhlIG92ZXJyaWRlIG1heSBjYXVzZSB1bmtub3duIHNpZGUgZWZmZWN0
cy4pClsgICAgMy4zNTUzNTRdIGFtZDY0X2VkYWM6IHByb2JlIG9mIDAwMDA6MDA6MTguMiBmYWls
ZWQgd2l0aCBlcnJvciAtMjIKWyAgICAzLjM2Mzg3NV0gQUNQSTogUENJIEludGVycnVwdCBMaW5r
IFtMQVpBXSBlbmFibGVkIGF0IElSUSAyMApbICAgIDMuMzYzODgxXSAgIGFsbG9jIGlycV9kZXNj
IGZvciAyMCBvbiBub2RlIDAKWyAgICAzLjM2Mzg4NF0gICBhbGxvYyBrc3RhdF9pcnFzIG9uIG5v
ZGUgMApbICAgIDMuMzYzODk1XSBIREEgSW50ZWwgMDAwMDowMDowNS4wOiBQQ0kgSU5UIEIgLT4g
TGlua1tMQVpBXSAtPiBHU0kgMjAgKGxldmVsLCBsb3cpIC0+IElSUSAyMApbICAgIDMuMzYzODk4
XSBoZGFfaW50ZWw6IERpc2FibGUgTVNJIGZvciBOdmlkaWEgY2hpcHNldApbICAgIDMuMzY0MDIy
XSBIREEgSW50ZWwgMDAwMDowMDowNS4wOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQKWyAg
ICA0LjMzMjc1Nl0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTUM5XSBlbmFibGVkIGF0IElS
USAyMwpbICAgIDQuMzMyNzYzXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogUENJIElOVCBBIC0+IExp
bmtbTE1DOV0gLT4gR1NJIDIzIChsZXZlbCwgbG93KSAtPiBJUlEgMjMKWyAgICA0LjMzMjc2N10g
bm91dmVhdSAwMDAwOjAwOjBkLjA6IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NApbICAgIDQu
MzM1MDc2XSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogZmFpbGVkIHRvIGV2YWx1YXRlIF9E
U006IDUKWyAgICA0LjMzNTc5MV0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IERldGVjdGVk
IGFuIE5WNDAgZ2VuZXJhdGlvbiBjYXJkICgweDA0YzAwMGEyKQpbICAgIDQuMzM2Mjk1XSBbZHJt
XSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogQXR0ZW1wdGluZyB0byBsb2FkIEJJT1MgaW1hZ2UgZnJv
bSBQUk9NClsgICAgNC4zMzYyOThdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiAuLi4gQklP
UyBzaWduYXR1cmUgbm90IGZvdW5kClsgICAgNC4zMzYzMDBdIFtkcm1dIG5vdXZlYXUgMDAwMDow
MDowZC4wOiBBdHRlbXB0aW5nIHRvIGxvYWQgQklPUyBpbWFnZSBmcm9tIFBSQU1JTgpbICAgIDQu
Mzc3NDQyXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogLi4uIGFwcGVhcnMgdG8gYmUgdmFs
aWQKWyAgICA0LjM3NzQ0NV0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IEJJVCBCSU9TIGZv
dW5kClsgICAgNC4zNzc0NDddIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBCaW9zIHZlcnNp
b24gMDUuNjEuMzIuMjgKWyAgICA0LjM3NzQ1MF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6
IEJJVCB0YWJsZSAnZCcgbm90IGZvdW5kClsgICAgNC4zNzc0NTJdIFtkcm1dIG5vdXZlYXUgMDAw
MDowMDowZC4wOiBGb3VuZCBEaXNwbGF5IENvbmZpZ3VyYXRpb24gQmxvY2sgdmVyc2lvbiAzLjAK
WyAgICA0LjM3NzQ1NV0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IERDQiBjb25uZWN0b3Ig
dGFibGU6IFZIRVIgMHgzMCA1IDEwIDIKWyAgICA0LjM3NzQ1OF0gW2RybV0gbm91dmVhdSAwMDAw
OjAwOjBkLjA6ICAgMDogMHgwMDAwMDAwMDogdHlwZSAweDAwIGlkeCAwIHRhZyAweGZmClsgICAg
NC4zNzc0NjBdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiAgIDE6IDB4MDAwMDExMzE6IHR5
cGUgMHgzMSBpZHggMSB0YWcgMHgwNwpbICAgIDQuMzc3NDYzXSBbZHJtXSBub3V2ZWF1IDAwMDA6
MDA6MGQuMDogICAyOiAweDAwMDAwMTEwOiB0eXBlIDB4MTAgaWR4IDEgdGFnIDB4ZmYKWyAgICA0
LjM3NzQ2NV0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6ICAgMzogMHgwMDAwMDExMTogdHlw
ZSAweDExIGlkeCAxIHRhZyAweGZmClsgICAgNC4zNzc0NjddIFtkcm1dIG5vdXZlYXUgMDAwMDow
MDowZC4wOiAgIDQ6IDB4MDAwMDAxMTM6IHR5cGUgMHgxMyBpZHggMSB0YWcgMHhmZgpbICAgIDQu
Mzc3NDcwXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogUmF3IERDQiBlbnRyeSAwOiAwMTAw
MDMxMCAwMDAwMDAyMwpbICAgIDQuMzc3NDcyXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDog
UmF3IERDQiBlbnRyeSAxOiAwMDExMDIwNCA5NDJiMDAwMwpbICAgIDQuMzc3NDc3XSBbZHJtXSBu
b3V2ZWF1IDAwMDA6MDA6MGQuMDogUGFyc2luZyBWQklPUyBpbml0IHRhYmxlIDAgYXQgb2Zmc2V0
IDB4RDlDOQpbICAgIDQuMzc3NDgwXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogPT09PT09
PSBtaXNhbGlnbmVkIHJlZyAweDAwNjAwODFEID09PT09PT0KWyAgICA0LjM3NzUxM10gW2RybV0g
bm91dmVhdSAwMDAwOjAwOjBkLjA6ID09PT09PT0gbWlzYWxpZ25lZCByZWcgMHgwMDYwMDgxRCA9
PT09PT09ClsgICAgNC4zNzc1OTZdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBQYXJzaW5n
IFZCSU9TIGluaXQgdGFibGUgMSBhdCBvZmZzZXQgMHhEQjE3ClsgICAgNC4zNzc1OThdIFtkcm1d
IG5vdXZlYXUgMDAwMDowMDowZC4wOiBQYXJzaW5nIFZCSU9TIGluaXQgdGFibGUgMiBhdCBvZmZz
ZXQgMHhEQjE4ClsgICAgNC4zNzc2NTVdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBQYXJz
aW5nIFZCSU9TIGluaXQgdGFibGUgMyBhdCBvZmZzZXQgMHhEQzlBClsgICAgNC4zNzc2NTldIFtk
cm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBQYXJzaW5nIFZCSU9TIGluaXQgdGFibGUgNCBhdCBv
ZmZzZXQgMHhEQ0UzClsgICAgNC4zODQyNzBdIFtUVE1dIFpvbmUgIGtlcm5lbDogQXZhaWxhYmxl
IGdyYXBoaWNzIG1lbW9yeTogODIxOTg4MCBraUIuClsgICAgNC4zODQyNzJdIFtUVE1dIFpvbmUg
ICBkbWEzMjogQXZhaWxhYmxlIGdyYXBoaWNzIG1lbW9yeTogMjA5NzE1MiBraUIuClsgICAgNC4z
ODQyODRdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiAxNiBNaUIgVlJBTQpbICAgIDQuMzg1
MjA0XSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogNjQgTWlCIEdBUlQgKGFwZXJ0dXJlKQpb
ICAgIDQuMzg1NTUyXSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogQWxsb2NhdGluZyBGSUZP
IG51bWJlciAwClsgICAgNC4zODU4NDhdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBub3V2
ZWF1X2NoYW5uZWxfYWxsb2M6IGluaXRpYWxpc2VkIEZJRk8gMApbICAgIDQuMzg1ODU3XSBbZHJt
XSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogSW5pdGlhbCBDUlRDX09XTkVSIGlzIDAKWyAgICA0LjM4
NTg2MV0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IFNhdmluZyBWR0EgZm9udHMKWyAgICA0
LjQyMzcyOV0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IERDQiB0eXBlIDQgbm90IGtub3du
ClsgICAgNC40MjM3MzJdIFtkcm1dIG5vdXZlYXUgMDAwMDowMDowZC4wOiBEZXRlY3RlZCBhIFZH
QSBjb25uZWN0b3IKWyAgICA0LjQyNDgwNF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IFNl
dHRpbmcgZHBtcyBtb2RlIDMgb24gdmdhIGVuY29kZXIgKG91dHB1dCAwKQpbICAgIDQuNDc2MDM1
XSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogTG9hZCBkZXRlY3RlZCBvbiBvdXRwdXQgQQpb
ICAgIDQuNDc2MjI1XSBbZHJtXSBub3V2ZWF1IDAwMDA6MDA6MGQuMDogYWxsb2NhdGVkIDEwMjR4
NzY4IGZiOiAweDQ5MDAwLCBibyBmZmZmODgwNDFjZjkzNjAwClsgICAgNC41NDYzMTZdIFtkcm1d
IG5vdXZlYXUgMDAwMDowMDowZC4wOiBTZXR0aW5nIGRwbXMgbW9kZSAwIG9uIHZnYSBlbmNvZGVy
IChvdXRwdXQgMCkKWyAgICA0LjU0NjMyMF0gW2RybV0gbm91dmVhdSAwMDAwOjAwOjBkLjA6IE91
dHB1dCBWR0EtMSBpcyBydW5uaW5nIG9uIENSVEMgMCB1c2luZyBvdXRwdXQgQQpbICAgIDQuNTQ4
NzE2XSBDb25zb2xlOiBzd2l0Y2hpbmcgdG8gY29sb3VyIGZyYW1lIGJ1ZmZlciBkZXZpY2UgMTI4
eDQ4ClsgICAgNC41NTMwMjRdIGZiMDogbm91dmVhdWZiIGZyYW1lIGJ1ZmZlciBkZXZpY2UKWyAg
ICA0LjU1MzAyNV0gcmVnaXN0ZXJlZCBwYW5pYyBub3RpZmllcgpbICAgIDQuNTUzMDMwXSBbZHJt
XSBJbml0aWFsaXplZCBub3V2ZWF1IDAuMC4xNSAyMDA5MDQyMCBmb3IgMDAwMDowMDowZC4wIG9u
IG1pbm9yIDAKWyAgICA0Ljk5MzgwMF0gQWRkaW5nIDEyODUxMmsgc3dhcCBvbiAvZGV2L3NkYTIu
ICBQcmlvcml0eTotMSBleHRlbnRzOjEgYWNyb3NzOjEyODUxMmsgClsgICAgNS4xNDM1MDldIEVY
VDMgRlMgb24gZG0tMCwgaW50ZXJuYWwgam91cm5hbApbICAgIDUuMzI4NjYxXSBsb29wOiBtb2R1
bGUgbG9hZGVkClsgICAgNS40NjY1NzBdIFhFTkZTOiBub3QgcmVnaXN0ZXJpbmcgZmlsZXN5c3Rl
bSBvbiBub24teGVuIHBsYXRmb3JtClsgICAgOC4yNjQzMDRdIHVzYi1zdG9yYWdlOiBkZXZpY2Ug
c2NhbiBjb21wbGV0ZQpbICAgIDguMjY0OTc4XSBzY3NpIDE6MDowOjA6IENELVJPTSAgICAgICAg
ICAgIFBlcHBlckMgIFZpcnR1YWwgRGlzYyAxICAgMC4wMSBQUTogMCBBTlNJOiAzClsgICAgOC4y
NzY5OTVdIHNyMDogc2NzaS0xIGRyaXZlClsgICAgOC4yNzcwMDBdIFVuaWZvcm0gQ0QtUk9NIGRy
aXZlciBSZXZpc2lvbjogMy4yMApbICAgIDguMjc3MTczXSBzciAxOjA6MDowOiBBdHRhY2hlZCBz
Y3NpIENELVJPTSBzcjAKWyAgICA4LjM1NDkzOF0gc2QgMDowOjA6MDogQXR0YWNoZWQgc2NzaSBn
ZW5lcmljIHNnMCB0eXBlIDAKWyAgICA4LjM1NDk3NF0gc3IgMTowOjA6MDogQXR0YWNoZWQgc2Nz
aSBnZW5lcmljIHNnMSB0eXBlIDUKWyAgICA5LjMxNTA0Nl0ga2pvdXJuYWxkIHN0YXJ0aW5nLiAg
Q29tbWl0IGludGVydmFsIDUgc2Vjb25kcwpbICAgIDkuMzE1MjIwXSBFWFQzIEZTIG9uIHNkYTEs
IGludGVybmFsIGpvdXJuYWwKWyAgICA5LjMxNTIyN10gRVhUMy1mczogbW91bnRlZCBmaWxlc3lz
dGVtIHdpdGggb3JkZXJlZCBkYXRhIG1vZGUuClsgICAgOS4zMzA2NjhdIGtqb3VybmFsZCBzdGFy
dGluZy4gIENvbW1pdCBpbnRlcnZhbCA1IHNlY29uZHMKWyAgICA5LjMzMDY4MV0gRVhUMy1mcyB3
YXJuaW5nOiBjaGVja3RpbWUgcmVhY2hlZCwgcnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQK
WyAgICA5LjMzMDg3MV0gRVhUMyBGUyBvbiBkbS0yLCBpbnRlcm5hbCBqb3VybmFsClsgICAgOS4z
MzA4NzddIEVYVDMtZnM6IG1vdW50ZWQgZmlsZXN5c3RlbSB3aXRoIG9yZGVyZWQgZGF0YSBtb2Rl
LgpbICAgIDkuMzc0NDMxXSBram91cm5hbGQgc3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgNSBz
ZWNvbmRzClsgICAgOS4zNzQ0NDNdIEVYVDMtZnMgd2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQs
IHJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkClsgICAgOS4zNzQ2MzddIEVYVDMgRlMgb24g
ZG0tMTMsIGludGVybmFsIGpvdXJuYWwKWyAgICA5LjM3NDY0M10gRVhUMy1mczogbW91bnRlZCBm
aWxlc3lzdGVtIHdpdGggb3JkZXJlZCBkYXRhIG1vZGUuClsgICAgOS40MTI1OTFdIGtqb3VybmFs
ZCBzdGFydGluZy4gIENvbW1pdCBpbnRlcnZhbCA1IHNlY29uZHMKWyAgICA5LjQxMjYwNF0gRVhU
My1mcyB3YXJuaW5nOiBjaGVja3RpbWUgcmVhY2hlZCwgcnVubmluZyBlMmZzY2sgaXMgcmVjb21t
ZW5kZWQKWyAgICA5LjQxMjgwMF0gRVhUMyBGUyBvbiBkbS02LCBpbnRlcm5hbCBqb3VybmFsClsg
ICAgOS40MTI4MDVdIEVYVDMtZnM6IG1vdW50ZWQgZmlsZXN5c3RlbSB3aXRoIG9yZGVyZWQgZGF0
YSBtb2RlLgpbICAgIDkuNTAzMjg1XSBJU08gOTY2MCBFeHRlbnNpb25zOiBNaWNyb3NvZnQgSm9s
aWV0IExldmVsIDMKWyAgICA5LjUyMTYwNl0gSVNPIDk2NjAgRXh0ZW5zaW9uczogUlJJUF8xOTkx
QQpbICAgMTAuMTcxMDE3XSAgIGFsbG9jIGlycV9kZXNjIGZvciAyNyBvbiBub2RlIDAKWyAgIDEw
LjE3MTAyMV0gICBhbGxvYyBrc3RhdF9pcnFzIG9uIG5vZGUgMApbICAgMTAuMTcxMDMxXSBmb3Jj
ZWRldGggMDAwMDowMDowNy4wOiBpcnEgMjcgZm9yIE1TSS9NU0ktWAo=
--0022158c0eed3d9c4704b54d7560
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users
--0022158c0eed3d9c4704b54d7560--


From xen-arm-bounces@lists.xensource.com Sat Dec 31 10:50:33 2011
Return-path: <xen-arm-bounces@lists.xensource.com>
Envelope-to: archives@lists.xen.org
Delivery-date: Sat, 31 Dec 2011 10:50:33 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <xen-arm-bounces@lists.xensource.com>)
	id 1RgwW9-0001U4-MZ; Sat, 31 Dec 2011 10:50:25 +0000
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <post4pavan@gmail.com>) id 1RgwW7-0001TV-9c
	for xen-arm@lists.xensource.com; Sat, 31 Dec 2011 10:50:24 +0000
X-Env-Sender: post4pavan@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1325328611!9125547!1
X-Originating-IP: [209.85.210.171]
X-SpamReason: No, hits=1.4 required=7.0 tests=BODY_RANDOM_LONG,
	HTML_40_50, HTML_MESSAGE, ML_RADAR_SPEW_LINKS_14, RCVD_BY_IP,
	spamassassin: 
X-StarScan-Version: 6.4.3; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18396 invoked from network); 31 Dec 2011 10:50:12 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Dec 2011 10:50:12 -0000
Received: by iagw33 with SMTP id w33so124371502iag.30
	for <xen-arm@lists.xensource.com>; Sat, 31 Dec 2011 02:50:10 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:date:message-id:subject:from:to:content-type;
	bh=+rZ3NfVKd1zModzcBuJUqvOL+4l79bmSkecbJeeOI+M=;
	b=VdchVCyaub5YUPEy+AgFL6dLhh+QRJ7r5jnXdcw/1LLL/JuUygQVvKmpSkosx8hKbj
	f3aQDh5eCyuSTwg/VVuHteoWff9Ouei8taKWxuK6jChvQ16GPRO6akXUaTXSaSt7QvHY
	xtmNtYS6KC7KtF8v1pMd8lgVAyd1vy0jyqAGQ=
MIME-Version: 1.0
Received: by 10.50.168.2 with SMTP id zs2mr49480858igb.9.1325328610814; Sat,
	31 Dec 2011 02:50:10 -0800 (PST)
Received: by 10.43.132.202 with HTTP; Sat, 31 Dec 2011 02:50:10 -0800 (PST)
Date: Sat, 31 Dec 2011 16:20:10 +0530
Message-ID: <CAOZ3Y4NawG0YOdz5f85NLqOB0_4+Obs1JCq8AgEjZrPVSKZa8Q@mail.gmail.com>
From: Krishna Pavan <post4pavan@gmail.com>
To: Xen <xen-arm@lists.xensource.com>
Content-Type: multipart/mixed; boundary=e89a8f83a53f0eebee04b5611dd4
Subject: [XenARM] Integration of Compiled Xen-ARM :: tools / linux images
X-BeenThere: xen-arm@lists.xensource.com
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Xen ARM development <xen-arm.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/options/xen-arm>,
	<mailto:xen-arm-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-arm@lists.xensource.com>
List-Help: <mailto:xen-arm-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-arm>,
	<mailto:xen-arm-request@lists.xensource.com?subject=subscribe>
Sender: xen-arm-bounces@lists.xensource.com
Errors-To: xen-arm-bounces@lists.xensource.com

--e89a8f83a53f0eebee04b5611dd4
Content-Type: multipart/alternative; boundary=e89a8f83a53f0eebe204b5611dd2

--e89a8f83a53f0eebe204b5611dd2
Content-Type: text/plain; charset=ISO-8859-1

Hi all,

I have compiled Xen-ARM., on Ubuntu 10.04 LTS.
I have attached the list of all those files in the attachment.I have two
linux images vmlinux0 and vmlinux.out0.
If I want to run these, then I need to Integrate them, so that they can be
transferred and used via TFTP/MMC/SD/NFS.

Because all the files created for target are available in the Xen_root
folder in a directory Xen_Root[main folder with code]/tools/target
they are
Xen_Root/tools/target/dev/xen/evtchn
Xen_Root/tools/target/etc/xen/dom1 xend-config.sxp
Xen_Root/tools/target/usr/lib local                                  etc,
.... with all the details present in the attachment.

and linux kernel images are present in linux_root directory
30974907 vmlinux0       (application/x-executable)      is Dom1
3166360   vmlinux.out0 (application/x-executable)      is Dom0

How to relate all these with the bootloader, Kernel, rootfs, is all that I
have.

Obviously, Xen can only be loaded on top of bootloader, but

1.  What to do with the contents on the target directory in the
Xen_Root/tools/target?

2.  Xen-ARM is obtained in xen (application/x-executable), xen-bin
(binary), xen.gz? what to use?

3.  Linux images are in (application/x-executable) format, but I have only
knowledge about

Please Kindly Suggest!!!  Krishna Pavan

--e89a8f83a53f0eebe204b5611dd2
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<font>Hi all,</font><br><br>I have compiled Xen-ARM., on Ubuntu 10.04 LTS.<=
br>I have attached the list of all those files in the attachment.I have two=
 linux images vmlinux0 and vmlinux.out0.<br>If I want to run these, then I =
need to<font style=3D"color:rgb(0,0,153)" size=3D"4"> Integrate </font>them=
, so that they can be transferred and used via TFTP/MMC/SD/NFS.<br>
<br>Because all the files created for target are available in the Xen_root =
folder in a directory Xen_Root[main folder with code]/tools/target <br>they=
 are <br>Xen_Root/tools/target/dev/xen/evtchn<br>Xen_Root/tools/target/etc/=
xen/dom1 xend-config.sxp<br>
Xen_Root/tools/target/usr/lib local=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 etc, .... with=
 all the details present in the attachment.<br><br>and linux kernel images =
are present in linux_root directory<br>30974907 vmlinux0=A0=A0=A0=A0=A0=A0 =
(application/x-executable) =A0=A0 =A0 is Dom1 <br>
 3166360 =A0 vmlinux.out0 (application/x-executable) =A0 =A0=A0 is Dom0 <br=
><br>How to relate all these with the bootloader, Kernel, rootfs, is all th=
at I have.<br><br>Obviously, <font style=3D"color:rgb(51,0,51)" size=3D"4">=
<span style=3D"font-family:comic sans ms,sans-serif">Xen can only be loaded=
 on top of bootloader, but </span><br style=3D"font-family:comic sans ms,sa=
ns-serif">
<br style=3D"font-family:comic sans ms,sans-serif"><span style=3D"font-fami=
ly:comic sans ms,sans-serif">1.=A0 What to do with the contents on the targ=
et directory in the Xen_Root/tools/target?</span><br style=3D"font-family:c=
omic sans ms,sans-serif">
<br style=3D"font-family:comic sans ms,sans-serif"><span style=3D"font-fami=
ly:comic sans ms,sans-serif">2.=A0 Xen-ARM is obtained in xen (application/=
x-executable), xen-bin (binary), xen.gz? what to use?</span><br style=3D"fo=
nt-family:comic sans ms,sans-serif">
<br style=3D"font-family:comic sans ms,sans-serif"><span style=3D"font-fami=
ly:comic sans ms,sans-serif">3.=A0 Linux images are in (application/x-execu=
table) format, but I have only knowledge about</span></font><br><font><br s=
tyle=3D"font-family:courier new,monospace">
<span style=3D"font-family:courier new,monospace;color:rgb(0,0,102)">Please=
 Kindly Suggest!!!=A0 Krishna Pavan</span></font><br>

--e89a8f83a53f0eebe204b5611dd2--
--e89a8f83a53f0eebee04b5611dd4
Content-Type: text/plain; charset=US-ASCII; name="list.txt"
Content-Disposition: attachment; filename="list.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gwuial1o0

LjoKQ29uZmlnLm1rICBjc2NvcGUub3V0ICBsaW51eC1zcGFyc2UgIG15Y3Njb3BlICBSRUFETUUJ
CSBUQUdTCXhlbgpDT1BZSU5HICAgIGV4dHJhcyAgICAgIE1ha2VmaWxlICAgICAgbXlldGFncyAg
IHNlcXVlbmNlX2xvZy50eHQgIHRvb2xzCgouL2V4dHJhczoKbWluaS1vcy1hcm0KCi4vZXh0cmFz
L21pbmktb3MtYXJtOgphcmNoCSAgIGRyaXZlcnMgIGtlcm5lbCAgbG9nICAgICAgIE1ha2VmaWxl
X2FybSAgdGVzdGJlbmNoCkNvbmZpZy5tayAgaW5jbHVkZSAgbGliICAgICBNYWtlZmlsZSAgUnVs
ZXMubWsJICAgIHhlbmJ1cwoKLi9leHRyYXMvbWluaS1vcy1hcm0vYXJjaDoKYXJtCgouL2V4dHJh
cy9taW5pLW9zLWFybS9hcmNoL2FybToKYXJjaC1nb2xkZmlzaCAgYXJjaC1pbXgyMSAgYXJjaC12
ZXJzYXRpbGUgIGNvbW1vbiAgbGliCU1ha2VmaWxlCgouL2V4dHJhcy9taW5pLW9zLWFybS9hcmNo
L2FybS9hcmNoLWdvbGRmaXNoOgpnb2xkZmlzaC5sZHMgIHN0YXJ0LlMKCi4vZXh0cmFzL21pbmkt
b3MtYXJtL2FyY2gvYXJtL2FyY2gtaW14MjE6CmRlYnVnLlMgIGlteDIxLmxkcyAgaW14MjEubGRz
LmluICBzdGFydC5TCgouL2V4dHJhcy9taW5pLW9zLWFybS9hcmNoL2FybS9hcmNoLXZlcnNhdGls
ZToKc3RhcnQuUyAgdmVyc2F0aWxlLmxkcwoKLi9leHRyYXMvbWluaS1vcy1hcm0vYXJjaC9hcm0v
Y29tbW9uOgplbnRyeS5TICBtYWNoaW5lLmMgIG1hdGguUwoKLi9leHRyYXMvbWluaS1vcy1hcm0v
YXJjaC9hcm0vbGliOgpnY2NsaWIuaCAgbXVsZGkzLmMKCi4vZXh0cmFzL21pbmktb3MtYXJtL2Ry
aXZlcnM6Ck1ha2VmaWxlICB4ZW5idXMgIHhlbmNvbnNvbGUKCi4vZXh0cmFzL21pbmktb3MtYXJt
L2RyaXZlcnMveGVuYnVzOgp4ZW5idXMuYwoKLi9leHRyYXMvbWluaS1vcy1hcm0vZHJpdmVycy94
ZW5jb25zb2xlOgp4ZW5jb25zb2xlLmMKCi4vZXh0cmFzL21pbmktb3MtYXJtL2luY2x1ZGU6CmFz
bS1hcm0gIG9zICB4ZW4KCi4vZXh0cmFzL21pbmktb3MtYXJtL2luY2x1ZGUvYXNtLWFybToKYml0
b3BzLmggIHR5cGVzLmgKCi4vZXh0cmFzL21pbmktb3MtYXJtL2luY2x1ZGUvb3M6CmJpdG9wcy5o
ICAgIGVycm5vLWJhc2UuaCAgaHlwZXJ2aXNvci5oCW9zLmgJICAgICB0cmFwcy5oCmJsb3dmaXNo
LmggIGVycm5vLmgJICBpcnEuaAkJc2NoZWQuaCAgICAgIHR5cGVzLmgKY29uZmlnLmggICAgZXZ0
Y2huLmgJICBsaWIuaAkJc2VtYXBob3JlLmggIHdhaXQuaApjdHlwZS5oICAgICBmaXhtYXAuaAkg
IGxpc3QuaAlzcGlubG9jay5oICAgeGVuYnVzLmgKZXJyLmgJICAgIGdudHRhYi5oCSAgbW0uaAkJ
dGltZS5oCSAgICAgeG1hbGxvYy5oCgouL2V4dHJhcy9taW5pLW9zLWFybS9pbmNsdWRlL3hlbjoK
Ci4vZXh0cmFzL21pbmktb3MtYXJtL2tlcm5lbDoKZXZ0Y2huLmMgIG1haW4uYyAgICBtbS5jICAg
ICBzY2hlZC5kaWZmICB0cmFwcy5jCmdudHRhYi5jICBNYWtlZmlsZSAgc2NoZWQuYyAgdGltZS5j
CgouL2V4dHJhcy9taW5pLW9zLWFybS9saWI6CmJsb3dmaXNoLmMgIE1ha2VmaWxlICBtYXRoLmMg
IHByaW50Zi5jCXN0cmluZy5jICB4bWFsbG9jLmMKCi4vZXh0cmFzL21pbmktb3MtYXJtL3Rlc3Ri
ZW5jaDoKY2xpZW50LmMgIE1ha2VmaWxlICBzZXJ2ZXIuYwoKLi9leHRyYXMvbWluaS1vcy1hcm0v
eGVuYnVzOgp4ZW5idXNfeHMuYwoKLi9saW51eC1zcGFyc2U6CmFyY2gJCSBjb25maWdfZG9tMV9z
aW0gIGRyaXZlcnMgIGluaXQgICAga2VybmVsICBNYWtlZmlsZQpjb25maWdfZG9tMF9jb20gIGRv
X2NvbXBpbGUuc2gJICBpbmNsdWRlICBLYnVpbGQgIGxpYgkgICBtbQoKLi9saW51eC1zcGFyc2Uv
YXJjaDoKYXJtCgouL2xpbnV4LXNwYXJzZS9hcmNoL2FybToKS2NvbmZpZyAga2VybmVsICBtYWNo
LWlteCAgTWFrZWZpbGUgIG1tCgouL2xpbnV4LXNwYXJzZS9hcmNoL2FybS9rZXJuZWw6CmFzbS1v
ZmZzZXRzLXhlbi5jICBlbnRyeS1jb21tb24teGVuLlMgIGhlYWQteGVuLlMgIHByb2Nlc3MteGVu
LmMgICAgc2V0dXAteGVuLmMKZW50cnktYXJtdi14ZW4uUyAgIGVudHJ5LWhlYWRlci14ZW4uUyAg
TWFrZWZpbGUgICAgc2VtYXBob3JlLXhlbi5jICB0cmFwcy14ZW4uYwoKLi9saW51eC1zcGFyc2Uv
YXJjaC9hcm0vbWFjaC1pbXg6CmdlbmVyaWMuYyAgaXJxLXhlbi5jICBNYWtlZmlsZQkgICAgIG14
MmFkcy14ZW4uYwpnZW5lcmljLmggIEtjb25maWcgICAgTWFrZWZpbGUuYm9vdCAgdGltZS14ZW4u
YwoKLi9saW51eC1zcGFyc2UvYXJjaC9hcm0vbW06CmFib3J0LWV2NXRqLXhlbi5TICBoeXBlcnZp
c29yLmMgICBLY29uZmlnICAgIHBnZC14ZW4uYwkJdGxiLXY0d2JpLXhlbi5TCmNvbnNpc3RlbnQt
eGVuLmMgICBpbml0LXhlbi5jCSAgTWFrZWZpbGUgICBwZ3RibC14ZW4uYwpmYXVsdC14ZW4uYwkg
ICBpb3JlbWFwLXhlbi5jICBtbXUteGVuLmMgIHByb2MtYXJtOTI2LXhlbi5TCgouL2xpbnV4LXNw
YXJzZS9kcml2ZXJzOgpjaGFyICBpMmMgIGlucHV0ICBNYWtlZmlsZSAgbXRkICBuZXQgIHNlcmlh
bCAgdmlkZW8gIHhlbgoKLi9saW51eC1zcGFyc2UvZHJpdmVycy9jaGFyOgpNYWtlZmlsZSAgdHR5
X2lvLXhlbi5jCgouL2xpbnV4LXNwYXJzZS9kcml2ZXJzL2kyYzoKYnVzc2VzCgouL2xpbnV4LXNw
YXJzZS9kcml2ZXJzL2kyYy9idXNzZXM6CmkyYy1pbXguYyAgS2NvbmZpZyAgTWFrZWZpbGUKCi4v
bGludXgtc3BhcnNlL2RyaXZlcnMvaW5wdXQ6CmtleWJvYXJkICB0b3VjaHNjcmVlbgoKLi9saW51
eC1zcGFyc2UvZHJpdmVycy9pbnB1dC9rZXlib2FyZDoKS2NvbmZpZyAgTWFrZWZpbGUgIG14MjFf
a3BwX2JhY2suYyAgbXgyMV9rcHAuaAoKLi9saW51eC1zcGFyc2UvZHJpdmVycy9pbnB1dC90b3Vj
aHNjcmVlbjoKS2NvbmZpZyAgTWFrZWZpbGUgIG14MjFhZHNfdHMuYyAgbXgyMWFkc190cy5oCgou
L2xpbnV4LXNwYXJzZS9kcml2ZXJzL210ZDoKY2hpcHMgIG1hcHMKCi4vbGludXgtc3BhcnNlL2Ry
aXZlcnMvbXRkL2NoaXBzOgphbWRfZmxhc2guYyAgY2ZpX2NtZHNldF8wMDAyLmMJY2ZpX3Byb2Jl
LmMgIGNmaV91dGlsLmMKCi4vbGludXgtc3BhcnNlL2RyaXZlcnMvbXRkL21hcHM6Ck1ha2VmaWxl
ICBteDJhZHMuYwoKLi9saW51eC1zcGFyc2UvZHJpdmVycy9uZXQ6CmNzODl4MC5jICBjczg5eDAu
aCAgS2NvbmZpZwoKLi9saW51eC1zcGFyc2UvZHJpdmVycy9zZXJpYWw6CmlteC5jCgouL2xpbnV4
LXNwYXJzZS9kcml2ZXJzL3ZpZGVvOgpkb21fc3RhdHVzX2ltZy5oICBpbXhmYi5jICBpbXhmYl9n
dy5jICBpbXhmYl9ndy5oICBpbXhmYi5oICBNYWtlZmlsZQoKLi9saW51eC1zcGFyc2UvZHJpdmVy
cy94ZW46CmNvbnNvbGUgIGV2dGNobiAgICAgZmJzZXRmcm9udAlrcHBiYWNrICAgTWFrZWZpbGUg
IHV0aWwuYwpjb3JlCSBmYnNldGJhY2sgIEtjb25maWcJa3BwZnJvbnQgIHByaXZjbWQgICB4ZW5i
dXMKCi4vbGludXgtc3BhcnNlL2RyaXZlcnMveGVuL2NvbnNvbGU6CmNvbnNvbGUuYyAgTWFrZWZp
bGUgIHhlbmNvbnNfcmluZy5jCgouL2xpbnV4LXNwYXJzZS9kcml2ZXJzL3hlbi9jb3JlOgpldnRj
aG4uYyAgZmVhdHVyZXMuYyAgZ250dGFiLmMJTWFrZWZpbGUgIHhlbl9wcm9jLmMKCi4vbGludXgt
c3BhcnNlL2RyaXZlcnMveGVuL2V2dGNobjoKZXZ0Y2huLmMgIE1ha2VmaWxlCgouL2xpbnV4LXNw
YXJzZS9kcml2ZXJzL3hlbi9mYnNldGJhY2s6CmNvbW1vbi5oICBmYnNldGJhY2staW14MjEuYyAg
aW50ZXJmYWNlLmMgIE1ha2VmaWxlICB4ZW5idXMuYwoKLi9saW51eC1zcGFyc2UvZHJpdmVycy94
ZW4vZmJzZXRmcm9udDoKY29tbW9uLmggIGZic2V0ZnJvbnQtaW14MjEuYyAgTWFrZWZpbGUKCi4v
bGludXgtc3BhcnNlL2RyaXZlcnMveGVuL2twcGJhY2s6CmNvbW1vbi5oICBpbnRlcmZhY2UuYyAg
a3BwYmFjay5jICBNYWtlZmlsZSAgeGVuYnVzLmMKCi4vbGludXgtc3BhcnNlL2RyaXZlcnMveGVu
L2twcGZyb250Ogpjb21tb24uaCAga3BwZnJvbnQuYyAga3BwZnJvbnQuaCAgTWFrZWZpbGUKCi4v
bGludXgtc3BhcnNlL2RyaXZlcnMveGVuL3ByaXZjbWQ6Ck1ha2VmaWxlICBwcml2Y21kLmMKCi4v
bGludXgtc3BhcnNlL2RyaXZlcnMveGVuL3hlbmJ1czoKTWFrZWZpbGUJCSB4ZW5idXNfY2xpZW50
LmMgIHhlbmJ1c19jb21tcy5oICB4ZW5idXNfcHJvYmUuYwp4ZW5idXNfYmFja2VuZF9jbGllbnQu
YyAgeGVuYnVzX2NvbW1zLmMgICB4ZW5idXNfZGV2LmMJICB4ZW5idXNfeHMuYwoKLi9saW51eC1z
cGFyc2UvaW5jbHVkZToKYXNtLWFybSAgbGludXgJeGVuCgouL2xpbnV4LXNwYXJzZS9pbmNsdWRl
L2FzbS1hcm06CmFyY2gtaW14ICAgICBjYWNoZWZsdXNoLmggIGZwc3RhdGUuaCAgIG1lbW9yeS5o
ICAgcGd0YWJsZS5oICAgIHRocmVhZF9pbmZvLmgKYXNzZW1ibGVyLmggIGNwdS1zaW5nbGUuaCAg
aXJxZmxhZ3MuaCAgcGFnZS5oCSAgc2VtYXBob3JlLmggIHRsYmZsdXNoLmgKYml0b3BzLmggICAg
IGRvbWFpbi5oCSAgIGxvY2tzLmggICAgIHBnYWxsb2MuaCAgc3lzdGVtLmggICAgIHVhY2Nlc3Mu
aAoKLi9saW51eC1zcGFyc2UvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14OgphdWRtdXguaCAgICAg
ICBncGlvLmgJICAgaW14LXJlZ3MuaCAgbWVtb3J5LmggICAgICBzeXN0ZW0uaAkgICB2bWFsbG9j
LmgKY2xrLmgJICAgICAgIGhhcmR3YXJlLmggIGlycS5oICAgICAgIG14MmFkcy14ZW4uaCAgdGlt
ZXguaAplbnRyeS1tYWNyby5TICBpbXhmYi5oCSAgIGlycXMuaCAgICAgIHNzaS5oCSAgICAgdW5j
b21wcmVzcy5oCgouL2xpbnV4LXNwYXJzZS9pbmNsdWRlL2xpbnV4Ogppbml0X3Rhc2suaCAgaW50
ZXJydXB0LmggIGppZmZpZXMuaCAgbWFqb3IuaCAgbW0uaCAgdGhyZWFkX2luZm8uaCAgdHR5LmgK
Ci4vbGludXgtc3BhcnNlL2luY2x1ZGUveGVuOgpkcml2ZXJfdXRpbC5oICBmYnNldGlmLmggICBm
aXhtYXAuaCAgaHlwZXJ2aXNvci5oICBwdWJsaWMgICAgeGVuY29ucy5oCmV2dGNobi5oICAgICAg
IGZlYXR1cmVzLmggIGdudHRhYi5oICBrcHBpZi5oCSAgIHhlbmJ1cy5oICB4ZW5fcHJvYy5oCgou
L2xpbnV4LXNwYXJzZS9pbmNsdWRlL3hlbi9wdWJsaWM6CmV2dGNobi5oICBwcml2Y21kLmgKCi4v
bGludXgtc3BhcnNlL2luaXQ6Cm1haW4teGVuLmMgIE1ha2VmaWxlCgouL2xpbnV4LXNwYXJzZS9r
ZXJuZWw6CmlycSAgc3lzLmMKCi4vbGludXgtc3BhcnNlL2tlcm5lbC9pcnE6CmNoaXAteGVuLmMg
IE1ha2VmaWxlICBtYW5hZ2UteGVuLmMKCi4vbGludXgtc3BhcnNlL2xpYjoKTWFrZWZpbGUgIHZz
cHJpbnRmLXhlbi5jCgouL2xpbnV4LXNwYXJzZS9tbToKbWVtb3J5LmMKCi4vdG9vbHM6CmFybV9w
eXRob24gIGxpYnhjICAgICBtaXNjICAgIFJ1bGVzLm1rCXhlbnN0YXQKY29uc29sZSAgICAgTWFr
ZWZpbGUgIHB5dGhvbiAgdGFyZ2V0CXhlbnN0b3JlCgouL3Rvb2xzL2FybV9weXRob246CmNyb3Nz
X2J1aWxkLnNoCWNyb3NzX2NvbXBpbGVkCVB5dGhvbjIuNC4zX3hjb21waWxlLnBhdGNoCgouL3Rv
b2xzL2FybV9weXRob24vY3Jvc3NfY29tcGlsZWQ6CmJpbiAgaW5jbHVkZSAgbGliICBtYW4KCi4v
dG9vbHMvYXJtX3B5dGhvbi9jcm9zc19jb21waWxlZC9iaW46CmlkbGUgIHB5ZG9jICBweXRob24g
IHB5dGhvbjIuNAlzbXRwZC5weQoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL2lu
Y2x1ZGU6CnB5dGhvbjIuNAoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL2luY2x1
ZGUvcHl0aG9uMi40OgphYnN0cmFjdC5oCSBlbnVtb2JqZWN0LmgJbG9uZ2ludHJlcHIuaAlwZ2Vu
aGVhZGVycy5oCXJhbmdlb2JqZWN0LmgKYml0c2V0LmgJIGVycmNvZGUuaAlsb25nb2JqZWN0LmgJ
cHljb25maWcuaAlzZXRvYmplY3QuaApib29sb2JqZWN0LmgJIGV2YWwuaAkJbWFyc2hhbC5oCXB5
X2N1cnNlcy5oCXNsaWNlb2JqZWN0LmgKYnVmZmVyb2JqZWN0LmgJIGZpbGVvYmplY3QuaAltZXRh
Z3JhbW1hci5oCXB5ZGVidWcuaAlzdHJpbmdvYmplY3QuaApjZWxsb2JqZWN0LmgJIGZsb2F0b2Jq
ZWN0LmgJbWV0aG9kb2JqZWN0LmgJcHllcnJvcnMuaAlzdHJ1Y3RtZW1iZXIuaApjZXZhbC5oCQkg
ZnJhbWVvYmplY3QuaAltb2RzdXBwb3J0LmgJcHlmcGUuaAkJc3RydWN0c2VxLmgKY2xhc3NvYmpl
Y3QuaAkgZnVuY29iamVjdC5oCW1vZHVsZW9iamVjdC5oCXB5Z2V0b3B0LmgJc3ltdGFibGUuaApj
b2JqZWN0LmgJIGdlbm9iamVjdC5oCW5vZGUuaAkJcHltYWN0b29sYm94LmgJc3lzbW9kdWxlLmgK
Y29kZWNzLmgJIGdyYW1pbml0LmgJb2JqZWN0LmgJcHltZW0uaAkJdGltZWZ1bmNzLmgKY29tcGls
ZS5oCSBncmFtbWFyLmgJb2JqaW1wbC5oCXB5cG9ydC5oCXRva2VuLmgKY29tcGxleG9iamVjdC5o
ICBpbXBvcnQuaAlvcGNvZGUuaAlweXN0YXRlLmgJdHJhY2ViYWNrLmgKY1N0cmluZ0lPLmgJIGlu
dG9iamVjdC5oCW9zZGVmcy5oCXB5c3RydG9kLmgJdHVwbGVvYmplY3QuaApkYXRldGltZS5oCSBp
bnRyY2hlY2suaAlwYXJzZXRvay5oCVB5dGhvbi5oCXVjbmhhc2guaApkZXNjcm9iamVjdC5oCSBp
dGVyb2JqZWN0LmgJcGF0Y2hsZXZlbC5oCXB5dGhvbnJ1bi5oCXVuaWNvZGVvYmplY3QuaApkaWN0
b2JqZWN0LmgJIGxpc3RvYmplY3QuaAlwZ2VuLmgJCXB5dGhyZWFkLmgJd2Vha3JlZm9iamVjdC5o
CgouL3Rvb2xzL2FybV9weXRob24vY3Jvc3NfY29tcGlsZWQvbGliOgpsaWJweXRob24yLjQuc28g
IGxpYnB5dGhvbjIuNC5zby4xLjAgIHB5dGhvbjIuNAoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3Nz
X2NvbXBpbGVkL2xpYi9weXRob24yLjQ6CmFpZmMucHkJCSAgICAgaW1wdXRpbC5weQkJICAgIHNo
ZWx2ZS5weWMKYWlmYy5weWMJICAgICBpbXB1dGlsLnB5YwkgICAgc2hlbHZlLnB5bwphaWZjLnB5
bwkgICAgIGltcHV0aWwucHlvCSAgICBzaGxleC5weQphbnlkYm0ucHkJICAgICBpbnNwZWN0LnB5
CQkgICAgc2hsZXgucHljCmFueWRibS5weWMJICAgICBpbnNwZWN0LnB5YwkgICAgc2hsZXgucHlv
CmFueWRibS5weW8JICAgICBpbnNwZWN0LnB5bwkgICAgc2h1dGlsLnB5CmFzeW5jaGF0LnB5CSAg
ICAga2V5d29yZC5weQkJICAgIHNodXRpbC5weWMKYXN5bmNoYXQucHljCSAgICAga2V5d29yZC5w
eWMJICAgIHNodXRpbC5weW8KYXN5bmNoYXQucHlvCSAgICAga2V5d29yZC5weW8JICAgIFNpbXBs
ZUhUVFBTZXJ2ZXIucHkKYXN5bmNvcmUucHkJICAgICBsaWItZHlubG9hZAkgICAgU2ltcGxlSFRU
UFNlcnZlci5weWMKYXN5bmNvcmUucHljCSAgICAgbGliLW9sZAkJICAgIFNpbXBsZUhUVFBTZXJ2
ZXIucHlvCmFzeW5jb3JlLnB5bwkgICAgIGxpYi10awkJICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5w
eQphdGV4aXQucHkJICAgICBMSUNFTlNFLnR4dAkgICAgU2ltcGxlWE1MUlBDU2VydmVyLnB5Ywph
dGV4aXQucHljCSAgICAgbGluZWNhY2hlLnB5CSAgICBTaW1wbGVYTUxSUENTZXJ2ZXIucHlvCmF0
ZXhpdC5weW8JICAgICBsaW5lY2FjaGUucHljCSAgICBzaXRlLXBhY2thZ2VzCmF1ZGlvZGV2LnB5
CSAgICAgbGluZWNhY2hlLnB5bwkgICAgc2l0ZS5weQphdWRpb2Rldi5weWMJICAgICBsb2NhbGUu
cHkJCSAgICBzaXRlLnB5YwphdWRpb2Rldi5weW8JICAgICBsb2NhbGUucHljCQkgICAgc2l0ZS5w
eW8KYmFzZTY0LnB5CSAgICAgbG9jYWxlLnB5bwkJICAgIHNtdHBkLnB5CmJhc2U2NC5weWMJICAg
ICBsb2dnaW5nCQkgICAgc210cGQucHljCmJhc2U2NC5weW8JICAgICBfTFdQQ29va2llSmFyLnB5
CSAgICBzbXRwZC5weW8KQmFzZUhUVFBTZXJ2ZXIucHkgICAgX0xXUENvb2tpZUphci5weWMJICAg
IHNtdHBsaWIucHkKQmFzZUhUVFBTZXJ2ZXIucHljICAgX0xXUENvb2tpZUphci5weW8JICAgIHNt
dHBsaWIucHljCkJhc2VIVFRQU2VydmVyLnB5byAgIG1hY3BhdGgucHkJCSAgICBzbXRwbGliLnB5
bwpCYXN0aW9uLnB5CSAgICAgbWFjcGF0aC5weWMJICAgIHNuZGhkci5weQpCYXN0aW9uLnB5Ywkg
ICAgIG1hY3BhdGgucHlvCSAgICBzbmRoZHIucHljCkJhc3Rpb24ucHlvCSAgICAgbWFjdXJsMnBh
dGgucHkJICAgIHNuZGhkci5weW8KYmRiLnB5CQkgICAgIG1hY3VybDJwYXRoLnB5YwkgICAgc29j
a2V0LnB5CmJkYi5weWMJCSAgICAgbWFjdXJsMnBhdGgucHlvCSAgICBzb2NrZXQucHljCmJkYi5w
eW8JCSAgICAgbWFpbGJveC5weQkJICAgIHNvY2tldC5weW8KYmluaGV4LnB5CSAgICAgbWFpbGJv
eC5weWMJICAgIFNvY2tldFNlcnZlci5weQpiaW5oZXgucHljCSAgICAgbWFpbGJveC5weW8JICAg
IFNvY2tldFNlcnZlci5weWMKYmluaGV4LnB5bwkgICAgIG1haWxjYXAucHkJCSAgICBTb2NrZXRT
ZXJ2ZXIucHlvCmJpc2VjdC5weQkgICAgIG1haWxjYXAucHljCSAgICBzcmVfY29tcGlsZS5weQpi
aXNlY3QucHljCSAgICAgbWFpbGNhcC5weW8JICAgIHNyZV9jb21waWxlLnB5YwpiaXNlY3QucHlv
CSAgICAgbWFya3VwYmFzZS5weQkgICAgc3JlX2NvbXBpbGUucHlvCmJzZGRiCQkgICAgIG1hcmt1
cGJhc2UucHljCSAgICBzcmVfY29uc3RhbnRzLnB5CmNhbGVuZGFyLnB5CSAgICAgbWFya3VwYmFz
ZS5weW8JICAgIHNyZV9jb25zdGFudHMucHljCmNhbGVuZGFyLnB5YwkgICAgIG1obGliLnB5CQkg
ICAgc3JlX2NvbnN0YW50cy5weW8KY2FsZW5kYXIucHlvCSAgICAgbWhsaWIucHljCQkgICAgc3Jl
X3BhcnNlLnB5CkNHSUhUVFBTZXJ2ZXIucHkgICAgIG1obGliLnB5bwkJICAgIHNyZV9wYXJzZS5w
eWMKQ0dJSFRUUFNlcnZlci5weWMgICAgbWltZXRvb2xzLnB5CSAgICBzcmVfcGFyc2UucHlvCkNH
SUhUVFBTZXJ2ZXIucHlvICAgIG1pbWV0b29scy5weWMJICAgIHNyZS5weQpjZ2kucHkJCSAgICAg
bWltZXRvb2xzLnB5bwkgICAgc3JlLnB5YwpjZ2kucHljCQkgICAgIG1pbWV0eXBlcy5weQkgICAg
c3JlLnB5bwpjZ2kucHlvCQkgICAgIG1pbWV0eXBlcy5weWMJICAgIHN0YXRjYWNoZS5weQpjZ2l0
Yi5weQkgICAgIG1pbWV0eXBlcy5weW8JICAgIHN0YXRjYWNoZS5weWMKY2dpdGIucHljCSAgICAg
TWltZVdyaXRlci5weQkgICAgc3RhdGNhY2hlLnB5bwpjZ2l0Yi5weW8JICAgICBNaW1lV3JpdGVy
LnB5YwkgICAgc3RhdC5weQpjaHVuay5weQkgICAgIE1pbWVXcml0ZXIucHlvCSAgICBzdGF0LnB5
YwpjaHVuay5weWMJICAgICBtaW1pZnkucHkJCSAgICBzdGF0LnB5bwpjaHVuay5weW8JICAgICBt
aW1pZnkucHljCQkgICAgc3RhdHZmcy5weQpjbWQucHkJCSAgICAgbWltaWZ5LnB5bwkJICAgIHN0
YXR2ZnMucHljCmNtZC5weWMJCSAgICAgbW9kdWxlZmluZGVyLnB5CSAgICBzdGF0dmZzLnB5bwpj
bWQucHlvCQkgICAgIG1vZHVsZWZpbmRlci5weWMJICAgIFN0cmluZ0lPLnB5CmNvZGVjcy5weQkg
ICAgIG1vZHVsZWZpbmRlci5weW8JICAgIFN0cmluZ0lPLnB5Ywpjb2RlY3MucHljCSAgICAgX01v
emlsbGFDb29raWVKYXIucHkgICBTdHJpbmdJTy5weW8KY29kZWNzLnB5bwkgICAgIF9Nb3ppbGxh
Q29va2llSmFyLnB5YyAgc3RyaW5nb2xkLnB5CmNvZGVvcC5weQkgICAgIF9Nb3ppbGxhQ29va2ll
SmFyLnB5byAgc3RyaW5nb2xkLnB5Ywpjb2Rlb3AucHljCSAgICAgbXVsdGlmaWxlLnB5CSAgICBz
dHJpbmdvbGQucHlvCmNvZGVvcC5weW8JICAgICBtdWx0aWZpbGUucHljCSAgICBzdHJpbmdwcmVw
LnB5CmNvZGUucHkJCSAgICAgbXVsdGlmaWxlLnB5bwkgICAgc3RyaW5ncHJlcC5weWMKY29kZS5w
eWMJICAgICBtdXRleC5weQkJICAgIHN0cmluZ3ByZXAucHlvCmNvZGUucHlvCSAgICAgbXV0ZXgu
cHljCQkgICAgc3RyaW5nLnB5CmNvbG9yc3lzLnB5CSAgICAgbXV0ZXgucHlvCQkgICAgc3RyaW5n
LnB5Ywpjb2xvcnN5cy5weWMJICAgICBuZXRyYy5weQkJICAgIHN0cmluZy5weW8KY29sb3JzeXMu
cHlvCSAgICAgbmV0cmMucHljCQkgICAgX3N0cnB0aW1lLnB5CmNvbW1hbmRzLnB5CSAgICAgbmV0
cmMucHlvCQkgICAgX3N0cnB0aW1lLnB5Ywpjb21tYW5kcy5weWMJICAgICBuZXcucHkJCSAgICBf
c3RycHRpbWUucHlvCmNvbW1hbmRzLnB5bwkgICAgIG5ldy5weWMJCSAgICBzdWJwcm9jZXNzLnB5
CmNvbXBpbGVhbGwucHkJICAgICBuZXcucHlvCQkgICAgc3VicHJvY2Vzcy5weWMKY29tcGlsZWFs
bC5weWMJICAgICBubnRwbGliLnB5CQkgICAgc3VicHJvY2Vzcy5weW8KY29tcGlsZWFsbC5weW8J
ICAgICBubnRwbGliLnB5YwkgICAgc3VuYXVkaW8ucHkKY29tcGlsZXIJICAgICBubnRwbGliLnB5
bwkgICAgc3VuYXVkaW8ucHljCmNvbmZpZwkJICAgICBudHBhdGgucHkJCSAgICBzdW5hdWRpby5w
eW8KQ29uZmlnUGFyc2VyLnB5ICAgICAgbnRwYXRoLnB5YwkJICAgIHN1bmF1LnB5CkNvbmZpZ1Bh
cnNlci5weWMgICAgIG50cGF0aC5weW8JCSAgICBzdW5hdS5weWMKQ29uZmlnUGFyc2VyLnB5byAg
ICAgbnR1cmwycGF0aC5weQkgICAgc3VuYXUucHlvCmNvb2tpZWxpYi5weQkgICAgIG50dXJsMnBh
dGgucHljCSAgICBzeW1ib2wucHkKY29va2llbGliLnB5YwkgICAgIG50dXJsMnBhdGgucHlvCSAg
ICBzeW1ib2wucHljCmNvb2tpZWxpYi5weW8JICAgICBvcGNvZGUucHkJCSAgICBzeW1ib2wucHlv
CkNvb2tpZS5weQkgICAgIG9wY29kZS5weWMJCSAgICBzeW10YWJsZS5weQpDb29raWUucHljCSAg
ICAgb3Bjb2RlLnB5bwkJICAgIHN5bXRhYmxlLnB5YwpDb29raWUucHlvCSAgICAgb3B0cGFyc2Uu
cHkJICAgIHN5bXRhYmxlLnB5bwpjb3B5LnB5CQkgICAgIG9wdHBhcnNlLnB5YwkgICAgdGFibmFu
bnkucHkKY29weS5weWMJICAgICBvcHRwYXJzZS5weW8JICAgIHRhYm5hbm55LnB5Ywpjb3B5LnB5
bwkgICAgIG9zMmVteHBhdGgucHkJICAgIHRhYm5hbm55LnB5bwpjb3B5X3JlZy5weQkgICAgIG9z
MmVteHBhdGgucHljCSAgICB0YXJmaWxlLnB5CmNvcHlfcmVnLnB5YwkgICAgIG9zMmVteHBhdGgu
cHlvCSAgICB0YXJmaWxlLnB5Ywpjb3B5X3JlZy5weW8JICAgICBvcy5weQkJICAgIHRhcmZpbGUu
cHlvCmNzdi5weQkJICAgICBvcy5weWMJCSAgICB0ZWxuZXRsaWIucHkKY3N2LnB5YwkJICAgICBv
cy5weW8JCSAgICB0ZWxuZXRsaWIucHljCmNzdi5weW8JCSAgICAgcGRiLmRvYwkJICAgIHRlbG5l
dGxpYi5weW8KY3Vyc2VzCQkgICAgIHBkYi5weQkJICAgIHRlbXBmaWxlLnB5CmRiaGFzaC5weQkg
ICAgIHBkYi5weWMJCSAgICB0ZW1wZmlsZS5weWMKZGJoYXNoLnB5YwkgICAgIHBkYi5weW8JCSAg
ICB0ZW1wZmlsZS5weW8KZGJoYXNoLnB5bwkgICAgIF9fcGhlbGxvX18uZm9vLnB5CSAgICB0ZXN0
CmRlY2ltYWwucHkJICAgICBfX3BoZWxsb19fLmZvby5weWMgICAgIHRleHR3cmFwLnB5CmRlY2lt
YWwucHljCSAgICAgX19waGVsbG9fXy5mb28ucHlvICAgICB0ZXh0d3JhcC5weWMKZGVjaW1hbC5w
eW8JICAgICBwaWNrbGUucHkJCSAgICB0ZXh0d3JhcC5weW8KZGlmZmxpYi5weQkgICAgIHBpY2ts
ZS5weWMJCSAgICB0aGlzLnB5CmRpZmZsaWIucHljCSAgICAgcGlja2xlLnB5bwkJICAgIHRoaXMu
cHljCmRpZmZsaWIucHlvCSAgICAgcGlja2xldG9vbHMucHkJICAgIHRoaXMucHlvCmRpcmNhY2hl
LnB5CSAgICAgcGlja2xldG9vbHMucHljCSAgICBfdGhyZWFkaW5nX2xvY2FsLnB5CmRpcmNhY2hl
LnB5YwkgICAgIHBpY2tsZXRvb2xzLnB5bwkgICAgX3RocmVhZGluZ19sb2NhbC5weWMKZGlyY2Fj
aGUucHlvCSAgICAgcGlwZXMucHkJCSAgICBfdGhyZWFkaW5nX2xvY2FsLnB5bwpkaXMucHkJCSAg
ICAgcGlwZXMucHljCQkgICAgdGhyZWFkaW5nLnB5CmRpcy5weWMJCSAgICAgcGlwZXMucHlvCQkg
ICAgdGhyZWFkaW5nLnB5YwpkaXMucHlvCQkgICAgIHBrZ3V0aWwucHkJCSAgICB0aHJlYWRpbmcu
cHlvCmRpc3R1dGlscwkgICAgIHBrZ3V0aWwucHljCSAgICB0aW1laXQucHkKZG9jdGVzdC5weQkg
ICAgIHBrZ3V0aWwucHlvCSAgICB0aW1laXQucHljCmRvY3Rlc3QucHljCSAgICAgcGxhdGZvcm0u
cHkJICAgIHRpbWVpdC5weW8KZG9jdGVzdC5weW8JICAgICBwbGF0Zm9ybS5weWMJICAgIHRvYWlm
Zi5weQpEb2NYTUxSUENTZXJ2ZXIucHkgICBwbGF0Zm9ybS5weW8JICAgIHRvYWlmZi5weWMKRG9j
WE1MUlBDU2VydmVyLnB5YyAgcGxhdC1saW51eDIJICAgIHRvYWlmZi5weW8KRG9jWE1MUlBDU2Vy
dmVyLnB5byAgcG9wZW4yLnB5CQkgICAgdG9rZW5pemUucHkKZHVtYmRibS5weQkgICAgIHBvcGVu
Mi5weWMJCSAgICB0b2tlbml6ZS5weWMKZHVtYmRibS5weWMJICAgICBwb3BlbjIucHlvCQkgICAg
dG9rZW5pemUucHlvCmR1bWJkYm0ucHlvCSAgICAgcG9wbGliLnB5CQkgICAgdG9rZW4ucHkKZHVt
bXlfdGhyZWFkaW5nLnB5ICAgcG9wbGliLnB5YwkJICAgIHRva2VuLnB5YwpkdW1teV90aHJlYWRp
bmcucHljICBwb3BsaWIucHlvCQkgICAgdG9rZW4ucHlvCmR1bW15X3RocmVhZGluZy5weW8gIHBv
c2l4ZmlsZS5weQkgICAgdHJhY2ViYWNrLnB5CmR1bW15X3RocmVhZC5weSAgICAgIHBvc2l4Zmls
ZS5weWMJICAgIHRyYWNlYmFjay5weWMKZHVtbXlfdGhyZWFkLnB5YyAgICAgcG9zaXhmaWxlLnB5
bwkgICAgdHJhY2ViYWNrLnB5bwpkdW1teV90aHJlYWQucHlvICAgICBwb3NpeHBhdGgucHkJICAg
IHRyYWNlLnB5CmVtYWlsCQkgICAgIHBvc2l4cGF0aC5weWMJICAgIHRyYWNlLnB5YwplbmNvZGlu
Z3MJICAgICBwb3NpeHBhdGgucHlvCSAgICB0cmFjZS5weW8KZmlsZWNtcC5weQkgICAgIHBwcmlu
dC5weQkJICAgIHR0eS5weQpmaWxlY21wLnB5YwkgICAgIHBwcmludC5weWMJCSAgICB0dHkucHlj
CmZpbGVjbXAucHlvCSAgICAgcHByaW50LnB5bwkJICAgIHR0eS5weW8KZmlsZWlucHV0LnB5CSAg
ICAgcHJvZmlsZS5kb2MJICAgIHR5cGVzLnB5CmZpbGVpbnB1dC5weWMJICAgICBwcm9maWxlLnB5
CQkgICAgdHlwZXMucHljCmZpbGVpbnB1dC5weW8JICAgICBwcm9maWxlLnB5YwkgICAgdHlwZXMu
cHlvCmZubWF0Y2gucHkJICAgICBwcm9maWxlLnB5bwkgICAgdHpwYXJzZS5weQpmbm1hdGNoLnB5
YwkgICAgIHBzdGF0cy5weQkJICAgIHR6cGFyc2UucHljCmZubWF0Y2gucHlvCSAgICAgcHN0YXRz
LnB5YwkJICAgIHR6cGFyc2UucHlvCmZvcm1hdHRlci5weQkgICAgIHBzdGF0cy5weW8JCSAgICB1
bml0dGVzdC5weQpmb3JtYXR0ZXIucHljCSAgICAgcHR5LnB5CQkgICAgdW5pdHRlc3QucHljCmZv
cm1hdHRlci5weW8JICAgICBwdHkucHljCQkgICAgdW5pdHRlc3QucHlvCmZwZm9ybWF0LnB5CSAg
ICAgcHR5LnB5bwkJICAgIHVybGxpYjIucHkKZnBmb3JtYXQucHljCSAgICAgcHljbGJyLnB5CQkg
ICAgdXJsbGliMi5weWMKZnBmb3JtYXQucHlvCSAgICAgcHljbGJyLnB5YwkJICAgIHVybGxpYjIu
cHlvCmZ0cGxpYi5weQkgICAgIHB5Y2xici5weW8JCSAgICB1cmxsaWIucHkKZnRwbGliLnB5Ywkg
ICAgIHB5X2NvbXBpbGUucHkJICAgIHVybGxpYi5weWMKZnRwbGliLnB5bwkgICAgIHB5X2NvbXBp
bGUucHljCSAgICB1cmxsaWIucHlvCl9fZnV0dXJlX18ucHkJICAgICBweV9jb21waWxlLnB5bwkg
ICAgdXJscGFyc2UucHkKX19mdXR1cmVfXy5weWMJICAgICBweWRvYy5weQkJICAgIHVybHBhcnNl
LnB5YwpfX2Z1dHVyZV9fLnB5bwkgICAgIHB5ZG9jLnB5YwkJICAgIHVybHBhcnNlLnB5bwpnZXRv
cHQucHkJICAgICBweWRvYy5weW8JCSAgICBVc2VyRGljdC5weQpnZXRvcHQucHljCSAgICAgUXVl
dWUucHkJCSAgICBVc2VyRGljdC5weWMKZ2V0b3B0LnB5bwkgICAgIFF1ZXVlLnB5YwkJICAgIFVz
ZXJEaWN0LnB5bwpnZXRwYXNzLnB5CSAgICAgUXVldWUucHlvCQkgICAgVXNlckxpc3QucHkKZ2V0
cGFzcy5weWMJICAgICBxdW9wcmkucHkJCSAgICBVc2VyTGlzdC5weWMKZ2V0cGFzcy5weW8JICAg
ICBxdW9wcmkucHljCQkgICAgVXNlckxpc3QucHlvCmdldHRleHQucHkJICAgICBxdW9wcmkucHlv
CQkgICAgdXNlci5weQpnZXR0ZXh0LnB5YwkgICAgIHJhbmRvbS5weQkJICAgIHVzZXIucHljCmdl
dHRleHQucHlvCSAgICAgcmFuZG9tLnB5YwkJICAgIHVzZXIucHlvCmdsb2IucHkJCSAgICAgcmFu
ZG9tLnB5bwkJICAgIFVzZXJTdHJpbmcucHkKZ2xvYi5weWMJICAgICByZWNvbnZlcnQucHkJICAg
IFVzZXJTdHJpbmcucHljCmdsb2IucHlvCSAgICAgcmVjb252ZXJ0LnB5YwkgICAgVXNlclN0cmlu
Zy5weW8KZ29waGVybGliLnB5CSAgICAgcmVjb252ZXJ0LnB5bwkgICAgdXUucHkKZ29waGVybGli
LnB5YwkgICAgIHJlZ2V4X3N5bnRheC5weQkgICAgdXUucHljCmdvcGhlcmxpYi5weW8JICAgICBy
ZWdleF9zeW50YXgucHljCSAgICB1dS5weW8KZ3ppcC5weQkJICAgICByZWdleF9zeW50YXgucHlv
CSAgICB3YXJuaW5ncy5weQpnemlwLnB5YwkgICAgIHJlZ3N1Yi5weQkJICAgIHdhcm5pbmdzLnB5
YwpnemlwLnB5bwkgICAgIHJlZ3N1Yi5weWMJCSAgICB3YXJuaW5ncy5weW8KaGVhcHEucHkJICAg
ICByZWdzdWIucHlvCQkgICAgd2F2ZS5weQpoZWFwcS5weWMJICAgICByZXByLnB5CQkgICAgd2F2
ZS5weWMKaGVhcHEucHlvCSAgICAgcmVwci5weWMJCSAgICB3YXZlLnB5bwpobWFjLnB5CQkgICAg
IHJlcHIucHlvCQkgICAgd2Vha3JlZi5weQpobWFjLnB5YwkgICAgIHJlLnB5CQkgICAgd2Vha3Jl
Zi5weWMKaG1hYy5weW8JICAgICByZS5weWMJCSAgICB3ZWFrcmVmLnB5bwpob3RzaG90CQkgICAg
IHJlLnB5bwkJICAgIHdlYmJyb3dzZXIucHkKaHRtbGVudGl0eWRlZnMucHkgICAgcmV4ZWMucHkJ
CSAgICB3ZWJicm93c2VyLnB5YwpodG1sZW50aXR5ZGVmcy5weWMgICByZXhlYy5weWMJCSAgICB3
ZWJicm93c2VyLnB5bwpodG1sZW50aXR5ZGVmcy5weW8gICByZXhlYy5weW8JCSAgICB3aGljaGRi
LnB5Cmh0bWxsaWIucHkJICAgICByZmM4MjIucHkJCSAgICB3aGljaGRiLnB5YwpodG1sbGliLnB5
YwkgICAgIHJmYzgyMi5weWMJCSAgICB3aGljaGRiLnB5bwpodG1sbGliLnB5bwkgICAgIHJmYzgy
Mi5weW8JCSAgICB3aHJhbmRvbS5weQpIVE1MUGFyc2VyLnB5CSAgICAgcmxjb21wbGV0ZXIucHkJ
ICAgIHdocmFuZG9tLnB5YwpIVE1MUGFyc2VyLnB5YwkgICAgIHJsY29tcGxldGVyLnB5YwkgICAg
d2hyYW5kb20ucHlvCkhUTUxQYXJzZXIucHlvCSAgICAgcmxjb21wbGV0ZXIucHlvCSAgICB4ZHJs
aWIucHkKaHR0cGxpYi5weQkgICAgIHJvYm90cGFyc2VyLnB5CSAgICB4ZHJsaWIucHljCmh0dHBs
aWIucHljCSAgICAgcm9ib3RwYXJzZXIucHljCSAgICB4ZHJsaWIucHlvCmh0dHBsaWIucHlvCSAg
ICAgcm9ib3RwYXJzZXIucHlvCSAgICB4bWwKaWRsZWxpYgkJICAgICBzY2hlZC5weQkJICAgIHht
bGxpYi5weQppaG9va3MucHkJICAgICBzY2hlZC5weWMJCSAgICB4bWxsaWIucHljCmlob29rcy5w
eWMJICAgICBzY2hlZC5weW8JCSAgICB4bWxsaWIucHlvCmlob29rcy5weW8JICAgICBzZXRzLnB5
CQkgICAgeG1scnBjbGliLnB5CmltYXBsaWIucHkJICAgICBzZXRzLnB5YwkJICAgIHhtbHJwY2xp
Yi5weWMKaW1hcGxpYi5weWMJICAgICBzZXRzLnB5bwkJICAgIHhtbHJwY2xpYi5weW8KaW1hcGxp
Yi5weW8JICAgICBzZ21sbGliLnB5CQkgICAgemlwZmlsZS5weQppbWdoZHIucHkJICAgICBzZ21s
bGliLnB5YwkgICAgemlwZmlsZS5weWMKaW1naGRyLnB5YwkgICAgIHNnbWxsaWIucHlvCSAgICB6
aXBmaWxlLnB5bwppbWdoZHIucHlvCSAgICAgc2hlbHZlLnB5CgouL3Rvb2xzL2FybV9weXRob24v
Y3Jvc3NfY29tcGlsZWQvbGliL3B5dGhvbjIuNC9ic2RkYjoKZGJvYmoucHkgICBkYi5weWMJZGJy
ZWNpby5weW8gICBkYnRhYmxlcy5weSAgIGRidXRpbHMucHljICAgX19pbml0X18ucHlvCmRib2Jq
LnB5YyAgZGIucHlvCWRic2hlbHZlLnB5ICAgZGJ0YWJsZXMucHljICBkYnV0aWxzLnB5byAgIHRl
c3QKZGJvYmoucHlvICBkYnJlY2lvLnB5CWRic2hlbHZlLnB5YyAgZGJ0YWJsZXMucHlvICBfX2lu
aXRfXy5weQpkYi5weQkgICBkYnJlY2lvLnB5YwlkYnNoZWx2ZS5weW8gIGRidXRpbHMucHkgICAg
X19pbml0X18ucHljCgouL3Rvb2xzL2FybV9weXRob24vY3Jvc3NfY29tcGlsZWQvbGliL3B5dGhv
bjIuNC9ic2RkYi90ZXN0OgpfX2luaXRfXy5weQkgICAgdGVzdF9iYXNpY3MucHljICAgIHRlc3Rf
ZGJ0YWJsZXMucHlvICAgdGVzdF9taXNjLnB5Cl9faW5pdF9fLnB5YwkgICAgdGVzdF9iYXNpY3Mu
cHlvICAgIHRlc3RfZW52X2Nsb3NlLnB5ICAgdGVzdF9taXNjLnB5YwpfX2luaXRfXy5weW8JICAg
IHRlc3RfY29tcGF0LnB5ICAgICB0ZXN0X2Vudl9jbG9zZS5weWMgIHRlc3RfbWlzYy5weW8KdGVz
dF8xNDEzMTkyLnB5ICAgICB0ZXN0X2NvbXBhdC5weWMgICAgdGVzdF9lbnZfY2xvc2UucHlvICB0
ZXN0X3F1ZXVlLnB5CnRlc3RfMTQxMzE5Mi5weWMgICAgdGVzdF9jb21wYXQucHlvICAgIHRlc3Rf
Z2V0X25vbmUucHkgICAgdGVzdF9xdWV1ZS5weWMKdGVzdF8xNDEzMTkyLnB5byAgICB0ZXN0X2Ri
b2JqLnB5ICAgICAgdGVzdF9nZXRfbm9uZS5weWMgICB0ZXN0X3F1ZXVlLnB5bwp0ZXN0X2FsbC5w
eQkgICAgdGVzdF9kYm9iai5weWMgICAgIHRlc3RfZ2V0X25vbmUucHlvICAgdGVzdF9yZWNuby5w
eQp0ZXN0X2FsbC5weWMJICAgIHRlc3RfZGJvYmoucHlvICAgICB0ZXN0X2pvaW4ucHkJICAgdGVz
dF9yZWNuby5weWMKdGVzdF9hbGwucHlvCSAgICB0ZXN0X2Ric2hlbHZlLnB5ICAgdGVzdF9qb2lu
LnB5YwkgICB0ZXN0X3JlY25vLnB5bwp0ZXN0X2Fzc29jaWF0ZS5weSAgIHRlc3RfZGJzaGVsdmUu
cHljICB0ZXN0X2pvaW4ucHlvCSAgIHRlc3RfdGhyZWFkLnB5CnRlc3RfYXNzb2NpYXRlLnB5YyAg
dGVzdF9kYnNoZWx2ZS5weW8gIHRlc3RfbG9jay5weQkgICB0ZXN0X3RocmVhZC5weWMKdGVzdF9h
c3NvY2lhdGUucHlvICB0ZXN0X2RidGFibGVzLnB5ICAgdGVzdF9sb2NrLnB5YwkgICB0ZXN0X3Ro
cmVhZC5weW8KdGVzdF9iYXNpY3MucHkJICAgIHRlc3RfZGJ0YWJsZXMucHljICB0ZXN0X2xvY2su
cHlvCgouL3Rvb2xzL2FybV9weXRob24vY3Jvc3NfY29tcGlsZWQvbGliL3B5dGhvbjIuNC9jb21w
aWxlcjoKYXN0LnB5CSAgICBmdXR1cmUucHljCSAgbWlzYy5weW8JIHN5bWJvbHMucHkJIHRyYW5z
Zm9ybWVyLnB5Ywphc3QucHljICAgICBmdXR1cmUucHlvCSAgcHlhc3NlbS5weQkgc3ltYm9scy5w
eWMJIHRyYW5zZm9ybWVyLnB5bwphc3QucHlvICAgICBfX2luaXRfXy5weSAgIHB5YXNzZW0ucHlj
CSBzeW1ib2xzLnB5bwkgdmlzaXRvci5weQpjb25zdHMucHkgICBfX2luaXRfXy5weWMgIHB5YXNz
ZW0ucHlvCSBzeW50YXgucHkJIHZpc2l0b3IucHljCmNvbnN0cy5weWMgIF9faW5pdF9fLnB5byAg
cHljb2RlZ2VuLnB5CSBzeW50YXgucHljCSB2aXNpdG9yLnB5bwpjb25zdHMucHlvICBtaXNjLnB5
CSAgcHljb2RlZ2VuLnB5YyAgc3ludGF4LnB5bwpmdXR1cmUucHkgICBtaXNjLnB5YwkgIHB5Y29k
ZWdlbi5weW8gIHRyYW5zZm9ybWVyLnB5CgouL3Rvb2xzL2FybV9weXRob24vY3Jvc3NfY29tcGls
ZWQvbGliL3B5dGhvbjIuNC9jb25maWc6CmNvbmZpZy5jICAgICBpbnN0YWxsLXNoICAgICAgTWFr
ZWZpbGUJcHl0aG9uLm8gIFNldHVwLmNvbmZpZwpjb25maWcuYy5pbiAgbGlicHl0aG9uMi40LmEg
IG1ha2VzZXR1cAlTZXR1cAkgIFNldHVwLmxvY2FsCgouL3Rvb2xzL2FybV9weXRob24vY3Jvc3Nf
Y29tcGlsZWQvbGliL3B5dGhvbjIuNC9jdXJzZXM6CmFzY2lpLnB5ICAgaGFzX2tleS5weQlfX2lu
aXRfXy5weSAgIHBhbmVsLnB5CSB0ZXh0cGFkLnB5ICAgd3JhcHBlci5weQphc2NpaS5weWMgIGhh
c19rZXkucHljCV9faW5pdF9fLnB5YyAgcGFuZWwucHljICB0ZXh0cGFkLnB5YyAgd3JhcHBlci5w
eWMKYXNjaWkucHlvICBoYXNfa2V5LnB5bwlfX2luaXRfXy5weW8gIHBhbmVsLnB5byAgdGV4dHBh
ZC5weW8gIHdyYXBwZXIucHlvCgouL3Rvb2xzL2FybV9weXRob24vY3Jvc3NfY29tcGlsZWQvbGli
L3B5dGhvbjIuNC9kaXN0dXRpbHM6CmFyY2hpdmVfdXRpbC5weSAgICAgIGRlYnVnLnB5bwkgICAg
ICAgZmFuY3lfZ2V0b3B0LnB5byAgICBzcGF3bi5weWMKYXJjaGl2ZV91dGlsLnB5YyAgICAgZGVw
X3V0aWwucHkgICAgICAgZmlsZWxpc3QucHkJICAgc3Bhd24ucHlvCmFyY2hpdmVfdXRpbC5weW8g
ICAgIGRlcF91dGlsLnB5YyAgICAgIGZpbGVsaXN0LnB5YwkgICBzeXNjb25maWcucHkKYmNwcGNv
bXBpbGVyLnB5ICAgICAgZGVwX3V0aWwucHlvICAgICAgZmlsZWxpc3QucHlvCSAgIHN5c2NvbmZp
Zy5weWMKYmNwcGNvbXBpbGVyLnB5YyAgICAgZGlyX3V0aWwucHkgICAgICAgZmlsZV91dGlsLnB5
CSAgIHN5c2NvbmZpZy5weW8KYmNwcGNvbXBpbGVyLnB5byAgICAgZGlyX3V0aWwucHljICAgICAg
ZmlsZV91dGlsLnB5YwkgICB0ZXN0cwpjY29tcGlsZXIucHkJICAgICBkaXJfdXRpbC5weW8gICAg
ICBmaWxlX3V0aWwucHlvCSAgIHRleHRfZmlsZS5weQpjY29tcGlsZXIucHljCSAgICAgZGlzdC5w
eQkgICAgICAgX19pbml0X18ucHkJICAgdGV4dF9maWxlLnB5YwpjY29tcGlsZXIucHlvCSAgICAg
ZGlzdC5weWMJICAgICAgIF9faW5pdF9fLnB5YwkgICB0ZXh0X2ZpbGUucHlvCmNtZC5weQkJICAg
ICBkaXN0LnB5bwkgICAgICAgX19pbml0X18ucHlvCSAgIHVuaXhjY29tcGlsZXIucHkKY21kLnB5
YwkJICAgICBlbXhjY29tcGlsZXIucHkgICBsb2cucHkJCSAgIHVuaXhjY29tcGlsZXIucHljCmNt
ZC5weW8JCSAgICAgZW14Y2NvbXBpbGVyLnB5YyAgbG9nLnB5YwkJICAgdW5peGNjb21waWxlci5w
eW8KY29tbWFuZAkJICAgICBlbXhjY29tcGlsZXIucHlvICBsb2cucHlvCQkgICB1dGlsLnB5CmNv
cmUucHkJCSAgICAgZXJyb3JzLnB5CSAgICAgICBtc3ZjY29tcGlsZXIucHkJICAgdXRpbC5weWMK
Y29yZS5weWMJICAgICBlcnJvcnMucHljICAgICAgICBtc3ZjY29tcGlsZXIucHljICAgIHV0aWwu
cHlvCmNvcmUucHlvCSAgICAgZXJyb3JzLnB5byAgICAgICAgbXN2Y2NvbXBpbGVyLnB5byAgICB2
ZXJzaW9uLnB5CmN5Z3dpbmNjb21waWxlci5weSAgIGV4dGVuc2lvbi5weSAgICAgIG13ZXJrc2Nv
bXBpbGVyLnB5ICAgdmVyc2lvbi5weWMKY3lnd2luY2NvbXBpbGVyLnB5YyAgZXh0ZW5zaW9uLnB5
YyAgICAgbXdlcmtzY29tcGlsZXIucHljICB2ZXJzaW9uLnB5bwpjeWd3aW5jY29tcGlsZXIucHlv
ICBleHRlbnNpb24ucHlvICAgICBtd2Vya3Njb21waWxlci5weW8KZGVidWcucHkJICAgICBmYW5j
eV9nZXRvcHQucHkgICBSRUFETUUKZGVidWcucHljCSAgICAgZmFuY3lfZ2V0b3B0LnB5YyAgc3Bh
d24ucHkKCi4vdG9vbHMvYXJtX3B5dGhvbi9jcm9zc19jb21waWxlZC9saWIvcHl0aG9uMi40L2Rp
c3R1dGlscy9jb21tYW5kOgpiZGlzdF9kdW1iLnB5CSAgIGJ1aWxkX2V4dC5weSAgICAgICBjb21t
YW5kX3RlbXBsYXRlCSAgIGluc3RhbGxfbGliLnB5bwpiZGlzdF9kdW1iLnB5YwkgICBidWlsZF9l
eHQucHljICAgICAgY29uZmlnLnB5CQkgICBpbnN0YWxsLnB5CmJkaXN0X2R1bWIucHlvCSAgIGJ1
aWxkX2V4dC5weW8gICAgICBjb25maWcucHljCSAgIGluc3RhbGwucHljCmJkaXN0LnB5CSAgIGJ1
aWxkLnB5CSAgICAgIGNvbmZpZy5weW8JICAgaW5zdGFsbC5weW8KYmRpc3QucHljCSAgIGJ1aWxk
LnB5YwkgICAgICBfX2luaXRfXy5weQkgICBpbnN0YWxsX3NjcmlwdHMucHkKYmRpc3QucHlvCSAg
IGJ1aWxkLnB5bwkgICAgICBfX2luaXRfXy5weWMJICAgaW5zdGFsbF9zY3JpcHRzLnB5YwpiZGlz
dF9ycG0ucHkJICAgYnVpbGRfcHkucHkJICAgICAgX19pbml0X18ucHlvCSAgIGluc3RhbGxfc2Ny
aXB0cy5weW8KYmRpc3RfcnBtLnB5YwkgICBidWlsZF9weS5weWMgICAgICAgaW5zdGFsbF9kYXRh
LnB5CSAgIHJlZ2lzdGVyLnB5CmJkaXN0X3JwbS5weW8JICAgYnVpbGRfcHkucHlvICAgICAgIGlu
c3RhbGxfZGF0YS5weWMJICAgcmVnaXN0ZXIucHljCmJkaXN0X3dpbmluc3QucHkgICBidWlsZF9z
Y3JpcHRzLnB5ICAgaW5zdGFsbF9kYXRhLnB5bwkgICByZWdpc3Rlci5weW8KYmRpc3Rfd2luaW5z
dC5weWMgIGJ1aWxkX3NjcmlwdHMucHljICBpbnN0YWxsX2hlYWRlcnMucHkgICBzZGlzdC5weQpi
ZGlzdF93aW5pbnN0LnB5byAgYnVpbGRfc2NyaXB0cy5weW8gIGluc3RhbGxfaGVhZGVycy5weWMg
IHNkaXN0LnB5YwpidWlsZF9jbGliLnB5CSAgIGNsZWFuLnB5CSAgICAgIGluc3RhbGxfaGVhZGVy
cy5weW8gIHNkaXN0LnB5bwpidWlsZF9jbGliLnB5YwkgICBjbGVhbi5weWMJICAgICAgaW5zdGFs
bF9saWIucHkJICAgd2luaW5zdC02LmV4ZQpidWlsZF9jbGliLnB5bwkgICBjbGVhbi5weW8JICAg
ICAgaW5zdGFsbF9saWIucHljCSAgIHdpbmluc3QtNy4xLmV4ZQoKLi90b29scy9hcm1fcHl0aG9u
L2Nyb3NzX2NvbXBpbGVkL2xpYi9weXRob24yLjQvZGlzdHV0aWxzL3Rlc3RzOgpfX2luaXRfXy5w
eQkgIHRlc3RfYnVpbGRfcHkucHljCSAgdGVzdF9kaXN0LnB5bwpfX2luaXRfXy5weWMJICB0ZXN0
X2J1aWxkX3B5LnB5bwkgIHRlc3RfaW5zdGFsbC5weQpfX2luaXRfXy5weW8JICB0ZXN0X2J1aWxk
X3NjcmlwdHMucHkgICB0ZXN0X2luc3RhbGwucHljCnN1cHBvcnQucHkJICB0ZXN0X2J1aWxkX3Nj
cmlwdHMucHljICB0ZXN0X2luc3RhbGwucHlvCnN1cHBvcnQucHljCSAgdGVzdF9idWlsZF9zY3Jp
cHRzLnB5byAgdGVzdF9pbnN0YWxsX3NjcmlwdHMucHkKc3VwcG9ydC5weW8JICB0ZXN0X2Rpc3Qu
cHkJCSAgdGVzdF9pbnN0YWxsX3NjcmlwdHMucHljCnRlc3RfYnVpbGRfcHkucHkgIHRlc3RfZGlz
dC5weWMJCSAgdGVzdF9pbnN0YWxsX3NjcmlwdHMucHlvCgouL3Rvb2xzL2FybV9weXRob24vY3Jv
c3NfY29tcGlsZWQvbGliL3B5dGhvbjIuNC9lbWFpbDoKYmFzZTY0TUlNRS5weQlHZW5lcmF0b3Iu
cHljICBNSU1FQXVkaW8ucHlvCSAgICAgTUlNRVRleHQucHkKYmFzZTY0TUlNRS5weWMJR2VuZXJh
dG9yLnB5byAgTUlNRUJhc2UucHkJICAgICBNSU1FVGV4dC5weWMKYmFzZTY0TUlNRS5weW8JSGVh
ZGVyLnB5ICAgICAgTUlNRUJhc2UucHljCSAgICAgTUlNRVRleHQucHlvCkNoYXJzZXQucHkJSGVh
ZGVyLnB5YyAgICAgTUlNRUJhc2UucHlvCSAgICAgX3BhcnNlYWRkci5weQpDaGFyc2V0LnB5YwlI
ZWFkZXIucHlvICAgICBNSU1FSW1hZ2UucHkJICAgICBfcGFyc2VhZGRyLnB5YwpDaGFyc2V0LnB5
bwlfX2luaXRfXy5weSAgICBNSU1FSW1hZ2UucHljCSAgICAgX3BhcnNlYWRkci5weW8KRW5jb2Rl
cnMucHkJX19pbml0X18ucHljICAgTUlNRUltYWdlLnB5bwkgICAgIFBhcnNlci5weQpFbmNvZGVy
cy5weWMJX19pbml0X18ucHlvICAgTUlNRU1lc3NhZ2UucHkJICAgICBQYXJzZXIucHljCkVuY29k
ZXJzLnB5bwlJdGVyYXRvcnMucHkgICBNSU1FTWVzc2FnZS5weWMJICAgICBQYXJzZXIucHlvCkVy
cm9ycy5weQlJdGVyYXRvcnMucHljICBNSU1FTWVzc2FnZS5weW8JICAgICBxdW9wcmlNSU1FLnB5
CkVycm9ycy5weWMJSXRlcmF0b3JzLnB5byAgTUlNRU11bHRpcGFydC5weSAgICAgIHF1b3ByaU1J
TUUucHljCkVycm9ycy5weW8JTWVzc2FnZS5weSAgICAgTUlNRU11bHRpcGFydC5weWMgICAgIHF1
b3ByaU1JTUUucHlvCkZlZWRQYXJzZXIucHkJTWVzc2FnZS5weWMgICAgTUlNRU11bHRpcGFydC5w
eW8gICAgIHRlc3QKRmVlZFBhcnNlci5weWMJTWVzc2FnZS5weW8gICAgTUlNRU5vbk11bHRpcGFy
dC5weSAgIFV0aWxzLnB5CkZlZWRQYXJzZXIucHlvCU1JTUVBdWRpby5weSAgIE1JTUVOb25NdWx0
aXBhcnQucHljICBVdGlscy5weWMKR2VuZXJhdG9yLnB5CU1JTUVBdWRpby5weWMgIE1JTUVOb25N
dWx0aXBhcnQucHlvICBVdGlscy5weW8KCi4vdG9vbHMvYXJtX3B5dGhvbi9jcm9zc19jb21waWxl
ZC9saWIvcHl0aG9uMi40L2VtYWlsL3Rlc3Q6CmRhdGEJCSAgICAgIHRlc3RfZW1haWxfY29kZWNz
LnB5YyAgdGVzdF9lbWFpbF90b3J0dXJlLnB5Cl9faW5pdF9fLnB5CSAgICAgIHRlc3RfZW1haWxf
Y29kZWNzLnB5byAgdGVzdF9lbWFpbF90b3J0dXJlLnB5YwpfX2luaXRfXy5weWMJICAgICAgdGVz
dF9lbWFpbC5weQkgICAgIHRlc3RfZW1haWxfdG9ydHVyZS5weW8KX19pbml0X18ucHlvCSAgICAg
IHRlc3RfZW1haWwucHljCnRlc3RfZW1haWxfY29kZWNzLnB5ICB0ZXN0X2VtYWlsLnB5bwoKLi90
b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL2xpYi9weXRob24yLjQvZW1haWwvdGVzdC9k
YXRhOgphdWRpb3Rlc3QuYXUgIG1zZ18wOC50eHQgICBtc2dfMTUudHh0ICBtc2dfMjMudHh0ICBt
c2dfMzEudHh0ICBtc2dfMzkudHh0Cm1zZ18wMS50eHQgICAgbXNnXzA5LnR4dCAgIG1zZ18xNi50
eHQgIG1zZ18yNC50eHQgIG1zZ18zMi50eHQgIG1zZ180MC50eHQKbXNnXzAyLnR4dCAgICBtc2df
MTAudHh0ICAgbXNnXzE3LnR4dCAgbXNnXzI1LnR4dCAgbXNnXzMzLnR4dCAgbXNnXzQxLnR4dApt
c2dfMDMudHh0ICAgIG1zZ18xMS50eHQgICBtc2dfMTgudHh0ICBtc2dfMjYudHh0ICBtc2dfMzQu
dHh0ICBtc2dfNDIudHh0Cm1zZ18wNC50eHQgICAgbXNnXzEyYS50eHQgIG1zZ18xOS50eHQgIG1z
Z18yNy50eHQgIG1zZ18zNS50eHQgIG1zZ180My50eHQKbXNnXzA1LnR4dCAgICBtc2dfMTIudHh0
ICAgbXNnXzIwLnR4dCAgbXNnXzI4LnR4dCAgbXNnXzM2LnR4dCAgbXNnXzQ0LnR4dAptc2dfMDYu
dHh0ICAgIG1zZ18xMy50eHQgICBtc2dfMjEudHh0ICBtc2dfMjkudHh0ICBtc2dfMzcudHh0ICBQ
eUJhbm5lcjA0OC5naWYKbXNnXzA3LnR4dCAgICBtc2dfMTQudHh0ICAgbXNnXzIyLnR4dCAgbXNn
XzMwLnR4dCAgbXNnXzM4LnR4dAoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL2xp
Yi9weXRob24yLjQvZW5jb2RpbmdzOgphbGlhc2VzLnB5CSAgY3A4NTUucHljCSAgICBfX2luaXRf
Xy5weW8JIG1hY19ncmVlay5weQphbGlhc2VzLnB5YwkgIGNwODU1LnB5bwkgICAgaXNvMjAyMl9q
cF8xLnB5CSBtYWNfZ3JlZWsucHljCmFsaWFzZXMucHlvCSAgY3A4NTYucHkJICAgIGlzbzIwMjJf
anBfMS5weWMJIG1hY19ncmVlay5weW8KYXNjaWkucHkJICBjcDg1Ni5weWMJICAgIGlzbzIwMjJf
anBfMS5weW8JIG1hY19pY2VsYW5kLnB5CmFzY2lpLnB5YwkgIGNwODU2LnB5bwkgICAgaXNvMjAy
Ml9qcF8yMDA0LnB5CSBtYWNfaWNlbGFuZC5weWMKYXNjaWkucHlvCSAgY3A4NTcucHkJICAgIGlz
bzIwMjJfanBfMjAwNC5weWMgIG1hY19pY2VsYW5kLnB5bwpiYXNlNjRfY29kZWMucHkgICBjcDg1
Ny5weWMJICAgIGlzbzIwMjJfanBfMjAwNC5weW8gIG1hY19sYXRpbjIucHkKYmFzZTY0X2NvZGVj
LnB5YyAgY3A4NTcucHlvCSAgICBpc28yMDIyX2pwXzIucHkJIG1hY19sYXRpbjIucHljCmJhc2U2
NF9jb2RlYy5weW8gIGNwODYwLnB5CSAgICBpc28yMDIyX2pwXzIucHljCSBtYWNfbGF0aW4yLnB5
bwpiaWc1aGtzY3MucHkJICBjcDg2MC5weWMJICAgIGlzbzIwMjJfanBfMi5weW8JIG1hY19yb21h
bi5weQpiaWc1aGtzY3MucHljCSAgY3A4NjAucHlvCSAgICBpc28yMDIyX2pwXzMucHkJIG1hY19y
b21hbi5weWMKYmlnNWhrc2NzLnB5bwkgIGNwODYxLnB5CSAgICBpc28yMDIyX2pwXzMucHljCSBt
YWNfcm9tYW4ucHlvCmJpZzUucHkJCSAgY3A4NjEucHljCSAgICBpc28yMDIyX2pwXzMucHlvCSBt
YWNfdHVya2lzaC5weQpiaWc1LnB5YwkgIGNwODYxLnB5bwkgICAgaXNvMjAyMl9qcF9leHQucHkJ
IG1hY190dXJraXNoLnB5YwpiaWc1LnB5bwkgIGNwODYyLnB5CSAgICBpc28yMDIyX2pwX2V4dC5w
eWMJIG1hY190dXJraXNoLnB5bwpiejJfY29kZWMucHkJICBjcDg2Mi5weWMJICAgIGlzbzIwMjJf
anBfZXh0LnB5bwkgbWJjcy5weQpiejJfY29kZWMucHljCSAgY3A4NjIucHlvCSAgICBpc28yMDIy
X2pwLnB5CSBtYmNzLnB5YwpiejJfY29kZWMucHlvCSAgY3A4NjMucHkJICAgIGlzbzIwMjJfanAu
cHljCSBtYmNzLnB5bwpjaGFybWFwLnB5CSAgY3A4NjMucHljCSAgICBpc28yMDIyX2pwLnB5bwkg
cGFsbW9zLnB5CmNoYXJtYXAucHljCSAgY3A4NjMucHlvCSAgICBpc28yMDIyX2tyLnB5CSBwYWxt
b3MucHljCmNoYXJtYXAucHlvCSAgY3A4NjQucHkJICAgIGlzbzIwMjJfa3IucHljCSBwYWxtb3Mu
cHlvCmNwMDM3LnB5CSAgY3A4NjQucHljCSAgICBpc28yMDIyX2tyLnB5bwkgcHRjcDE1NC5weQpj
cDAzNy5weWMJICBjcDg2NC5weW8JICAgIGlzbzg4NTlfMTAucHkJIHB0Y3AxNTQucHljCmNwMDM3
LnB5bwkgIGNwODY1LnB5CSAgICBpc284ODU5XzEwLnB5YwkgcHRjcDE1NC5weW8KY3AxMDA2LnB5
CSAgY3A4NjUucHljCSAgICBpc284ODU5XzEwLnB5bwkgcHVueWNvZGUucHkKY3AxMDA2LnB5Ywkg
IGNwODY1LnB5bwkgICAgaXNvODg1OV8xMS5weQkgcHVueWNvZGUucHljCmNwMTAwNi5weW8JICBj
cDg2Ni5weQkgICAgaXNvODg1OV8xMS5weWMJIHB1bnljb2RlLnB5bwpjcDEwMjYucHkJICBjcDg2
Ni5weWMJICAgIGlzbzg4NTlfMTEucHlvCSBxdW9wcmlfY29kZWMucHkKY3AxMDI2LnB5YwkgIGNw
ODY2LnB5bwkgICAgaXNvODg1OV8xMy5weQkgcXVvcHJpX2NvZGVjLnB5YwpjcDEwMjYucHlvCSAg
Y3A4NjkucHkJICAgIGlzbzg4NTlfMTMucHljCSBxdW9wcmlfY29kZWMucHlvCmNwMTE0MC5weQkg
IGNwODY5LnB5YwkgICAgaXNvODg1OV8xMy5weW8JIHJhd191bmljb2RlX2VzY2FwZS5weQpjcDEx
NDAucHljCSAgY3A4NjkucHlvCSAgICBpc284ODU5XzE0LnB5CSByYXdfdW5pY29kZV9lc2NhcGUu
cHljCmNwMTE0MC5weW8JICBjcDg3NC5weQkgICAgaXNvODg1OV8xNC5weWMJIHJhd191bmljb2Rl
X2VzY2FwZS5weW8KY3AxMjUwLnB5CSAgY3A4NzQucHljCSAgICBpc284ODU5XzE0LnB5bwkgcm90
XzEzLnB5CmNwMTI1MC5weWMJICBjcDg3NC5weW8JICAgIGlzbzg4NTlfMTUucHkJIHJvdF8xMy5w
eWMKY3AxMjUwLnB5bwkgIGNwODc1LnB5CSAgICBpc284ODU5XzE1LnB5Ywkgcm90XzEzLnB5bwpj
cDEyNTEucHkJICBjcDg3NS5weWMJICAgIGlzbzg4NTlfMTUucHlvCSBzaGlmdF9qaXNfMjAwNC5w
eQpjcDEyNTEucHljCSAgY3A4NzUucHlvCSAgICBpc284ODU5XzE2LnB5CSBzaGlmdF9qaXNfMjAw
NC5weWMKY3AxMjUxLnB5bwkgIGNwOTMyLnB5CSAgICBpc284ODU5XzE2LnB5Ywkgc2hpZnRfamlz
XzIwMDQucHlvCmNwMTI1Mi5weQkgIGNwOTMyLnB5YwkgICAgaXNvODg1OV8xNi5weW8JIHNoaWZ0
X2ppcy5weQpjcDEyNTIucHljCSAgY3A5MzIucHlvCSAgICBpc284ODU5XzEucHkJIHNoaWZ0X2pp
cy5weWMKY3AxMjUyLnB5bwkgIGNwOTQ5LnB5CSAgICBpc284ODU5XzEucHljCSBzaGlmdF9qaXMu
cHlvCmNwMTI1My5weQkgIGNwOTQ5LnB5YwkgICAgaXNvODg1OV8xLnB5bwkgc2hpZnRfamlzeDAy
MTMucHkKY3AxMjUzLnB5YwkgIGNwOTQ5LnB5bwkgICAgaXNvODg1OV8yLnB5CSBzaGlmdF9qaXN4
MDIxMy5weWMKY3AxMjUzLnB5bwkgIGNwOTUwLnB5CSAgICBpc284ODU5XzIucHljCSBzaGlmdF9q
aXN4MDIxMy5weW8KY3AxMjU0LnB5CSAgY3A5NTAucHljCSAgICBpc284ODU5XzIucHlvCSBzdHJp
bmdfZXNjYXBlLnB5CmNwMTI1NC5weWMJICBjcDk1MC5weW8JICAgIGlzbzg4NTlfMy5weQkgc3Ry
aW5nX2VzY2FwZS5weWMKY3AxMjU0LnB5bwkgIGV1Y19qaXNfMjAwNC5weSAgIGlzbzg4NTlfMy5w
eWMJIHN0cmluZ19lc2NhcGUucHlvCmNwMTI1NS5weQkgIGV1Y19qaXNfMjAwNC5weWMgIGlzbzg4
NTlfMy5weW8JIHRpc182MjAucHkKY3AxMjU1LnB5YwkgIGV1Y19qaXNfMjAwNC5weW8gIGlzbzg4
NTlfNC5weQkgdGlzXzYyMC5weWMKY3AxMjU1LnB5bwkgIGV1Y19qaXN4MDIxMy5weSAgIGlzbzg4
NTlfNC5weWMJIHRpc182MjAucHlvCmNwMTI1Ni5weQkgIGV1Y19qaXN4MDIxMy5weWMgIGlzbzg4
NTlfNC5weW8JIHVuZGVmaW5lZC5weQpjcDEyNTYucHljCSAgZXVjX2ppc3gwMjEzLnB5byAgaXNv
ODg1OV81LnB5CSB1bmRlZmluZWQucHljCmNwMTI1Ni5weW8JICBldWNfanAucHkJICAgIGlzbzg4
NTlfNS5weWMJIHVuZGVmaW5lZC5weW8KY3AxMjU3LnB5CSAgZXVjX2pwLnB5YwkgICAgaXNvODg1
OV81LnB5bwkgdW5pY29kZV9lc2NhcGUucHkKY3AxMjU3LnB5YwkgIGV1Y19qcC5weW8JICAgIGlz
bzg4NTlfNi5weQkgdW5pY29kZV9lc2NhcGUucHljCmNwMTI1Ny5weW8JICBldWNfa3IucHkJICAg
IGlzbzg4NTlfNi5weWMJIHVuaWNvZGVfZXNjYXBlLnB5bwpjcDEyNTgucHkJICBldWNfa3IucHlj
CSAgICBpc284ODU5XzYucHlvCSB1bmljb2RlX2ludGVybmFsLnB5CmNwMTI1OC5weWMJICBldWNf
a3IucHlvCSAgICBpc284ODU5XzcucHkJIHVuaWNvZGVfaW50ZXJuYWwucHljCmNwMTI1OC5weW8J
ICBnYjE4MDMwLnB5CSAgICBpc284ODU5XzcucHljCSB1bmljb2RlX2ludGVybmFsLnB5bwpjcDQy
NC5weQkgIGdiMTgwMzAucHljCSAgICBpc284ODU5XzcucHlvCSB1dGZfMTZfYmUucHkKY3A0MjQu
cHljCSAgZ2IxODAzMC5weW8JICAgIGlzbzg4NTlfOC5weQkgdXRmXzE2X2JlLnB5YwpjcDQyNC5w
eW8JICBnYjIzMTIucHkJICAgIGlzbzg4NTlfOC5weWMJIHV0Zl8xNl9iZS5weW8KY3A0MzcucHkJ
ICBnYjIzMTIucHljCSAgICBpc284ODU5XzgucHlvCSB1dGZfMTZfbGUucHkKY3A0MzcucHljCSAg
Z2IyMzEyLnB5bwkgICAgaXNvODg1OV85LnB5CSB1dGZfMTZfbGUucHljCmNwNDM3LnB5bwkgIGdi
ay5weQkgICAgaXNvODg1OV85LnB5YwkgdXRmXzE2X2xlLnB5bwpjcDUwMC5weQkgIGdiay5weWMJ
ICAgIGlzbzg4NTlfOS5weW8JIHV0Zl8xNi5weQpjcDUwMC5weWMJICBnYmsucHlvCSAgICBqb2hh
Yi5weQkJIHV0Zl8xNi5weWMKY3A1MDAucHlvCSAgaGV4X2NvZGVjLnB5CSAgICBqb2hhYi5weWMJ
CSB1dGZfMTYucHlvCmNwNzM3LnB5CSAgaGV4X2NvZGVjLnB5YyAgICAgam9oYWIucHlvCQkgdXRm
XzcucHkKY3A3MzcucHljCSAgaGV4X2NvZGVjLnB5byAgICAga29pOF9yLnB5CQkgdXRmXzcucHlj
CmNwNzM3LnB5bwkgIGhwX3JvbWFuOC5weQkgICAga29pOF9yLnB5YwkJIHV0Zl83LnB5bwpjcDc3
NS5weQkgIGhwX3JvbWFuOC5weWMgICAgIGtvaThfci5weW8JCSB1dGZfOC5weQpjcDc3NS5weWMJ
ICBocF9yb21hbjgucHlvICAgICBrb2k4X3UucHkJCSB1dGZfOC5weWMKY3A3NzUucHlvCSAgaHou
cHkJCSAgICBrb2k4X3UucHljCQkgdXRmXzgucHlvCmNwODUwLnB5CSAgaHoucHljCSAgICBrb2k4
X3UucHlvCQkgdXVfY29kZWMucHkKY3A4NTAucHljCSAgaHoucHlvCSAgICBsYXRpbl8xLnB5CQkg
dXVfY29kZWMucHljCmNwODUwLnB5bwkgIGlkbmEucHkJICAgIGxhdGluXzEucHljCQkgdXVfY29k
ZWMucHlvCmNwODUyLnB5CSAgaWRuYS5weWMJICAgIGxhdGluXzEucHlvCQkgemxpYl9jb2RlYy5w
eQpjcDg1Mi5weWMJICBpZG5hLnB5bwkgICAgbWFjX2N5cmlsbGljLnB5CSB6bGliX2NvZGVjLnB5
YwpjcDg1Mi5weW8JICBfX2luaXRfXy5weQkgICAgbWFjX2N5cmlsbGljLnB5YwkgemxpYl9jb2Rl
Yy5weW8KY3A4NTUucHkJICBfX2luaXRfXy5weWMJICAgIG1hY19jeXJpbGxpYy5weW8KCi4vdG9v
bHMvYXJtX3B5dGhvbi9jcm9zc19jb21waWxlZC9saWIvcHl0aG9uMi40L2hvdHNob3Q6Cl9faW5p
dF9fLnB5ICAgX19pbml0X18ucHlvICBsb2cucHljICBzdGF0cy5weQlzdGF0cy5weW8gIHN0b25l
cy5weWMKX19pbml0X18ucHljICBsb2cucHkJICAgIGxvZy5weW8gIHN0YXRzLnB5YwlzdG9uZXMu
cHkgIHN0b25lcy5weW8KCi4vdG9vbHMvYXJtX3B5dGhvbi9jcm9zc19jb21waWxlZC9saWIvcHl0
aG9uMi40L2lkbGVsaWI6CmFib3V0RGlhbG9nLnB5CQkgICAgIEZpbGVMaXN0LnB5YwkgICBSZW1v
dGVEZWJ1Z2dlci5weW8KYWJvdXREaWFsb2cucHljCQkgICAgIEZpbGVMaXN0LnB5bwkgICBSZW1v
dGVPYmplY3RCcm93c2VyLnB5CmFib3V0RGlhbG9nLnB5bwkJICAgICBGb3JtYXRQYXJhZ3JhcGgu
cHkgICAgUmVtb3RlT2JqZWN0QnJvd3Nlci5weWMKQXV0b0V4cGFuZC5weQkJICAgICBGb3JtYXRQ
YXJhZ3JhcGgucHljICAgUmVtb3RlT2JqZWN0QnJvd3Nlci5weW8KQXV0b0V4cGFuZC5weWMJCSAg
ICAgRm9ybWF0UGFyYWdyYXBoLnB5byAgIFJlcGxhY2VEaWFsb2cucHkKQXV0b0V4cGFuZC5weW8J
CSAgICAgR3JlcERpYWxvZy5weQkgICBSZXBsYWNlRGlhbG9nLnB5YwpCaW5kaW5ncy5weQkJICAg
ICBHcmVwRGlhbG9nLnB5YwkgICBSZXBsYWNlRGlhbG9nLnB5bwpCaW5kaW5ncy5weWMJCSAgICAg
R3JlcERpYWxvZy5weW8JICAgcnBjLnB5CkJpbmRpbmdzLnB5bwkJICAgICBoZWxwLnR4dAkJICAg
cnBjLnB5YwpidWlsZGFwcC5weQkJICAgICBISVNUT1JZLnR4dAkgICBycGMucHlvCmJ1aWxkYXBw
LnB5YwkJICAgICBJY29ucwkJICAgcnVuLnB5CmJ1aWxkYXBwLnB5bwkJICAgICBpZGxlLmJhdAkJ
ICAgcnVuLnB5YwpDYWxsVGlwcy5weQkJICAgICBJZGxlSGlzdG9yeS5weQkgICBydW4ucHlvCkNh
bGxUaXBzLnB5YwkJICAgICBJZGxlSGlzdG9yeS5weWMJICAgU2NyaXB0QmluZGluZy5weQpDYWxs
VGlwcy5weW8JCSAgICAgSWRsZUhpc3RvcnkucHlvCSAgIFNjcmlwdEJpbmRpbmcucHljCkNhbGxU
aXBXaW5kb3cucHkJICAgICBpZGxlLnB5CQkgICBTY3JpcHRCaW5kaW5nLnB5bwpDYWxsVGlwV2lu
ZG93LnB5YwkgICAgIGlkbGUucHljCQkgICBTY3JvbGxlZExpc3QucHkKQ2FsbFRpcFdpbmRvdy5w
eW8JICAgICBpZGxlLnB5bwkJICAgU2Nyb2xsZWRMaXN0LnB5YwpDaGFuZ2VMb2cJCSAgICAgaWRs
ZS5weXcJCSAgIFNjcm9sbGVkTGlzdC5weW8KQ2xhc3NCcm93c2VyLnB5CQkgICAgIGlkbGV2ZXIu
cHkJCSAgIFNlYXJjaERpYWxvZ0Jhc2UucHkKQ2xhc3NCcm93c2VyLnB5YwkgICAgIGlkbGV2ZXIu
cHljCSAgIFNlYXJjaERpYWxvZ0Jhc2UucHljCkNsYXNzQnJvd3Nlci5weW8JICAgICBpZGxldmVy
LnB5bwkgICBTZWFyY2hEaWFsb2dCYXNlLnB5bwpDb2RlQ29udGV4dC5weQkJICAgICBfX2luaXRf
Xy5weQkgICBTZWFyY2hEaWFsb2cucHkKQ29kZUNvbnRleHQucHljCQkgICAgIF9faW5pdF9fLnB5
YwkgICBTZWFyY2hEaWFsb2cucHljCkNvZGVDb250ZXh0LnB5bwkJICAgICBfX2luaXRfXy5weW8J
ICAgU2VhcmNoRGlhbG9nLnB5bwpDb2xvckRlbGVnYXRvci5weQkgICAgIElPQmluZGluZy5weQkg
ICBTZWFyY2hFbmdpbmUucHkKQ29sb3JEZWxlZ2F0b3IucHljCSAgICAgSU9CaW5kaW5nLnB5Ywkg
ICBTZWFyY2hFbmdpbmUucHljCkNvbG9yRGVsZWdhdG9yLnB5bwkgICAgIElPQmluZGluZy5weW8J
ICAgU2VhcmNoRW5naW5lLnB5bwpjb25maWdEaWFsb2cucHkJCSAgICAga2V5YmluZGluZ0RpYWxv
Zy5weSAgIFN0YWNrVmlld2VyLnB5CmNvbmZpZ0RpYWxvZy5weWMJICAgICBrZXliaW5kaW5nRGlh
bG9nLnB5YyAgU3RhY2tWaWV3ZXIucHljCmNvbmZpZ0RpYWxvZy5weW8JICAgICBrZXliaW5kaW5n
RGlhbG9nLnB5byAgU3RhY2tWaWV3ZXIucHlvCmNvbmZpZy1leHRlbnNpb25zLmRlZgkgICAgIE11
bHRpU3RhdHVzQmFyLnB5CSAgIHRhYnBhZ2UucHkKY29uZmlnSGFuZGxlci5weQkgICAgIE11bHRp
U3RhdHVzQmFyLnB5YyAgICB0YWJwYWdlLnB5Ywpjb25maWdIYW5kbGVyLnB5YwkgICAgIE11bHRp
U3RhdHVzQmFyLnB5byAgICB0YWJwYWdlLnB5bwpjb25maWdIYW5kbGVyLnB5bwkgICAgIE5FV1Mu
dHh0CQkgICB0ZXN0Y29kZS5weQpjb25maWdIZWxwU291cmNlRWRpdC5weSAgICAgIE9iamVjdEJy
b3dzZXIucHkJICAgdGVzdGNvZGUucHljCmNvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5YyAgICAgT2Jq
ZWN0QnJvd3Nlci5weWMJICAgdGVzdGNvZGUucHlvCmNvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5byAg
ICAgT2JqZWN0QnJvd3Nlci5weW8JICAgdGV4dFZpZXcucHkKY29uZmlnLWhpZ2hsaWdodC5kZWYJ
ICAgICBPdXRwdXRXaW5kb3cucHkJICAgdGV4dFZpZXcucHljCmNvbmZpZy1rZXlzLmRlZgkJICAg
ICBPdXRwdXRXaW5kb3cucHljCSAgIHRleHRWaWV3LnB5bwpjb25maWctbWFpbi5kZWYJCSAgICAg
T3V0cHV0V2luZG93LnB5bwkgICBUT0RPLnR4dApjb25maWdTZWN0aW9uTmFtZURpYWxvZy5weSAg
IFBhcmVuTWF0Y2gucHkJICAgVG9vbFRpcC5weQpjb25maWdTZWN0aW9uTmFtZURpYWxvZy5weWMg
IFBhcmVuTWF0Y2gucHljCSAgIFRvb2xUaXAucHljCmNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5
byAgUGFyZW5NYXRjaC5weW8JICAgVG9vbFRpcC5weW8KQ1JFRElUUy50eHQJCSAgICAgUGF0aEJy
b3dzZXIucHkJICAgVHJlZVdpZGdldC5weQpEZWJ1Z2dlci5weQkJICAgICBQYXRoQnJvd3Nlci5w
eWMJICAgVHJlZVdpZGdldC5weWMKRGVidWdnZXIucHljCQkgICAgIFBhdGhCcm93c2VyLnB5bwkg
ICBUcmVlV2lkZ2V0LnB5bwpEZWJ1Z2dlci5weW8JCSAgICAgUGVyY29sYXRvci5weQkgICBVbmRv
RGVsZWdhdG9yLnB5CkRlbGVnYXRvci5weQkJICAgICBQZXJjb2xhdG9yLnB5YwkgICBVbmRvRGVs
ZWdhdG9yLnB5YwpEZWxlZ2F0b3IucHljCQkgICAgIFBlcmNvbGF0b3IucHlvCSAgIFVuZG9EZWxl
Z2F0b3IucHlvCkRlbGVnYXRvci5weW8JCSAgICAgUHlQYXJzZS5weQkJICAgV2lkZ2V0UmVkaXJl
Y3Rvci5weQpkeW5PcHRpb25NZW51V2lkZ2V0LnB5CSAgICAgUHlQYXJzZS5weWMJICAgV2lkZ2V0
UmVkaXJlY3Rvci5weWMKZHluT3B0aW9uTWVudVdpZGdldC5weWMgICAgICBQeVBhcnNlLnB5bwkg
ICBXaWRnZXRSZWRpcmVjdG9yLnB5bwpkeW5PcHRpb25NZW51V2lkZ2V0LnB5byAgICAgIFB5U2hl
bGwucHkJCSAgIFdpbmRvd0xpc3QucHkKRWRpdG9yV2luZG93LnB5CQkgICAgIFB5U2hlbGwucHlj
CSAgIFdpbmRvd0xpc3QucHljCkVkaXRvcldpbmRvdy5weWMJICAgICBQeVNoZWxsLnB5bwkgICBX
aW5kb3dMaXN0LnB5bwpFZGl0b3JXaW5kb3cucHlvCSAgICAgUkVBRE1FLnR4dAkJICAgWm9vbUhl
aWdodC5weQpleHRlbmQudHh0CQkgICAgIFJlbW90ZURlYnVnZ2VyLnB5CSAgIFpvb21IZWlnaHQu
cHljCkZpbGVMaXN0LnB5CQkgICAgIFJlbW90ZURlYnVnZ2VyLnB5YyAgICBab29tSGVpZ2h0LnB5
bwoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL2xpYi9weXRob24yLjQvaWRsZWxp
Yi9JY29uczoKZm9sZGVyLmdpZiAgbWludXNub2RlLmdpZiAgIHBsdXNub2RlLmdpZiAgdGsuZ2lm
CmlkbGUuaWNucyAgIG9wZW5mb2xkZXIuZ2lmICBweXRob24uZ2lmCgouL3Rvb2xzL2FybV9weXRo
b24vY3Jvc3NfY29tcGlsZWQvbGliL3B5dGhvbjIuNC9saWItZHlubG9hZDoKYXVkaW9vcC5zbwkg
ICAgY3J5cHQuc28JICAgICAgX2xvY2FsZS5zbwkgIHJlc291cmNlLnNvCl9iaXNlY3Quc28JICAg
IGNTdHJpbmdJTy5zbyAgICAgIG1kNS5zbwkJICBzZWxlY3Quc28KX2NvZGVjc19jbi5zbwkgICAg
X2Nzdi5zbwkgICAgICBtbWFwLnNvCQkgIHNoYS5zbwpfY29kZWNzX2hrLnNvCSAgICBkYXRldGlt
ZS5zbyAgICAgICBfbXVsdGlieXRlY29kZWMuc28gIHN5c2xvZy5zbwpfY29kZWNzX2lzbzIwMjIu
c28gIGZjbnRsLnNvCSAgICAgIG5pcy5zbwkJICB0ZXJtaW9zLnNvCl9jb2RlY3NfanAuc28JICAg
IGdycC5zbwkgICAgICBvc3NhdWRpb2Rldi5zbwkgIHRpbWluZy5zbwpfY29kZWNzX2tyLnNvCSAg
ICBfaGVhcHEuc28JICAgICAgcGFyc2VyLnNvCl9jb2RlY3NfdHcuc28JICAgIF9ob3RzaG90LnNv
ICAgICAgIHB5ZXhwYXQuc28KY1BpY2tsZS5zbwkgICAgbGludXhhdWRpb2Rldi5zbyAgcmVnZXgu
c28KCi4vdG9vbHMvYXJtX3B5dGhvbi9jcm9zc19jb21waWxlZC9saWIvcHl0aG9uMi40L2xpYi1v
bGQ6CmFkZHBhY2sucHkgICAgY29kZWhhY2sucHljICBmaW5kLnB5bwkgIG5ld2Rpci5weQlQYXJh
LnB5YyAgdGIucHlvCmFkZHBhY2sucHljICAgY29kZWhhY2sucHlvICBmbXQucHkJICBuZXdkaXIu
cHljCVBhcmEucHlvICB1dGlsLnB5CmFkZHBhY2sucHlvICAgZGlyY21wLnB5ICAgICBmbXQucHlj
CSAgbmV3ZGlyLnB5bwlwb2x5LnB5ICAgdXRpbC5weWMKY21wY2FjaGUucHkgICBkaXJjbXAucHlj
ICAgIGZtdC5weW8JICBuaS5weQkJcG9seS5weWMgIHV0aWwucHlvCmNtcGNhY2hlLnB5YyAgZGly
Y21wLnB5byAgICBncmVwLnB5CSAgbmkucHljCXBvbHkucHlvICB3aGF0c291bmQucHkKY21wY2Fj
aGUucHlvICBkdW1wLnB5CSAgICBncmVwLnB5YwkgIG5pLnB5bwlyYW5kLnB5ICAgd2hhdHNvdW5k
LnB5YwpjbXAucHkJICAgICAgZHVtcC5weWMJICAgIGdyZXAucHlvCSAgcGFja21haWwucHkJcmFu
ZC5weWMgIHdoYXRzb3VuZC5weW8KY21wLnB5YyAgICAgICBkdW1wLnB5bwkgICAgbG9ja2ZpbGUu
cHkgICBwYWNrbWFpbC5weWMJcmFuZC5weW8gIHptb2QucHkKY21wLnB5byAgICAgICBmaW5kLnB5
CSAgICBsb2NrZmlsZS5weWMgIHBhY2ttYWlsLnB5bwl0Yi5weQkgIHptb2QucHljCmNvZGVoYWNr
LnB5ICAgZmluZC5weWMJICAgIGxvY2tmaWxlLnB5byAgUGFyYS5weQl0Yi5weWMJICB6bW9kLnB5
bwoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL2xpYi9weXRob24yLjQvbGliLXRr
OgpDYW52YXMucHkJIFNjcm9sbGVkVGV4dC5weWMgICAgdGtDb21tb25EaWFsb2cucHlvICBUa2lu
dGVyLnB5CkNhbnZhcy5weWMJIFNjcm9sbGVkVGV4dC5weW8gICAgVGtjb25zdGFudHMucHkJIFRr
aW50ZXIucHljCkNhbnZhcy5weW8JIFNpbXBsZURpYWxvZy5weSAgICAgVGtjb25zdGFudHMucHlj
CSBUa2ludGVyLnB5bwpEaWFsb2cucHkJIFNpbXBsZURpYWxvZy5weWMgICAgVGtjb25zdGFudHMu
cHlvCSB0a01lc3NhZ2VCb3gucHkKRGlhbG9nLnB5YwkgU2ltcGxlRGlhbG9nLnB5byAgICBUa2Ru
ZC5weQkJIHRrTWVzc2FnZUJveC5weWMKRGlhbG9nLnB5bwkgVGl4LnB5CQkgICAgIFRrZG5kLnB5
YwkJIHRrTWVzc2FnZUJveC5weW8KRmlsZURpYWxvZy5weQkgVGl4LnB5YwkgICAgIFRrZG5kLnB5
bwkJIHRrU2ltcGxlRGlhbG9nLnB5CkZpbGVEaWFsb2cucHljCSBUaXgucHlvCSAgICAgdGtGaWxl
RGlhbG9nLnB5CSB0a1NpbXBsZURpYWxvZy5weWMKRmlsZURpYWxvZy5weW8JIHRrQ29sb3JDaG9v
c2VyLnB5ICAgdGtGaWxlRGlhbG9nLnB5YwkgdGtTaW1wbGVEaWFsb2cucHlvCkZpeFRrLnB5CSB0
a0NvbG9yQ2hvb3Nlci5weWMgIHRrRmlsZURpYWxvZy5weW8JIHR1cnRsZS5weQpGaXhUay5weWMJ
IHRrQ29sb3JDaG9vc2VyLnB5byAgdGtGb250LnB5CQkgdHVydGxlLnB5YwpGaXhUay5weW8JIHRr
Q29tbW9uRGlhbG9nLnB5ICAgdGtGb250LnB5YwkJIHR1cnRsZS5weW8KU2Nyb2xsZWRUZXh0LnB5
ICB0a0NvbW1vbkRpYWxvZy5weWMgIHRrRm9udC5weW8KCi4vdG9vbHMvYXJtX3B5dGhvbi9jcm9z
c19jb21waWxlZC9saWIvcHl0aG9uMi40L2xvZ2dpbmc6CmNvbmZpZy5weSAgIGNvbmZpZy5weW8J
IGhhbmRsZXJzLnB5YyAgX19pbml0X18ucHkgICBfX2luaXRfXy5weW8KY29uZmlnLnB5YyAgaGFu
ZGxlcnMucHkgIGhhbmRsZXJzLnB5byAgX19pbml0X18ucHljCgouL3Rvb2xzL2FybV9weXRob24v
Y3Jvc3NfY29tcGlsZWQvbGliL3B5dGhvbjIuNC9wbGF0LWxpbnV4MjoKQ0RST00ucHkgICBDRFJP
TS5weW8gIERMRkNOLnB5YyAgSU4ucHkJIElOLnB5byAgVFlQRVMucHkgICBUWVBFUy5weW8KQ0RS
T00ucHljICBETEZDTi5weSAgIERMRkNOLnB5byAgSU4ucHljICByZWdlbgkgVFlQRVMucHljCgou
L3Rvb2xzL2FybV9weXRob24vY3Jvc3NfY29tcGlsZWQvbGliL3B5dGhvbjIuNC9zaXRlLXBhY2th
Z2VzOgpSRUFETUUKCi4vdG9vbHMvYXJtX3B5dGhvbi9jcm9zc19jb21waWxlZC9saWIvcHl0aG9u
Mi40L3Rlc3Q6CjE4NXRlc3QuZGIJCSAgICB0ZXN0X2l0ZXIucHljCmF1ZGlvdGVzdC5hdQkJICAg
IHRlc3RfaXRlci5weW8KYXV0b3Rlc3QucHkJCSAgICB0ZXN0X2l0ZXJ0b29scy5weQphdXRvdGVz
dC5weWMJCSAgICB0ZXN0X2l0ZXJ0b29scy5weWMKYXV0b3Rlc3QucHlvCQkgICAgdGVzdF9pdGVy
dG9vbHMucHlvCmJhZHN5bnRheF9mdXR1cmUzLnB5CSAgICB0ZXN0X2xhcmdlZmlsZS5weQpiYWRz
eW50YXhfZnV0dXJlNC5weQkgICAgdGVzdF9sYXJnZWZpbGUucHljCmJhZHN5bnRheF9mdXR1cmU1
LnB5CSAgICB0ZXN0X2xhcmdlZmlsZS5weW8KYmFkc3ludGF4X2Z1dHVyZTYucHkJICAgIHRlc3Rf
bGludXhhdWRpb2Rldi5weQpiYWRzeW50YXhfZnV0dXJlNy5weQkgICAgdGVzdF9saW51eGF1ZGlv
ZGV2LnB5YwpiYWRzeW50YXhfZnV0dXJlOC5weQkgICAgdGVzdF9saW51eGF1ZGlvZGV2LnB5bwpi
YWRzeW50YXhfZnV0dXJlOS5weQkgICAgdGVzdF9saXN0LnB5CmJhZHN5bnRheF9ub2NhcmV0LnB5
CSAgICB0ZXN0X2xpc3QucHljCmNmZ3BhcnNlci4xCQkgICAgdGVzdF9saXN0LnB5bwpjaGVja19z
b3VuZGNhcmQudmJzCSAgICB0ZXN0X19sb2NhbGUucHkKY2prZW5jb2RpbmdzX3Rlc3QucHkJICAg
IHRlc3RfbG9jYWxlLnB5CmNqa2VuY29kaW5nc190ZXN0LnB5YwkgICAgdGVzdF9fbG9jYWxlLnB5
YwpjamtlbmNvZGluZ3NfdGVzdC5weW8JICAgIHRlc3RfbG9jYWxlLnB5YwpkZWNpbWFsdGVzdGRh
dGEJCSAgICB0ZXN0X19sb2NhbGUucHlvCmRvY3Rlc3RfYWxpYXNlcy5weQkgICAgdGVzdF9sb2Nh
bGUucHlvCmRvY3Rlc3RfYWxpYXNlcy5weWMJICAgIHRlc3RfbG9nZ2luZy5weQpkb2N0ZXN0X2Fs
aWFzZXMucHlvCSAgICB0ZXN0X2xvZ2dpbmcucHljCmRvdWJsZV9jb25zdC5weQkJICAgIHRlc3Rf
bG9nZ2luZy5weW8KZG91YmxlX2NvbnN0LnB5YwkgICAgdGVzdF9sb25nZXhwLnB5CmRvdWJsZV9j
b25zdC5weW8JICAgIHRlc3RfbG9uZ2V4cC5weWMKZ3JleXJnYi51dWUJCSAgICB0ZXN0X2xvbmdl
eHAucHlvCl9faW5pdF9fLnB5CQkgICAgdGVzdF9sb25nX2Z1dHVyZS5weQpfX2luaXRfXy5weWMJ
CSAgICB0ZXN0X2xvbmdfZnV0dXJlLnB5YwpfX2luaXRfXy5weW8JCSAgICB0ZXN0X2xvbmdfZnV0
dXJlLnB5bwpsaXN0X3Rlc3RzLnB5CQkgICAgdGVzdF9sb25nLnB5Cmxpc3RfdGVzdHMucHljCQkg
ICAgdGVzdF9sb25nLnB5YwpsaXN0X3Rlc3RzLnB5bwkJICAgIHRlc3RfbG9uZy5weW8KbWFwcGlu
Z190ZXN0cy5weQkgICAgdGVzdF9tYWNmcy5weQptYXBwaW5nX3Rlc3RzLnB5YwkgICAgdGVzdF9t
YWNmcy5weWMKbWFwcGluZ190ZXN0cy5weW8JICAgIHRlc3RfbWFjZnMucHlvCm91dHB1dAkJCSAg
ICB0ZXN0X21hY29zdG9vbHMucHkKcGlja2xldGVzdGVyLnB5CQkgICAgdGVzdF9tYWNvc3Rvb2xz
LnB5YwpwaWNrbGV0ZXN0ZXIucHljCSAgICB0ZXN0X21hY29zdG9vbHMucHlvCnBpY2tsZXRlc3Rl
ci5weW8JICAgIHRlc3RfbWFjcGF0aC5weQpweWNsYnJfaW5wdXQucHkJCSAgICB0ZXN0X21hY3Bh
dGgucHljCnB5Y2xicl9pbnB1dC5weWMJICAgIHRlc3RfbWFjcGF0aC5weW8KcHljbGJyX2lucHV0
LnB5bwkgICAgdGVzdF9tYWlsYm94LnB5CnB5ZG9jZm9kZGVyLnB5CQkgICAgdGVzdF9tYWlsYm94
LnB5YwpweWRvY2ZvZGRlci5weWMJCSAgICB0ZXN0X21haWxib3gucHlvCnB5ZG9jZm9kZGVyLnB5
bwkJICAgIHRlc3RfbWFyc2hhbC5weQpweXN0b25lLnB5CQkgICAgdGVzdF9tYXJzaGFsLnB5Ywpw
eXN0b25lLnB5YwkJICAgIHRlc3RfbWFyc2hhbC5weW8KcHlzdG9uZS5weW8JCSAgICB0ZXN0X21h
dGgucHkKUkVBRE1FCQkJICAgIHRlc3RfbWF0aC5weWMKcmVnZXhfdGVzdHMucHkJCSAgICB0ZXN0
X21hdGgucHlvCnJlZ2V4X3Rlc3RzLnB5YwkJICAgIHRlc3RfbWQ1LnB5CnJlZ2V4X3Rlc3RzLnB5
bwkJICAgIHRlc3RfbWQ1LnB5YwpyZWdydGVzdC5weQkJICAgIHRlc3RfbWQ1LnB5bwpyZWdydGVz
dC5weWMJCSAgICB0ZXN0X21obGliLnB5CnJlZ3J0ZXN0LnB5bwkJICAgIHRlc3RfbWhsaWIucHlj
CnJlcGVyZi5weQkJICAgIHRlc3RfbWhsaWIucHlvCnJlcGVyZi5weWMJCSAgICB0ZXN0X21pbWV0
b29scy5weQpyZXBlcmYucHlvCQkgICAgdGVzdF9taW1ldG9vbHMucHljCnJlX3Rlc3RzLnB5CQkg
ICAgdGVzdF9taW1ldG9vbHMucHlvCnJlX3Rlc3RzLnB5YwkJICAgIHRlc3RfbWltZXR5cGVzLnB5
CnJlX3Rlc3RzLnB5bwkJICAgIHRlc3RfbWltZXR5cGVzLnB5YwpzYW1wbGVfZG9jdGVzdC5weQkg
ICAgdGVzdF9taW1ldHlwZXMucHlvCnNhbXBsZV9kb2N0ZXN0LnB5YwkgICAgdGVzdF9NaW1lV3Jp
dGVyLnB5CnNhbXBsZV9kb2N0ZXN0LnB5bwkgICAgdGVzdF9NaW1lV3JpdGVyLnB5YwpzZXFfdGVz
dHMucHkJCSAgICB0ZXN0X01pbWVXcml0ZXIucHlvCnNlcV90ZXN0cy5weWMJCSAgICB0ZXN0X21p
bmlkb20ucHkKc2VxX3Rlc3RzLnB5bwkJICAgIHRlc3RfbWluaWRvbS5weWMKc29ydHBlcmYucHkJ
CSAgICB0ZXN0X21pbmlkb20ucHlvCnNvcnRwZXJmLnB5YwkJICAgIHRlc3RfbW1hcC5weQpzb3J0
cGVyZi5weW8JCSAgICB0ZXN0X21tYXAucHljCnN0cmluZ190ZXN0cy5weQkJICAgIHRlc3RfbW1h
cC5weW8Kc3RyaW5nX3Rlc3RzLnB5YwkgICAgdGVzdF9tb2R1bGUucHkKc3RyaW5nX3Rlc3RzLnB5
bwkgICAgdGVzdF9tb2R1bGUucHljCnRlc3RfYWVwYWNrLnB5CQkgICAgdGVzdF9tb2R1bGUucHlv
CnRlc3RfYWVwYWNrLnB5YwkJICAgIHRlc3RfbXVsdGlieXRlY29kZWMucHkKdGVzdF9hZXBhY2su
cHlvCQkgICAgdGVzdF9tdWx0aWJ5dGVjb2RlYy5weWMKdGVzdF9fX2FsbF9fLnB5CQkgICAgdGVz
dF9tdWx0aWJ5dGVjb2RlYy5weW8KdGVzdGFsbC5weQkJICAgIHRlc3RfbXVsdGlieXRlY29kZWNf
c3VwcG9ydC5weQp0ZXN0X19fYWxsX18ucHljCSAgICB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBv
cnQucHljCnRlc3RhbGwucHljCQkgICAgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5bwp0
ZXN0X19fYWxsX18ucHlvCSAgICB0ZXN0X211bHRpZmlsZS5weQp0ZXN0YWxsLnB5bwkJICAgIHRl
c3RfbXVsdGlmaWxlLnB5Ywp0ZXN0X2FsLnB5CQkgICAgdGVzdF9tdWx0aWZpbGUucHlvCnRlc3Rf
YWwucHljCQkgICAgdGVzdF9tdXRhbnRzLnB5CnRlc3RfYWwucHlvCQkgICAgdGVzdF9tdXRhbnRz
LnB5Ywp0ZXN0X2FueWRibS5weQkJICAgIHRlc3RfbXV0YW50cy5weW8KdGVzdF9hbnlkYm0ucHlj
CQkgICAgdGVzdF9uZXRyYy5weQp0ZXN0X2FueWRibS5weW8JCSAgICB0ZXN0X25ldHJjLnB5Ywp0
ZXN0X2FwcGxlc2luZ2xlLnB5CSAgICB0ZXN0X25ldHJjLnB5bwp0ZXN0X2FwcGxlc2luZ2xlLnB5
YwkgICAgdGVzdF9uZXcucHkKdGVzdF9hcHBsZXNpbmdsZS5weW8JICAgIHRlc3RfbmV3LnB5Ywp0
ZXN0X2FycmF5LnB5CQkgICAgdGVzdF9uZXcucHlvCnRlc3RfYXJyYXkucHljCQkgICAgdGVzdF9u
aXMucHkKdGVzdF9hcnJheS5weW8JCSAgICB0ZXN0X25pcy5weWMKdGVzdF9hc3luY2hhdC5weQkg
ICAgdGVzdF9uaXMucHlvCnRlc3RfYXN5bmNoYXQucHljCSAgICB0ZXN0X25vcm1hbGl6YXRpb24u
cHkKdGVzdF9hc3luY2hhdC5weW8JICAgIHRlc3Rfbm9ybWFsaXphdGlvbi5weWMKdGVzdF9hdGV4
aXQucHkJCSAgICB0ZXN0X25vcm1hbGl6YXRpb24ucHlvCnRlc3RfYXRleGl0LnB5YwkJICAgIHRl
c3RfbnRwYXRoLnB5CnRlc3RfYXRleGl0LnB5bwkJICAgIHRlc3RfbnRwYXRoLnB5Ywp0ZXN0X2F1
ZGlvb3AucHkJCSAgICB0ZXN0X250cGF0aC5weW8KdGVzdF9hdWRpb29wLnB5YwkgICAgdGVzdF9v
cGNvZGVzLnB5CnRlc3RfYXVkaW9vcC5weW8JICAgIHRlc3Rfb3Bjb2Rlcy5weWMKdGVzdF9hdWdh
c3NpZ24ucHkJICAgIHRlc3Rfb3Bjb2Rlcy5weW8KdGVzdF9hdWdhc3NpZ24ucHljCSAgICB0ZXN0
X29wZW5wdHkucHkKdGVzdF9hdWdhc3NpZ24ucHlvCSAgICB0ZXN0X29wZW5wdHkucHljCnRlc3Rf
YmFzZTY0LnB5CQkgICAgdGVzdF9vcGVucHR5LnB5bwp0ZXN0X2Jhc2U2NC5weWMJCSAgICB0ZXN0
X29wZXJhdGlvbnMucHkKdGVzdF9iYXNlNjQucHlvCQkgICAgdGVzdF9vcGVyYXRpb25zLnB5Ywp0
ZXN0X2Jhc3Rpb24ucHkJCSAgICB0ZXN0X29wZXJhdGlvbnMucHlvCnRlc3RfYmFzdGlvbi5weWMJ
ICAgIHRlc3Rfb3BlcmF0b3IucHkKdGVzdF9iYXN0aW9uLnB5bwkgICAgdGVzdF9vcGVyYXRvci5w
eWMKdGVzdF9iaW5hc2NpaS5weQkgICAgdGVzdF9vcGVyYXRvci5weW8KdGVzdF9iaW5hc2NpaS5w
eWMJICAgIHRlc3Rfb3B0cGFyc2UucHkKdGVzdF9iaW5hc2NpaS5weW8JICAgIHRlc3Rfb3B0cGFy
c2UucHljCnRlc3RfYmluaGV4LnB5CQkgICAgdGVzdF9vcHRwYXJzZS5weW8KdGVzdF9iaW5oZXgu
cHljCQkgICAgdGVzdF9vcy5weQp0ZXN0X2JpbmhleC5weW8JCSAgICB0ZXN0X29zLnB5Ywp0ZXN0
X2Jpbm9wLnB5CQkgICAgdGVzdF9vcy5weW8KdGVzdF9iaW5vcC5weWMJCSAgICB0ZXN0X29zc2F1
ZGlvZGV2LnB5CnRlc3RfYmlub3AucHlvCQkgICAgdGVzdF9vc3NhdWRpb2Rldi5weWMKdGVzdF9i
aXNlY3QucHkJCSAgICB0ZXN0X29zc2F1ZGlvZGV2LnB5bwp0ZXN0X2Jpc2VjdC5weWMJCSAgICB0
ZXN0X3BhcnNlci5weQp0ZXN0X2Jpc2VjdC5weW8JCSAgICB0ZXN0X3BhcnNlci5weWMKdGVzdF9i
b29sLnB5CQkgICAgdGVzdF9wYXJzZXIucHlvCnRlc3RfYm9vbC5weWMJCSAgICB0ZXN0X3BlZXBo
b2xlci5weQp0ZXN0X2Jvb2wucHlvCQkgICAgdGVzdF9wZWVwaG9sZXIucHljCnRlc3RfYnNkZGIx
ODUucHkJICAgIHRlc3RfcGVlcGhvbGVyLnB5bwp0ZXN0X2JzZGRiMTg1LnB5YwkgICAgdGVzdF9w
ZXAyNDcucHkKdGVzdF9ic2RkYjE4NS5weW8JICAgIHRlc3RfcGVwMjQ3LnB5Ywp0ZXN0X2JzZGRi
My5weQkJICAgIHRlc3RfcGVwMjQ3LnB5bwp0ZXN0X2JzZGRiMy5weWMJCSAgICB0ZXN0X3BlcDI2
My5weQp0ZXN0X2JzZGRiMy5weW8JCSAgICB0ZXN0X3BlcDI2My5weWMKdGVzdF9ic2RkYi5weQkJ
ICAgIHRlc3RfcGVwMjYzLnB5bwp0ZXN0X2JzZGRiLnB5YwkJICAgIHRlc3RfcGVwMjc3LnB5CnRl
c3RfYnNkZGIucHlvCQkgICAgdGVzdF9wZXAyNzcucHljCnRlc3RfYnVmaW8ucHkJCSAgICB0ZXN0
X3BlcDI3Ny5weW8KdGVzdF9idWZpby5weWMJCSAgICB0ZXN0X3BlcDI5Mi5weQp0ZXN0X2J1Zmlv
LnB5bwkJICAgIHRlc3RfcGVwMjkyLnB5Ywp0ZXN0X2J1aWx0aW4ucHkJCSAgICB0ZXN0X3BlcDI5
Mi5weW8KdGVzdF9idWlsdGluLnB5YwkgICAgdGVzdF9waWNrbGUucHkKdGVzdF9idWlsdGluLnB5
bwkgICAgdGVzdF9waWNrbGUucHljCnRlc3RfYnoyLnB5CQkgICAgdGVzdF9waWNrbGUucHlvCnRl
c3RfYnoyLnB5YwkJICAgIHRlc3RfcGlja2xldG9vbHMucHkKdGVzdF9iejIucHlvCQkgICAgdGVz
dF9waWNrbGV0b29scy5weWMKdGVzdF9jYWxlbmRhci5weQkgICAgdGVzdF9waWNrbGV0b29scy5w
eW8KdGVzdF9jYWxlbmRhci5weWMJICAgIHRlc3RfcGtnaW1wb3J0LnB5CnRlc3RfY2FsZW5kYXIu
cHlvCSAgICB0ZXN0X3BrZ2ltcG9ydC5weWMKdGVzdF9jYWxsLnB5CQkgICAgdGVzdF9wa2dpbXBv
cnQucHlvCnRlc3RfY2FsbC5weWMJCSAgICB0ZXN0X3BrZy5weQp0ZXN0X2NhbGwucHlvCQkgICAg
dGVzdF9wa2cucHljCnRlc3RfY2FwaS5weQkJICAgIHRlc3RfcGtnLnB5bwp0ZXN0X2NhcGkucHlj
CQkgICAgdGVzdF9wbGlzdGxpYi5weQp0ZXN0X2NhcGkucHlvCQkgICAgdGVzdF9wbGlzdGxpYi5w
eWMKdGVzdF9jZC5weQkJICAgIHRlc3RfcGxpc3RsaWIucHlvCnRlc3RfY2QucHljCQkgICAgdGVz
dF9wb2xsLnB5CnRlc3RfY2QucHlvCQkgICAgdGVzdF9wb2xsLnB5Ywp0ZXN0X2NmZ3BhcnNlci5w
eQkgICAgdGVzdF9wb2xsLnB5bwp0ZXN0X2NmZ3BhcnNlci5weWMJICAgIHRlc3RfcG9wZW4yLnB5
CnRlc3RfY2ZncGFyc2VyLnB5bwkgICAgdGVzdF9wb3BlbjIucHljCnRlc3RfY2dpLnB5CQkgICAg
dGVzdF9wb3BlbjIucHlvCnRlc3RfY2dpLnB5YwkJICAgIHRlc3RfcG9wZW4ucHkKdGVzdF9jZ2ku
cHlvCQkgICAgdGVzdF9wb3Blbi5weWMKdGVzdF9jaGFybWFwY29kZWMucHkJICAgIHRlc3RfcG9w
ZW4ucHlvCnRlc3RfY2hhcm1hcGNvZGVjLnB5YwkgICAgdGVzdF9wb3NpeHBhdGgucHkKdGVzdF9j
aGFybWFwY29kZWMucHlvCSAgICB0ZXN0X3Bvc2l4cGF0aC5weWMKdGVzdF9jbGFzcy5weQkJICAg
IHRlc3RfcG9zaXhwYXRoLnB5bwp0ZXN0X2NsYXNzLnB5YwkJICAgIHRlc3RfcG9zaXgucHkKdGVz
dF9jbGFzcy5weW8JCSAgICB0ZXN0X3Bvc2l4LnB5Ywp0ZXN0X2NsLnB5CQkgICAgdGVzdF9wb3Np
eC5weW8KdGVzdF9jbC5weWMJCSAgICB0ZXN0X3Bvdy5weQp0ZXN0X2NsLnB5bwkJICAgIHRlc3Rf
cG93LnB5Ywp0ZXN0X2NtYXRoLnB5CQkgICAgdGVzdF9wb3cucHlvCnRlc3RfY21hdGgucHljCQkg
ICAgdGVzdF9wcHJpbnQucHkKdGVzdF9jbWF0aC5weW8JCSAgICB0ZXN0X3BwcmludC5weWMKdGVz
dF9jbWRfbGluZS5weQkgICAgdGVzdF9wcHJpbnQucHlvCnRlc3RfY21kX2xpbmUucHljCSAgICB0
ZXN0X3Byb2ZpbGVob29rcy5weQp0ZXN0X2NtZF9saW5lLnB5bwkgICAgdGVzdF9wcm9maWxlaG9v
a3MucHljCnRlc3RfY29kZWNjYWxsYmFja3MucHkJICAgIHRlc3RfcHJvZmlsZWhvb2tzLnB5bwp0
ZXN0X2NvZGVjY2FsbGJhY2tzLnB5YyAgICAgdGVzdF9wcm9maWxlLnB5CnRlc3RfY29kZWNjYWxs
YmFja3MucHlvICAgICB0ZXN0X3Byb2ZpbGUucHljCnRlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkg
ICB0ZXN0X3Byb2ZpbGUucHlvCnRlc3RfY29kZWNlbmNvZGluZ3NfY24ucHljICB0ZXN0X3B0eS5w
eQp0ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5byAgdGVzdF9wdHkucHljCnRlc3RfY29kZWNlbmNv
ZGluZ3NfaGsucHkgICB0ZXN0X3B0eS5weW8KdGVzdF9jb2RlY2VuY29kaW5nc19oay5weWMgIHRl
c3RfcHdkLnB5CnRlc3RfY29kZWNlbmNvZGluZ3NfaGsucHlvICB0ZXN0X3B3ZC5weWMKdGVzdF9j
b2RlY2VuY29kaW5nc19qcC5weSAgIHRlc3RfcHdkLnB5bwp0ZXN0X2NvZGVjZW5jb2RpbmdzX2pw
LnB5YyAgdGVzdF9weWNsYnIucHkKdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weW8gIHRlc3RfcHlj
bGJyLnB5Ywp0ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5ICAgdGVzdF9weWNsYnIucHlvCnRlc3Rf
Y29kZWNlbmNvZGluZ3Nfa3IucHljICB0ZXN0X3B5ZXhwYXQucHkKdGVzdF9jb2RlY2VuY29kaW5n
c19rci5weW8gIHRlc3RfcHlleHBhdC5weWMKdGVzdF9jb2RlY2VuY29kaW5nc190dy5weSAgIHRl
c3RfcHlleHBhdC5weW8KdGVzdF9jb2RlY2VuY29kaW5nc190dy5weWMgIHRlc3RfcXVldWUucHkK
dGVzdF9jb2RlY2VuY29kaW5nc190dy5weW8gIHRlc3RfcXVldWUucHljCnRlc3RfY29kZWNtYXBz
X2NuLnB5CSAgICB0ZXN0X3F1ZXVlLnB5bwp0ZXN0X2NvZGVjbWFwc19jbi5weWMJICAgIHRlc3Rf
cXVvcHJpLnB5CnRlc3RfY29kZWNtYXBzX2NuLnB5bwkgICAgdGVzdF9xdW9wcmkucHljCnRlc3Rf
Y29kZWNtYXBzX2hrLnB5CSAgICB0ZXN0X3F1b3ByaS5weW8KdGVzdF9jb2RlY21hcHNfaGsucHlj
CSAgICB0ZXN0X3JhbmRvbS5weQp0ZXN0X2NvZGVjbWFwc19oay5weW8JICAgIHRlc3RfcmFuZG9t
LnB5Ywp0ZXN0X2NvZGVjbWFwc19qcC5weQkgICAgdGVzdF9yYW5kb20ucHlvCnRlc3RfY29kZWNt
YXBzX2pwLnB5YwkgICAgdGVzdF9yZWdleC5weQp0ZXN0X2NvZGVjbWFwc19qcC5weW8JICAgIHRl
c3RfcmVnZXgucHljCnRlc3RfY29kZWNtYXBzX2tyLnB5CSAgICB0ZXN0X3JlZ2V4LnB5bwp0ZXN0
X2NvZGVjbWFwc19rci5weWMJICAgIHRlc3RfcmVwci5weQp0ZXN0X2NvZGVjbWFwc19rci5weW8J
ICAgIHRlc3RfcmVwci5weWMKdGVzdF9jb2RlY21hcHNfdHcucHkJICAgIHRlc3RfcmVwci5weW8K
dGVzdF9jb2RlY21hcHNfdHcucHljCSAgICB0ZXN0X3JlLnB5CnRlc3RfY29kZWNtYXBzX3R3LnB5
bwkgICAgdGVzdF9yZS5weWMKdGVzdGNvZGVjLnB5CQkgICAgdGVzdF9yZS5weW8KdGVzdGNvZGVj
LnB5YwkJICAgIHRlc3RfcmVzb3VyY2UucHkKdGVzdGNvZGVjLnB5bwkJICAgIHRlc3RfcmVzb3Vy
Y2UucHljCnRlc3RfY29kZWNzLnB5CQkgICAgdGVzdF9yZXNvdXJjZS5weW8KdGVzdF9jb2RlY3Mu
cHljCQkgICAgdGVzdF9yZmM4MjIucHkKdGVzdF9jb2RlY3MucHlvCQkgICAgdGVzdF9yZmM4MjIu
cHljCnRlc3RfY29kZW9wLnB5CQkgICAgdGVzdF9yZmM4MjIucHlvCnRlc3RfY29kZW9wLnB5YwkJ
ICAgIHRlc3RfcmdiaW1nLnB5CnRlc3RfY29kZW9wLnB5bwkJICAgIHRlc3RfcmdiaW1nLnB5Ywp0
ZXN0X2NvZXJjaW9uLnB5CSAgICB0ZXN0X3JnYmltZy5weW8KdGVzdF9jb2VyY2lvbi5weWMJICAg
IHRlc3RyZ2IudXVlCnRlc3RfY29lcmNpb24ucHlvCSAgICB0ZXN0X3JpY2hjbXAucHkKdGVzdF9j
b2xvcnN5cy5weQkgICAgdGVzdF9yaWNoY21wLnB5Ywp0ZXN0X2NvbG9yc3lzLnB5YwkgICAgdGVz
dF9yaWNoY21wLnB5bwp0ZXN0X2NvbG9yc3lzLnB5bwkgICAgdGVzdF9yb2JvdHBhcnNlci5weQp0
ZXN0X2NvbW1hbmRzLnB5CSAgICB0ZXN0X3JvYm90cGFyc2VyLnB5Ywp0ZXN0X2NvbW1hbmRzLnB5
YwkgICAgdGVzdF9yb2JvdHBhcnNlci5weW8KdGVzdF9jb21tYW5kcy5weW8JICAgIHRlc3Rfc2F4
LnB5CnRlc3RfY29tcGFyZS5weQkJICAgIHRlc3Rfc2F4LnB5Ywp0ZXN0X2NvbXBhcmUucHljCSAg
ICB0ZXN0X3NheC5weW8KdGVzdF9jb21wYXJlLnB5bwkgICAgdGVzdF9zY29wZS5weQp0ZXN0X2Nv
bXBpbGUucHkJCSAgICB0ZXN0X3Njb3BlLnB5Ywp0ZXN0X2NvbXBpbGUucHljCSAgICB0ZXN0X3Nj
b3BlLnB5bwp0ZXN0X2NvbXBpbGUucHlvCSAgICB0ZXN0X3NjcmlwdHBhY2thZ2VzLnB5CnRlc3Rf
Y29tcGlsZXIucHkJICAgIHRlc3Rfc2NyaXB0cGFja2FnZXMucHljCnRlc3RfY29tcGlsZXIucHlj
CSAgICB0ZXN0X3NjcmlwdHBhY2thZ2VzLnB5bwp0ZXN0X2NvbXBpbGVyLnB5bwkgICAgdGVzdF9z
ZWxlY3QucHkKdGVzdF9jb21wbGV4LnB5CQkgICAgdGVzdF9zZWxlY3QucHljCnRlc3RfY29tcGxl
eC5weWMJICAgIHRlc3Rfc2VsZWN0LnB5bwp0ZXN0X2NvbXBsZXgucHlvCSAgICB0ZXN0X3NldC5w
eQp0ZXN0X2NvbnRhaW5zLnB5CSAgICB0ZXN0X3NldC5weWMKdGVzdF9jb250YWlucy5weWMJICAg
IHRlc3Rfc2V0LnB5bwp0ZXN0X2NvbnRhaW5zLnB5bwkgICAgdGVzdF9zZXRzLnB5CnRlc3RfY29v
a2llbGliLnB5CSAgICB0ZXN0X3NldHMucHljCnRlc3RfY29va2llbGliLnB5YwkgICAgdGVzdF9z
ZXRzLnB5bwp0ZXN0X2Nvb2tpZWxpYi5weW8JICAgIHRlc3Rfc2dtbGxpYi5weQp0ZXN0X2Nvb2tp
ZS5weQkJICAgIHRlc3Rfc2dtbGxpYi5weWMKdGVzdF9jb29raWUucHljCQkgICAgdGVzdF9zZ21s
bGliLnB5bwp0ZXN0X2Nvb2tpZS5weW8JCSAgICB0ZXN0X3NoYS5weQp0ZXN0X2NvcHkucHkJCSAg
ICB0ZXN0X3NoYS5weWMKdGVzdF9jb3B5LnB5YwkJICAgIHRlc3Rfc2hhLnB5bwp0ZXN0X2NvcHku
cHlvCQkgICAgdGVzdF9zaGVsdmUucHkKdGVzdF9jb3B5X3JlZy5weQkgICAgdGVzdF9zaGVsdmUu
cHljCnRlc3RfY29weV9yZWcucHljCSAgICB0ZXN0X3NoZWx2ZS5weW8KdGVzdF9jb3B5X3JlZy5w
eW8JICAgIHRlc3Rfc2hsZXgucHkKdGVzdF9jcGlja2xlLnB5CQkgICAgdGVzdF9zaGxleC5weWMK
dGVzdF9jcGlja2xlLnB5YwkgICAgdGVzdF9zaGxleC5weW8KdGVzdF9jcGlja2xlLnB5bwkgICAg
dGVzdF9zaHV0aWwucHkKdGVzdF9jcnlwdC5weQkJICAgIHRlc3Rfc2h1dGlsLnB5Ywp0ZXN0X2Ny
eXB0LnB5YwkJICAgIHRlc3Rfc2h1dGlsLnB5bwp0ZXN0X2NyeXB0LnB5bwkJICAgIHRlc3Rfc2ln
bmFsLnB5CnRlc3RfY3N2LnB5CQkgICAgdGVzdF9zaWduYWwucHljCnRlc3RfY3N2LnB5YwkJICAg
IHRlc3Rfc2lnbmFsLnB5bwp0ZXN0X2Nzdi5weW8JCSAgICB0ZXN0X3NpdGUucHkKdGVzdF9jdXJz
ZXMucHkJCSAgICB0ZXN0X3NpdGUucHljCnRlc3RfY3Vyc2VzLnB5YwkJICAgIHRlc3Rfc2l0ZS5w
eW8KdGVzdF9jdXJzZXMucHlvCQkgICAgdGVzdF9zbGljZS5weQp0ZXN0X2RhdGV0aW1lLnB5CSAg
ICB0ZXN0X3NsaWNlLnB5Ywp0ZXN0X2RhdGV0aW1lLnB5YwkgICAgdGVzdF9zbGljZS5weW8KdGVz
dF9kYXRldGltZS5weW8JICAgIHRlc3Rfc29ja2V0LnB5CnRlc3RfZGJtLnB5CQkgICAgdGVzdF9z
b2NrZXQucHljCnRlc3RfZGJtLnB5YwkJICAgIHRlc3Rfc29ja2V0LnB5bwp0ZXN0X2RibS5weW8J
CSAgICB0ZXN0X3NvY2tldHNlcnZlci5weQp0ZXN0X2RlY2ltYWwucHkJCSAgICB0ZXN0X3NvY2tl
dHNlcnZlci5weWMKdGVzdF9kZWNpbWFsLnB5YwkgICAgdGVzdF9zb2NrZXRzZXJ2ZXIucHlvCnRl
c3RfZGVjaW1hbC5weW8JICAgIHRlc3Rfc29ja2V0X3NzbC5weQp0ZXN0X2RlY29yYXRvcnMucHkJ
ICAgIHRlc3Rfc29ja2V0X3NzbC5weWMKdGVzdF9kZWNvcmF0b3JzLnB5YwkgICAgdGVzdF9zb2Nr
ZXRfc3NsLnB5bwp0ZXN0X2RlY29yYXRvcnMucHlvCSAgICB0ZXN0X3NvZnRzcGFjZS5weQp0ZXN0
X2RlcXVlLnB5CQkgICAgdGVzdF9zb2Z0c3BhY2UucHljCnRlc3RfZGVxdWUucHljCQkgICAgdGVz
dF9zb2Z0c3BhY2UucHlvCnRlc3RfZGVxdWUucHlvCQkgICAgdGVzdF9zb3J0LnB5CnRlc3RfZGVz
Y3IucHkJCSAgICB0ZXN0X3NvcnQucHljCnRlc3RfZGVzY3IucHljCQkgICAgdGVzdF9zb3J0LnB5
bwp0ZXN0X2Rlc2NyLnB5bwkJICAgIHRlc3Rfc3RyZnRpbWUucHkKdGVzdF9kZXNjcnR1dC5weQkg
ICAgdGVzdF9zdHJmdGltZS5weWMKdGVzdF9kZXNjcnR1dC5weWMJICAgIHRlc3Rfc3RyZnRpbWUu
cHlvCnRlc3RfZGVzY3J0dXQucHlvCSAgICB0ZXN0X1N0cmluZ0lPLnB5CnRlc3RfZGljdC5weQkJ
ICAgIHRlc3RfU3RyaW5nSU8ucHljCnRlc3RfZGljdC5weWMJCSAgICB0ZXN0X1N0cmluZ0lPLnB5
bwp0ZXN0X2RpY3QucHlvCQkgICAgdGVzdF9zdHJpbmdwcmVwLnB5CnRlc3RfZGlmZmxpYl9leHBl
Y3QuaHRtbCAgICB0ZXN0X3N0cmluZ3ByZXAucHljCnRlc3RfZGlmZmxpYi5weQkJICAgIHRlc3Rf
c3RyaW5ncHJlcC5weW8KdGVzdF9kaWZmbGliLnB5YwkgICAgdGVzdF9zdHJpbmcucHkKdGVzdF9k
aWZmbGliLnB5bwkgICAgdGVzdF9zdHJpbmcucHljCnRlc3RfZGlyY2FjaGUucHkJICAgIHRlc3Rf
c3RyaW5nLnB5bwp0ZXN0X2RpcmNhY2hlLnB5YwkgICAgdGVzdF9zdHJvcC5weQp0ZXN0X2RpcmNh
Y2hlLnB5bwkgICAgdGVzdF9zdHJvcC5weWMKdGVzdF9kaXMucHkJCSAgICB0ZXN0X3N0cm9wLnB5
bwp0ZXN0X2Rpcy5weWMJCSAgICB0ZXN0X3N0cnB0aW1lLnB5CnRlc3RfZGlzLnB5bwkJICAgIHRl
c3Rfc3RycHRpbWUucHljCnRlc3RfZGlzdHV0aWxzLnB5CSAgICB0ZXN0X3N0cnB0aW1lLnB5bwp0
ZXN0X2Rpc3R1dGlscy5weWMJICAgIHRlc3Rfc3RyLnB5CnRlc3RfZGlzdHV0aWxzLnB5bwkgICAg
dGVzdF9zdHIucHljCnRlc3RfZGwucHkJCSAgICB0ZXN0X3N0ci5weW8KdGVzdF9kbC5weWMJCSAg
ICB0ZXN0X3N0cnVjdC5weQp0ZXN0X2RsLnB5bwkJICAgIHRlc3Rfc3RydWN0LnB5Ywp0ZXN0X2Rv
Y3Rlc3QyLnB5CSAgICB0ZXN0X3N0cnVjdC5weW8KdGVzdF9kb2N0ZXN0Mi5weWMJICAgIHRlc3Rf
c3RydWN0c2VxLnB5CnRlc3RfZG9jdGVzdDIucHlvCSAgICB0ZXN0X3N0cnVjdHNlcS5weWMKdGVz
dF9kb2N0ZXN0Mi50eHQJICAgIHRlc3Rfc3RydWN0c2VxLnB5bwp0ZXN0X2RvY3Rlc3QucHkJCSAg
ICB0ZXN0X3N1YnByb2Nlc3MucHkKdGVzdF9kb2N0ZXN0LnB5YwkgICAgdGVzdF9zdWJwcm9jZXNz
LnB5Ywp0ZXN0X2RvY3Rlc3QucHlvCSAgICB0ZXN0X3N1YnByb2Nlc3MucHlvCnRlc3RfZG9jdGVz
dC50eHQJICAgIHRlc3Rfc3VuYXVkaW9kZXYucHkKdGVzdF9kdW1iZGJtLnB5CQkgICAgdGVzdF9z
dW5hdWRpb2Rldi5weWMKdGVzdF9kdW1iZGJtLnB5YwkgICAgdGVzdF9zdW5hdWRpb2Rldi5weW8K
dGVzdF9kdW1iZGJtLnB5bwkgICAgdGVzdF9zdW5kcnkucHkKdGVzdF9kdW1teV90aHJlYWRpbmcu
cHkgICAgIHRlc3Rfc3VuZHJ5LnB5Ywp0ZXN0X2R1bW15X3RocmVhZGluZy5weWMgICAgdGVzdF9z
dW5kcnkucHlvCnRlc3RfZHVtbXlfdGhyZWFkaW5nLnB5byAgICB0ZXN0X3N1cHBvcnQucHkKdGVz
dF9kdW1teV90aHJlYWQucHkJICAgIHRlc3Rfc3VwcG9ydC5weWMKdGVzdF9kdW1teV90aHJlYWQu
cHljCSAgICB0ZXN0X3N1cHBvcnQucHlvCnRlc3RfZHVtbXlfdGhyZWFkLnB5bwkgICAgdGVzdF9z
eW10YWJsZS5weQp0ZXN0X2VtYWlsX2NvZGVjcy5weQkgICAgdGVzdF9zeW10YWJsZS5weWMKdGVz
dF9lbWFpbF9jb2RlY3MucHljCSAgICB0ZXN0X3N5bXRhYmxlLnB5bwp0ZXN0X2VtYWlsX2NvZGVj
cy5weW8JICAgIHRlc3Rfc3ludGF4LnB5CnRlc3RfZW1haWwucHkJCSAgICB0ZXN0X3N5bnRheC5w
eWMKdGVzdF9lbWFpbC5weWMJCSAgICB0ZXN0X3N5bnRheC5weW8KdGVzdF9lbWFpbC5weW8JCSAg
ICB0ZXN0X3N5cy5weQp0ZXN0X2VudW1lcmF0ZS5weQkgICAgdGVzdF9zeXMucHljCnRlc3RfZW51
bWVyYXRlLnB5YwkgICAgdGVzdF9zeXMucHlvCnRlc3RfZW51bWVyYXRlLnB5bwkgICAgdGVzdF90
YXJmaWxlLnB5CnRlc3RfZW9mLnB5CQkgICAgdGVzdF90YXJmaWxlLnB5Ywp0ZXN0X2VvZi5weWMJ
CSAgICB0ZXN0X3RhcmZpbGUucHlvCnRlc3RfZW9mLnB5bwkJICAgIHRlc3R0YXIudGFyCnRlc3Rf
ZXJybm8ucHkJCSAgICB0ZXN0X3RjbC5weQp0ZXN0X2Vycm5vLnB5YwkJICAgIHRlc3RfdGNsLnB5
Ywp0ZXN0X2Vycm5vLnB5bwkJICAgIHRlc3RfdGNsLnB5bwp0ZXN0X2V4Y2VwdGlvbnMucHkJICAg
IHRlc3RfdGVtcGZpbGUucHkKdGVzdF9leGNlcHRpb25zLnB5YwkgICAgdGVzdF90ZW1wZmlsZS5w
eWMKdGVzdF9leGNlcHRpb25zLnB5bwkgICAgdGVzdF90ZW1wZmlsZS5weW8KdGVzdF9leHRjYWxs
LnB5CQkgICAgdGVzdF90ZXh0d3JhcC5weQp0ZXN0X2V4dGNhbGwucHljCSAgICB0ZXN0X3RleHR3
cmFwLnB5Ywp0ZXN0X2V4dGNhbGwucHlvCSAgICB0ZXN0X3RleHR3cmFwLnB5bwp0ZXN0X2ZjbnRs
LnB5CQkgICAgdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKdGVzdF9mY250bC5weWMJCSAgICB0ZXN0
X3RocmVhZGVkX2ltcG9ydC5weWMKdGVzdF9mY250bC5weW8JCSAgICB0ZXN0X3RocmVhZGVkX2lt
cG9ydC5weW8KdGVzdF9maWxlY21wLnB5CQkgICAgdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5CnRl
c3RfZmlsZWNtcC5weWMJICAgIHRlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weWMKdGVzdF9maWxlY21w
LnB5bwkgICAgdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5bwp0ZXN0X2ZpbGVpbnB1dC5weQkgICAg
dGVzdF90aHJlYWRpbmdfbG9jYWwucHkKdGVzdF9maWxlaW5wdXQucHljCSAgICB0ZXN0X3RocmVh
ZGluZ19sb2NhbC5weWMKdGVzdF9maWxlaW5wdXQucHlvCSAgICB0ZXN0X3RocmVhZGluZ19sb2Nh
bC5weW8KdGVzdF9maWxlLnB5CQkgICAgdGVzdF90aHJlYWRpbmcucHkKdGVzdF9maWxlLnB5YwkJ
ICAgIHRlc3RfdGhyZWFkaW5nLnB5Ywp0ZXN0X2ZpbGUucHlvCQkgICAgdGVzdF90aHJlYWRpbmcu
cHlvCnRlc3RfZm5tYXRjaC5weQkJICAgIHRlc3RfdGhyZWFkLnB5CnRlc3RfZm5tYXRjaC5weWMJ
ICAgIHRlc3RfdGhyZWFkLnB5Ywp0ZXN0X2ZubWF0Y2gucHlvCSAgICB0ZXN0X3RocmVhZC5weW8K
dGVzdF9mb3JrMS5weQkJICAgIHRlc3RfdGhyZWFkc2lnbmFscy5weQp0ZXN0X2ZvcmsxLnB5YwkJ
ICAgIHRlc3RfdGhyZWFkc2lnbmFscy5weWMKdGVzdF9mb3JrMS5weW8JCSAgICB0ZXN0X3RocmVh
ZHNpZ25hbHMucHlvCnRlc3RfZm9ybWF0LnB5CQkgICAgdGVzdF90aW1lb3V0LnB5CnRlc3RfZm9y
bWF0LnB5YwkJICAgIHRlc3RfdGltZW91dC5weWMKdGVzdF9mb3JtYXQucHlvCQkgICAgdGVzdF90
aW1lb3V0LnB5bwp0ZXN0X2ZwZm9ybWF0LnB5CSAgICB0ZXN0X3RpbWUucHkKdGVzdF9mcGZvcm1h
dC5weWMJICAgIHRlc3RfdGltZS5weWMKdGVzdF9mcGZvcm1hdC5weW8JICAgIHRlc3RfdGltZS5w
eW8KdGVzdF9mcm96ZW4ucHkJCSAgICB0ZXN0X3RpbWluZy5weQp0ZXN0X2Zyb3plbi5weWMJCSAg
ICB0ZXN0X3RpbWluZy5weWMKdGVzdF9mcm96ZW4ucHlvCQkgICAgdGVzdF90aW1pbmcucHlvCnRl
c3RfZnVuY2F0dHJzLnB5CSAgICB0ZXN0X3Rva2VuaXplLnB5CnRlc3RfZnVuY2F0dHJzLnB5Ywkg
ICAgdGVzdF90b2tlbml6ZS5weWMKdGVzdF9mdW5jYXR0cnMucHlvCSAgICB0ZXN0X3Rva2VuaXpl
LnB5bwp0ZXN0X2Z1dHVyZTEucHkJCSAgICB0ZXN0X3RyYWNlYmFjay5weQp0ZXN0X2Z1dHVyZTEu
cHljCSAgICB0ZXN0X3RyYWNlYmFjay5weWMKdGVzdF9mdXR1cmUxLnB5bwkgICAgdGVzdF90cmFj
ZWJhY2sucHlvCnRlc3RfZnV0dXJlMi5weQkJICAgIHRlc3RfdHJhY2UucHkKdGVzdF9mdXR1cmUy
LnB5YwkgICAgdGVzdF90cmFjZS5weWMKdGVzdF9mdXR1cmUyLnB5bwkgICAgdGVzdF90cmFjZS5w
eW8KdGVzdF9mdXR1cmUzLnB5CQkgICAgdGVzdF90cmFuc2Zvcm1lci5weQp0ZXN0X2Z1dHVyZTMu
cHljCSAgICB0ZXN0X3RyYW5zZm9ybWVyLnB5Ywp0ZXN0X2Z1dHVyZTMucHlvCSAgICB0ZXN0X3Ry
YW5zZm9ybWVyLnB5bwp0ZXN0X19fZnV0dXJlX18ucHkJICAgIHRlc3RfdHVwbGUucHkKdGVzdF9m
dXR1cmUucHkJCSAgICB0ZXN0X3R1cGxlLnB5Ywp0ZXN0X19fZnV0dXJlX18ucHljCSAgICB0ZXN0
X3R1cGxlLnB5bwp0ZXN0X2Z1dHVyZS5weWMJCSAgICB0ZXN0X3R5cGVzLnB5CnRlc3RfX19mdXR1
cmVfXy5weW8JICAgIHRlc3RfdHlwZXMucHljCnRlc3RfZnV0dXJlLnB5bwkJICAgIHRlc3RfdHlw
ZXMucHlvCnRlc3RfZ2MucHkJCSAgICB0ZXN0X3Vjbi5weQp0ZXN0X2djLnB5YwkJICAgIHRlc3Rf
dWNuLnB5Ywp0ZXN0X2djLnB5bwkJICAgIHRlc3RfdWNuLnB5bwp0ZXN0X2dkYm0ucHkJCSAgICB0
ZXN0X3VuYXJ5LnB5CnRlc3RfZ2RibS5weWMJCSAgICB0ZXN0X3VuYXJ5LnB5Ywp0ZXN0X2dkYm0u
cHlvCQkgICAgdGVzdF91bmFyeS5weW8KdGVzdF9nZW5lcmF0b3JzLnB5CSAgICB0ZXN0X3VuaWNv
ZGVkYXRhLnB5CnRlc3RfZ2VuZXJhdG9ycy5weWMJICAgIHRlc3RfdW5pY29kZWRhdGEucHljCnRl
c3RfZ2VuZXJhdG9ycy5weW8JICAgIHRlc3RfdW5pY29kZWRhdGEucHlvCnRlc3RfZ2VuZXhwcy5w
eQkJICAgIHRlc3RfdW5pY29kZV9maWxlLnB5CnRlc3RfZ2VuZXhwcy5weWMJICAgIHRlc3RfdW5p
Y29kZV9maWxlLnB5Ywp0ZXN0X2dlbmV4cHMucHlvCSAgICB0ZXN0X3VuaWNvZGVfZmlsZS5weW8K
dGVzdF9nZXRhcmdzMi5weQkgICAgdGVzdF91bmljb2RlLnB5CnRlc3RfZ2V0YXJnczIucHljCSAg
ICB0ZXN0X3VuaWNvZGUucHljCnRlc3RfZ2V0YXJnczIucHlvCSAgICB0ZXN0X3VuaWNvZGUucHlv
CnRlc3RfZ2V0YXJncy5weQkJICAgIHRlc3RfdW5pdHRlc3QucHkKdGVzdF9nZXRhcmdzLnB5Ywkg
ICAgdGVzdF91bml0dGVzdC5weWMKdGVzdF9nZXRhcmdzLnB5bwkgICAgdGVzdF91bml0dGVzdC5w
eW8KdGVzdF9nZXRvcHQucHkJCSAgICB0ZXN0X3VuaXZuZXdsaW5lcy5weQp0ZXN0X2dldG9wdC5w
eWMJCSAgICB0ZXN0X3VuaXZuZXdsaW5lcy5weWMKdGVzdF9nZXRvcHQucHlvCQkgICAgdGVzdF91
bml2bmV3bGluZXMucHlvCnRlc3RfZ2V0dGV4dC5weQkJICAgIHRlc3RfdW5wYWNrLnB5CnRlc3Rf
Z2V0dGV4dC5weWMJICAgIHRlc3RfdW5wYWNrLnB5Ywp0ZXN0X2dldHRleHQucHlvCSAgICB0ZXN0
X3VucGFjay5weW8KdGVzdF9nbG9iYWwucHkJCSAgICB0ZXN0X3VybGxpYjJuZXQucHkKdGVzdF9n
bG9iYWwucHljCQkgICAgdGVzdF91cmxsaWIybmV0LnB5Ywp0ZXN0X2dsb2JhbC5weW8JCSAgICB0
ZXN0X3VybGxpYjJuZXQucHlvCnRlc3RfZ2xvYi5weQkJICAgIHRlc3RfdXJsbGliMi5weQp0ZXN0
X2dsb2IucHljCQkgICAgdGVzdF91cmxsaWIyLnB5Ywp0ZXN0X2dsb2IucHlvCQkgICAgdGVzdF91
cmxsaWIyLnB5bwp0ZXN0X2dsLnB5CQkgICAgdGVzdF91cmxsaWJuZXQucHkKdGVzdF9nbC5weWMJ
CSAgICB0ZXN0X3VybGxpYm5ldC5weWMKdGVzdF9nbC5weW8JCSAgICB0ZXN0X3VybGxpYm5ldC5w
eW8KdGVzdF9ncmFtbWFyLnB5CQkgICAgdGVzdF91cmxsaWIucHkKdGVzdF9ncmFtbWFyLnB5Ywkg
ICAgdGVzdF91cmxsaWIucHljCnRlc3RfZ3JhbW1hci5weW8JICAgIHRlc3RfdXJsbGliLnB5bwp0
ZXN0X2dycC5weQkJICAgIHRlc3RfdXJscGFyc2UucHkKdGVzdF9ncnAucHljCQkgICAgdGVzdF91
cmxwYXJzZS5weWMKdGVzdF9ncnAucHlvCQkgICAgdGVzdF91cmxwYXJzZS5weW8KdGVzdF9nemlw
LnB5CQkgICAgdGVzdF91c2VyZGljdC5weQp0ZXN0X2d6aXAucHljCQkgICAgdGVzdF91c2VyZGlj
dC5weWMKdGVzdF9nemlwLnB5bwkJICAgIHRlc3RfdXNlcmRpY3QucHlvCnRlc3RfaGFzaC5weQkJ
ICAgIHRlc3RfdXNlcmxpc3QucHkKdGVzdF9oYXNoLnB5YwkJICAgIHRlc3RfdXNlcmxpc3QucHlj
CnRlc3RfaGFzaC5weW8JCSAgICB0ZXN0X3VzZXJsaXN0LnB5bwp0ZXN0X2hlYXBxLnB5CQkgICAg
dGVzdF91c2Vyc3RyaW5nLnB5CnRlc3RfaGVhcHEucHljCQkgICAgdGVzdF91c2Vyc3RyaW5nLnB5
Ywp0ZXN0X2hlYXBxLnB5bwkJICAgIHRlc3RfdXNlcnN0cmluZy5weW8KdGVzdF9oZXhvY3QucHkJ
CSAgICB0ZXN0X3V1LnB5CnRlc3RfaGV4b2N0LnB5YwkJICAgIHRlc3RfdXUucHljCnRlc3RfaGV4
b2N0LnB5bwkJICAgIHRlc3RfdXUucHlvCnRlc3RfaG1hYy5weQkJICAgIHRlc3Rfd2FybmluZ3Mu
cHkKdGVzdF9obWFjLnB5YwkJICAgIHRlc3Rfd2FybmluZ3MucHljCnRlc3RfaG1hYy5weW8JCSAg
ICB0ZXN0X3dhcm5pbmdzLnB5bwp0ZXN0X2hvdHNob3QucHkJCSAgICB0ZXN0X3dhdmUucHkKdGVz
dF9ob3RzaG90LnB5YwkgICAgdGVzdF93YXZlLnB5Ywp0ZXN0X2hvdHNob3QucHlvCSAgICB0ZXN0
X3dhdmUucHlvCnRlc3RfaHRtbGxpYi5weQkJICAgIHRlc3Rfd2Vha3JlZi5weQp0ZXN0X2h0bWxs
aWIucHljCSAgICB0ZXN0X3dlYWtyZWYucHljCnRlc3RfaHRtbGxpYi5weW8JICAgIHRlc3Rfd2Vh
a3JlZi5weW8KdGVzdF9odG1scGFyc2VyLnB5CSAgICB0ZXN0X3doaWNoZGIucHkKdGVzdF9odG1s
cGFyc2VyLnB5YwkgICAgdGVzdF93aGljaGRiLnB5Ywp0ZXN0X2h0bWxwYXJzZXIucHlvCSAgICB0
ZXN0X3doaWNoZGIucHlvCnRlc3RfaHR0cGxpYi5weQkJICAgIHRlc3Rfd2lucmVnLnB5CnRlc3Rf
aHR0cGxpYi5weWMJICAgIHRlc3Rfd2lucmVnLnB5Ywp0ZXN0X2h0dHBsaWIucHlvCSAgICB0ZXN0
X3dpbnJlZy5weW8KdGVzdF9pbWFnZW9wLnB5CQkgICAgdGVzdF93aW5zb3VuZC5weQp0ZXN0X2lt
YWdlb3AucHljCSAgICB0ZXN0X3dpbnNvdW5kLnB5Ywp0ZXN0X2ltYWdlb3AucHlvCSAgICB0ZXN0
X3dpbnNvdW5kLnB5bwp0ZXN0X2ltYXBsaWIucHkJCSAgICB0ZXN0LnhtbAp0ZXN0X2ltYXBsaWIu
cHljCSAgICB0ZXN0X3htbGxpYi5weQp0ZXN0X2ltYXBsaWIucHlvCSAgICB0ZXN0X3htbGxpYi5w
eWMKdGVzdF9pbWdmaWxlLnB5CQkgICAgdGVzdF94bWxsaWIucHlvCnRlc3RfaW1nZmlsZS5weWMJ
ICAgIHRlc3QueG1sLm91dAp0ZXN0X2ltZ2ZpbGUucHlvCSAgICB0ZXN0X3htbHJwYy5weQp0ZXN0
aW1nci51dWUJCSAgICB0ZXN0X3htbHJwYy5weWMKdGVzdGltZy51dWUJCSAgICB0ZXN0X3htbHJw
Yy5weW8KdGVzdF9pbXBvcnRob29rcy5weQkgICAgdGVzdF94cGlja2xlLnB5CnRlc3RfaW1wb3J0
aG9va3MucHljCSAgICB0ZXN0X3hwaWNrbGUucHljCnRlc3RfaW1wb3J0aG9va3MucHlvCSAgICB0
ZXN0X3hwaWNrbGUucHlvCnRlc3RfaW1wb3J0LnB5CQkgICAgdGVzdF94cmFuZ2UucHkKdGVzdF9p
bXBvcnQucHljCQkgICAgdGVzdF94cmFuZ2UucHljCnRlc3RfaW1wb3J0LnB5bwkJICAgIHRlc3Rf
eHJhbmdlLnB5bwp0ZXN0X2ltcC5weQkJICAgIHRlc3RfemlwZmlsZS5weQp0ZXN0X2ltcC5weWMJ
CSAgICB0ZXN0X3ppcGZpbGUucHljCnRlc3RfaW1wLnB5bwkJICAgIHRlc3RfemlwZmlsZS5weW8K
dGVzdF9pbnNwZWN0LnB5CQkgICAgdGVzdF96aXBpbXBvcnQucHkKdGVzdF9pbnNwZWN0LnB5Ywkg
ICAgdGVzdF96aXBpbXBvcnQucHljCnRlc3RfaW5zcGVjdC5weW8JICAgIHRlc3RfemlwaW1wb3J0
LnB5bwp0ZXN0X2lvY3RsLnB5CQkgICAgdGVzdF96bGliLnB5CnRlc3RfaW9jdGwucHljCQkgICAg
dGVzdF96bGliLnB5Ywp0ZXN0X2lvY3RsLnB5bwkJICAgIHRlc3RfemxpYi5weW8KdGVzdF9pc2lu
c3RhbmNlLnB5CSAgICB0Zl9pbmhlcml0X2NoZWNrLnB5CnRlc3RfaXNpbnN0YW5jZS5weWMJICAg
IHRmX2luaGVyaXRfY2hlY2sucHljCnRlc3RfaXNpbnN0YW5jZS5weW8JICAgIHRmX2luaGVyaXRf
Y2hlY2sucHlvCnRlc3RfaXRlcmxlbi5weQkJICAgIHRva2VuaXplX3Rlc3RzLnR4dAp0ZXN0X2l0
ZXJsZW4ucHljCSAgICB4bWx0ZXN0cy5weQp0ZXN0X2l0ZXJsZW4ucHlvCSAgICB4bWx0ZXN0cy5w
eWMKdGVzdF9pdGVyLnB5CQkgICAgeG1sdGVzdHMucHlvCgouL3Rvb2xzL2FybV9weXRob24vY3Jv
c3NfY29tcGlsZWQvbGliL3B5dGhvbjIuNC90ZXN0L2RlY2ltYWx0ZXN0ZGF0YToKYWJzLmRlY1Rl
c3QJICAgIGluZXhhY3QuZGVjVGVzdAkgICByYW5kb21zLmRlY1Rlc3QKYWRkLmRlY1Rlc3QJICAg
IG1heC5kZWNUZXN0CQkgICByZW1haW5kZXIuZGVjVGVzdApiYXNlLmRlY1Rlc3QJICAgIG1pbi5k
ZWNUZXN0CQkgICByZW1haW5kZXJOZWFyLmRlY1Rlc3QKY2xhbXAuZGVjVGVzdAkgICAgbWludXMu
ZGVjVGVzdAkgICByZXNjYWxlLmRlY1Rlc3QKY29tcGFyZS5kZWNUZXN0ICAgICBtdWx0aXBseS5k
ZWNUZXN0CSAgIHJvdW5kaW5nLmRlY1Rlc3QKZGVjaW1hbDEyOC5kZWNUZXN0ICBub3JtYWxpemUu
ZGVjVGVzdAkgICBzYW1lcXVhbnR1bS5kZWNUZXN0CmRlY2ltYWwzMi5kZWNUZXN0ICAgcGx1cy5k
ZWNUZXN0CSAgIHNxdWFyZXJvb3QuZGVjVGVzdApkZWNpbWFsNjQuZGVjVGVzdCAgIHBvd2VyLmRl
Y1Rlc3QJICAgc3VidHJhY3QuZGVjVGVzdApkaXZpZGUuZGVjVGVzdAkgICAgcXVhbnRpemUuZGVj
VGVzdAkgICB0ZXN0YWxsLmRlY1Rlc3QKZGl2aWRlaW50LmRlY1Rlc3QgICByYW5kb21Cb3VuZDMy
LmRlY1Rlc3QgIHRvaW50ZWdyYWwuZGVjVGVzdAoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3NzX2Nv
bXBpbGVkL2xpYi9weXRob24yLjQvdGVzdC9vdXRwdXQ6CnRlc3RfYXN5bmNoYXQJIHRlc3RfZ3Jh
bW1hcgkgICAgIHRlc3Rfb3BlcmF0aW9ucyAgIHRlc3RfcmVzb3VyY2UKdGVzdF9hdWdhc3NpZ24J
IHRlc3RfaHR0cGxpYgkgICAgIHRlc3Rfb3NzYXVkaW9kZXYgIHRlc3RfcmdiaW1nCnRlc3RfY2dp
CSB0ZXN0X2xpbnV4YXVkaW9kZXYgIHRlc3RfcGVwMjc3ICAgICAgIHRlc3Rfc2NvcGUKdGVzdF9j
bGFzcwkgdGVzdF9sb2dnaW5nCSAgICAgdGVzdF9wa2cJICAgICAgIHRlc3Rfc2lnbmFsCnRlc3Rf
Y29lcmNpb24JIHRlc3RfbWF0aAkgICAgIHRlc3RfcG9sbAkgICAgICAgdGVzdF90aHJlYWQKdGVz
dF9jb21wYXJlCSB0ZXN0X01pbWVXcml0ZXIgICAgIHRlc3RfcG9wZW4gICAgICAgIHRlc3RfdGhy
ZWFkZWR0ZW1wZmlsZQp0ZXN0X2Nvb2tpZQkgdGVzdF9tbWFwCSAgICAgdGVzdF9wb3BlbjIgICAg
ICAgdGVzdF90b2tlbml6ZQp0ZXN0X2V4Y2VwdGlvbnMgIHRlc3RfbmV3CSAgICAgdGVzdF9wcm9m
aWxlICAgICAgdGVzdF90eXBlcwp0ZXN0X2V4dGNhbGwJIHRlc3RfbmlzCSAgICAgdGVzdF9wdHkJ
ICAgICAgIHRlc3Rfd2lucmVnCnRlc3RfZnJvemVuCSB0ZXN0X29wY29kZXMJICAgICB0ZXN0X3B5
ZXhwYXQgICAgICB4bWx0ZXN0cwp0ZXN0X2dsb2JhbAkgdGVzdF9vcGVucHR5CSAgICAgdGVzdF9y
ZWdleAoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL2xpYi9weXRob24yLjQveG1s
Ogpkb20gIF9faW5pdF9fLnB5ICBfX2luaXRfXy5weWMJX19pbml0X18ucHlvICBwYXJzZXJzICBz
YXgKCi4vdG9vbHMvYXJtX3B5dGhvbi9jcm9zc19jb21waWxlZC9saWIvcHl0aG9uMi40L3htbC9k
b206CmRvbXJlZy5weQkgIF9faW5pdF9fLnB5CSAgbWluaWRvbS5weQkgIHB1bGxkb20ucHkKZG9t
cmVnLnB5YwkgIF9faW5pdF9fLnB5YwkgIG1pbmlkb20ucHljCSAgcHVsbGRvbS5weWMKZG9tcmVn
LnB5bwkgIF9faW5pdF9fLnB5bwkgIG1pbmlkb20ucHlvCSAgcHVsbGRvbS5weW8KZXhwYXRidWls
ZGVyLnB5ICAgbWluaWNvbXBhdC5weSAgIE5vZGVGaWx0ZXIucHkgICB4bWxidWlsZGVyLnB5CmV4
cGF0YnVpbGRlci5weWMgIG1pbmljb21wYXQucHljICBOb2RlRmlsdGVyLnB5YyAgeG1sYnVpbGRl
ci5weWMKZXhwYXRidWlsZGVyLnB5byAgbWluaWNvbXBhdC5weW8gIE5vZGVGaWx0ZXIucHlvICB4
bWxidWlsZGVyLnB5bwoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL2xpYi9weXRo
b24yLjQveG1sL3BhcnNlcnM6CmV4cGF0LnB5ICBleHBhdC5weWMgIGV4cGF0LnB5bwlfX2luaXRf
Xy5weSAgX19pbml0X18ucHljICBfX2luaXRfXy5weW8KCi4vdG9vbHMvYXJtX3B5dGhvbi9jcm9z
c19jb21waWxlZC9saWIvcHl0aG9uMi40L3htbC9zYXg6Cl9leGNlcHRpb25zLnB5CSBleHBhdHJl
YWRlci5weWMgIGhhbmRsZXIucHlvCXNheHV0aWxzLnB5ICAgeG1scmVhZGVyLnB5YwpfZXhjZXB0
aW9ucy5weWMgIGV4cGF0cmVhZGVyLnB5byAgX19pbml0X18ucHkJc2F4dXRpbHMucHljICB4bWxy
ZWFkZXIucHlvCl9leGNlcHRpb25zLnB5byAgaGFuZGxlci5weQkgIF9faW5pdF9fLnB5YwlzYXh1
dGlscy5weW8KZXhwYXRyZWFkZXIucHkJIGhhbmRsZXIucHljCSAgX19pbml0X18ucHlvCXhtbHJl
YWRlci5weQoKLi90b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL21hbjoKbWFuMQoKLi90
b29scy9hcm1fcHl0aG9uL2Nyb3NzX2NvbXBpbGVkL21hbi9tYW4xOgpweXRob24uMQoKLi90b29s
cy9jb25zb2xlOgpjbGllbnQJZGFlbW9uCU1ha2VmaWxlICB4ZW5jb25zb2xlICB4ZW5jb25zb2xl
ZAoKLi90b29scy9jb25zb2xlL2NsaWVudDoKbWFpbi5jCW1haW4ubwoKLi90b29scy9jb25zb2xl
L2RhZW1vbjoKaW8uYyAgaW8uaCAgaW8ubyAgbWFpbi5jICBtYWluLm8gIHV0aWxzLmMgIHV0aWxz
LmggIHV0aWxzLm8KCi4vdG9vbHMvbGlieGM6CmluY2x1ZGUJCSAgICAgIHhjX2VsZi5oCQkgICAg
IHhjX2xvYWRfZWxmLm9waWMKbGliCQkgICAgICB4Y19ldnRjaG4uYwkgICAgIHhjX21pc2MuYwps
aWJ4ZW5jdHJsLnNvCSAgICAgIHhjX2V2dGNobi5vcGljCSAgICAgeGNfbWlzYy5vcGljCmxpYnhl
bmN0cmwuc28uMy4wICAgICB4Y19saW51eF9idWlsZC5jCSAgICAgeGNfcGh5c2Rldi5jCmxpYnhl
bmN0cmwuc28uMy4wLjAgICB4Y19saW51eF9idWlsZC5vCSAgICAgeGNfcGh5c2Rldi5vcGljCmxp
Ynhlbmd1ZXN0LmEJICAgICAgeGNfbGludXhfYnVpbGQub3BpYyAgICB4Y19wcml2YXRlLmMKbGli
eGVuZ3Vlc3Quc28JICAgICAgeGNfbGludXhfcmVzdG9yZS5jICAgICB4Y19wcml2YXRlLmgKbGli
eGVuZ3Vlc3Quc28uMy4wICAgIHhjX2xpbnV4X3Jlc3RvcmUubyAgICAgeGNfcHJpdmF0ZS5vcGlj
CmxpYnhlbmd1ZXN0LnNvLjMuMC4wICB4Y19saW51eF9yZXN0b3JlLm9waWMgIHhjX3NlZGYuYwpN
YWtlZmlsZQkgICAgICB4Y19saW51eF9zYXZlLmMJICAgICB4Y19zZWRmLm9waWMKTWFrZWZpbGUu
YmFja3VwICAgICAgIHhjX2xpbnV4X3NhdmUubwkgICAgIHhjX3RidWYuYwpNYWtlZmlsZS5iYWsJ
ICAgICAgeGNfbGludXhfc2F2ZS5vcGljICAgICB4Y190YnVmLm9waWMKc2hhcmUJCSAgICAgIHhj
X2xvYWRfYW91dDkuYwkgICAgIHhlbgp4Y19hb3V0OS5oCSAgICAgIHhjX2xvYWRfYW91dDkubwkg
ICAgIHhlbmN0cmwuaAp4Y19idnRzY2hlZC5jCSAgICAgIHhjX2xvYWRfYW91dDkub3BpYyAgICAg
eGVuZ3Vlc3QuaAp4Y19idnRzY2hlZC5vcGljICAgICAgeGNfbG9hZF9iaW4uYwkgICAgIHhnX3By
aXZhdGUuYwp4Y19jb3JlLmMJICAgICAgeGNfbG9hZF9iaW4ubwkgICAgIHhnX3ByaXZhdGUuaAp4
Y19jb3JlLm9waWMJICAgICAgeGNfbG9hZF9iaW4ub3BpYwkgICAgIHhnX3ByaXZhdGUubwp4Y19k
b21haW4uYwkgICAgICB4Y19sb2FkX2VsZi5jCSAgICAgeGdfcHJpdmF0ZS5vcGljCnhjX2RvbWFp
bi5vcGljCSAgICAgIHhjX2xvYWRfZWxmLm8JICAgICB4Z19zYXZlX3Jlc3RvcmUuaAoKLi90b29s
cy9saWJ4Yy9pbmNsdWRlOgp6Y29uZi5oICB6bGliLmgKCi4vdG9vbHMvbGlieGMvbGliOgpsaWJ6
LmEJbGliei5zbyAgbGliei5zby4xICBsaWJ6LnNvLjEuMi41ICBwa2djb25maWcKCi4vdG9vbHMv
bGlieGMvbGliL3BrZ2NvbmZpZzoKemxpYi5wYwoKLi90b29scy9saWJ4Yy9zaGFyZToKbWFuCgou
L3Rvb2xzL2xpYnhjL3NoYXJlL21hbjoKbWFuMwoKLi90b29scy9saWJ4Yy9zaGFyZS9tYW4vbWFu
MzoKemxpYi4zCgouL3Rvb2xzL2xpYnhjL3hlbjoKYWNtX2Rldi5oICAgIGFyY2gteDg2XzMyLmgg
ICAgZ3JhbnRfdGFibGUuaCAgbm1pLmgJICB0eXBlcy5oCmFjbS5oCSAgICAgYXJjaC14ODZfNjQu
aCAgICBodm0JICAgICBwaHlzZGV2LmgJICB2Y3B1LmgKYWNtX29wcy5oICAgIGRvbTBfb3BzLmgg
ICAgICAgaW8JICAgICBzY2hlZF9jdGwuaCAgdmVyc2lvbi5oCmFyY2gtYXJtLmggICBldmVudF9j
aGFubmVsLmggIGxpbnV4CSAgICAgc2NoZWQuaAkgIHhlbi1jb21wYXQuaAphcmNoLWlhNjQuaCAg
ZmVhdHVyZXMuaCAgICAgICBtZW1vcnkuaAkgICAgIHRyYWNlLmgJICB4ZW4uaAoKLi90b29scy9s
aWJ4Yy94ZW4vaHZtOgpodm1faW5mb190YWJsZS5oICBpb3JlcS5oICB2bXhfYXNzaXN0LmgKCi4v
dG9vbHMvbGlieGMveGVuL2lvOgpibGtpZi5oICAgIG10ZGlmLmggIHBjaWlmLmggIHRwbWlmLmgg
ICB4c193aXJlLmgKY29uc29sZS5oICBuZXRpZi5oICByaW5nLmggICB4ZW5idXMuaAoKLi90b29s
cy9saWJ4Yy94ZW4vbGludXg6CmV2dGNobi5oICBwcml2Y21kLmgKCi4vdG9vbHMvbWlzYzoKZG9t
MSAgZG9tMiAgeGVuZCAgeGVuZC1jb25maWcuc3hwICB4bQoKLi90b29scy9weXRob246Ck1ha2Vm
aWxlICB4ZW4KCi4vdG9vbHMvcHl0aG9uL3hlbjoKX19pbml0X18ucHkgIGxvd2xldmVsICBzdiAg
dXRpbCAgd2ViICB4ZW5kICB4bQoKLi90b29scy9weXRob24veGVuL2xvd2xldmVsOgpfX2luaXRf
Xy5weSAgTWFrZWZpbGUgIHhjLmMgIHhjLmN+ICB4Yy5vICB4Yy5zbyAgeHMuYyAgeHMubyAgeHMu
c28KCi4vdG9vbHMvcHl0aG9uL3hlbi9zdjoKQ3JlYXRlRG9tYWluLnB5ICBHZW5UYWJiZWQucHkg
IF9faW5pdF9fLnB5ICBOb2RlSW5mby5weSAgICAgICB1dGlsLnB5CkRvbUluZm8ucHkJIEhUTUxC
YXNlLnB5ICAgTWFpbi5weQkgICAgUmVzdG9yZURvbWFpbi5weSAgV2l6YXJkLnB5CgouL3Rvb2xz
L3B5dGhvbi94ZW4vdXRpbDoKYXNzZXJ0cy5weSAgYmxraWYucHkgIGJ1Z3Rvb2wucHkgICBfX2lu
aXRfXy5weQltYWMucHkJeG1scnBjbGliMi5weQphdXhiaW4ucHkgICBCcmN0bC5weSAgZGlhZ25v
c2UucHkgIGlwLnB5CXBjaS5weQl4cG9wZW4ucHkKCi4vdG9vbHMvcHl0aG9uL3hlbi93ZWI6CmNv
bm5lY3Rpb24ucHkgIGh0dHBzZXJ2ZXIucHkgIHByb3RvY29sLnB5ICBTcnZCYXNlLnB5ICBzdGF0
aWMucHkgIHVuaXgucHkKaHR0cC5weSAgICAgICAgX19pbml0X18ucHkgICAgcmVzb3VyY2UucHkg
IFNydkRpci5weSAgIHRjcC5weQoKLi90b29scy9weXRob24veGVuL3hlbmQ6CkFyZ3MucHkgICAg
ICBQcmV0dHlQcmludC5weSAgWGVuZEJvb3Rsb2FkZXIucHkJWGVuZERvbWFpbi5weQkgWGVuZFJv
b3QucHkKYmFsbG9vbi5weSAgIHNlcnZlcgkgICAgIFhlbmRDaGVja3BvaW50LnB5CVhlbmRFcnJv
ci5weQkgWGVuZFZuZXQucHkKZW5jb2RlLnB5ICAgIHN4cC5weQkgICAgIFhlbmRDbGllbnQucHkJ
WGVuZExvZ2dpbmcucHkJIHhlbnN0b3JlCmltYWdlLnB5ICAgICB1dWlkLnB5CSAgICAgWGVuZERt
ZXNnLnB5CVhlbmROb2RlLnB5Cl9faW5pdF9fLnB5ICBWaWZjdGwucHkJICAgICBYZW5kRG9tYWlu
SW5mby5weQlYZW5kUHJvdG9jb2wucHkKCi4vdG9vbHMvcHl0aG9uL3hlbi94ZW5kL3NlcnZlcjoK
YmxraWYucHkJICBpcnFpZi5weSAgIHBjaWlmLnB5CSAgICAgIFNydkRvbWFpbi5weSAgIFNydlhl
bmRMb2cucHkKRGV2Q29udHJvbGxlci5weSAga3BwaWYucHkgICByZWxvY2F0ZS5weSAgICAgIFNy
dk5vZGUucHkgICAgIHRwbWlmLnB5CmZiaWYucHkJCSAgbGNkaWYucHkgICBTcnZEYWVtb24ucHkg
ICAgIFNydlJvb3QucHkgICAgIHVzYmlmLnB5Cl9faW5pdF9fLnB5CSAgbmV0aWYucHkgICBTcnZE
bWVzZy5weSAgICAgIFNydlNlcnZlci5weSAgIHVzYmlmLnB5Ywppb3BpZi5weQkgIHBhcmFtcy5w
eSAgU3J2RG9tYWluRGlyLnB5ICBTcnZWbmV0RGlyLnB5ICBYTUxSUENTZXJ2ZXIucHkKCi4vdG9v
bHMvcHl0aG9uL3hlbi94ZW5kL3hlbnN0b3JlOgpfX2luaXRfXy5weSAgeHN0cmFuc2FjdC5weSAg
eHN1dGlsLnB5ICB4c3dhdGNoLnB5CgouL3Rvb2xzL3B5dGhvbi94ZW4veG06CmNvbnNvbGUucHkg
IGhlbHAucHkJIG1haW4ucHkgICAgIG9wdHMucHkJICBzeXNycS5weQpjcmVhdGUucHkgICBfX2lu
aXRfXy5weSAgbWlncmF0ZS5weSAgc2h1dGRvd24ucHkKCi4vdG9vbHMvdGFyZ2V0OgpkZXYgIGV0
YyAgdXNyCgouL3Rvb2xzL3RhcmdldC9kZXY6CnhlbgoKLi90b29scy90YXJnZXQvZGV2L3hlbjoK
ZXZ0Y2huCgouL3Rvb2xzL3RhcmdldC9ldGM6CnhlbgoKLi90b29scy90YXJnZXQvZXRjL3hlbjoK
ZG9tMSAgeGVuZC1jb25maWcuc3hwCgouL3Rvb2xzL3RhcmdldC91c3I6CmxpYiAgbG9jYWwKCi4v
dG9vbHMvdGFyZ2V0L3Vzci9saWI6CnB5dGhvbgoKLi90b29scy90YXJnZXQvdXNyL2xvY2FsOgph
cm0tcHl0aG9uICB4ZW4tdG9vbHMKCi4vdG9vbHMvdGFyZ2V0L3Vzci9sb2NhbC9hcm0tcHl0aG9u
OgpiaW4gIGxpYgoKLi90b29scy90YXJnZXQvdXNyL2xvY2FsL2FybS1weXRob24vYmluOgppZGxl
ICBweWRvYyAgcHl0aG9uICBweXRob24yLjQJc210cGQucHkKCi4vdG9vbHMvdGFyZ2V0L3Vzci9s
b2NhbC9hcm0tcHl0aG9uL2xpYjoKbGlicHl0aG9uMi40LnNvICBsaWJweXRob24yLjQuc28uMS4w
ICBweXRob24yLjQKCi4vdG9vbHMvdGFyZ2V0L3Vzci9sb2NhbC9hcm0tcHl0aG9uL2xpYi9weXRo
b24yLjQ6CmF0ZXhpdC5weWMJICAgIGdsb2IucHljCSAgIFNpbXBsZVhNTFJQQ1NlcnZlci5weWMg
IHRocmVhZGluZy5weWMKYmFzZTY0LnB5YwkgICAgaHR0cGxpYi5weWMgICAgc2l0ZS5weWMJCSAg
IHRyYWNlYmFjay5weWMKQmFzZUhUVFBTZXJ2ZXIucHljICBsaWItZHlubG9hZCAgICBzb2NrZXQu
cHljCQkgICB0eXBlcy5weWMKY2dpLnB5YwkJICAgIGxpbmVjYWNoZS5weWMgIFNvY2tldFNlcnZl
ci5weWMJICAgdXJsbGliLnB5Ywpjb2RlY3MucHljCSAgICBsb2dnaW5nCSAgIHNyZV9jb21waWxl
LnB5YwkgICB1cmxwYXJzZS5weWMKY29tbWFuZHMucHljCSAgICBtaW1ldG9vbHMucHljICBzcmVf
Y29uc3RhbnRzLnB5YwkgICBVc2VyRGljdC5weWMKY29weV9yZWcucHljCSAgICBvcy5weWMJICAg
c3JlX3BhcnNlLnB5YwkgICB3YXJuaW5ncy5weWMKY3Vyc2VzCQkgICAgcGxhdC1saW51eDIgICAg
c3JlLnB5YwkJICAgeG1sCmVuY29kaW5ncwkgICAgcG9zaXhwYXRoLnB5YyAgc3RhdC5weWMJCSAg
IHhtbHJwY2xpYi5weQpmbm1hdGNoLnB5YwkgICAgcmFuZG9tLnB5YwkgICBTdHJpbmdJTy5weWMJ
CSAgIHhtbHJwY2xpYi5weWMKX19mdXR1cmVfXy5weWMJICAgIHJlLnB5YwkgICBzdHJpbmcucHlj
CmdldG9wdC5weWMJICAgIHJmYzgyMi5weWMJICAgdGVtcGZpbGUucHljCgouL3Rvb2xzL3Rhcmdl
dC91c3IvbG9jYWwvYXJtLXB5dGhvbi9saWIvcHl0aG9uMi40L2N1cnNlczoKYXNjaWkucHkgICBo
YXNfa2V5LnB5CV9faW5pdF9fLnB5ICAgcGFuZWwucHkJIHRleHRwYWQucHkgICB3cmFwcGVyLnB5
CmFzY2lpLnB5YyAgaGFzX2tleS5weWMJX19pbml0X18ucHljICBwYW5lbC5weWMgIHRleHRwYWQu
cHljICB3cmFwcGVyLnB5Ywphc2NpaS5weW8gIGhhc19rZXkucHlvCV9faW5pdF9fLnB5byAgcGFu
ZWwucHlvICB0ZXh0cGFkLnB5byAgd3JhcHBlci5weW8KCi4vdG9vbHMvdGFyZ2V0L3Vzci9sb2Nh
bC9hcm0tcHl0aG9uL2xpYi9weXRob24yLjQvZW5jb2RpbmdzOgphbGlhc2VzLnB5CSAgY3A4NTUu
cHljCSAgICBfX2luaXRfXy5weW8JIG1hY19ncmVlay5weQphbGlhc2VzLnB5YwkgIGNwODU1LnB5
bwkgICAgaXNvMjAyMl9qcF8xLnB5CSBtYWNfZ3JlZWsucHljCmFsaWFzZXMucHlvCSAgY3A4NTYu
cHkJICAgIGlzbzIwMjJfanBfMS5weWMJIG1hY19ncmVlay5weW8KYXNjaWkucHkJICBjcDg1Ni5w
eWMJICAgIGlzbzIwMjJfanBfMS5weW8JIG1hY19pY2VsYW5kLnB5CmFzY2lpLnB5YwkgIGNwODU2
LnB5bwkgICAgaXNvMjAyMl9qcF8yMDA0LnB5CSBtYWNfaWNlbGFuZC5weWMKYXNjaWkucHlvCSAg
Y3A4NTcucHkJICAgIGlzbzIwMjJfanBfMjAwNC5weWMgIG1hY19pY2VsYW5kLnB5bwpiYXNlNjRf
Y29kZWMucHkgICBjcDg1Ny5weWMJICAgIGlzbzIwMjJfanBfMjAwNC5weW8gIG1hY19sYXRpbjIu
cHkKYmFzZTY0X2NvZGVjLnB5YyAgY3A4NTcucHlvCSAgICBpc28yMDIyX2pwXzIucHkJIG1hY19s
YXRpbjIucHljCmJhc2U2NF9jb2RlYy5weW8gIGNwODYwLnB5CSAgICBpc28yMDIyX2pwXzIucHlj
CSBtYWNfbGF0aW4yLnB5bwpiaWc1aGtzY3MucHkJICBjcDg2MC5weWMJICAgIGlzbzIwMjJfanBf
Mi5weW8JIG1hY19yb21hbi5weQpiaWc1aGtzY3MucHljCSAgY3A4NjAucHlvCSAgICBpc28yMDIy
X2pwXzMucHkJIG1hY19yb21hbi5weWMKYmlnNWhrc2NzLnB5bwkgIGNwODYxLnB5CSAgICBpc28y
MDIyX2pwXzMucHljCSBtYWNfcm9tYW4ucHlvCmJpZzUucHkJCSAgY3A4NjEucHljCSAgICBpc28y
MDIyX2pwXzMucHlvCSBtYWNfdHVya2lzaC5weQpiaWc1LnB5YwkgIGNwODYxLnB5bwkgICAgaXNv
MjAyMl9qcF9leHQucHkJIG1hY190dXJraXNoLnB5YwpiaWc1LnB5bwkgIGNwODYyLnB5CSAgICBp
c28yMDIyX2pwX2V4dC5weWMJIG1hY190dXJraXNoLnB5bwpiejJfY29kZWMucHkJICBjcDg2Mi5w
eWMJICAgIGlzbzIwMjJfanBfZXh0LnB5bwkgbWJjcy5weQpiejJfY29kZWMucHljCSAgY3A4NjIu
cHlvCSAgICBpc28yMDIyX2pwLnB5CSBtYmNzLnB5YwpiejJfY29kZWMucHlvCSAgY3A4NjMucHkJ
ICAgIGlzbzIwMjJfanAucHljCSBtYmNzLnB5bwpjaGFybWFwLnB5CSAgY3A4NjMucHljCSAgICBp
c28yMDIyX2pwLnB5bwkgcGFsbW9zLnB5CmNoYXJtYXAucHljCSAgY3A4NjMucHlvCSAgICBpc28y
MDIyX2tyLnB5CSBwYWxtb3MucHljCmNoYXJtYXAucHlvCSAgY3A4NjQucHkJICAgIGlzbzIwMjJf
a3IucHljCSBwYWxtb3MucHlvCmNwMDM3LnB5CSAgY3A4NjQucHljCSAgICBpc28yMDIyX2tyLnB5
bwkgcHRjcDE1NC5weQpjcDAzNy5weWMJICBjcDg2NC5weW8JICAgIGlzbzg4NTlfMTAucHkJIHB0
Y3AxNTQucHljCmNwMDM3LnB5bwkgIGNwODY1LnB5CSAgICBpc284ODU5XzEwLnB5YwkgcHRjcDE1
NC5weW8KY3AxMDA2LnB5CSAgY3A4NjUucHljCSAgICBpc284ODU5XzEwLnB5bwkgcHVueWNvZGUu
cHkKY3AxMDA2LnB5YwkgIGNwODY1LnB5bwkgICAgaXNvODg1OV8xMS5weQkgcHVueWNvZGUucHlj
CmNwMTAwNi5weW8JICBjcDg2Ni5weQkgICAgaXNvODg1OV8xMS5weWMJIHB1bnljb2RlLnB5bwpj
cDEwMjYucHkJICBjcDg2Ni5weWMJICAgIGlzbzg4NTlfMTEucHlvCSBxdW9wcmlfY29kZWMucHkK
Y3AxMDI2LnB5YwkgIGNwODY2LnB5bwkgICAgaXNvODg1OV8xMy5weQkgcXVvcHJpX2NvZGVjLnB5
YwpjcDEwMjYucHlvCSAgY3A4NjkucHkJICAgIGlzbzg4NTlfMTMucHljCSBxdW9wcmlfY29kZWMu
cHlvCmNwMTE0MC5weQkgIGNwODY5LnB5YwkgICAgaXNvODg1OV8xMy5weW8JIHJhd191bmljb2Rl
X2VzY2FwZS5weQpjcDExNDAucHljCSAgY3A4NjkucHlvCSAgICBpc284ODU5XzE0LnB5CSByYXdf
dW5pY29kZV9lc2NhcGUucHljCmNwMTE0MC5weW8JICBjcDg3NC5weQkgICAgaXNvODg1OV8xNC5w
eWMJIHJhd191bmljb2RlX2VzY2FwZS5weW8KY3AxMjUwLnB5CSAgY3A4NzQucHljCSAgICBpc284
ODU5XzE0LnB5bwkgcm90XzEzLnB5CmNwMTI1MC5weWMJICBjcDg3NC5weW8JICAgIGlzbzg4NTlf
MTUucHkJIHJvdF8xMy5weWMKY3AxMjUwLnB5bwkgIGNwODc1LnB5CSAgICBpc284ODU5XzE1LnB5
Ywkgcm90XzEzLnB5bwpjcDEyNTEucHkJICBjcDg3NS5weWMJICAgIGlzbzg4NTlfMTUucHlvCSBz
aGlmdF9qaXNfMjAwNC5weQpjcDEyNTEucHljCSAgY3A4NzUucHlvCSAgICBpc284ODU5XzE2LnB5
CSBzaGlmdF9qaXNfMjAwNC5weWMKY3AxMjUxLnB5bwkgIGNwOTMyLnB5CSAgICBpc284ODU5XzE2
LnB5Ywkgc2hpZnRfamlzXzIwMDQucHlvCmNwMTI1Mi5weQkgIGNwOTMyLnB5YwkgICAgaXNvODg1
OV8xNi5weW8JIHNoaWZ0X2ppcy5weQpjcDEyNTIucHljCSAgY3A5MzIucHlvCSAgICBpc284ODU5
XzEucHkJIHNoaWZ0X2ppcy5weWMKY3AxMjUyLnB5bwkgIGNwOTQ5LnB5CSAgICBpc284ODU5XzEu
cHljCSBzaGlmdF9qaXMucHlvCmNwMTI1My5weQkgIGNwOTQ5LnB5YwkgICAgaXNvODg1OV8xLnB5
bwkgc2hpZnRfamlzeDAyMTMucHkKY3AxMjUzLnB5YwkgIGNwOTQ5LnB5bwkgICAgaXNvODg1OV8y
LnB5CSBzaGlmdF9qaXN4MDIxMy5weWMKY3AxMjUzLnB5bwkgIGNwOTUwLnB5CSAgICBpc284ODU5
XzIucHljCSBzaGlmdF9qaXN4MDIxMy5weW8KY3AxMjU0LnB5CSAgY3A5NTAucHljCSAgICBpc284
ODU5XzIucHlvCSBzdHJpbmdfZXNjYXBlLnB5CmNwMTI1NC5weWMJICBjcDk1MC5weW8JICAgIGlz
bzg4NTlfMy5weQkgc3RyaW5nX2VzY2FwZS5weWMKY3AxMjU0LnB5bwkgIGV1Y19qaXNfMjAwNC5w
eSAgIGlzbzg4NTlfMy5weWMJIHN0cmluZ19lc2NhcGUucHlvCmNwMTI1NS5weQkgIGV1Y19qaXNf
MjAwNC5weWMgIGlzbzg4NTlfMy5weW8JIHRpc182MjAucHkKY3AxMjU1LnB5YwkgIGV1Y19qaXNf
MjAwNC5weW8gIGlzbzg4NTlfNC5weQkgdGlzXzYyMC5weWMKY3AxMjU1LnB5bwkgIGV1Y19qaXN4
MDIxMy5weSAgIGlzbzg4NTlfNC5weWMJIHRpc182MjAucHlvCmNwMTI1Ni5weQkgIGV1Y19qaXN4
MDIxMy5weWMgIGlzbzg4NTlfNC5weW8JIHVuZGVmaW5lZC5weQpjcDEyNTYucHljCSAgZXVjX2pp
c3gwMjEzLnB5byAgaXNvODg1OV81LnB5CSB1bmRlZmluZWQucHljCmNwMTI1Ni5weW8JICBldWNf
anAucHkJICAgIGlzbzg4NTlfNS5weWMJIHVuZGVmaW5lZC5weW8KY3AxMjU3LnB5CSAgZXVjX2pw
LnB5YwkgICAgaXNvODg1OV81LnB5bwkgdW5pY29kZV9lc2NhcGUucHkKY3AxMjU3LnB5YwkgIGV1
Y19qcC5weW8JICAgIGlzbzg4NTlfNi5weQkgdW5pY29kZV9lc2NhcGUucHljCmNwMTI1Ny5weW8J
ICBldWNfa3IucHkJICAgIGlzbzg4NTlfNi5weWMJIHVuaWNvZGVfZXNjYXBlLnB5bwpjcDEyNTgu
cHkJICBldWNfa3IucHljCSAgICBpc284ODU5XzYucHlvCSB1bmljb2RlX2ludGVybmFsLnB5CmNw
MTI1OC5weWMJICBldWNfa3IucHlvCSAgICBpc284ODU5XzcucHkJIHVuaWNvZGVfaW50ZXJuYWwu
cHljCmNwMTI1OC5weW8JICBnYjE4MDMwLnB5CSAgICBpc284ODU5XzcucHljCSB1bmljb2RlX2lu
dGVybmFsLnB5bwpjcDQyNC5weQkgIGdiMTgwMzAucHljCSAgICBpc284ODU5XzcucHlvCSB1dGZf
MTZfYmUucHkKY3A0MjQucHljCSAgZ2IxODAzMC5weW8JICAgIGlzbzg4NTlfOC5weQkgdXRmXzE2
X2JlLnB5YwpjcDQyNC5weW8JICBnYjIzMTIucHkJICAgIGlzbzg4NTlfOC5weWMJIHV0Zl8xNl9i
ZS5weW8KY3A0MzcucHkJICBnYjIzMTIucHljCSAgICBpc284ODU5XzgucHlvCSB1dGZfMTZfbGUu
cHkKY3A0MzcucHljCSAgZ2IyMzEyLnB5bwkgICAgaXNvODg1OV85LnB5CSB1dGZfMTZfbGUucHlj
CmNwNDM3LnB5bwkgIGdiay5weQkgICAgaXNvODg1OV85LnB5YwkgdXRmXzE2X2xlLnB5bwpjcDUw
MC5weQkgIGdiay5weWMJICAgIGlzbzg4NTlfOS5weW8JIHV0Zl8xNi5weQpjcDUwMC5weWMJICBn
YmsucHlvCSAgICBqb2hhYi5weQkJIHV0Zl8xNi5weWMKY3A1MDAucHlvCSAgaGV4X2NvZGVjLnB5
CSAgICBqb2hhYi5weWMJCSB1dGZfMTYucHlvCmNwNzM3LnB5CSAgaGV4X2NvZGVjLnB5YyAgICAg
am9oYWIucHlvCQkgdXRmXzcucHkKY3A3MzcucHljCSAgaGV4X2NvZGVjLnB5byAgICAga29pOF9y
LnB5CQkgdXRmXzcucHljCmNwNzM3LnB5bwkgIGhwX3JvbWFuOC5weQkgICAga29pOF9yLnB5YwkJ
IHV0Zl83LnB5bwpjcDc3NS5weQkgIGhwX3JvbWFuOC5weWMgICAgIGtvaThfci5weW8JCSB1dGZf
OC5weQpjcDc3NS5weWMJICBocF9yb21hbjgucHlvICAgICBrb2k4X3UucHkJCSB1dGZfOC5weWMK
Y3A3NzUucHlvCSAgaHoucHkJCSAgICBrb2k4X3UucHljCQkgdXRmXzgucHlvCmNwODUwLnB5CSAg
aHoucHljCSAgICBrb2k4X3UucHlvCQkgdXVfY29kZWMucHkKY3A4NTAucHljCSAgaHoucHlvCSAg
ICBsYXRpbl8xLnB5CQkgdXVfY29kZWMucHljCmNwODUwLnB5bwkgIGlkbmEucHkJICAgIGxhdGlu
XzEucHljCQkgdXVfY29kZWMucHlvCmNwODUyLnB5CSAgaWRuYS5weWMJICAgIGxhdGluXzEucHlv
CQkgemxpYl9jb2RlYy5weQpjcDg1Mi5weWMJICBpZG5hLnB5bwkgICAgbWFjX2N5cmlsbGljLnB5
CSB6bGliX2NvZGVjLnB5YwpjcDg1Mi5weW8JICBfX2luaXRfXy5weQkgICAgbWFjX2N5cmlsbGlj
LnB5YwkgemxpYl9jb2RlYy5weW8KY3A4NTUucHkJICBfX2luaXRfXy5weWMJICAgIG1hY19jeXJp
bGxpYy5weW8KCi4vdG9vbHMvdGFyZ2V0L3Vzci9sb2NhbC9hcm0tcHl0aG9uL2xpYi9weXRob24y
LjQvbGliLWR5bmxvYWQ6CmF1ZGlvb3Auc28JICAgIGNyeXB0LnNvCSAgICAgIF9sb2NhbGUuc28J
ICByZXNvdXJjZS5zbwpfYmlzZWN0LnNvCSAgICBjU3RyaW5nSU8uc28gICAgICBtZDUuc28JCSAg
c2VsZWN0LnNvCl9jb2RlY3NfY24uc28JICAgIF9jc3Yuc28JICAgICAgbW1hcC5zbwkJICBzaGEu
c28KX2NvZGVjc19oay5zbwkgICAgZGF0ZXRpbWUuc28gICAgICAgX211bHRpYnl0ZWNvZGVjLnNv
ICBzeXNsb2cuc28KX2NvZGVjc19pc28yMDIyLnNvICBmY250bC5zbwkgICAgICBuaXMuc28JCSAg
dGVybWlvcy5zbwpfY29kZWNzX2pwLnNvCSAgICBncnAuc28JICAgICAgb3NzYXVkaW9kZXYuc28J
ICB0aW1pbmcuc28KX2NvZGVjc19rci5zbwkgICAgX2hlYXBxLnNvCSAgICAgIHBhcnNlci5zbwpf
Y29kZWNzX3R3LnNvCSAgICBfaG90c2hvdC5zbyAgICAgICBweWV4cGF0LnNvCmNQaWNrbGUuc28J
ICAgIGxpbnV4YXVkaW9kZXYuc28gIHJlZ2V4LnNvCgouL3Rvb2xzL3RhcmdldC91c3IvbG9jYWwv
YXJtLXB5dGhvbi9saWIvcHl0aG9uMi40L2xvZ2dpbmc6CmNvbmZpZy5weSAgIGNvbmZpZy5weW8J
IGhhbmRsZXJzLnB5YyAgX19pbml0X18ucHkgICBfX2luaXRfXy5weW8KY29uZmlnLnB5YyAgaGFu
ZGxlcnMucHkgIGhhbmRsZXJzLnB5byAgX19pbml0X18ucHljCgouL3Rvb2xzL3RhcmdldC91c3Iv
bG9jYWwvYXJtLXB5dGhvbi9saWIvcHl0aG9uMi40L3BsYXQtbGludXgyOgpDRFJPTS5weSAgIENE
Uk9NLnB5byAgRExGQ04ucHljICBJTi5weQkgSU4ucHlvICBUWVBFUy5weSAgIFRZUEVTLnB5bwpD
RFJPTS5weWMgIERMRkNOLnB5ICAgRExGQ04ucHlvICBJTi5weWMgIHJlZ2VuCSBUWVBFUy5weWMK
Ci4vdG9vbHMvdGFyZ2V0L3Vzci9sb2NhbC9hcm0tcHl0aG9uL2xpYi9weXRob24yLjQveG1sOgpk
b20gIF9faW5pdF9fLnB5ICBfX2luaXRfXy5weWMJX19pbml0X18ucHlvICBwYXJzZXJzICBzYXgK
Ci4vdG9vbHMvdGFyZ2V0L3Vzci9sb2NhbC9hcm0tcHl0aG9uL2xpYi9weXRob24yLjQveG1sL2Rv
bToKZG9tcmVnLnB5CSAgX19pbml0X18ucHkJICBtaW5pZG9tLnB5CSAgcHVsbGRvbS5weQpkb21y
ZWcucHljCSAgX19pbml0X18ucHljCSAgbWluaWRvbS5weWMJICBwdWxsZG9tLnB5Ywpkb21yZWcu
cHlvCSAgX19pbml0X18ucHlvCSAgbWluaWRvbS5weW8JICBwdWxsZG9tLnB5bwpleHBhdGJ1aWxk
ZXIucHkgICBtaW5pY29tcGF0LnB5ICAgTm9kZUZpbHRlci5weSAgIHhtbGJ1aWxkZXIucHkKZXhw
YXRidWlsZGVyLnB5YyAgbWluaWNvbXBhdC5weWMgIE5vZGVGaWx0ZXIucHljICB4bWxidWlsZGVy
LnB5YwpleHBhdGJ1aWxkZXIucHlvICBtaW5pY29tcGF0LnB5byAgTm9kZUZpbHRlci5weW8gIHht
bGJ1aWxkZXIucHlvCgouL3Rvb2xzL3RhcmdldC91c3IvbG9jYWwvYXJtLXB5dGhvbi9saWIvcHl0
aG9uMi40L3htbC9wYXJzZXJzOgpleHBhdC5weSAgZXhwYXQucHljICBleHBhdC5weW8JX19pbml0
X18ucHkgIF9faW5pdF9fLnB5YyAgX19pbml0X18ucHlvCgouL3Rvb2xzL3RhcmdldC91c3IvbG9j
YWwvYXJtLXB5dGhvbi9saWIvcHl0aG9uMi40L3htbC9zYXg6Cl9leGNlcHRpb25zLnB5CSBleHBh
dHJlYWRlci5weWMgIGhhbmRsZXIucHlvCXNheHV0aWxzLnB5ICAgeG1scmVhZGVyLnB5YwpfZXhj
ZXB0aW9ucy5weWMgIGV4cGF0cmVhZGVyLnB5byAgX19pbml0X18ucHkJc2F4dXRpbHMucHljICB4
bWxyZWFkZXIucHlvCl9leGNlcHRpb25zLnB5byAgaGFuZGxlci5weQkgIF9faW5pdF9fLnB5Ywlz
YXh1dGlscy5weW8KZXhwYXRyZWFkZXIucHkJIGhhbmRsZXIucHljCSAgX19pbml0X18ucHlvCXht
bHJlYWRlci5weQoKLi90b29scy90YXJnZXQvdXNyL2xvY2FsL3hlbi10b29sczoKYmluICBsaWIg
IHB5dGhvbiAgc2JpbgoKLi90b29scy90YXJnZXQvdXNyL2xvY2FsL3hlbi10b29scy9iaW46Cnhl
bmNvbnNvbGUJICB4ZW5zdG9yZS1leGlzdHMgIHhlbnN0b3JlLWxzCSAgeGVuc3RvcmUtcm0KeGVu
c3RvcmUtY29udHJvbCAgeGVuc3RvcmUtbGlzdCAgICB4ZW5zdG9yZS1yZWFkICB4ZW5zdG9yZS13
cml0ZQoKLi90b29scy90YXJnZXQvdXNyL2xvY2FsL3hlbi10b29scy9saWI6CmxpYnhlbmN0cmwu
c28JICAgICBsaWJ4ZW5ndWVzdC5zbwkgICBsaWJ4ZW5zdGF0LnNvICAgICAgbGlieGVuc3RvcmUu
c28KbGlieGVuY3RybC5zby4zLjAgICAgbGlieGVuZ3Vlc3Quc28uMy4wICAgIGxpYnhlbnN0YXQu
c28uMApsaWJ4ZW5jdHJsLnNvLjMuMC4wICBsaWJ4ZW5ndWVzdC5zby4zLjAuMCAgbGlieGVuc3Rh
dC5zby4wLjAKCi4vdG9vbHMvdGFyZ2V0L3Vzci9sb2NhbC94ZW4tdG9vbHMvcHl0aG9uOgpNYWtl
ZmlsZSAgeGVuCgouL3Rvb2xzL3RhcmdldC91c3IvbG9jYWwveGVuLXRvb2xzL3B5dGhvbi94ZW46
Cl9faW5pdF9fLnB5ICBsb3dsZXZlbCAgc3YgIHV0aWwgIHdlYiAgeGVuZCAgeG0KCi4vdG9vbHMv
dGFyZ2V0L3Vzci9sb2NhbC94ZW4tdG9vbHMvcHl0aG9uL3hlbi9sb3dsZXZlbDoKX19pbml0X18u
cHkgIE1ha2VmaWxlICB4Yy5jICB4Yy5jfiAgeGMubyAgeGMuc28gIHhzLmMgIHhzLm8gIHhzLnNv
CgouL3Rvb2xzL3RhcmdldC91c3IvbG9jYWwveGVuLXRvb2xzL3B5dGhvbi94ZW4vc3Y6CkNyZWF0
ZURvbWFpbi5weSAgR2VuVGFiYmVkLnB5ICBfX2luaXRfXy5weSAgTm9kZUluZm8ucHkgICAgICAg
dXRpbC5weQpEb21JbmZvLnB5CSBIVE1MQmFzZS5weSAgIE1haW4ucHkJICAgIFJlc3RvcmVEb21h
aW4ucHkgIFdpemFyZC5weQoKLi90b29scy90YXJnZXQvdXNyL2xvY2FsL3hlbi10b29scy9weXRo
b24veGVuL3V0aWw6CmFzc2VydHMucHkgIGJsa2lmLnB5ICBidWd0b29sLnB5ICAgX19pbml0X18u
cHkJbWFjLnB5CXhtbHJwY2xpYjIucHkKYXV4YmluLnB5ICAgQnJjdGwucHkgIGRpYWdub3NlLnB5
ICBpcC5weQlwY2kucHkJeHBvcGVuLnB5CgouL3Rvb2xzL3RhcmdldC91c3IvbG9jYWwveGVuLXRv
b2xzL3B5dGhvbi94ZW4vd2ViOgpjb25uZWN0aW9uLnB5ICBodHRwc2VydmVyLnB5ICBwcm90b2Nv
bC5weSAgU3J2QmFzZS5weSAgc3RhdGljLnB5ICB1bml4LnB5Cmh0dHAucHkgICAgICAgIF9faW5p
dF9fLnB5ICAgIHJlc291cmNlLnB5ICBTcnZEaXIucHkgICB0Y3AucHkKCi4vdG9vbHMvdGFyZ2V0
L3Vzci9sb2NhbC94ZW4tdG9vbHMvcHl0aG9uL3hlbi94ZW5kOgpBcmdzLnB5ICAgICAgUHJldHR5
UHJpbnQucHkgIFhlbmRCb290bG9hZGVyLnB5CVhlbmREb21haW4ucHkJIFhlbmRSb290LnB5CmJh
bGxvb24ucHkgICBzZXJ2ZXIJICAgICBYZW5kQ2hlY2twb2ludC5weQlYZW5kRXJyb3IucHkJIFhl
bmRWbmV0LnB5CmVuY29kZS5weSAgICBzeHAucHkJICAgICBYZW5kQ2xpZW50LnB5CVhlbmRMb2dn
aW5nLnB5CSB4ZW5zdG9yZQppbWFnZS5weSAgICAgdXVpZC5weQkgICAgIFhlbmREbWVzZy5weQlY
ZW5kTm9kZS5weQpfX2luaXRfXy5weSAgVmlmY3RsLnB5CSAgICAgWGVuZERvbWFpbkluZm8ucHkJ
WGVuZFByb3RvY29sLnB5CgouL3Rvb2xzL3RhcmdldC91c3IvbG9jYWwveGVuLXRvb2xzL3B5dGhv
bi94ZW4veGVuZC9zZXJ2ZXI6CmJsa2lmLnB5CSAgaXJxaWYucHkgICBwY2lpZi5weQkgICAgICBT
cnZEb21haW4ucHkgICBTcnZYZW5kTG9nLnB5CkRldkNvbnRyb2xsZXIucHkgIGtwcGlmLnB5ICAg
cmVsb2NhdGUucHkgICAgICBTcnZOb2RlLnB5ICAgICB0cG1pZi5weQpmYmlmLnB5CQkgIGxjZGlm
LnB5ICAgU3J2RGFlbW9uLnB5ICAgICBTcnZSb290LnB5ICAgICB1c2JpZi5weQpfX2luaXRfXy5w
eQkgIG5ldGlmLnB5ICAgU3J2RG1lc2cucHkgICAgICBTcnZTZXJ2ZXIucHkgICB1c2JpZi5weWMK
aW9waWYucHkJICBwYXJhbXMucHkgIFNydkRvbWFpbkRpci5weSAgU3J2Vm5ldERpci5weSAgWE1M
UlBDU2VydmVyLnB5CgouL3Rvb2xzL3RhcmdldC91c3IvbG9jYWwveGVuLXRvb2xzL3B5dGhvbi94
ZW4veGVuZC94ZW5zdG9yZToKX19pbml0X18ucHkgIHhzdHJhbnNhY3QucHkgIHhzdXRpbC5weSAg
eHN3YXRjaC5weQoKLi90b29scy90YXJnZXQvdXNyL2xvY2FsL3hlbi10b29scy9weXRob24veGVu
L3htOgpjb25zb2xlLnB5ICBoZWxwLnB5CSBtYWluLnB5ICAgICBvcHRzLnB5CSAgc3lzcnEucHkK
Y3JlYXRlLnB5ICAgX19pbml0X18ucHkgIG1pZ3JhdGUucHkgIHNodXRkb3duLnB5CgouL3Rvb2xz
L3RhcmdldC91c3IvbG9jYWwveGVuLXRvb2xzL3NiaW46CnhlbmNvbnNvbGVkICB4ZW5kICB4ZW5z
dG9yZWQgIHhlbnRvcCAgeG0KCi4vdG9vbHMveGVuc3RhdDoKbGlieGVuc3RhdCAgTWFrZWZpbGUg
IHhlbnRvcAoKLi90b29scy94ZW5zdGF0L2xpYnhlbnN0YXQ6CmJpbmRpbmdzICBDT1BZSU5HICBN
YWtlZmlsZSAgc3JjCgouL3Rvb2xzL3hlbnN0YXQvbGlieGVuc3RhdC9iaW5kaW5nczoKc3dpZwoK
Li90b29scy94ZW5zdGF0L2xpYnhlbnN0YXQvYmluZGluZ3Mvc3dpZzoKcGVybCAgcHl0aG9uICB4
ZW5zdGF0LmkKCi4vdG9vbHMveGVuc3RhdC9saWJ4ZW5zdGF0L2JpbmRpbmdzL3N3aWcvcGVybDoK
Ci4vdG9vbHMveGVuc3RhdC9saWJ4ZW5zdGF0L2JpbmRpbmdzL3N3aWcvcHl0aG9uOgoKLi90b29s
cy94ZW5zdGF0L2xpYnhlbnN0YXQvc3JjOgpsaWJuY3Vyc2VzLmEJICAgbGlieGVuc3RhdC5hICAg
ICAgIHhlbi1pbnRlcmZhY2UuYyAgeGVuc3RhdC5oCmxpYm5jdXJzZXMuc28JICAgbGlieGVuc3Rh
dC5zbyAgICAgIHhlbi1pbnRlcmZhY2UuaCAgeGVuc3RhdC5vCmxpYm5jdXJzZXMuc28uNSAgICBs
aWJ4ZW5zdGF0LnNvLjAgICAgeGVuLWludGVyZmFjZS5vCmxpYm5jdXJzZXMuc28uNS4zICBsaWJ4
ZW5zdGF0LnNvLjAuMCAgeGVuc3RhdC5jCgouL3Rvb2xzL3hlbnN0YXQveGVudG9wOgpNYWtlZmls
ZSAgVE9ETwl4ZW5zdGF0LmggIHhlbnRvcCAgeGVudG9wLjEgIHhlbnRvcC5jICB4ZW50b3AubwoK
Li90b29scy94ZW5zdG9yZToKQ09QWUlORwkJICAgICB0ZGIuaAkJIHhlbnN0b3JlZF90ZXN0LmgJ
ICB4cy5jCmZha2VfbGlieGMuYwkgICAgIHRkYi5vCQkgeGVuc3RvcmVkX3RyYW5zYWN0aW9uLmMg
IHhzX2NyYXNobWUuYwpoYXNodGFibGUuYwkgICAgIFRPRE8JCSB4ZW5zdG9yZWRfdHJhbnNhY3Rp
b24uaCAgeHMuaApoYXNodGFibGUuaAkgICAgIHV0aWxzLmMJCSB4ZW5zdG9yZWRfdHJhbnNhY3Rp
b24ubyAgeHNfbGliLmMKaGFzaHRhYmxlLm8JICAgICB1dGlscy5oCQkgeGVuc3RvcmVkX3dhdGNo
LmMJICB4c19saWIuaApoYXNodGFibGVfcHJpdmF0ZS5oICB1dGlscy5vCQkgeGVuc3RvcmVkX3dh
dGNoLmgJICB4c19saWIubwpsaWJ4ZW5zdG9yZS5zbwkgICAgIHhlbnN0b3JlX2NsaWVudC5jCSB4
ZW5zdG9yZWRfd2F0Y2gubwkgIHhzX2xpYi5vcGljCmxpc3QuaAkJICAgICB4ZW5zdG9yZS1jb250
cm9sCSB4ZW5zdG9yZS1leGlzdHMJICB4c2xzLmMKbG9nCQkgICAgIHhlbnN0b3JlX2NvbnRyb2wu
YyAgeGVuc3RvcmVfZXhpc3RzLm8JICB4c2xzLm8KTWFrZWZpbGUJICAgICB4ZW5zdG9yZV9jb250
cm9sLm8gIHhlbnN0b3JlLWxpc3QJCSAgeHMub3BpYwpNYWtlZmlsZS5iYWNrdXAgICAgICB4ZW5z
dG9yZWQJCSB4ZW5zdG9yZV9saXN0Lm8JICB4c19yYW5kb20uYwpSRUFETUUJCSAgICAgeGVuc3Rv
cmVkX2NvcmUuYwkgeGVuc3RvcmUtbHMJCSAgeHNfc3RyZXNzLmMKc3BlZWR0ZXN0LmMJICAgICB4
ZW5zdG9yZWRfY29yZS5oCSB4ZW5zdG9yZS1yZWFkCQkgIHhzX3RkYl9kdW1wCnRhbGxvYy5jCSAg
ICAgeGVuc3RvcmVkX2NvcmUubwkgeGVuc3RvcmVfcmVhZC5vCSAgeHNfdGRiX2R1bXAuYwp0YWxs
b2NfZ3VpZGUudHh0ICAgICB4ZW5zdG9yZWRfZG9tYWluLmMgIHhlbnN0b3JlLXJtCQkgIHhzX3Rk
Yl9kdW1wLm8KdGFsbG9jLmgJICAgICB4ZW5zdG9yZWRfZG9tYWluLmggIHhlbnN0b3JlX3JtLm8J
CSAgeHNfdGVzdC5jCnRhbGxvYy5vCSAgICAgeGVuc3RvcmVkX2RvbWFpbi5vICB4ZW5zdG9yZS13
cml0ZQp0ZGIuYwkJICAgICB4ZW5zdG9yZWRfcHJvYy5oCSB4ZW5zdG9yZV93cml0ZS5vCgouL3hl
bjoKYWNtCUNPUFlJTkcgIGluY2x1ZGUgIE1ha2VmaWxlICBzY3JpcHRzICAgVW5pdFRlc3QJeGVu
Lmd6CmFyY2gJZHJpdmVycyAgS2NvbmZpZyAgUG9zdC5tayAgIHNlY3VyaXR5ICB4ZW4JeGVuLXN5
bXMKY29tbW9uCUhJU1RPUlkgIGxvZwkgIFJ1bGVzLm1rICB0b29scyAgICAgeGVuLWJpbgoKLi94
ZW4vYWNtOgphY21fY2hpbmVzZXdhbGxfaG9va3MuYyAgYWNtX251bGxfaG9va3MuYyAgYWNtX3Np
bXBsZV90eXBlX2VuZm9yY2VtZW50X2hvb2tzLmMKYWNtX2NvcmUuYwkJIGFjbV9wb2xpY3kuYwkg
ICBNYWtlZmlsZQoKLi94ZW4vYXJjaDoKYXJtCgouL3hlbi9hcmNoL2FybToKYXJjaC1nb2xkZmlz
aCAgYXJjaC12ZXJzYXRpbGUgIGJ1aWx0X2luLm8gIEtjb25maWcgIE1ha2VmaWxlICB4ZW4KYXJj
aC1pbXgyMSAgICAgYXNtLW9mZnNldHMucyAgIGRlZmNvbmZpZyAgIGxpYgkgICAgUnVsZXMubWsg
IHhlbi5sZHMKCi4veGVuL2FyY2gvYXJtL2FyY2gtZ29sZGZpc2g6CmlycS5jICBLY29uZmlnCU1h
a2VmaWxlICBwbGF0Zm9ybS5jICBzdGFydC5TICB0aW1lLmMKCi4veGVuL2FyY2gvYXJtL2FyY2gt
aW14MjE6CmJ1aWx0X2luLm8gIGlycS5vICAgIE1ha2VmaWxlCSBwbGF0Zm9ybS5vICBzdGFydC5T
ICB0aW1lLm8KaXJxLmMJICAgIEtjb25maWcgIHBsYXRmb3JtLmMgIHN0YXJ0Lm8gICAgIHRpbWUu
YwoKLi94ZW4vYXJjaC9hcm0vYXJjaC12ZXJzYXRpbGU6Cktjb25maWcgICBwbGF0Zm9ybS5jICBz
dGFydC5TCQkgdmVyc2F0aWxlcGJfc2VyaWFsLmMKTWFrZWZpbGUgIFJFQURNRSAgICAgIHZlcnNh
dGlsZXBiX2lycS5jICB2ZXJzYXRpbGVwYl90aW1lLmMKCi4veGVuL2FyY2gvYXJtL2RlZmNvbmZp
ZzoKZGVmY29uZmlnX3ZlcnNhdGlsZXBiCgouL3hlbi9hcmNoL2FybS9saWI6CmFzaGxkaTMuYwkg
ZGVsYXkuUyAgICAgIGxvbmdsb25nLmggIG1lbXplcm8ubyAgdGVzdGNoYW5nZWJpdC5vCmFzaGxk
aTMubwkgZGl2NjQubyAgICAgIE1ha2VmaWxlCSAgbWVtemVyby5TICB0ZXN0Y2hhbmdlYml0LlMK
YXNobGRpMy5TCSBkaXY2NC5TICAgICAgbWVtY2hyLm8JICBtdWxkaTMuYyAgIHRlc3RjbGVhcmJp
dC5vCmFzaHJkaTMubwkgZmluZGJpdC5vICAgIG1lbWNoci5TCSAgbXVsZGkzLm8gICB0ZXN0Y2xl
YXJiaXQuUwphc2hyZGkzLlMJIGZpbmRiaXQuUyAgICBtZW1jcHkubwkgIHB1dHVzZXIubyAgdGVz
dHNldGJpdC5vCmJ1aWx0X2luLm8JIGdjY2xpYi5oICAgICBtZW1jcHkuUwkgIHB1dHVzZXIuUyAg
dGVzdHNldGJpdC5TCmNsZWFyYml0Lm8JIGdldHVzZXIubyAgICBtZW1tb3ZlLm8gICBzZXRiaXQu
byAgIHVhY2Nlc3MubwpjbGVhcmJpdC5TCSBnZXR1c2VyLlMgICAgbWVtbW92ZS5TICAgc2V0Yml0
LlMgICB1YWNjZXNzLlMKY29weV90ZW1wbGF0ZS5TICBsaWIxZnVuY3MubyAgbWVtc2V0Lm8JICBz
dHJjaHIubyAgIHVkaXZkaTMuYwpkZWxheS5vCQkgbGliMWZ1bmNzLlMgIG1lbXNldC5TCSAgc3Ry
Y2hyLlMKCi4veGVuL2FyY2gvYXJtL3hlbjoKYXJjaF9kb21haW4uYwkgY29yZS1hcm05MjYuUwkg
ZW50cnkuUyAgICAgICBNYWtlZmlsZSAgICAgdHJhcHMuYwphcmNoX2RvbWFpbi5vCSBkbWEtb3Au
YwkgZmlxLmMJICAgICAgIG1tLmMJICAgIHRyYXBzLm8KYXNtLW9mZnNldHMuYwkgZG9tMF9vcHMu
YwkgZmlxLm8JICAgICAgIG1tLm8JICAgIHhlbi5sZHMuUwpidWlsdF9pbi5vCSBkb20wX29wcy5v
CSBmbHVzaHRsYi5jICAgIHBoeXNkZXYuYyAgICB4ZW5zZXR1cC5jCmNhY2hlLmMJCSBkb21haW5f
YnVpbGQuYyAgZmx1c2h0bGIubyAgICBwaHlzZGV2Lm8gICAgeGVuc2V0dXAubwpjYWNoZS5vCQkg
ZG9tYWluX2J1aWxkLm8gIGh5cGVyY2FsbHMubyAgdGltZS5jCmNvcHlwYWdlLXY0d2IubyAgZG9t
YWluX3BhZ2UuYwkgaHlwZXJjYWxscy5TICB0aW1lLm8KY29weXBhZ2UtdjR3Yi5TICBkb21haW5f
cGFnZS5vCSBpcnEuYwkgICAgICAgdGxiLXY0d2JpLm8KY29yZS1hcm05MjYubwkgZW50cnkubwkg
aXJxLm8JICAgICAgIHRsYi12NHdiaS5TCgouL3hlbi9jb21tb246CmFjbV9vcHMuYyAgIGVsZi5j
LmVsZgkgICAgIGtleWhhbmRsZXIuYyAgcGFnZV9hbGxvYy5vICBzb2Z0aXJxLmMgICB0cmFjZS5j
CmJpdG1hcC5jICAgIGVsZi5vCSAgICAgbGliLmMJICAgcGVyZmMuYwkgc29mdGlycS5vICAgdHJh
Y2UubwpiaXRtYXAubyAgICBldmVudF9jaGFubmVsLmMgIGxpYi5vCSAgIHJhbmdlc2V0LmMJIHNy
YV9mdW5jLmMgIHZkbWEuYwpidWlsdF9pbi5vICBldmVudF9jaGFubmVsLm8gIGxvZwkgICByYW5n
ZXNldC5vCSBzcmFfb3BzLmMgICB2c3ByaW50Zi5jCmNyYzMyLmMgICAgIGdkYnN0dWIuYwkgICAg
IE1ha2VmaWxlCSAgIHNjaGVkX2J2dC5jCSBzdHJpbmcuYyAgICB2c3ByaW50Zi5vCmRvbTBfb3Bz
LmMgIGdyYW50X3RhYmxlLmMgICAgbWVtb3J5LmMJICAgc2NoZWRfYnZ0Lm8JIHN0cmluZy5vICAg
IHhtYWxsb2MuYwpkb20wX29wcy5vICBncmFudF90YWJsZS5vICAgIG1lbW9yeS5vCSAgIHNjaGVk
X3NlZGYuYyAgc3ltYm9scy5jICAgeG1hbGxvYy5vCmRvbWFpbi5jICAgIEtjb25maWcJICAgICBt
dWx0aWNhbGwuYyAgIHNjaGVkX3NlZGYubyAgc3ltYm9scy5vCmRvbWFpbi5vICAgIGtlcm5lbC5j
CSAgICAgbXVsdGljYWxsLm8gICBzY2hlZHVsZS5jCSB0aW1lci5jCmVsZi5jCSAgICBrZXJuZWwu
bwkgICAgIHBhZ2VfYWxsb2MuYyAgc2NoZWR1bGUubwkgdGltZXIubwoKLi94ZW4vZHJpdmVyczoK
YnVpbHRfaW4ubyAgY2hhciAgTWFrZWZpbGUKCi4veGVuL2RyaXZlcnMvY2hhcjoKYnVpbHRfaW4u
byAgaW14MjFhZHNfc2VyaWFsLmMgIG9tYXAxNjEwX3NlcmlhbC5jICBwcmludGYubyAgc2VyaWFs
Lm8KY29uc29sZS5jICAgTWFrZWZpbGUJICAgICAgIHByaW50Zi5jCQkgIHNlcmlhbC5jCgouL3hl
bi9pbmNsdWRlOgphY20gIGFzbSAgYXNtLWFybSAgcHVibGljICBzZWN1cml0eSAgeGVuCgouL3hl
bi9pbmNsdWRlL2FjbToKYWNtX2NvcmUuaCAgYWNtX2VuZGlhbi5oICBhY21faG9va3MuaAoKLi94
ZW4vaW5jbHVkZS9hc20tYXJtOgphcmNoCQljcHUtb3BzLmggICAgICBndWVzdF9hY2Nlc3MuaCAg
cGFnZS5oLm5ldyAgICAgc2lnbmFsLmgKYXJjaC1nb2xkZmlzaAljdXJyZW50LmggICAgICBoYXJk
aXJxLmggICAgICAgcGFyYW0uaAkgICAgICBzaXplcy5oCmFyY2gtaW14MjEJZGVidWdnZXIuaCAg
ICAgaGFyZHdhcmUuaCAgICAgIHBndGFibGUuaCAgICAgIHN0cmluZy5oCmFyY2gtdmVyc2F0aWxl
CWRlbGF5LmggICAgICAgIGh5cGVyY2FsbC5oICAgICBwbGF0Zm9ybS5oICAgICBzeXN0ZW0uaAph
c20tbWFjcm9zLmgJZGl2NjQuaCAgICAgICAgaW5pdC5oCSAgICAgICBwb3NpeF90eXBlcy5oICB0
ZXJtYml0cy5oCmFzbS1vZmZzZXRzLmgJZG1hLmgJICAgICAgIGlvLmgJICAgICAgIHByb2Nlc3Nv
ci5oICAgIHRpbWUuaAphdG9taWMuaAlkb21haW4uaCAgICAgICBpcnEuaAkgICAgICAgcHJvYy1m
bnMuaCAgICAgdGxiZmx1c2guaAphdXRvY29uZi5oCWVycm5vLWJhc2UuaCAgIGxpbmthZ2UuaCAg
ICAgICBwcm9jaW5mby5oICAgICB0cmFwLmgKYml0b3BzLmgJZXJybm8uaCAgICAgICAgbWVtbWFw
LmggICAgICAgIHB0cmFjZS5oICAgICAgIHR5cGVzLmgKYnVnLmgJCWV2ZW50LmggICAgICAgIG1l
bW9yeS5oICAgICAgICByZWdzLmgJICAgICAgdWFjY2Vzcy5oCmNhY2hlLmgJCWZsdXNodGxiLmgg
ICAgIG1tLmgJICAgICAgIHNlZ21lbnQuaCAgICAgIHVhcnQuaApjb25maWcuaAlnbHVlLmgJICAg
ICAgIG11bHRpY2FsbC5oICAgICBzZXJpYWxfcmVnLmgKY3B1LWRvbWFpbi5oCWdyYW50X3RhYmxl
LmggIHBhZ2UuaAkgICAgICAgc2hhZG93LmgKCi4veGVuL2luY2x1ZGUvYXNtLWFybS9hcmNoLWdv
bGRmaXNoOgpjb25maWcuaCAgZW50cnktbWFjcm8uUyAgaGFyZHdhcmUuaCAgaW8uaCAgaXJxcy5o
ICByZWdzLmggIHRpbWVyLmggIHRpbWV4LmgKCi4veGVuL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlt
eDIxOgpjb25maWcuaCAgICAgICBoYXJkd2FyZS5oICBpby5oICAgICAgbXgyYWRzLmggIHN5c3Rl
bS5oICB1bmNvbXByZXNzLmgKZG1hLmgJICAgICAgIGlteC1kbWEuaCAgIGlycXMuaCAgICBwYXJh
bS5oICAgdGltZXguaAkgdm1hbGxvYy5oCmVudHJ5LW1hY3JvLlMgIGlteC1yZWdzLmggIG14MWFk
cy5oICByZWdzLmggICAgdWFydC5oCgouL3hlbi9pbmNsdWRlL2FzbS1hcm0vYXJjaC12ZXJzYXRp
bGU6CmNvbmZpZy5oICAgICAgIGhhcmR3YXJlLmggIHJlZ3MuaAkgICB0aW1leC5oCmRlYnVnLW1h
Y3JvLlMgIGlvLmgJICAgc2VyaWFsX3BsMDExLmggIHVuY29tcHJlc3MuaApkbWEuaAkgICAgICAg
aXJxcy5oCSAgIHN5c3RlbS5oCSAgIHZpYy5oCmVudHJ5LW1hY3JvLlMgIHBsYXRmb3JtLmggIHRp
bWVyLmgJICAgdm1hbGxvYy5oCgouL3hlbi9pbmNsdWRlL3B1YmxpYzoKYWNtX2Rldi5oICAgICAg
YXJjaC14ODZfNjQuaAlodm0JICAgc2NoZWRfY3RsLmgJdmVyc2lvbi5oCmFjbS5oCSAgICAgICBD
T1BZSU5HCQlpbwkgICBzY2hlZC5oCXhlbi1jb21wYXQuaAphY21fb3BzLmggICAgICBkb20wX29w
cy5oCW1lbW9yeS5oICAgc2VjdXJpdHkJeGVuLmgKYXJjaC1hcm0uaCAgICAgZXZlbnRfY2hhbm5l
bC5oCW5taS5oCSAgIHRyYWNlLmgKYXJjaC1pYTY0LmggICAgZmVhdHVyZXMuaAlwaHlzZGV2Lmgg
IHR5cGVzLmgKYXJjaC14ODZfMzIuaCAgZ3JhbnRfdGFibGUuaAlwbGF0Zm9ybSAgIHZjcHUuaAoK
Li94ZW4vaW5jbHVkZS9wdWJsaWMvaHZtOgpodm1faW5mb190YWJsZS5oICBpb3JlcS5oICB2bXhf
YXNzaXN0LmgKCi4veGVuL2luY2x1ZGUvcHVibGljL2lvOgpibGtpZi5oICAgIG10ZGlmLmggIHBj
aWlmLmggIHRwbWlmLmggICB4c193aXJlLmgKY29uc29sZS5oICBuZXRpZi5oICByaW5nLmggICB4
ZW5idXMuaAoKLi94ZW4vaW5jbHVkZS9wdWJsaWMvcGxhdGZvcm06CnZkbWEuaAoKLi94ZW4vaW5j
bHVkZS9wdWJsaWMvc2VjdXJpdHk6CnNlY3VyZV9zdG9yYWdlX3N0cnVjdC5oICBzcmFfb3BzLmgK
Ci4veGVuL2luY2x1ZGUvc2VjdXJpdHk6CmFjbSAgY3J5cHRvICBzc20teGVuCgouL3hlbi9pbmNs
dWRlL3NlY3VyaXR5L2FjbToKYWNpX2dlbmVyYXRvci5oICBhY21faG9va3MuaCAgZGVjaXNpb25f
Y2FjaGUuaAkgIHRlX2V4dHJhLmgKYWNtLmgJCSBiaWJhX2JscC5oICAgcG9saWN5X2NvbmR1Y3Rv
ci5oICB0ZS5oCgouL3hlbi9pbmNsdWRlL3NlY3VyaXR5L2NyeXB0bzoKQ3JBRVNBbGcuaCAgICBD
ckV2cC5oCQljcnlwdG8uaAkgICAgVGxzQ3JIYXNoLmgKQ3JBRVNBcGkuaCAgICBDckhNYWMuaAkJ
RGVidWdQcmludC5oCSAgICBUbHNDcktleVN0LmgKQ3JBRVMuaCAgICAgICBDclJhbmQuaAkJSVNF
Q0NvbmZpZy5oCSAgICBUbHNDck1lbU1nci5oCkNyQk5Db25maWcuaCAgQ3JSU0EuaAkJcnNhX2tl
eS5oCSAgICBUbHNDclJTQS5oCkNyQk4uaAkgICAgICBDclNIQS5oCQlUbHNDckFwaVJvb3QuaAkg
ICAgVGxzQ3JSU0FNZW0uaApDckJOTGNsLmggICAgIENyU0hBTGNsLmgJVGxzQ3JBcGlUZXN0LmgJ
ICAgIFRsc0NyU2VjdXJpdHkuaApDckJOUHJpbWUuaCAgIENyU01lbU1nci5oCVRsc0NyQmxvY2tD
aXBoZXIuaCAgVGxzQ3JTU0xlYXlMaWIuaApDckNvbmZpZy5oICAgIENyU3djUmFuZC5oCVRsc0Ny
Q29uZmlnLmgJICAgIFRsc0NyU1NMZWF5UlNBLmgKQ3JFcnJvci5oICAgICBDclN3Y1JhbmRvbUxj
bC5oCVRsc0NyRXJyb3IuaAoKLi94ZW4vaW5jbHVkZS9zZWN1cml0eS9zc20teGVuOgpzcmFfZnVu
Yy5oCgouL3hlbi9pbmNsdWRlL3hlbjoKYWNtX3BvbGljeS5oICBkZWxheS5oCSAgICAgIGlvY2Fw
LmgJICAgICBwZXJjcHUuaAkgICBzcmFfZnVuYy5oCmFjcGkuaAkgICAgICBkbWEuaAkgICAgICBp
cnFfY3B1c3RhdC5oICBwZXJmY19kZWZuLmggIHN0cmluZy5oCmF1dG9jb25mLmggICAgZG1pLmgJ
ICAgICAgaXJxLmgJICAgICBwZXJmYy5oCSAgIHN5bWJvbHMuaApiYW5uZXIuaCAgICAgIGRvbWFp
bi5oCSAgICAgIGtlcm5lbC5oCSAgICAgcHJlZmV0Y2guaCAgICB0aW1lLmgKYml0bWFwLmggICAg
ICBkb21haW5fcGFnZS5oICAga2V4ZWMuaAkgICAgIHJhbmdlc2V0LmggICAgdGltZXIuaApiaXRv
cHMuaCAgICAgIGVsZmNvcmUuaCAgICAgICBrZXloYW5kbGVyLmggICByY3VwZGF0ZS5oICAgIHRy
YWNlLmgKYnl0ZW9yZGVyICAgICBlbGYuaAkgICAgICBsaWIuaAkgICAgIHJlYm9vdC5oCSAgIHR5
cGVzLmgKY2FjaGUuaCAgICAgICBlcnJuby5oCSAgICAgIGxpbmthZ2UuaCAgICAgIHNjaGVkLmgJ
ICAgdmVyc2lvbi5oCmNvbXBpbGUuaCAgICAgZXZlbnQuaAkgICAgICBsaXN0LmgJICAgICBzY2hl
ZC1pZi5oICAgIHZnYS5oCmNvbXBpbGUuaC5pbiAgZm9yZWdyb3VuZC5oICAgIG1tLjMuMC4yLmgg
ICAgIHNlcmlhbC5oCSAgIHhlbmNvbW0uaApjb21waWxlci5oICAgIGdkYnN0dWIuaCAgICAgICBt
bS5oCSAgICAgc2hhZG93LmgJICAgeGVub3Byb2YuaApjb25maWcuaCAgICAgIGdyYW50X3RhYmxl
LmggICBtdWx0aWJvb3QuaCAgICBzaGFyZWQuaAkgICB4bWFsbG9jLmgKY29uc29sZS5oICAgICBn
dWVzdF9hY2Nlc3MuaCAgbXVsdGljYWxsLmggICAgc2h1dGRvd24uaApjcHVtYXNrLmggICAgIGh5
cGVyY2FsbC5oICAgICBubWkuaAkgICAgIHNtcC5oCmN0eXBlLmggICAgICAgaW5pdC5oCSAgICAg
IG5vZGVtYXNrLmggICAgIHNvZnRpcnEuaApkZWJ1Zy5oICAgICAgIGludHR5cGVzLmggICAgICBu
dW1hLmgJICAgICBzcGlubG9jay5oCgouL3hlbi9pbmNsdWRlL3hlbi9ieXRlb3JkZXI6CmJpZ19l
bmRpYW4uaCAgZ2VuZXJpYy5oICBsaXR0bGVfZW5kaWFuLmggIHN3YWIuaAoKLi94ZW4vc2NyaXB0
czoKa2NvbmZpZyAgTWFrZWZpbGUKCi4veGVuL3NjcmlwdHMva2NvbmZpZzoKY29uZi5jCSAgICAg
aW1hZ2VzLmMJICAgICBseGRpYWxvZyAgUE9URklMRVMuaW4gIHpjb25mLmhhc2guYwpjb25mZGF0
YS5jICAga2NvbmZpZ19sb2FkLmMgIE1ha2VmaWxlICBxY29uZi5jYyAgICAgemNvbmYubApleHBy
LmMJICAgICBreGdldHRleHQuYyAgICAgbWNvbmYgICAgIHFjb25mLmgJICAgIHpjb25mLnRhYi5j
X3NoaXBwZWQKZXhwci5oCSAgICAgbGV4Lnpjb25mLmMgICAgIG1jb25mLmMgICBzeW1ib2wuYyAg
ICAgemNvbmYudGFiLm8KZ2NvbmYuYyAgICAgIGxrYy5oCSAgICAgbWNvbmYubyAgIHV0aWwuYwkg
ICAgemNvbmYueQpnY29uZi5nbGFkZSAgbGtjX3Byb3RvLmggICAgIG1lbnUuYyAgICB6Y29uZi5n
cGVyZgoKLi94ZW4vc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nOgpCSUcuRkFULldBUk5JTkcgIGNo
ZWNrLWx4ZGlhbG9nLnNoICBpbnB1dGJveC5vCXRleHRib3guYyAgdXRpbC5vCmNoZWNrbGlzdC5j
CSBkaWFsb2cuaAkgICAgbWVudWJveC5jCXRleHRib3gubyAgeWVzbm8uYwpjaGVja2xpc3Qubwkg
aW5wdXRib3guYwkgICAgbWVudWJveC5vCXV0aWwuYwkgICB5ZXNuby5vCgouL3hlbi9zZWN1cml0
eToKYWNtICBjcnlwdG8gIEtjb25maWcgIE1ha2VmaWxlCXNzbS14ZW4KCi4veGVuL3NlY3VyaXR5
L2FjbToKYWNpX2dlbmVyYXRvci5jICAgICAgIGJpYmEuYwkJcG9saWN5X2NvbmR1Y3Rvci5jCSB0
ZV9leHRyYS5jCmFjaV9nZW5lcmF0b3Jfc3R1Yi5jICBibHAuYwkJcG9saWN5X2NvbmR1Y3Rvcl9z
dHViLmMgIHRlX2V4dHJhLmgKYWNtX2hvb2tzLmMJICAgICAgY2hpbmVzZXdhbGwuYwlwcm9wLmgJ
CQkgdGUuaAphY21faG9va3Nfc3R1Yi5jICAgICAgY2hpbmVzZXdhbGwuaAlwcm9wcmlldGFyeS5j
CmFjbV9pbnRlZ3JhdG9yLmMgICAgICBkZWNpc2lvbl9jYWNoZS5jCXByb3ByaWV0YXJ5LmgKYmli
YV9ibHAuaAkgICAgICBNYWtlZmlsZQkJdGUuYwoKLi94ZW4vc2VjdXJpdHkvY3J5cHRvOgpidWls
dF9pbi5vICAgQ3JCTk1vZG11bC5jICBDckJOU3FyLmMJICAgQ3JSYW5kU2VlZC5jICByc2Ffa2V5
LmMKQ3JBRVNBbGcuYyAgIENyQk5Nb250LmMgICAgQ3JCTlNxcnQuYwkgICBDclJTQUVheS5jCSBU
bHNDckJsb2NrY2lwaGVyLmMKQ3JBRVNBcGkuYyAgIENyQk5NcGkuYwkgICBDckJOU3ViLmMJICAg
Q3JSU0FHZW4uYwkgVGxzQ3JIYXNoLmMKQ3JCTkFkZC5jICAgIENyQk5NdWwuYwkgICBDckJOV29y
ZC5jCSAgIENyUlNBTGliLmMJIFRsc0NyTWVtLmMKQ3JCTkJsaW5kLmMgIENyQk5NdWx3LmMgICAg
Q3JFQ0JDQS5jCSAgIENyU0hBMURnc3QuYyAgVGxzQ3JSU0EuYwpDckJORGl2LmMgICAgQ3JCTlBy
aW1lLmMgICBDckVDRkIxQS5jCSAgIENyU0hBMU9uZS5jCSBUbHNDclJTQU1lbS5jCkNyQk5FeHAu
YyAgICBDckJOUHJpbnQuYyAgIENyRUVDQkEuYwkgICBDclNNZW1NZ3IuYwkgVGxzQ3JTU0xlYXlM
aWIuYwpDckJOR2NkLmMgICAgQ3JCTlJhbmQuYyAgICBDckVOdWxsLmMJICAgY3J5cHRvLmMJIFRs
c0NyU1NMZWF5UlNBLmMKQ3JCTkxpYi5jICAgIENyQk5SZWNwLmMgICAgQ3JFdnBFbmMuYwkgICBj
cnlwdG8ubwpDckJOTW9kLmMgICAgQ3JCTlNoaWZ0LmMgICBDclBzZXVkb1JhbmQuYyAgTWFrZWZp
bGUKCi4veGVuL3NlY3VyaXR5L3NzbS14ZW46CmJ1aWx0X2luLm8gIGNyYzMyLm8gICBzcmFfZnVu
Yy5jICBzcmFfb3BzLmMKY3JjMzIuYyAgICAgTWFrZWZpbGUgIHNyYV9mdW5jLm8gIHNyYV9vcHMu
bwoKLi94ZW4vdG9vbHM6CmZpZ2xldAlNYWtlZmlsZSAgc3ltYm9scyAgc3ltYm9scy5jCgouL3hl
bi90b29scy9maWdsZXQ6CmZpZ2xldAlmaWdsZXQuYyAgTElDRU5TRSAgTWFrZWZpbGUgIFJFQURN
RSAgeGVuLmZsZgoKLi94ZW4vVW5pdFRlc3Q6CmNyeXB0b190ZXN0ICBlbWJVbml0ICBleGFtcGxl
ICBNYWtlZmlsZSAgc2VjdXJlX3N0b3JhZ2VfdGVzdCAgdG9vbHMKCi4veGVuL1VuaXRUZXN0L2Ny
eXB0b190ZXN0OgpjcnlwdG9fdGVzdC5jICBNYWtlZmlsZQoKLi94ZW4vVW5pdFRlc3QvZW1iVW5p
dDoKQXNzZXJ0SW1wbC5jICAgT3V0cHV0dGVyLmggICAgIFRlc3RDYWxsZXIuaCAgICBUZXN0UmVz
dWx0LmgJVGV4dE91dHB1dHRlci5oCkFzc2VydEltcGwuaCAgIFJlcGVhdGVkVGVzdC5jICBUZXN0
Q2FzZS5jICAgICAgVGVzdFJ1bm5lci5jCVRleHRVSVJ1bm5lci5jCmNvbmZpZy5oICAgICAgIFJl
cGVhdGVkVGVzdC5oICBUZXN0Q2FzZS5oICAgICAgVGVzdFJ1bm5lci5oCVRleHRVSVJ1bm5lci5o
CmVtYlVuaXQuaCAgICAgIHN0ZEltcGwuYyAgICAgICBUZXN0LmgJICAgICAgIFRlc3RTdWl0ZS5j
CVhNTE91dHB1dHRlci5jCkhlbHBlck1hY3JvLmggIHN0ZEltcGwuaCAgICAgICBUZXN0TGlzdGVu
ZXIuaCAgVGVzdFN1aXRlLmgJWE1MT3V0cHV0dGVyLmgKTWFrZWZpbGUgICAgICAgVGVzdENhbGxl
ci5jICAgIFRlc3RSZXN1bHQuYyAgICBUZXh0T3V0cHV0dGVyLmMKCi4veGVuL1VuaXRUZXN0L2V4
YW1wbGU6CkFsbFRlc3RzLmMgIGFzc2VydFRlc3QuYyAgTWFrZWZpbGUKCi4veGVuL1VuaXRUZXN0
L3NlY3VyZV9zdG9yYWdlX3Rlc3Q6CkFsbFRlc3RzLmMJCWZfc3JhX2dldF9pbWFnZS5jICAgICAg
Zl9zcmFfc2V0X2ltYWdlLmMgIE1ha2VmaWxlCmNvbW1vbl9mdW5jX2Zvcl90ZXN0LmMJZl9zcmFf
Z2V0X3NwLmMJICAgICAgIGZfc3JhX3NldF9tYmIuYwpjb21tb25fZnVuY19mb3JfdGVzdC5oCWZf
c3JhX21ha2VfZW5jX3BhcnQuYyAgZl9zcmFfc2V0X3NwLmMKCi4veGVuL1VuaXRUZXN0L3Rvb2xz
OgptYWtlZmlsZSAgcmVhZG1lX2VuLnR4dCAgdGJjdXBwYSAgdGJ1bWEKCi4veGVuL1VuaXRUZXN0
L3Rvb2xzL3RiY3VwcGE6CmJjdXBwYS5jICBzdHJ2ZWMuYyAgc3RydmVjLmggIHRjdXBwYS5jCgou
L3hlbi9Vbml0VGVzdC90b29scy90YnVtYToKYnVtYS5jCXR1bWEuYwo=
--e89a8f83a53f0eebee04b5611dd4
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Xen-arm mailing list
Xen-arm@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-arm

--e89a8f83a53f0eebee04b5611dd4--


