| ofs | hex dump | ascii |
|---|
| 0000 | 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 02 3c 00 00 01 46 08 06 00 00 00 6e 5e 45 | .PNG........IHDR...<...F.....n^E |
| 0020 | a0 00 00 00 09 70 48 59 73 00 00 0b 13 00 00 0b 13 01 00 9a 9c 18 00 00 01 d5 69 54 58 74 58 4d | .....pHYs.................iTXtXM |
| 0040 | 4c 3a 63 6f 6d 2e 61 64 6f 62 65 2e 78 6d 70 00 00 00 00 00 3c 78 3a 78 6d 70 6d 65 74 61 20 78 | L:com.adobe.xmp.....<x:xmpmeta.x |
| 0060 | 6d 6c 6e 73 3a 78 3d 22 61 64 6f 62 65 3a 6e 73 3a 6d 65 74 61 2f 22 20 78 3a 78 6d 70 74 6b 3d | mlns:x="adobe:ns:meta/".x:xmptk= |
| 0080 | 22 58 4d 50 20 43 6f 72 65 20 35 2e 31 2e 32 22 3e 0a 20 20 20 3c 72 64 66 3a 52 44 46 20 78 6d | "XMP.Core.5.1.2">....<rdf:RDF.xm |
| 00a0 | 6c 6e 73 3a 72 64 66 3d 22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f 72 67 2f 31 39 39 39 2f | lns:rdf="http://www.w3.org/1999/ |
| 00c0 | 30 32 2f 32 32 2d 72 64 66 2d 73 79 6e 74 61 78 2d 6e 73 23 22 3e 0a 20 20 20 20 20 20 3c 72 64 | 02/22-rdf-syntax-ns#">.......<rd |
| 00e0 | 66 3a 44 65 73 63 72 69 70 74 69 6f 6e 20 72 64 66 3a 61 62 6f 75 74 3d 22 22 0a 20 20 20 20 20 | f:Description.rdf:about=""...... |
| 0100 | 20 20 20 20 20 20 20 78 6d 6c 6e 73 3a 74 69 66 66 3d 22 68 74 74 70 3a 2f 2f 6e 73 2e 61 64 6f | .......xmlns:tiff="http://ns.ado |
| 0120 | 62 65 2e 63 6f 6d 2f 74 69 66 66 2f 31 2e 30 2f 22 3e 0a 20 20 20 20 20 20 20 20 20 3c 74 69 66 | be.com/tiff/1.0/">..........<tif |
| 0140 | 66 3a 43 6f 6d 70 72 65 73 73 69 6f 6e 3e 35 3c 2f 74 69 66 66 3a 43 6f 6d 70 72 65 73 73 69 6f | f:Compression>5</tiff:Compressio |
| 0160 | 6e 3e 0a 20 20 20 20 20 20 20 20 20 3c 74 69 66 66 3a 50 68 6f 74 6f 6d 65 74 72 69 63 49 6e 74 | n>..........<tiff:PhotometricInt |
| 0180 | 65 72 70 72 65 74 61 74 69 6f 6e 3e 32 3c 2f 74 69 66 66 3a 50 68 6f 74 6f 6d 65 74 72 69 63 49 | erpretation>2</tiff:PhotometricI |
| 01a0 | 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 3c 74 69 66 66 3a 4f 72 | nterpretation>..........<tiff:Or |
| 01c0 | 69 65 6e 74 61 74 69 6f 6e 3e 31 3c 2f 74 69 66 66 3a 4f 72 69 65 6e 74 61 74 69 6f 6e 3e 0a 20 | ientation>1</tiff:Orientation>.. |
| 01e0 | 20 20 20 20 20 3c 2f 72 64 66 3a 44 65 73 63 72 69 70 74 69 6f 6e 3e 0a 20 20 20 3c 2f 72 64 66 | .....</rdf:Description>....</rdf |
| 0200 | 3a 52 44 46 3e 0a 3c 2f 78 3a 78 6d 70 6d 65 74 61 3e 0a 6d 05 0b 9e 00 00 40 00 49 44 41 54 78 | :RDF>.</x:xmpmeta>.m.....@.IDATx |
| 0220 | 01 ec 5d 07 60 16 55 b6 3e e9 21 8d 84 84 84 4e 42 ef bd 83 54 e9 d2 bb d2 ec 75 75 dd f5 ed ea | ..].`.U.>.!....NB...T.....uu.... |
| 0240 | ba 96 d5 b7 ee ae ee be b5 8b 1d 0b 2a 20 d2 7b 11 90 de 7b ef 04 08 bd a4 f7 f7 7d e7 cf 0d 3f | ............*..{...{.......}...? |
| 0260 | 31 a1 48 42 da bd 3a 99 99 3b 77 ee dc 39 33 fc f7 9b 73 be 73 8e 4b 3a 8a d8 62 25 60 25 60 25 | 1.HB..:..;w..93...s.s.K:..b%`%`% |
| 0280 | 60 25 60 25 60 25 60 25 50 84 25 e0 5a 84 ef cd de 9a 95 80 95 80 95 80 95 80 95 80 95 80 95 80 | `%`%`%`%P.%.Z................... |
| 02a0 | 4a c0 02 1e fb 22 58 09 58 09 58 09 58 09 58 09 58 09 14 79 09 58 c0 53 e4 1f b1 bd 41 2b 01 2b | J...."X.X.X.X.X.X..y.X.S....A+.+ |
| 02c0 | 01 2b 01 2b 01 2b 01 2b 01 0b 78 ec 3b 60 25 60 25 60 25 60 25 60 25 60 25 50 e4 25 e0 5e e4 ef | .+.+.+.+..x.;`%`%`%`%`%`%P.%.^.. |
| 02e0 | d0 de a0 95 40 31 95 80 b3 3f 82 f3 76 31 15 47 ae de b6 8b 8b 4b 66 7f ce db 99 95 76 c3 4a c0 | ....@1...?..v1.G.....Kf.....v.J. |
| 0300 | 4a a0 c0 49 c0 02 9e 02 f7 48 ec 80 ac 04 6e 4e 02 04 31 5c 52 53 53 75 cd b3 4c 5d d6 ed 9b eb | J..I.....H....nN..1\RSSu..L].... |
| 0320 | d1 b6 ba 55 09 10 ec 18 c0 e3 bc ed ea ea 2a 5c 9c eb 6e b5 6f db de 4a c0 4a 20 77 25 60 01 4f | ...U..........*\..n.o..J.J.w%`.O |
| 0340 | ee ca 33 5f 7b 4b 4b 4b 93 e9 d3 a7 cb 80 01 03 6e 7a 1c 4b 96 2c 91 2f bf fc 52 76 ef de 2d 65 | ..3_{KKK........nz.K.,./..Rv..-e |
| 0360 | cb 96 95 b1 63 c7 ca a0 41 83 6e fa fc bc 6e 98 92 92 a2 13 07 27 8f 89 13 27 8a b7 b7 b7 f4 eb | ....c...A.n...n......'...'...... |
| 0380 | d7 2f af 2f 5b a0 fb e7 73 36 20 c7 00 1e d6 71 9b f2 62 e1 36 0b eb 6d c9 3b 09 f0 bd 64 31 a0 | ././[...s6.....q..b.6..m.;...d1. |
| 03a0 | c7 cd cd 4d b8 38 03 1e b3 6f da e4 dd 68 6c cf 56 02 56 02 d7 93 80 05 3c d7 93 4e 21 3b f6 f1 | ...M.8...o...hl.V.V.....<..N!;.. |
| 03c0 | c7 1f cb 2b af bc 72 d3 80 e7 d3 4f 3f 95 e7 9f 7f 5e 5e 7b ed 35 79 ec b1 c7 64 f5 ea d5 f2 bb | ...+..r....O?....^^{.5y...d..... |
| 03e0 | df fd 4e 8e 1d 3b 26 cf 3e fb 6c 81 b8 fb a1 43 87 ca 3d f7 dc 23 0f 3c f0 40 e6 44 52 20 06 96 | ..N..;&.>.l....C..=..#.<.@.DR... |
| 0400 | 0f 83 20 88 31 60 87 6b b3 dd b1 63 47 05 ac 66 48 06 ec 98 7d bb ce 7b 09 64 05 33 dc 7f e3 8d | ....1`.k...cG..fH...}..{.d.3.... |
| 0420 | 37 e4 91 47 1e 51 f0 49 00 64 80 4f de 8f c6 5e c1 4a c0 4a 20 3b 09 58 c0 93 9d 54 0a 59 dd 81 | 7..G.Q.I.d.O...^.J.J.;.X...T.Y.. |
| 0440 | 03 07 a4 5d bb 76 72 fa f4 69 29 5d ba f4 35 a3 bf 74 e9 92 9c 38 71 42 ea d6 ad 7b 4d fd 85 0b | ...].vr..i)]..5..t...8qB...{M... |
| 0460 | 17 e4 7f fe e7 7f 64 d2 a4 49 d2 ad 5b 37 3d d6 b6 6d 5b a9 5c b9 b2 3c fd f4 d3 f2 cc 33 cf e8 | ......d..I..[7=..m[.\..<.....3.. |
| 0480 | 57 2a fb 5c b0 60 81 7e c1 f6 ea d5 4b 4a 95 2a a5 6d 97 2f 5f 2e cd 9a 35 93 95 2b 57 ca c5 8b | W*.\.`.~....KJ.*.m./_...5..+W... |
| 04a0 | 17 a5 4b 97 2e 12 1c 1c 2c 97 2f 5f 96 bd 7b f7 4a d5 aa 55 65 f1 e2 c5 12 18 18 28 77 df 7d b7 | ..K.....,./_..{.J..Ue......(w.}. |
| 04c0 | f6 c5 13 63 62 62 84 5a 25 16 4e d4 01 01 01 ba cd 3f eb d7 af 97 2d 5b b6 08 c7 51 a7 4e 1d d9 | ...cbb.Z%.N......?....-[...Q.N.. |
| 04e0 | bf 7f bf de d3 ce 9d 3b f5 1e 1a 37 6e ac 93 86 39 61 f3 e6 cd b2 6e dd 3a a9 54 a9 92 f4 e8 d1 | .......;...7n...9a....n.:.T..... |
| 0500 | 43 c7 78 a3 eb 9b 73 0b e3 da 00 1c ae 93 93 93 55 cb 93 94 94 a4 60 a7 75 e7 6a d2 ee 9e c6 85 | C.x...s.........U.....`.u.j..... |
| 0520 | f1 b6 8a e4 98 3f 79 63 16 fe 6d fc 22 63 c6 8c 11 77 77 77 5d 0c 28 32 5a a1 22 79 e3 f6 a6 ac | .....?yc..m."c...www].(2Z."y.... |
| 0540 | 04 0a b0 04 5c f0 35 68 23 2d 17 e0 07 74 33 43 e3 04 48 20 b1 71 e3 46 19 36 6c 98 9c 39 73 26 | ....\.5h#-...t3C..H..q.F.6l..9s& |
| 0560 | f3 34 02 9a 3f fe f1 8f 72 fc f8 f1 cc 3a 6e d0 f4 45 60 73 f4 e8 d1 6b ea 9d 77 b6 6d db a6 40 | .4..?...r....:n..E`s...k..w.m..@ |
| 0580 | a6 75 eb d6 6a ee 9a 35 6b 96 2c 5d ba 54 aa 57 af 2e 15 2a 54 50 50 53 a5 4a 15 05 2a 34 a5 d0 | .u..j..5k.,].T.W...*TPPS.J..*4.. |
| 05a0 | 2c b6 66 cd 1a 19 3e 7c b8 b6 6f d4 a8 91 7c ff fd f7 f2 d4 53 4f c9 df ff fe 77 05 2d 9d 3a 75 | ,.f...>|..o...|.....SO....w.-.:u |
| 05c0 | 92 6a d5 aa 29 30 8a 8c 8c 54 50 c4 fd b7 de 7a 4b a8 a1 a2 36 67 ce 9c 39 aa 71 22 68 a2 a6 29 | .j..)0...TP....zK...6g..9.q"h..) |
| 05e0 | 3c 3c 5c cf e7 bd f8 f9 f9 c9 eb af bf 2e ff fd ef 7f e5 e5 97 5f d6 09 85 80 88 a6 2e 9e 77 bd | <<\.................._........w. |
| 0600 | eb 3b df 5b 61 db e6 33 e6 42 39 13 ec 70 49 48 48 90 c4 c4 44 05 87 4f ff a5 ab 8c fc 4b ff c2 | .;.[a..3.B9..pIHH...D..O.....K.. |
| 0620 | 76 5b 45 76 bc c3 5b bc 26 35 2b 35 92 8f c6 7d 2c 5e 5e 5e 0a d4 3d 3c 3c 32 c1 4f 91 bd 71 7b | v[Ev..[.&5+5...},^^^..=<<2.O..q{ |
| 0640 | 63 56 02 05 58 02 d6 2d bd 00 3f 9c 9b 1d 1a bf 18 a9 29 21 18 c8 5a c8 77 a1 d6 24 6b 39 72 e4 | cV..X..-..?.......)!..Z.w..$k9r. |
| 0660 | 88 6a 73 b2 d6 3b ef bf f0 c2 0b 6a e2 9a 31 63 86 82 91 d1 a3 47 cb df fe f6 b7 cc 26 f7 dd 77 | .js..;.....j..1c.....G......&..w |
| 0680 | 9f f2 7f b6 6e dd 2a 27 4f 9e 94 43 87 0e e9 31 02 ae a9 53 a7 ca b8 71 e3 e4 bb ef be 93 79 f3 | ....n.*'O..C...1...S...q......y. |
| 06a0 | e6 69 3d cd 6d d4 f6 10 98 50 33 44 ae 10 81 ce b9 73 e7 14 bc cc 9d 3b 57 de 7e fb 6d 6d bf 70 | .i=.m....P3D.....s.....;W.~.mm.p |
| 06c0 | e1 42 e5 ea 10 34 8d 1c 39 52 08 ba 4c 39 7f fe bc bc f8 e2 8b aa dd 79 ff fd f7 65 d1 a2 45 7a | .B...4..9R..L9.........y...e..Ez |
| 06e0 | 6d 8e 93 25 a7 eb 9b f3 0b e3 da 19 ec 90 bf 63 c0 0e d7 2c f6 ab a5 e0 3d d5 64 80 53 3e 1f 2e | m..%...........c...,....=.d.S>.. |
| 0700 | 7c 66 04 ab 06 b8 16 bc d1 da 11 59 09 14 7d 09 58 93 56 11 7f c6 fc ba e4 92 b5 94 2b 57 4e 4d | |f.........Y..}.X.V.........+WNM |
| 0720 | 4f 54 f0 19 55 bb 69 43 4d 0d b5 2e 34 31 51 8b 62 4a 9b 36 6d ae d9 6f d5 aa 95 1e 22 37 81 84 | OT..U.iCM...41Q.bJ.6m..o...."7.. |
| 0740 | e7 b3 67 cf ea 3e 4d 4c dc 67 a9 58 b1 62 a6 c6 69 d5 aa 55 6a 72 1b 35 6a 94 1e a3 d6 89 9a 0a | ..g..>ML.g.X.b..i..Ujr.5j....... |
| 0760 | 6a 68 82 82 82 54 73 c4 03 d4 1a 11 fc e4 54 b6 6f df ae fd d4 ae 5d 5b 9b f0 fa 2d 5a b4 90 5d | jh...Ts.......T.o.....][...-Z..] |
| 0780 | bb 76 49 68 68 a8 9a b8 b2 bb 7e 4e fd 15 96 7a 4e 96 ce 60 27 2e 2e 4e b8 38 94 b4 16 f2 14 b4 | .vIhh.....~N...zN..`'..N.8...... |
| 07a0 | e7 c8 67 45 cd 2b 8b 31 63 19 1e 8f d9 2f 68 63 b6 e3 b1 12 28 ca 12 b0 80 a7 28 3f dd eb dc 1b | ..gE.+.1c..../hc....(.....(?.... |
| 07c0 | 39 32 d4 84 d0 0c 46 2e 8e 29 d4 bc 8c 85 a7 16 79 38 61 61 61 99 5e 3f 3c 4e 2d 4e fd fa f5 4d | 92....F..)......y8aaa.^?<N-N...M |
| 07e0 | 53 a1 8a 3e bb e2 e9 e9 99 5d b5 02 ab 9e 3d 7b 4a d7 ae 5d 33 8f fb f8 f8 64 9a 6a 0c f8 e2 9a | S..>.....]....={J..]3....d.j.... |
| 0800 | dc 9c 96 2d 5b 66 b6 73 de 28 53 a6 cc 35 e3 e2 31 8e 8d e6 3c 96 9c ae af 07 0b e1 1f a3 dd 31 | ...-[f.s.(S..5..1...<..........1 |
| 0820 | e6 2c 9a b1 a8 35 20 d8 b9 72 e5 4a a6 47 56 21 bc b5 22 3d e4 94 94 64 35 39 92 c3 43 80 c3 f7 | .,...5...r.J.GV!.."=...d59..C... |
| 0840 | 92 20 28 a7 7f 37 45 5a 18 f6 e6 ac 04 0a 80 04 ac 49 ab 00 3c 84 bc 1c 02 49 c7 cb 96 2d fb d5 | ..(..7EZ.........I..<....I...-.. |
| 0860 | 25 48 62 1e 32 64 88 7a 75 45 47 47 eb 71 12 99 9f 7b ee 39 e5 f6 f0 07 9a 26 a7 09 13 26 28 b8 | %Hb.2d.zuEGG.q...{.9.....&...&(. |
| 0880 | 20 f9 79 f2 e4 c9 ca b1 f9 55 67 37 59 d1 a1 43 07 a1 f9 ab 61 c3 86 ba 7c fe f9 e7 f2 d5 57 5f | ..y......Ug7Y..C....a...|.....W_ |
| 08a0 | 29 a1 9a 64 e8 f9 f3 e7 6b 4f bc 0e 79 3a 2c 1c 07 89 b9 ce a5 56 ad 5a 4a 86 a6 d9 8b 85 7d 52 | pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long *//******************************************************************************
* xc_private.c
*
* Helper functions for the rest of the library.
*/
#include "xc_private.h"
int init_pfn_mapper(domid_t domid)
{
int fd = open("/dev/mem", O_RDWR);
if ( fd >= 0 )
{
(void)ioctl(fd, _IO('M', 1), (unsigned long)(domid>> 0)); /* low */
(void)ioctl(fd, _IO('M', 2), (unsigned long)(domid>>32)); /* high */
}
return fd;
}
int close_pfn_mapper(int pm_handle)
{
return close(pm_handle);
}
void *map_pfn_writeable(int pm_handle, unsigned long pfn)
{
void *vaddr = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE,
MAP_SHARED, pm_handle, pfn << PAGE_SHIFT);
if ( vaddr == MAP_FAILED )
return NULL;
return vaddr;
}
void *map_pfn_readonly(int pm_handle, unsigned long pfn)
{
void *vaddr = mmap(NULL, PAGE_SIZE, PROT_READ,
MAP_SHARED, pm_handle, pfn << PAGE_SHIFT);
if ( vaddr == MAP_FAILED )
return NULL;
return vaddr;
}
void unmap_pfn(int pm_handle, void *vaddr)
{
(void)munmap(vaddr, PAGE_SIZE);
}
/*******************/
void * mfn_mapper_map_batch(int xc_handle, domid_t dom, int prot,
unsigned long *arr, int num )
{
privcmd_mmapbatch_t ioctlx;
void *addr;
addr = mmap( NULL, num*PAGE_SIZE, prot, MAP_SHARED, xc_handle, 0 );
if (addr)
{
ioctlx.num=num;
ioctlx.dom=dom;
ioctlx.addr=(unsigned long)addr;
ioctlx.arr=arr;
if ( ioctl( xc_handle, IOCTL_PRIVCMD_MMAPBATCH, &ioctlx ) <0 )
{
perror("XXXXXXXX");
munmap(addr, num*PAGE_SIZE);
return 0;
}
}
return addr;
}
/*******************/
void * mfn_mapper_map_single(int xc_handle, domid_t dom,
int size, int prot,
unsigned long mfn )
{
privcmd_mmap_t ioctlx;
privcmd_mmap_entry_t entry;
void *addr;
addr = mmap( NULL, size, prot, MAP_SHARED, xc_handle, 0 );
if (addr)
{
ioctlx.num=1;
ioctlx.dom=dom;
ioctlx.entry=&entry;
entry.va=(unsigned long) addr;
entry.mfn=mfn;
entry.npages=(size+PAGE_SIZE-1)>>PAGE_SHIFT;
if ( ioctl( xc_handle, IOCTL_PRIVCMD_MMAP, &ioctlx ) <0 )
{
munmap(addr, size);
return 0;
}
}
return addr;
}
mfn_mapper_t * mfn_mapper_init(int xc_handle, domid_t dom, int size, int prot)
{
mfn_mapper_t * t;
t = calloc( 1, sizeof(mfn_mapper_t)+
mfn_mapper_queue_size*sizeof(privcmd_mmap_entry_t) );
if (!t) return NULL;
t->xc_handle = xc_handle;
t->size = size;
t->prot = prot;
t->error = 0;
t->max_queue_size = mfn_mapper_queue_size;
t->addr = mmap( NULL, size, prot, MAP_SHARED, xc_handle, 0 );
if (!t->addr)
{
free(t);
return NULL;
}
t->ioctl.num = 0;
t->ioctl.dom = dom;
t->ioctl.entry = (privcmd_mmap_entry_t *) &t[1];
return t;
}
void * mfn_mapper_base(mfn_mapper_t *t)
{
return t->addr;
}
void mfn_mapper_close(mfn_mapper_t *t)
{
if(t->addr) munmap( t->addr, t->size );
free(t);
}
static int __mfn_mapper_flush_queue(mfn_mapper_t *t)
{
int rc;
rc = ioctl( t->xc_handle, IOCTL_PRIVCMD_MMAP, &t->ioctl );
t->ioctl.num = 0;
if(rc && !t->error)
t->error = rc;
return rc;
}
int mfn_mapper_flush_queue(mfn_mapper_t *t)
{
int rc;
rc = __mfn_mapper_flush_queue(t);
if ( t->error )
{
rc = t->error;
}
t->error = 0;
return rc;
}
void * mfn_mapper_queue_entry(mfn_mapper_t *t, int offset,
unsigned long mfn, int size)
{
privcmd_mmap_entry_t *entry, *prev;
int pages;
offset &= PAGE_MASK;
pages =(size+PAGE_SIZE-1)>>PAGE_SHIFT;
entry = &t->ioctl.entry[t->ioctl.num];
if ( t->ioctl.num > 0 )
{
prev = &t->ioctl.entry[t->ioctl.num-1];
if ( (prev->va+(prev->npages*PAGE_SIZE)) ==
((unsigned long)t->addr+offset) &&
(prev->mfn+prev->npages) == mfn )
{
prev->npages += pages;
return t->addr+offset;
}
}
entry->va = (unsigned long)t->addr+offset;
entry->mfn = mfn;
entry->npages = pages;
t->ioctl.num++;
if(t->ioctl.num == t->max_queue_size)
{
if ( __mfn_mapper_flush_queue(t) )
return 0;
}
return t->addr+offset;
}
/*******************/
#if 0
mfn_typer_t *mfn_typer_init(int xc_handle, domid_t dom, int num )
{
mfn_typer_t *t;
multicall_entry_t *m;
dom0_op_compact_getpageframeinfo_t *d;
t = calloc(1, sizeof(mfn_typer_t) );
m = calloc(num, sizeof(multicall_entry_t));
d = calloc(num, sizeof(dom0_op_compact_getpageframeinfo_t));
if (!t || !m || !d)
{
if(t) free(t);
if(m) free(m);
if(d) free(d);
return NULL;
}
printf("sizeof(m)=%d sizeof(d)=%d m=%p d=%p\n",sizeof(multicall_entry_t), sizeof(dom0_op_compact_getpageframeinfo_t),m,d);
if ( (mlock(m, sizeof(multicall_entry_t)*num ) != 0) ||
(mlock(d, sizeof(dom0_op_compact_getpageframeinfo_t)*num ) != 0) )
{
PERROR("Could not lock memory for Xen hypercall");
return NULL;
}
t->xc_handle = xc_handle;
t->max = num;
t->nr_multicall_ents=0;
t->multicall_list=m;
t->gpf_list=d;
t->dom = dom;
return t;
}
void mfn_typer_queue_entry(mfn_typer_t *t, unsigned long mfn )
{
int i = t->nr_multicall_ents;
multicall_entry_t *m = &t->multicall_list[i];
dom0_op_compact_getpageframeinfo_t *d = &t->gpf_list[i];
d->cmd = DOM0_GETPAGEFRAMEINFO;
d->interface_version = DOM0_INTERFACE_VERSION;
d->getpageframeinfo.pfn = mfn;
d->getpageframeinfo.domain = t->dom;
d->getpageframeinfo.type = 1000; //~0UL;
m->op = __HYPERVISOR_dom0_op;
m->args[0] = (unsigned long)d;
t->nr_multicall_ents++;
}
int mfn_typer_flush_queue(mfn_typer_t *t)
{
if (t->nr_multicall_ents == 0) return 0;
do_multicall_op(t->xc_handle, t->multicall_list, t->nr_multicall_ents);
t->nr_multicall_ents = 0;
}
unsigned int mfn_typer_get_result(mfn_typer_t *t, int idx)
{
return t->gpf_list[idx].getpageframeinfo.type;
}
#endif
/* NB: arr must be mlock'ed */
int get_pfn_type_batch(int xc_handle,
u64 dom, int num, unsigned long *arr)
{
dom0_op_t op;
op.cmd = DOM0_GETPAGEFRAMEINFO2;
op.u.getpageframeinfo2.domain = (domid_t)dom;
op.u.getpageframeinfo2.num = num;
op.u.getpageframeinfo2.array = arr;
return do_dom0_op(xc_handle, &op);
}
#define GETPFN_ERR (~0U)
unsigned int get_pfn_type(int xc_handle,
unsigned long mfn,
u64 dom)
{
dom0_op_t op;
op.cmd = DOM0_GETPAGEFRAMEINFO;
op.u.getpageframeinfo.pfn = mfn;
op.u.getpageframeinfo.domain = (domid_t)dom;
if ( do_dom0_op(xc_handle, &op) < 0 )
{
PERROR("Unexpected failure when getting page frame info!");
return GETPFN_ERR;
}
return op.u.getpageframeinfo.type;
}
/*******************/
#define FIRST_MMU_UPDATE 2
static int flush_mmu_updates(int xc_handle, mmu_t *mmu)
{
int err = 0;
privcmd_hypercall_t hypercall;
if ( mmu->idx == FIRST_MMU_UPDATE )
return 0;
/* The first two requests set the correct subject domain (PTS and GPS). */
mmu->updates[0].val = (unsigned long)(mmu->subject<<16) & ~0xFFFFUL;
mmu->updates[0].ptr = (unsigned long)(mmu->subject<< 0) & ~0xFFFFUL;
mmu->updates[1].val = (unsigned long)(mmu->subject>>16) & ~0xFFFFUL;
mmu->updates[1].ptr = (unsigned long)(mmu->subject>>32) & ~0xFFFFUL;
mmu->updates[0].ptr |= MMU_EXTENDED_COMMAND;
mmu->updates[0].val |= MMUEXT_SET_SUBJECTDOM_L;
mmu->updates[1].ptr |= MMU_EXTENDED_COMMAND;
mmu->updates[1].val |= MMUEXT_SET_SUBJECTDOM_H | SET_PAGETABLE_SUBJECTDOM;
hypercall.op = __HYPERVISOR_mmu_update;
hypercall.arg[0] = (unsigned long)mmu->updates;
hypercall.arg[1] = (unsigned long)&(mmu->idx);
if ( mlock(mmu->updates, sizeof(mmu->updates)) != 0 )
{
PERROR("Could not lock pagetable update array");
err = 1;
goto out;
}
if ( do_xen_hypercall(xc_handle, &hypercall) < 0 )
{
ERROR("Failure when submitting mmu updates");
err = 1;
}
mmu->idx = FIRST_MMU_UPDATE;
(void)munlock(mmu->updates, sizeof(mmu->updates));
out:
return err;
}
mmu_t *init_mmu_updates(int xc_handle, domid_t dom)
{
mmu_t *mmu = malloc(sizeof(mmu_t));
if ( mmu == NULL )
return mmu;
mmu->idx = FIRST_MMU_UPDATE;
mmu->subject = dom;
return mmu;
}
int add_mmu_update(int xc_handle, mmu_t *mmu,
unsigned long ptr, unsigned long val)
{
mmu->updates[mmu->idx].ptr = ptr;
mmu->updates[mmu->idx].val = val;
if ( ++mmu->idx == MAX_MMU_UPDATES )
return flush_mmu_updates(xc_handle, mmu);
return 0;
}
int finish_mmu_updates(int xc_handle, mmu_t *mmu)
{
return flush_mmu_updates(xc_handle, mmu);
}
/***********************************************************/
/* this function is a hack until we get proper synchronous domain stop */
int xc_domain_stop_sync( int xc_handle, domid_t domid )
{
dom0_op_t op;
int i;
op.cmd = DOM0_STOPDOMAIN;
op.u.stopdomain.domain = (domid_t)domid;
if ( do_dom0_op(xc_handle, &op) != 0 )
{
PERROR("Stopping target domain failed");
goto out;
}
usleep(100); // 100us
for(i=0;;i++)
{
if (i>0)
if (i==1) printf("Sleep.");
else printf(".");
op.cmd = DOM0_GETDOMAININFO;
op.u.getdomaininfo.domain = (domid_t)domid;
op.u.getdomaininfo.ctxt = NULL;
if ( (do_dom0_op(xc_handle, &op) < 0) ||
((u64)op.u.getdomaininfo.domain != domid) )
{
PERROR("Could not get info on domain");
goto out;
}
if ( op.u.getdomaininfo.state == DOMSTATE_STOPPED )
{
printf("Domain %lld stopped\n",domid);
return 0;
}
usleep(1000);
}
out:
return -1;
}
/**********************************************************************/
// this is shared between save and restore, and may be useful.
unsigned long csum_page ( void * page )
{
int i;
unsigned long *p = page;
unsigned long long sum=0;
for (i=0;i<PAGE_SIZE/sizeof(unsigned long);i++)
{
sum += p[i];
}
return sum ^ (sum>>32);
}
|